n.replace(/\.ts/, '').replace(/-/g, '_');
+
+const localePath = path.join(__dirname, '../src/js/locales');
+
+async function build(option) {
+ const bundle = await rollup.rollup(option.input);
+ await bundle.write(option.output);
+}
+
+async function locales() {
+ console.log('Building Locales...');
+ try {
+ /* eslint-disable no-restricted-syntax, no-await-in-loop */
+ // We use await-in-loop to make rollup run sequentially to save on RAM
+ const locales = await fs.readdir(localePath);
+ for (const l of locales.filter((x) => x.endsWith('.ts'))) {
+ // run builds sequentially to limit RAM usage
+ await build(
+ genericRollup({
+ input: `./src/js/locales/${l}`,
+ fileName: `./dist/locales/${l.replace('.ts', '.js')}`,
+ name: `tempusDominus.locales.${formatName(l)}`,
+ kind: 'locales',
+ })
+ );
+ }
+ } catch (e) {
+ console.error(e); // eslint-disable-line no-console
+ }
+}
+
+async function plugins() {
+ console.log('Building Plugins...');
+ try {
+ const plugins = await fs.readdir(path.join(__dirname, '../src/js/plugins'));
+ for (const plugin of plugins.filter((x) => x !== 'examples')) {
+ // run builds sequentially to limit RAM usage
+ await build(
+ genericRollup({
+ input: `./src/js/plugins/${plugin}/index.ts`,
+ fileName: `./dist/plugins/${plugin}.js`,
+ name: `tempusDominus.plugins.${formatName(plugin)}`,
+ kind: 'plugins',
+ })
+ );
+ }
+
+ const examplePlugins = await fs.readdir(
+ path.join(__dirname, '../src/js/plugins/examples')
+ );
+ for (const plugin of examplePlugins.map((x) => x.replace('.ts', ''))) {
+ // run builds sequentially to limit RAM usage
+ await build(
+ genericRollup({
+ input: `./src/js/plugins/examples/${plugin}.ts`,
+ fileName: `./dist/plugins/examples/${plugin}.js`,
+ name: `tempusDominus.plugins.${formatName(plugin)}`,
+ })
+ );
+ }
+ } catch (e) {
+ console.error(e); // eslint-disable-line no-console
+ }
+}
+
+const args = process.argv.slice(2);
+
+let command = 'all';
+
+if (args.length !== 0) command = args[0];
+
+switch (command) {
+ case '-p':
+ plugins().then();
+ break;
+ case '-l':
+ locales().then();
+ break;
+ case 'all':
+ plugins().then(() => locales().then());
+ break;
+}
diff --git a/build/rollup-plugin.config.js b/build/rollup-plugin.config.js
new file mode 100644
index 000000000..c224a7506
--- /dev/null
+++ b/build/rollup-plugin.config.js
@@ -0,0 +1,36 @@
+const typescript = require('rollup-plugin-ts');
+const ignore = require('rollup-plugin-ignore');
+
+const banner = require('./banner.js');
+const globals = {
+ '@popperjs/core': 'Popper',
+ tempusDominus: 'tempusDominus',
+};
+
+module.exports = (config) => {
+ const { input, fileName, name, kind } = config;
+ return {
+ input: {
+ input,
+ external: ['tempusDominus'],
+ plugins: [
+ ignore(['DateTime', 'ErrorMessages', 'FormatLocalization']),
+ typescript({
+ tsconfig: (resolvedConfig) => ({
+ ...resolvedConfig,
+ declaration: kind !== undefined,
+ declarationDir: `./types/${kind}`,
+ }),
+ }),
+ ],
+ },
+ output: {
+ banner,
+ file: fileName,
+ format: 'umd',
+ name: name || 'tempusDominus',
+ globals,
+ compact: true,
+ },
+ };
+};
diff --git a/build/rollup.config.js b/build/rollup.config.js
new file mode 100644
index 000000000..7a9ace566
--- /dev/null
+++ b/build/rollup.config.js
@@ -0,0 +1,97 @@
+const typescript = require('rollup-plugin-ts');
+import postcss from 'rollup-plugin-postcss';
+import { terser } from 'rollup-plugin-terser';
+
+const pkg = require('../package.json');
+const banner = require('./banner.js');
+
+const globals = {
+ '@popperjs/core': 'Popper',
+};
+
+export default [
+ {
+ input: 'src/js/tempus-dominus.ts',
+ output: [
+ {
+ banner,
+ file: pkg.main,
+ format: 'umd',
+ name: 'tempusDominus',
+ sourcemap: true,
+ globals,
+ },
+ {
+ banner,
+ file: pkg.module,
+ format: 'es',
+ name: 'tempusDominus',
+ sourcemap: true,
+ globals,
+ },
+ {
+ banner,
+ file: `${pkg.main.replace('.js', '')}.min.js`,
+ format: 'umd',
+ name: 'tempusDominus',
+ globals,
+ plugins: [terser()],
+ },
+ {
+ banner,
+ file: `${pkg.module.replace('.js', '')}.min.js`,
+ format: 'es',
+ name: 'tempusDominus',
+ globals,
+ plugins: [terser()],
+ },
+ ],
+ external: ['@popperjs/core'],
+ plugins: [
+ typescript({
+ tsconfig: (resolvedConfig) => ({
+ ...resolvedConfig,
+ }),
+ }),
+ ],
+ },
+ {
+ input: 'dist/js/jQuery-provider.js',
+ output: [
+ {
+ file: 'dist/js/jQuery-provider.min.js',
+ },
+ ],
+ plugins: [terser()],
+ },
+ {
+ input: 'src/scss/tempus-dominus.scss',
+ output: [
+ {
+ banner,
+ file: 'dist/css/tempus-dominus.css',
+ },
+ ],
+ plugins: [
+ postcss({
+ sourceMap: true,
+ extract: true,
+ }),
+ ],
+ },
+ {
+ input: 'src/scss/tempus-dominus.scss',
+ output: [
+ {
+ banner,
+ file: 'dist/css/tempus-dominus.min.css',
+ },
+ ],
+ plugins: [
+ postcss({
+ extract: true,
+ minimize: true,
+ }),
+ ],
+ },
+];
diff --git a/build/serve.js b/build/serve.js
new file mode 100644
index 000000000..64d8dcd57
--- /dev/null
+++ b/build/serve.js
@@ -0,0 +1,9 @@
+const { ParvusServer } = require('@eonasdan/parvus-server');
+
+new ParvusServer({
+ port: 3001,
+ directory: `./docs`,
+ middlewares: [],
+})
+ .startAsync()
+ .then();
diff --git a/build/utilities.js b/build/utilities.js
new file mode 100644
index 000000000..4e1e75500
--- /dev/null
+++ b/build/utilities.js
@@ -0,0 +1,52 @@
+const fs = require('fs').promises;
+const { dirname } = require('path');
+
+class Utilities {
+ static async copyFileAndEnsurePathExistsAsync(file) {
+ await fs.mkdir(dirname(file.destination), { recursive: true });
+
+ await fs.copyFile(file.source, file.destination);
+ }
+
+ static async copy() {
+ for (const file of [
+ {
+ source: './src/js/jQuery-provider.js',
+ destination: './dist/js/jQuery-provider.js',
+ },
+ ]) {
+ console.log(`copying ${file.source} to ${file.destination}`);
+ await Utilities.copyFileAndEnsurePathExistsAsync(file);
+ }
+ }
+
+ static async removeFileAsync(filePath) {
+ if (!(await fs.stat(filePath)).isFile()) return;
+ try {
+ await fs.unlink(filePath);
+ } catch (e) {}
+ }
+
+ static async removeDirectoryAsync(directory, removeSelf = true) {
+ try {
+ await fs.rm(directory, { recursive: true, force: true });
+
+ if (!removeSelf) await fs.mkdir(dirname(directory), { recursive: true });
+ } catch (e) {
+ console.error(e);
+ }
+ }
+}
+
+const args = process.argv.slice(2);
+
+switch (args[0]) {
+ case '--copy':
+ console.log('Copying files');
+ Utilities.copy().then();
+ break;
+ case '--clean':
+ console.log('Cleaning path: ', args[1]);
+ Utilities.removeDirectoryAsync(args[1]).then();
+ break;
+}
diff --git a/component.json b/component.json
deleted file mode 100644
index 46df8bcc9..000000000
--- a/component.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "name": "bootstrap-datetimepicker",
- "version": "2.1.32",
- "main": ["build/css/bootstrap-datetimepicker.min.css","build/js/bootstrap-datetimepicker.min.js"],
- "dependencies": {
- "jquery" : ">=1.8.3",
- "bootstrap" : ">=3.0",
- "moment": ">=2.4.0"
- }
-}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000..7c116e19e
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,11955 @@
+{
+ "name": "@eonasdan/tempus-dominus",
+ "version": "6.10.3",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@eonasdan/tempus-dominus",
+ "version": "6.10.3",
+ "license": "MIT",
+ "devDependencies": {
+ "@eonasdan/parvus-server": "^1.2.1",
+ "@popperjs/core": "^2.11.6",
+ "@rollup/plugin-node-resolve": "^14.1.0",
+ "@types/node": "^18.14.2",
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
+ "@typescript-eslint/parser": "^5.54.0",
+ "@vitest/coverage-c8": "^0.29.2",
+ "@vitest/ui": "^0.29.2",
+ "bootstrap": "^5.2.3",
+ "chokidar": "^3.5.3",
+ "clean-css": "^5.3.2",
+ "concurrently": "^7.6.0",
+ "dropcss": "^1.0.16",
+ "eslint": "^8.35.0",
+ "eslint-config-prettier": "^8.6.0",
+ "glob": "^7.2.3",
+ "globby": "^11.1.0",
+ "html-minifier-terser": "^5.1.1",
+ "husky": "^8.0.3",
+ "jsdom": "^20.0.3",
+ "lint-staged": "^13.1.2",
+ "prettier": "^2.8.4",
+ "rollup": "^2.79.1",
+ "rollup-plugin-ignore": "^1.0.10",
+ "rollup-plugin-postcss": "^4.0.2",
+ "rollup-plugin-terser": "^7.0.2",
+ "rollup-plugin-ts": "^3.2.0",
+ "sass": "^1.58.3",
+ "terser": "^5.16.5",
+ "tslib": "^2.5.0",
+ "typescript": "~4.9.5",
+ "vitest": "^0.29.2",
+ "vitest-github-actions-reporter": "^0.10.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/eonasdan"
+ },
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.6"
+ },
+ "peerDependenciesMeta": {
+ "@popperjs/core\"": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@actions/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
+ "dev": true,
+ "dependencies": {
+ "@actions/http-client": "^2.0.1",
+ "uuid": "^8.3.2"
+ }
+ },
+ "node_modules/@actions/http-client": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
+ "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
+ "dev": true,
+ "dependencies": {
+ "tunnel": "^0.0.6"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "node_modules/@eonasdan/parvus-server": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eonasdan/parvus-server/-/parvus-server-1.2.1.tgz",
+ "integrity": "sha512-NOB8pV9jaeze1l3tmDTPYvGDk+senb0oFAi5Ju5CERIRKFop0+S/yA/aHrWvZTv2As4EI6S/ECJfDjU6WjhSwA==",
+ "dev": true,
+ "dependencies": {
+ "jsdom": "^19.0.0",
+ "socket.io": "^4.4.1"
+ }
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/acorn-globals/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/jsdom": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz",
+ "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.5",
+ "acorn": "^8.5.0",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.1",
+ "decimal.js": "^10.3.1",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^3.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^10.0.0",
+ "ws": "^8.2.3",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dev": true,
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/w3c-xmlserializer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz",
+ "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==",
+ "dev": true,
+ "dependencies": {
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eonasdan/parvus-server/node_modules/whatwg-url": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz",
+ "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
+ "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
+ "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+ "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
+ "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@mdn/browser-compat-data": {
+ "version": "5.2.31",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.31.tgz",
+ "integrity": "sha512-tOav2FmnXMkdJqyq7ne3l/+YK6r+Q8JIOxnAxP+lfFx28HOLuYLI7thntMGK0eghG6p9ivXcCbDQ2Q58cw3zUw==",
+ "dev": true
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.21",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
+ "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
+ "dev": true
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
+ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-14.1.0.tgz",
+ "integrity": "sha512-5G2niJroNCz/1zqwXtk0t9+twOSDlG00k1Wfd7bkbbXmwg8H8dvgHdIWAun53Ps/rckfvOC7scDBjuGFg5OaWw==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "deepmerge": "^4.2.2",
+ "is-builtin-module": "^3.1.0",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.78.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "dev": true
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==",
+ "dev": true
+ },
+ "node_modules/@types/chai-subset": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
+ "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "*"
+ }
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "18.14.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz",
+ "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==",
+ "dev": true
+ },
+ "node_modules/@types/object-path": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.1.tgz",
+ "integrity": "sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg==",
+ "dev": true
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "dev": true
+ },
+ "node_modules/@types/ua-parser-js": {
+ "version": "0.7.36",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz",
+ "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz",
+ "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/type-utils": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz",
+ "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
+ "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz",
+ "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz",
+ "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
+ "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz",
+ "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
+ "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.54.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitest/coverage-c8": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.29.2.tgz",
+ "integrity": "sha512-NmD3WirQCeQjjKfHu4iEq18DVOBFbLn9TKVdMpyi5YW2EtnS+K22/WE+9/wRrepOhyeTxuEFgxUVkCAE1GhbnQ==",
+ "dev": true,
+ "dependencies": {
+ "c8": "^7.13.0",
+ "picocolors": "^1.0.0",
+ "std-env": "^3.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vitest": ">=0.29.0 <1"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.2.tgz",
+ "integrity": "sha512-wjrdHB2ANTch3XKRhjWZN0UueFocH0cQbi2tR5Jtq60Nb3YOSmakjdAvUa2JFBu/o8Vjhj5cYbcMXkZxn1NzmA==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/spy": "0.29.2",
+ "@vitest/utils": "0.29.2",
+ "chai": "^4.3.7"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.2.tgz",
+ "integrity": "sha512-A1P65f5+6ru36AyHWORhuQBJrOOcmDuhzl5RsaMNFe2jEkoj0faEszQS4CtPU/LxUYVIazlUtZTY0OEZmyZBnA==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/utils": "0.29.2",
+ "p-limit": "^4.0.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.2.tgz",
+ "integrity": "sha512-Hc44ft5kaAytlGL2PyFwdAsufjbdOvHklwjNy/gy/saRbg9Kfkxfh+PklLm1H2Ib/p586RkQeNFKYuJInUssyw==",
+ "dev": true,
+ "dependencies": {
+ "tinyspy": "^1.0.2"
+ }
+ },
+ "node_modules/@vitest/ui": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.29.2.tgz",
+ "integrity": "sha512-GpCExCMptrS1z3Xf6kz35Xdvjc2eTBy9OIIwW3HjePVxw9Q++ZoEaIBVimRTTGzSe40XiAI/ZyR0H0Ya9brqLA==",
+ "dev": true,
+ "dependencies": {
+ "fast-glob": "^3.2.12",
+ "flatted": "^3.2.7",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.2"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.2.tgz",
+ "integrity": "sha512-F14/Uc+vCdclStS2KEoXJlOLAEyqRhnw0gM27iXw9bMTcyKRPJrQ+rlC6XZ125GIPvvKYMPpVxNhiou6PsEeYQ==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^3.1.0",
+ "diff": "^5.1.0",
+ "loupe": "^2.3.6",
+ "picocolors": "^1.0.0",
+ "pretty-format": "^27.5.1"
+ }
+ },
+ "node_modules/@wessberg/stringutil": {
+ "version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/@wessberg/stringutil/-/stringutil-1.0.19.tgz",
+ "integrity": "sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "dev": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+ "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.1.0",
+ "acorn-walk": "^8.0.2"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/bootstrap": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz",
+ "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.6"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/browserslist-generator": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/browserslist-generator/-/browserslist-generator-2.0.2.tgz",
+ "integrity": "sha512-jQ0EIPx4P0k4/AF3cYuEQ49OByCAOJU5jc0ZLiw9WZlLdAkm3rxJIca+AIltAiKe4hcUMqtozsL3s+FYSs3ojQ==",
+ "dev": true,
+ "dependencies": {
+ "@mdn/browser-compat-data": "^5.2.30",
+ "@types/object-path": "^0.11.1",
+ "@types/semver": "^7.3.13",
+ "@types/ua-parser-js": "^0.7.36",
+ "browserslist": "4.21.4",
+ "caniuse-lite": "^1.0.30001447",
+ "isbot": "3.6.5",
+ "object-path": "^0.11.8",
+ "semver": "^7.3.8",
+ "ua-parser-js": "^1.0.33"
+ },
+ "engines": {
+ "node": ">=16.15.1",
+ "npm": ">=7.0.0",
+ "pnpm": ">=3.2.0",
+ "yarn": ">=1.13"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/wessberg/browserslist-generator?sponsor=1"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/c8": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz",
+ "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==",
+ "dev": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@istanbuljs/schema": "^0.1.3",
+ "find-up": "^5.0.0",
+ "foreground-child": "^2.0.0",
+ "istanbul-lib-coverage": "^3.2.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-reports": "^3.1.4",
+ "rimraf": "^3.0.2",
+ "test-exclude": "^6.0.0",
+ "v8-to-istanbul": "^9.0.0",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.9"
+ },
+ "bin": {
+ "c8": "bin/c8.js"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/c8/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/c8/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001707",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
+ "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chai": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
+ "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/compatfactory": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/compatfactory/-/compatfactory-2.0.9.tgz",
+ "integrity": "sha512-fvO+AWcmbO7P1S+A3mwm3IGr74eHMeq5ZLhNhyNQc9mVDNHT4oe0Gg0ksdIFFNXLK7k7Z/TYcLAUSQdRgh1bsA==",
+ "dev": true,
+ "dependencies": {
+ "helpertypes": "^0.0.19"
+ },
+ "engines": {
+ "node": ">=14.9.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=3.x || >= 4.x"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/concurrently": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz",
+ "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "date-fns": "^2.29.1",
+ "lodash": "^4.17.21",
+ "rxjs": "^7.0.0",
+ "shell-quote": "^1.7.3",
+ "spawn-command": "^0.0.2-1",
+ "supports-color": "^8.1.0",
+ "tree-kill": "^1.2.2",
+ "yargs": "^17.3.1"
+ },
+ "bin": {
+ "conc": "dist/bin/concurrently.js",
+ "concurrently": "dist/bin/concurrently.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ }
+ },
+ "node_modules/concurrently/node_modules/rxjs": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
+ "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crosspath": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crosspath/-/crosspath-2.0.0.tgz",
+ "integrity": "sha512-ju88BYCQ2uvjO2bR+SsgLSTwTSctU+6Vp2ePbKPgSCZyy4MWZxYsT738DlKVRE5utUjobjPRm1MkTYKJxCmpTA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "^17.0.36"
+ },
+ "engines": {
+ "node": ">=14.9.0"
+ }
+ },
+ "node_modules/crosspath/node_modules/@types/node": {
+ "version": "17.0.45",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
+ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
+ "dev": true
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz",
+ "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "5.1.13",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz",
+ "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-preset-default": "^5.2.12",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "5.2.12",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz",
+ "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==",
+ "dev": true,
+ "dependencies": {
+ "css-declaration-sorter": "^6.3.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.0",
+ "postcss-convert-values": "^5.1.2",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.6",
+ "postcss-merge-rules": "^5.1.2",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.3",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.0",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.0",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
+ "dev": true
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
+ },
+ "node_modules/data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "2.29.3",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
+ "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "dev": true
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+ "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "dev": true,
+ "dependencies": {
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dropcss": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/dropcss/-/dropcss-1.0.16.tgz",
+ "integrity": "sha512-QgA6BUh2SoBYE/dSuMmeGhNdoGtGewt3Rn66xKyXoGNyjrKRXf163wuM+xeQ83p87l/3ALoB6Il1dgKyGS5pEw==",
+ "dev": true
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.264",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.264.tgz",
+ "integrity": "sha512-AZ6ZRkucHOQT8wke50MktxtmcWZr67kE17X/nAXFf62NIdMdgY6xfsaJD5Szoy84lnkuPWH+4tTNE3s2+bPCiw==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/engine.io": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz",
+ "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/cookie": "^0.4.1",
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.7.2",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dev": true,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
+ "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^2.0.0",
+ "@eslint/js": "8.35.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.3",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.4.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
+ "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-scope/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+ "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "dev": true
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "node_modules/execa": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz",
+ "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.1",
+ "human-signals": "^3.0.1",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^3.0.7",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generic-names": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz",
+ "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^3.2.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globals/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/helpertypes": {
+ "version": "0.0.19",
+ "resolved": "https://registry.npmjs.org/helpertypes/-/helpertypes-0.0.19.tgz",
+ "integrity": "sha512-J00e55zffgi3yVnUp0UdbMztNkr2PnizEkOe9URNohnrNhW5X0QpegkuLpOmFQInpi93Nb8MCjQRHAiCDF42NQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-encoding": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+ "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "^4.1.1",
+ "clean-css": "^4.2.3",
+ "commander": "^4.1.1",
+ "he": "^1.2.0",
+ "param-case": "^3.0.3",
+ "relateurl": "^0.2.7",
+ "terser": "^4.6.3"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/html-minifier-terser/node_modules/clean-css": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
+ "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/html-minifier-terser/node_modules/terser": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
+ "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dev": true,
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
+ "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true,
+ "bin": {
+ "husky": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==",
+ "dev": true
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+ "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+ "dev": true,
+ "dependencies": {
+ "import-from": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+ "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-builtin-module": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz",
+ "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==",
+ "dev": true,
+ "dependencies": {
+ "builtin-modules": "^3.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+ "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "dev": true
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true
+ },
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isbot": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.6.5.tgz",
+ "integrity": "sha512-BchONELXt6yMad++BwGpa0oQxo/uD0keL7N15cYVf0A1oMIoNQ79OqeYdPMFWDrNhCqCbRuw9Y9F3QBjvAxZ5g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/js-sdsl": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+ "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
+ "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.6",
+ "acorn": "^8.8.1",
+ "acorn-globals": "^7.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.2",
+ "decimal.js": "^10.4.2",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.2",
+ "parse5": "^7.1.1",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.1.2",
+ "w3c-xmlserializer": "^4.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0",
+ "ws": "^8.11.0",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true
+ },
+ "node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lint-staged": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.2.tgz",
+ "integrity": "sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^3.1.0",
+ "colorette": "^2.0.19",
+ "commander": "^9.4.1",
+ "debug": "^4.3.4",
+ "execa": "^6.1.0",
+ "lilconfig": "2.0.6",
+ "listr2": "^5.0.5",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-inspect": "^1.12.2",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.1",
+ "yaml": "^2.1.3"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/lint-staged/node_modules/commander": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
+ "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/lint-staged/node_modules/yaml": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.0.tgz",
+ "integrity": "sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14",
+ "npm": ">= 7"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.6.tgz",
+ "integrity": "sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.19",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.7",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/listr2/node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2/node_modules/rxjs": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz",
+ "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/listr2/node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz",
+ "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "dev": true
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz",
+ "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.2",
+ "pathe": "^1.1.0",
+ "pkg-types": "^1.0.1",
+ "ufo": "^1.1.0"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
+ "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==",
+ "dev": true
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-path": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz",
+ "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.12.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
+ "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.4",
+ "p-timeout": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
+ "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+ "dev": true,
+ "dependencies": {
+ "p-finally": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz",
+ "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==",
+ "dev": true,
+ "dependencies": {
+ "entities": "^4.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/pify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+ "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz",
+ "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.1.1",
+ "pathe": "^1.1.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.0",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz",
+ "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.6",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz",
+ "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.20.3",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz",
+ "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz",
+ "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.6",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "dev": true,
+ "dependencies": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz",
+ "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.6",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-modules": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz",
+ "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==",
+ "dev": true,
+ "dependencies": {
+ "generic-names": "^4.0.0",
+ "icss-replace-symbols": "^1.1.0",
+ "lodash.camelcase": "^4.3.0",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "string-hash": "^1.1.1"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz",
+ "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.6",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "dev": true,
+ "dependencies": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz",
+ "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.6",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
+ "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/promise.series": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz",
+ "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-ignore": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-ignore/-/rollup-plugin-ignore-1.0.10.tgz",
+ "integrity": "sha512-VsbnfwwaTv2Dxl2onubetX/3RnSnplNnjdix0hvF8y2YpqdzlZrjIq6zkcuVJ08XysS8zqW3gt3ORBndFDgsrg==",
+ "dev": true
+ },
+ "node_modules/rollup-plugin-postcss": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz",
+ "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "concat-with-sourcemaps": "^1.1.0",
+ "cssnano": "^5.0.1",
+ "import-cwd": "^3.0.0",
+ "p-queue": "^6.6.2",
+ "pify": "^5.0.0",
+ "postcss-load-config": "^3.0.0",
+ "postcss-modules": "^4.0.0",
+ "promise.series": "^0.2.0",
+ "resolve": "^1.19.0",
+ "rollup-pluginutils": "^2.8.2",
+ "safe-identifier": "^0.4.2",
+ "style-inject": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "postcss": "8.x"
+ }
+ },
+ "node_modules/rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0"
+ }
+ },
+ "node_modules/rollup-plugin-ts": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-ts/-/rollup-plugin-ts-3.2.0.tgz",
+ "integrity": "sha512-KkTLVifkUexEiAXS9VtSjDrjKr0TyusmNJpb2ZTAzI9VuPumSu4AktIaVNnwv70iUEitHwZtET7OAM+5n1u1tg==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.2",
+ "@wessberg/stringutil": "^1.0.19",
+ "ansi-colors": "^4.1.3",
+ "browserslist": "^4.21.4",
+ "browserslist-generator": "^2.0.1",
+ "compatfactory": "^2.0.9",
+ "crosspath": "^2.0.0",
+ "magic-string": "^0.27.0",
+ "ts-clone-node": "^2.0.4",
+ "tslib": "^2.4.1"
+ },
+ "engines": {
+ "node": ">=14.9.0",
+ "npm": ">=7.0.0",
+ "pnpm": ">=3.2.0",
+ "yarn": ">=1.13"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/wessberg/rollup-plugin-ts?sponsor=1"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=6.x || >=7.x",
+ "@babel/plugin-transform-runtime": ">=6.x || >=7.x",
+ "@babel/preset-env": ">=6.x || >=7.x",
+ "@babel/preset-typescript": ">=6.x || >=7.x",
+ "@babel/runtime": ">=6.x || >=7.x",
+ "@swc/core": ">=1.x",
+ "@swc/helpers": ">=0.2",
+ "rollup": ">=1.x || >=2.x",
+ "typescript": ">=3.2.x || >= 4.x"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "@babel/plugin-transform-runtime": {
+ "optional": true
+ },
+ "@babel/preset-env": {
+ "optional": true
+ },
+ "@babel/preset-typescript": {
+ "optional": true
+ },
+ "@babel/runtime": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rollup-plugin-ts/node_modules/@rollup/pluginutils": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+ "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rollup-plugin-ts/node_modules/@types/estree": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
+ "dev": true
+ },
+ "node_modules/rollup-plugin-ts/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/rollup-pluginutils": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+ "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+ "dev": true,
+ "dependencies": {
+ "estree-walker": "^0.6.1"
+ }
+ },
+ "node_modules/rollup-pluginutils/node_modules/estree-walker": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
+ "dev": true
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-identifier": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
+ "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==",
+ "dev": true
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sass": {
+ "version": "1.58.3",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz",
+ "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/sass/node_modules/immutable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
+ "dev": true
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
+ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
+ "dev": true
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/sirv": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz",
+ "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==",
+ "dev": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.20",
+ "mrmime": "^1.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/socket.io": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz",
+ "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.3.2",
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/socket.io-adapter": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
+ "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "~4.3.4",
+ "ws": "~8.17.1"
+ }
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+ "dev": true,
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/spawn-command": {
+ "version": "0.0.2-1",
+ "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
+ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
+ "dev": true
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
+ "dev": true
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true
+ },
+ "node_modules/std-env": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz",
+ "integrity": "sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q==",
+ "dev": true
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz",
+ "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/style-inject": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
+ "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==",
+ "dev": true
+ },
+ "node_modules/stylehacks": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz",
+ "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.6",
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dev": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true
+ },
+ "node_modules/terser": {
+ "version": "5.16.5",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz",
+ "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/tinybench": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz",
+ "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==",
+ "dev": true
+ },
+ "node_modules/tinypool": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz",
+ "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz",
+ "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz",
+ "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/ts-clone-node": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/ts-clone-node/-/ts-clone-node-2.0.4.tgz",
+ "integrity": "sha512-eG6FAgmQsenhIJOIFhUcO6yyYejBKZIKcI3y21jiQmIOrth5pD6GElyPAyeihbPSyBs3u/9PVNXy+5I7jGy8jA==",
+ "dev": true,
+ "dependencies": {
+ "compatfactory": "^2.0.9"
+ },
+ "engines": {
+ "node": ">=14.9.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/wessberg/ts-clone-node?sponsor=1"
+ },
+ "peerDependencies": {
+ "typescript": "^3.x || ^4.x"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "dev": true
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/ua-parser-js": {
+ "version": "1.0.33",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz",
+ "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
+ }
+ ],
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz",
+ "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==",
+ "dev": true
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz",
+ "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+ "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vite": {
+ "version": "4.5.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz",
+ "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.18.10",
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.2.tgz",
+ "integrity": "sha512-5oe1z6wzI3gkvc4yOBbDBbgpiWiApvuN4P55E8OI131JGrSuo4X3SOZrNmZYo4R8Zkze/dhi572blX0zc+6SdA==",
+ "dev": true,
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.4",
+ "mlly": "^1.1.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "vite": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": ">=v14.16.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/vite/node_modules/rollup": {
+ "version": "3.29.5",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
+ "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.2.tgz",
+ "integrity": "sha512-ydK9IGbAvoY8wkg29DQ4ivcVviCaUi3ivuPKfZEVddMTenFHUfB8EEDXQV8+RasEk1ACFLgMUqAaDuQ/Nk+mQA==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "^4.3.4",
+ "@types/chai-subset": "^1.3.3",
+ "@types/node": "*",
+ "@vitest/expect": "0.29.2",
+ "@vitest/runner": "0.29.2",
+ "@vitest/spy": "0.29.2",
+ "@vitest/utils": "0.29.2",
+ "acorn": "^8.8.1",
+ "acorn-walk": "^8.2.0",
+ "cac": "^6.7.14",
+ "chai": "^4.3.7",
+ "debug": "^4.3.4",
+ "local-pkg": "^0.4.2",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "source-map": "^0.6.1",
+ "std-env": "^3.3.1",
+ "strip-literal": "^1.0.0",
+ "tinybench": "^2.3.1",
+ "tinypool": "^0.3.1",
+ "tinyspy": "^1.0.2",
+ "vite": "^3.0.0 || ^4.0.0",
+ "vite-node": "0.29.2",
+ "why-is-node-running": "^2.2.2"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": ">=v14.16.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@vitest/browser": "*",
+ "@vitest/ui": "*",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest-github-actions-reporter": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/vitest-github-actions-reporter/-/vitest-github-actions-reporter-0.10.0.tgz",
+ "integrity": "sha512-ctFM1xlOVsXCNp5+LkaBZBhN1Iq5y9vVMZ9+Czls2CimOUKt0lH24MV1S0EzKysNUT7efs2OOSdmc6lgR8hqXg==",
+ "dev": true,
+ "dependencies": {
+ "@actions/core": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=14.16.0"
+ },
+ "peerDependencies": {
+ "vitest": ">=0.28.5"
+ }
+ },
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "dev": true,
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+ "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+ "dev": true,
+ "dependencies": {
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
+ "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "dev": true,
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.5.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+ "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ },
+ "dependencies": {
+ "@actions/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
+ "dev": true,
+ "requires": {
+ "@actions/http-client": "^2.0.1",
+ "uuid": "^8.3.2"
+ }
+ },
+ "@actions/http-client": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
+ "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
+ "dev": true,
+ "requires": {
+ "tunnel": "^0.0.6"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.18.6"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "@eonasdan/parvus-server": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eonasdan/parvus-server/-/parvus-server-1.2.1.tgz",
+ "integrity": "sha512-NOB8pV9jaeze1l3tmDTPYvGDk+senb0oFAi5Ju5CERIRKFop0+S/yA/aHrWvZTv2As4EI6S/ECJfDjU6WjhSwA==",
+ "dev": true,
+ "requires": {
+ "jsdom": "^19.0.0",
+ "socket.io": "^4.4.1"
+ },
+ "dependencies": {
+ "acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ }
+ }
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true
+ },
+ "jsdom": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz",
+ "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==",
+ "dev": true,
+ "requires": {
+ "abab": "^2.0.5",
+ "acorn": "^8.5.0",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.1",
+ "decimal.js": "^10.3.1",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^3.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^10.0.0",
+ "ws": "^8.2.3",
+ "xml-name-validator": "^4.0.0"
+ }
+ },
+ "parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true
+ },
+ "saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dev": true,
+ "requires": {
+ "xmlchars": "^2.2.0"
+ }
+ },
+ "w3c-xmlserializer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz",
+ "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==",
+ "dev": true,
+ "requires": {
+ "xml-name-validator": "^4.0.0"
+ }
+ },
+ "whatwg-url": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz",
+ "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==",
+ "dev": true,
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ }
+ }
+ }
+ },
+ "@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@eslint/eslintrc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
+ "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@eslint/js": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
+ "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
+ "dev": true
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ }
+ },
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true
+ },
+ "@jridgewell/source-map": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+ "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
+ "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@mdn/browser-compat-data": {
+ "version": "5.2.31",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.31.tgz",
+ "integrity": "sha512-tOav2FmnXMkdJqyq7ne3l/+YK6r+Q8JIOxnAxP+lfFx28HOLuYLI7thntMGK0eghG6p9ivXcCbDQ2Q58cw3zUw==",
+ "dev": true
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@polka/url": {
+ "version": "1.0.0-next.21",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
+ "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
+ "dev": true
+ },
+ "@popperjs/core": {
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
+ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
+ "dev": true
+ },
+ "@rollup/plugin-node-resolve": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-14.1.0.tgz",
+ "integrity": "sha512-5G2niJroNCz/1zqwXtk0t9+twOSDlG00k1Wfd7bkbbXmwg8H8dvgHdIWAun53Ps/rckfvOC7scDBjuGFg5OaWw==",
+ "dev": true,
+ "requires": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "deepmerge": "^4.2.2",
+ "is-builtin-module": "^3.1.0",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ }
+ },
+ "@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ }
+ },
+ "@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "dev": true
+ },
+ "@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true
+ },
+ "@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true
+ },
+ "@types/chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
+ "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "*"
+ }
+ },
+ "@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
+ "dev": true
+ },
+ "@types/cors": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "dev": true
+ },
+ "@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+ "dev": true
+ },
+ "@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "18.14.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz",
+ "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==",
+ "dev": true
+ },
+ "@types/object-path": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.1.tgz",
+ "integrity": "sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg==",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "dev": true
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.36",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz",
+ "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==",
+ "dev": true
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz",
+ "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/type-utils": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz",
+ "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
+ "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz",
+ "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "@typescript-eslint/utils": "5.54.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz",
+ "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
+ "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/visitor-keys": "5.54.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz",
+ "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.54.0",
+ "@typescript-eslint/types": "5.54.0",
+ "@typescript-eslint/typescript-estree": "5.54.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "semver": "^7.3.7"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
+ "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.54.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "@vitest/coverage-c8": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.29.2.tgz",
+ "integrity": "sha512-NmD3WirQCeQjjKfHu4iEq18DVOBFbLn9TKVdMpyi5YW2EtnS+K22/WE+9/wRrepOhyeTxuEFgxUVkCAE1GhbnQ==",
+ "dev": true,
+ "requires": {
+ "c8": "^7.13.0",
+ "picocolors": "^1.0.0",
+ "std-env": "^3.3.1"
+ }
+ },
+ "@vitest/expect": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.2.tgz",
+ "integrity": "sha512-wjrdHB2ANTch3XKRhjWZN0UueFocH0cQbi2tR5Jtq60Nb3YOSmakjdAvUa2JFBu/o8Vjhj5cYbcMXkZxn1NzmA==",
+ "dev": true,
+ "requires": {
+ "@vitest/spy": "0.29.2",
+ "@vitest/utils": "0.29.2",
+ "chai": "^4.3.7"
+ }
+ },
+ "@vitest/runner": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.2.tgz",
+ "integrity": "sha512-A1P65f5+6ru36AyHWORhuQBJrOOcmDuhzl5RsaMNFe2jEkoj0faEszQS4CtPU/LxUYVIazlUtZTY0OEZmyZBnA==",
+ "dev": true,
+ "requires": {
+ "@vitest/utils": "0.29.2",
+ "p-limit": "^4.0.0",
+ "pathe": "^1.1.0"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^1.0.0"
+ }
+ },
+ "yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true
+ }
+ }
+ },
+ "@vitest/spy": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.2.tgz",
+ "integrity": "sha512-Hc44ft5kaAytlGL2PyFwdAsufjbdOvHklwjNy/gy/saRbg9Kfkxfh+PklLm1H2Ib/p586RkQeNFKYuJInUssyw==",
+ "dev": true,
+ "requires": {
+ "tinyspy": "^1.0.2"
+ }
+ },
+ "@vitest/ui": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.29.2.tgz",
+ "integrity": "sha512-GpCExCMptrS1z3Xf6kz35Xdvjc2eTBy9OIIwW3HjePVxw9Q++ZoEaIBVimRTTGzSe40XiAI/ZyR0H0Ya9brqLA==",
+ "dev": true,
+ "requires": {
+ "fast-glob": "^3.2.12",
+ "flatted": "^3.2.7",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.2"
+ }
+ },
+ "@vitest/utils": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.2.tgz",
+ "integrity": "sha512-F14/Uc+vCdclStS2KEoXJlOLAEyqRhnw0gM27iXw9bMTcyKRPJrQ+rlC6XZ125GIPvvKYMPpVxNhiou6PsEeYQ==",
+ "dev": true,
+ "requires": {
+ "cli-truncate": "^3.1.0",
+ "diff": "^5.1.0",
+ "loupe": "^2.3.6",
+ "picocolors": "^1.0.0",
+ "pretty-format": "^27.5.1"
+ }
+ },
+ "@wessberg/stringutil": {
+ "version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/@wessberg/stringutil/-/stringutil-1.0.19.tgz",
+ "integrity": "sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==",
+ "dev": true
+ },
+ "abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ }
+ },
+ "acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "dev": true
+ },
+ "acorn-globals": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+ "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.1.0",
+ "acorn-walk": "^8.0.2"
+ }
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.21.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "bootstrap": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz",
+ "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.1.1"
+ }
+ },
+ "browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true
+ },
+ "browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ }
+ },
+ "browserslist-generator": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/browserslist-generator/-/browserslist-generator-2.0.2.tgz",
+ "integrity": "sha512-jQ0EIPx4P0k4/AF3cYuEQ49OByCAOJU5jc0ZLiw9WZlLdAkm3rxJIca+AIltAiKe4hcUMqtozsL3s+FYSs3ojQ==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^5.2.30",
+ "@types/object-path": "^0.11.1",
+ "@types/semver": "^7.3.13",
+ "@types/ua-parser-js": "^0.7.36",
+ "browserslist": "4.21.4",
+ "caniuse-lite": "^1.0.30001447",
+ "isbot": "3.6.5",
+ "object-path": "^0.11.8",
+ "semver": "^7.3.8",
+ "ua-parser-js": "^1.0.33"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "dev": true
+ },
+ "c8": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz",
+ "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==",
+ "dev": true,
+ "requires": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@istanbuljs/schema": "^0.1.3",
+ "find-up": "^5.0.0",
+ "foreground-child": "^2.0.0",
+ "istanbul-lib-coverage": "^3.2.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-reports": "^3.1.4",
+ "rimraf": "^3.0.2",
+ "test-exclude": "^6.0.0",
+ "v8-to-istanbul": "^9.0.0",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.9"
+ },
+ "dependencies": {
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ }
+ }
+ },
+ "cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true
+ },
+ "call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "requires": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001707",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
+ "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
+ "dev": true
+ },
+ "chai": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "clean-css": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
+ "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.6.0"
+ }
+ },
+ "clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+ "dev": true,
+ "requires": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^5.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ }
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true
+ },
+ "colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true
+ },
+ "compatfactory": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/compatfactory/-/compatfactory-2.0.9.tgz",
+ "integrity": "sha512-fvO+AWcmbO7P1S+A3mwm3IGr74eHMeq5ZLhNhyNQc9mVDNHT4oe0Gg0ksdIFFNXLK7k7Z/TYcLAUSQdRgh1bsA==",
+ "dev": true,
+ "requires": {
+ "helpertypes": "^0.0.19"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "concurrently": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz",
+ "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "date-fns": "^2.29.1",
+ "lodash": "^4.17.21",
+ "rxjs": "^7.0.0",
+ "shell-quote": "^1.7.3",
+ "spawn-command": "^0.0.2-1",
+ "supports-color": "^8.1.0",
+ "tree-kill": "^1.2.2",
+ "yargs": "^17.3.1"
+ },
+ "dependencies": {
+ "rxjs": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
+ "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ }
+ }
+ },
+ "convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "dev": true
+ },
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "crosspath": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crosspath/-/crosspath-2.0.0.tgz",
+ "integrity": "sha512-ju88BYCQ2uvjO2bR+SsgLSTwTSctU+6Vp2ePbKPgSCZyy4MWZxYsT738DlKVRE5utUjobjPRm1MkTYKJxCmpTA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^17.0.36"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "17.0.45",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
+ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
+ "dev": true
+ }
+ }
+ },
+ "css-declaration-sorter": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz",
+ "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==",
+ "dev": true,
+ "requires": {}
+ },
+ "css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ }
+ },
+ "css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "cssnano": {
+ "version": "5.1.13",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz",
+ "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==",
+ "dev": true,
+ "requires": {
+ "cssnano-preset-default": "^5.2.12",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ }
+ },
+ "cssnano-preset-default": {
+ "version": "5.2.12",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz",
+ "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==",
+ "dev": true,
+ "requires": {
+ "css-declaration-sorter": "^6.3.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.0",
+ "postcss-convert-values": "^5.1.2",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.6",
+ "postcss-merge-rules": "^5.1.2",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.3",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.0",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.0",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ }
+ },
+ "cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+ "dev": true,
+ "requires": {}
+ },
+ "csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dev": true,
+ "requires": {
+ "css-tree": "^1.1.2"
+ }
+ },
+ "cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
+ "dev": true
+ },
+ "cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "requires": {
+ "cssom": "~0.3.6"
+ },
+ "dependencies": {
+ "cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
+ }
+ }
+ },
+ "data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "dev": true,
+ "requires": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "date-fns": {
+ "version": "2.29.3",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
+ "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true
+ },
+ "diff": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+ "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true
+ }
+ }
+ },
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true
+ },
+ "domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "dev": true,
+ "requires": {
+ "webidl-conversions": "^7.0.0"
+ }
+ },
+ "domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.2.0"
+ }
+ },
+ "domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ },
+ "dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "dropcss": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/dropcss/-/dropcss-1.0.16.tgz",
+ "integrity": "sha512-QgA6BUh2SoBYE/dSuMmeGhNdoGtGewt3Rn66xKyXoGNyjrKRXf163wuM+xeQ83p87l/3ALoB6Il1dgKyGS5pEw==",
+ "dev": true
+ },
+ "dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ }
+ },
+ "eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.4.264",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.264.tgz",
+ "integrity": "sha512-AZ6ZRkucHOQT8wke50MktxtmcWZr67kE17X/nAXFf62NIdMdgY6xfsaJD5Szoy84lnkuPWH+4tTNE3s2+bPCiw==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "engine.io": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz",
+ "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==",
+ "dev": true,
+ "requires": {
+ "@types/cookie": "^0.4.1",
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.7.2",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1"
+ }
+ },
+ "engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "dev": true
+ },
+ "entities": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+ "dev": true
+ },
+ "es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true
+ },
+ "es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true
+ },
+ "es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0"
+ }
+ },
+ "es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ }
+ },
+ "esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
+ "requires": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dev": true,
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ }
+ },
+ "eslint": {
+ "version": "8.35.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
+ "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^2.0.0",
+ "@eslint/js": "8.35.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.3",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.4.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ }
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
+ "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+ "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "execa": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz",
+ "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.1",
+ "human-signals": "^3.0.1",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^3.0.7",
+ "strip-final-newline": "^3.0.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true
+ },
+ "generic-names": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz",
+ "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^3.2.0"
+ }
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ }
+ },
+ "get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "requires": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true
+ },
+ "grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true
+ },
+ "has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "helpertypes": {
+ "version": "0.0.19",
+ "resolved": "https://registry.npmjs.org/helpertypes/-/helpertypes-0.0.19.tgz",
+ "integrity": "sha512-J00e55zffgi3yVnUp0UdbMztNkr2PnizEkOe9URNohnrNhW5X0QpegkuLpOmFQInpi93Nb8MCjQRHAiCDF42NQ==",
+ "dev": true
+ },
+ "html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dev": true,
+ "requires": {
+ "whatwg-encoding": "^2.0.0"
+ }
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "html-minifier-terser": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+ "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+ "dev": true,
+ "requires": {
+ "camel-case": "^4.1.1",
+ "clean-css": "^4.2.3",
+ "commander": "^4.1.1",
+ "he": "^1.2.0",
+ "param-case": "^3.0.3",
+ "relateurl": "^0.2.7",
+ "terser": "^4.6.3"
+ },
+ "dependencies": {
+ "clean-css": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
+ "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.6.0"
+ }
+ },
+ "terser": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
+ "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dev": true,
+ "requires": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "human-signals": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
+ "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==",
+ "dev": true
+ },
+ "husky": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==",
+ "dev": true
+ },
+ "icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "requires": {}
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "import-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+ "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+ "dev": true,
+ "requires": {
+ "import-from": "^3.0.0"
+ }
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ }
+ }
+ },
+ "import-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+ "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-builtin-module": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz",
+ "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^3.3.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+ "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true
+ },
+ "is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true
+ },
+ "isbot": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.6.5.tgz",
+ "integrity": "sha512-BchONELXt6yMad++BwGpa0oQxo/uD0keL7N15cYVf0A1oMIoNQ79OqeYdPMFWDrNhCqCbRuw9Y9F3QBjvAxZ5g==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-sdsl": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+ "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "jsdom": {
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
+ "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+ "dev": true,
+ "requires": {
+ "abab": "^2.0.6",
+ "acorn": "^8.8.1",
+ "acorn-globals": "^7.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.2",
+ "decimal.js": "^10.4.2",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.2",
+ "parse5": "^7.1.1",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.1.2",
+ "w3c-xmlserializer": "^4.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0",
+ "ws": "^8.11.0",
+ "xml-name-validator": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lilconfig": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
+ "dev": true
+ },
+ "lint-staged": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.2.tgz",
+ "integrity": "sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==",
+ "dev": true,
+ "requires": {
+ "cli-truncate": "^3.1.0",
+ "colorette": "^2.0.19",
+ "commander": "^9.4.1",
+ "debug": "^4.3.4",
+ "execa": "^6.1.0",
+ "lilconfig": "2.0.6",
+ "listr2": "^5.0.5",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-inspect": "^1.12.2",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.1",
+ "yaml": "^2.1.3"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
+ "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==",
+ "dev": true
+ },
+ "yaml": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.0.tgz",
+ "integrity": "sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==",
+ "dev": true
+ }
+ }
+ },
+ "listr2": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.6.tgz",
+ "integrity": "sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==",
+ "dev": true,
+ "requires": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.19",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.7",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "dependencies": {
+ "cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "requires": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ }
+ },
+ "rxjs": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz",
+ "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ }
+ }
+ },
+ "loader-utils": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
+ "dev": true
+ },
+ "local-pkg": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz",
+ "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true
+ },
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
+ "loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "requires": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ }
+ }
+ },
+ "math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true
+ },
+ "mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "mlly": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz",
+ "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.2",
+ "pathe": "^1.1.0",
+ "pkg-types": "^1.0.1",
+ "ufo": "^1.1.0"
+ }
+ },
+ "mrmime": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node-releases": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "dev": true,
+ "requires": {
+ "path-key": "^4.0.0"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true
+ }
+ }
+ },
+ "nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ },
+ "nwsapi": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
+ "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true
+ },
+ "object-inspect": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+ "dev": true
+ },
+ "object-path": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz",
+ "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^4.0.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "p-queue": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
+ "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "^4.0.4",
+ "p-timeout": "^3.2.0"
+ }
+ },
+ "p-timeout": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
+ "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+ "dev": true,
+ "requires": {
+ "p-finally": "^1.0.0"
+ }
+ },
+ "param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse5": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz",
+ "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==",
+ "dev": true,
+ "requires": {
+ "entities": "^4.4.0"
+ }
+ },
+ "pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true
+ },
+ "pify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+ "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
+ "dev": true
+ },
+ "pkg-types": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz",
+ "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==",
+ "dev": true,
+ "requires": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.1.1",
+ "pathe": "^1.1.0"
+ }
+ },
+ "postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.0",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-colormin": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz",
+ "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.16.6",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-convert-values": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz",
+ "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.20.3",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dev": true,
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ }
+ },
+ "postcss-merge-longhand": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz",
+ "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.0"
+ }
+ },
+ "postcss-merge-rules": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz",
+ "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.16.6",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ }
+ },
+ "postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "dev": true,
+ "requires": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-params": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz",
+ "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.16.6",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.5"
+ }
+ },
+ "postcss-modules": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz",
+ "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==",
+ "dev": true,
+ "requires": {
+ "generic-names": "^4.0.0",
+ "icss-replace-symbols": "^1.1.0",
+ "lodash.camelcase": "^4.3.0",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "string-hash": "^1.1.1"
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^5.0.0"
+ }
+ },
+ "postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-unicode": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz",
+ "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.16.6",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "dev": true,
+ "requires": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "dev": true,
+ "requires": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-reduce-initial": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz",
+ "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.16.6",
+ "caniuse-api": "^3.0.0"
+ }
+ },
+ "postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ }
+ },
+ "postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.5"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
+ "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "promise.series": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz",
+ "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ }
+ }
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "rollup": {
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "rollup-plugin-ignore": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-ignore/-/rollup-plugin-ignore-1.0.10.tgz",
+ "integrity": "sha512-VsbnfwwaTv2Dxl2onubetX/3RnSnplNnjdix0hvF8y2YpqdzlZrjIq6zkcuVJ08XysS8zqW3gt3ORBndFDgsrg==",
+ "dev": true
+ },
+ "rollup-plugin-postcss": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz",
+ "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "concat-with-sourcemaps": "^1.1.0",
+ "cssnano": "^5.0.1",
+ "import-cwd": "^3.0.0",
+ "p-queue": "^6.6.2",
+ "pify": "^5.0.0",
+ "postcss-load-config": "^3.0.0",
+ "postcss-modules": "^4.0.0",
+ "promise.series": "^0.2.0",
+ "resolve": "^1.19.0",
+ "rollup-pluginutils": "^2.8.2",
+ "safe-identifier": "^0.4.2",
+ "style-inject": "^0.3.0"
+ }
+ },
+ "rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ }
+ },
+ "rollup-plugin-ts": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-ts/-/rollup-plugin-ts-3.2.0.tgz",
+ "integrity": "sha512-KkTLVifkUexEiAXS9VtSjDrjKr0TyusmNJpb2ZTAzI9VuPumSu4AktIaVNnwv70iUEitHwZtET7OAM+5n1u1tg==",
+ "dev": true,
+ "requires": {
+ "@rollup/pluginutils": "^5.0.2",
+ "@wessberg/stringutil": "^1.0.19",
+ "ansi-colors": "^4.1.3",
+ "browserslist": "^4.21.4",
+ "browserslist-generator": "^2.0.1",
+ "compatfactory": "^2.0.9",
+ "crosspath": "^2.0.0",
+ "magic-string": "^0.27.0",
+ "ts-clone-node": "^2.0.4",
+ "tslib": "^2.4.1"
+ },
+ "dependencies": {
+ "@rollup/pluginutils": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+ "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "@types/estree": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ }
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+ "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+ "dev": true,
+ "requires": {
+ "estree-walker": "^0.6.1"
+ },
+ "dependencies": {
+ "estree-walker": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
+ "dev": true
+ }
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "safe-identifier": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
+ "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sass": {
+ "version": "1.58.3",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz",
+ "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "dependencies": {
+ "immutable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
+ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
+ "dev": true
+ }
+ }
+ },
+ "saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "requires": {
+ "xmlchars": "^2.2.0"
+ }
+ },
+ "semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true
+ },
+ "serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "shell-quote": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
+ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
+ "dev": true
+ },
+ "siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "sirv": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz",
+ "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==",
+ "dev": true,
+ "requires": {
+ "@polka/url": "^1.0.0-next.20",
+ "mrmime": "^1.0.0",
+ "totalist": "^3.0.0"
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true
+ }
+ }
+ },
+ "socket.io": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz",
+ "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.3.2",
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ }
+ },
+ "socket.io-adapter": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
+ "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
+ "dev": true,
+ "requires": {
+ "debug": "~4.3.4",
+ "ws": "~8.17.1"
+ }
+ },
+ "socket.io-parser": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+ "dev": true,
+ "requires": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "spawn-command": {
+ "version": "0.0.2-1",
+ "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
+ "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true
+ },
+ "std-env": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz",
+ "integrity": "sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q==",
+ "dev": true
+ },
+ "string-argv": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+ "dev": true
+ },
+ "string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "strip-literal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz",
+ "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.1"
+ }
+ },
+ "style-inject": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
+ "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==",
+ "dev": true
+ },
+ "stylehacks": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz",
+ "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.16.6",
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dev": true,
+ "requires": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true
+ }
+ }
+ },
+ "symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true
+ },
+ "terser": {
+ "version": "5.16.5",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz",
+ "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ }
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "tinybench": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz",
+ "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==",
+ "dev": true
+ },
+ "tinypool": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz",
+ "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==",
+ "dev": true
+ },
+ "tinyspy": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz",
+ "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "totalist": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz",
+ "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "dependencies": {
+ "universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true
+ }
+ }
+ },
+ "tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true
+ },
+ "ts-clone-node": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/ts-clone-node/-/ts-clone-node-2.0.4.tgz",
+ "integrity": "sha512-eG6FAgmQsenhIJOIFhUcO6yyYejBKZIKcI3y21jiQmIOrth5pD6GElyPAyeihbPSyBs3u/9PVNXy+5I7jGy8jA==",
+ "dev": true,
+ "requires": {
+ "compatfactory": "^2.0.9"
+ }
+ },
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "dev": true
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
+ "tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true
+ },
+ "typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "1.0.33",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz",
+ "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==",
+ "dev": true
+ },
+ "ufo": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz",
+ "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==",
+ "dev": true
+ },
+ "update-browserslist-db": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz",
+ "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "requires": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ },
+ "v8-to-istanbul": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+ "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true
+ },
+ "vite": {
+ "version": "4.5.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz",
+ "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.18.10",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ },
+ "dependencies": {
+ "rollup": {
+ "version": "3.29.5",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
+ "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ }
+ }
+ },
+ "vite-node": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.2.tgz",
+ "integrity": "sha512-5oe1z6wzI3gkvc4yOBbDBbgpiWiApvuN4P55E8OI131JGrSuo4X3SOZrNmZYo4R8Zkze/dhi572blX0zc+6SdA==",
+ "dev": true,
+ "requires": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.4",
+ "mlly": "^1.1.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "vite": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "vitest": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.2.tgz",
+ "integrity": "sha512-ydK9IGbAvoY8wkg29DQ4ivcVviCaUi3ivuPKfZEVddMTenFHUfB8EEDXQV8+RasEk1ACFLgMUqAaDuQ/Nk+mQA==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "^4.3.4",
+ "@types/chai-subset": "^1.3.3",
+ "@types/node": "*",
+ "@vitest/expect": "0.29.2",
+ "@vitest/runner": "0.29.2",
+ "@vitest/spy": "0.29.2",
+ "@vitest/utils": "0.29.2",
+ "acorn": "^8.8.1",
+ "acorn-walk": "^8.2.0",
+ "cac": "^6.7.14",
+ "chai": "^4.3.7",
+ "debug": "^4.3.4",
+ "local-pkg": "^0.4.2",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "source-map": "^0.6.1",
+ "std-env": "^3.3.1",
+ "strip-literal": "^1.0.0",
+ "tinybench": "^2.3.1",
+ "tinypool": "^0.3.1",
+ "tinyspy": "^1.0.2",
+ "vite": "^3.0.0 || ^4.0.0",
+ "vite-node": "0.29.2",
+ "why-is-node-running": "^2.2.2"
+ }
+ },
+ "vitest-github-actions-reporter": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/vitest-github-actions-reporter/-/vitest-github-actions-reporter-0.10.0.tgz",
+ "integrity": "sha512-ctFM1xlOVsXCNp5+LkaBZBhN1Iq5y9vVMZ9+Czls2CimOUKt0lH24MV1S0EzKysNUT7efs2OOSdmc6lgR8hqXg==",
+ "dev": true,
+ "requires": {
+ "@actions/core": "^1.10.0"
+ }
+ },
+ "w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "dev": true,
+ "requires": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "w3c-xmlserializer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+ "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+ "dev": true,
+ "requires": {
+ "xml-name-validator": "^4.0.0"
+ }
+ },
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true
+ },
+ "whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.6.3"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ }
+ }
+ }
+ },
+ "whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "why-is-node-running": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
+ "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "dev": true,
+ "requires": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true
+ },
+ "xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "17.5.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+ "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.0.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
index 92e45d93c..02033ea2f 100644
--- a/package.json
+++ b/package.json
@@ -1,24 +1,115 @@
{
- "name": "bootstrap-datetimepicker",
- "version": "2.1.32",
- "repository": {
- "type": "git",
- "url": "git://github.com/eonasdan/bootstrap-datetimepicker.git"
+ "author": {
+ "name": "Jonathan Peterson"
+ },
+ "name": "@eonasdan/tempus-dominus",
+ "version": "6.10.3",
+ "style": "dist/css/tempus-dominus.css",
+ "sass": "scss/tempus-dominus.scss",
+ "main": "dist/js/tempus-dominus.js",
+ "module": "dist/js/tempus-dominus.esm.js",
+ "types": "types/tempus-dominus.d.ts",
+ "files": [
+ "dist/**/*",
+ "src/js/**/*.ts",
+ "src/js/locales/**/*.ts",
+ "src/js/plugins/**/*.ts",
+ "src/scss/**/*.scss",
+ "types/**/*"
+ ],
+ "scripts": {
+ "start": "npm run build && concurrently \"npm:*-watch\"",
+ "test": "vitest --ui",
+ "test:silent": "vitest --run --silent",
+ "test:coverage": "vitest run --coverage",
+ "serve": "node ./build/serve.js",
+ "clean": "node ./build/utilities.js --clean ./dist && node ./build/utilities.js --clean ./types",
+ "build": "npm run clean && node ./build/utilities.js --copy && npm run rollup && npm run build:declarations && npm run build:plugins-and-locales",
+ "build:plugins": "node ./build/plugins.js -p",
+ "build:locales": "node ./build/plugins.js -l",
+ "build:plugins-and-locales": "node ./build/plugins.js",
+ "build:declarations": "node ./build/utilities.js --clean ./types && tsc --declaration --emitDeclarationOnly --outDir types",
+ "sass": "sass src/scss/tempus-dominus.scss ./dist/css/tempus-dominus.css",
+ "rollup": "rollup -c ./build/rollup.config.js",
+ "rollup-watch": "rollup -c ./build/rollup.config.js -w",
+ "docs": "node ./src/docs/make.js",
+ "docs-watch": "node ./src/docs/make.js --watch",
+ "release": "npm run eslint && npm run test:silent && npm run build",
+ "version": "node build/change-version.js",
+ "prepare": "husky install",
+ "prettier": "prettier --ignore-unknown --write .",
+ "eslint": "npm run prettier && npx eslint --ext .html,.ts ."
+ },
+ "lint-staged": {
+ "**/*!(.d)/.ts": [
+ "npm run eslint"
+ ],
+ "**/*": [
+ "npm run prettier"
+ ]
+ },
+ "bugs": {
+ "url": "https://github.com/eonasdan/tempus-dominus/issues"
+ },
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.6"
+ },
+ "peerDependenciesMeta": {
+ "@popperjs/core\"": {
+ "optional": true
+ }
},
+ "description": "A robust and powerful date/time picker component. For usage, installation and demos see Project Site on GitHub",
+ "devDependencies": {
+ "@eonasdan/parvus-server": "^1.2.1",
+ "@popperjs/core": "^2.11.6",
+ "@rollup/plugin-node-resolve": "^14.1.0",
+ "@types/node": "^18.14.2",
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
+ "@typescript-eslint/parser": "^5.54.0",
+ "@vitest/coverage-c8": "^0.29.2",
+ "@vitest/ui": "^0.29.2",
+ "bootstrap": "^5.2.3",
+ "chokidar": "^3.5.3",
+ "clean-css": "^5.3.2",
+ "concurrently": "^7.6.0",
+ "dropcss": "^1.0.16",
+ "eslint": "^8.35.0",
+ "eslint-config-prettier": "^8.6.0",
+ "glob": "^7.2.3",
+ "globby": "^11.1.0",
+ "html-minifier-terser": "^5.1.1",
+ "husky": "^8.0.3",
+ "jsdom": "^20.0.3",
+ "lint-staged": "^13.1.2",
+ "prettier": "^2.8.4",
+ "rollup": "^2.79.1",
+ "rollup-plugin-ignore": "^1.0.10",
+ "rollup-plugin-postcss": "^4.0.2",
+ "rollup-plugin-terser": "^7.0.2",
+ "rollup-plugin-ts": "^3.2.0",
+ "sass": "^1.58.3",
+ "terser": "^5.16.5",
+ "tslib": "^2.5.0",
+ "typescript": "~4.9.5",
+ "vitest": "^0.29.2",
+ "vitest-github-actions-reporter": "^0.10.0"
+ },
+ "homepage": "https://getdatepicker.com/",
"keywords": [
- "twitter-bootstrap",
- "bootstrap",
"datepicker",
"datetimepicker",
- "timepicker",
- "moment"
+ "timepicker"
],
- "devDependencies": {
- "uglify-js": "*",
- "less": "*",
- "mocha-phantomjs": "*",
- "mocha": "*",
- "chai": "*",
- "coffee-script": "*"
- }
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Eonasdan/tempus-dominus.git"
+ },
+ "wallaby": {
+ "filesWithNoCoverageCalculated": [
+ "test/fixtures/**/*"
+ ]
+ },
+ "funding": "https://ko-fi.com/eonasdan"
}
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 000000000..c18703a51
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,8 @@
+sonar.organization=eonasdan
+sonar.projectKey=Eonasdan_tempus-dominus
+
+sonar.projectName=tempus-dominus
+sonar.projectVersion=6.9.4
+
+sonar.sources = src/
+sonar.tests = test/
diff --git a/src/docs/assets/24hour.png b/src/docs/assets/24hour.png
new file mode 100644
index 000000000..b287c0f40
Binary files /dev/null and b/src/docs/assets/24hour.png differ
diff --git a/src/docs/assets/buttons.png b/src/docs/assets/buttons.png
new file mode 100644
index 000000000..94c11730a
Binary files /dev/null and b/src/docs/assets/buttons.png differ
diff --git a/src/docs/assets/calendar-view.png b/src/docs/assets/calendar-view.png
new file mode 100644
index 000000000..e082b7791
Binary files /dev/null and b/src/docs/assets/calendar-view.png differ
diff --git a/src/docs/assets/calendar-weeks.png b/src/docs/assets/calendar-weeks.png
new file mode 100644
index 000000000..17678606c
Binary files /dev/null and b/src/docs/assets/calendar-weeks.png differ
diff --git a/src/docs/assets/date-range.png b/src/docs/assets/date-range.png
new file mode 100644
index 000000000..8c1d5405e
Binary files /dev/null and b/src/docs/assets/date-range.png differ
diff --git a/src/docs/assets/decade-view.png b/src/docs/assets/decade-view.png
new file mode 100644
index 000000000..b0347f0f6
Binary files /dev/null and b/src/docs/assets/decade-view.png differ
diff --git a/src/docs/assets/metronic-thumb-1.png b/src/docs/assets/metronic-thumb-1.png
new file mode 100644
index 000000000..368f0f64c
Binary files /dev/null and b/src/docs/assets/metronic-thumb-1.png differ
diff --git a/src/docs/assets/metronic-thumb-2.png b/src/docs/assets/metronic-thumb-2.png
new file mode 100644
index 000000000..44efef37e
Binary files /dev/null and b/src/docs/assets/metronic-thumb-2.png differ
diff --git a/src/docs/assets/metronic-thumb-3.png b/src/docs/assets/metronic-thumb-3.png
new file mode 100644
index 000000000..847c866f1
Binary files /dev/null and b/src/docs/assets/metronic-thumb-3.png differ
diff --git a/src/docs/assets/month-view.png b/src/docs/assets/month-view.png
new file mode 100644
index 000000000..6e547de6d
Binary files /dev/null and b/src/docs/assets/month-view.png differ
diff --git a/src/docs/assets/no-styles.html b/src/docs/assets/no-styles.html
new file mode 100644
index 000000000..c507fafe7
--- /dev/null
+++ b/src/docs/assets/no-styles.html
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+ Examples - No Styles - Tempus Dominus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Examples without external styles
+
+
+
+
+
+ This page is to demonstrate that the picker can be used free of other styling.
+
+
+ For full examples and to return to the main site click here .
+
+
+
+
+
+
+ <div
+ class='input-group'
+ id='datetimepicker1'
+ data-td-target-input='nearest'
+ data-td-target-toggle='nearest'
+ >
+ <input
+ id='datetimepicker1Input'
+ type='text'
+ class='form-control'
+ data-td-target='#datetimepicker1'
+ />
+ <span
+ class='input-group-text'
+ data-td-target='#datetimepicker1'
+ data-td-toggle='datetimepicker'
+ >
+ <span class='fas fa-calendar'></span>
+ </span>
+ </div>
+
+
+
+
+
+ new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+
+
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/docs/assets/repl-data.json b/src/docs/assets/repl-data.json
new file mode 100644
index 000000000..56d861a1a
--- /dev/null
+++ b/src/docs/assets/repl-data.json
@@ -0,0 +1,20 @@
+{
+ "note": "These are compressed JSON objects of different examples that can be loaded into the REPL code param. They are generated with https://stackblitz.com/edit/js-wpnd4a?file=index.js",
+ "iconOnly": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QQqALAgW01oB4IAHAQzgB04AAiFIAJgF4A5GJ4EyBJMzJckAYwDWZIgEYpgkWsw8IEaZhgoAtGQBuZOAX3ChEAtkxlpYpN2PY8USwkODIrACMLTSkAPgMhdiQhIxMzKQQeKwgYTHEhDKs1Hk84WSJ8zIA2AA8pIR4iJEyGcTEHaWJyWPYAeiQ4l17uPhj6ECZWADkYeQ4uGIBBTEwhbBgSIVCyMVEIeuEyT2VHIQIYeoICHjUGU4YyIVVNbVOYADpe+ZAAXyA",
+ "sideBySide": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcISOmQBC2AMoiyXYuT4CAviCoALAgFtMtADxMAfABU1jTqM3wIxVgTIROBNWSEyAtACNsb4aM4wmAiR4ADpdAHpDRU5dNg8yTE4EGCIAXgByOlsyIM0yJiQAYwBrMiIARgBJOCYSAnTOQrYICAzkok03OIT0g2lRT29+lwKSsojuzAM+XQYAN2im1haMpBq6txQiGBImTkwYFDcyObI4euiRDKy7XPyi0or06JvWNwI6d9YiFBy3NdqBAycDI33sF345lsbw+Xx+fwIhxQmDIwNBRHBzzg0zgugBdUudGu2Tuo0eVXWEIEBGwTFR6TsAA8qY1mq10u1OoV4MQYJgsQJXu9PgRvr8gekAMQ3HJIPJksrlLHhHG6ZisOCLNmrSmbba7d5kZkCqGi4Vw8UZaUkuX3MZPF7Q82IlDI+ky0kPMpYnGCNVMDWs5bshBvCB8kRJN6FVgouBZIi9CLq7GKZMB1O48LzX2cVQgDTaAByMDsekMJjMFisNjsDicLl8ZEGPhk-kCwTgYUiBhASiAA",
+ "localization": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8RMYBjAQ0yQC8mCl48ACYADpwCMACZNsfAOSB8EECsIIAEQOYE4QQEIggDhBegQRA5gZhBAfCCAWEEC8IIHkQKRSENMZJkWmA8EEDiIOq0bVgGRBegJhBA0iCG5QG4QOWN1OQsreggyaUB0EEAGEEAuEAVfT21ARhB9BUBJEHVEiLhomwYCAFl4AgALaUAkEF90hXi0wB4QOS1TQDEQAoAHIjIAN24SCHLhat5ZJUN-QGEQXOVeVvauyzg4MgAPMorxqRrtYMMZwDkQbLlmxbbO8NWishKATVt7CbqGpq8DQx6+wZhhp52aQyKazea8L4FdZbQEvPYHORHU7nCFGGYFO4lAAi9yYohir3qjTSAXaGmCGhuQl6AyGEBxzHxwNBRzOcl4pNM5LklKhmwIDLxBKkgEIQQ4nNkcq7c3mrGl-YZQMjCEhESQTEGIsHqBbeOT5VbQghKlVq6RixESnU+fU9JAMADWAAl-nC3op1Kp2U54loCkg4Aw+gBbZUEF2q2pKZqmXgzPWBdROELqcyrfFBsih4QRuGAYhBWsYPIAJEE9Xh9frl9odpQDJAIwrexK8zXUxhmqnRqwDmezZTrDekgBwQNsd+K8QD8IAp1I0zqE00IMyGw7W4PXhQWQiWy4tR527Y6AMr3eCiWpEj4+VRZfTKf2B5fCY8MU-SPMJpMp9k6RIzYzTAolyzMNn1fCZNyLYsv20fU-wA1YRBQFAbFKMgiCQUQkCzYFFH1QJjhcNIJw9IwMTIYoCAAFSQUNz3eNJvGjBdCnI+4BU4RsLxJJou0XCQADUsIAdydWx8SIAAxGAiGDTg+GAXhgx2aR6DgFALF4bBnmkAAmABaTCUCQAgpF4ABfVZ6GYGxpFIDECDsAg0AQSjKjIAB1MgyAdPgAEYhHMkAqEqAhg0wWggpAEKwoAORgBtaAAHm6AA+IQHn+XhmDgXhehgQZ8V4KyWHYThuBymBui4eAIF4EReHytD0MKqoyDqmAYEwLhulqphaqE8jMF4Pq6rc3hxGwAB6JSxnGpAIG6TAJAAOiERLJtStbNrgVz5qypgcoAIza6ICF4ZCYEOlgcF4QYmF4RKX3xFKG2DbphixGBgzrCBlpxBAmBILq0Cq8rfuK1gOGqnKAF5+F4ZbEfM9anrIFKGqIXhDuwKw+jKtThtuuwkCYQ6bF4MhlpQZaHtRlKX0KM7SF4OGFJECa8FkXC1E0HQvjMUzEZpsyAG4UbENHRuVXKiHyjC2tahrQZqoQ+rWja0rgZK+k1x6JaypaIAgGGpCWtSSCYFAyD0sAmH6PqgyQKqpE19YhLqrN3vpL6fuWyjPY+n21wgAAKURGBIPsqbIAgAFEbD7AAhbAAElRBDqRxAbLhQ26as0J0qQAEoKH4IQIdK6G+FIIQzPVun1ZpXXttctC2rsNqIbaxaSCMwpRs4GW5ZatzoiKxgWDIX7G813heBAMygA",
+ "timeOnly": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcAbkjIB3ALIw6ZLgHIAxphgKA1nIp9BnBTAC2TeGTgEIXXv22cZC1jLOcErTBEpar2MqyJcnLt5baevAEABa+zq6agYJ0rASyjpEBVpyhMCREDsTk0al6SHAkCdmkKVauunB0Dn6u7gIAvu6NIFShBHqYtG0gHV0AcjAJtAA8TAB87gBqZFlI8JwAbJxwMJzKcChznCSuEJxSesYEAFIHEOuumGQKBIUonGFknGKh8U-rDMxs2JyMqxgYmsRmESFYT1CL1GuhkE2+LHYADpdAYjCYIKMAPSwsgTJF8bGTECNIA",
+ "inputOnly": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QQqALAgW01oB5MBDAIzMwAECGEQC8AcgAmXAmQJJmZAA5IAxgGsyRAIziBq7hAgThRZgFpufTOIB8AORgC18dgHor-WwB04AgexIcEokBL7+-kiSEtKy8ooqGlq64REE2EpkErIAHgTiqf4GXEYmIhaq8MQwNqlutvQgTKyOshxKtgCCfkEhBAIoRDAkSgJccJLOlX5cRGQCcDD9cwCOJEhzk6YCBAzziZpEO04IJHCq8vAUAtjD+uNjmBBOEApKOAIkEPMPvaFCSH4kgAdO4OiAAL5AA",
+ "enabledDates": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB5dkMKtS3eqXYBfdgmaj2AcgACpeIQgATQnAD0cgRAC0R0eMFaA3AB04b9uwDG8CB1aiLBoA7uwAvOxwpKEycgAUAJSucJ4BdEEwwQB0ZKyxpHFpGdkopHmyBQnsANTsAIxJHpHRPHwMgiJiEhBxdl78dKRwrFmlrACimHxDrABC2ACSRnFaJnKsigxIXgDWpMx1WglSwE2ezKR+zNsbvnicZ57sRkgQhABGU0b5EPcA2o8nuwiswQuRAU8ojEKgpBoksnRTEh2pgKnEAExSVYVI7glJA9gAXTxQOUJJUSRAlAAFqw6JgaFSQLT6QA5GByGgAHgYAD5xnAPl8zEJXkLSEZpBUIFyzHymjzeQBNGD8bymdgMDQANyQRiUGsIoMI2HYMAQz2lwJg7CG4rNzEtcgg1ueYs+pCysr5IGUQA",
+ "linkedPickers": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB5dgDlCdUhAaEAxqXYBfdgmaj2AcgACpeIQgATQnAD0rPg0EBaM6PGC9AbgA6cdu2+-leAgOTHEAa1IzAAUkZQjmAEYAUUw+UjgOAF52Z2V+eQyAOhRSVhS0jIAhbABJMwAKPVC4COjY+IgEvQBKLx92QLhg9mbWhPZsuFIAdx47QRExCQh60ciYuNJE8oLWXv8BoJDwyIAmCfYp2d4BYRdl+tz89NZi0p2X6rrGtbbN5ggpx6UmAB18glIUH4zGYLzwWmIZAO6n2-QOVisgnEKHYpAAbi8RkhgukthADr8NvFkqldoVCGYzEkCRkADLE2xTZj1WTyRQqUiFfEvCCFZQAC0sJSk9VI3QmAD5OGCiS0zoV+AwLLY0AxWEggvVQf1fL5YcFmLF9UF4cbTfb2EshIRbPDBWZSoQkJhCtrSCrfOoVSi+oHUb50ZiINj2BB+AAjCDKS3xtTyVjimBmA6DYZxxPJpB6g0+bK-U6FfNJlOkHlyBRKVRClmsUUSqUUdiy+WZJV202-BIarUu0i661DI0B9jm1iW5QTiC26e+OiEAAeztduN9o+nQZNGnDR9Dfn6GNxLaJJK5A0s7FT7H4QwT1aQqbM7FYMDwkdjr8LYt4A1F8CxrepehAShxVYOhMBoAAeMwkDxAZMFMCBMj0HRpj0BVvE8VgkJQtCMKwwJMAcCA6AcAA2PCCI4dgEPQ1NMC0FgsMpdoyQSGo4HsVg9FIiBML0BAWBo1jSEwPCADEdDoBCrGkzB8LgQjfGIvFGMI5R0NErDxEEhwUB0TURhgFAHGFDI9F0-UzC4k4-g6LoHO1QgHFYMxvMIZgSlYBxjP4VgsKmfyFCEjyXS8ny-IC0pvKslBUnC0hIuCeyNKY9TCMIhCQtYBzfCQJymhcqleP4wTsvypjWGwBhSCw2x12inLNJEsSJOYGjBjnGBZJKnJYu83zWH8wKsIAYm4-5Ojq4rWCsPLloQ-kNM6pj9LIvQitM8yGG80h2qWrrPPGhLpr0ObKp4gF3O23xLvi78UFSlq9D9fV5AYB7ztYNauuYzbuqwogqKGsqEQcZRiHSCxmDw5TNuBjhUaUOA1q0qxkLxNblPxwn8fBvQKKomj6Jx5jVI45hnLVVyyVOGrQuE3bDPEySHFUvDuBgZTVJp7SHM5sSDrMmALMwKybJbQGysZ1oqoBIEYsmq7JsSoKivSzKOvq16JqmpL3s+-XZyW3x0cKgTQpGpWKqZ1XATZw3lt8Rrmta06Pa68WIZ5gadGG57Rs1t7TbC275o6dXttWhyNqxkbA-2+2gqlzUTrOkbjeu0pZrjlnAZesa3pStLvtHX7SH+-5AfR00U-vdPIYgaHP0h+HUjgJGUasNGSsxywRbxlDCYngnvCJyeoJAGC4OkGBbEQhgFXZJn2AbjplI3hCN4OABNaW7x8CFL0JUIbzJdgWC-cU1CrQtH3TTNP2-VUwi-aYYB3h6EAvxWVKE-ZghR2ByQfqdOQDBUhSEIOwTMth2LBEINgA48YYAwDCNiQos8rBHzgCAdQQA",
+ "customIcons": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GckAY3gQuvfoIEEkAWzJcA5ACMknNQFphmGMIDWSin2kC6rAos6r1W4a0xk45okZOmSTZWo1JNrIiIYAHdNTzcpaToQuG9bPwCg0OjguAjTTiYiMgA3JBgScWsfOwALXKC4TUcEAnTTODIADwI4321ynMrNIlRSuuNIwQIYcw5i+O0HJxcOsgN66R0yALatYlYIUsXBHRgIKxt2pp2AX0HpFRICEbgiyQyRsa5icgvTZdXOV8p3Jd0Di9SL8hud3KcQFR+nJMLQADwMHLuHSbCAAXh4ICQcCY100KCCnk4uhQmlyTgImPcSDoGPoFjIsgUTBE+jIRAAjFSpOYCKxNAQ6AKAihGZpsbiCHTGgEyBBKSB3Lz+YLhURRQQBTAUChHNKVtl5dyAHzuOES65-IS0zG8xnyMgsgzsjkASRxlsVQwI2CYZDplha3P+qLpCBgRDk2ngxBgmGDgmVAqFfPVjLpAGI7UzHayXQmAPSmqRw5isOBWlEQdGYi2agkFJgC5oKq1J1WpjWZ7MOp1szkJswWFUp7W6-22hk5vvshPF6SlpjlzhVmsgEp+eyOZwBTHGuEFstweecA9H4sHxEXzDY-ScbKYOny7COLZkRmYzilbIIOn9AhMOIBYFsIdBwAAdJAdBkDeXTgY0BAFjicgFioMAwAQ8pEKwTYiGIAACHLgQAnOBHIFuGcCIWhGFYTh4qiHc4HCNWe6QiA0KYAAchhZDwkwxpQIUIxyJwrqMRAB4CXCAnuAAmgUK7LsIpTlqK3zlEIEmcAgQSiQQmkAGIxpwACCwRyjACicNBCCsCQmAEN8MCcOWGHlEQWnwFaAgHE5N5sqerBfj+aJKP+gF4MBeFMRqNGYRsTDMVZBZKN8IrpkoAD6KhsHAhj3jBYVwOhfqNK4xoAELoQl2FMEoEBiYxB6sBeBayXAICnEAA",
+ "viewMode": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcAbkjIB3ALIw6ZLgHJsZVkQhy+AgL4gqACwIBbTLW0g9hgHIwCZWgB4mAPgBqosZykzbAekf2H6zgAVHTJhV059aVCYJgIkeAhOVkxMGDFE7BgSTgIYTggdNKTOBgQEMiIyOAJOJDgkOOSw8QA6TgAxGCJOMgAPVn0WUIgyTDIAYzi4FGK6VmtOGAROACMkIgIdFr5vRz4QDSA",
+ "disableWeekday": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QiyJikBjApeCPAAmAB04ugrgBMAhtghoEAdTJkA1gBEkEUQCNMZYdwDaABgpcAbAF1+ggL4gqACwIBbTLWsg7jgHIwCZWgB4ADgB8yqoaWlyK4hBcMAhcBDZkXLIKvgD0QQGB5lwAmjAkXMyiAsIq6poiUTFxCUkA7nLyXJhI8kkAyiRwYthcABR6AJRcJcJcHaIEJES9A0ZD-OlB-CAWQA",
+ "inline": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GckWYWS7FyfAQF8QVABYEAtploAeNgCMymTghhEAvAHI6rAmQJIlZJkgDGAazJEAjMc722ECCf1ElAFotHWMAPgBJETgyNQB6EMwwqU41BgA3FIEvVh8TTBgUQLJ0sjgCYyyhOhMzCysbOycXdxTk-lS4jLC5EEUVADkYC3UmSOjYuLG1MYBNGBJPVn5WTAgYThIIMk4CeR2m5yIhCYA6eLG+EGkgA",
+ "multipleDates": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QBbEzApAB0zIBEBDAsiPAATFyIKgAsCdTLVEgJUgHIxetADwsAfAFlGzNmQHdeEVQHpN6jQBUxBlkgDGAazJEBXTJhgB3CAIQwbgxMrOwCACY8fEIwAgBGBhBk7A684QB0ZpoAOnAgAL5AA",
+ "updateOptions": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB7AL7sEzUewDkAAVLxCEACaE4AelZ8GggLSbR4wYoDcAHTh2AxvAgcHACx0pSaBqyTOAIX5WVnh2AF52Mwd+OlI4VgA6L1YAUUw+eNYA7ABJTQAKRXdPb19-OAhFAEpbOCdKjjIQ8XRy5wAFJAcAa1JmCPY4UgB3HkNBETEJCALo2Kzk0jSMuISc-KLtAz84hm6+5gBGGtq7OwyOMMiiElJHDzgvHz9A4NC4RMJNTVSANyyABkkC54v0ig5MAdFOR2AVqhEAHycOzNPxPF4VCBdXr9RL8BjbMqvSoFYB2ZikFzMbokiB4FFwbTYCBoBAAdVIpB6QhBhAARhlNAywgB+dgAbQAuuwGRKAAywgBsUrsUjVZzg13YAEJ4HUSk9iVigiF4IlIRoIMCXIlQigUBkivzWHBjAwaXRCMxsDUDY9nu1KqaPhbMFabUl7Y7SM7XcYyA1tD6-RqrCBKG5WHRMDQADzh-mkTCyFjhGwgIm7Uj7XHHXJwIysCvsS0QCDlkAIFh0YyF4sVxE4w553T9zCIux5zRIP6OcPtzviJvGFDyAnsTAwFDGUgAhIVuxITSdqv0GsHfpHQ9MwisQjGViaR-elLGZfBTvDb1U5sgOzbA+T4vswb7RhkX6kD+Lg3pOcB5h+zZwMep53ss561ocRwNk2N6sNgDCkJ2BgAB5-vOVqdt2zC9g0rDyJgN6AY+z73qByydgAxGeeyXscN66HBeYQAwOgUYuFaIau64MI+pBkUxd5Aaxr4cRW3FodWmFXop94sY+24xqhOwYXxsFTkgrYLh2FZEBAsgPg4xDxMmg6jkgQm6CJOieTOfxCX5VmUYo8hjHQrDGAAzIoAWzkFi7FDAmAJr2SoxVO-LvGEKHFAGxrOIo8UdooLpwOwpXup63q+oi3CGRkUR8oKpCaOwIxcn0TIQKOmVmnAvmzgN-kZiAWY5gAcjABj5gwiIAKqEmh7AwEG3W6LNeazewACaMD8K2OjsB6MB-MepDsIQQyjOwzTLQgy2reV2AHZgUJPOweZOJopCIgSRKYs4BQSsMIwA5UUrVKOX0-YkPBuCCsj8PUJIXSQMB2OwqNbiM9nYHt7ChOwlK3awbjnStdLlYQvQEzABNk1EpBEPwmBXAMcTsfT50gw9lMjEgpNc4zzOs+w4igt8d1C-JILoigvNYk9R1Wq0H3Q4i9H8KQUMwN9yIaELiYo6JzCEHEBjMIko6zXYIBSEAA",
+ "parentContainer": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QBjeAgQyTjKLwAIATGOkgLZk4BAHQBHckWwBlMpjJ0CMIgAoA5NyQA3AMQAHJkWEEAtAxEs2RdQEoQVABYEBmWgB4t2zkm4BedUNjEXNGK3Z1TjpMJggIAOMYgh0yTn1TAFZIiAJsBQCYbXYETBgAdy4mEmUAbk5HMlRnLgBGAAY2-QAPOrLfAkdWjoBSGvUAPgAdOE5OdxiAI3lOBBUAi2ZWdgARJgIyAAUkOgBrdgBJOH1qifcAekX5KZm5ryiYuIDWa7MUIhgSPpOKUUKYyEURJFfAFuHsyMkhPpjmciC1IrDmKYCNwsUYUPDTN9qgE2EYyDl1NNZtTZhimFiccwiPizMoUCh8upScYKc8ae4iQQfP51BtwkRdvsjqcLlcbpxcvoyAF9l0CJForF4upVkQBKERP9MJE7nzqe4IIYZprPupBaY-gD0qr1Tw9vTsbjmfCAroIPDknB0PpkvAIJSXjSaXSGViYOzORj4UhEciImb+ZamNaPtqEPSIDBML4VvS6EwFHBYTZxvcs3AM3M7vWzfcvM82zpxg4QM5XAA5GD7Dz6cYHMkiTiwSxbIj3UfuUcATQBUWznEtiiQCGwPgQCoaaTTRA3jgBmG4nCWnD2zDoDUvygPqV4-CEk4WMG4u5UN43Srobdjk4eQyHfMR52eEAAF8gA",
+ "functions": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB7AL7sEzUewDkAAVLxCEACaE4AelZ8GggLSbR4wYoDcAHTh2AxvAgcE-OA9ZJ4AGRgp2AF52AAoGZlJkAA9ydgA3Yn5SAEoggD5OO0x-FFJmELMHfjpSOFYAOlzWAFFMPlLWACFsAElNEMVslEVk8jtO-0U+uHDIpBi7BMwk5Ns4KTn2dkdnDgYkBwBrPIAxd09vOAgg9jhSAHceQ0ERMQkIApgikrLK0hq6l6bW9sVtAy8JXWWzyAEYerFgHY6PxMF4GHUhIQDBA8OxWMwksNNEgIAjCNg0VCPKImGcyqjMh5sls0UQSKQ7FImUzZnYlnZCsUGm8PvUys02h0qkiDD1yoRNJpqnEGj5cQYzvlFA5MBtNkNQqlAhlibpdF1jsRMOwyHVPKRNOx-qQIHY3B4vL5-B1jabSOaDJpNQApADKaAAcuUXMxxCgkAhsGF1bt9k6juUbRBysDtppYhJMJhYgAmZJsvQG-zHVgAC1I7EwGg4ZtIFs09vjhz8KA61Zc7s9ls1abjjsOKeT5Q7rAACrHNIX9Yb0RWu-WvexxJpSFFyjwy7j2OckNn2MRzgTjgAjSsABmXCHYMLhSARpFFtuXx3pZCbA+dbc6NYXDeXcCrlEvaxsweyfomw6jhOIKaC0gFroWUiFhygFPNyrxVLU-LfEKihkKwT7ipK0qymU8ouKUeQdKq6qaiE2q6nY+oMIQzBkPBRgcLu+7IgYjAcKwMDovwzBwKaGLhkagHsE+7AwCeYCLqWwmELJyKkNw9CVgpSmeOUKxHGsbFkJocnBH2YHNs4SYaSmrHsaQnH8KwIRnJcT4hLm57ebEAAssSgueBZzPqkY3rC8KInZL6yMQZCxOWlZkE4MkOYQJQGMwsVwDAHARAAjvwSARJoBkjKB4EHDZw4EQAaokpBhCZlpPrEllVQmQ52SONYwem8FAUhswgJQZasHQmA0AAPNWZ4mggLCBDYIA2oCpCWaCzmsCt7CqhoEDLSAi3MHQxhzR6K1pP1eTTQahDzWkdjTTicSOB2h0reIXHGCg8j8AwVb+MYpBkTtIB2EgmhHWt2mbStnLIoQxisJoKNsVUxjfS5R1nGxtrg4jrDI6j6PMJjQkoCgdS46Q+MuAjcBPXA03YztcBQzDGnrZt22M6w2AMKQR0GFEhPUgdR0nWdqUYjAmCM-8JNo8T5PvEdADEsNAqBoKM7ozPTXiOjvZLX0jC5v3-QwKNruLSsoyrGPqytWvc3DuuK0jjsozkNMrdrG2gYzhtIHtH1SxocXGA4xClNozBXXdSCG7oxtM89uivYbr3h5LijyJcdCsMYADMig50gcR5xAh0qvLxgQGdABsFfPSeLlCeJnOKCKGmKDXdcnqw4nD3AxjhPQbHYDepBlxXADi7zqQYd0d6wXeG+vXfLtD+HvERg+BIoY-sGPE9hnQ08V36y9yUJ7DebmubGOeACsxhBWvnfwKn2eZ9nUaIBxqTUDHlUgM0GDXVAuwTqg47pQOmlA7gW5jgQDLDAc4RpZAXFkNZcSsdswpgQWkEAUggA",
+ "theme": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuAFwCcBXAUwBpwJ8QATJCAB0wENs8ACYAHTk4GcCACzIBbMlwDkdVkQDWUvgIC+IKsIJjMtdSE3aAcjAJlaAHiYA+ACqiJ5gPTXLVgJowSnAMat+rTAgYTmYybyQEbCFRaPEyTgQYIljOJiRveTIiADonaz4QFSA",
+ "plugins": "N4IgVgzgwg9gdgMwJYHMDycA2BPEAuBAQ0wgFMAacCfEJAWwAcYAnAFwAJh2AVUxgVwgARGHSRxB5dgDdSzCEnhTSAD1ak4AE3YBfdgmaj2AcgACpeIQibCcAPTqBEALSbR4wcYDcAHTh-6JjZOdkwYQk0pIgAxJFkASQBjeAhdfUM6E3NLa1sHPgZBV3cJCDtNJAhWOwZMfhRxMqJnZFlvP1V1LQAKMIiASl9-ODhSAHceAsERMVLuv3Z2N0T+Og1WADoUUlYAUUw+dYAhbHjNbuMbdVZ6UgYkRIBrOQBGY37yBc4vxYqIWsI2Dw3zgizB7AeKWBMTipCSKU+oLBOkRix0fkGIEoAAtWHRMDQsSBcfiAHIwdQ0AA8DAAfNxsZV2KpCIwDuwINiYGNUoJxCh2KxsaR2LV6uIOdgqnwqTVaX4QDogA"
+}
diff --git a/src/docs/assets/side-by-side.png b/src/docs/assets/side-by-side.png
new file mode 100644
index 000000000..561ac01b0
Binary files /dev/null and b/src/docs/assets/side-by-side.png differ
diff --git a/src/docs/assets/time-view.png b/src/docs/assets/time-view.png
new file mode 100644
index 000000000..bcd4716c0
Binary files /dev/null and b/src/docs/assets/time-view.png differ
diff --git a/src/docs/assets/toolbar.png b/src/docs/assets/toolbar.png
new file mode 100644
index 000000000..c1c3c7285
Binary files /dev/null and b/src/docs/assets/toolbar.png differ
diff --git a/src/docs/assets/year-view.png b/src/docs/assets/year-view.png
new file mode 100644
index 000000000..680cbc7df
Binary files /dev/null and b/src/docs/assets/year-view.png differ
diff --git a/src/docs/js/docs.js b/src/docs/js/docs.js
new file mode 100644
index 000000000..d268515ef
--- /dev/null
+++ b/src/docs/js/docs.js
@@ -0,0 +1,8 @@
+document.addEventListener('DOMContentLoaded', () => {
+ const subToc = document.getElementById('subToc');
+
+ if (subToc) {
+ document.getElementById('tocContents').innerHTML = subToc.innerHTML;
+ document.getElementById('tocContainer').classList.remove('d-none');
+ }
+});
diff --git a/src/docs/js/migration.js b/src/docs/js/migration.js
new file mode 100644
index 000000000..4cf4b97d5
--- /dev/null
+++ b/src/docs/js/migration.js
@@ -0,0 +1,265 @@
+document.addEventListener('DOMContentLoaded', () => {
+ if (!document.getElementById('migration')) {
+ return;
+ }
+
+ const alertBox = document.getElementById('alert');
+ const createAlert = (message, style) => {
+ const div = document.createElement('div');
+ div.className = `alert alert-${style} alert-dismissible fade show`;
+ div.innerHTML = `${message} `;
+ alertBox.appendChild(div);
+ };
+
+ class JsConvert {
+ constructor() {
+ this.input = document.getElementById('from');
+ this.output = document.getElementById('to');
+ this.convertButton = document.getElementById('convertButton');
+ this.datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+ this.convertedConfiguration = undefined;
+ this.convertButton.addEventListener('click', this.convert.bind(this));
+ this.input.addEventListener('change', this.convert.bind(this));
+
+ document.getElementById('tryIt').addEventListener('click', () => {
+ // run if it hasn't been for some reason
+ if (!this.convertedConfiguration) this.convert();
+ // if still no config, then there was an error.
+ if (!this.convertedConfiguration) return;
+
+ this.datetimepicker1.updateOptions(this.convertedConfiguration);
+ });
+ }
+
+ convert() {
+ this.convertedConfiguration = undefined;
+ alertBox.innerHTML = '';
+ this.output.value = '';
+ const value = this.input.value;
+
+ if (!value) {
+ this.output.value = 'No configuration was provided.';
+ return;
+ }
+
+ if (value.includes('moment')) {
+ createAlert(
+ 'I can\'t convert moment objects. See Exception 1.',
+ 'danger'
+ );
+ return;
+ }
+
+ if (value.match(/[()<>]/gi)) {
+ createAlert(
+ 'Can\'t parse functions or object initializations like new Date(). See Exception 2.',
+ 'danger'
+ );
+ return;
+ }
+
+ try {
+ let config = Function('"use strict";return (' + value + ')')();
+ const newOptions = {};
+
+ const prop = prop => obj => {
+ const value = obj[prop];
+ if (value) return value;
+ else {
+ obj[prop] = {};
+ return obj[prop];
+ }
+ };
+
+ const ensurePath = (paths, obj) => paths.split('.').reduce((value, key) => prop(key)(value), obj);
+
+ const differentAccepts = (key) => {
+ if (['viewMode', 'toolbarPlacement'].includes(key))
+ createAlert(`${key} takes a different set of values. Verify this option.`, 'warning');
+ };
+
+ Object.entries(config).forEach(([key, value]) => {
+ differentAccepts(key);
+ switch (key) {
+ case 'format':
+ createAlert('Format is no longer used to determine component display. See component usage and input formatting .', 'warning');
+ ensurePath('display', newOptions);
+ newOptions.display.components = {
+ calendar: true,
+ date: true,
+ month: true,
+ year: true,
+ decades: true,
+ clock: true,
+ hours: true,
+ minutes: true,
+ seconds: false,
+ useTwentyfourHour: false
+ };
+ break;
+ case 'icons':
+ case 'sideBySide':
+ case 'calendarWeeks':
+ case 'viewMode':
+ case 'toolbarPlacement':
+ case 'inline':
+ ensurePath('display', newOptions);
+ newOptions.display[key] = value;
+ break;
+ case 'dayViewHeaderFormat':
+ createAlert('Moment is no longer supported. This "dayViewHeaderFormat" now accepts Intl formats. See localization usage ', 'warning');
+ ensurePath('localization', newOptions);
+ newOptions.localization.dayViewHeaderFormat = { month: 'long', year: '2-digit' };
+ break;
+ case 'extraFormats':
+ case 'collapse':
+ case 'useStrict':
+ case 'widgetPositioning':
+ case 'widgetParent':
+ case 'keyBinds':
+ case 'ignoreReadonly':
+ case 'focusOnShow':
+ case 'timeZone':
+ createAlert(`${key} is no longer supported and was ignored.`, 'danger');
+ break;
+ case 'minDate':
+ case 'maxDate':
+ case 'enabledDates':
+ case 'disabledDates':
+ case 'enabledHours':
+ case 'disabledHours':
+ case 'daysOfWeekDisabled':
+ ensurePath('restrictions', newOptions);
+ newOptions.restrictions[key] = value;
+ break;
+ case 'disabledTimeIntervals':
+ ensurePath('restrictions', newOptions);
+ createAlert('The "disabledTimeIntervals" option now expects an array of { from: x, to: y} See usage ', 'warning');
+ newOptions.restrictions.restrictions = [{ from: new Date(), to: new Date() }];
+ break;
+ case 'useCurrent':
+ case 'stepping':
+ case 'defaultDate':
+ case 'keepOpen':
+ case 'keepInvalid':
+ case 'debug':
+ case 'allowInputToggle':
+ case 'viewDate':
+ newOptions[key] = value;
+ break;
+ case 'locale':
+ createAlert('Moment is no longer supported. This "locale" now accepts Intl languages. See localization usage ', 'warning');
+ ensurePath('localization', newOptions);
+ newOptions.localization.locale = value;
+ break;
+ case 'showTodayButton':
+ case 'showClear':
+ case 'showClose':
+ case 'buttons':
+ ensurePath('display.buttons', newOptions);
+ const handleButton = (k, v) => {
+ newOptions.display.buttons[k.replace('show', '').replace('Button', '').toLowerCase()] = v;
+ };
+ if (key === 'buttons') {
+ //v5
+ Object.entries(value).forEach(([k, v]) => handleButton(k, v));
+ } else {
+ //v4
+ handleButton(key, value);
+ }
+ break;
+ case 'tooltips':
+ ensurePath('localization', newOptions);
+ Object.entries(value).forEach(([k, v]) => {
+ if (k.startsWith('prev')) k = k.replace('prev', 'previous');
+ if (k === 'togglePeriod') k = 'toggleMeridiem';
+ newOptions.localization[k] = v;
+ });
+ break;
+ case 'allowMultidate':
+ newOptions.multipleDates = value;
+ break;
+ case 'multidateSeparator':
+ newOptions.multipleDatesSeparator = value;
+ break;
+ case 'parseInputDate':
+ createAlert(`"parseInputDate" is now hooks.inputParse and takes a function that must return a DateTime object.`, 'danger');
+ ensurePath('hooks.inputParse', newOptions);
+ newOptions.hooks.inputParse = undefined;
+ break;
+ }
+ });
+
+ let outputValue = '{\n';
+ let spacing = 0;
+
+ const readme = (obj) => {
+ Object.entries(obj).forEach(([key, value]) => {
+ if (!Array.isArray(value) && typeof value === 'object') {
+ spacing += 2;
+ outputValue += `${Array(spacing).fill(' ').join(' ')}${key}: {\n`;
+ spacing += 2;
+ readme(value);
+ spacing -= 2;
+ outputValue += `${Array(spacing).fill(' ').join(' ')}}\n`;
+ spacing -= 2;
+ return;
+ }
+ if (Array.isArray(value)) {
+ outputValue += `${Array(spacing).fill(' ').join(' ')}${key}: [${value}],\n`;
+ return;
+ }
+ outputValue += `${Array(spacing).fill(' ').join(' ')}${key}: ${typeof value === 'string' ? `'${value}'` : value},\n`;
+ });
+ };
+
+ readme(newOptions);
+ this.convertedConfiguration = newOptions;
+ this.output.value = `${outputValue}}`;
+ } catch (e) {
+ createAlert(`Something went wrong trying to perform a conversion. Please report your configuration settings. ${e}`, 'danger');
+ }
+ }
+ }
+
+ class HtmlConvert {
+ constructor() {
+ this.input = document.getElementById('fromHtml');
+ this.output = document.getElementById('toHtml');
+ this.convertButton = document.getElementById('convertButtonHtml');
+ /*this.datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+ this.convertedConfiguration = undefined;*/
+ this.convertButton.addEventListener('click', this.convert.bind(this));
+ this.input.addEventListener('change', this.convert.bind(this));
+
+ /*document.getElementById('tryIt').addEventListener('click', () => {
+ // run if it hasn't been for some reason
+ if (!this.convertedConfiguration) this.convert();
+ // if still no config, then there was an error.
+ if (!this.convertedConfiguration) return;
+
+ this.datetimepicker1.updateOptions(this.convertedConfiguration);
+ });*/
+ }
+
+ convert() {
+ this.convertedConfiguration = undefined;
+ alertBox.innerHTML = '';
+ this.output.value = '';
+ let value = this.input.value;
+
+ if (!value) {
+ this.output.value = 'No configuration was provided.';
+ return;
+ }
+
+ value = value.replace('data-target', 'data-td-target')
+ .replace('data-toggle', 'data-td-toggle');
+
+ this.output.value = value;
+ }
+ }
+
+ new JsConvert();
+ new HtmlConvert();
+});
\ No newline at end of file
diff --git a/src/docs/make.js b/src/docs/make.js
new file mode 100644
index 000000000..40f3b3642
--- /dev/null
+++ b/src/docs/make.js
@@ -0,0 +1,659 @@
+const fs = require('fs');
+const jsdom = require('jsdom');
+const { JSDOM } = jsdom;
+const path = require('path');
+const minifyHtml = require('html-minifier-terser').minify;
+const dropCss = require('dropcss');
+const { minify } = require('terser');
+const sass = require('sass');
+const chokidar = require('chokidar');
+const rootDirectory = path.join('.', 'src', 'docs', 'partials');
+const ParvusServer = require('@eonasdan/parvus-server').ParvusServer;
+
+
+class PageMeta {
+ file;
+ title;
+ body;
+ postDate;
+ updateDate;
+ excerpt;
+ tags = '';
+
+ constructor(
+ file = '',
+ title = '',
+ body = '',
+ postDate = '',
+ updateDate = '',
+ excerpt = '',
+ tags = ''
+ ) {
+ this.file = file;
+ this.title = title;
+ this.body = body;
+ this.postDate = postDate;
+ this.updateDate = updateDate;
+ this.excerpt = excerpt;
+ this.tags = tags;
+ }
+
+ parse(metaTag) {
+ if (!metaTag) return;
+ const title = metaTag.querySelector('#title')?.innerHTML;
+ if (title) this.title = title;
+
+ const postDate = metaTag.querySelector('#post-date')?.innerHTML;
+ if (postDate) this.postDate = postDate;
+
+ const updateDate = metaTag.querySelector('#update-date')?.innerHTML;
+ if (updateDate) this.updateDate = updateDate;
+
+ const excerpt = metaTag.querySelector('#excerpt')?.innerHTML;
+ if (excerpt) this.excerpt = excerpt;
+
+ const tags = metaTag.querySelector('#tags')?.innerHTML;
+ if (tags) this.tags = tags;
+ }
+}
+
+class FileInformation {
+ file;
+ isDirectory;
+ fullPath;
+ extension;
+ relativePath;
+
+ constructor(file, fullPath, isDirectory, extension) {
+ this.relativePath = fullPath
+ .replace(rootDirectory.replace(`.${path.sep}`, ''), '');
+ this.file = file;
+ this.fullPath = fullPath;
+ this.isDirectory = isDirectory;
+ this.extension = extension;
+ }
+}
+
+class Build {
+ shellTemplate = '';
+ pageTemplate = '';
+ postLoopTemplate = '';
+ //create meta info
+ pagesMeta = [];
+
+ // prepare site map
+ siteMap = '';
+
+ css = '';
+ cssWhitelist = new Set();
+
+ async startAsync(){
+ builder.updateAll();
+
+ if (process.argv.slice(2)[0] === '--watch') {
+ await builder.watcher();
+ }
+
+ }
+
+ updateAll() {
+ this.shellTemplate = this.loadTemplate('shell');
+ this.pageTemplate = this.pageDocument;
+ this.postLoopTemplate = this.loadTemplate(`post-loop`);
+ this.reset();
+ this.update404();
+ this.prepareCss();
+ this.updatePages();
+ this.updateHomepage();
+ this.minifyJs().then();
+ this.updateDist();
+ this.copyAssets();
+ }
+
+ reset() {
+ this.pagesMeta = [];
+ this.siteMap = '';
+ }
+
+ loadTemplate(template) {
+ return fs.readFileSync(path.join('.', 'src', 'docs', 'templates', `${template}.html`), 'utf8');
+ }
+
+ directoryWalk(directory, extension = '.html') {
+ let files = [];
+ fs.readdirSync(directory)
+ .map((x) => {
+ const fullPath = path.join(directory, x);
+
+ return new FileInformation(
+ x,
+ fullPath,
+ fs.statSync(fullPath).isDirectory(),
+ path.extname(x).toLowerCase()
+ );
+ })
+ .filter(
+ (x) => path.extname(x.file).toLowerCase() === extension || x.isDirectory
+ )
+ .forEach((x) => {
+ if (x.isDirectory) {
+ files = [...files, ...this.directoryWalk(x.fullPath)];
+ } else {
+ files.push(x);
+ }
+ });
+
+ return files;
+ }
+
+ getSearchBody(html) {
+ const bodyPrep = html.textContent
+ .toLowerCase()
+ .replace('.', ' ') //replace dots with spaces
+ //.replace(/((?<=\s)|(?=\s))[^(\w )]*|[^(\w )]*((?<=\s)|(?=\s))/gm, ' ') //remove special characters
+ .replace(/((?<=\s)|(?=\s))[^a-z ]*|[^a-z ]*((?<=\s)|(?=\s))/gm, ' ') //remove special characters
+ //.replace(/[^a-z ]*/gm, '') //remove special characters
+ .replace(/\s+/g, ' ')
+ .trim() //replace extra white space
+ .split(' '); // split at words;
+ return Array.from(new Set(bodyPrep)).join(' '); //remove duplicate words
+ }
+
+ removeDirectory(directory, removeSelf) {
+ if (removeSelf === undefined) removeSelf = true;
+ try {
+ const files = fs.readdirSync(directory) || [];
+ files.forEach((file) => {
+ const filePath = path.join(directory, file);
+ if (fs.statSync(filePath).isFile()) fs.unlinkSync(filePath);
+ else this.removeDirectory(filePath);
+ });
+ } catch (e) {
+ return;
+ }
+ if (removeSelf) fs.rmdirSync(directory);
+ }
+
+ copyDirectory(source, destination) {
+ fs.mkdirSync(destination, { recursive: true });
+
+ fs.readdirSync(source, { withFileTypes: true }).forEach((entry) => {
+ let sourcePath = path.join(source, entry.name);
+ let destinationPath = path.join(destination, entry.name);
+
+ entry.isDirectory()
+ ? this.copyDirectory(sourcePath, destinationPath)
+ : this.copyFileAndEnsurePathExists(sourcePath, destinationPath);
+ });
+ }
+
+ copyFileAndEnsurePathExists(filePath, content) {
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
+
+ fs.copyFileSync(filePath, content);
+ }
+
+ writeFileAndEnsurePathExists(filePath, content) {
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
+
+ fs.writeFileSync(filePath, content);
+ }
+
+ // since everyone has to have their own metadata *rolls eyes* the primary purpose here
+ // is to quickly find similar tags and set them all at once
+ setMetaContent(rootElement, selector, content) {
+ [...rootElement.getElementsByClassName(selector)].forEach((element) => {
+ if (content) {
+ element.setAttribute('content', content);
+ element.removeAttribute('class');
+ } else rootElement.getElementsByTagName('head')[0].removeChild(element);
+ });
+ }
+
+ createRootHtml(html) {
+ html = minifyHtml(html, {
+ collapseWhitespace: false,
+ removeComments: true
+ });
+
+ return `
+${html}
+`;
+ }
+
+ get shellDocument() {
+ return new JSDOM(this.shellTemplate).window.document;
+ }
+
+ //read css files
+ prepareCss() {
+ this.cssWhitelist = new Set();
+ this.cssWhitelist.add('mt-30');
+
+ this.css = sass
+ .renderSync({
+ file: path.join('.', 'src', 'docs', 'styles', 'styles.scss')
+ })
+ .css.toString();
+ }
+
+ //read post template
+ get pageDocument() {
+ const indexDocument = new JSDOM(this.loadTemplate('page-template')).window
+ .document;
+ const shell = this.shellDocument;
+ shell.getElementById('outerContainer').innerHTML =
+ indexDocument.documentElement.innerHTML;
+ return shell.documentElement.innerHTML;
+ }
+
+ updatePages() {
+ this.reset();
+ //remove old stuff
+ this.removeDirectory(`./${siteConfig.output}`, false);
+
+ /* const pages = fs
+ .readdirSync('./src/docs/partials')
+ .filter((file) => path.extname(file).toLowerCase() === '.html');
+*/
+ const pageMarch = (pages) => {
+ pages.forEach((fileInformation) => {
+ /*
+ const fullyQualifiedUrl = `${siteConfig.root}/${siteConfig.output}/${file}`;
+ const fullPath = `./src/docs/partials/${file}`;
+ */
+ const fullyQualifiedUrl = `${siteConfig.root}/${siteConfig.output}/${fileInformation.relativePath}`;
+ const fullPath = fileInformation.fullPath;
+ const newPageDocument = new JSDOM(this.pageTemplate).window.document;
+ const postDocument = new JSDOM(fs.readFileSync(fullPath, 'utf8')).window
+ .document;
+ const article = postDocument.getElementById('page-body');
+ if (!article) {
+ console.error(`failed to read body for ${fullPath}`);
+ return;
+ }
+
+ const fileModified = fs.statSync(fullPath).mtime;
+
+ let pageMeta = new PageMeta(
+ fileInformation.file,
+ fileInformation.file.replace(fileInformation.extension, ''),
+ this.getSearchBody(article),
+ fileModified,
+ fileModified
+ );
+
+ pageMeta.parse(postDocument.getElementById('page-meta'));
+
+ newPageDocument.getElementById('mainContent').innerHTML =
+ article.innerHTML;
+
+ const publishDate = new Date(pageMeta.postDate).toISOString();
+ newPageDocument.title = pageMeta.title + ' - Tempus Dominus';
+
+ this.setMetaContent(newPageDocument, 'metaTitle', pageMeta.title);
+ //this.setStructuredData(structuredData, 'headline', pageMeta.title);
+ this.setInnerHtml(
+ newPageDocument.getElementsByClassName('title')[0],
+ pageMeta.title
+ );
+ this.setMetaContent(
+ newPageDocument,
+ 'metaDescription',
+ pageMeta.excerpt
+ );
+ this.setMetaContent(newPageDocument, 'metaUrl', fullyQualifiedUrl);
+ this.setMetaContent(newPageDocument, 'metaPublishedTime', publishDate);
+
+ if (!pageMeta.updateDate) pageMeta.updateDate = pageMeta.postDate;
+ const updateDate = new Date(pageMeta.updateDate).toISOString();
+ this.setMetaContent(newPageDocument, 'metaModifiedTime', updateDate);
+ this.setMetaContent(newPageDocument, 'metaTag', pageMeta.tags);
+ this.pagesMeta.push(pageMeta);
+
+ const completeHtml = this.createRootHtml(
+ newPageDocument.documentElement.innerHTML
+ );
+ this.writeFileAndEnsurePathExists(
+ path.join('.', siteConfig.output, fileInformation.relativePath),
+ completeHtml
+ );
+
+ //update pure css
+ dropCss({
+ css: this.css,
+ html: completeHtml
+ }).sels.forEach((sel) => this.cssWhitelist.add(sel));
+
+ this.siteMap += `
+${fullyQualifiedUrl}
+${new Date(pageMeta.updateDate).toISOString()}
+0.80
+ `;
+ });
+ };
+
+ pageMarch(this.directoryWalk(rootDirectory));
+
+ this.pagesMeta = this.pagesMeta.sort((a, b) => {
+ return +new Date(a.postDate) > +new Date(b.postDate) ? -1 : 0;
+ });
+
+ this.writeFileAndEnsurePathExists(
+ path.join('.', 'docs', '6', 'js', 'search.json'),
+ JSON.stringify(this.pagesMeta, null, 2)
+ );
+
+ this.updateSiteMap();
+ this.updateHomepage();
+ this.cleanCss();
+ this.updateDist();
+ this.copyAssets();
+ }
+
+ updateHomepage() {
+ const indexDocument = new JSDOM(
+ fs.readFileSync(path.join('.', 'src', 'docs', 'templates', 'index.html'), 'utf8')
+ ).window.document;
+
+ const shell = this.shellDocument;
+ shell.getElementById('outerContainer').outerHTML =
+ indexDocument.documentElement.getElementsByTagName('main')[0].innerHTML;
+
+ const script = shell.createElement('script');
+ script.type = 'module';
+ script.innerHTML =
+ 'import \'https://cdn.jsdelivr.net/npm/@pwabuilder/pwaupdate/';';
+
+ shell.getElementsByTagName('head')[0].appendChild(script);
+
+ const el = shell.createElement('pwa-update');
+ shell.body.appendChild(el);
+
+ const completeHtml = this.createRootHtml(shell.documentElement.innerHTML);
+ this.writeFileAndEnsurePathExists(path.join('.', 'docs', 'index.html'), completeHtml);
+ dropCss({
+ css: this.css,
+ html: completeHtml
+ }).sels.forEach((sel) => this.cssWhitelist.add(sel));
+ }
+
+ update404() {
+ const indexDocument = new JSDOM(
+ fs.readFileSync(path.join('.', 'src', 'docs', 'templates', '404.html'), 'utf8')
+ ).window.document;
+ const shell = this.shellDocument;
+ shell.getElementById('outerContainer').innerHTML =
+ indexDocument.documentElement.innerHTML;
+
+ const completeHtml = this.createRootHtml(shell.documentElement.innerHTML);
+ this.writeFileAndEnsurePathExists(
+ path.join('.', 'docs', '404.html'),
+ this.createRootHtml(shell.documentElement.innerHTML)
+ );
+ dropCss({
+ css: this.css,
+ html: completeHtml
+ }).sels.forEach((sel) => this.cssWhitelist.add(sel));
+ }
+
+ updateSiteMap() {
+ this.siteMap = `
+
+${siteConfig.root}
+${new Date().toISOString()}
+1.00
+
+${this.siteMap}
+ `;
+ this.writeFileAndEnsurePathExists(path.join('.', 'docs', 'sitemap.xml'), this.siteMap);
+ }
+
+ updateCss() {
+ this.prepareCss();
+
+ const gatherCss = (fullPath) => {
+ const postDocument = new JSDOM(fs.readFileSync(fullPath, 'utf8')).window
+ .document;
+ dropCss({
+ css: this.css,
+ html: postDocument.documentElement.innerHTML
+ }).sels.forEach((sel) => this.cssWhitelist.add(sel));
+ };
+
+ this.directoryWalk(rootDirectory)
+ .map((x) => x.fullPath)
+ .forEach(gatherCss);
+
+ fs.readdirSync(path.join('.', 'src', 'docs', 'templates'))
+ .filter((file) => path.extname(file).toLowerCase() === '.html')
+ .map((file) => path.join('.', 'src', 'docs', 'templates', file))
+ .forEach(gatherCss);
+
+ this.cleanCss();
+ }
+
+ cleanCss() {
+ let cleaned = dropCss({
+ html: '',
+ css: this.css,
+ shouldDrop: (sel) => !this.cssWhitelist.has(sel)
+ });
+ this.writeFileAndEnsurePathExists(
+ path.join('.', 'docs', 'css', 'styles.min.css'),
+ //new cleanCSS().minify(cleaned.css).styles
+ this.css
+ );
+ }
+
+ async minifyJs() {
+ const loopDocument = new JSDOM(this.postLoopTemplate).window.document;
+ const getJs = () => {
+ let output = '';
+
+ const files = fs
+ .readdirSync('./src/docs/js')
+ .filter(
+ (file) =>
+ path.extname(file).toLowerCase() === '.js' &&
+ !file.includes('.min.')
+ );
+
+ files.forEach((file) => {
+ output += fs.readFileSync(`./src/docs/js/${file}`, 'utf8') + '\r\n';
+ });
+
+ output += '//Popper\r\n';
+ //bundle popper
+ output +=
+ fs.readFileSync(
+ `./node_modules/@popperjs/core/dist/umd/popper.js`,
+ 'utf8'
+ ) + '\r\n';
+
+ //bundle bootstrap
+ output +=
+ fs.readFileSync(
+ `./node_modules/bootstrap/dist/js/bootstrap.js`,
+ 'utf8'
+ ) + '\r\n';
+
+ return output;
+ };
+
+ const js = getJs().replace(
+ '[POSTLOOP]',
+ loopDocument.getElementsByTagName('body')[0].innerHTML
+ );
+
+ const uglified = await minify(js);
+
+ this.writeFileAndEnsurePathExists('./docs/js/bundle.js', js);
+ this.writeFileAndEnsurePathExists('./docs/js/bundle.min.js', uglified.code);
+ }
+
+ setInnerHtml(element, value) {
+ if (!element) return;
+ element.innerHTML = value;
+ }
+
+ updateDist() {
+ this.copyDirectory(path.join('.', 'dist', 'js'), path.join('.', siteConfig.output, 'js'));
+ this.copyDirectory(path.join('.', 'dist', 'css'), path.join('.', siteConfig.output, 'css'));
+ this.copyDirectory(path.join('.', 'dist', 'plugins'), path.join('.', siteConfig.output, 'js', 'plugins'));
+ this.copyDirectory(path.join('.', 'dist', 'locales'), path.join('.', siteConfig.output, 'js', 'locales'));
+ }
+
+ /**
+ * This is to copy files that don't belong to another process like images
+ * and unthemed paged
+ */
+ copyAssets() {
+ [
+ {
+ source: './src/docs/assets/no-styles.html',
+ destination: './docs/6/examples/no-styles.html'
+ },
+ {
+ source: './src/docs/assets/repl-data.json',
+ destination: './docs/6/repl-data.json'
+ },
+ {
+ source: './src/docs/assets/site.webmanifest',
+ destination: './docs/site.webmanifest'
+ },
+ {
+ source: './src/docs/assets/carbon.css',
+ destination: './docs/css/carbon.css'
+ }
+ ].forEach((file) => {
+ if (!fs.existsSync(file.source)) return;
+ fs.mkdirSync(path.dirname(file.destination), { recursive: true });
+ fs.copyFileSync(file.source, file.destination);
+ });
+
+ fs.mkdirSync('./docs/6/images', { recursive: true });
+ this.directoryWalk('./src/docs/assets', '.png').forEach(
+ (fileInformation) => {
+ fs.copyFileSync(
+ fileInformation.fullPath,
+ `./docs/6/images/${fileInformation.file}`
+ );
+ }
+ );
+ }
+
+ async watcher() {
+ const parvusServer = new ParvusServer({
+ port: 3001,
+ directory: `./docs`,
+ middlewares: []
+ });
+
+ const watcher = chokidar.watch(
+ [
+ path.join('src', 'docs', 'partials'),
+ path.join('src', 'docs', 'styles'),
+ path.join('src', 'docs', 'templates'),
+ path.join('src', 'docs', 'js'),
+ path.join('src', 'docs', 'assets'),
+ 'dist/'
+ ],
+ {
+ ignored: /(^|[\/\\])\../, // ignore dotfiles
+ //ignored: /(^|[\/\\])\..|make\.js|browser-sync-config\.js/g, // ignore dotfiles
+ ignoreInitial: true
+ }
+ );
+
+ let lastChange = '';
+ let lastChangeFile = '';
+
+ const handleChange = (event, file) => {
+ if (file.includes('.map.')) return;
+ log(`${event}: ${file}`);
+ try {
+ if (file.startsWith('dist')) {
+ builder.updateDist();
+ }
+ if (file.startsWith(path.join('src', 'docs', 'assets'))) {
+ builder.copyAssets();
+ }
+ if (file.startsWith(path.join('src', 'docs', 'partials'))) {
+ //reading the file stats seems to trigger this twice, so if the same file changed in less then a second, ignore
+ if (
+ lastChange === formatter.format(new Date()) &&
+ lastChangeFile === file
+ ) {
+ log(`Skipping duplicate trigger`);
+ return;
+ }
+ builder.updatePages();
+ }
+ if (file.startsWith(path.join('src', 'docs', 'styles'))) {
+ builder.updateCss();
+ }
+ if (file.startsWith(path.join('src', 'docs', 'templates'))) {
+ builder.updateAll();
+ }
+ if (file.startsWith(path.join('src', 'docs', 'js'))) {
+ builder.minifyJs().then();
+ }
+ log('Update successful');
+ cleanTimer(() => {
+ parvusServer.refreshBrowser();
+ });
+ lastChange = formatter.format(new Date());
+ lastChangeFile = file;
+ console.log('');
+ } catch (e) {
+ log('Something went wrong');
+ console.log(e);
+ console.log('');
+ }
+ };
+
+ const cleanTimer = (callback, delay = 1000) => {
+ let timer = setTimeout(() => {
+ callback();
+ clearTimeout(timer);
+ }, delay);
+ };
+
+ watcher
+ .on('all', handleChange)
+ .on('ready', () => {
+ console.log('[Make] Watching files...');
+ });
+
+ console.clear();
+ await parvusServer.startAsync();
+ }
+}
+
+const formatter = new Intl.DateTimeFormat(undefined, {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ second: 'numeric'
+});
+
+const log = (message) => {
+ console.log(`[Make: ${formatter.format(new Date())}] ${message}`);
+};
+
+/**
+ * Site configuration
+ * @type {object}
+ * @property {string} root - Base url for the site.
+ * @property {string} output - Where the built partials will go.
+ */
+const siteConfig = JSON.parse(
+ fs.readFileSync(`./src/docs/site-config.json`, 'utf8')
+);
+
+log('Building...');
+const builder = new Build();
+builder.startAsync().then();
diff --git a/src/docs/partials/change-log-archive.html b/src/docs/partials/change-log-archive.html
new file mode 100644
index 000000000..6bd1c17f5
--- /dev/null
+++ b/src/docs/partials/change-log-archive.html
@@ -0,0 +1,429 @@
+
+
+
Beta9
+
Bug Fixes
+
+ Fixed jQuery provider. #2547
+ Adds options for theme to fix #2522 . Big thanks to @matholum.
+ Fixed date view next/back button disabling when it shouldn't. #2595
+ Fixed component disabling issue #2502
+ Changed default useTwentyfourHour to undefined. Now using DateTime.parts() to check if the view date has a "dayPeriod" property #2510
+ Fixed 24-hour 24/0 formatting
+ #2563
+
+ Fixed none latin number selection in the minute picker
+ #2576
+
+ Fixed input value to view date object reference
+ #2568
+
+
+
New
+
+ Add fr locale via #2581
+ Updated and published NuGet package.
+
+
Breaking changes
+
+ Renamed /src/sass to /src/scss to more accurately reflect code.
+
+
Beta8
+
Bug Fixes
+
+ Fixed view mode. #2583
+ Fixed and simplified options merging #2578
+
+
Beta7
+
Bug Fixes
+
+ Fixed options mutable. #2487
+ Fixed element toggle when input is disabled #2495
+ Fixed jQuery no conflict #2506
+ Fixed options update #2549
+
+
New
+
+ Added a new example for setting and getting dates.
+
+
Beta6
+
Bug Fixes
+
+ viewMode is optional #2550
+
+
New
+
+ Introduced a simple overridable function parseInput #2552
+
+
6-beta5
+
Bug Fixes
+
+ Fixed clear() doesn't erase text of date. #2472
+ Fixed clear button event cycle. #2516
+ Fixed 2 digit formatting. #2513
+ Trigger native change event on input when available - fixes #2401 via #2533
+ Fixes use of SVG icons (issue #2527) via #2529
+
+
Version 6-beta4
+
New
+
+ Dark mode! The picker now has dark mode when the user's preference is dark.
+ Wrote a tiny service locator/di container in an effort to make plugins better
+ Added a momentjs plugin
+ Added DE, ES, IT, NL, RO locales thanks to @jcompagner via #2484 .
+
+ toggleMeridiem supports a comma separated list. #2399.
+
+
+ All event types now provide viewMode which provides
+ 'clock' | 'calendar' | 'months' | 'years' | 'decades' depending what view
+ the event occurred.
+ #2428.
+
+
+
Breaking changes
+
+ Plugins work a little differently now. Hopefully they are a bit cleaner to work with now
+ Hooks have been removed. Plugins are a better way to handle this. You can look at the momentjs plugin for a
+ guide.
+
+ Locale loading and authoring has changed a bit as well.
+ ViewUpdateEvent no longer provides change: Unit.
+
+
Bug fixes
+
+ Fixed event 'hide.td' not triggered when input is empty. #2424.
+
+ Fixed input change event trigger. #2401.
+
+ Fixed dataset deletion issue. #2483.
+
+ Fixed month manipulation issue #2474. 2486.
+
+ Fixed Wrong calendar rendering when startOfTheWeek #2473.
+
+ Fixed viewMode option not respected (#2466) thanks @jmolinap via #2494.
+
+
+
Version 6-beta3
+
New
+
+ Allow to change parent container for the widget via #2462 .
+
+ Moved docs to gh-pages and set up a GitHub action to move compiled docs to that branch.
+
+
Bug fixes
+
+ Issue with time picker only & fixing range example via #2463.
+
+ Fixed issue with reading the data- attributes. #2430
+
+ Fixed start of the week option having the incorrect heading. #2443
+
+
+
Version 6-alpha17
+
Bug fixes
+
+ Fixed issue with calendar weeks. #2441
+
+
+
Version 6-alpha16
+
New
+
+ Started building html migration tool
+
+
Bug fixes
+
+ Fixed issue with daysOfWeekDisabled. #2419
+
+ Fixed issue with reading the data- attributes. #2430
+
+ Fixed start of the week option having the incorrect heading. #2443
+
+
+
Version 6-alpha15
+
New
+
+ Added localization.startOfTheWeek. This allows setting the start of the week.
+ Added numberingSystem to DateTimeFormatOptions
+ Added meta property to options.
+
+
Bug fixes
+
+ Fixed issue with 24 hour display formatting. #2414
+
+ Fixed default input change formatting function to check for empty dates. #2411
+
+ Fixed an issue with the unsubscribe method typing. #2411
+
+ Fixed an issue where the picker would try to update the clock view even it wasn't enabled. #2438
+
+ Fixed an issue using a time component would not go back to the clock view. #2431
+
+ The picker will return to the view date and show the calendar or clock after being reopened. #2410
+
+ Fixed clock/calendar switching to wait until the other view is ready before switching. #2421
+
+ Fixed the options interface so all properties are optionsal. #2439
+
+ BREAKING localization.dayViewHeaderFormat no longer takes a
+ string but instead accepts a DateTimeFormatOptions. This will allow for more customization. #2420
+
+
+
+
+
Version 6-alpha14
+
New
+
+ Cleaned up css a bit. Got rid of the popper arrow and aligned the picker to the start of the element.
+ BREAKING display.inputFormat now takes a function, not an
+ Intl format. It has also been moved to hooks.inputFormat By default a function will be executed
+ that uses Intl to format the selected date(s) based on the selected components.
+
+ Added hooks.inputParse
+ Merged number localization Thanks @hkvstore #2408
+
+
+
Bug fixes
+
+ Merged a fix for parsing issue from comparing constructor names. Thanks @faatihi #2408
+ Fixed doc issue
+ Fixed input value for real this time. #2387
+ Fixed keepOpen
+ Fixed widget positioning with rtl #2400
+
+
+
+
+
Version 6-alpha1.0.13
+
New
+
+ Created a new method set(value: any, index?: number, from: string = 'date.set') that tries to
+ conver the value provided and then tries to set that value to the index (or 0 if not
+ using multidate).
+
+ Added esm output
+ Exposed Unit and DateTimeFormatOptions from the DateTime class.
+ Renamed togglePeriod to toggleMeridiem
+ Added toggleMeridiem class to AM/PM button
+ Cleaned up css a bit. Got rid of the popper arrow and aligned the picker to the start of the element.
+
+
Bug fixes
+
+ Fixed dealing with input values/changes.
+ Fixed issue when calling hide if the widget hasn't been built (or shown) yet.
+ Fixed meridiem issue. Thanks @hkvstore #2398
+ Merged PR 2396 to fix 24 hour hour selection. #2395
+ Fixed issue with time component grid. #2395
+
+
+
+
Version 6-alpha1.0.4
+
Bug fixes
+
+ Fixed issue with meridiem (AM/PM) button clicks.
+
+
+
+
Version 6-alpha1.0.3
+
Bug fixes
+
+ Fixed year display after selecting a decade. #2386
+
+ Fixed issue if the input field had a value. #2387
+
+ Fixed setting the defaultDate option with a Date object. #2391
+
+
+
+
Version 6-alpha1
+
General
+
+ picker returns a DateTime which is an extended javascript Date object.
+ picker no longer uses jQuery, momentjs, or bootstrap
+ events now have interfaces
+
+
Configuration
+
+ renamed tooltip to localization
+
+ renamed tooltip.prevMonth to localization.previousMonth
+ renamed tooltip.prevYear to localization.previousYear
+ renamed tooltip.prevDecade to localization.previousDecade
+ renamed tooltip.prevCentury to localization.previousCentury
+ moved dayViewHeaderFormat to localization.dayViewHeaderFormat
+ dayViewHeaderFormat now takes a javascript intl month option, e.g.
+ long (default)
+
+
+
+ moved locale to localization
+
+ removed useStrict
+ removed timeZone
+ removed format
+
+ added display.inputFormat that takes DateTimeFormatOptions;
+
+
+ removed collapse
+ removed extraFormats
+ removed widgetParent
+ removed widgetPositioning
+ changed viewMode from 'times' | 'days' to 'clock' |
+ 'calendar'
+ renamed allowMultidate and multidateSeparator to multipleDates and
+ multipleDatesSeparator
+
+ moved the following to restrictions
+
+ minDate
+ maxDate
+ disabledDates
+ enabledDates
+ daysOfWeekDisabled
+ disabledHours
+ enabledHours
+ readonly
+ disabledTimeIntervals
+
+
+ moved the following to display
+
+ sideBySide
+ calendarWeeks
+ viewMode
+ toolbarPlacement
+ buttons
+ widgetPositioning
+ icons
+ inline
+ keepOpen
+
+
+ disabledTimeIntervals is now an array of { from: DateTime, to: DateTime }
+
+ removed check for dateOptions on the element data set. jQuery hid allowing an object by looping
+ through the properties
+
+ removed keybindings - this might come back later
+ removed readonly<
+ removed ignoreReadonly<
+ removed focusOnShow<
+
+
Styles
+
Tip: All new css values are in Namespace.Css.*
+ in the consts.ts file
+
+ renamed bootstrap-datetimepicker-widget to tempus-dominus-widget
+ renamed tempusDominus-bootstrap-datetimepicker-widget-with-calendar-weeks to tempus-dominus-with-calendar-weeks
+ (
+ v5)
+
+ removed .input-group [data-toggle="datetimepicker"] setting the cursor type to
+ pointer.
+
+
+
+
+
Date
+
+ renamed datepicker to date-container
+ renamed datepicker-decades to date-container-decades
+ renamed datepicker-years to date-container-years
+ renamed datepicker-months to date-container-months
+ renamed datepicker-days to date-container-days
+ renamed prev to previous
+ renamed data-day to data-value to be consistent with other views
+
+
Time
+
+ renamed usetwentyfour to useTwentyfour
+ renamed timepicker to time-container
+ renamed timepicker-hour to time-container-hour
+ renamed timepicker-minute to time-container-minute
+ renamed timepicker-second to time-container-second
+
+
Saas
+
Saas file is now called tempus-dominus.scss. The "build" file has been deleted as it's
+ no longer required.
+
Events
+
+ changed isInvalid to isValid and flipped the boolean (v5)
+ changed event now emits undefined instead of false when the date is being cleared
+ changed plugin.name from datetimepicker to tempus-dominus
+ changed root data namespace from datetimepicker to td
+
+
+
+
+
+ Version 5
+
+
+ Version 5 was a rewrite of v4 taking some pending pull requests and fixes along with it. Unfortunately, I didn't
+ do a very good job at documenting those changes.
+
+
+
+
+
+ Version 4
+
+
+ The chang log from v2-v4 can be read here .
+
+
+
+
+
+
Change Log Archive
+
07/20/2021
+
07/20/2021
+
An archive of changes between different version of tempus dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/change-log.html b/src/docs/partials/change-log.html
new file mode 100644
index 000000000..2213541aa
--- /dev/null
+++ b/src/docs/partials/change-log.html
@@ -0,0 +1,252 @@
+
+
+
Version 6
+
+
+
6.9.4
+
New
+
+ SCSS now provides root css variables #2857
+ Custom date format parsing errors are now caught and provided through the event system. #2793
+
+
Bug fixes
+
+ Fixed #2886
+ Fixed #2884
+ Fixed #2881
+ Fixed #2879
+ Fixed #2877
+
+
+
+
+
6.7.19
+
New
+
+ Added maxWeekdayLength. This option will truncate the day of the week header.
+
+
Bug fixes
+
+ Fixed #2871
+ Fixed #2860
+ Fixed #2817
+
+
+
+
+
6.7.16
+
Bug fixes
+
+ Reverted #2811
+ Fixed #2850
+ Fixed #2855
+
+
+
+
+
6.7.13
+
Bug fixes
+
+ Selecting any date element now updates the selected date. #2811
+ Hotfix for #2846
+
+
+
+
+
+
+
6.7.10
+
New
+
+ Lots more test coverage #2791
+
+
Bug fixes
+
+ Hopefully fixed update options bounce. #2621
+ Fixed input toggle #2575
+ Fixed docs #2810
+
+
+
+
+
6.7.7
+
New
+
+ Lots more test coverage #2791
+ Placement option #2789
+ Exported default en-US locale #2687
+ When userCurrent is false the clock will now display -- instead. #2764
+
+
Bug fixes
+
+ Fixed some issues with the date range #2788, #2798
+ Fixed calendarWeeks bug #2786
+ Fixed REPL issues #2795 #2784
+ Fixed multiple dates option not showing "active" state #2796
+
+
+
+
+
6.4.4
+
Bug fixes
+
+ Fixed an issue with the date formatting
+ Fixed format escape brackets
+ Fixes setting a date to null #2774
+
+
+
+
+
6.4.1
+
New
+
+ Migrated custom date format to main code #2734
+ Added Date Range functionality #2707
+
+
Bug fixes
+
+ Leading delimiter added when multipleDates #2766
+
+
+
+
+
6.2.10
+
Bug fixes
+
+ Can't change time & meridiem #2746
+ Fixed regression with #2600
+
+
+
+
+
6.2.9
+
Bug fixes
+
+ Fixed CustomDateFormat Plugin: Hours always undefined #2742
+
+
+
+
+
6.2.8
+
Bug fixes
+
+ Fixed error when using clear button on time component #2720
+ Fixed issue with promptTimeOnDateChange option #2630
+ Fixed useTwentyfourHour hour-range is 01 - 24, should be 00 - 23 #2600
+ Moved back @popperjs/core to peerDependencies and made it optional #2672
+
+
New
+
+ Pre commit hooks. Linter and prettier are now run before each commit. #2715
+ Locales and plugins now have typings included. #2719
+
+
+
+
+
6.2.7
+
Bug fixes
+
+ Fixed customDateFormat shows 'undefined' when you manually erase the date #2693
+ Fixed calendar header not updating correctly #2685
+ Fixed clock components disappearing when using side by side #2684
+ Fixed some doc issues #2706
+
+
New
+
+
+
+
+
6.2.6
+
Bug fixes
+
+ Fixed disabled/enabled dates performance issue. This also should fix the next/previous month selection
+ #2658
+
+ Fixed view date syncing across options and not updating correctly #2611
+
+
+
+
+
6.2.5
+
New
+
+ Added Polish localization #2673
+
+ Updated locales to include formats
+ Export (re-export?) Options interface
+
+
+
+
+
6.2.4
+
Bug fixes
+
+ Fix misspelling #2667
+ Fix issue with customFormatPlugin
+
+
+
+
+
+
+
6.2.1
+
New
+
+ Added custom date format plugin docs.
+
+ It is now possible to replace popperjs with another positioning system via #2643 .
+
+
+
Bug fixes
+
+ Imports should work again. #2652
+
+ Fixes for FR, FI, and IT locales. #2650
+
+
+
+
+
+
6.0.1
+
New
+
+ Added a customDateFormat plugin and new options to allow custom formats to be provided for input
+ parsing/setting
+
+ Replaced examples page with REPL
+ Lots of doc clean up
+
+
+
+
+
+
+
+
Change Log
+
07/20/2021
+
07/20/2021
+
An overview of changes between different version of tempus dominus
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/datetime.html b/src/docs/partials/datetime.html
new file mode 100644
index 000000000..a0d91bb40
--- /dev/null
+++ b/src/docs/partials/datetime.html
@@ -0,0 +1,18 @@
+
+
+ In v6 I dropped moment as a required library since it is no longer recommended. Almost all the functions in the
+ picker make use of my custom DateTime class which extends the native Date object.
+
+
+ Because I am simply extending the native date object, any returned values will still behave like a date object.
+ Which means you don't need to adopt using DateTime in your project unless you want to. Once less library to worry about!
+
+
+
+
+
DateTime
+
07/08/2021
+
07/08/2021
+
Custom date extension object
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/examples/index.html b/src/docs/partials/examples/index.html
new file mode 100644
index 000000000..c6896322a
--- /dev/null
+++ b/src/docs/partials/examples/index.html
@@ -0,0 +1,2612 @@
+
+
+
+
+ All the examples have been migrated to the REPL page!
+
+ Redirecting to
https://getdatepicker.com/6/repl.html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Examples
+
07/08/2021
+
07/20/2022
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/examples/jquery.html b/src/docs/partials/examples/jquery.html
new file mode 100644
index 000000000..dfc18f268
--- /dev/null
+++ b/src/docs/partials/examples/jquery.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+ This page outlines using the picker with jQuery. The jQuery-provider.js file must be included after
+ the
+ main picker code. jQuery is no longer a requirement and is here for backwards compatibility.
+
+
+ It's highly recommend to use the native methods as jQuery will be dropped completely in the future.
+
+
+ The events are slightly different with jQuery. Using the native methods events return as event.detail.[date|oldDate|etc].
+ With jQuery, you will access those values e.[date|oldDate|ect].
+
+
+
+
+
Simple Setup
+
+
+
+
+
+ This is the simplest setup you can have with Bootstrap and Font Awesome 5. The picker defaults to FA 5 Solid
+ icons, however you can overwrite the defaults globally.
+
+
+
+
+
+ HTML
+
+
+
+ Javascript
+
+
+
+ Events
+
+
+
+
+
+
+
+ <div
+ class='input-group'
+ id='datetimepicker1'
+ data-td-target-input='nearest'
+ data-td-target-toggle='nearest'
+ >
+ <input
+ id='datetimepicker1Input'
+ type='text'
+ class='form-control'
+ data-td-target='#datetimepicker1'
+ />
+ <span
+ class='input-group-text'
+ data-td-target='#datetimepicker1'
+ data-td-toggle='datetimepicker'
+ >
+ <span class='fas fa-calendar'></span>
+ </span>
+ </div>
+
+
+
+
+
+
+ $('#datetimepicker1').tempusDominus();
+
+
+
+
+
+ Events will display as you manipulate the picker.
+
+
+
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Examples using jQuery
+
07/08/2021
+
02/05/2022
+
How to use Tempus Dominus datetime picker with jquery
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/functions.html b/src/docs/partials/functions.html
new file mode 100644
index 000000000..e1d28e948
--- /dev/null
+++ b/src/docs/partials/functions.html
@@ -0,0 +1,16 @@
+
+
+
+
+ The functions have been split up and moved to a different page.
+
+ Redirecting to
https://getdatepicker.com/6/functions
+
+
+
+
Functions
+
07/08/2021
+
07/08/2021
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/functions/dates.html b/src/docs/partials/functions/dates.html
new file mode 100644
index 000000000..a56056fe5
--- /dev/null
+++ b/src/docs/partials/functions/dates.html
@@ -0,0 +1,218 @@
+
+
+ For the sake of the following documentation, assume there's a picker setup like this:
+
+const picker = new tempusdominus
+ .TempusDominus(document.getElementById('datetimepicker1'));
+
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
View Date
+
+
+
+ picker.viewDate returns the pickers current view date.
+
+
picker.viewDate = DateTime will set the view date, update the options and ask the view to refresh.
+
+
+
picker.dates
+
+ There are a number of function here that allow for retrieving the selected dates or adding to them.
+ These functions are used as picker.dates.add(...) for example.
+
+
+
+
picked
+
+
+
+ Returns an array of DateTime of the selected date(s).
+
+
+
+
+
lastPicked
+
+
+
+ Returns the last picked DateTime of the selected date(s).
+
+
+
+
+
lastPickedIndex
+
+
+
+ Returns the length of picked dates -1 or 0 if none are selected.
+
+
+
+
+
add(DateTime)
+
+
+
+ Adds a new DateTime to selected dates array. Use this function with caution. It will not
+ automatically
+ refresh
+ the
+ widget or do any validation.
+
+
+
+
+
setValue(value: DateTime, index?: number)
+
+
+
+ Sets the select date index (or the first, if not provided) to the provided DateTime object.
+
+
+
+
+
+
+
+ Formats a DateTime object to a string. Used when setting the input value. It is possible to
+ overwrite this
+ to provide more complex formatting with moment/dayjs or by hand.
+
+
+
+
+
+
+
+ Parse the value into a DateTime object. This can be overwritten to supply your own parsing.
+
+
+
+
+
+
+
+ Tries to convert the provided value to a DateTime object.
+ If value is null|undefined then clear the value of the provided index (or 0). It is possible to
+ overwrite
+ this
+ to provide more complex formatting with moment/dayjs or by hand.
+
+
+
+
+
+
isPicked(DateTime, Unit?)
+
+
+
+ Returns true if the target date is part of the selected dates array. If unit is provided then a
+ granularity
+ to that unit will be used.
+
+
+
+
+
pickedIndex(DateTime, Unit?)
+
+
+
+ Returns the index at which target date is in the array. This is used for updating or removing a
+ date when
+ multi-date is used. If unit is provided then a granularity to that unit will be used.
+
+
+
+
+
clear
+
+
+
+ Clears all selected dates.
+
+
+ Emits Namespace.events.change with the last picked date.
+
+
+
+
+
+
+
+
+
Date Functions
+
08/14/2022
+
08/14/2022
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/functions/display.html b/src/docs/partials/functions/display.html
new file mode 100644
index 000000000..101ffe55b
--- /dev/null
+++ b/src/docs/partials/functions/display.html
@@ -0,0 +1,119 @@
+
+
+ For the sake of the following documentation, assume there's a picker setup like this:
+
+const picker = new tempusdominus
+ .TempusDominus(document.getElementById('datetimepicker1'));
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
toggle
+
Shows or hides the widget
+
Emits
+
+
+ Namespace.events.hide - if the widget is hidden after the toggle call
+
+
+ Namespace.events.show - if the widget is show after the toggle call
+
+
+ Namespace.events.change - if the widget is opened for the first time and the
+ input element
+ is empty and options.useCurrent != false
+
+
+
+
+
+
show
+
+
Shows the widget
+
Emits
+
+
+ Namespace.events.show - if the widget was hidden before that call
+
+
+ Namespace.events.change - if the widget is opened for the first time and the
+ useCurrent is set to true or to a granularity value and the input element the
+ component is
+ attached to has an empty value
+
+
+
+
+
+
hide
+
+
Hides the widget
+
Emits
+
+ Namespace.events.hide - if the widget was visible before that call
+
+
+
+
+
paint(Unit | 'decade', DateTime, string[], HTMLElement)
+
+ Allows developers to add/remove classes from an element. During the grid generation code, this function is called.
+
+
+ It provides the unit that is being generated (i.e. displaying the main date view), the date time object
+ being effected, the current set of css classes and the container element.
+
+
Check out the example paint plugin .
+
+
+
+
+
+
+
Display Functions
+
08/14/2022
+
08/14/2022
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/functions/index.html b/src/docs/partials/functions/index.html
new file mode 100644
index 000000000..a3af581bb
--- /dev/null
+++ b/src/docs/partials/functions/index.html
@@ -0,0 +1,148 @@
+
+
+ For the sake of the following documentation, assume there's a picker setup like this:
+
+const picker = new tempusDominus
+ .TempusDominus(document.getElementById('datetimepicker1'));
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
updateOptions(object, boolean?)
+
+
+
+ In previous version there was a function to read/write to each of the provided options. This made it easy to
+ use
+ but made the code bulky and harder to maintain. updateOptions replaces those functions and
+ takes an
+ object of new options. This allows for multiple options to be set at the same time and works the same way as
+ when
+ setting up the picker.
+
+
+ If the optional reset flag is provided then new options will be merged with the default values.
+
+
+
+
+
dispose
+
+
Destroys the widget and removes all attached event listeners. If the picker is open it will be hidden and the
+ event fired.
+
+
+
disable
+
+
Disables the input element and the component is attached to, by adding a disabled="true"
+ attribute
+ to
+ it. If the widget was visible before that call it is hidden.
+
Emits
+
+ Namespace.events.hide - if the widget was visible before this call
+
+
+
+
enable
+
+
Enables the input element and the component is attached to, by removing disabled attribute from
+ it.
+
+
+
+
clear
+
+
Clears all selected dates. This is a short cut to picker.dates.clear()
+
+
+
subscribe(event | events[], callback | callbacks[])
+
+
+ Instead of adding event listeners to the pickers element, you can use the subscribe method. You can provide
+ a
+ single event to listen for or an array of events. When providing an array the number of callbacks must be
+ the
+ same as the number of events.
+
+
+ The subscribe method returns an unsubscribe method or an array of methods if multiple events are provided.
+ Calling
+ unsubscribe remove the callback from the event listeners. Unsubscribing will not prevent
+ addEventListener() from working.
+
+
+const subscription = picker.subscribe(tempusdominus.Namespace.events.change, (e) => {
+ console.log(e);
+});
+
+// event listener can be unsubscribed to:
+subscription.unsubscribe();
+
+//you can also provide multiple events:
+const subscriptions = picker.subscribe(
+ [tempusdominus.Namespace.events.show,tempusdominus.Namespace.events.hide],
+ [(e)=> console.log(e), (e) => console.log(e)]
+)
+
+
+
+
+
+
+
+
Functions
+
08/14/2022
+
08/14/2022
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/index.html b/src/docs/partials/index.html
new file mode 100644
index 000000000..ad2613b0f
--- /dev/null
+++ b/src/docs/partials/index.html
@@ -0,0 +1,26 @@
+
+
+
+ Tempus Dominus is the successor to the very popular "eonasdan/bootstrap-datetimepicker". The plugin provides a wide array of options that allow developers to provide date and or time selections to users as simple pickers, date of birth selection, appointments and more.
+
+
+ If you're looking for installation instructions check out the download page .
+
+
+ Once you get it installed there are plenty of examples and a stackblitz .
+
+
Get involved
+
+
+
+
+
Introduction
+
07/08/2021
+
07/08/2021
+
Introduction to Eonasdan's date time picker.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/installing.html b/src/docs/partials/installing.html
new file mode 100644
index 000000000..3915377cc
--- /dev/null
+++ b/src/docs/partials/installing.html
@@ -0,0 +1,68 @@
+
+
+
+ No matter how you choose to get the files, make sure that Popper is include before the picker's main script file.
+
+
+ You will also want a font library. The picker defaults to Font Awesome 6, but you can provide a different icon set
+ via the configuration or a plugin.
+
+
+
+
+
Via CDN
+
+<!-- Popperjs -->
+<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js" crossorigin="anonymous"></script>
+<!-- Tempus Dominus JavaScript -->
+<script src="https://cdn.jsdelivr.net/npm/@eonasdan/tempus-dominus@6.9.4/dist/js/tempus-dominus.min.js" crossorigin="anonymous"></script>
+
+<!-- Tempus Dominus Styles -->
+<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@eonasdan/tempus-dominus@6.9.4/dist/css/tempus-dominus.min.css" crossorigin="anonymous">
+
+
+
+
+
Via NPM
+
+npm install @popperjs/core @eonasdan/tempus-dominus
+
+
+
+
Compiled Code
+
+ You can grab the compiled js and css from GitHub
+
+
You still need to get Popper yourself.
+
+
+
+
Nuget Package
+
+Install-Package TempusDominus
+#or the SCSS version if you prefer
+Install-Package TempusDominus.scss
+
+
+
+
+
+
+
+
Download
+
07/08/2021
+
07/08/2021
+
How to install Tempus Dominus datetime picker.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/locale.html b/src/docs/partials/locale.html
new file mode 100644
index 000000000..9060ad660
--- /dev/null
+++ b/src/docs/partials/locale.html
@@ -0,0 +1,117 @@
+
+
+
+ The locale files offer a simple way to globally or individually set the localization options without the need to
+ hand code that everytime.
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
Creating Locales
+
+ There are a few examples in the source like this
+
+
+const name = 'ru';
+
+const localization = {
+ today: 'Перейти сегодня',
+ //...
+ locale: 'ru',
+ startOfTheWeek: 1
+};
+
+export { localization, name };
+
+
+
+
+
Using a locale
+
Load the locale file.
+
+<script src="/path/to/locale.js"></script>
+
+
+ You can then either set the global default or you can it individually.
+
+
+//load the RU locale
+tempusDominus.loadLocale(tempusDominus.locales.ru);
+
+//globally
+tempusDominus.locale(tempusDominus.locales.ru.name);//set the default options to use Russian from the plugin
+
+//picker
+const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+datetimepicker1.locale(tempusDominus.locales.ru.name);
+
+
+ If you want to load locales in TypeScript:
+
+
+import { TempusDominus, loadLocale, locale } from '@eonasdan/tempus-dominus';
+
+import { localization, name } from "@eonasdan/tempus-dominus/dist/locales/ru";
+
+//load the locale
+loadLocale({localization, name});
+
+//set globally
+locale(name);
+
+var datetimepicker1 = new TempusDominus(document.getElementById('datetimepicker1'));
+
+//or set per picker
+datetimepicker1.locale(name);
+
+
+
+
+
+
+
+
Locales
+
01/19/2022
+
02/05/2022
+
How to use plugins with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/migration.html b/src/docs/partials/migration.html
new file mode 100644
index 000000000..1d8c9e132
--- /dev/null
+++ b/src/docs/partials/migration.html
@@ -0,0 +1,125 @@
+
+
+
+ Version 6 defaults to FA 5 icons (but will switch to FA 6 when that's released), removes moment, jQuery and
+ Bootstrap as depedencies. It also uses Popper.js v2.
+
+
+ This tool attempts to convert your configurations from previous version of the picker to v6. Paste your current
+ configuration into the input box. Due to how this process works, it cannot convert usages of moment or date
+ objects. Set any property that uses unsupported values to undefined so that configuration can still
+ be converted.
+
+
+ For more information on what's changed, check out the change log .
+
+
+ If you find a bug or your configuration doesn't work, please open an issue.
+
+
+
+
+
+ JS
+
+ HTML
+
+
+
+
+
+
+
+ Input
+
+
+
+
+
+
+ Output
+
+
+
+
+
+
+
+
+ You can try your settings out here. If you're using an old version of FA or a differnt icon family, the icons
+ won't show.
+
+
+ Try it
+
+
+
+
+
Exception 1
+
+ Moment is no longer used or an accepted value for configurations. You can either change the config to use the
+ value of undefined or remove the configuration. There's just no way I could convert
+ every possible way to use moment into something that works for the new version.
+
+
Exception 2
+
+ The current process doesn't work well with functions or object initalizers. You will have to replace those
+ calls. If you have a suggestions on how to improve this, please let me know.
+
+
+
+
+
+
Migration
+
07/08/2021
+
07/08/2021
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/namespace/css.html b/src/docs/partials/namespace/css.html
new file mode 100644
index 000000000..241acfa18
--- /dev/null
+++ b/src/docs/partials/namespace/css.html
@@ -0,0 +1,404 @@
+
+
+ The picker uses the following css classes to style the picker.
+
+
+
+
+ The outer element for the widget.
+
+
+
+
+
+
+ The element for the calendar view header, next and previous actions.
+
+
+
+
+
switch
+
+ The element for the action to change the calendar view. E.g. month -> year.
+
+
+
+
+
+
+ The elements for all the toolbar options.
+
+
+
+
+
switch
+
+ Disables the hover and rounding affect.
+
+
+
+
+
sideBySide
+
+ Applied to the widget element when the side by side option is in use.
+
+
+
+
+
previous
+
+ The element for the action to change the calendar view, e.g. August -> July
+
+
+
+
+
next
+
+ The element for the action to change the calendar view, e.g. August -> September
+
+
+
+
+
disabled
+
+ Applied to any action that would violate any restriction options. ALso applied to an input field if the disabled
+ function is called.
+
+
+
+
+
old
+
+ Applied to any date that is less than requested view, e.g. the last day of the previous month.
+
+
+
+
+
new
+
+ Applied to any date that is greater than of requested view, e.g. the last day of the previous month.
+
+
+
+
+
active
+
+ Applied to any date that is currently selected.
+
+
+
+
+
dateContainer
+
+ The outer element for the calendar view.
+
+
+
+
+
decadesContainer
+
+ The outer element for the decades view.
+
+
+
+
+
decade
+
+ Applied to elements within the decades container, e.g. 2020, 2030
+
+
+
+
+
yearsContainer
+
+ The outer element for the years view.
+
+
+
+
+
year
+
+ Applied to elements within the years container, e.g. 2021, 2021
+
+
+
+
+
monthsContainer
+
+ The outer element for the month view.
+
+
+
+
+
month
+
+
+ Applied to elements within the month container, e.g. January, February
+
+
+
+
+
daysContainer
+
+ The outer element for the calendar view.
+
+
+
+
+
day
+
+ Applied to elements within the day container, e.g. 1, 2..31
+
+
+
+
+
calendarWeeks
+
+ If display.calendarWeeks is enabled, a column displaying the week of year is shown. This class is applied to each
+ cell in that column.
+
+
+
+
+
dayOfTheWeek
+
+ Applied to the first row of the calendar view, e.g. Sunday, Monday
+
+
+
+
+
today
+
+
+ Applied to the current date on the calendar view.
+
+
+
+
+
weekend
+
+
+ Applied to the locale's weekend dates on the calendar view, e.g. Sunday, Saturday
+
+
+
+
+
timeContainer
+
+ The outer element for all time related elements.
+
+
+
+
+
separator
+
+ Applied the separator columns between time elements, e.g. hour *:* minute *:* second
+
+
+
+
+
clockContainer
+
+ The outer element for the clock view.
+
+
+
+
+
hourContainer
+
+ The outer element for the hours selection view.
+
+
+
+
+
minuteContainer
+
+ The outer element for the minutes selection view.
+
+
+
+
+
secondContainer
+
+ The outer element for the seconds selection view.
+
+
+
+
+
hour
+
+ Applied to each element in the hours selection view.
+
+
+
+
+
minute
+
+ Applied to each element in the minutes selection view.
+
+
+
+
+
second
+
+ Applied to each element in the seconds selection view.
+
+
+
+
+
second
+
+ Applied AM/PM toggle button.
+
+
+
+
+
show
+
+ Applied the element of the current view mode, e.g. calendar or clock.
+
+
+
+
+
collapsing
+
+ Applied to the currently showing view mode during a transition between calendar and clock views
+
+
+
+
+
collapse
+
+ Applied to the currently hidden view mode.
+
+
+
+
+
inline
+
+ Applied to the widget when the option display.inline is enabled.
+
+
+
+
+
lightTheme
+
+ Applied to the widget when the option display.theme is light.
+
+
+
+
+
darkTheme
+
+ Applied to the widget when the option display.theme is dark.
+
+
+
+
+
isDarkPreferredQuery
+
+ Used for detecting if the system color preference is dark mode.
+
+
+
+
+
+
+
+
+
CSS Classes
+
07/08/2021
+
07/08/2021
+
A break down of the CSS classes in Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/namespace/errors.html b/src/docs/partials/namespace/errors.html
new file mode 100644
index 000000000..caf37db3f
--- /dev/null
+++ b/src/docs/partials/namespace/errors.html
@@ -0,0 +1,164 @@
+
+
+ The date picker will throw errors for a number of different reason. Most errors are related to an invalid setup.
+
+
+ Except where noted, the thrown errors are a type of TdError that extends the base javascript Error
+ class.
+
+
+ Where indicated the error provides a code value so that a developer can check for this value.
+
+
+
+
unexpectedOption (code: 1)
+
+ An error indicating that a key in the options object is invalid.
+
+
+
+
+
unexpectedOptions (code: 1)
+
+ An error indicating that one more keys in the options object is invalid.
+
+
+
+
+
unexpectedOptionValue (code: 2)
+
+ An error when an option is provide an unsupported value. For example a value of 'cheese' for toolbarPlacement
+ which only supports 'top', 'bottom', 'default'.
+
+
+
+
typeMismatch (code: 3)
+
+ An error when an option value is the wrong type.
+ For example a string value was provided to multipleDates which only
+ supports true or false.
+
+
+
+
numbersOutOfRage (code: 4)
+
+ An error when an option value is outside of the expected range.
+ For example restrictions.daysOfWeekDisabled excepts a value between 0 and 6.
+
+
+
+
+
failedToParseDate (code: 5)
+
+ An error when a value for a date options couldn't be parsed. Either
+ the option was an invalid string or an invalid Date object.
+
+
+
+
+
mustProvideElement (code: 6)
+
+ An error when an element to attach to was not provided in the constructor.
+
+
+
+
+
subscribeMismatch (code: 7)
+
+ An error if providing an array for the events to subscribe method doesn't have
+ the same number of callbacks. E.g., subscribe([1,2], [1])
+
+
+
+
+
conflictingConfiguration (code: 8)
+
+ The configuration has conflicting rules e.g. minDate is after maxDate
+
+
+
+
+
dateString
+
+ Logs a warning if a date option value is provided as a string, instead of
+ a date/datetime object.
+
+
+
+
+
Error Messages
+
+
+
failedToSetInvalidDate
+
+ Used with an Error Event type if the user selects a date that fails
+ restriction
+ validation.
+
+
+
+
+ Used with an Error Event type when a user changes the value of the input field
+ directly, and does not provide a valid date.
+
+
+
+
+
+
+
+
+
+
+
Errors
+
07/08/2021
+
07/08/2021
+
Overview of the errors thrown and error messages from Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/namespace/events.html b/src/docs/partials/namespace/events.html
new file mode 100644
index 000000000..2311f823a
--- /dev/null
+++ b/src/docs/partials/namespace/events.html
@@ -0,0 +1,86 @@
+
+
+
+ These events may provide additional details. For native javascript you can
+ get this data via e.details.*. For jQuery the details are directly in the event, e.g.
+ e.date
+
+
+ Each of these events inherit from the BaseEvent interface.
+
+
+
+interface BaseEvent {
+ type: string; //e.g. change.td
+ viewMode?: keyof ViewMode //'clock' | 'calendar' | 'months' | 'years' | 'decades'
+}
+
+
+
change.td
+
+ Emit when the date selection is changed.
+
+
+
+interface ChangeEvent extends BaseEvent {
+ date: DateTime | undefined;
+ oldDate: DateTime;
+ isClear: boolean;
+ isValid: boolean;
+}
+
+
+
update.td
+
+ Emits when the view changes for example from month view to the year view.
+
+
+
+interface ViewUpdateEvent extends BaseEvent {
+ viewDate: DateTime;
+}
+
+
+
error.td
+
+ Emits when a selected date or value from the input field fails to meet the provided validation rules.
+
+
+
+interface FailEvent extends BaseEvent {
+ reason: string;
+ date: DateTime;
+ oldDate: DateTime;
+}
+
+
+
show.td
+
+ Emits when then picker widget is displayed.
+
+
hide.td
+
+ Emits when the picker widget is hidden.
+
+
+
+interface HideEvent extends BaseEvent {
+ date: DateTime;
+}
+
+
+
+
+
+
+
Events
+
07/08/2021
+
07/08/2021
+
Overview of the events fired from Tempus Dominus Datetime picker.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/namespace/index.html b/src/docs/partials/namespace/index.html
new file mode 100644
index 000000000..f7c5b8b51
--- /dev/null
+++ b/src/docs/partials/namespace/index.html
@@ -0,0 +1,33 @@
+
+
+
+ Tempus Dominus uses and exposes a Namespace class for consistency and easy reference.
+
+
+ These values are provide via tempusDominus.Namespace
+
+
+
+
+
+
+
Namespace
+
07/08/2021
+
07/20/2022
+
Overview of the Namespace for Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/namespace/unit.html b/src/docs/partials/namespace/unit.html
new file mode 100644
index 000000000..a406f9835
--- /dev/null
+++ b/src/docs/partials/namespace/unit.html
@@ -0,0 +1,24 @@
+
+
+ The picker uses the following enum to represent a breakdown of date/time.
+
+
+
+ seconds
+ minutes
+ hours
+ date
+ month
+ year
+
+
+
+
+
+
+
Unit Enum
+
02/05/2022
+
02/05/2022
+
A break down of the Unit enum in Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/options.html b/src/docs/partials/options.html
new file mode 100644
index 000000000..d7fc2a26c
--- /dev/null
+++ b/src/docs/partials/options.html
@@ -0,0 +1,15 @@
+
+
+
+
+ The options have been split up and moved to a different page.
+
+ Redirecting to
https://getdatepicker.com/6/options
+
+
+
+
+
Redirecting to Options
+
07/08/2021
+
08/13/2022
+
diff --git a/src/docs/partials/options/display.html b/src/docs/partials/options/display.html
new file mode 100644
index 000000000..0e0f69f8d
--- /dev/null
+++ b/src/docs/partials/options/display.html
@@ -0,0 +1,488 @@
+
+
+ The display options allow you to control much of the picker's look and feel. You can disable components, buttons
+ and change the default icons.
+
+
+new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'),
+ {
+ display: {
+ icons: {
+ type: 'icons',
+ time: 'fa-solid fa-clock',
+ date: 'fa-solid fa-calendar',
+ up: 'fa-solid fa-arrow-up',
+ down: 'fa-solid fa-arrow-down',
+ previous: 'fa-solid fa-chevron-left',
+ next: 'fa-solid fa-chevron-right',
+ today: 'fa-solid fa-calendar-check',
+ clear: 'fa-solid fa-trash',
+ close: 'fa-solid fa-xmark'
+ },
+ sideBySide: false,
+ calendarWeeks: false,
+ viewMode: 'calendar',
+ toolbarPlacement: 'bottom',
+ keepOpen: false,
+ buttons: {
+ today: false,
+ clear: false,
+ close: false
+ },
+ components: {
+ calendar: true,
+ date: true,
+ month: true,
+ year: true,
+ decades: true,
+ clock: true,
+ hours: true,
+ minutes: true,
+ seconds: false,
+ //deprecated use localization.hourCycle = 'h24' instead
+ useTwentyfourHour: undefined
+ },
+ inline: false,
+ theme: 'auto',
+ keyboardNavigation: true
+ }
+)
+
+
+
+
icons
+
+
+ Accepts: string
+
+
+ Any icon library that expects icons to be used like
+ <i class='fas fa-calendar'></i> will work, provided you include the
+ correct
+ styles and scripts needed.
+
+
Icon sprites are also supported.
+
+
+
type
+
+ Accepts either "icons" or "sprites"
+ Defaults to "icons". If "sprites" is used as the value, the icons will be render with an svg
+ element
+ instead
+ of an "i" element. If you don't know which you should use, leave it as "icons".
+
+
+
time
+
+ Defaults: (fas
+ fa-clock)
+ This icon is used to change the view from the calendar view to the clock view.
+
+
+
date
+
+ Defaults: (fas
+ fa-calendar)
+ This icon is used to change the view from the clock view to the calendar view.
+
+
+
up
+
+ Defaults: (fas
+ fa-arrow-up)
+ This icon is used to increment hours, minutes and seconds in the clock view.
+
+
+
down
+
+ Defaults: (fas
+ fa-arrow-down)
+ This icon is used to decrement hours, minutes and seconds in the clock view.
+
+
+
next
+
+ Defaults: (fas
+ fa-chevron-right)
+ This icon is used to navigation forward in the calendar, month, year, and decade views.
+
+
+
previous
+
+ Defaults: (fas
+ fa-chevron-left)
+ This icon is used to navigation backwards in the calendar, month, year, and decade views.
+
+
+
today
+
+
+ Defaults:
+ (fas fa-calendar-check)
+ This icon is used to change the date and view to now.
+
+
+
clear
+
+
+ Defaults: (fas
+ fa-trash)
+ This icon is used to clear the currently selected date.
+
+
+
close
+
+
+ Defaults: (fas
+ fa-times)
+ This icon is used to close the picker.
+
+
+
+
+
+
+
sideBySide
+
+ Accepts: true|false Defaults: false
+
+ Displays the date and time pickers side by side.
+
+
+
+
+
calendarWeeks
+
+ Accepts: true|false Defaults: false
+
+ Displays an additional column with the calendar week for that week.
+
+
+
+
+
viewMode
+
+ Accepts: 'clock' | 'calendar' | 'months' | 'years' | 'decades'
+ Defaults: calendar
+ The default view when the picker is displayed. Set to "years" for a date of birth picker.
+
+
+
+
+
+
+
+ Accepts: 'top' | 'bottom' Defaults: bottom
+ Changes the placement of the toolbar where the today, clear, component switch icon are located.
+
+
+ Throws unexpectedOptionValue if value
+ is not one of the accepted values.
+
+
+
+
+
keepOpen
+
+ Accepts: true|false Defaults: false
+ Keep the picker window open even after a date selection. The picker can still be closed by the
+ target or
+ clicking on an outside element. This option will only work when time components are disabled.
+
+
+
+
+
+
Accepts: true|false
+
+
+
+
+
+
+
+ Defaults: false
+ Displayed above in red
+
+
+
+
+ Defaults: false
+ Displayed above in purple
+
+
+
+
+ Defaults: false
+ Displayed above in green
+
+
+
+
+
+
+
+
components
+
Accepts: true|false
+
+
+ These options turns on or off the particular views. If option is false for date the
+ user would only be able to select month and year for instance.
+
+
+
+
+
calendar
+
+ Defaults: true
+ A convenience flag that can enable or disable all the calendar components like date,
+ month, year, decades, century. This flag must be true for any of the calendar components to be visible,
+ even if those
+ options are true.
+
+
+
date
+
+ Defaults: true
+
+
+
+
month
+
+
+ Defaults: true
+
+ Turns on or off the month selection view.
+
+
+
year
+
+ Defaults: true
+
+
+
+
decades
+
+
+ Defaults: true
+
+
+
+
clock
+
+
+
+
+
+ Defaults: true
+ A convenience flag that can enable or disable all the calendar components like date,
+ month, year,
+ decades, century.
+ This flag must be true for any of the calendar components to be visible, even if those
+ options are true.
+
+
+
hours
+
+
+ Defaults: true
+ Displayed above in red
+
+
+
minutes
+
+
+ Defaults: true
+ Displayed above in purple
+
+
+
seconds
+
+
+ Defaults: false
+ Displayed above in green
+
+
+
useTwentyfourHour
+
+
Defaults: false
+
+
+
Deprecated
+
+ This option has been deprecated and will be removed in a future version.
+ Use localization.hourCycle instead.
+
+
+
+
+
+
+
+
+
+
+
inline
+
+
+ Accepts: Defaults:boolean
+ Displays the picker in a inline div instead of a popup.
+
+
+
+
+
theme
+
+ Accepts: 'light' | 'dark' | 'auto' Defaults: 'auto'
+ Specifies which theme to use, light mode or dark mode. When set to auto, it will auto detect based on settings
+ of the user's system.
+
+
+
+
+
placement
+
+ Accepts: 'top' | 'bottom' Defaults: 'bottom'
+ Specifies whether the picker should be displayed at the top or bottom of the element passed to the picker instance.
+
+
+
+
+
keyboardNavigation
+
+ Accepts: boolean Defaults: true
+ Specifies whether the picker should allow keyboard navigation. For more information, see the section on keyboard navigation .
+
+
+
+
+
+
+
+
+
Display Options
+
08/11/2022
+
02/26/2025
+
How to use the display options.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/options/index.html b/src/docs/partials/options/index.html
new file mode 100644
index 000000000..a6a5715bc
--- /dev/null
+++ b/src/docs/partials/options/index.html
@@ -0,0 +1,315 @@
+
+
+ Options can be provided during the initial setup through the constructor new
+ tempusDominus.TempusDominus(..., options);. Take a look at the examples for more information.
+
+
+ The current options can be retrieved e.g. datetimepicker1.optionsStore.options.
+
+
+ Options can be updated through the updateOptions
+ function .
+
+
+ All options will throw typeMismatch if the
+ provided type does not match the expected type, e.g. a string instead of a boolean.
+
+
+ While most of the date options accept string values it wil throw a warning. JavaScript's Date objects will be
+ converted to the pickers
DateTime object .
+
+
+
+new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'),
+{
+ allowInputToggle: false,
+ container: undefined,
+ dateRange: false,
+ debug: false,
+ defaultDate: undefined,
+ display: {
+ icons: {
+ type: 'icons',
+ time: 'fa-solid fa-clock',
+ date: 'fa-solid fa-calendar',
+ up: 'fa-solid fa-arrow-up',
+ down: 'fa-solid fa-arrow-down',
+ previous: 'fa-solid fa-chevron-left',
+ next: 'fa-solid fa-chevron-right',
+ today: 'fa-solid fa-calendar-check',
+ clear: 'fa-solid fa-trash',
+ close: 'fa-solid fa-xmark'
+ },
+ sideBySide: false,
+ calendarWeeks: false,
+ viewMode: 'calendar',
+ toolbarPlacement: 'bottom',
+ keepOpen: false,
+ buttons: {
+ today: false,
+ clear: false,
+ close: false
+ },
+ components: {
+ calendar: true,
+ date: true,
+ month: true,
+ year: true,
+ decades: true,
+ clock: true,
+ hours: true,
+ minutes: true,
+ seconds: false,
+ useTwentyfourHour: undefined
+ },
+ inline: false,
+ theme: 'auto',
+ keyboardNavigation: true
+ },
+ keepInvalid: false,
+ localization: {
+ clear: 'Clear selection',
+ close: 'Close the picker',
+ dateFormats: DefaultFormatLocalization.dateFormats,
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ decrementHour: 'Decrement Hour',
+ decrementMinute: 'Decrement Minute',
+ decrementSecond: 'Decrement Second',
+ format: DefaultFormatLocalization.format,
+ hourCycle: DefaultFormatLocalization.hourCycle,
+ incrementHour: 'Increment Hour',
+ incrementMinute: 'Increment Minute',
+ incrementSecond: 'Increment Second',
+ locale: DefaultFormatLocalization.locale,
+ nextCentury: 'Next Century',
+ nextDecade: 'Next Decade',
+ nextMonth: 'Next Month',
+ nextYear: 'Next Year',
+ ordinal: DefaultFormatLocalization.ordinal,
+ pickHour: 'Pick Hour',
+ pickMinute: 'Pick Minute',
+ pickSecond: 'Pick Second',
+ previousCentury: 'Previous Century',
+ previousDecade: 'Previous Decade',
+ previousMonth: 'Previous Month',
+ previousYear: 'Previous Year',
+ selectDate: 'Select Date',
+ selectDecade: 'Select Decade',
+ selectMonth: 'Select Month',
+ selectTime: 'Select Time',
+ selectYear: 'Select Year',
+ startOfTheWeek: 0,
+ today: 'Go to today',
+ toggleMeridiem: 'Toggle Meridiem',
+ toggleAriaLabel?: string;
+ },
+ meta: {},
+ multipleDates: false,
+ multipleDatesSeparator: '; ',
+ promptTimeOnDateChange: false,
+ promptTimeOnDateChangeTransitionDelay: 200,
+ restrictions: {
+ minDate: undefined,
+ maxDate: undefined,
+ disabledDates: [],
+ enabledDates: [],
+ daysOfWeekDisabled: [],
+ disabledTimeIntervals: [],
+ disabledHours: [],
+ enabledHours: []
+ },
+ stepping: 1,
+ useCurrent: true,
+ viewDate: new DateTime()
+})
+
+
+
+
dateRange (as of 6.4.1)
+
+
+ Accepts boolean Defaults: false
+
+ Date Range work similar to multi date. You should also set multiDateSeparator with what you want the two values to be separated with. This option allows the user to select two dates and highlights all the dates in range between. Validation still takes place. The range will be consider invalid if any of the dates in the range are disabled.
+
+
+
+
+
stepping
+
+
+ Accepts number Defaults: 1
+ Controls how much the minutes are changed by. This also changes the minute selection grid to step by this
+ amount.
+
+
+
+
+
useCurrent
+
+ Accepts true|false Defaults: true
+ Determines if the current date/time should be used as the default value when the picker is opened.
+
+
+
+
+
defaultDate
+
+ Accepts: string | Date | DateTime Defaults: undefined
+ Sets the picker default date/time. Overrides useCurrent
+
+
+
+
+
keepInvalid
+
+ Accepts true|false Defaults: false
+ Allows for the user to select a date that is invalid according to the rules. For instance, if a user enters a date
+ pasted the maxDate.
+
+
+
+
+
debug
+
+ Accepts true|false Defaults: false
+ Similar to display.keepOpen, if true the picker won't close during any event where that would
+ normally
+ occur. This is useful when trying to debug rules or css changes. Note you can also use window.debug =
+ true in the dev tools console. Using the window object is useful for debugging deployed code without
+ requiring a configuration change.
+
+
+
+
+
+
+
+
+ Accepts true|false Defaults: false
+ If true, the picker will show on textbox focus.
+
+
+
+
+
viewDate
+
+
+ Accepts: string | Date | DateTime Defaults: now
+ Set the view date of the picker. Setting this will not change the selected date(s).
+
+
+
+
+
multipleDates
+
+ Accepts true|false Defaults: false
+ Allows multiple dates to be selected.
+
+
+
+
+
multipleDatesSeparator
+
+
+ Accepts: string Defaults: ;
+ When multipleDates is enabled, this value wil be used to separate the selected dates. E.g. 08/29/2021,
+ 12:00 AM; 08/30/2021, 12:00 AM; 08/23/2021, 12:00 AM
+
+
+
+
+
promptTimeOnDateChange
+
+
+ Accepts true|false Defaults: false
+ If enabled and any of the time components are enabled, when a user selects a date the picker will automatically
+ display the clock view after promptTimeOnDateChangeTransitionDelay.
+
+
+
+
+
promptTimeOnDateChangeTransitionDelay
+
+
+
+
+
+ Accepts number Defaults: 200
+ Used with promptTimeOnDateChange. The number of milliseconds before the picker will display the
+ clock
+ view.
+
+
+
+
+
+
+ Accepts object Defaults: {}
+ This property is to provide developers a place to store extra information about the picker. You can use this to
+ store database format strings for instance. There are no rules on what you add to this object and the picker
+ will not reference it.
+
+
+
+
+
container
+
+
+
+
+
+ Accepts HTMLElement Defaults: undefined
+ Change the target container to use for the widget instead of body (In case of application using
+ shadow DOM for example).
+
+
+
+
+
+
+
+
+
Options
+
07/08/2021
+
07/08/2021
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/options/keyboard-navigation.html b/src/docs/partials/options/keyboard-navigation.html
new file mode 100644
index 000000000..823c7371c
--- /dev/null
+++ b/src/docs/partials/options/keyboard-navigation.html
@@ -0,0 +1,298 @@
+
+
+ Thanks to
+ Dimagi for sponsoring this feature.
+
+ Keyboard navigation is supported for the date picker dialog. It can be toggled with display.keyboardNavigation. The default is true.
+
+ I tried to adhere to the
+ aria standards as much as possible for date time pickers.
+
+
+
+
+
+ Toggle Date Picker Dialog Button
+
+
+
+
+ Key
+ Function
+
+
+
+
+ Space ,Enter
+
+
+ Open the date picker dialog.
+
+ Move focus to selected date, i.e., the date displayed in
+ the date input text field. If no date has been selected,
+ places focus on the current date.
+
+
+
+
+
+
+
+
+
+
+ Date Picker Dialog
+
+
+
+
+ Key
+ Function
+
+
+
+
+ ESC
+
+ Closes the dialog and returns focus to the "Choose Date"
+ button.
+
+
+
+ Tab
+
+
+
+ Moves focus to next element in the dialog
+ Tab sequence.
+
+
+ Note that, as specified in the Grid Pattern, only one
+ button in the calendar grid is in the
+ Tab sequence.
+
+
+ If focus is on the last button, moves focus to the first
+ button.
+
+
+
+
+
+ Shift + Tab
+
+
+
+ Moves focus to previous element in the dialog
+ Tab sequence.
+
+
+ Note that, as specified in the Grid Pattern, only one
+ button in the calendar grid is in the
+ Tab sequence.
+
+
+ If focus is on the first button, moves focus to the last
+ button.
+
+
+
+
+
+
+
+
+
+
+ Date Picker Dialog: Month/Year Buttons
+
+
+
+
+ Key
+ Function
+
+
+
+
+ Arrow keys
+
+ On the month, year, decade view, using the arrow keys should
+ navigate around the grid.
+
+
+
+
+
+
+
+
+ Date Picker Dialog: Date Grid
+
+
+
+
+ Key
+ Function
+
+
+
+
+ Space ,Enter
+
+
+
+ Select the date, close the dialog, and move focus to the
+ "Choose Date" button.
+
+
+ Update the value of the "Date" input with the selected
+ date.
+
+
+ Update the accessible name of the "Choose Date" button to
+ include the selected date.
+
+
+
+
+
+ Up Arrow
+ Moves focus to the same day of the previous week.
+
+
+ Down Arrow
+ Moves focus to the same day of the next week.
+
+
+ Right Arrow
+ Moves focus to the next day.
+
+
+ Left Arrow
+ Moves focus to the previous day.
+
+
+ Home
+
+ Moves focus to the first day (e.g Sunday) of the current week.
+
+
+
+ End
+
+ Moves focus to the last day (e.g. Saturday) of the current
+ week.
+
+
+
+ Page Up
+
+
+ Changes the grid of dates to the previous month.
+
+ Moves focus to the day of the month that has the same
+ number. If that day does not exist, moves focus to the
+ last day of the month.
+
+
+
+
+
+ Shift + Page Up
+
+
+
+ Changes the grid of dates to the same month in the
+ previous year.
+
+
+ Moves focus to the day of the month that has the same
+ number. If that day does not exist, moves focus to the
+ last day of the month.
+
+
+
+
+
+ Page Down
+
+
+ Changes the grid of dates to the next month.
+
+ Moves focus to the day of the month that has the same
+ number. If that day does not exist, moves focus to the
+ last day of the month.
+
+
+
+
+
+ Shift + Page Down
+
+
+
+ Changes the grid of dates to the same month in the next
+ year.
+
+
+ Moves focus to the day of the month that has the same
+ number. If that day does not exist, moves focus to the
+ last day of the month.
+
+
+
+
+
+
+
+
+
+
+ Clock view
+
+
+
+
+ View
+ Function
+
+
+
+
+ Clock
+
+ Tab moves the focused element. Space/Enter will make a selection
+ such as incrementing hours or minutes.
+
+
+
+ Hour/Minute/Seconds
+
+ Arrow keys will move around the grid. Space/Enter will make a
+ selection.
+
+
+
+
+
+
+
+
+
+
+
Keyboard Navigation
+
02/26/2025
+
02/26/2025
+
Keyboard navigation is supported for the date picker dialog. It can be toggled with display.keyboardNavigation. The default is true.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/options/localization.html b/src/docs/partials/options/localization.html
new file mode 100644
index 000000000..8b962dbf7
--- /dev/null
+++ b/src/docs/partials/options/localization.html
@@ -0,0 +1,562 @@
+
+
+
+
+ Most of the localization options are for title tooltips over icons.
+
+
+ You can provide localization options to override the tooltips as well as the day/month display.
+
+
+ You could also set this globally via tempusDominus.DefaultOptions.localization = { ...
+ } or by
+ creating a variable e.g. const ru = { today:'Перейти сегодня' ... }; then provide
+ the options
+ as
+
+
+new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'), {
+ localization: ru
+ }
+
+
+
+
+
+
+
+new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'),
+ {
+ localization: {
+ today: 'Go to today',
+ clear: 'Clear selection',
+ close: 'Close the picker',
+ selectMonth: 'Select Month',
+ previousMonth: 'Previous Month',
+ nextMonth: 'Next Month',
+ selectYear: 'Select Year',
+ previousYear: 'Previous Year',
+ nextYear: 'Next Year',
+ selectDecade: 'Select Decade',
+ previousDecade: 'Previous Decade',
+ nextDecade: 'Next Decade',
+ previousCentury: 'Previous Century',
+ nextCentury: 'Next Century',
+ pickHour: 'Pick Hour',
+ incrementHour: 'Increment Hour',
+ decrementHour: 'Decrement Hour',
+ pickMinute: 'Pick Minute',
+ incrementMinute: 'Increment Minute',
+ decrementMinute: 'Decrement Minute',
+ pickSecond: 'Pick Second',
+ incrementSecond: 'Increment Second',
+ decrementSecond: 'Decrement Second',
+ toggleMeridiem: 'Toggle Meridiem',
+ selectTime: 'Select Time',
+ selectDate: 'Select Date',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'default',
+ startOfTheWeek: 0,
+ hourCycle: undefined,
+ dateFormats: {
+ LTS: 'h:mm:ss T',
+ LT: 'h:mm T',
+ L: 'MM/dd/yyyy',
+ LL: 'MMMM d, yyyy',
+ LLL: 'MMMM d, yyyy h:mm T',
+ LLLL: 'dddd, MMMM d, yyyy h:mm T'
+ },
+ ordinal: (n) => n,
+ format: 'L',
+ toggleAriaLabel: 'Change date',
+ }
+ }
+)
+
+
+
+
today
+
+
+ Defaults: Go to today
+
+
+
+
+
clear
+
+
+ Defaults: Clear selection
+
+
+
+
+
close
+
+
+ Defaults: Close the picker
+
+
+
+
+
selectMonth
+
+ Defaults: Select Month
+
+
+
+
+
previousMonth
+
+ Defaults: Previous Month
+
+
+
+
+
nextMonth
+
+ Defaults: Next Month
+
+
+
+
+
selectYear
+
+ Defaults: Select Year
+
+
+
+
+
previousYear
+
+ Defaults: Previous Year
+
+
+
+
+
nextYear
+
+ Defaults: Next Year
+
+
+
+
+
selectDecade
+
+ Defaults: Select Decade
+
+
+
+
+
previousDecade
+
+ Defaults: Previous Decade
+
+
+
+
+
nextDecade
+
+ Defaults: Next Decade
+
+
+
+
+
previousCentury
+
+ Defaults: Previous Century
+
+
+
+
+
nextCentury
+
+ Defaults: Next Century
+
+
+
+
+
pickHour
+
+ Defaults: Pick Hour
+
+
+
+
+
incrementHour
+
+ Defaults: Increment Hour
+
+
+
+
+
decrementHour
+
+ Defaults: Decrement Hour
+
+
+
+
+
pickMinute
+
+ Defaults: Pick Minute
+
+
+
+
+
incrementMinute
+
+ Defaults: Increment Minute
+
+
+
+
+
decrementMinute
+
+ Defaults: Decrement Minute
+
+
+
+
+
pickSecond
+
+ Defaults: Pick Second
+
+
+
+
+
incrementSecond
+
+ Defaults: Increment Second
+
+
+
+
+
decrementSecond
+
+ Defaults: Decrement Second
+
+
+
+
+
toggleMeridiem
+
+ Defaults: Toggle Period
+
+
+
+
+
selectTime
+
+ Defaults: Select Time
+
+
+
+
+
selectDate
+
+ Defaults: Select Date
+
+
+
+
+
+
+ Accepts: DateTimeFormatOptions Defaults:
+ { month: 'long', year: '2-digit' }
+ This should be an appropriate value from the Intl.DateFormat options.
+
+
+
+
+
locale
+
+
+ Defaults: default
+ This should be a BCP 47 language tag or a value supported by Intl.
+
+
+
+
+
startOfTheWeek
+
+
+ Accepts: 0-6 Defaults: 0
+ Changes the start of the week to the provided index. Intl/Date does not provide apis to get the
+ locale's start of the week. 0 = Sunday, 6 = Saturday. If you want the calendar view to start on Monday,
+ set this option to 1.
+
+
+
+
+
maxWeekdayLength
+
+
+ Accepts: number Defaults: 0
+ If provided the weekday string will be truncated to this length. This is useful when the Intl values are too long.
+
+
+
+
+
hourCycle
+
+
+ Accepts: 'h11' | 'h12' | 'h23' | 'h24' Defaults: undefined
+ Changes how the hours are displayed. If left undefined, the picker will attempt to guess.
+
+
+ Here is how the different options affect the start and end of the day.
+
+
+
+
+ Hour Cycle
+ Midnight
+ Night
+ Notes
+
+
+
+ h11
+ 00 AM
+ 11 PM
+ If your locale uses this please let me know.
+
+
+ h12
+ 12 AM
+ 11 PM
+
+
+
+ h23
+ 00
+ 23
+
+
+
+ h24
+ 01
+ 24
+ If your locale uses this please let me know.
+
+
+
+
+
+
+
+ These options describe shorthand format strings.
+
+
+
+
+
+
+ Long form time format.
+
+
+
+
+
+ Short time format.
+
+
+
+
+
+ Standard date format.
+
+
+
+
+
+ Long form date format. US default is July 4, 2022.
+
+
+
+
+
+ Long form date/time format. US default is July 4, 2022 9:30 AM.
+
+
+
+
+
+ Long form date/time format with weekday. US default is Monday, July 4, 2022 9:30 AM.
+
+
+
+
+
+
+
+
ordinal
+
+
+ Function to convert cardinal numbers to ordinal numbers, e.g. 3 -> third.
+
+
+
+
+
+
+ Default tokenized format to use. This can be "L" or "dd/MM/yyyy".
+
+
+
+
+
toggleAriaLabel
+
+
+ The aria-label to use for the toggle button. Defaults to "Change date", unless one more or dates is selected, in which case it will be "Change date, {dates}".
+
+
+
+
+
+
+
+
+
Localization Options
+
08/11/2022
+
02/26/2025
+
How to use the restriction options.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/options/restrictions.html b/src/docs/partials/options/restrictions.html
new file mode 100644
index 000000000..ac6085bd4
--- /dev/null
+++ b/src/docs/partials/options/restrictions.html
@@ -0,0 +1,183 @@
+
+
+ Restrictions allow you to prevent users from selected dates or times based on a set of rules.
+
+
+new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'),
+ {
+ restrictions: {
+ minDate: undefined,
+ maxDate: undefined,
+ disabledDates: [],
+ enabledDates: [],
+ daysOfWeekDisabled: [],
+ disabledTimeIntervals: [],
+ disabledHours: [],
+ enabledHours: []
+ }
+ }
+)
+
+
+
+
minDate
+
+
+
+ Accepts: string | Date | DateTime Defaults: undefined
+ Prevents the user from selecting a date/time before this value. Set to
+ undefined to remove
+ the
+ restriction.
+
+
+ Throws conflictingConfiguration
+ if value is
+ after maxDate.
+
+
+
+
+
maxDate
+
+ Accepts: string | Date | DateTime Defaults: undefined
+ Prevents the user from selecting a date/time after this value. Set to undefined
+ to remove the
+ restriction.
+
+
+ Throws conflictingConfiguration
+ if value is
+ after maxDate.
+
+
+
+
+
enabledDates/disabledDates
+
+
+
+
Accepts: array of string | Date | DateTime
Defaults: undefined
+
+ Use one or the other, don't provide both enabledDates and disabledDates.
+
+
+
+
+
enabledDates
+
+ Allows the user to select only from the provided days. Setting this takes precedence
+ over
+ options.minDate,
+ options.maxDate configuration.
+
+
disabledDates
+
+ Disallows the user to select any of the provided days. Setting this takes precedence
+ over
+ options.minDate,
+ options.maxDate configuration.
+
+
+
+
+
+
+
enabledHours/disabledHours
+
+
+
+
Accepts: array of number from 0-24
Defaults: undefined
+
+ Use one or the other, don't provide both enabledHours and disabledHours.
+
+
+ Throws numbersOutOfRage any value is
+ not between 0-23
+
+
+
+
+
enabledHours
+
+ Allows the user to select only from the provided hours.
+
+
disabledHours
+
+ Disallows the user to select any of the provided hours.
+
+
+
+
+
+
+
disabledTimeIntervals
+
+
+
+ Accepts: array of an object with from: DateTime, to: DateTime
+ Defaults:
+ undefined
+ Disables time selection between the given DateTimes.
+
+
+
+const later = new tempusDominus.DateTime();
+later.hours = 8;
+new tempusDominus.TempusDominus(..., {
+ restrictions: {
+ disabledTimeIntervals: [
+ { from: new tempusDominus.DateTime().startOf('date'), to: later }
+ ]
+ }
+});
+
+
+
+
+
daysOfWeekDisabled
+
+
+
+ Accepts: array of numbers from 0-6
+ Disallow the user to select weekdays that exist in this array. This has lower priority over the
+ options.minDate, options.maxDate, options.disabledDates and options.enabledDates configuration
+ settings.
+
+
+ Throws numbersOutOfRage any value is not
+ between 0-6.
+
+
+
+
+
+
+
+
+
Restrictions Options
+
08/11/2022
+
08/11/2022
+
How to use the restriction options.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/plugins/bi1.html b/src/docs/partials/plugins/bi1.html
new file mode 100644
index 000000000..17d808dff
--- /dev/null
+++ b/src/docs/partials/plugins/bi1.html
@@ -0,0 +1,133 @@
+
+
+
+ You can use this plugin to set the global default icons to Bootstrap Icons v1. This plugin requires Bootstrap Icons v1 resources to be loaded.
+
+
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//example picker
+const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+
+//to set globally
+tempusDominus.extend(window.tempusDominus.plugins.bi_one.load);
+//or
+import {load, biOneIcons} from '@eonasdan/tempus-dominus/dist/plugins/bi-one'
+extend(load);
+
+
+// otherwise to set icons to an individual picker
+datetimepicker1.updateOptions({ display: { icons: window.tempusDominus.plugins.bi_one.biOneIcons }});
+//or
+datetimepicker1.updateOptions({ display: { icons: biOneIcons }});
+
+
+
+
+
Boostrap Icons v1 Icons
+
+ Boostrap Icons
+
+ Option
+ Value
+
+
+
+ type
+ icons
+
+
+
+ time
+ bi bi-clock
+
+
+
+ date
+ bi bi-calendar-week
+
+
+
+ up
+ bi bi-arrow-up
+
+
+
+ down
+ bi bi-arrow-down
+
+
+
+ previous
+ bi bi-chevron-left
+
+
+
+ next
+ bi bi-chevron-right
+
+
+
+ today
+ bi bi-calendar-check
+
+
+
+ clear
+ bi bi-trash
+
+
+
+ close
+ bi bi-x
+
+
+
+
+
+
+
+
+
+
Plugins - Bootstrap Icons v1
+
03/15/2023
+
03/15/2023
+
How to use Bootstrap Icons v1 plugin with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/plugins/customDateFormat.html b/src/docs/partials/plugins/customDateFormat.html
new file mode 100644
index 000000000..f2877c2ec
--- /dev/null
+++ b/src/docs/partials/plugins/customDateFormat.html
@@ -0,0 +1,223 @@
+
+
+
+ This is no longer a plugin. It's now included directly.
+
+
+ Use the boxes below to set a format string and the locale of the sample picker and click "Change" to update the
+ options.
+
+
+
+
+
+
+
+
+
Sample picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//example picker
+const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker'), {
+ localization: {
+ locale: 'pt-BR',
+ format: 'dd/MM/yyyy HH:mm',
+ }
+});
+
+
+
+
+
+
Format Tokens
+
+
+ The format supports the following tokens. Given 2022-07-04T15:13:29.474Z
+
+
+
+
+ Token
+ Description
+ Result
+
+
+
+
+ yy
+ 2 digit year
+ 22
+
+
+ yyyy
+ 4 digit year
+ 2022
+
+
+ M
+ 1-2 digit month, e.g. 1...12
+ 7
+
+
+ MM
+ 2 digit month
+ 07
+
+
+ MMM
+ Short Month
+ Jul
+
+
+ MMMM
+ Full Month
+ July
+
+
+ d
+ 1-2 digit day, e.g. 1...31
+ 4
+
+
+ dd
+ 2 digit day
+ 04
+
+
+ ddd
+ Short Weekday
+ Mon
+
+
+ dddd
+ Full Weekday
+ Monday
+
+
+ H
+ 1-2 digit hour (24 hour)
+ 13
+
+
+ HH
+ 2 digit hour (24 hour)
+ 13
+
+
+ h
+ 1-2 digit hour (12 hour)
+ 1 (PM)
+
+
+ hh
+ 2 digit hour (12 hour)
+ 01 (PM)
+
+
+ m
+ 1-2 digit minute, e.g. 0...59
+ 29
+
+
+ mm
+ 2 digit minute, e.g. 0...59
+ 29
+
+
+ s
+ 1-2 digit second, e.g. 0...59
+ 47
+
+
+ ss
+ 2 digit second, e.g. 0...59
+ 47
+
+
+ T
+ Meridiem
+ PM
+
+
+
+
+
+
+
+
+
Custom Date Formats
+
01/19/2022
+
01/26/2023
+
How to use custom date format plugin with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/plugins/fa5.html b/src/docs/partials/plugins/fa5.html
new file mode 100644
index 000000000..7cdb85c10
--- /dev/null
+++ b/src/docs/partials/plugins/fa5.html
@@ -0,0 +1,138 @@
+
+
+
+ You can use this plugin to set the global default icons to FA5. This plugin requires the FA5 resources to be
+ loaded.
+
+
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//example picker
+const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+
+//to set globally
+tempusDominus.extend(window.tempusDominus.plugins.fa_five.load);
+//or
+import {load, faFiveIcons} from '@eonasdan/tempus-dominus/dist/plugins/fa-five'
+extend(load);
+
+// otherwise to set icons to an individual picker
+datetimepicker1.updateOptions({ display: { icons: window.tempusDominus.plugins.fa_five.faFiveIcons }});
+//or
+datetimepicker1.updateOptions({ display: { icons: faFiveIcons }});
+
+
+
+
+
FA 5 Icons
+
+ FA icons
+
+ Option
+ Value
+
+
+
+ type
+ icons
+
+
+
+ time
+ fas fa-clock
+
+
+
+ date
+ fas fa-calendar
+
+
+
+ up
+ fas fa-arrow-up
+
+
+
+ down
+ fas fa-arrow-down
+
+
+
+ previous
+ fas fa-chevron-left
+
+
+
+ next
+ fas fa-chevron-right
+
+
+
+ today
+ fas fa-calendar-check
+
+
+
+ clear
+ fas fa-trash
+
+
+
+ close
+ fas fa-xmark
+
+
+
+
+
+
+
+
+
+
+
Plugins - Font Awesome 5
+
01/19/2022
+
07/22/2022
+
How to use font awesome 5 plugin with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/plugins/floating-ui.html b/src/docs/partials/plugins/floating-ui.html
new file mode 100644
index 000000000..601ff4bd4
--- /dev/null
+++ b/src/docs/partials/plugins/floating-ui.html
@@ -0,0 +1,37 @@
+
+
+
Floating UI
+
+ By default, @popperJS/core is required for the popper to work correctly. Alternatively, we can remove popper and
+ use
+ FloatingUI by creating a
+ plugin that handles the popup creation.
+
+
+
+
+
+
+import { computePosition } from '@floating-ui/dom';
+
+const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+
+datetimepicker1.display.createPopup = computePosition(element, widget, options).then(({ x, y }) => {
+ Object.assign(widget.style, {
+ left: `${x}px`,
+ top: `${y}px`,
+ position: 'absolute',
+ });
+ });
+
+
+
+
+
+
+
Plugins - FloatingUI
+
09/13/2022
+
09/13/2022
+
How to use FloatingUI plugin with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/plugins/index.html b/src/docs/partials/plugins/index.html
new file mode 100644
index 000000000..ae8136f66
--- /dev/null
+++ b/src/docs/partials/plugins/index.html
@@ -0,0 +1,116 @@
+
+
+
Introduction
+
+ Plugins allow you to extend the picker by adding new functionality to either Tempus Dominus globally,
+ a single picker or by overwriting existing functionality.
+
+
+
+
+
Creating plugins
+
+ There are a few examples in the source like this
+
+
+export const load = (option, tdClasses, tdFactory) => {
+ // extend the picker
+ // e.g. add new tempusDominus.TempusDominus(...).someFunction()
+ tdClasses.TempusDominus.prototype.someFunction = (a, logger) => {
+ logger = logger || console.log
+ logger(a);
+ }
+
+ // extend tempusDominus
+ // e.g. add tempusDominus.example()
+ tdFactory.example = (a, logger) => {
+ logger = logger || console.log
+ logger(a);
+ }
+
+ // overriding existing API
+ // e.g. extend new tempusDominus.TempusDominus(...).show()
+ const oldShow = tdClasses.TempusDominus.prototype.show;
+ tdClasses.TempusDominus.prototype.show = function(a, logger) {
+ logger = logger || console.log
+ alert('from plugin');
+ logger(a);
+ oldShow.bind(this)()
+ // return modified result
+ }
+}
+
+
+
+
+
Using a plugin
+
Globally
+
+ Using a plugin is easy. Load the plugin script file after you load Tempus Dominus
+
+
+<script src="/path/to/plugin.js"></script>
+tempusDominus.extend(window.tempusDominus.plugins.PLUGINNAME);
+
+
+
+ You can also use import the plugins instead.
+
+
+import { TempusDominus, version, extend } from '@eonasdan/tempus-dominus'; //require also works
+import sample from '@eonasdan/tempus-dominus/dist/plugins/examples/sample';
+
+extend(sample); // use plugin
+
+
+
Per instance
+
+ Plugins can also be loaded per picker.
+
+
+
+const picker = new tempusdominus
+ .TempusDominus(document.getElementById('datetimepicker1'));
+
+picker.extend(sample);
+
+
+
+
+
+
Per Instance Overwrites
+
+ It is possible to overwrite specific functions per picker instances as well. For instance:
+
+
+const td = new tempusDominus
+ .TempusDominus(document.getElementById('datetimepicker1'));
+
+td.dates.formatInput = function(date) { {return moment(date).format('MM/DD/YYYY') } }
+
+
+ The code above would affect a single picker but not globally. You could easily adapt this code to
+ have a common formatting function taking in a format string.
+
+
+
+
+
+
+
+
+
Plugins
+
01/19/2022
+
02/05/2022
+
How to use plugins with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/plugins/moment.html b/src/docs/partials/plugins/moment.html
new file mode 100644
index 000000000..be47784b9
--- /dev/null
+++ b/src/docs/partials/plugins/moment.html
@@ -0,0 +1,93 @@
+
+
+
+ If you still need to use moment.js, you can load this plugin to use moment to parse input dates.
+
+
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//example picker
+//note that you can optionally provide the format to use.
+tempusDominus.extend(tempusDominus.plugins.moment_parse, 'DD.MM.yyyy hh:mm a');
+const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+
+
+
+
+
How it works
+
+ This plugin overrides two picker functions setFromInput and formatInput.
+
+
+ setFromInput parses and sets a date at the provided index with the textbox value.
+
+
+ formatInput is the reverse, it takes a date time object and formats or parses it to a string.
+
+
+//obviously, loading moment js is required.
+declare var moment;
+export const load = (option, tdClasses, tdFactory) => {
+ tdClasses.Dates.prototype.setFromInput = function(value, index) {
+ let converted = moment(value, option);
+ if (converted.isValid()) {
+ let date = tdFactory.DateTime.convert(converted.toDate(), this.optionsStore.options.localization.locale);
+ this.setValue(date, index);
+ }
+ else {
+ console.warn('Momentjs failed to parse the input date.');
+ }
+ }
+
+ tdClasses.Dates.prototype.formatInput = function(date) {
+ return moment(date).format(option);
+ }
+}
+
+
+
+
+
Plugins - Moment
+
02/05/2022
+
02/05/2022
+
How to use momentjs plugin with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/plugins/paint.html b/src/docs/partials/plugins/paint.html
new file mode 100644
index 000000000..d022a2392
--- /dev/null
+++ b/src/docs/partials/plugins/paint.html
@@ -0,0 +1,78 @@
+
+
+
+ You can customize the css classes applied to dates by overwriting the display.paint.
+ The function provides a Unit value (extended to include "decade"),
+ the date involved and an array of string that represents the classes that will be applied.
+
+
+
+
+
+
+
+
Simple picker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//example picker
+const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('datetimepicker1'));
+
+datetimepicker1.display.paint = (unit, date, classes, element) => {
+ if (unit === tempusDominus.Unit.date) {
+ //highlight tomorrow
+ if (date.isSame(new tempusDominus.DateTime().manipulate(1, 'date'), unit)) {
+ classes.push('special-day');
+ }
+ }
+}
+
+
+
+
+
+
Plugins - Paint
+
02/05/2022
+
03/21/2022
+
How to use add custom classes with Tempus Dominus.
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/partials/repl.html b/src/docs/partials/repl.html
new file mode 100644
index 000000000..94979002a
--- /dev/null
+++ b/src/docs/partials/repl.html
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
REPL
+
07/08/2021
+
07/08/2021
+
How to use Tempus Dominus datetime picker
+
datepicker, javascript, open source, tempus dominus, eonasdan
+
diff --git a/src/docs/site-config.json b/src/docs/site-config.json
new file mode 100644
index 000000000..7a8bb294f
--- /dev/null
+++ b/src/docs/site-config.json
@@ -0,0 +1,4 @@
+{
+ "root": "https://getdatepicker.com/",
+ "output" : "docs/6"
+}
\ No newline at end of file
diff --git a/src/docs/styles/bs5_docs.scss b/src/docs/styles/bs5_docs.scss
new file mode 100644
index 000000000..a0d1ba3d4
--- /dev/null
+++ b/src/docs/styles/bs5_docs.scss
@@ -0,0 +1,525 @@
+/*!
+ * Bootstrap Docs (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under the Creative Commons Attribution 3.0 Unported License.
+ * For details, see https://creativecommons.org/licenses/by/3.0/.
+ */
+
+.bd-navbar {
+ padding: .75rem 0;
+ background-color: var(--bs-primary);
+
+ .navbar-toggler {
+ padding: 0;
+ border: 0;
+ }
+
+ .navbar-nav .nav-link {
+ padding-right: .25rem;
+ padding-left: .25rem;
+ color: rgba(255, 255, 255, 0.85);
+
+ &:hover, &:focus {
+ color: #fff;
+ }
+
+ &.active {
+ font-weight: 600;
+ color: #fff;
+ }
+ }
+
+ .navbar-nav-svg {
+ width: 1rem;
+ height: 1rem;
+ }
+}
+
+.bd-subnavbar {
+ position: relative;
+ z-index: 1020;
+ background-color: rgba(255, 255, 255, 0.95);
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.05), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+
+ .dropdown-menu {
+ font-size: .875rem;
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.05);
+ }
+
+ .dropdown-item.current {
+ font-weight: 600;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23292b2c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right 1rem top 0.6rem;
+ background-size: 0.75rem 0.75rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .bd-subnavbar {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ }
+}
+
+.bd-search {
+ position: relative;
+
+ &::after {
+ position: absolute;
+ top: .4rem;
+ right: .4rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 1.5rem;
+ padding-right: .25rem;
+ padding-left: .25rem;
+ font-size: .75rem;
+ color: #6c757d;
+ content: "Ctrl + /";
+ border: 1px solid #dee2e6;
+ border-radius: 0.125rem;
+ }
+
+ .form-control {
+ padding-right: 3.75rem;
+
+ &:focus {
+ border-color: #7952b3;
+ box-shadow: 0 0 0 3px rgba(121, 82, 179, 0.25);
+ }
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bd-search {
+ width: 100%;
+ }
+}
+
+.bd-sidebar-toggle {
+ color: #6c757d;
+
+ &:hover {
+ color: #7952b3;
+ }
+
+ &:focus {
+ color: #7952b3;
+ box-shadow: 0 0 0 3px rgba(121, 82, 179, 0.25);
+ }
+
+ .bi-collapse {
+ display: none;
+ }
+
+ &:not(.collapsed) {
+ .bi-expand {
+ display: none;
+ }
+
+ .bi-collapse {
+ display: inline-block;
+ }
+ }
+}
+
+.bd-masthead {
+ padding: 3rem 0;
+
+ h1 {
+ font-size: calc(1.525rem + 3.3vw);
+ line-height: 1;
+ }
+
+ p:not(.lead) {
+ color: #495057;
+ }
+
+ .btn {
+ padding: .8rem 2rem;
+ font-weight: 600;
+ }
+
+ .lead {
+ font-size: calc(1.275rem + .3vw);
+ font-weight: 400;
+ color: #495057;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bd-masthead h1 {
+ font-size: 4rem;
+ }
+}
+
+@media (min-width: 1200px) {
+ .bd-masthead .lead {
+ font-size: 1.5rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .mw-md-75 {
+ max-width: 75%;
+ }
+}
+
+.masthead-followup-icon {
+ padding: .75rem;
+ background-image: linear-gradient(to bottom right, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.01));
+ border-radius: .75rem;
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.1);
+}
+
+.masthead-followup-svg {
+ filter: drop-shadow(0 1px 0 rgba(0, 0, 0, 0.125));
+}
+
+@media (min-width: 768px) {
+ :root {
+ scroll-padding-top: 4rem;
+ }
+}
+
+.bd-content > {
+ h2:not(:first-child) {
+ margin-top: 3rem;
+ }
+
+ h3 {
+ margin-top: 2rem;
+ }
+
+ ul li, ol li {
+ margin-bottom: 0.25rem;
+ }
+
+ ul li > p ~ ul, ol li > p ~ ul {
+ margin-top: -.5rem;
+ margin-bottom: 1rem;
+ }
+
+ .table {
+ max-width: 100%;
+ margin-bottom: 1.5rem;
+ font-size: 0.875rem;
+
+ th:first-child, td:first-child {
+ padding-left: 0;
+ }
+
+ th:not(:last-child) {
+ padding-right: 1.5rem;
+ }
+
+ td {
+ &:not(:last-child) {
+ padding-right: 1.5rem;
+ }
+
+ &:first-child > code {
+ white-space: nowrap;
+ }
+ }
+ }
+}
+
+@media (max-width: 991.98px) {
+ .bd-content > .table {
+ display: block;
+ overflow-x: auto;
+
+ &.table-bordered {
+ border: 0;
+ }
+ }
+}
+
+.bd-title {
+ font-size: calc(1.425rem + 2.1vw);
+}
+
+@media (min-width: 1200px) {
+ .bd-title {
+ font-size: 3rem;
+ }
+}
+
+.bd-lead {
+ font-size: calc(1.275rem + .3vw);
+ font-weight: 300;
+}
+
+@media (min-width: 1200px) {
+ .bd-lead {
+ font-size: 1.5rem;
+ }
+}
+
+.bd-text-purple-bright {
+ color: #7952b3;
+}
+
+.bd-bg-purple-bright {
+ background-color: #7952b3;
+}
+
+.skippy {
+ background-color: #563d7c;
+
+ a {
+ color: #fff;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bd-sidebar {
+ margin: 0 -0.75rem 1rem;
+ }
+}
+
+.bd-links {
+ overflow: auto;
+ font-weight: 600;
+
+ a {
+ padding: .1875rem .5rem;
+ margin-top: .125rem;
+ margin-left: 1.25rem;
+ color: rgba(0, 0, 0, 0.65);
+ text-decoration: none;
+
+ &:hover, &:focus {
+ color: rgba(0, 0, 0, 0.85);
+ background-color: rgba(121, 82, 179, 0.1);
+ }
+ }
+
+ .btn {
+ padding: .25rem .5rem;
+ font-weight: 600;
+ color: rgba(0, 0, 0, 0.65);
+ background-color: transparent;
+ border: 0;
+
+ &:hover {
+ color: rgba(0, 0, 0, 0.85);
+ background-color: rgba(121, 82, 179, 0.1);
+ }
+
+ &:focus {
+ color: rgba(0, 0, 0, 0.85);
+ background-color: rgba(121, 82, 179, 0.1);
+ box-shadow: 0 0 0 1px rgba(121, 82, 179, 0.7);
+ }
+
+ &::before {
+ width: 1.25em;
+ line-height: 0;
+ content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
+ transition: transform 0.35s ease;
+ transform-origin: 0.5em 50%;
+ }
+
+ &[aria-expanded="true"] {
+ color: rgba(0, 0, 0, 0.85);
+
+ &::before {
+ transform: rotate(90deg);
+ }
+ }
+ }
+
+ .active {
+ font-weight: 600;
+ color: rgba(0, 0, 0, 0.85);
+ }
+}
+
+@media (min-width: 768px) {
+ .bd-links {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 5rem;
+ display: block !important;
+ height: calc(100vh - 7rem);
+ padding-left: .25rem;
+ margin-left: -.25rem;
+ overflow-y: auto;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .bd-links > ul {
+ padding: 1.5rem .75rem;
+ background-color: #f8f9fa;
+ border-bottom: 1px solid #e9ecef;
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .bd-links .btn::before {
+ transition: none;
+ }
+}
+
+@media (min-width: 768px) {
+ .bd-layout {
+ display: grid;
+ gap: 1.5rem;
+ grid-template-areas: "sidebar main";
+ grid-template-columns: 1fr 3fr;
+ }
+}
+
+@media (min-width: 992px) {
+ .bd-layout {
+ grid-template-columns: 1fr 5fr;
+ }
+}
+
+.bd-sidebar {
+ grid-area: sidebar;
+}
+
+.bd-main {
+ grid-area: main;
+}
+
+@media (min-width: 768px) {
+ .bd-main {
+ display: grid;
+ gap: inherit;
+ grid-template-areas: "intro" "toc" "content";
+ grid-template-rows: auto auto 1fr;
+ }
+}
+
+@media (min-width: 992px) {
+ .bd-main {
+ grid-template-areas: "intro toc" "content toc";
+ grid-template-columns: 4fr 1fr;
+ grid-template-rows: auto 1fr;
+ }
+}
+
+.bd-intro {
+ grid-area: intro;
+}
+
+.bd-toc {
+ grid-area: toc;
+}
+
+.bd-content {
+ grid-area: content;
+ min-width: 1px;
+}
+
+@media (min-width: 992px) {
+ .bd-toc {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 5rem;
+ right: 0;
+ z-index: 2;
+ height: calc(100vh - 7rem);
+ overflow-y: auto;
+ }
+}
+
+.bd-toc nav {
+ font-size: 0.875rem;
+
+ ul {
+ padding-left: 0;
+ list-style: none;
+
+ ul {
+ padding-left: 1rem;
+ margin-top: 0.25rem;
+ }
+ }
+
+ li {
+ margin-bottom: 0.25rem;
+ }
+
+ a {
+ color: inherit;
+
+ &:not(:hover) {
+ text-decoration: none;
+ }
+
+ code {
+ font: inherit;
+ }
+ }
+}
+
+.bd-footer a {
+ color: #495057;
+ text-decoration: none;
+
+ &:hover, &:focus {
+ color: #0d6efd;
+ text-decoration: underline;
+ }
+}
+
+.btn-bd-primary {
+ font-weight: 600;
+ color: #fff;
+ background-color: #7952b3;
+ border-color: #7952b3;
+
+ &:hover, &:active {
+ color: #fff;
+ background-color: #61428f;
+ border-color: #61428f;
+ }
+
+ &:focus {
+ box-shadow: 0 0 0 3px rgba(121, 82, 179, 0.25);
+ }
+}
+
+.btn-bd-download {
+ font-weight: 600;
+ color: #ffe484;
+ border-color: #ffe484;
+
+ &:hover, &:active {
+ color: #2a2730;
+ background-color: #ffe484;
+ border-color: #ffe484;
+ }
+
+ &:focus {
+ box-shadow: 0 0 0 3px rgba(255, 228, 132, 0.25);
+ }
+}
+
+.anchor-link {
+ font-size: 1.4rem;
+ font-weight: 400;
+ transition: color 0.15s ease-in-out;
+ padding-left: 0.375em;
+
+ &:focus, &:hover {
+ color: #0d6efd;
+ text-decoration: none;
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .anchor-link {
+ transition: none;
+ }
+}
diff --git a/src/docs/styles/styles.scss b/src/docs/styles/styles.scss
new file mode 100644
index 000000000..d8c6871f9
--- /dev/null
+++ b/src/docs/styles/styles.scss
@@ -0,0 +1,177 @@
+@use "../../../node_modules/bootstrap/scss/bootstrap.scss";
+@use "bs5_docs";
+@import "http://github.com/service/https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900";
+
+.show-code {
+ cursor: pointer;
+}
+
+.tab-content > .active {
+ min-height: 35vh;
+ max-height: 35vh;
+ overflow-y: auto;
+}
+
+section:not(:last-child) {
+ padding-bottom: 1rem;
+ margin-bottom: 1rem;
+ border-bottom: 1px solid grey;
+}
+
+section h2 {
+ margin-top: 3rem
+}
+
+#migration {
+ textarea {
+ height: 60vh;
+ }
+
+ /* hide the right side toc to give more room */
+ @media (min-width: 768px) {
+ .bd-main {
+ display: grid;
+ gap: inherit;
+ grid-template-areas: "intro" "content";
+ grid-template-rows: auto auto 1fr;
+ }
+
+ #convertButton, #convertButtonHtml {
+ position: relative;
+ top: 50%;
+ }
+ }
+
+ @media (min-width: 992px) {
+ .bd-main {
+ grid-template-areas: "intro" "content";
+ grid-template-columns: 4fr;
+ grid-template-rows: auto 1fr;
+ }
+ }
+
+ #alert {
+ max-height: 20vh;
+ overflow-y: scroll;
+ }
+
+ .tab-content > .active {
+ min-height: initial;
+ max-height: initial;
+ overflow-y: initial;
+ }
+}
+
+h2 {
+ border-top: 1px solid #f07534;
+ margin-top: 1.5rem !important;
+ padding-top: 1.5rem;
+}
+
+@media (prefers-color-scheme: dark) {
+ $dark-background: #171717;
+ $dark-font:#e3e3e3;
+ $dark-background-alt: #2d2d2d;
+ $dark-font-alt: #4db2ff;
+
+ body, .form-control {
+ background-color: $dark-background;
+ color: $dark-font;
+ }
+
+ a, .show-code, .nav-link {
+ color: $dark-font-alt;
+ }
+
+ .bd-links .btn, .bd-links .btn[aria-expanded=true], .bd-links .active, .bd-links a, .bd-footer a, .bd-masthead .lead,
+ .table > :not(caption) > * > * {
+ color: $dark-font;
+ }
+
+ .bd-links a:hover, .bd-links a:focus, .bd-links .btn:hover, .bd-links .btn:focus, .input-group-text, .form-control:disabled, .form-control[readonly] {
+ background-color: $dark-background-alt;
+ color: $dark-font;
+ }
+
+ .input-group-text {
+ border-color: $dark-background-alt;
+ }
+
+ .bd-links .btn:focus {
+ box-shadow: 0 0 0 1px rgb(0 0 0 / 5%);
+ }
+
+ .form-control {
+ border-color: rgb(60, 65, 68);
+ }
+
+ .bd-subnavbar {
+ background-color: rgba(24, 26, 27, 0.95);
+ box-shadow: rgb(0 0 0 / 5%) 0 0.5rem 1rem, rgb(0 0 0 / 15%) 0px -1px 0px inset;
+ }
+
+ .btn {
+ color: $dark-font;
+
+ &:hover {
+ color: $dark-font;
+ }
+ }
+
+ .bd-links .btn::before {
+ content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28227, 227, 227,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
+ }
+
+ .bg-light, .text-muted, .table-striped > tbody > tr:nth-of-type(odd) > *, .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link {
+ background-color: $dark-background-alt !important;
+ color: $dark-font !important;
+ }
+
+ .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link {
+ border-color: rgb(56, 61, 63) rgb(56, 61, 63) rgb(48, 52, 54);
+ }
+
+ .btn-bd-download:hover, .btn-bd-download:active {
+ color: rgb(205, 200, 194);
+ background-color: rgb(125, 97, 0);
+ border-color: rgb(139, 108, 0);
+ }
+
+ code {
+ color: #A3E170;
+ }
+}
+
+@media (min-width: 768px) {
+ .bd-toc-collapse {
+ display: block !important;
+ }
+}
+
+.bd-toc {
+ background-color: initial !important;
+
+ nav li {
+ list-style: none;
+ }
+}
+
+@media (min-width: 992px) {
+ .bd-toc {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 5rem;
+ right: 0;
+ z-index: 2;
+ height: calc(100vh - 7rem);
+ overflow-y: auto;
+ }
+}
+
+.bd-gutter {
+ --bs-gutter-x: 3rem;
+}
+
+#change-log ul {
+ margin-left: 2rem;
+}
diff --git a/src/docs/templates/404.html b/src/docs/templates/404.html
new file mode 100644
index 000000000..4ee039c0d
--- /dev/null
+++ b/src/docs/templates/404.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
Oops! Looks like you find a link that doesn't exist.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/docs/templates/index.html b/src/docs/templates/index.html
new file mode 100644
index 000000000..aa134fe07
--- /dev/null
+++ b/src/docs/templates/index.html
@@ -0,0 +1,135 @@
+
+
+
+
+
Powerful and robust date and time picker
+
+ Tempus Dominus is the successor to the very popular "eonasdan/bootstrap-datetimepicker". The plugin provides
+ a wide array of options that allow developers to provide date and or time selections to users as simple
+ pickers, date of birth selection, appointments and more.
+
+
+
+ Currently v6.9.4
+ ·
+ v5 docs
+
+
+
+
+
+
+
+
+
+
diff --git a/src/docs/templates/page-template.html b/src/docs/templates/page-template.html
new file mode 100644
index 000000000..c3f5eddad
--- /dev/null
+++ b/src/docs/templates/page-template.html
@@ -0,0 +1,122 @@
+
+
+
+
+
+ On this page
+
+
+
+
+
On this page
+
+
+
+
+
+
+
+
diff --git a/src/docs/templates/post-loop.html b/src/docs/templates/post-loop.html
new file mode 100644
index 000000000..1d63f1a4b
--- /dev/null
+++ b/src/docs/templates/post-loop.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
${post.title}
+
+ ${post.author.name}
+
+ ${post.postDate}
+
+
${post.excerpt}
+
+
+
+
\ No newline at end of file
diff --git a/src/docs/templates/shell.html b/src/docs/templates/shell.html
new file mode 100644
index 000000000..5c0c0aa9a
--- /dev/null
+++ b/src/docs/templates/shell.html
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+ Official documentation site for Tempus Dominus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tempus Dominus v6.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/js/actions.ts b/src/js/actions.ts
new file mode 100644
index 000000000..11705dbdc
--- /dev/null
+++ b/src/js/actions.ts
@@ -0,0 +1,389 @@
+import { DateTime, Unit } from './datetime';
+import Collapse from './display/collapse';
+import Namespace from './utilities/namespace';
+import Dates from './dates';
+import Validation from './validation';
+import Display from './display';
+import { EventEmitters } from './utilities/event-emitter';
+import { serviceLocator } from './utilities/service-locator.js';
+import ActionTypes from './utilities/action-types';
+import CalendarModes from './utilities/calendar-modes';
+import { OptionsStore } from './utilities/optionsStore';
+
+/**
+ * Logic for various click actions
+ */
+export default class Actions {
+ private optionsStore: OptionsStore;
+ private validation: Validation;
+ private dates: Dates;
+ private display: Display;
+ private _eventEmitters: EventEmitters;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.dates = serviceLocator.locate(Dates);
+ this.validation = serviceLocator.locate(Validation);
+ this.display = serviceLocator.locate(Display);
+ this._eventEmitters = serviceLocator.locate(EventEmitters);
+
+ this._eventEmitters.action.subscribe((result) => {
+ this.do(result.e, result.action);
+ });
+ }
+
+ /**
+ * Performs the selected `action`. See ActionTypes
+ * @param e This is normally a click event
+ * @param action If not provided, then look for a [data-action]
+ */
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ do(e: any, action?: ActionTypes) {
+ const currentTarget = e?.currentTarget as HTMLElement;
+ if (currentTarget?.classList?.contains(Namespace.css.disabled)) return;
+ action = action || (currentTarget?.dataset?.action as ActionTypes);
+ const lastPicked = (this.dates.lastPicked || this.optionsStore.viewDate)
+ .clone;
+
+ switch (action) {
+ case ActionTypes.next:
+ case ActionTypes.previous:
+ this.handleNextPrevious(action);
+ break;
+ case ActionTypes.changeCalendarView:
+ this.display._showMode(1);
+ this.display._updateCalendarHeader();
+ break;
+ case ActionTypes.selectMonth:
+ case ActionTypes.selectYear:
+ case ActionTypes.selectDecade:
+ this.handleSelectCalendarMode(action, currentTarget);
+ break;
+ case ActionTypes.selectDay:
+ this.handleSelectDay(currentTarget);
+ break;
+ case ActionTypes.selectHour: {
+ let hour = +currentTarget.dataset.value;
+ if (lastPicked.hours >= 12 && this.optionsStore.isTwelveHour)
+ hour += 12;
+ lastPicked.hours = hour;
+ this.dates.setValue(lastPicked, this.dates.lastPickedIndex);
+ this.hideOrClock(e);
+ break;
+ }
+ case ActionTypes.selectMinute: {
+ lastPicked.minutes = +currentTarget.dataset.value;
+ this.dates.setValue(lastPicked, this.dates.lastPickedIndex);
+ this.hideOrClock(e);
+ break;
+ }
+ case ActionTypes.selectSecond: {
+ lastPicked.seconds = +currentTarget.dataset.value;
+ this.dates.setValue(lastPicked, this.dates.lastPickedIndex);
+ this.hideOrClock(e);
+ break;
+ }
+ case ActionTypes.incrementHours:
+ this.manipulateAndSet(lastPicked, Unit.hours);
+ break;
+ case ActionTypes.incrementMinutes:
+ this.manipulateAndSet(
+ lastPicked,
+ Unit.minutes,
+ this.optionsStore.options.stepping
+ );
+ break;
+ case ActionTypes.incrementSeconds:
+ this.manipulateAndSet(lastPicked, Unit.seconds);
+ break;
+ case ActionTypes.decrementHours:
+ this.manipulateAndSet(lastPicked, Unit.hours, -1);
+ break;
+ case ActionTypes.decrementMinutes:
+ this.manipulateAndSet(
+ lastPicked,
+ Unit.minutes,
+ this.optionsStore.options.stepping * -1
+ );
+ break;
+ case ActionTypes.decrementSeconds:
+ this.manipulateAndSet(lastPicked, Unit.seconds, -1);
+ break;
+ case ActionTypes.toggleMeridiem:
+ this.manipulateAndSet(
+ lastPicked,
+ Unit.hours,
+ this.dates.lastPicked.hours >= 12 ? -12 : 12
+ );
+ break;
+ case ActionTypes.togglePicker:
+ this.handleToggle(currentTarget);
+ break;
+ case ActionTypes.showClock:
+ case ActionTypes.showHours:
+ case ActionTypes.showMinutes:
+ case ActionTypes.showSeconds:
+ //make sure the clock is actually displaying
+ if (
+ !this.optionsStore.options.display.sideBySide &&
+ this.optionsStore.currentView !== 'clock'
+ ) {
+ //hide calendar
+ Collapse.hideImmediately(this.display.dateContainer);
+ //show clock
+ Collapse.showImmediately(this.display.timeContainer);
+ }
+ this.handleShowClockContainers(action);
+ break;
+ case ActionTypes.clear:
+ this.dates.setValue(null);
+ this.display._updateCalendarHeader();
+ break;
+ case ActionTypes.close:
+ this.display.hide();
+ break;
+ case ActionTypes.today: {
+ const day = new DateTime().setLocalization(
+ this.optionsStore.options.localization
+ );
+ this._eventEmitters.updateViewDate.emit(day);
+
+ if (!this.validation.isValid(day, Unit.date)) break;
+
+ if (this.optionsStore.options.dateRange) this.handleDateRange(day);
+ else if (this.optionsStore.options.multipleDates) {
+ this.handleMultiDate(day);
+ } else {
+ this.dates.setValue(day, this.dates.lastPickedIndex);
+ }
+ break;
+ }
+ }
+ }
+
+ private handleShowClockContainers(action: ActionTypes) {
+ if (!this.display._hasTime) {
+ Namespace.errorMessages.throwError(
+ 'Cannot show clock containers when time is disabled.'
+ );
+ /* ignore coverage: should never happen */
+ return;
+ }
+
+ this.optionsStore.currentView = 'clock';
+ this.display.widget
+ .querySelectorAll(`.${Namespace.css.timeContainer} > div`)
+ .forEach(
+ (htmlElement: HTMLElement) => (htmlElement.style.display = 'none')
+ );
+
+ let classToUse = '';
+ switch (action) {
+ case ActionTypes.showClock:
+ classToUse = Namespace.css.clockContainer;
+ this.display._update('clock');
+ break;
+ case ActionTypes.showHours:
+ classToUse = Namespace.css.hourContainer;
+ this.display._update(Unit.hours);
+ break;
+ case ActionTypes.showMinutes:
+ classToUse = Namespace.css.minuteContainer;
+ this.display._update(Unit.minutes);
+ break;
+ case ActionTypes.showSeconds:
+ classToUse = Namespace.css.secondContainer;
+ this.display._update(Unit.seconds);
+ break;
+ }
+
+ const element = this.display.widget.getElementsByClassName(
+ classToUse
+ )[0] as HTMLElement;
+ element.style.display = 'grid';
+ (element.children[0])?.focus();
+ }
+
+ private handleNextPrevious(action: ActionTypes) {
+ const { unit, step } =
+ CalendarModes[this.optionsStore.currentCalendarViewMode];
+ if (action === ActionTypes.next)
+ this.optionsStore.viewDate.manipulate(step, unit);
+ else this.optionsStore.viewDate.manipulate(step * -1, unit);
+ this._eventEmitters.viewUpdate.emit();
+
+ this.display._showMode();
+ }
+
+ /**
+ * After setting the value it will either show the clock or hide the widget.
+ * @param e
+ */
+ private hideOrClock(e) {
+ if (
+ !this.optionsStore.isTwelveHour &&
+ !this.optionsStore.options.display.components.minutes &&
+ !this.optionsStore.options.display.keepOpen &&
+ !this.optionsStore.options.display.inline
+ ) {
+ this.display.hide();
+ } else {
+ this.do(e, ActionTypes.showClock);
+ }
+ }
+
+ /**
+ * Common function to manipulate {@link lastPicked} by `unit`.
+ * @param lastPicked
+ * @param unit
+ * @param value Value to change by
+ */
+ private manipulateAndSet(lastPicked: DateTime, unit: Unit, value = 1) {
+ const newDate = lastPicked.manipulate(value, unit);
+ if (this.validation.isValid(newDate, unit)) {
+ this.dates.setValue(newDate, this.dates.lastPickedIndex);
+ }
+ }
+
+ private handleSelectCalendarMode(
+ action:
+ | ActionTypes.selectMonth
+ | ActionTypes.selectYear
+ | ActionTypes.selectDecade,
+ currentTarget: HTMLElement
+ ) {
+ const value = +currentTarget.dataset.value;
+ switch (action) {
+ case ActionTypes.selectMonth:
+ this.optionsStore.viewDate.month = value;
+ break;
+ case ActionTypes.selectYear:
+ case ActionTypes.selectDecade:
+ this.optionsStore.viewDate.year = value;
+ break;
+ }
+
+ if (
+ this.optionsStore.currentCalendarViewMode ===
+ this.optionsStore.minimumCalendarViewMode
+ ) {
+ this.dates.setValue(
+ this.optionsStore.viewDate,
+ this.dates.lastPickedIndex
+ );
+
+ if (!this.optionsStore.options.display.inline) {
+ this.display.hide();
+ }
+ } else {
+ this.display._showMode(-1);
+ }
+ }
+
+ private handleToggle(currentTarget: HTMLElement) {
+ if (
+ currentTarget.getAttribute('title') ===
+ this.optionsStore.options.localization.selectDate
+ ) {
+ currentTarget.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.selectTime
+ );
+ currentTarget.innerHTML = this.display._iconTag(
+ this.optionsStore.options.display.icons.time
+ ).outerHTML;
+
+ this.display._updateCalendarHeader();
+ this.optionsStore.refreshCurrentView();
+ } else {
+ currentTarget.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.selectDate
+ );
+ currentTarget.innerHTML = this.display._iconTag(
+ this.optionsStore.options.display.icons.date
+ ).outerHTML;
+ if (this.display._hasTime) {
+ this.handleShowClockContainers(ActionTypes.showClock);
+ this.display._update('clock');
+ }
+ }
+
+ this.display.widget
+ .querySelectorAll(
+ `.${Namespace.css.dateContainer}, .${Namespace.css.timeContainer}`
+ )
+ .forEach((htmlElement: HTMLElement) => Collapse.toggle(htmlElement));
+ this._eventEmitters.viewUpdate.emit();
+ const visible = this.display.widget.querySelector(
+ `.${Namespace.css.collapsing} > div[style*="display: grid"]`
+ ) as HTMLElement;
+ visible?.focus();
+ }
+
+ private handleSelectDay(currentTarget: HTMLElement) {
+ const day = this.optionsStore.viewDate.clone;
+ if (currentTarget.classList.contains(Namespace.css.old)) {
+ day.manipulate(-1, Unit.month);
+ }
+ if (currentTarget.classList.contains(Namespace.css.new)) {
+ day.manipulate(1, Unit.month);
+ }
+
+ day.date = +currentTarget.dataset.day;
+ if (this.optionsStore.options.dateRange) this.handleDateRange(day);
+ else if (this.optionsStore.options.multipleDates) {
+ this.handleMultiDate(day);
+ } else {
+ this.dates.setValue(day, this.dates.lastPickedIndex);
+ }
+
+ if (
+ !this.display._hasTime &&
+ !this.optionsStore.options.display.keepOpen &&
+ !this.optionsStore.options.display.inline &&
+ !this.optionsStore.options.multipleDates &&
+ !this.optionsStore.options.dateRange
+ ) {
+ this.display.hide();
+ }
+ }
+
+ private handleMultiDate(day: DateTime) {
+ let index = this.dates.pickedIndex(day, Unit.date);
+ if (index !== -1) {
+ this.dates.setValue(null, index); //deselect multi-date
+ } else {
+ index = this.dates.lastPickedIndex + 1;
+ if (this.dates.picked.length === 0) index = 0;
+
+ this.dates.setValue(day, index);
+ }
+ }
+
+ private handleDateRange(day: DateTime) {
+ switch (this.dates.picked.length) {
+ case 2: {
+ this.dates.clear();
+ break;
+ }
+ case 1: {
+ const other = this.dates.picked[0];
+ if (day.getTime() === other.getTime()) {
+ this.dates.clear();
+ break;
+ }
+ if (day.isBefore(other)) {
+ this.dates.setValue(day, 0);
+ this.dates.setValue(other, 1);
+ return;
+ } else {
+ this.dates.setValue(day, 1);
+ return;
+ }
+ }
+ }
+
+ this.dates.setValue(day, 0);
+ }
+}
diff --git a/src/js/bootstrap-datetimepicker.js b/src/js/bootstrap-datetimepicker.js
deleted file mode 100644
index 091a10ecd..000000000
--- a/src/js/bootstrap-datetimepicker.js
+++ /dev/null
@@ -1,1096 +0,0 @@
-/**
- * version 2.1.32
- * @license
- * =========================================================
- * bootstrap-datetimepicker.js
- * http://www.eyecon.ro/bootstrap-datepicker
- * =========================================================
- * Copyright 2012 Stefan Petre
- *
- * Contributions:
- * - updated for Bootstrap v3 by Jonathan Peterson (@Eonasdan) and (almost)
- * completely rewritten to use Momentjs
- * - based on tarruda's bootstrap-datepicker
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================
- */
-; (function (factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD is used - Register as an anonymous module.
- define(['jquery', 'moment'], factory);
- } else {
- // AMD is not used - Attempt to fetch dependencies from scope.
- if(!jQuery){
- throw 'bootstrap-datetimepicker requires jQuery to be loaded first';
- }else if(!moment) {
- throw 'bootstrap-datetimepicker requires moment.js to be loaded first';
- }else{
- factory(jQuery, moment);
- }
- }
-}
-
-(function ($, moment) {
- if (typeof moment === 'undefined') {
- alert("momentjs is requried");
- throw new Error('momentjs is required');
- };
-
- var dpgId = 0,
-
- pMoment = moment,
-
-// ReSharper disable once InconsistentNaming
- DateTimePicker = function (element, options) {
- var defaults = {
- pickDate: true,
- pickTime: true,
- useMinutes: true,
- useSeconds: false,
- minuteStepping: 1,
- startDate: new pMoment({ y: 1970 }),
- endDate: new pMoment().add(50, "y"),
- collapse: true,
- language: "en",
- defaultDate: "",
- disabledDates: [],
- enabledDates: false,
- icons: {},
- useStrict: false,
- direction: "auto"
- },
-
- icons = {
- time: 'glyphicon glyphicon-time',
- date: 'glyphicon glyphicon-calendar',
- up: 'glyphicon glyphicon-chevron-up',
- down: 'glyphicon glyphicon-chevron-down'
- },
-
- picker = this,
-
- init = function () {
-
- var icon = false, i, dDate, longDateFormat;
- picker.options = $.extend({}, defaults, options);
- picker.options.icons = $.extend({}, icons, picker.options.icons);
-
- picker.element = $(element);
-
- dataToOptions();
-
- if (!(picker.options.pickTime || picker.options.pickDate))
- throw new Error('Must choose at least one picker');
-
- picker.id = dpgId++;
- pMoment.lang(picker.options.language);
- picker.date = pMoment();
- picker.unset = false;
- picker.isInput = picker.element.is('input');
- picker.component = false;
-
- if (picker.element.hasClass('input-group')) {
- if (picker.element.find('.datepickerbutton').size() == 0) {//in case there is more then one 'input-group-addon` #48
- picker.component = picker.element.find("[class^='input-group-']");
- }
- else {
- picker.component = picker.element.find('.datepickerbutton');
- }
- }
- picker.format = picker.options.format;
-
- longDateFormat = pMoment()._lang._longDateFormat;
-
- if (!picker.format) {
- if (picker.isInput) picker.format = picker.element.data('format');
- else picker.format = picker.element.find('input').data('format');
- if (!picker.format) {
- picker.format = (picker.options.pickDate ? longDateFormat.L : '');
- if (picker.options.pickDate && picker.options.pickTime) picker.format += ' ';
- picker.format += (picker.options.pickTime ? longDateFormat.LT : '');
- if (picker.options.useSeconds) {
- if (~longDateFormat.LT.indexOf(' A')) {
- picker.format = picker.format.split(" A")[0] + ":ss A";
- }
- else {
- picker.format += ':ss';
- }
- }
- }
- }
-
- picker.options.use24hours = picker.format.toLowerCase().indexOf("a") < 1;
-
- if (picker.component) icon = picker.component.find('span');
-
- if (picker.options.pickTime) {
- if (icon) icon.addClass(picker.options.icons.time);
- }
- if (picker.options.pickDate) {
- if (icon) {
- icon.removeClass(picker.options.icons.time);
- icon.addClass(picker.options.icons.date);
- }
- }
-
- picker.widget = $(getTemplate(picker.options.pickDate, picker.options.pickTime, picker.options.collapse)).appendTo('body');
- picker.minViewMode = picker.options.minViewMode || picker.element.data('date-minviewmode') || 0;
- if (typeof picker.minViewMode === 'string') {
- switch (picker.minViewMode) {
- case 'months':
- picker.minViewMode = 1;
- break;
- case 'years':
- picker.minViewMode = 2;
- break;
- default:
- picker.minViewMode = 0;
- break;
- }
- }
- picker.viewMode = picker.options.viewMode || picker.element.data('date-viewmode') || 0;
- if (typeof picker.viewMode === 'string') {
- switch (picker.viewMode) {
- case 'months':
- picker.viewMode = 1;
- break;
- case 'years':
- picker.viewMode = 2;
- break;
- default:
- picker.viewMode = 0;
- break;
- }
- }
-
- for (i = 0; i < picker.options.disabledDates.length; i++) {
- dDate = picker.options.disabledDates[i];
- dDate = pMoment(dDate);
- //if this is not a valid date then set it to the startdate -1 day so it's disabled.
- if (!dDate.isValid()) dDate = pMoment(picker.options.startDate).subtract(1, "day");
- picker.options.disabledDates[i] = dDate.format("L");
- }
-
- for (i = 0; i < picker.options.enabledDates.length; i++) {
- dDate = picker.options.enabledDates[i];
- dDate = pMoment(dDate);
- //if this is not a valid date then set it to the startdate -1 day so it's disabled.
- if (!dDate.isValid()) dDate = pMoment(picker.options.startDate).subtract(1, "day");
- picker.options.enabledDates[i] = dDate.format("L");
- }
- picker.startViewMode = picker.viewMode;
- picker.setStartDate(picker.options.startDate || picker.element.data('date-startdate'));
- picker.setEndDate(picker.options.endDate || picker.element.data('date-enddate'));
- fillDow();
- fillMonths();
- fillHours();
- fillMinutes();
- fillSeconds();
- update();
- showMode();
- attachDatePickerEvents();
- if (picker.options.defaultDate !== "") picker.setValue(picker.options.defaultDate);
- },
-
- dataToOptions = function () {
- if (picker.element.is('input')) {
- var eData = picker.element.data();
- }
- else {
- var eData = picker.element.find('input').data();
- }
-
- if (eData.pickdate !== undefined) picker.options.pickDate = eData.pickdate;
- if (eData.picktime !== undefined) picker.options.pickTime = eData.picktime;
- if (eData.useminutes !== undefined) picker.options.useMinutes = eData.useminutes;
- if (eData.useseconds !== undefined) picker.options.useSeconds = eData.useseconds;
- if (eData.minutestepping !== undefined) picker.options.minuteStepping = eData.minutestepping;
- if (eData.startdate !== undefined) picker.options.startDate = eData.startdate;
- if (eData.enddate !== undefined) picker.options.endDate = eData.enddate;
- if (eData.collapse !== undefined) picker.options.collapse = eData.collapse;
- if (eData.language !== undefined) picker.options.language = eData.language;
- if (eData.defaultdate !== undefined) picker.options.defaultDate = eData.defaultdate;
- if (eData.disableddates !== undefined) picker.options.disabledDates = eData.disableddates;
- if (eData.enableddates !== undefined) picker.options.enabledDates = eData.enableddates;
- if (eData.icons !== undefined) picker.options.icons = eData.icons;
- if (eData.usestrict !== undefined) picker.options.useStrict = eData.usestrict;
- },
-
- place = function () {
- var position = 'absolute',
- offset = picker.component ? picker.component.offset() : picker.element.offset(), $window = $(window);
- picker.width = picker.component ? picker.component.outerWidth() : picker.element.outerWidth();
- offset.top = offset.top + picker.element.outerHeight();
-
- // if (picker.options.direction === 'up' || picker.options.direction === 'auto' && offset.top + picker.widget.height() > $window.height()) {
- // offset.top -= picker.widget.height() + picker.element.outerHeight();
- // picker.widget.addClass('up');
- // } else if (picker.options.direction === 'down' || picker.options.direction === 'auto' && offset.top + picker.widget.height() <= $window.height()) {
- // offset.top += picker.element.outerHeight();
- // picker.widget.addClass('down');
- // }
-
- if (picker.options.width !== undefined) {
- picker.widget.width(picker.options.width);
- }
-
- if (picker.options.orientation === 'left') {
- picker.widget.addClass('left-oriented');
- offset.left = offset.left - picker.widget.width() + 20;
- }
-
- if (isInFixed()) {
- position = 'fixed';
- offset.top -= $window.scrollTop();
- offset.left -= $window.scrollLeft();
- }
-
- if ($window.width() < offset.left + picker.widget.outerWidth()) {
- offset.right = $window.width() - offset.left - picker.width;
- offset.left = 'auto';
- picker.widget.addClass('pull-right');
- } else {
- offset.right = 'auto';
- picker.widget.removeClass('pull-right');
- }
-
- picker.widget.css({
- position: position,
- top: offset.top,
- left: offset.left,
- right: offset.right
- });
- },
-
- notifyChange = function (oldDate, eventType) {
- picker.element.trigger({
- type: 'change.dp',
- date: pMoment(picker.date),
- oldDate: pMoment(oldDate)
- });
-
- if (eventType !== 'change')
- picker.element.change();
- },
-
- notifyError = function (date) {
- picker.element.trigger({
- type: 'error.dp',
- date: pMoment(date)
- });
- },
-
- update = function (newDate) {
- pMoment.lang(picker.options.language);
- var dateStr = newDate;
- if (!dateStr) {
- if (picker.isInput) {
- dateStr = picker.element.val();
- } else {
- dateStr = picker.element.find('input').val();
- }
- if (dateStr) picker.date = pMoment(dateStr, picker.format, picker.options.useStrict);
- if (!picker.date) picker.date = pMoment();
- }
- picker.viewDate = pMoment(picker.date).startOf("month");
- fillDate();
- fillTime();
- },
-
- fillDow = function () {
- pMoment.lang(picker.options.language);
- var html = $(''), weekdaysMin = pMoment.weekdaysMin(), i;
- if (pMoment()._lang._week.dow == 0) { // starts on Sunday
- for(i = 0; i < 7; i++) {
- html.append('' + weekdaysMin[i] + ' ');
- }
- } else {
- for (i = 1; i < 8; i++) {
- if (i == 7) {
- html.append('' + weekdaysMin[0] + ' ');
- } else {
- html.append('' + weekdaysMin[i] + ' ');
- }
- }
- }
- picker.widget.find('.datepicker-days thead').append(html);
- },
-
- fillMonths = function () {
- pMoment.lang(picker.options.language);
- var html = '', i = 0, monthsShort = pMoment.monthsShort();
- while (i < 12) {
- html += '' + monthsShort[i++] + ' ';
- }
- picker.widget.find('.datepicker-months td').append(html);
- },
-
- fillDate = function () {
- pMoment.lang(picker.options.language);
- var year = picker.viewDate.year(),
- month = picker.viewDate.month(),
- startYear = picker.options.startDate.year(),
- startMonth = picker.options.startDate.month(),
- endYear = picker.options.endDate.year(),
- endMonth = picker.options.endDate.month(),
- prevMonth, nextMonth, html = [], row, clsName, i, days, yearCont, currentYear, months = pMoment.months();
-
- picker.widget.find('.datepicker-days').find('.disabled').removeClass('disabled');
- picker.widget.find('.datepicker-months').find('.disabled').removeClass('disabled');
- picker.widget.find('.datepicker-years').find('.disabled').removeClass('disabled');
-
- picker.widget.find('.datepicker-days th:eq(1)').text(
- months[month] + ' ' + year);
-
- prevMonth = pMoment(picker.viewDate).subtract("months", 1);
- days = prevMonth.daysInMonth();
- prevMonth.date(days).startOf('week');
- if ((year == startYear && month <= startMonth) || year < startYear) {
- picker.widget.find('.datepicker-days th:eq(0)').addClass('disabled');
- }
- if ((year == endYear && month >= endMonth) || year > endYear) {
- picker.widget.find('.datepicker-days th:eq(2)').addClass('disabled');
- }
-
- nextMonth = pMoment(prevMonth).add(42, "d");
- while (prevMonth.isBefore(nextMonth)) {
- if (prevMonth.weekday() === pMoment().startOf('week').weekday()) {
- row = $(' ');
- html.push(row);
- }
- clsName = '';
- if (prevMonth.year() < year || (prevMonth.year() == year && prevMonth.month() < month)) {
- clsName += ' old';
- } else if (prevMonth.year() > year || (prevMonth.year() == year && prevMonth.month() > month)) {
- clsName += ' new';
- }
- if (prevMonth.isSame(pMoment({ y: picker.date.year(), M: picker.date.month(), d: picker.date.date() }))) {
- clsName += ' active';
- }
- if (isInDisableDates(prevMonth) || !isInEnableDates(prevMonth)) {
- clsName += ' disabled';
- }
- row.append('' + prevMonth.date() + ' ');
- prevMonth.add(1, "d");
- }
- picker.widget.find('.datepicker-days tbody').empty().append(html);
- currentYear = pMoment().year(), months = picker.widget.find('.datepicker-months')
- .find('th:eq(1)').text(year).end().find('span').removeClass('active');
- if (currentYear === year) {
- months.eq(pMoment().month()).addClass('active');
- }
- if (currentYear - 1 < startYear) {
- picker.widget.find('.datepicker-months th:eq(0)').addClass('disabled');
- }
- if (currentYear + 1 > endYear) {
- picker.widget.find('.datepicker-months th:eq(2)').addClass('disabled');
- }
- for (i = 0; i < 12; i++) {
- if ((year == startYear && startMonth > i) || (year < startYear)) {
- $(months[i]).addClass('disabled');
- } else if ((year == endYear && endMonth < i) || (year > endYear)) {
- $(months[i]).addClass('disabled');
- }
- }
-
- html = '';
- year = parseInt(year / 10, 10) * 10;
- yearCont = picker.widget.find('.datepicker-years').find(
- 'th:eq(1)').text(year + '-' + (year + 9)).end().find('td');
- picker.widget.find('.datepicker-years').find('th').removeClass('disabled');
- if (startYear > year) {
- picker.widget.find('.datepicker-years').find('th:eq(0)').addClass('disabled');
- }
- if (endYear < year + 9) {
- picker.widget.find('.datepicker-years').find('th:eq(2)').addClass('disabled');
- }
- year -= 1;
- for (i = -1; i < 11; i++) {
- html += '' + year + ' ';
- year += 1;
- }
- yearCont.html(html);
- },
-
- fillHours = function () {
- pMoment.lang(picker.options.language);
- var table = picker.widget.find('.timepicker .timepicker-hours table'), html = '', current, i, j;
- table.parent().hide();
- if (picker.options.use24hours) {
- current = 0;
- for (i = 0; i < 6; i += 1) {
- html += ' ';
- for (j = 0; j < 4; j += 1) {
- html += '' + padLeft(current.toString()) + ' ';
- current++;
- }
- html += ' ';
- }
- }
- else {
- current = 1;
- for (i = 0; i < 3; i += 1) {
- html += '';
- for (j = 0; j < 4; j += 1) {
- html += '' + padLeft(current.toString()) + ' ';
- current++;
- }
- html += ' ';
- }
- }
- table.html(html);
- },
-
- fillMinutes = function () {
- var table = picker.widget.find('.timepicker .timepicker-minutes table'), html = '', current = 0, i, j;
- table.parent().hide();
- for (i = 0; i < 5; i++) {
- html += '';
- for (j = 0; j < 4; j += 1) {
- html += '' + padLeft(current.toString()) + ' ';
- current += 3;
- }
- html += ' ';
- }
- table.html(html);
- },
-
- fillSeconds = function () {
- var table = picker.widget.find('.timepicker .timepicker-seconds table'), html = '', current = 0, i, j;
- table.parent().hide();
- for (i = 0; i < 5; i++) {
- html += '';
- for (j = 0; j < 4; j += 1) {
- html += '' + padLeft(current.toString()) + ' ';
- current += 3;
- }
- html += ' ';
- }
- table.html(html);
- },
-
- fillTime = function () {
- if (!picker.date) return;
- var timeComponents = picker.widget.find('.timepicker span[data-time-component]'),
- hour = picker.date.hours(),
- period = 'AM';
- if (!picker.options.use24hours) {
- if (hour >= 12) period = 'PM';
- if (hour === 0) hour = 12;
- else if (hour != 12) hour = hour % 12;
- picker.widget.find('.timepicker [data-action=togglePeriod]').text(period);
- }
- timeComponents.filter('[data-time-component=hours]').text(padLeft(hour));
- timeComponents.filter('[data-time-component=minutes]').text(padLeft(picker.date.minutes()));
- timeComponents.filter('[data-time-component=seconds]').text(padLeft(picker.date.second()));
- },
-
- click = function (e) {
- e.stopPropagation();
- e.preventDefault();
- picker.unset = false;
- var target = $(e.target).closest('span, td, th'), month, year, step, day, oldDate = pMoment(picker.date);
- if (target.length === 1) {
- if (!target.is('.disabled')) {
- switch (target[0].nodeName.toLowerCase()) {
- case 'th':
- switch (target[0].className) {
- case 'switch':
- showMode(1);
- break;
- case 'prev':
- case 'next':
- step = dpGlobal.modes[picker.viewMode].navStep;
- if (target[0].className === 'prev') step = step * -1;
- picker.viewDate.add(step, dpGlobal.modes[picker.viewMode].navFnc);
- fillDate();
- break;
- }
- break;
- case 'span':
- if (target.is('.month')) {
- month = target.parent().find('span').index(target);
- picker.viewDate.month(month);
- } else {
- year = parseInt(target.text(), 10) || 0;
- picker.viewDate.year(year);
- }
- if (picker.viewMode !== 0) {
- picker.date = pMoment({
- y: picker.viewDate.year(),
- M: picker.viewDate.month(),
- d: picker.viewDate.date(),
- h: picker.date.hours(),
- m: picker.date.minutes()
- });
- notifyChange(oldDate, e.type);
- }
- showMode(-1);
- fillDate();
- break;
- case 'td':
- if (target.is('.day')) {
- day = parseInt(target.text(), 10) || 1;
- month = picker.viewDate.month();
- year = picker.viewDate.year();
- if (target.is('.old')) {
- if (month === 0) {
- month = 11;
- year -= 1;
- } else {
- month -= 1;
- }
- } else if (target.is('.new')) {
- if (month == 11) {
- month = 0;
- year += 1;
- } else {
- month += 1;
- }
- }
- picker.date = pMoment({
- y: year,
- M: month,
- d: day,
- h: picker.date.hours(),
- m: picker.date.minutes()
- }
- );
- picker.viewDate = pMoment({
- y: year, M: month, d: Math.min(28, day)
- });
- fillDate();
- set();
- notifyChange(oldDate, e.type);
- }
- break;
- }
- }
- }
- },
-
- actions = {
- incrementHours: function () {
- checkDate("add", "hours", 1);
- },
-
- incrementMinutes: function () {
- checkDate("add", "minutes", picker.options.minuteStepping);
- },
-
- incrementSeconds: function () {
- checkDate("add", "seconds", 1);
- },
-
- decrementHours: function () {
- checkDate("subtract", "hours", 1);
- },
-
- decrementMinutes: function () {
- checkDate("subtract", "minutes", picker.options.minuteStepping);
- },
-
- decrementSeconds: function () {
- checkDate("subtract", "seconds", 1);
- },
-
- togglePeriod: function () {
- var hour = picker.date.hours();
- if (hour >= 12) hour -= 12;
- else hour += 12;
- picker.date.hours(hour);
- },
-
- showPicker: function () {
- picker.widget.find('.timepicker > div:not(.timepicker-picker)').hide();
- picker.widget.find('.timepicker .timepicker-picker').show();
- },
-
- showHours: function () {
- picker.widget.find('.timepicker .timepicker-picker').hide();
- picker.widget.find('.timepicker .timepicker-hours').show();
- },
-
- showMinutes: function () {
- picker.widget.find('.timepicker .timepicker-picker').hide();
- picker.widget.find('.timepicker .timepicker-minutes').show();
- },
-
- showSeconds: function () {
- picker.widget.find('.timepicker .timepicker-picker').hide();
- picker.widget.find('.timepicker .timepicker-seconds').show();
- },
-
- selectHour: function (e) {
- picker.date.hours(parseInt($(e.target).text(), 10));
- actions.showPicker.call(picker);
- },
-
- selectMinute: function (e) {
- picker.date.minutes(parseInt($(e.target).text(), 10));
- actions.showPicker.call(picker);
- },
-
- selectSecond: function (e) {
- picker.date.seconds(parseInt($(e.target).text(), 10));
- actions.showPicker.call(picker);
- }
- },
-
- doAction = function (e) {
- var oldDate = pMoment(picker.date), action = $(e.currentTarget).data('action'), rv = actions[action].apply(picker, arguments);
- stopEvent(e);
- if (!picker.date) picker.date = pMoment({ y: 1970 });
- set();
- fillTime();
- notifyChange(oldDate, e.type);
- return rv;
- },
-
- stopEvent = function (e) {
- e.stopPropagation();
- e.preventDefault();
- },
-
- change = function (e) {
- pMoment.lang(picker.options.language);
- var input = $(e.target), oldDate = pMoment(picker.date), newDate = pMoment(input.val(), picker.format, picker.options.useStrict);
- if (newDate.isValid() && !isInDisableDates(newDate) && isInEnableDates(newDate)) {
- update();
- picker.setValue(newDate);
- notifyChange(oldDate, e.type);
- set();
- }
- else {
- picker.viewDate = oldDate;
- notifyChange(oldDate, e.type);
- notifyError(newDate);
- picker.unset = true;
- }
- },
-
- showMode = function (dir) {
- if (dir) {
- picker.viewMode = Math.max(picker.minViewMode, Math.min(2, picker.viewMode + dir));
- }
-
- picker.widget.find('.datepicker > div').hide().filter('.datepicker-' + dpGlobal.modes[picker.viewMode].clsName).show();
- },
-
- attachDatePickerEvents = function () {
- var $this, $parent, expanded, closed, collapseData;
- picker.widget.on('click', '.datepicker *', $.proxy(click, this)); // this handles date picker clicks
- picker.widget.on('click', '[data-action]', $.proxy(doAction, this)); // this handles time picker clicks
- picker.widget.on('mousedown', $.proxy(stopEvent, this));
- if (picker.options.pickDate && picker.options.pickTime) {
- picker.widget.on('click.togglePicker', '.accordion-toggle', function (e) {
- e.stopPropagation();
- $this = $(this);
- $parent = $this.closest('ul');
- expanded = $parent.find('.in');
- closed = $parent.find('.collapse:not(.in)');
-
- if (expanded && expanded.length) {
- collapseData = expanded.data('collapse');
- if (collapseData && collapseData.transitioning) return;
- expanded.collapse('hide');
- closed.collapse('show');
- $this.find('span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date);
- picker.element.find('.input-group-addon span').toggleClass(picker.options.icons.time + ' ' + picker.options.icons.date);
- }
- });
- }
- if (picker.isInput) {
- picker.element.on({
- 'focus': $.proxy(picker.show, this),
- 'change': $.proxy(change, this),
- 'blur': $.proxy(picker.hide, this)
- });
- } else {
- picker.element.on({
- 'change': $.proxy(change, this)
- }, 'input');
- if (picker.component) {
- picker.component.on('click', $.proxy(picker.show, this));
- } else {
- picker.element.on('click', $.proxy(picker.show, this));
- }
- }
- },
-
- attachDatePickerGlobalEvents = function () {
- $(window).on(
- 'resize.datetimepicker' + picker.id, $.proxy(place, this));
- if (!picker.isInput) {
- $(document).on(
- 'mousedown.datetimepicker' + picker.id, $.proxy(picker.hide, this));
- }
- },
-
- detachDatePickerEvents = function () {
- picker.widget.off('click', '.datepicker *', picker.click);
- picker.widget.off('click', '[data-action]');
- picker.widget.off('mousedown', picker.stopEvent);
- if (picker.options.pickDate && picker.options.pickTime) {
- picker.widget.off('click.togglePicker');
- }
- if (picker.isInput) {
- picker.element.off({
- 'focus': picker.show,
- 'change': picker.change
- });
- } else {
- picker.element.off({
- 'change': picker.change
- }, 'input');
- if (picker.component) {
- picker.component.off('click', picker.show);
- } else {
- picker.element.off('click', picker.show);
- }
- }
- },
-
- detachDatePickerGlobalEvents = function () {
- $(window).off('resize.datetimepicker' + picker.id);
- if (!picker.isInput) {
- $(document).off('mousedown.datetimepicker' + picker.id);
- }
- },
-
- isInFixed = function () {
- if (picker.element) {
- var parents = picker.element.parents(), inFixed = false, i;
- for (i = 0; i < parents.length; i++) {
- if ($(parents[i]).css('position') == 'fixed') {
- inFixed = true;
- break;
- }
- }
- ;
- return inFixed;
- } else {
- return false;
- }
- },
-
- set = function () {
- pMoment.lang(picker.options.language);
- var formatted = '', input;
- if (!picker.unset) formatted = pMoment(picker.date).format(picker.format);
- if (!picker.isInput) {
- if (picker.component) {
- input = picker.element.find('input');
- input.val(formatted);
- }
- picker.element.data('date', formatted);
- } else {
- picker.element.val(formatted);
- }
- if (!picker.options.pickTime) picker.hide();
- },
-
- checkDate = function (direction, unit, amount) {
- pMoment.lang(picker.options.language);
- var newDate;
- if (direction == "add") {
- newDate = pMoment(picker.date);
- if (newDate.hours() == 23) newDate.add(amount, unit);
- newDate.add(amount, unit);
- }
- else {
- newDate = pMoment(picker.date).subtract(amount, unit);
- }
- if (isInDisableDates(pMoment(newDate.subtract(amount, unit))) || isInDisableDates(newDate)) {
- notifyError(newDate.format(picker.format));
- return;
- }
-
- if (direction == "add") {
- picker.date.add(amount, unit);
- }
- else {
- picker.date.subtract(amount, unit);
- }
- picker.unset = false;
- },
-
- isInDisableDates = function (date) {
- pMoment.lang(picker.options.language);
- if (date.isAfter(picker.options.endDate) || date.isBefore(picker.options.startDate)) return true;
- var disabled = picker.options.disabledDates, i;
- for (i in disabled) {
- if (disabled[i] == pMoment(date).format("L")) {
- return true;
- }
- }
- return false;
- },
-
- isInEnableDates = function (date) {
- pMoment.lang(picker.options.language);
- var enabled = picker.options.enabledDates, i;
- if (enabled.length) {
- for (i in enabled) {
- if (enabled[i] == pMoment(date).format("L")) {
- return true;
- }
- }
- return false;
- }
- return enabled === false ? true : false;
- },
- padLeft = function (string) {
- string = string.toString();
- if (string.length >= 2) return string;
- else return '0' + string;
- },
-
- getTemplate = function (pickDate, pickTime, collapse) {
- if (pickDate && pickTime) {
- return (
- ''
- );
- } else if (pickTime) {
- return (
- ''
- );
- } else {
- return (
- ''
- );
- }
- },
-
- dpGlobal = {
- modes: [
- {
- clsName: 'days',
- navFnc: 'month',
- navStep: 1
- },
- {
- clsName: 'months',
- navFnc: 'year',
- navStep: 1
- },
- {
- clsName: 'years',
- navFnc: 'year',
- navStep: 10
- }],
- headTemplate:
- '' +
- '' +
- '‹ › ' +
- ' ' +
- ' ',
- contTemplate:
- ' '
- },
-
- tpGlobal = {
- hourTemplate: ' ',
- minuteTemplate: ' ',
- secondTemplate: ' '
- };
-
- dpGlobal.template =
- '' +
- '
' + dpGlobal.headTemplate + '
' +
- '
' +
- '' +
- '
' + dpGlobal.headTemplate + dpGlobal.contTemplate + '
' +
- '
' +
- '' +
- '
' + dpGlobal.headTemplate + dpGlobal.contTemplate + '
' +
- '
';
-
- tpGlobal.getTemplate = function () {
- return (
- '' +
- '
' +
- '' +
- ' ' +
- ' ' +
- '' + (picker.options.useMinutes ? ' ' : '') + ' ' +
- (picker.options.useSeconds ?
- ' ' : '') +
- (picker.options.use24hours ? '' : ' ') +
- ' ' +
- '' +
- '' + tpGlobal.hourTemplate + ' ' +
- ': ' +
- '' + (picker.options.useMinutes ? tpGlobal.minuteTemplate : '00 ') + ' ' +
- (picker.options.useSeconds ?
- ': ' + tpGlobal.secondTemplate + ' ' : '') +
- (picker.options.use24hours ? '' : ' ' +
- ' ') +
- ' ' +
- '' +
- ' ' +
- ' ' +
- '' + (picker.options.useMinutes ? ' ' : '') + ' ' +
- (picker.options.useSeconds ?
- ' ' : '') +
- (picker.options.use24hours ? '' : ' ') +
- ' ' +
- '
' +
- '
' +
- '' +
- '' +
- (picker.options.useSeconds ?
- '' : '')
- );
- };
-
- picker.destroy = function () {
- detachDatePickerEvents();
- detachDatePickerGlobalEvents();
- picker.widget.remove();
- picker.element.removeData('DateTimePicker');
- if (picker.component)
- picker.component.removeData('DateTimePicker');
- };
-
- picker.show = function (e) {
- picker.widget.show();
- picker.height = picker.component ? picker.component.outerHeight() : picker.element.outerHeight();
- place();
- picker.element.trigger({
- type: 'show.dp',
- date: pMoment(picker.date)
- });
- attachDatePickerGlobalEvents();
- if (e) {
- stopEvent(e);
- }
- },
-
- picker.disable = function () {
- var input = picker.element.find('input');
- if(input.prop('disabled')) return;
-
- input.prop('disabled', true);
- detachDatePickerEvents();
- },
-
- picker.enable = function () {
- var input = picker.element.find('input');
- if(!input.prop('disabled')) return;
-
- input.prop('disabled', false);
- attachDatePickerEvents();
- },
-
- picker.hide = function (event) {
- if (event && $(event.target).is(picker.element.attr("id")))
- return;
- // Ignore event if in the middle of a picker transition
- var collapse = picker.widget.find('.collapse'), i, collapseData;
- for (i = 0; i < collapse.length; i++) {
- collapseData = collapse.eq(i).data('collapse');
- if (collapseData && collapseData.transitioning)
- return;
- }
- picker.widget.hide();
- picker.viewMode = picker.startViewMode;
- showMode();
- picker.element.trigger({
- type: 'hide.dp',
- date: pMoment(picker.date)
- });
- detachDatePickerGlobalEvents();
- },
-
- picker.setValue = function (newDate) {
- pMoment.lang(picker.options.language);
- if (!newDate) {
- picker.unset = true;
- set();
- } else {
- picker.unset = false;
- }
- if (!pMoment.isMoment(newDate)) newDate = pMoment(newDate);
- if (newDate.isValid()) {
- picker.date = newDate;
- set();
- picker.viewDate = pMoment({ y: picker.date.year(), M: picker.date.month() });
- fillDate();
- fillTime();
- }
- else {
- notifyError(newDate);
- }
- },
-
- picker.getDate = function () {
- if (picker.unset) return null;
- return picker.date;
- },
-
- picker.setDate = function (date) {
- if (!date) {
- picker.setValue(null);
- } else {
- picker.setValue(pMoment(date));
- }
- },
-
- picker.setEnabledDates = function (dates) {
- if (!dates) picker.options.enabledDates = false;
- else picker.options.enabledDates = dates;
- if (picker.viewDate) update();
- },
-
- picker.setEndDate = function (date) {
- if (date == undefined) return;
- picker.options.endDate = pMoment(date);
- if (picker.viewDate) update();
- },
-
- picker.setStartDate = function (date) {
- if (date == undefined) return;
- picker.options.startDate = pMoment(date);
- if (picker.viewDate) update();
- };
-
- init();
- };
-
- $.fn.datetimepicker = function (options) {
- return this.each(function () {
- var $this = $(this), data = $this.data('DateTimePicker');
- if (!data) $this.data('DateTimePicker', new DateTimePicker(this, options));
- });
- };
-}));
diff --git a/src/js/dates.ts b/src/js/dates.ts
new file mode 100644
index 000000000..0772a0417
--- /dev/null
+++ b/src/js/dates.ts
@@ -0,0 +1,298 @@
+import { DateTime, getFormatByUnit, Unit } from './datetime';
+import Namespace from './utilities/namespace';
+import {
+ ChangeEvent,
+ FailEvent,
+ ParseErrorEvent,
+} from './utilities/event-types';
+import Validation from './validation';
+import { serviceLocator } from './utilities/service-locator';
+import { EventEmitters } from './utilities/event-emitter';
+import { OptionsStore } from './utilities/optionsStore';
+import { OptionConverter } from './utilities/optionConverter';
+
+export default class Dates {
+ private _dates: DateTime[] = [];
+ private optionsStore: OptionsStore;
+ private validation: Validation;
+ private _eventEmitters: EventEmitters;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.validation = serviceLocator.locate(Validation);
+ this._eventEmitters = serviceLocator.locate(EventEmitters);
+ }
+
+ /**
+ * Returns the array of selected dates
+ */
+ get picked(): DateTime[] {
+ return [...this._dates];
+ }
+
+ /**
+ * Returns the last picked value.
+ */
+ get lastPicked(): DateTime {
+ return this._dates[this.lastPickedIndex]?.clone;
+ }
+
+ /**
+ * Returns the length of picked dates -1 or 0 if none are selected.
+ */
+ get lastPickedIndex(): number {
+ if (this._dates.length === 0) return 0;
+ return this._dates.length - 1;
+ }
+
+ /**
+ * Formats a DateTime object to a string. Used when setting the input value.
+ * @param date
+ */
+ formatInput(date: DateTime): string {
+ if (!date) return '';
+ date.localization = this.optionsStore.options.localization;
+ return date.format();
+ }
+
+ /**
+ * parse the value into a DateTime object.
+ * this can be overwritten to supply your own parsing.
+ */
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ parseInput(value: any): DateTime {
+ try {
+ return OptionConverter.dateConversion(
+ value,
+ 'input',
+ this.optionsStore.options.localization
+ );
+ } catch (e) {
+ this._eventEmitters.triggerEvent.emit({
+ type: Namespace.events.error,
+ reason: Namespace.errorMessages.failedToParseInput,
+ format: this.optionsStore.options.localization.format,
+ value: value,
+ } as ParseErrorEvent);
+ return undefined;
+ }
+ }
+
+ /**
+ * Tries to convert the provided value to a DateTime object.
+ * If value is null|undefined then clear the value of the provided index (or 0).
+ * @param value Value to convert or null|undefined
+ * @param index When using multidates this is the index in the array
+ */
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ setFromInput(value: any, index?: number) {
+ if (!value) {
+ this.setValue(undefined, index);
+ return;
+ }
+ const converted = this.parseInput(value);
+ if (converted) {
+ converted.setLocalization(this.optionsStore.options.localization);
+ this.setValue(converted, index);
+ }
+ }
+
+ /**
+ * Adds a new DateTime to selected dates array
+ * @param date
+ */
+ add(date: DateTime): void {
+ this._dates.push(date);
+ }
+
+ /**
+ * Returns true if the `targetDate` is part of the selected dates array.
+ * If `unit` is provided then a granularity to that unit will be used.
+ * @param targetDate
+ * @param unit
+ */
+ isPicked(targetDate: DateTime, unit?: Unit): boolean {
+ if (!DateTime.isValid(targetDate)) return false;
+ if (!unit)
+ return this._dates.find((x) => x.isSame(targetDate)) !== undefined;
+
+ const format = getFormatByUnit(unit);
+
+ const innerDateFormatted = targetDate.format(format);
+
+ return (
+ this._dates
+ .map((x) => x.format(format))
+ .find((x) => x === innerDateFormatted) !== undefined
+ );
+ }
+
+ /**
+ * Returns the index at which `targetDate` is in the array.
+ * This is used for updating or removing a date when multi-date is used
+ * If `unit` is provided then a granularity to that unit will be used.
+ * @param targetDate
+ * @param unit
+ */
+ pickedIndex(targetDate: DateTime, unit?: Unit): number {
+ if (!DateTime.isValid(targetDate)) return -1;
+ if (!unit)
+ return this._dates.map((x) => x.valueOf()).indexOf(targetDate.valueOf());
+
+ const format = getFormatByUnit(unit);
+
+ const innerDateFormatted = targetDate.format(format);
+
+ return this._dates.map((x) => x.format(format)).indexOf(innerDateFormatted);
+ }
+
+ /**
+ * Clears all selected dates.
+ */
+ clear() {
+ this.optionsStore.unset = true;
+ this._eventEmitters.triggerEvent.emit({
+ type: Namespace.events.change,
+ date: undefined,
+ oldDate: this.lastPicked,
+ isClear: true,
+ isValid: true,
+ } as ChangeEvent);
+ this._dates = [];
+ if (this.optionsStore.input) this.optionsStore.input.value = '';
+ this._eventEmitters.updateDisplay.emit('all');
+ }
+
+ /**
+ * Find the "book end" years given a `year` and a `factor`
+ * @param factor e.g. 100 for decades
+ * @param year e.g. 2021
+ */
+ static getStartEndYear(
+ factor: number,
+ year: number
+ ): [number, number, number] {
+ const step = factor / 10,
+ startYear = Math.floor(year / factor) * factor,
+ endYear = startYear + step * 9,
+ focusValue = Math.floor(year / step) * step;
+ return [startYear, endYear, focusValue];
+ }
+
+ updateInput(target?: DateTime) {
+ if (!this.optionsStore.input) return;
+
+ let newValue = this.formatInput(target);
+ if (
+ this.optionsStore.options.multipleDates ||
+ this.optionsStore.options.dateRange
+ ) {
+ newValue = this._dates
+ .map((d) => this.formatInput(d))
+ .join(this.optionsStore.options.multipleDatesSeparator);
+ }
+ if (this.optionsStore.input.value != newValue)
+ this.optionsStore.input.value = newValue;
+ }
+
+ /**
+ * Attempts to either clear or set the `target` date at `index`.
+ * If the `target` is null then the date will be cleared.
+ * If multi-date is being used then it will be removed from the array.
+ * If `target` is valid and multi-date is used then if `index` is
+ * provided the date at that index will be replaced, otherwise it is appended.
+ * @param target
+ * @param index
+ */
+ setValue(target?: DateTime, index?: number): void {
+ const noIndex = typeof index === 'undefined',
+ isClear = !target && noIndex;
+ let oldDate = this.optionsStore.unset ? null : this._dates[index]?.clone;
+ if (!oldDate && !this.optionsStore.unset && noIndex && isClear) {
+ oldDate = this.lastPicked;
+ }
+
+ if (target && oldDate?.isSame(target)) {
+ this.updateInput(target);
+ return;
+ }
+
+ // case of calling setValue(null)
+ if (!target) {
+ this._setValueNull(isClear, index, oldDate);
+ return;
+ }
+
+ index = index || 0;
+ target = target.clone;
+
+ // minute stepping is being used, force the minute to the closest value
+ if (this.optionsStore.options.stepping !== 1) {
+ target.minutes =
+ Math.round(target.minutes / this.optionsStore.options.stepping) *
+ this.optionsStore.options.stepping;
+ target.startOf(Unit.minutes);
+ }
+
+ const onUpdate = (isValid: boolean) => {
+ this._dates[index] = target;
+ this._eventEmitters.updateViewDate.emit(target.clone);
+
+ this.updateInput(target);
+
+ this.optionsStore.unset = false;
+ this._eventEmitters.updateDisplay.emit('all');
+ this._eventEmitters.triggerEvent.emit({
+ type: Namespace.events.change,
+ date: target,
+ oldDate,
+ isClear,
+ isValid: isValid,
+ } as ChangeEvent);
+ };
+
+ if (
+ this.validation.isValid(target) &&
+ this.validation.dateRangeIsValid(this.picked, index, target)
+ ) {
+ onUpdate(true);
+ return;
+ }
+
+ if (this.optionsStore.options.keepInvalid) {
+ onUpdate(false);
+ }
+
+ this._eventEmitters.triggerEvent.emit({
+ type: Namespace.events.error,
+ reason: Namespace.errorMessages.failedToSetInvalidDate,
+ date: target,
+ oldDate,
+ } as FailEvent);
+ }
+
+ private _setValueNull(isClear: boolean, index: number, oldDate: DateTime) {
+ if (
+ !this.optionsStore.options.multipleDates ||
+ this._dates.length === 1 ||
+ isClear
+ ) {
+ this.optionsStore.unset = true;
+ this._dates = [];
+ } else {
+ this._dates.splice(index, 1);
+ }
+
+ this.updateInput();
+
+ this._eventEmitters.triggerEvent.emit({
+ type: Namespace.events.change,
+ date: undefined,
+ oldDate,
+ isClear,
+ isValid: true,
+ } as ChangeEvent);
+
+ this._eventEmitters.updateDisplay.emit('all');
+ }
+}
diff --git a/src/js/datetime.ts b/src/js/datetime.ts
new file mode 100644
index 000000000..cae73de2d
--- /dev/null
+++ b/src/js/datetime.ts
@@ -0,0 +1,1047 @@
+import { FormatLocalization } from './utilities/options';
+import Namespace from './utilities/namespace';
+import DefaultFormatLocalization from './utilities/default-format-localization';
+
+type parsedTime = {
+ afternoon?: boolean;
+ year?: number;
+ month?: number;
+ day?: number;
+ hours?: number;
+ minutes?: number;
+ seconds?: number;
+ milliseconds?: number;
+ zone?: {
+ offset: number;
+ };
+};
+
+export enum Unit {
+ seconds = 'seconds',
+ minutes = 'minutes',
+ hours = 'hours',
+ date = 'date',
+ month = 'month',
+ year = 'year',
+}
+
+const twoDigitTemplate = {
+ month: '2-digit',
+ day: '2-digit',
+ year: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit',
+};
+
+export interface DateTimeFormatOptions extends Intl.DateTimeFormatOptions {
+ timeStyle?: 'short' | 'medium' | 'long';
+ dateStyle?: 'short' | 'medium' | 'long' | 'full';
+ numberingSystem?: string;
+}
+
+/**
+ * Returns an Intl format object based on the provided object
+ * @param unit
+ */
+export const getFormatByUnit = (unit: Unit): object => {
+ switch (unit) {
+ case 'date':
+ return { dateStyle: 'short' };
+ case 'month':
+ return {
+ month: 'numeric',
+ year: 'numeric',
+ };
+ case 'year':
+ return { year: 'numeric' };
+ }
+};
+
+/**
+ * Attempts to guess the hour cycle of the given local
+ * @param locale
+ */
+export const guessHourCycle = (locale: string): Intl.LocaleHourCycleKey => {
+ if (!locale) return 'h12';
+
+ // noinspection SpellCheckingInspection
+ const template = {
+ hour: '2-digit',
+ minute: '2-digit',
+ numberingSystem: 'latn',
+ };
+
+ const dt = new DateTime().setLocalization({ locale });
+ dt.hours = 0;
+
+ const start = dt.parts(undefined, template).hour;
+
+ //midnight is 12 so en-US style 12 AM
+ if (start === '12') return 'h12';
+ //midnight is 24 is from 00-24
+ if (start === '24') return 'h24';
+
+ dt.hours = 23;
+ const end = dt.parts(undefined, template).hour;
+
+ //if midnight is 00 and hour 23 is 11 then
+ if (start === '00' && end === '11') return 'h11';
+
+ if (start === '00' && end === '23') return 'h23';
+
+ console.warn(
+ `couldn't determine hour cycle for ${locale}. start: ${start}. end: ${end}`
+ );
+
+ return undefined;
+};
+
+interface FormatMatch {
+ parser: (obj: parsedTime, input: number) => void;
+ pattern?: RegExp;
+}
+
+interface FormatMatchString {
+ parser: (obj: parsedTime, input: string) => void;
+ pattern?: RegExp;
+}
+
+interface FormatExpression {
+ t: FormatMatchString;
+ T: FormatMatchString;
+ fff: FormatMatch;
+ s: FormatMatch;
+ ss: FormatMatch;
+ m: FormatMatch;
+ mm: FormatMatch;
+ H: FormatMatch;
+ h: FormatMatch;
+ HH: FormatMatch;
+ hh: FormatMatch;
+ d: FormatMatch;
+ dd: FormatMatch;
+ Do: FormatMatchString;
+ M: FormatMatch;
+ MM: FormatMatch;
+ MMM: FormatMatchString;
+ MMMM: FormatMatchString;
+ y: FormatMatch;
+ yy: FormatMatch;
+ yyyy: FormatMatch;
+}
+
+/**
+ * For the most part this object behaves exactly the same way
+ * as the native Date object with a little extra spice.
+ */
+export class DateTime extends Date {
+ localization: FormatLocalization = DefaultFormatLocalization;
+
+ /**
+ * Chainable way to set the {@link locale}
+ * @param value
+ * @deprecated use setLocalization with a FormatLocalization object instead
+ */
+ setLocale(value: string): this {
+ if (!this.localization) {
+ this.localization = DefaultFormatLocalization;
+ this.localization.locale = value;
+ }
+ return this;
+ }
+
+ /**
+ * Chainable way to set the {@link localization}
+ * @param value
+ */
+ setLocalization(value: FormatLocalization): this {
+ this.localization = value;
+ return this;
+ }
+
+ /**
+ * Converts a plain JS date object to a DateTime object.
+ * Doing this allows access to format, etc.
+ * @param date
+ * @param locale this parameter is deprecated. Use formatLocalization instead.
+ * @param formatLocalization
+ */
+ static convert(
+ date: Date,
+ locale = 'default',
+ formatLocalization: FormatLocalization = undefined
+ ): DateTime {
+ if (!date) throw new Error(`A date is required`);
+
+ if (!formatLocalization) {
+ formatLocalization = DefaultFormatLocalization;
+ formatLocalization.locale = locale;
+ }
+
+ return new DateTime(
+ date.getFullYear(),
+ date.getMonth(),
+ date.getDate(),
+ date.getHours(),
+ date.getMinutes(),
+ date.getSeconds(),
+ date.getMilliseconds()
+ ).setLocalization(formatLocalization);
+ }
+
+ /**
+ * Native date manipulations are not pure functions. This function creates a duplicate of the DateTime object.
+ */
+ get clone() {
+ return new DateTime(
+ this.year,
+ this.month,
+ this.date,
+ this.hours,
+ this.minutes,
+ this.seconds,
+ this.getMilliseconds()
+ ).setLocalization(this.localization);
+ }
+
+ static isValid(d): boolean {
+ if (d === undefined || JSON.stringify(d) === 'null') return false;
+ if (d.constructor.name === DateTime.name) return true;
+ return false;
+ }
+
+ /**
+ * Sets the current date to the start of the {@link unit} provided
+ * Example: Consider a date of "April 30, 2021, 11:45:32.984 AM" => new DateTime(2021, 3, 30, 11, 45, 32, 984).startOf('month')
+ * would return April 1, 2021, 12:00:00.000 AM (midnight)
+ * @param unit
+ * @param startOfTheWeek Allows for the changing the start of the week.
+ */
+ startOf(unit: Unit | 'weekDay', startOfTheWeek = 0): this {
+ if (this[unit] === undefined)
+ throw new Error(`Unit '${unit}' is not valid`);
+ switch (unit) {
+ case 'seconds':
+ this.setMilliseconds(0);
+ break;
+ case 'minutes':
+ this.setSeconds(0, 0);
+ break;
+ case 'hours':
+ this.setMinutes(0, 0, 0);
+ break;
+ case 'date':
+ this.setHours(0, 0, 0, 0);
+ break;
+ case 'weekDay': {
+ this.startOf(Unit.date);
+ if (this.weekDay === startOfTheWeek) break;
+ const goBack = (this.weekDay - startOfTheWeek + 7) % 7;
+ this.manipulate(goBack * -1, Unit.date);
+ break;
+ }
+ case 'month':
+ this.startOf(Unit.date);
+ this.setDate(1);
+ break;
+ case 'year':
+ this.startOf(Unit.date);
+ this.setMonth(0, 1);
+ break;
+ }
+ return this;
+ }
+
+ /**
+ * Sets the current date to the end of the {@link unit} provided
+ * Example: Consider a date of "April 30, 2021, 11:45:32.984 AM" => new DateTime(2021, 3, 30, 11, 45, 32, 984).endOf('month')
+ * would return April 30, 2021, 11:59:59.999 PM
+ * @param unit
+ * @param startOfTheWeek
+ */
+ endOf(unit: Unit | 'weekDay', startOfTheWeek = 0): this {
+ if (this[unit] === undefined)
+ throw new Error(`Unit '${unit}' is not valid`);
+ switch (unit) {
+ case 'seconds':
+ this.setMilliseconds(999);
+ break;
+ case 'minutes':
+ this.setSeconds(59, 999);
+ break;
+ case 'hours':
+ this.setMinutes(59, 59, 999);
+ break;
+ case 'date':
+ this.setHours(23, 59, 59, 999);
+ break;
+ case 'weekDay': {
+ this.endOf(Unit.date);
+ const endOfWeek = 6 + startOfTheWeek;
+ if (this.weekDay === endOfWeek) break;
+ this.manipulate(endOfWeek - this.weekDay, Unit.date);
+ break;
+ }
+ case 'month':
+ this.endOf(Unit.date);
+ this.manipulate(1, Unit.month);
+ this.setDate(0);
+ break;
+ case 'year':
+ this.endOf(Unit.date);
+ this.setMonth(11, 31);
+ break;
+ }
+ return this;
+ }
+
+ /**
+ * Change a {@link unit} value. Value can be positive or negative
+ * Example: Consider a date of "April 30, 2021, 11:45:32.984 AM" => new DateTime(2021, 3, 30, 11, 45, 32, 984).manipulate(1, 'month')
+ * would return May 30, 2021, 11:45:32.984 AM
+ * @param value A positive or negative number
+ * @param unit
+ */
+ manipulate(value: number, unit: Unit): this {
+ if (this[unit] === undefined)
+ throw new Error(`Unit '${unit}' is not valid`);
+ this[unit] += value;
+ return this;
+ }
+
+ /**
+ * Return true if {@link compare} is before this date
+ * @param compare The Date/DateTime to compare
+ * @param unit If provided, uses {@link startOf} for
+ * comparison.
+ */
+ isBefore(compare: DateTime, unit?: Unit): boolean {
+ // If the comparisons is undefined, return false
+ if (!DateTime.isValid(compare)) return false;
+
+ if (!unit) return this.valueOf() < compare.valueOf();
+ if (this[unit] === undefined)
+ throw new Error(`Unit '${unit}' is not valid`);
+ return (
+ this.clone.startOf(unit).valueOf() < compare.clone.startOf(unit).valueOf()
+ );
+ }
+
+ /**
+ * Return true if {@link compare} is after this date
+ * @param compare The Date/DateTime to compare
+ * @param unit If provided, uses {@link startOf} for
+ * comparison.
+ */
+ isAfter(compare: DateTime, unit?: Unit): boolean {
+ // If the comparisons is undefined, return false
+ if (!DateTime.isValid(compare)) return false;
+
+ if (!unit) return this.valueOf() > compare.valueOf();
+ if (this[unit] === undefined)
+ throw new Error(`Unit '${unit}' is not valid`);
+ return (
+ this.clone.startOf(unit).valueOf() > compare.clone.startOf(unit).valueOf()
+ );
+ }
+
+ /**
+ * Return true if {@link compare} is same this date
+ * @param compare The Date/DateTime to compare
+ * @param unit If provided, uses {@link startOf} for
+ * comparison.
+ */
+ isSame(compare: DateTime, unit?: Unit): boolean {
+ // If the comparisons is undefined, return false
+ if (!DateTime.isValid(compare)) return false;
+
+ if (!unit) return this.valueOf() === compare.valueOf();
+ if (this[unit] === undefined)
+ throw new Error(`Unit '${unit}' is not valid`);
+ compare = DateTime.convert(compare);
+ return (
+ this.clone.startOf(unit).valueOf() === compare.startOf(unit).valueOf()
+ );
+ }
+
+ /**
+ * Check if this is between two other DateTimes, optionally looking at unit scale. The match is exclusive.
+ * @param left
+ * @param right
+ * @param unit.
+ * @param inclusivity. A [ indicates inclusion of a value. A ( indicates exclusion.
+ * If the inclusivity parameter is used, both indicators must be passed.
+ */
+ isBetween(
+ left: DateTime,
+ right: DateTime,
+ unit?: Unit,
+ inclusivity: '()' | '[]' | '(]' | '[)' = '()'
+ ): boolean {
+ // If one of the comparisons is undefined, return false
+ if (!DateTime.isValid(left) || !DateTime.isValid(right)) return false;
+ // If a unit is provided and is not a valid property of the DateTime object, throw an error
+ if (unit && this[unit] === undefined) {
+ throw new Error(`Unit '${unit}' is not valid`);
+ }
+
+ const leftInclusivity = inclusivity[0] === '(';
+ const rightInclusivity = inclusivity[1] === ')';
+
+ const isLeftInRange = leftInclusivity
+ ? this.isAfter(left, unit)
+ : !this.isBefore(left, unit);
+ const isRightInRange = rightInclusivity
+ ? this.isBefore(right, unit)
+ : !this.isAfter(right, unit);
+
+ return isLeftInRange && isRightInRange;
+ }
+
+ /**
+ * Returns flattened object of the date. Does not include literals
+ * @param locale
+ * @param template
+ */
+ parts(
+ locale = this.localization.locale,
+ template: Record = { dateStyle: 'full', timeStyle: 'long' }
+ ): Record {
+ const parts = {};
+ new Intl.DateTimeFormat(locale, template)
+ .formatToParts(this)
+ .filter((x) => x.type !== 'literal')
+ .forEach((x) => (parts[x.type] = x.value));
+ return parts;
+ }
+
+ /**
+ * Shortcut to Date.getSeconds()
+ */
+ get seconds(): number {
+ return this.getSeconds();
+ }
+
+ /**
+ * Shortcut to Date.setSeconds()
+ */
+ set seconds(value: number) {
+ this.setSeconds(value);
+ }
+
+ /**
+ * Returns two digit hours
+ */
+ get secondsFormatted(): string {
+ return this.parts(undefined, twoDigitTemplate).second;
+ }
+
+ /**
+ * Shortcut to Date.getMinutes()
+ */
+ get minutes(): number {
+ return this.getMinutes();
+ }
+
+ /**
+ * Shortcut to Date.setMinutes()
+ */
+ set minutes(value: number) {
+ this.setMinutes(value);
+ }
+
+ /**
+ * Returns two digit minutes
+ */
+ get minutesFormatted(): string {
+ return this.parts(undefined, twoDigitTemplate).minute;
+ }
+
+ /**
+ * Shortcut to Date.getHours()
+ */
+ get hours(): number {
+ return this.getHours();
+ }
+
+ /**
+ * Shortcut to Date.setHours()
+ */
+ set hours(value: number) {
+ this.setHours(value);
+ }
+
+ /**
+ * Returns two digit hour, e.g. 01...10
+ * @param hourCycle Providing an hour cycle will change 00 to 24 depending on the given value.
+ */
+ getHoursFormatted(hourCycle: Intl.LocaleHourCycleKey = 'h12') {
+ return this.parts(undefined, { ...twoDigitTemplate, hourCycle: hourCycle })
+ .hour;
+ }
+
+ /**
+ * Get the meridiem of the date. E.g. AM or PM.
+ * If the {@link locale} provides a "dayPeriod" then this will be returned,
+ * otherwise it will return AM or PM.
+ * @param locale
+ */
+ meridiem(locale: string = this.localization.locale): string {
+ return new Intl.DateTimeFormat(locale, {
+ hour: 'numeric',
+ hour12: true,
+ })
+ .formatToParts(this)
+ .find((p) => p.type === 'dayPeriod')?.value;
+ }
+
+ /**
+ * Shortcut to Date.getDate()
+ */
+ get date(): number {
+ return this.getDate();
+ }
+
+ /**
+ * Shortcut to Date.setDate()
+ */
+ set date(value: number) {
+ this.setDate(value);
+ }
+
+ /**
+ * Return two digit date
+ */
+ get dateFormatted(): string {
+ return this.parts(undefined, twoDigitTemplate).day;
+ }
+
+ /**
+ * Shortcut to Date.getDay()
+ */
+ get weekDay(): number {
+ return this.getDay();
+ }
+
+ /**
+ * Shortcut to Date.getMonth()
+ */
+ get month(): number {
+ return this.getMonth();
+ }
+
+ /**
+ * Shortcut to Date.setMonth()
+ */
+ set month(value: number) {
+ const targetMonth = new Date(this.year, value + 1);
+ targetMonth.setDate(0);
+ const endOfMonth = targetMonth.getDate();
+ if (this.date > endOfMonth) {
+ this.date = endOfMonth;
+ }
+ this.setMonth(value);
+ }
+
+ /**
+ * Return two digit, human expected month. E.g. January = 1, December = 12
+ */
+ get monthFormatted(): string {
+ return this.parts(undefined, twoDigitTemplate).month;
+ }
+
+ /**
+ * Shortcut to Date.getFullYear()
+ */
+ get year(): number {
+ return this.getFullYear();
+ }
+
+ /**
+ * Shortcut to Date.setFullYear()
+ */
+ set year(value: number) {
+ this.setFullYear(value);
+ }
+
+ // borrowed a bunch of stuff from Luxon
+ /**
+ * Gets the week of the year
+ */
+ get week(): number {
+ const ordinal = this.computeOrdinal(),
+ weekday = this.getUTCDay();
+
+ let weekNumber = Math.floor((ordinal - weekday + 10) / 7);
+
+ if (weekNumber < 1) {
+ weekNumber = this.weeksInWeekYear();
+ } else if (weekNumber > this.weeksInWeekYear()) {
+ weekNumber = 1;
+ }
+
+ return weekNumber;
+ }
+
+ /**
+ * Returns the number of weeks in the year
+ */
+ weeksInWeekYear() {
+ const p1 =
+ (this.year +
+ Math.floor(this.year / 4) -
+ Math.floor(this.year / 100) +
+ Math.floor(this.year / 400)) %
+ 7,
+ last = this.year - 1,
+ p2 =
+ (last +
+ Math.floor(last / 4) -
+ Math.floor(last / 100) +
+ Math.floor(last / 400)) %
+ 7;
+ return p1 === 4 || p2 === 3 ? 53 : 52;
+ }
+
+ dateToDataValue(): string {
+ if (!DateTime.isValid(this)) return '';
+
+ return `${this.year}-${this.month.toString().padStart(2, '0')}-${this.date
+ .toString()
+ .padStart(2, '0')}`;
+ }
+
+ /**
+ * Returns true or false depending on if the year is a leap year or not.
+ */
+ get isLeapYear() {
+ return (
+ this.year % 4 === 0 && (this.year % 100 !== 0 || this.year % 400 === 0)
+ );
+ }
+
+ private computeOrdinal() {
+ return (
+ this.date +
+ (this.isLeapYear ? this.leapLadder : this.nonLeapLadder)[this.month]
+ );
+ }
+
+ private nonLeapLadder = [
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
+ ];
+ private leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];
+
+ //#region CDF stuff
+
+ private dateTimeRegex =
+ //is regex cannot be simplified beyond what it already is
+ /(\[[^[\]]*])|y{1,4}|M{1,4}|d{1,4}|H{1,2}|h{1,2}|t|T|m{1,2}|s{1,2}|f{3}/g; //NOSONAR
+
+ private formattingTokens =
+ /(\[[^[\]]*])|([-_:/.,()\s]+)|(T|t|yyyy|yy?|MM?M?M?|Do|dd?d?d?|hh?|HH?|mm?|ss?)/g; //NOSONAR is regex cannot be simplified beyond what it already is
+
+ /**
+ * Returns a list of month values based on the current locale
+ */
+ private getAllMonths(
+ format: '2-digit' | 'numeric' | 'long' | 'short' | 'narrow' = 'long'
+ ) {
+ const applyFormat = new Intl.DateTimeFormat(this.localization.locale, {
+ month: format,
+ }).format;
+ return [...Array(12).keys()].map((m) => applyFormat(new Date(2021, m)));
+ }
+
+ /**
+ * Replaces an expanded token set (e.g. LT/LTS)
+ */
+ private replaceTokens(formatStr, formats) {
+ /***
+ * _ => match
+ * a => first capture group. Anything between [ and ]
+ * b => second capture group
+ */
+ return formatStr.replace(
+ /(\[[^[\]]*])|(LTS?|l{1,4}|L{1,4})/g,
+ (_, a, b) => {
+ const B = b && b.toUpperCase();
+ return a || formats[B] || DefaultFormatLocalization.dateFormats[B];
+ }
+ );
+ }
+
+ private match2 = /\d\d/; // 00 - 99
+ private match3 = /\d{3}/; // 000 - 999
+ private match4 = /\d{4}/; // 0000 - 9999
+ private match1to2 = /\d\d?/; // 0 - 99
+ private matchSigned = /[+-]?\d+/; // -inf - inf
+ private matchOffset = /[+-]\d\d:?(\d\d)?|Z/; // +00:00 -00:00 +0000 or -0000 +00 or Z
+ private matchWord = /[^\d_:/,\-()\s]+/; // Word
+
+ private parseTwoDigitYear(input: number) {
+ return input + (input > 68 ? 1900 : 2000);
+ }
+
+ private offsetFromString(input: string) {
+ if (!input) return 0;
+ if (input === 'Z') return 0;
+ const [first, second, third] = input.match(/([+-]|\d\d)/g);
+ const minutes = +second * 60 + (+third || 0);
+ const signed = first === '+' ? -minutes : minutes;
+ return minutes === 0 ? 0 : signed; // eslint-disable-line no-nested-ternary
+ }
+
+ /**
+ * z = -4, zz = -04, zzz = -0400
+ * @param date
+ * @param style
+ * @private
+ */
+ private zoneInformation(date: DateTime, style: 'z' | 'zz' | 'zzz') {
+ let name = date
+ .parts(this.localization.locale, { timeZoneName: 'longOffset' })
+ .timeZoneName.replace('GMT', '')
+ .replace(':', '');
+
+ const negative = name.includes('-');
+
+ name = name.replace('-', '');
+
+ if (style === 'z') name = name.substring(1, 2);
+ else if (style === 'zz') name = name.substring(0, 2);
+
+ return `${negative ? '-' : ''}${name}`;
+ }
+
+ private zoneExpressions = [
+ this.matchOffset,
+ (obj, input) => {
+ obj.offset = this.offsetFromString(input);
+ },
+ ];
+
+ private addInput(property) {
+ return (obj, input) => {
+ obj[property] = +input;
+ };
+ }
+
+ private getLocaleAfternoon(): string {
+ return new Intl.DateTimeFormat(this.localization.locale, {
+ hour: 'numeric',
+ hour12: true,
+ })
+ .formatToParts(new Date(2022, 3, 4, 13))
+ .find((p) => p.type === 'dayPeriod')
+ ?.value?.replace(/\s+/g, ' ');
+ }
+
+ private meridiemMatch(input: string) {
+ return input.toLowerCase() === this.getLocaleAfternoon().toLowerCase();
+ }
+
+ private expressions: FormatExpression = {
+ t: {
+ pattern: undefined, //this.matchWord,
+ parser: (obj, input) => {
+ obj.afternoon = this.meridiemMatch(input);
+ },
+ },
+ T: {
+ pattern: undefined, //this.matchWord,
+ parser: (obj, input) => {
+ obj.afternoon = this.meridiemMatch(input);
+ },
+ },
+ fff: {
+ pattern: this.match3,
+ parser: (obj, input) => {
+ obj.milliseconds = +input;
+ },
+ },
+ s: {
+ pattern: this.match1to2,
+ parser: this.addInput('seconds'),
+ },
+ ss: {
+ pattern: this.match1to2,
+ parser: this.addInput('seconds'),
+ },
+ m: {
+ pattern: this.match1to2,
+ parser: this.addInput('minutes'),
+ },
+ mm: {
+ pattern: this.match1to2,
+ parser: this.addInput('minutes'),
+ },
+ H: {
+ pattern: this.match1to2,
+ parser: this.addInput('hours'),
+ },
+ h: {
+ pattern: this.match1to2,
+ parser: this.addInput('hours'),
+ },
+ HH: {
+ pattern: this.match1to2,
+ parser: this.addInput('hours'),
+ },
+ hh: {
+ pattern: this.match1to2,
+ parser: this.addInput('hours'),
+ },
+ d: {
+ pattern: this.match1to2,
+ parser: this.addInput('day'),
+ },
+ dd: {
+ pattern: this.match2,
+ parser: this.addInput('day'),
+ },
+ Do: {
+ pattern: this.matchWord,
+ parser: (obj, input) => {
+ obj.day = +(input.match(/\d+/)[0] || 1);
+ if (!this.localization.ordinal) return;
+ for (let i = 1; i <= 31; i += 1) {
+ if (this.localization.ordinal(i).replace(/[[\]]/g, '') === input) {
+ obj.day = i;
+ }
+ }
+ },
+ },
+ M: {
+ pattern: this.match1to2,
+ parser: this.addInput('month'),
+ },
+ MM: {
+ pattern: this.match2,
+ parser: this.addInput('month'),
+ },
+ MMM: {
+ pattern: this.matchWord,
+ parser: (obj, input) => {
+ const months = this.getAllMonths();
+ const monthsShort = this.getAllMonths('short');
+ const matchIndex =
+ (monthsShort || months.map((_) => _.slice(0, 3))).indexOf(input) + 1;
+ if (matchIndex < 1) {
+ throw new Error();
+ }
+ obj.month = matchIndex % 12 || matchIndex;
+ },
+ },
+ MMMM: {
+ pattern: this.matchWord,
+ parser: (obj, input) => {
+ const months = this.getAllMonths();
+ const matchIndex = months.indexOf(input) + 1;
+ if (matchIndex < 1) {
+ throw new Error();
+ }
+ obj.month = matchIndex % 12 || matchIndex;
+ },
+ },
+ y: {
+ pattern: this.matchSigned,
+ parser: this.addInput('year'),
+ },
+ yy: {
+ pattern: this.match2,
+ parser: (obj, input) => {
+ obj.year = this.parseTwoDigitYear(+input);
+ },
+ },
+ yyyy: {
+ pattern: this.match4,
+ parser: this.addInput('year'),
+ },
+ // z: this.zoneExpressions,
+ // zz: this.zoneExpressions,
+ // zzz: this.zoneExpressions
+ };
+
+ private correctHours(time) {
+ const { afternoon } = time;
+ if (afternoon !== undefined) {
+ const { hours } = time;
+ if (afternoon) {
+ if (hours < 12) {
+ time.hours += 12;
+ }
+ } else if (hours === 12) {
+ time.hours = 0;
+ }
+ delete time.afternoon;
+ }
+ }
+
+ private makeParser(format: string) {
+ format = this.replaceTokens(format, this.localization.dateFormats);
+ const matchArray = format.match(this.formattingTokens);
+ const { length } = matchArray;
+ const expressionArray: (FormatMatch | string)[] = [];
+ for (let i = 0; i < length; i += 1) {
+ const token = matchArray[i];
+ const expression = this.expressions[token] as FormatMatch;
+ if (expression?.parser) {
+ expressionArray[i] = expression;
+ } else {
+ expressionArray[i] = (token as string).replace(/^\[[^[\]]*]$/g, '');
+ }
+ }
+
+ return (input: string): parsedTime => {
+ const time = {
+ hours: 0,
+ minutes: 0,
+ seconds: 0,
+ milliseconds: 0,
+ };
+ for (let i = 0, start = 0; i < length; i += 1) {
+ const token = expressionArray[i];
+ if (typeof token === 'string') {
+ start += token.length;
+ } else {
+ const part = input.slice(start);
+ let value = part;
+
+ if (token.pattern) {
+ const match = token.pattern.exec(part);
+ value = match[0];
+ }
+ token.parser.call(this, time, value);
+ input = input.replace(value, '');
+ }
+ }
+ this.correctHours(time);
+ return time;
+ };
+ }
+
+ /**
+ * Attempts to create a DateTime from a string.
+ * @param input date as string
+ * @param localization provides the date template the string is in via the format property
+ */
+ //eslint-disable-next-line @typescript-eslint/no-unused-vars
+ static fromString(input: string, localization: FormatLocalization): DateTime {
+ if (!localization?.format) {
+ Namespace.errorMessages.customDateFormatError('No format was provided');
+ }
+ try {
+ const dt = new DateTime();
+ dt.setLocalization(localization);
+ if (['x', 'X'].indexOf(localization.format) > -1)
+ return new DateTime((localization.format === 'X' ? 1000 : 1) * +input);
+
+ input = input.replace(/\s+/g, ' ');
+ const parser = dt.makeParser(localization.format);
+ const { year, month, day, hours, minutes, seconds, milliseconds, zone } =
+ parser(input);
+ const d = day || (!year && !month ? dt.getDate() : 1);
+ const y = year || dt.getFullYear();
+ let M = 0;
+ if (!(year && !month)) {
+ M = month > 0 ? month - 1 : dt.getMonth();
+ }
+ if (zone) {
+ return new DateTime(
+ Date.UTC(
+ y,
+ M,
+ d,
+ hours,
+ minutes,
+ seconds,
+ milliseconds + zone.offset * 60 * 1000
+ )
+ );
+ }
+ return new DateTime(y, M, d, hours, minutes, seconds, milliseconds);
+ } catch (e) {
+ Namespace.errorMessages.customDateFormatError(
+ `Unable to parse provided input: ${input}, format: ${localization.format}`
+ );
+ }
+ }
+
+ /**
+ * Returns a string format.
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat
+ * for valid templates and locale objects
+ * @param template An optional object. If provided, method will use Intl., otherwise the localizations format properties
+ * @param locale Can be a string or an array of strings. Uses browser defaults otherwise.
+ */
+ format(
+ template?: DateTimeFormatOptions | string,
+ locale = this.localization.locale
+ ): string {
+ if (template && typeof template === 'object')
+ return new Intl.DateTimeFormat(locale, template).format(this);
+
+ const formatString = this.replaceTokens(
+ //try template first
+ template ||
+ //otherwise try localization format
+ this.localization.format ||
+ //otherwise try date + time
+ `${DefaultFormatLocalization.dateFormats.L}, ${DefaultFormatLocalization.dateFormats.LT}`,
+ this.localization.dateFormats
+ );
+
+ const formatter = (template) =>
+ new Intl.DateTimeFormat(this.localization.locale, template).format(this);
+
+ if (!this.localization.hourCycle)
+ this.localization.hourCycle = guessHourCycle(this.localization.locale);
+
+ //if the format asks for a twenty-four-hour string but the hour cycle is not, then make a base guess
+ const HHCycle = this.localization.hourCycle.startsWith('h1')
+ ? 'h24'
+ : this.localization.hourCycle;
+ const hhCycle = this.localization.hourCycle.startsWith('h2')
+ ? 'h12'
+ : this.localization.hourCycle;
+
+ const matches = {
+ y: this.year,
+ yy: formatter({ year: '2-digit' }),
+ yyyy: this.year,
+ M: formatter({ month: 'numeric' }),
+ MM: this.monthFormatted,
+ MMM: this.getAllMonths('short')[this.getMonth()],
+ MMMM: this.getAllMonths()[this.getMonth()],
+ d: this.date,
+ dd: this.dateFormatted,
+ ddd: formatter({ weekday: 'short' }),
+ dddd: formatter({ weekday: 'long' }),
+ H: this.getHours(),
+ HH: this.getHoursFormatted(HHCycle),
+ h: this.hours > 12 ? this.hours - 12 : this.hours,
+ hh: this.getHoursFormatted(hhCycle),
+ t: this.meridiem(),
+ T: this.meridiem().toUpperCase(),
+ m: this.minutes,
+ mm: this.minutesFormatted,
+ s: this.seconds,
+ ss: this.secondsFormatted,
+ fff: this.getMilliseconds(),
+ // z: this.zoneInformation(dateTime, 'z'), //-4
+ // zz: this.zoneInformation(dateTime, 'zz'), //-04
+ // zzz: this.zoneInformation(dateTime, 'zzz') //-0400
+ };
+
+ return formatString
+ .replace(this.dateTimeRegex, (match, $1) => {
+ return $1 || matches[match];
+ })
+ .replace(/\[/g, '')
+ .replace(/]/g, '');
+ }
+
+ //#endregion CDF stuff
+}
diff --git a/src/js/display/calendar/date-display.ts b/src/js/display/calendar/date-display.ts
new file mode 100644
index 000000000..9c1d57882
--- /dev/null
+++ b/src/js/display/calendar/date-display.ts
@@ -0,0 +1,340 @@
+import { DateTime, Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Validation from '../../validation';
+import Dates from '../../dates';
+import { Paint } from '../index';
+import { serviceLocator } from '../../utilities/service-locator';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+
+/**
+ * Creates and updates the grid for `date`
+ */
+export default class DateDisplay {
+ private optionsStore: OptionsStore;
+ private dates: Dates;
+ private validation: Validation;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.dates = serviceLocator.locate(Dates);
+ this.validation = serviceLocator.locate(Validation);
+ }
+
+ /**
+ * Build the container html for the display
+ * @private
+ */
+ getPicker(): HTMLElement {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.daysContainer);
+ container.role = 'grid';
+
+ container.append(...this._daysOfTheWeek());
+
+ if (this.optionsStore.options.display.calendarWeeks) {
+ const div = document.createElement('div');
+ div.classList.add(Namespace.css.calendarWeeks, Namespace.css.noHighlight);
+ container.appendChild(div);
+ }
+
+ const { rangeHoverEvent, rangeHoverOutEvent } =
+ this.handleMouseEvents(container);
+
+ for (let i = 0; i < 42; i++) {
+ if (i !== 0 && i % 7 === 0) {
+ if (this.optionsStore.options.display.calendarWeeks) {
+ const div = document.createElement('div');
+ div.classList.add(
+ Namespace.css.calendarWeeks,
+ Namespace.css.noHighlight
+ );
+ div.tabIndex = -1;
+ container.appendChild(div);
+ }
+ }
+
+ const div = document.createElement('div');
+ div.setAttribute('data-action', ActionTypes.selectDay);
+ div.role = 'gridcell';
+ div.tabIndex = -1;
+ container.appendChild(div);
+
+ // if hover is supported then add the events
+ if (
+ matchMedia('(hover: hover)').matches &&
+ this.optionsStore.options.dateRange
+ ) {
+ div.addEventListener('mouseover', rangeHoverEvent);
+ div.addEventListener('mouseout', rangeHoverOutEvent);
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Populates the grid and updates enabled states
+ * @private
+ */
+ _update(widget: HTMLElement, paint: Paint): void {
+ const container = widget.getElementsByClassName(
+ Namespace.css.daysContainer
+ )[0] as HTMLElement;
+
+ this._updateCalendarView(container);
+
+ const innerDate = this.optionsStore.viewDate.clone
+ .startOf(Unit.month)
+ .startOf('weekDay', this.optionsStore.options.localization.startOfTheWeek)
+ .manipulate(12, Unit.hours);
+
+ this._handleCalendarWeeks(container, innerDate.clone);
+
+ container
+ .querySelectorAll(`[data-action="http://github.com/$%7BActionTypes.selectDay%7D"]`)
+ .forEach((element: HTMLElement) => {
+ const classes: string[] = [];
+ classes.push(Namespace.css.day);
+
+ if (innerDate.isBefore(this.optionsStore.viewDate, Unit.month)) {
+ classes.push(Namespace.css.old);
+ }
+ if (innerDate.isAfter(this.optionsStore.viewDate, Unit.month)) {
+ classes.push(Namespace.css.new);
+ }
+
+ if (
+ !this.optionsStore.unset &&
+ !this.optionsStore.options.dateRange &&
+ this.dates.isPicked(innerDate, Unit.date)
+ ) {
+ classes.push(Namespace.css.active);
+ }
+ if (!this.validation.isValid(innerDate, Unit.date)) {
+ classes.push(Namespace.css.disabled);
+ }
+ if (innerDate.isSame(new DateTime(), Unit.date)) {
+ classes.push(Namespace.css.today);
+ }
+ if (innerDate.weekDay === 0 || innerDate.weekDay === 6) {
+ classes.push(Namespace.css.weekend);
+ }
+
+ this._handleDateRange(innerDate, classes);
+
+ paint(Unit.date, innerDate, classes, element);
+
+ element.classList.remove(...element.classList);
+ element.classList.add(...classes);
+ element.setAttribute('data-value', innerDate.dateToDataValue());
+ element.setAttribute('data-day', `${innerDate.date}`);
+ element.innerText = innerDate.parts(undefined, {
+ day: 'numeric',
+ }).day;
+ element.ariaLabel = innerDate.format('MMMM dd, yyyy');
+
+ innerDate.manipulate(1, Unit.date);
+ });
+ }
+
+ private _handleDateRange(innerDate: DateTime, classes: string[]) {
+ const rangeStart = this.dates.picked[0];
+ const rangeEnd = this.dates.picked[1];
+
+ if (this.optionsStore.options.dateRange) {
+ if (innerDate.isBetween(rangeStart, rangeEnd, Unit.date)) {
+ classes.push(Namespace.css.rangeIn);
+ }
+
+ if (innerDate.isSame(rangeStart, Unit.date)) {
+ classes.push(Namespace.css.rangeStart);
+ }
+
+ if (innerDate.isSame(rangeEnd, Unit.date)) {
+ classes.push(Namespace.css.rangeEnd);
+ }
+ }
+ }
+
+ private handleMouseEvents(container: HTMLElement) {
+ const rangeHoverEvent = (e: MouseEvent) => {
+ const currentTarget = e?.currentTarget as HTMLElement;
+
+ // if we have 0 or 2 selected or if the target is disabled then ignore
+ if (
+ this.dates.picked.length !== 1 ||
+ currentTarget.classList.contains(Namespace.css.disabled)
+ )
+ return;
+
+ // select all the date divs
+ const allDays = [...container.querySelectorAll('.day')] as HTMLElement[];
+
+ // get the date value from the element being hovered over
+ const attributeValue = currentTarget.getAttribute('data-value');
+
+ // format the string to a date
+ const innerDate = DateTime.fromString(attributeValue, {
+ format: 'yyyy-MM-dd',
+ });
+
+ // find the position of the target in the date container
+ const dayIndex = allDays.findIndex(
+ (e) => e.getAttribute('data-value') === attributeValue
+ );
+
+ // find the first and second selected dates
+ const rangeStart = this.dates.picked[0];
+ const rangeEnd = this.dates.picked[1];
+
+ //format the start date so that it can be found by the attribute
+ const rangeStartFormatted = rangeStart.dateToDataValue();
+ const rangeStartIndex = allDays.findIndex(
+ (e) => e.getAttribute('data-value') === rangeStartFormatted
+ );
+ const rangeStartElement = allDays[rangeStartIndex];
+
+ //make sure we don't leave start/end classes if we don't need them
+ if (!innerDate.isSame(rangeStart, Unit.date)) {
+ currentTarget.classList.remove(Namespace.css.rangeStart);
+ }
+
+ if (!innerDate.isSame(rangeEnd, Unit.date)) {
+ currentTarget.classList.remove(Namespace.css.rangeEnd);
+ }
+
+ // the following figures out which direct from start date is selected
+ // the selection "cap" classes are applied if needed
+ // otherwise all the dates between will get the `rangeIn` class.
+ // We make this selection based on the element's index and the rangeStart index
+
+ let lambda: (_, index: number) => boolean;
+
+ if (innerDate.isBefore(rangeStart)) {
+ currentTarget.classList.add(Namespace.css.rangeStart);
+ rangeStartElement?.classList.remove(Namespace.css.rangeStart);
+ rangeStartElement?.classList.add(Namespace.css.rangeEnd);
+ lambda = (_, index) => index > dayIndex && index < rangeStartIndex;
+ } else {
+ currentTarget.classList.add(Namespace.css.rangeEnd);
+ rangeStartElement?.classList.remove(Namespace.css.rangeEnd);
+ rangeStartElement?.classList.add(Namespace.css.rangeStart);
+ lambda = (_, index) => index < dayIndex && index > rangeStartIndex;
+ }
+
+ allDays.filter(lambda).forEach((e) => {
+ e.classList.add(Namespace.css.rangeIn);
+ });
+ };
+
+ const rangeHoverOutEvent = (e: MouseEvent) => {
+ // find all the dates in the container
+ const allDays = [...container.querySelectorAll('.day')] as HTMLElement[];
+
+ // if only the start is selected, remove all the rangeIn classes
+ // we do this because once the user hovers over a new date the range will be recalculated.
+ if (this.dates.picked.length === 1)
+ allDays.forEach((e) => e.classList.remove(Namespace.css.rangeIn));
+
+ // if we have 0 or 2 dates selected then ignore
+ if (this.dates.picked.length !== 1) return;
+
+ const currentTarget = e?.currentTarget as HTMLElement;
+
+ // get the elements date from the attribute value
+ const innerDate = new DateTime(currentTarget.getAttribute('data-value'));
+
+ // verify selections and remove invalid classes
+ if (!innerDate.isSame(this.dates.picked[0], Unit.date)) {
+ currentTarget.classList.remove(Namespace.css.rangeStart);
+ }
+
+ if (!innerDate.isSame(this.dates.picked[1], Unit.date)) {
+ currentTarget.classList.remove(Namespace.css.rangeEnd);
+ }
+ };
+
+ return { rangeHoverEvent, rangeHoverOutEvent };
+ }
+
+ private _updateCalendarView(container: Element) {
+ if (this.optionsStore.currentView !== 'calendar') return;
+ const [previous, switcher, next] = container.parentElement
+ .getElementsByClassName(Namespace.css.calendarHeader)[0]
+ .getElementsByTagName('div');
+ switcher.setAttribute(
+ Namespace.css.daysContainer,
+ this.optionsStore.viewDate.format(
+ this.optionsStore.options.localization.dayViewHeaderFormat
+ )
+ );
+ this.optionsStore.options.display.components.month
+ ? switcher.classList.remove(Namespace.css.disabled)
+ : switcher.classList.add(Namespace.css.disabled);
+
+ this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(-1, Unit.month),
+ Unit.month
+ )
+ ? previous.classList.remove(Namespace.css.disabled)
+ : previous.classList.add(Namespace.css.disabled);
+ this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(1, Unit.month),
+ Unit.month
+ )
+ ? next.classList.remove(Namespace.css.disabled)
+ : next.classList.add(Namespace.css.disabled);
+ }
+
+ /***
+ * Generates a html row that contains the days of the week.
+ * @private
+ */
+ private _daysOfTheWeek(): HTMLElement[] {
+ const innerDate = this.optionsStore.viewDate.clone
+ .startOf('weekDay', this.optionsStore.options.localization.startOfTheWeek)
+ .startOf(Unit.date);
+ const row = [];
+ document.createElement('div');
+
+ if (this.optionsStore.options.display.calendarWeeks) {
+ const htmlDivElement = document.createElement('div');
+ htmlDivElement.classList.add(
+ Namespace.css.calendarWeeks,
+ Namespace.css.noHighlight
+ );
+ htmlDivElement.innerText = '#';
+ row.push(htmlDivElement);
+ }
+
+ for (let i = 0; i < 7; i++) {
+ const htmlDivElement = document.createElement('div');
+ htmlDivElement.classList.add(
+ Namespace.css.dayOfTheWeek,
+ Namespace.css.noHighlight
+ );
+ let weekDay = innerDate.format({ weekday: 'short' });
+ if (this.optionsStore.options.localization.maxWeekdayLength > 0)
+ weekDay = weekDay.substring(
+ 0,
+ this.optionsStore.options.localization.maxWeekdayLength
+ );
+ htmlDivElement.innerText = weekDay;
+ htmlDivElement.ariaLabel = innerDate.format({ weekday: 'long' });
+ innerDate.manipulate(1, Unit.date);
+ row.push(htmlDivElement);
+ }
+
+ return row;
+ }
+
+ private _handleCalendarWeeks(container: HTMLElement, innerDate: DateTime) {
+ [...container.querySelectorAll(`.${Namespace.css.calendarWeeks}`)]
+ .filter((e: HTMLElement) => e.innerText !== '#')
+ .forEach((element: HTMLElement) => {
+ element.innerText = `${innerDate.week}`;
+ innerDate.manipulate(7, Unit.date);
+ });
+ }
+}
diff --git a/src/js/display/calendar/decade-display.ts b/src/js/display/calendar/decade-display.ts
new file mode 100644
index 000000000..75fbf5cfd
--- /dev/null
+++ b/src/js/display/calendar/decade-display.ts
@@ -0,0 +1,135 @@
+import Dates from '../../dates';
+import { DateTime, Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Validation from '../../validation';
+import { Paint } from '../index';
+import { serviceLocator } from '../../utilities/service-locator';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+
+/**
+ * Creates and updates the grid for `seconds`
+ */
+export default class DecadeDisplay {
+ private _startDecade: DateTime;
+ private _endDecade: DateTime;
+ private optionsStore: OptionsStore;
+ private dates: Dates;
+ private validation: Validation;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.dates = serviceLocator.locate(Dates);
+ this.validation = serviceLocator.locate(Validation);
+ }
+
+ /**
+ * Build the container html for the display
+ * @private
+ */
+ getPicker() {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.decadesContainer);
+
+ for (let i = 0; i < 12; i++) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.selectDecade);
+ container.appendChild(div);
+ }
+ return container;
+ }
+
+ /**
+ * Populates the grid and updates enabled states
+ * @private
+ */
+ _update(widget: HTMLElement, paint: Paint) {
+ const [start, end] = Dates.getStartEndYear(
+ 100,
+ this.optionsStore.viewDate.year
+ );
+ this._startDecade = this.optionsStore.viewDate.clone.startOf(Unit.year);
+ this._startDecade.year = start;
+ this._endDecade = this.optionsStore.viewDate.clone.startOf(Unit.year);
+ this._endDecade.year = end;
+
+ const container = widget.getElementsByClassName(
+ Namespace.css.decadesContainer
+ )[0] as HTMLElement;
+
+ const [previous, switcher, next] = container.parentElement
+ .getElementsByClassName(Namespace.css.calendarHeader)[0]
+ .getElementsByTagName('div');
+
+ const isPreviousEnabled = this.validation.isValid(
+ this._startDecade,
+ Unit.year
+ );
+ if (this.optionsStore.currentView === 'decades') {
+ switcher.setAttribute(
+ Namespace.css.decadesContainer,
+ `${this._startDecade.format({
+ year: 'numeric',
+ })}-${this._endDecade.format({ year: 'numeric' })}`
+ );
+
+ isPreviousEnabled
+ ? previous.classList.remove(Namespace.css.disabled)
+ : previous.classList.add(Namespace.css.disabled);
+ this.validation.isValid(this._endDecade, Unit.year)
+ ? next.classList.remove(Namespace.css.disabled)
+ : next.classList.add(Namespace.css.disabled);
+ }
+
+ const pickedYears = this.dates.picked.map((x) => x.year);
+
+ container
+ .querySelectorAll(`[data-action="http://github.com/$%7BActionTypes.selectDecade%7D"]`)
+ .forEach((containerClone: HTMLElement, index) => {
+ if (index === 0) {
+ containerClone.classList.add(Namespace.css.old);
+ if (this._startDecade.year - 10 < 0) {
+ containerClone.textContent = ' ';
+ previous.classList.add(Namespace.css.disabled);
+ containerClone.classList.add(Namespace.css.disabled);
+ containerClone.setAttribute('data-value', '');
+ }
+ return;
+ }
+
+ const classes = [];
+ classes.push(Namespace.css.decade);
+ const startDecadeYear = this._startDecade.year;
+ const endDecadeYear = this._startDecade.year + 9;
+
+ if (
+ !this.optionsStore.unset &&
+ pickedYears.filter((x) => x >= startDecadeYear && x <= endDecadeYear)
+ .length > 0
+ ) {
+ classes.push(Namespace.css.active);
+ }
+ if (
+ !isPreviousEnabled &&
+ !this.validation.isValid(
+ this._startDecade.clone.manipulate(10, Unit.year),
+ Unit.year
+ )
+ ) {
+ classes.push(Namespace.css.disabled);
+ }
+
+ paint('decade', this._startDecade, classes, containerClone);
+
+ containerClone.classList.remove(...containerClone.classList);
+ containerClone.classList.add(...classes);
+ containerClone.setAttribute('data-value', `${this._startDecade.year}`);
+ containerClone.innerText = `${this._startDecade.format({
+ year: 'numeric',
+ })}`;
+
+ this._startDecade.manipulate(10, Unit.year);
+ });
+ }
+}
diff --git a/src/js/display/calendar/month-display.ts b/src/js/display/calendar/month-display.ts
new file mode 100644
index 000000000..ac8e12754
--- /dev/null
+++ b/src/js/display/calendar/month-display.ts
@@ -0,0 +1,106 @@
+import { Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Validation from '../../validation';
+import Dates from '../../dates';
+import { Paint } from '../index';
+import { serviceLocator } from '../../utilities/service-locator';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+
+/**
+ * Creates and updates the grid for `month`
+ */
+export default class MonthDisplay {
+ private optionsStore: OptionsStore;
+ private dates: Dates;
+ private validation: Validation;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.dates = serviceLocator.locate(Dates);
+ this.validation = serviceLocator.locate(Validation);
+ }
+ /**
+ * Build the container html for the display
+ * @private
+ */
+ getPicker(): HTMLElement {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.monthsContainer);
+
+ for (let i = 0; i < 12; i++) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.selectMonth);
+ container.appendChild(div);
+ }
+
+ return container;
+ }
+
+ /**
+ * Populates the grid and updates enabled states
+ * @private
+ */
+ _update(widget: HTMLElement, paint: Paint): void {
+ const container = widget.getElementsByClassName(
+ Namespace.css.monthsContainer
+ )[0] as HTMLElement;
+
+ if (this.optionsStore.currentView === 'months') {
+ const [previous, switcher, next] = container.parentElement
+ .getElementsByClassName(Namespace.css.calendarHeader)[0]
+ .getElementsByTagName('div');
+
+ switcher.setAttribute(
+ Namespace.css.monthsContainer,
+ this.optionsStore.viewDate.format({ year: 'numeric' })
+ );
+
+ this.optionsStore.options.display.components.year
+ ? switcher.classList.remove(Namespace.css.disabled)
+ : switcher.classList.add(Namespace.css.disabled);
+
+ this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(-1, Unit.year),
+ Unit.year
+ )
+ ? previous.classList.remove(Namespace.css.disabled)
+ : previous.classList.add(Namespace.css.disabled);
+
+ this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(1, Unit.year),
+ Unit.year
+ )
+ ? next.classList.remove(Namespace.css.disabled)
+ : next.classList.add(Namespace.css.disabled);
+ }
+
+ const innerDate = this.optionsStore.viewDate.clone.startOf(Unit.year);
+
+ container
+ .querySelectorAll(`[data-action="http://github.com/$%7BActionTypes.selectMonth%7D"]`)
+ .forEach((containerClone: HTMLElement, index) => {
+ const classes = [];
+ classes.push(Namespace.css.month);
+
+ if (
+ !this.optionsStore.unset &&
+ this.dates.isPicked(innerDate, Unit.month)
+ ) {
+ classes.push(Namespace.css.active);
+ }
+ if (!this.validation.isValid(innerDate, Unit.month)) {
+ classes.push(Namespace.css.disabled);
+ }
+
+ paint(Unit.month, innerDate, classes, containerClone);
+
+ containerClone.classList.remove(...containerClone.classList);
+ containerClone.classList.add(...classes);
+ containerClone.setAttribute('data-value', `${index}`);
+ containerClone.innerText = `${innerDate.format({ month: 'short' })}`;
+ innerDate.manipulate(1, Unit.month);
+ });
+ }
+}
diff --git a/src/js/display/calendar/year-display.ts b/src/js/display/calendar/year-display.ts
new file mode 100644
index 000000000..3d6e593ad
--- /dev/null
+++ b/src/js/display/calendar/year-display.ts
@@ -0,0 +1,113 @@
+import { DateTime, Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Dates from '../../dates';
+import Validation from '../../validation';
+import { Paint } from '../index';
+import { serviceLocator } from '../../utilities/service-locator';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+
+/**
+ * Creates and updates the grid for `year`
+ */
+export default class YearDisplay {
+ private _startYear: DateTime;
+ private _endYear: DateTime;
+ private optionsStore: OptionsStore;
+ private dates: Dates;
+ private validation: Validation;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.dates = serviceLocator.locate(Dates);
+ this.validation = serviceLocator.locate(Validation);
+ }
+
+ /**
+ * Build the container html for the display
+ * @private
+ */
+ getPicker(): HTMLElement {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.yearsContainer);
+
+ for (let i = 0; i < 12; i++) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.selectYear);
+ container.appendChild(div);
+ }
+
+ return container;
+ }
+
+ /**
+ * Populates the grid and updates enabled states
+ * @private
+ */
+ _update(widget: HTMLElement, paint: Paint) {
+ this._startYear = this.optionsStore.viewDate.clone.manipulate(
+ -1,
+ Unit.year
+ );
+ this._endYear = this.optionsStore.viewDate.clone.manipulate(10, Unit.year);
+
+ const container = widget.getElementsByClassName(
+ Namespace.css.yearsContainer
+ )[0] as HTMLElement;
+
+ if (this.optionsStore.currentView === 'years') {
+ const [previous, switcher, next] = container.parentElement
+ .getElementsByClassName(Namespace.css.calendarHeader)[0]
+ .getElementsByTagName('div');
+
+ switcher.setAttribute(
+ Namespace.css.yearsContainer,
+ `${this._startYear.format({ year: 'numeric' })}-${this._endYear.format({
+ year: 'numeric',
+ })}`
+ );
+
+ this.optionsStore.options.display.components.decades
+ ? switcher.classList.remove(Namespace.css.disabled)
+ : switcher.classList.add(Namespace.css.disabled);
+
+ this.validation.isValid(this._startYear, Unit.year)
+ ? previous.classList.remove(Namespace.css.disabled)
+ : previous.classList.add(Namespace.css.disabled);
+ this.validation.isValid(this._endYear, Unit.year)
+ ? next.classList.remove(Namespace.css.disabled)
+ : next.classList.add(Namespace.css.disabled);
+ }
+
+ const innerDate = this.optionsStore.viewDate.clone
+ .startOf(Unit.year)
+ .manipulate(-1, Unit.year);
+
+ container
+ .querySelectorAll(`[data-action="http://github.com/$%7BActionTypes.selectYear%7D"]`)
+ .forEach((containerClone: HTMLElement) => {
+ const classes = [];
+ classes.push(Namespace.css.year);
+
+ if (
+ !this.optionsStore.unset &&
+ this.dates.isPicked(innerDate, Unit.year)
+ ) {
+ classes.push(Namespace.css.active);
+ }
+ if (!this.validation.isValid(innerDate, Unit.year)) {
+ classes.push(Namespace.css.disabled);
+ }
+
+ paint(Unit.year, innerDate, classes, containerClone);
+
+ containerClone.classList.remove(...containerClone.classList);
+ containerClone.classList.add(...classes);
+ containerClone.setAttribute('data-value', `${innerDate.year}`);
+ containerClone.innerText = innerDate.format({ year: 'numeric' });
+
+ innerDate.manipulate(1, Unit.year);
+ });
+ }
+}
diff --git a/src/js/display/collapse.ts b/src/js/display/collapse.ts
new file mode 100644
index 000000000..1a7324816
--- /dev/null
+++ b/src/js/display/collapse.ts
@@ -0,0 +1,134 @@
+import Namespace from '../utilities/namespace';
+
+/**
+ * Provides a collapse functionality to the view changes
+ */
+export default class Collapse {
+ /**
+ * Flips the show/hide state of `target`
+ * @param target html element to affect.
+ */
+ static toggle(target: HTMLElement) {
+ if (target.classList.contains(Namespace.css.show)) {
+ this.hide(target);
+ } else {
+ this.show(target);
+ }
+ }
+
+ /**
+ * Skips any animation or timeouts and immediately set the element to show.
+ * @param target
+ */
+ static showImmediately(target: HTMLElement) {
+ target.classList.remove(Namespace.css.collapsing);
+ target.classList.add(Namespace.css.collapse, Namespace.css.show);
+ target.style.height = '';
+ }
+
+ /**
+ * If `target` is not already showing, then show after the animation.
+ * @param target
+ */
+ static show(target: HTMLElement) {
+ if (
+ target.classList.contains(Namespace.css.collapsing) ||
+ target.classList.contains(Namespace.css.show)
+ )
+ return;
+
+ let timeOut = null;
+ const complete = () => {
+ Collapse.showImmediately(target);
+ timeOut = null;
+ };
+
+ target.style.height = '0';
+ target.classList.remove(Namespace.css.collapse);
+ target.classList.add(Namespace.css.collapsing);
+
+ //eslint-disable-next-line @typescript-eslint/no-unused-vars
+ timeOut = setTimeout(
+ complete,
+ this.getTransitionDurationFromElement(target)
+ );
+ target.style.height = `${target.scrollHeight}px`;
+ }
+
+ /**
+ * Skips any animation or timeouts and immediately set the element to hide.
+ * @param target
+ */
+ static hideImmediately(target: HTMLElement) {
+ if (!target) return;
+ target.classList.remove(Namespace.css.collapsing, Namespace.css.show);
+ target.classList.add(Namespace.css.collapse);
+ }
+
+ /**
+ * If `target` is not already hidden, then hide after the animation.
+ * @param target HTML Element
+ */
+ static hide(target: HTMLElement) {
+ if (
+ target.classList.contains(Namespace.css.collapsing) ||
+ !target.classList.contains(Namespace.css.show)
+ )
+ return;
+
+ let timeOut = null;
+ const complete = () => {
+ Collapse.hideImmediately(target);
+ timeOut = null;
+ };
+
+ target.style.height = `${target.getBoundingClientRect()['height']}px`;
+
+ const reflow = (element) => element.offsetHeight;
+
+ reflow(target);
+
+ target.classList.remove(Namespace.css.collapse, Namespace.css.show);
+ target.classList.add(Namespace.css.collapsing);
+ target.style.height = '';
+
+ //eslint-disable-next-line @typescript-eslint/no-unused-vars
+ timeOut = setTimeout(
+ complete,
+ this.getTransitionDurationFromElement(target)
+ );
+ }
+
+ /**
+ * Gets the transition duration from the `element` by getting css properties
+ * `transition-duration` and `transition-delay`
+ * @param element HTML Element
+ */
+ private static getTransitionDurationFromElement = (element: HTMLElement) => {
+ if (!element) {
+ return 0;
+ }
+
+ // Get transition-duration of the element
+ let { transitionDuration, transitionDelay } =
+ window.getComputedStyle(element);
+
+ const floatTransitionDuration = Number.parseFloat(transitionDuration);
+ const floatTransitionDelay = Number.parseFloat(transitionDelay);
+
+ // Return 0 if element or transition duration is not found
+ if (!floatTransitionDuration && !floatTransitionDelay) {
+ return 0;
+ }
+
+ // If multiple durations are defined, take the first
+ transitionDuration = transitionDuration.split(',')[0];
+ transitionDelay = transitionDelay.split(',')[0];
+
+ return (
+ (Number.parseFloat(transitionDuration) +
+ Number.parseFloat(transitionDelay)) *
+ 1000
+ );
+ };
+}
diff --git a/src/js/display/index.ts b/src/js/display/index.ts
new file mode 100644
index 000000000..7cbfe2d73
--- /dev/null
+++ b/src/js/display/index.ts
@@ -0,0 +1,1254 @@
+import DateDisplay from './calendar/date-display';
+import MonthDisplay from './calendar/month-display';
+import YearDisplay from './calendar/year-display';
+import DecadeDisplay from './calendar/decade-display';
+import TimeDisplay from './time/time-display';
+import HourDisplay from './time/hour-display';
+import MinuteDisplay from './time/minute-display';
+import SecondDisplay from './time/second-display';
+import { DateTime, Unit } from '../datetime';
+import Namespace from '../utilities/namespace';
+import { HideEvent } from '../utilities/event-types';
+import Collapse from './collapse';
+import Validation from '../validation';
+import Dates from '../dates';
+import { EventEmitters, ViewUpdateValues } from '../utilities/event-emitter';
+import { serviceLocator } from '../utilities/service-locator';
+import ActionTypes from '../utilities/action-types';
+import CalendarModes from '../utilities/calendar-modes';
+import { OptionsStore } from '../utilities/optionsStore';
+
+/**
+ * Main class for all things display related.
+ */
+export default class Display {
+ private _widget: HTMLElement;
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ private _popperInstance: any;
+ private _isVisible = false;
+ private optionsStore: OptionsStore;
+ private validation: Validation;
+ private dates: Dates;
+ private _eventEmitters: EventEmitters;
+ private _keyboardEventBound = this._keyboardEvent.bind(this);
+
+ dateDisplay: DateDisplay;
+ monthDisplay: MonthDisplay;
+ yearDisplay: YearDisplay;
+ decadeDisplay: DecadeDisplay;
+ timeDisplay: TimeDisplay;
+ hourDisplay: HourDisplay;
+ minuteDisplay: MinuteDisplay;
+ secondDisplay: SecondDisplay;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.validation = serviceLocator.locate(Validation);
+ this.dates = serviceLocator.locate(Dates);
+
+ this.dateDisplay = serviceLocator.locate(DateDisplay);
+ this.monthDisplay = serviceLocator.locate(MonthDisplay);
+ this.yearDisplay = serviceLocator.locate(YearDisplay);
+ this.decadeDisplay = serviceLocator.locate(DecadeDisplay);
+ this.timeDisplay = serviceLocator.locate(TimeDisplay);
+ this.hourDisplay = serviceLocator.locate(HourDisplay);
+ this.minuteDisplay = serviceLocator.locate(MinuteDisplay);
+ this.secondDisplay = serviceLocator.locate(SecondDisplay);
+ this._eventEmitters = serviceLocator.locate(EventEmitters);
+ this._widget = undefined;
+
+ this._eventEmitters.updateDisplay.subscribe((result: ViewUpdateValues) => {
+ this._update(result);
+ });
+ }
+
+ /**
+ * Returns the widget body or undefined
+ * @private
+ */
+ get widget(): HTMLElement | undefined {
+ return this._widget;
+ }
+
+ get dateContainer(): HTMLElement | undefined {
+ return this.widget?.querySelector(`div.${Namespace.css.dateContainer}`);
+ }
+
+ get timeContainer(): HTMLElement | undefined {
+ return this.widget?.querySelector(`div.${Namespace.css.timeContainer}`);
+ }
+
+ /**
+ * Returns this visible state of the picker (shown)
+ */
+ get isVisible() {
+ return this._isVisible;
+ }
+
+ /**
+ * Updates the table for a particular unit. Used when an option as changed or
+ * whenever the class list might need to be refreshed.
+ * @param unit
+ * @private
+ */
+ _update(unit: ViewUpdateValues): void {
+ if (!this.widget) return;
+ switch (unit) {
+ case Unit.seconds:
+ this.secondDisplay._update(this.widget, this.paint);
+ break;
+ case Unit.minutes:
+ this.minuteDisplay._update(this.widget, this.paint);
+ break;
+ case Unit.hours:
+ this.hourDisplay._update(this.widget, this.paint);
+ break;
+ case Unit.date:
+ this.dateDisplay._update(this.widget, this.paint);
+ break;
+ case Unit.month:
+ this.monthDisplay._update(this.widget, this.paint);
+ break;
+ case Unit.year:
+ this.yearDisplay._update(this.widget, this.paint);
+ break;
+ case 'decade':
+ this.decadeDisplay._update(this.widget, this.paint);
+ break;
+ case 'clock':
+ if (!this._hasTime) break;
+ this.timeDisplay._update(this.widget);
+ this._update(Unit.hours);
+ this._update(Unit.minutes);
+ this._update(Unit.seconds);
+ break;
+ case 'calendar':
+ this._update(Unit.date);
+ this._update(Unit.year);
+ this._update(Unit.month);
+ this.decadeDisplay._update(this.widget, this.paint);
+ this._updateCalendarHeader();
+ break;
+ case 'all':
+ if (this._hasTime) {
+ this._update('clock');
+ }
+ if (this._hasDate) {
+ this._update('calendar');
+ }
+ }
+ }
+
+ // noinspection JSUnusedLocalSymbols
+ /**
+ * Allows developers to add/remove classes from an element.
+ * @param _unit
+ * @param _date
+ * @param _classes
+ * @param _element
+ */
+
+ /* eslint-disable @typescript-eslint/no-unused-vars */
+ paint(
+ _unit: Unit | 'decade',
+ _date: DateTime,
+ _classes: string[],
+ _element: HTMLElement
+ ) {
+ // implemented in plugin
+ }
+
+ /**
+ * Shows the picker and creates a Popper instance if needed.
+ * Add document click event to hide when clicking outside the picker.
+ * fires Events#show
+ */
+ show(): void {
+ if (this.widget == undefined) {
+ this._showSetDefaultIfNeeded();
+
+ this._buildWidget();
+ this._updateTheme();
+
+ this._showSetupViewMode();
+
+ if (!this.optionsStore.options.display.inline) {
+ // If needed to change the parent container
+ const container = this.optionsStore.options?.container || document.body;
+ const placement =
+ this.optionsStore.options?.display?.placement || 'bottom';
+
+ container.appendChild(this.widget);
+ const handleFocus = this._handleFocus.bind(this);
+ this.createPopup(this.optionsStore.element, this.widget, {
+ modifiers: [
+ { name: 'eventListeners', enabled: true },
+ {
+ name: 'focusDate',
+ enabled: true,
+ phase: 'afterWrite',
+ fn() {
+ handleFocus();
+ },
+ },
+ ],
+ //#2400
+ placement:
+ document.documentElement.dir === 'rtl'
+ ? `${placement}-end`
+ : `${placement}-start`,
+ }).then(() => {
+ this._handleFocus();
+ });
+ } else {
+ this.optionsStore.element.appendChild(this.widget);
+ }
+
+ if (this.optionsStore.options.display.viewMode == 'clock') {
+ this._eventEmitters.action.emit({
+ e: null,
+ action: ActionTypes.showClock,
+ });
+ }
+
+ this.widget
+ .querySelectorAll('[data-action]')
+ .forEach((element) =>
+ element.addEventListener('click', this._actionsClickEvent)
+ );
+
+ // show the clock when using sideBySide
+ if (this._hasTime && this.optionsStore.options.display.sideBySide) {
+ this.timeDisplay._update(this.widget);
+ (
+ this.widget.getElementsByClassName(
+ Namespace.css.clockContainer
+ )[0] as HTMLElement
+ ).style.display = 'grid';
+ }
+ }
+
+ this.widget.classList.add(Namespace.css.show);
+ if (!this.optionsStore.options.display.inline) {
+ this.updatePopup();
+ document.addEventListener('click', this._documentClickEvent);
+ }
+ this._eventEmitters.triggerEvent.emit({ type: Namespace.events.show });
+ this._isVisible = true;
+
+ if (this.optionsStore.options.display.keyboardNavigation) {
+ this.widget.addEventListener('keydown', this._keyboardEventBound);
+ }
+ }
+
+ private _showSetupViewMode() {
+ // If modeView is only clock
+ const onlyClock = this._hasTime && !this._hasDate;
+
+ // reset the view to the clock if there's no date components
+ if (onlyClock) {
+ this.optionsStore.currentView = 'clock';
+ this._eventEmitters.action.emit({
+ e: null,
+ action: ActionTypes.showClock,
+ });
+ }
+ // otherwise return to the calendar view
+ else if (!this.optionsStore.currentCalendarViewMode) {
+ this.optionsStore.currentCalendarViewMode =
+ this.optionsStore.minimumCalendarViewMode;
+ }
+
+ if (!onlyClock && this.optionsStore.options.display.viewMode !== 'clock') {
+ if (this._hasTime) {
+ if (!this.optionsStore.options.display.sideBySide) {
+ Collapse.hideImmediately(this.timeContainer);
+ } else {
+ Collapse.show(this.timeContainer);
+ }
+ }
+ Collapse.show(this.dateContainer);
+ }
+
+ if (this._hasDate) {
+ this._showMode();
+ }
+ }
+
+ private _showSetDefaultIfNeeded() {
+ if (this.dates.picked.length != 0) return;
+
+ if (
+ this.optionsStore.options.useCurrent &&
+ !this.optionsStore.options.defaultDate
+ ) {
+ const date = new DateTime().setLocalization(
+ this.optionsStore.options.localization
+ );
+ if (!this.optionsStore.options.keepInvalid) {
+ let tries = 0;
+ let direction = 1;
+ if (this.optionsStore.options.restrictions.maxDate?.isBefore(date)) {
+ direction = -1;
+ }
+ while (!this.validation.isValid(date) && tries > 31) {
+ date.manipulate(direction, Unit.date);
+ tries++;
+ }
+ }
+ this.dates.setValue(date);
+ }
+
+ if (this.optionsStore.options.defaultDate) {
+ this.dates.setValue(this.optionsStore.options.defaultDate);
+ }
+ }
+
+ async createPopup(
+ element: HTMLElement,
+ widget: HTMLElement,
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ options: any
+ ): Promise {
+ let createPopperFunction;
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ if ((window as any)?.Popper) {
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ createPopperFunction = (window as any)?.Popper?.createPopper;
+ } else {
+ const { createPopper } = await import('@popperjs/core');
+ createPopperFunction = createPopper;
+ }
+ if (createPopperFunction) {
+ this._popperInstance = createPopperFunction(element, widget, options);
+ }
+ }
+
+ updatePopup(): void {
+ if (!this._popperInstance) return;
+ this._popperInstance.update();
+ //this._handleFocus();
+ }
+
+ /**
+ * Changes the calendar view mode. E.g. month <-> year
+ * @param direction -/+ number to move currentViewMode
+ * @private
+ */
+ _showMode(direction?: number): void {
+ if (!this.widget) {
+ return;
+ }
+ if (direction) {
+ const max = Math.max(
+ this.optionsStore.minimumCalendarViewMode,
+ Math.min(3, this.optionsStore.currentCalendarViewMode + direction)
+ );
+ if (this.optionsStore.currentCalendarViewMode == max) return;
+ this.optionsStore.currentCalendarViewMode = max;
+ }
+
+ this.widget
+ .querySelectorAll(
+ `.${Namespace.css.dateContainer} > div:not(.${Namespace.css.calendarHeader}), .${Namespace.css.timeContainer} > div:not(.${Namespace.css.clockContainer})`
+ )
+ .forEach((e: HTMLElement) => (e.style.display = 'none'));
+
+ const datePickerMode =
+ CalendarModes[this.optionsStore.currentCalendarViewMode];
+ const picker: HTMLElement = this.widget.querySelector(
+ `.${datePickerMode.className}`
+ );
+
+ switch (datePickerMode.className) {
+ case Namespace.css.decadesContainer:
+ this.decadeDisplay._update(this.widget, this.paint);
+ break;
+ case Namespace.css.yearsContainer:
+ this.yearDisplay._update(this.widget, this.paint);
+ break;
+ case Namespace.css.monthsContainer:
+ this.monthDisplay._update(this.widget, this.paint);
+ break;
+ case Namespace.css.daysContainer:
+ this.dateDisplay._update(this.widget, this.paint);
+ break;
+ }
+
+ picker.style.display = 'grid';
+
+ if (this.optionsStore.options.display.sideBySide)
+ ((
+ this.widget.querySelectorAll(`.${Namespace.css.clockContainer}`)[0]
+ )).style.display = 'grid';
+
+ this._updateCalendarHeader();
+ this._eventEmitters.viewUpdate.emit();
+ this.findViewDateElement()?.focus();
+ }
+
+ /**
+ * Changes the theme. E.g. light, dark or auto
+ * @param theme the theme name
+ * @private
+ */
+ _updateTheme(theme?: 'light' | 'dark' | 'auto'): void {
+ if (!this.widget) {
+ return;
+ }
+ if (theme) {
+ if (this.optionsStore.options.display.theme === theme) return;
+ this.optionsStore.options.display.theme = theme;
+ }
+
+ this.widget.classList.remove('light', 'dark');
+ this.widget.classList.add(this._getThemeClass());
+
+ if (this.optionsStore.options.display.theme === 'auto') {
+ window
+ .matchMedia(Namespace.css.isDarkPreferredQuery)
+ .addEventListener('change', () => this._updateTheme());
+ } else {
+ window
+ .matchMedia(Namespace.css.isDarkPreferredQuery)
+ .removeEventListener('change', () => this._updateTheme());
+ }
+ }
+
+ _getThemeClass(): string {
+ const currentTheme = this.optionsStore.options.display.theme || 'auto';
+
+ const isDarkMode =
+ window.matchMedia &&
+ window.matchMedia(Namespace.css.isDarkPreferredQuery).matches;
+
+ switch (currentTheme) {
+ case 'light':
+ return Namespace.css.lightTheme;
+ case 'dark':
+ return Namespace.css.darkTheme;
+ case 'auto':
+ return isDarkMode ? Namespace.css.darkTheme : Namespace.css.lightTheme;
+ }
+ }
+
+ _updateCalendarHeader() {
+ if (!this._hasDate) return;
+ const showing = [
+ ...this.widget.querySelector(
+ `.${Namespace.css.dateContainer} div[style*="display: grid"]`
+ ).classList,
+ ].find((x) => x.startsWith(Namespace.css.dateContainer));
+
+ const [previous, switcher, next] = this.widget
+ .getElementsByClassName(Namespace.css.calendarHeader)[0]
+ .getElementsByTagName('div');
+
+ switch (showing) {
+ case Namespace.css.decadesContainer:
+ previous.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.previousCentury
+ );
+ switcher.setAttribute('title', '');
+ next.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.nextCentury
+ );
+ break;
+ case Namespace.css.yearsContainer:
+ previous.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.previousDecade
+ );
+ switcher.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.selectDecade
+ );
+ next.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.nextDecade
+ );
+ break;
+ case Namespace.css.monthsContainer:
+ previous.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.previousYear
+ );
+ switcher.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.selectYear
+ );
+ next.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.nextYear
+ );
+ break;
+ case Namespace.css.daysContainer:
+ previous.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.previousMonth
+ );
+ switcher.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.selectMonth
+ );
+ next.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.nextMonth
+ );
+ switcher.setAttribute(
+ showing,
+ this.optionsStore.viewDate.format(
+ this.optionsStore.options.localization.dayViewHeaderFormat
+ )
+ );
+ break;
+ }
+ switcher.innerText = switcher.getAttribute(showing);
+ }
+
+ /**
+ * Hides the picker if needed.
+ * Remove document click event to hide when clicking outside the picker.
+ * fires Events#hide
+ */
+ hide(): void {
+ if (!this.widget || !this._isVisible) return;
+
+ this.widget.classList.remove(Namespace.css.show);
+
+ if (this._isVisible) {
+ this._eventEmitters.triggerEvent.emit({
+ type: Namespace.events.hide,
+ date: this.optionsStore.unset ? null : this.dates.lastPicked?.clone,
+ } as HideEvent);
+ this._isVisible = false;
+ }
+
+ document.removeEventListener('click', this._documentClickEvent);
+ if (this.optionsStore.options.display.keyboardNavigation) {
+ this.widget.removeEventListener('keydown', this._keyboardEventBound);
+ }
+ if (this.optionsStore.toggle) this.optionsStore.toggle.focus();
+ else if (this.optionsStore.input) this.optionsStore.input.focus();
+ }
+
+ /**
+ * Toggles the picker's open state. Fires a show/hide event depending.
+ */
+ toggle() {
+ return this._isVisible ? this.hide() : this.show();
+ }
+
+ /**
+ * Removes document and data-action click listener and reset the widget
+ * @private
+ */
+ _dispose() {
+ document.removeEventListener('click', this._documentClickEvent);
+ if (this._popperInstance) this._popperInstance.destroy();
+ if (!this.widget) return;
+ this.widget
+ .querySelectorAll('[data-action]')
+ .forEach((element) =>
+ element.removeEventListener('click', this._actionsClickEvent)
+ );
+ this.widget.parentNode.removeChild(this.widget);
+ this._widget = undefined;
+ }
+
+ /**
+ * Builds the widgets html template.
+ * @private
+ */
+ private _buildWidget(): HTMLElement {
+ const template = document.createElement('div');
+ template.tabIndex = -1;
+ template.classList.add(Namespace.css.widget);
+ template.setAttribute('role', 'widget');
+
+ const dateView = document.createElement('div');
+ dateView.tabIndex = -1;
+ dateView.classList.add(Namespace.css.dateContainer);
+ dateView.append(
+ this.getHeadTemplate(),
+ this.decadeDisplay.getPicker(),
+ this.yearDisplay.getPicker(),
+ this.monthDisplay.getPicker(),
+ this.dateDisplay.getPicker()
+ );
+
+ const timeView = document.createElement('div');
+ timeView.tabIndex = -1;
+ timeView.classList.add(Namespace.css.timeContainer);
+ timeView.appendChild(this.timeDisplay.getPicker(this._iconTag.bind(this)));
+ timeView.appendChild(this.hourDisplay.getPicker());
+ timeView.appendChild(this.minuteDisplay.getPicker());
+ timeView.appendChild(this.secondDisplay.getPicker());
+
+ const toolbar = document.createElement('div');
+ toolbar.tabIndex = -1;
+ toolbar.classList.add(Namespace.css.toolbar);
+ toolbar.append(...this.getToolbarElements());
+
+ if (this.optionsStore.options.display.inline) {
+ template.classList.add(Namespace.css.inline);
+ }
+
+ if (this.optionsStore.options.display.calendarWeeks) {
+ template.classList.add('calendarWeeks');
+ }
+
+ if (this.optionsStore.options.display.sideBySide && this._hasDateAndTime) {
+ this._buildWidgetSideBySide(template, dateView, timeView, toolbar);
+ return;
+ }
+
+ if (this.optionsStore.options.display.toolbarPlacement === 'top') {
+ template.appendChild(toolbar);
+ }
+
+ const setupComponentView = (
+ hasFirst: boolean,
+ hasSecond: boolean,
+ element: HTMLElement,
+ shouldShow: boolean
+ ) => {
+ if (!hasFirst) return;
+ if (hasSecond) {
+ element.classList.add(Namespace.css.collapse);
+ if (shouldShow) element.classList.add(Namespace.css.show);
+ }
+ template.appendChild(element);
+ };
+
+ setupComponentView(
+ this._hasDate,
+ this._hasTime,
+ dateView,
+ this.optionsStore.options.display.viewMode !== 'clock'
+ );
+
+ setupComponentView(
+ this._hasTime,
+ this._hasDate,
+ timeView,
+ this.optionsStore.options.display.viewMode === 'clock'
+ );
+
+ if (this.optionsStore.options.display.toolbarPlacement === 'bottom') {
+ template.appendChild(toolbar);
+ }
+
+ const arrow = document.createElement('div');
+ arrow.classList.add('arrow');
+ arrow.setAttribute('data-popper-arrow', '');
+ template.appendChild(arrow);
+
+ this._widget = template;
+ }
+
+ private _buildWidgetSideBySide(
+ template: HTMLDivElement,
+ dateView: HTMLDivElement,
+ timeView: HTMLDivElement,
+ toolbar: HTMLDivElement
+ ) {
+ template.classList.add(Namespace.css.sideBySide);
+ if (this.optionsStore.options.display.toolbarPlacement === 'top') {
+ template.appendChild(toolbar);
+ }
+ const row = document.createElement('div');
+ row.classList.add('td-row');
+ dateView.classList.add('td-half');
+ timeView.classList.add('td-half');
+
+ row.appendChild(dateView);
+ row.appendChild(timeView);
+ template.appendChild(row);
+ if (this.optionsStore.options.display.toolbarPlacement === 'bottom') {
+ template.appendChild(toolbar);
+ }
+ this._widget = template;
+ }
+
+ /**
+ * Returns true if the hours, minutes, or seconds component is turned on
+ */
+ get _hasTime(): boolean {
+ return (
+ this.optionsStore.options.display.components.clock &&
+ (this.optionsStore.options.display.components.hours ||
+ this.optionsStore.options.display.components.minutes ||
+ this.optionsStore.options.display.components.seconds)
+ );
+ }
+
+ /**
+ * Returns true if the year, month, or date component is turned on
+ */
+ get _hasDate(): boolean {
+ return (
+ this.optionsStore.options.display.components.calendar &&
+ (this.optionsStore.options.display.components.year ||
+ this.optionsStore.options.display.components.month ||
+ this.optionsStore.options.display.components.date)
+ );
+ }
+
+ get _hasDateAndTime(): boolean {
+ return this._hasDate && this._hasTime;
+ }
+
+ /**
+ * Get the toolbar html based on options like buttons => today
+ * @private
+ */
+ getToolbarElements(): HTMLElement[] {
+ const toolbar = [];
+
+ if (this.optionsStore.options.display.buttons.today) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.today);
+ div.setAttribute('title', this.optionsStore.options.localization.today);
+
+ div.appendChild(
+ this._iconTag(this.optionsStore.options.display.icons.today)
+ );
+ toolbar.push(div);
+ }
+ if (
+ !this.optionsStore.options.display.sideBySide &&
+ this._hasDate &&
+ this._hasTime
+ ) {
+ let title, icon;
+ if (this.optionsStore.options.display.viewMode === 'clock') {
+ title = this.optionsStore.options.localization.selectDate;
+ icon = this.optionsStore.options.display.icons.date;
+ } else {
+ title = this.optionsStore.options.localization.selectTime;
+ icon = this.optionsStore.options.display.icons.time;
+ }
+
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.togglePicker);
+ div.setAttribute('title', title);
+
+ div.appendChild(this._iconTag(icon));
+ toolbar.push(div);
+ }
+ if (this.optionsStore.options.display.buttons.clear) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.clear);
+ div.setAttribute('title', this.optionsStore.options.localization.clear);
+
+ div.appendChild(
+ this._iconTag(this.optionsStore.options.display.icons.clear)
+ );
+ toolbar.push(div);
+ }
+ if (this.optionsStore.options.display.buttons.close) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.close);
+ div.setAttribute('title', this.optionsStore.options.localization.close);
+
+ div.appendChild(
+ this._iconTag(this.optionsStore.options.display.icons.close)
+ );
+ toolbar.push(div);
+ }
+
+ return toolbar;
+ }
+
+ /***
+ * Builds the base header template with next and previous icons
+ * @private
+ */
+ getHeadTemplate(): HTMLElement {
+ const calendarHeader = document.createElement('div');
+ calendarHeader.classList.add(Namespace.css.calendarHeader);
+
+ const previous = document.createElement('div');
+ previous.classList.add(Namespace.css.previous);
+ previous.setAttribute('data-action', ActionTypes.previous);
+ previous.appendChild(
+ this._iconTag(this.optionsStore.options.display.icons.previous)
+ );
+ previous.tabIndex = -1;
+
+ const switcher = document.createElement('div');
+ switcher.classList.add(Namespace.css.switch);
+ switcher.setAttribute('data-action', ActionTypes.changeCalendarView);
+ switcher.tabIndex = -1;
+
+ const next = document.createElement('div');
+ next.classList.add(Namespace.css.next);
+ next.setAttribute('data-action', ActionTypes.next);
+ next.appendChild(
+ this._iconTag(this.optionsStore.options.display.icons.next)
+ );
+ next.tabIndex = -1;
+
+ calendarHeader.append(previous, switcher, next);
+ return calendarHeader;
+ }
+
+ /**
+ * Builds an icon tag as either an ``
+ * or with icons => type is `sprites` then a svg tag instead
+ * @param iconClass
+ * @private
+ */
+ _iconTag(iconClass: string): HTMLElement | SVGElement {
+ if (this.optionsStore.options.display.icons.type === 'sprites') {
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
+
+ const icon = document.createElementNS(
+ 'http://www.w3.org/2000/svg',
+ 'use'
+ );
+ icon.setAttribute('xlink:href', iconClass); // Deprecated. Included for backward compatibility
+ icon.setAttribute('href', iconClass);
+ svg.appendChild(icon);
+
+ return svg;
+ }
+ const icon = document.createElement('i');
+ icon.classList.add(...iconClass.split(' '));
+ return icon;
+ }
+
+ /**
+ * A document click event to hide the widget if click is outside
+ * @private
+ * @param e MouseEvent
+ */
+ private _documentClickEvent = (e: MouseEvent) => {
+ if (this.optionsStore.options.debug || (window as any).debug) return; //eslint-disable-line @typescript-eslint/no-explicit-any
+
+ if (
+ this._isVisible &&
+ !e.composedPath().includes(this.widget) && // click inside the widget
+ !e.composedPath()?.includes(this.optionsStore.element) // click on the element
+ ) {
+ this.hide();
+ }
+ };
+
+ /**
+ * Click event for any action like selecting a date
+ * @param e MouseEvent
+ * @private
+ */
+ private _actionsClickEvent = (e: MouseEvent) => {
+ this._eventEmitters.action.emit({ e: e });
+ };
+
+ /**
+ * Causes the widget to get rebuilt on next show. If the picker is already open
+ * then hide and reshow it.
+ * @private
+ */
+ _rebuild() {
+ const wasVisible = this._isVisible;
+ this._dispose();
+ if (wasVisible) this.show();
+ }
+
+ refreshCurrentView() {
+ //if the widget is not showing, just destroy it
+ if (!this._isVisible) this._dispose();
+
+ switch (this.optionsStore.currentView) {
+ case 'clock':
+ this._update('clock');
+ break;
+ case 'calendar':
+ this._update(Unit.date);
+ break;
+ case 'months':
+ this._update(Unit.month);
+ break;
+ case 'years':
+ this._update(Unit.year);
+ break;
+ case 'decades':
+ this._update('decade');
+ break;
+ }
+ }
+
+ private _keyboardEvent(event: KeyboardEvent) {
+ if (this.optionsStore.currentView === 'clock') {
+ this._handleKeyDownClock(event);
+ return;
+ }
+ this._handleKeyDownDate(event);
+ return false;
+ }
+
+ public findViewDateElement(): HTMLElement {
+ let selector = '';
+ let dataValue = '';
+
+ switch (this.optionsStore.currentView) {
+ case 'clock':
+ break;
+ case 'calendar':
+ selector = Namespace.css.daysContainer;
+ dataValue = this.optionsStore.viewDate.dateToDataValue();
+ break;
+ case 'months':
+ selector = Namespace.css.monthsContainer;
+ dataValue = this.optionsStore.viewDate.month.toString();
+ break;
+ case 'years':
+ selector = Namespace.css.yearsContainer;
+ dataValue = this.optionsStore.viewDate.year.toString();
+ break;
+ case 'decades':
+ selector = Namespace.css.decadesContainer;
+ dataValue = (
+ Math.floor(this.optionsStore.viewDate.year / 10) * 10
+ ).toString();
+ break;
+ }
+
+ return this.widget.querySelector(
+ `.${selector} > div[data-value="${dataValue}"]`
+ );
+ }
+
+ private _handleKeyDownDate(event: KeyboardEvent) {
+ let flag = false;
+ const activeElement = document.activeElement as HTMLElement;
+
+ let unit = null;
+ let verticalChange = 7;
+ let horizontalChange = 1;
+ let change = 1;
+ const currentView = this.optionsStore.currentView;
+ switch (currentView) {
+ case 'calendar':
+ unit = Unit.date;
+ break;
+ case 'months':
+ unit = Unit.month;
+ verticalChange = 3;
+ horizontalChange = 1;
+ break;
+ case 'years':
+ unit = Unit.year;
+ verticalChange = 3;
+ horizontalChange = 1;
+ break;
+ case 'decades':
+ unit = Unit.year;
+ verticalChange = 30;
+ horizontalChange = 10;
+ break;
+ }
+
+ switch (event.key) {
+ case 'Esc':
+ case 'Escape':
+ this._eventEmitters.action.emit({ e: null, action: ActionTypes.close });
+ break;
+
+ case ' ':
+ case 'Enter':
+ activeElement.click();
+
+ event.stopPropagation();
+ event.preventDefault();
+ return;
+
+ case 'Tab':
+ this._handleTab(activeElement, event);
+ return;
+
+ case 'Right':
+ case 'ArrowRight':
+ change = horizontalChange;
+ flag = true;
+ break;
+
+ case 'Left':
+ case 'ArrowLeft':
+ flag = true;
+ change = -horizontalChange;
+ break;
+
+ case 'Down':
+ case 'ArrowDown':
+ flag = true;
+ change = verticalChange;
+ break;
+
+ case 'Up':
+ case 'ArrowUp':
+ flag = true;
+ change = -verticalChange;
+ break;
+
+ case 'PageDown':
+ switch (currentView) {
+ case 'calendar':
+ unit = event.shiftKey ? Unit.year : Unit.month;
+ change = 1;
+ break;
+ case 'months':
+ unit = Unit.year;
+ change = event.shiftKey ? 10 : 1;
+ break;
+ case 'years':
+ case 'decades':
+ unit = Unit.year;
+ change = event.shiftKey ? 100 : 10;
+ break;
+ }
+ flag = true;
+ break;
+
+ case 'PageUp':
+ switch (currentView) {
+ case 'calendar':
+ unit = event.shiftKey ? Unit.year : Unit.month;
+ change = -1;
+ break;
+ case 'months':
+ unit = Unit.year;
+ change = -(event.shiftKey ? 10 : 1);
+ break;
+ case 'years':
+ case 'decades':
+ unit = Unit.year;
+ change = -(event.shiftKey ? 100 : 10);
+ break;
+ }
+ flag = true;
+ break;
+
+ case 'Home':
+ this.optionsStore.viewDate = this.optionsStore.viewDate.clone.startOf(
+ 'weekDay',
+ this.optionsStore.options.localization.startOfTheWeek
+ );
+ flag = true;
+ unit = null;
+ break;
+
+ case 'End':
+ this.optionsStore.viewDate = this.optionsStore.viewDate.clone.endOf(
+ 'weekDay',
+ this.optionsStore.options.localization.startOfTheWeek
+ );
+ flag = true;
+ unit = null;
+ break;
+ }
+
+ if (!flag) return;
+
+ let newViewDate = this.optionsStore.viewDate;
+
+ if (unit) {
+ newViewDate = newViewDate.clone.manipulate(change, unit);
+ }
+
+ this._eventEmitters.updateViewDate.emit(newViewDate);
+
+ const divWithValue = this.findViewDateElement();
+ if (divWithValue) {
+ divWithValue.focus();
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+ }
+
+ private _handleKeyDownClock(event: KeyboardEvent) {
+ let flag = false;
+ const activeElement = document.activeElement as HTMLElement;
+
+ // Should find which of hour, minute, or seconds sub-windows is open
+ const visibleElement = this.widget.querySelector(
+ `.${Namespace.css.timeContainer} > div[style*="display: grid"]`
+ );
+
+ let subView = Namespace.css.clockContainer;
+
+ if (visibleElement.classList.contains(Namespace.css.hourContainer)) {
+ subView = Namespace.css.hourContainer;
+ }
+ if (visibleElement.classList.contains(Namespace.css.minuteContainer)) {
+ subView = Namespace.css.minuteContainer;
+ }
+ if (visibleElement.classList.contains(Namespace.css.secondContainer)) {
+ subView = Namespace.css.secondContainer;
+ }
+
+ switch (event.key) {
+ case 'Esc':
+ case 'Escape':
+ this._eventEmitters.action.emit({ e: null, action: ActionTypes.close });
+ break;
+
+ case ' ':
+ case 'Enter':
+ activeElement.click();
+
+ event.stopPropagation();
+ event.preventDefault();
+ return;
+
+ case 'Tab':
+ this._handleTab(activeElement, event);
+ return;
+ }
+
+ if (subView === Namespace.css.clockContainer) return;
+
+ const cells = [...visibleElement.querySelectorAll('div')];
+ const currentIndex = cells.indexOf(
+ document.activeElement as HTMLDivElement
+ );
+ const columnCount = 4;
+
+ let targetIndex: number;
+ switch (event.key) {
+ case 'Right':
+ case 'ArrowRight':
+ targetIndex = currentIndex < cells.length - 1 ? currentIndex + 1 : null;
+ flag = true;
+ break;
+
+ case 'Left':
+ case 'ArrowLeft':
+ flag = true;
+ targetIndex = currentIndex > 0 ? currentIndex - 1 : null;
+ break;
+
+ case 'Down':
+ case 'ArrowDown':
+ targetIndex =
+ currentIndex + columnCount < cells.length
+ ? currentIndex + columnCount
+ : null;
+ flag = true;
+ break;
+
+ case 'Up':
+ case 'ArrowUp':
+ targetIndex =
+ currentIndex - columnCount >= 0 ? currentIndex - columnCount : null;
+ flag = true;
+ break;
+ }
+
+ if (!flag) return;
+
+ if (targetIndex !== undefined && targetIndex !== null) {
+ cells[targetIndex].focus();
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+ }
+
+ private _handleTab(activeElement: HTMLElement, event: KeyboardEvent) {
+ const shiftKey = event.shiftKey;
+ // gather tab targets
+ const addCalendarHeaderTargets = () => {
+ const calendarHeaderItems = this.widget.querySelectorAll(
+ `.${Namespace.css.calendarHeader} > div`
+ ) as NodeListOf;
+ tabTargets.push(...calendarHeaderItems);
+ };
+
+ const tabTargets: HTMLElement[] = [];
+ console.log(this.optionsStore.currentView);
+ switch (this.optionsStore.currentView) {
+ case 'clock':
+ {
+ tabTargets.push(
+ ...(this.widget.querySelectorAll(
+ `.${Namespace.css.timeContainer} > div[style*="display: grid"] > div[data-action]`
+ ) as NodeListOf)
+ );
+
+ const clock = this.widget.querySelectorAll(
+ `.${Namespace.css.clockContainer}`
+ )[0] as HTMLElement;
+
+ // add meridiem if it's in view
+ if (clock?.style.display === 'grid') {
+ tabTargets.push(
+ ...(this.widget.querySelectorAll(
+ `.${Namespace.css.toggleMeridiem}`
+ ) as NodeListOf)
+ );
+ }
+ }
+ break;
+ case 'calendar':
+ case 'months':
+ case 'years':
+ case 'decades':
+ addCalendarHeaderTargets();
+ tabTargets.push(this.findViewDateElement());
+ break;
+ }
+
+ const toolbarItems = this.widget.querySelectorAll(
+ `.${Namespace.css.toolbar} > div`
+ ) as NodeListOf;
+ tabTargets.push(...toolbarItems);
+
+ const index = tabTargets.indexOf(activeElement);
+ if (index === -1) return;
+
+ if (shiftKey) {
+ if (index === 0) {
+ tabTargets[tabTargets.length - 1].focus();
+ } else {
+ tabTargets[index - 1].focus();
+ }
+ } else {
+ if (index === tabTargets.length - 1) {
+ tabTargets[0].focus();
+ } else {
+ tabTargets[index + 1].focus();
+ }
+ }
+ event.stopPropagation();
+ event.preventDefault();
+ }
+
+ private _handleFocus() {
+ if (this.optionsStore.currentView === 'clock') this._handleFocusClock();
+ else this.findViewDateElement().focus();
+ }
+
+ private _handleFocusClock() {
+ (
+ this.widget.querySelector(
+ `.${Namespace.css.timeContainer} > div[style*="display: grid"]`
+ ).children[0] as HTMLElement
+ ).focus();
+ }
+}
+
+export type Paint = (
+ unit: Unit | 'decade',
+ innerDate: DateTime,
+ classes: string[],
+ element: HTMLElement
+) => void;
diff --git a/src/js/display/time/hour-display.ts b/src/js/display/time/hour-display.ts
new file mode 100644
index 000000000..b6e92c899
--- /dev/null
+++ b/src/js/display/time/hour-display.ts
@@ -0,0 +1,73 @@
+import { Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Validation from '../../validation';
+import { serviceLocator } from '../../utilities/service-locator';
+import { Paint } from '../index';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+import Dates from '../../dates';
+
+/**
+ * Creates and updates the grid for `hours`
+ */
+export default class HourDisplay {
+ private optionsStore: OptionsStore;
+ private validation: Validation;
+ private dates: Dates;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.validation = serviceLocator.locate(Validation);
+ this.dates = serviceLocator.locate(Dates);
+ }
+ /**
+ * Build the container html for the display
+ * @private
+ */
+ getPicker(): HTMLElement {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.hourContainer);
+
+ for (let i = 0; i < (this.optionsStore.isTwelveHour ? 12 : 24); i++) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.selectHour);
+ container.appendChild(div);
+ }
+
+ return container;
+ }
+
+ /**
+ * Populates the grid and updates enabled states
+ * @private
+ */
+ _update(widget: HTMLElement, paint: Paint): void {
+ const container = widget.getElementsByClassName(
+ Namespace.css.hourContainer
+ )[0] as HTMLElement;
+
+ const innerDate = this.optionsStore.viewDate.clone.startOf(Unit.date);
+
+ container
+ .querySelectorAll(`[data-action="http://github.com/$%7BActionTypes.selectHour%7D"]`)
+ .forEach((containerClone: HTMLElement) => {
+ const classes = [];
+ classes.push(Namespace.css.hour);
+
+ if (!this.validation.isValid(innerDate, Unit.hours)) {
+ classes.push(Namespace.css.disabled);
+ }
+
+ paint(Unit.hours, innerDate, classes, containerClone);
+
+ containerClone.classList.remove(...containerClone.classList);
+ containerClone.classList.add(...classes);
+ containerClone.setAttribute('data-value', `${innerDate.hours}`);
+ containerClone.innerText = innerDate.getHoursFormatted(
+ this.optionsStore.options.localization.hourCycle
+ );
+ innerDate.manipulate(1, Unit.hours);
+ });
+ }
+}
diff --git a/src/js/display/time/minute-display.ts b/src/js/display/time/minute-display.ts
new file mode 100644
index 000000000..ab81b144c
--- /dev/null
+++ b/src/js/display/time/minute-display.ts
@@ -0,0 +1,76 @@
+import { Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Validation from '../../validation';
+import { serviceLocator } from '../../utilities/service-locator';
+import { Paint } from '../index';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+
+/**
+ * Creates and updates the grid for `minutes`
+ */
+export default class MinuteDisplay {
+ private optionsStore: OptionsStore;
+ private validation: Validation;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.validation = serviceLocator.locate(Validation);
+ }
+ /**
+ * Build the container html for the display
+ * @private
+ */
+ getPicker(): HTMLElement {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.minuteContainer);
+
+ const step =
+ this.optionsStore.options.stepping === 1
+ ? 5
+ : this.optionsStore.options.stepping;
+ for (let i = 0; i < 60 / step; i++) {
+ const div = document.createElement('div');
+ div.tabIndex = -1;
+ div.setAttribute('data-action', ActionTypes.selectMinute);
+ container.appendChild(div);
+ }
+
+ return container;
+ }
+
+ /**
+ * Populates the grid and updates enabled states
+ * @private
+ */
+ _update(widget: HTMLElement, paint: Paint): void {
+ const container = widget.getElementsByClassName(
+ Namespace.css.minuteContainer
+ )[0] as HTMLElement;
+
+ const innerDate = this.optionsStore.viewDate.clone.startOf(Unit.hours);
+ const step =
+ this.optionsStore.options.stepping === 1
+ ? 5
+ : this.optionsStore.options.stepping;
+
+ container
+ .querySelectorAll(`[data-action="http://github.com/$%7BActionTypes.selectMinute%7D"]`)
+ .forEach((containerClone: HTMLElement) => {
+ const classes = [];
+ classes.push(Namespace.css.minute);
+
+ if (!this.validation.isValid(innerDate, Unit.minutes)) {
+ classes.push(Namespace.css.disabled);
+ }
+
+ paint(Unit.minutes, innerDate, classes, containerClone);
+
+ containerClone.classList.remove(...containerClone.classList);
+ containerClone.classList.add(...classes);
+ containerClone.setAttribute('data-value', `${innerDate.minutes}`);
+ containerClone.innerText = innerDate.minutesFormatted;
+ innerDate.manipulate(step, Unit.minutes);
+ });
+ }
+}
diff --git a/src/js/display/time/second-display.ts b/src/js/display/time/second-display.ts
new file mode 100644
index 000000000..72c92eda4
--- /dev/null
+++ b/src/js/display/time/second-display.ts
@@ -0,0 +1,68 @@
+import { Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Validation from '../../validation';
+import { serviceLocator } from '../../utilities/service-locator';
+import { Paint } from '../index';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+
+/**
+ * Creates and updates the grid for `seconds`
+ */
+export default class secondDisplay {
+ private optionsStore: OptionsStore;
+ private validation: Validation;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.validation = serviceLocator.locate(Validation);
+ }
+ /**
+ * Build the container html for the display
+ * @private
+ */
+ getPicker(): HTMLElement {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.secondContainer);
+
+ for (let i = 0; i < 12; i++) {
+ const div = document.createElement('div');
+ div.setAttribute('data-action', ActionTypes.selectSecond);
+ div.tabIndex = -1;
+ container.appendChild(div);
+ }
+
+ return container;
+ }
+
+ /**
+ * Populates the grid and updates enabled states
+ * @private
+ */
+ _update(widget: HTMLElement, paint: Paint): void {
+ const container = widget.getElementsByClassName(
+ Namespace.css.secondContainer
+ )[0] as HTMLElement;
+
+ const innerDate = this.optionsStore.viewDate.clone.startOf(Unit.minutes);
+
+ container
+ .querySelectorAll(`[data-action="http://github.com/$%7BActionTypes.selectSecond%7D"]`)
+ .forEach((containerClone: HTMLElement) => {
+ const classes = [];
+ classes.push(Namespace.css.second);
+
+ if (!this.validation.isValid(innerDate, Unit.seconds)) {
+ classes.push(Namespace.css.disabled);
+ }
+
+ paint(Unit.seconds, innerDate, classes, containerClone);
+
+ containerClone.classList.remove(...containerClone.classList);
+ containerClone.classList.add(...classes);
+ containerClone.setAttribute('data-value', `${innerDate.seconds}`);
+ containerClone.innerText = innerDate.secondsFormatted;
+ innerDate.manipulate(5, Unit.seconds);
+ });
+ }
+}
diff --git a/src/js/display/time/time-display.ts b/src/js/display/time/time-display.ts
new file mode 100644
index 000000000..e6d2f0757
--- /dev/null
+++ b/src/js/display/time/time-display.ts
@@ -0,0 +1,333 @@
+import { Unit } from '../../datetime';
+import Namespace from '../../utilities/namespace';
+import Validation from '../../validation';
+import Dates from '../../dates';
+import { serviceLocator } from '../../utilities/service-locator';
+import ActionTypes from '../../utilities/action-types';
+import { OptionsStore } from '../../utilities/optionsStore';
+
+/**
+ * Creates the clock display
+ */
+export default class TimeDisplay {
+ private _gridColumns = '';
+ private optionsStore: OptionsStore;
+ private validation: Validation;
+ private dates: Dates;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.dates = serviceLocator.locate(Dates);
+ this.validation = serviceLocator.locate(Validation);
+ }
+
+ /**
+ * Build the container html for the clock display
+ * @private
+ */
+ getPicker(iconTag: (iconClass: string) => HTMLElement): HTMLElement {
+ const container = document.createElement('div');
+ container.classList.add(Namespace.css.clockContainer);
+
+ container.append(...this._grid(iconTag));
+
+ return container;
+ }
+
+ /**
+ * Populates the various elements with in the clock display
+ * like the current hour and if the manipulation icons are enabled.
+ * @private
+ */
+ _update(widget: HTMLElement): void {
+ const timesDiv = (
+ widget.getElementsByClassName(Namespace.css.clockContainer)[0]
+ );
+
+ let lastPicked = this.dates.lastPicked?.clone;
+ if (!lastPicked && this.optionsStore.options.useCurrent)
+ lastPicked = this.optionsStore.viewDate.clone;
+
+ timesDiv
+ .querySelectorAll('.disabled')
+ .forEach((element) => element.classList.remove(Namespace.css.disabled));
+
+ if (this.optionsStore.options.display.components.hours) {
+ if (
+ !this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(1, Unit.hours),
+ Unit.hours
+ )
+ ) {
+ timesDiv
+ .querySelector(`[data-action=${ActionTypes.incrementHours}]`)
+ .classList.add(Namespace.css.disabled);
+ }
+
+ if (
+ !this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(-1, Unit.hours),
+ Unit.hours
+ )
+ ) {
+ timesDiv
+ .querySelector(`[data-action=${ActionTypes.decrementHours}]`)
+ .classList.add(Namespace.css.disabled);
+ }
+
+ timesDiv.querySelector(
+ `[data-time-component=${Unit.hours}]`
+ ).innerText = lastPicked
+ ? lastPicked.getHoursFormatted(
+ this.optionsStore.options.localization.hourCycle
+ )
+ : '--';
+ }
+
+ if (this.optionsStore.options.display.components.minutes) {
+ if (
+ !this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(1, Unit.minutes),
+ Unit.minutes
+ )
+ ) {
+ timesDiv
+ .querySelector(`[data-action=${ActionTypes.incrementMinutes}]`)
+ .classList.add(Namespace.css.disabled);
+ }
+
+ if (
+ !this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(-1, Unit.minutes),
+ Unit.minutes
+ )
+ ) {
+ timesDiv
+ .querySelector(`[data-action=${ActionTypes.decrementMinutes}]`)
+ .classList.add(Namespace.css.disabled);
+ }
+ timesDiv.querySelector(
+ `[data-time-component=${Unit.minutes}]`
+ ).innerText = lastPicked ? lastPicked.minutesFormatted : '--';
+ }
+
+ if (this.optionsStore.options.display.components.seconds) {
+ if (
+ !this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(1, Unit.seconds),
+ Unit.seconds
+ )
+ ) {
+ timesDiv
+ .querySelector(`[data-action=${ActionTypes.incrementSeconds}]`)
+ .classList.add(Namespace.css.disabled);
+ }
+
+ if (
+ !this.validation.isValid(
+ this.optionsStore.viewDate.clone.manipulate(-1, Unit.seconds),
+ Unit.seconds
+ )
+ ) {
+ timesDiv
+ .querySelector(`[data-action=${ActionTypes.decrementSeconds}]`)
+ .classList.add(Namespace.css.disabled);
+ }
+ timesDiv.querySelector(
+ `[data-time-component=${Unit.seconds}]`
+ ).innerText = lastPicked ? lastPicked.secondsFormatted : '--';
+ }
+
+ if (this.optionsStore.isTwelveHour) {
+ const toggle = timesDiv.querySelector(
+ `[data-action=${ActionTypes.toggleMeridiem}]`
+ );
+
+ const meridiemDate = (lastPicked || this.optionsStore.viewDate).clone;
+
+ toggle.innerText = meridiemDate.meridiem();
+
+ if (
+ !this.validation.isValid(
+ meridiemDate.manipulate(
+ meridiemDate.hours >= 12 ? -12 : 12,
+ Unit.hours
+ )
+ )
+ ) {
+ toggle.classList.add(Namespace.css.disabled);
+ } else {
+ toggle.classList.remove(Namespace.css.disabled);
+ }
+ }
+
+ timesDiv.style.gridTemplateAreas = `"${this._gridColumns}"`;
+ }
+
+ /**
+ * Creates the table for the clock display depending on what options are selected.
+ * @private
+ */
+ private _grid(iconTag: (iconClass: string) => HTMLElement): HTMLElement[] {
+ this._gridColumns = '';
+ const top = [],
+ middle = [],
+ bottom = [],
+ separator = document.createElement('div'),
+ upIcon = iconTag(this.optionsStore.options.display.icons.up),
+ downIcon = iconTag(this.optionsStore.options.display.icons.down);
+
+ separator.classList.add(Namespace.css.separator, Namespace.css.noHighlight);
+ const separatorColon = separator.cloneNode(true);
+ separatorColon.innerHTML = ':';
+
+ const getSeparator = (colon = false): HTMLElement => {
+ return colon
+ ? separatorColon.cloneNode(true)
+ : separator.cloneNode(true);
+ };
+
+ if (this.optionsStore.options.display.components.hours) {
+ let divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.incrementHour
+ );
+ divElement.setAttribute('data-action', ActionTypes.incrementHours);
+ divElement.appendChild(upIcon.cloneNode(true));
+ top.push(divElement);
+
+ divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.pickHour
+ );
+ divElement.setAttribute('data-action', ActionTypes.showHours);
+ divElement.setAttribute('data-time-component', Unit.hours);
+ middle.push(divElement);
+
+ divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.decrementHour
+ );
+ divElement.setAttribute('data-action', ActionTypes.decrementHours);
+ divElement.appendChild(downIcon.cloneNode(true));
+ bottom.push(divElement);
+ this._gridColumns += 'a';
+ }
+
+ if (this.optionsStore.options.display.components.minutes) {
+ this._gridColumns += ' a';
+ if (this.optionsStore.options.display.components.hours) {
+ top.push(getSeparator());
+ middle.push(getSeparator(true));
+ bottom.push(getSeparator());
+ this._gridColumns += ' a';
+ }
+ let divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.incrementMinute
+ );
+ divElement.setAttribute('data-action', ActionTypes.incrementMinutes);
+ divElement.appendChild(upIcon.cloneNode(true));
+ top.push(divElement);
+
+ divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.pickMinute
+ );
+ divElement.setAttribute('data-action', ActionTypes.showMinutes);
+ divElement.setAttribute('data-time-component', Unit.minutes);
+ middle.push(divElement);
+
+ divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.decrementMinute
+ );
+ divElement.setAttribute('data-action', ActionTypes.decrementMinutes);
+ divElement.appendChild(downIcon.cloneNode(true));
+ bottom.push(divElement);
+ }
+
+ if (this.optionsStore.options.display.components.seconds) {
+ this._gridColumns += ' a';
+ if (this.optionsStore.options.display.components.minutes) {
+ top.push(getSeparator());
+ middle.push(getSeparator(true));
+ bottom.push(getSeparator());
+ this._gridColumns += ' a';
+ }
+ let divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.incrementSecond
+ );
+ divElement.setAttribute('data-action', ActionTypes.incrementSeconds);
+ divElement.appendChild(upIcon.cloneNode(true));
+ top.push(divElement);
+
+ divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.pickSecond
+ );
+ divElement.setAttribute('data-action', ActionTypes.showSeconds);
+ divElement.setAttribute('data-time-component', Unit.seconds);
+ middle.push(divElement);
+
+ divElement = document.createElement('div');
+ divElement.tabIndex = -1;
+ divElement.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.decrementSecond
+ );
+ divElement.setAttribute('data-action', ActionTypes.decrementSeconds);
+ divElement.appendChild(downIcon.cloneNode(true));
+ bottom.push(divElement);
+ }
+
+ if (this.optionsStore.isTwelveHour) {
+ this._gridColumns += ' a';
+ let divElement = getSeparator();
+ top.push(divElement);
+
+ const button = document.createElement('button');
+ button.tabIndex = -1;
+ button.setAttribute('type', 'button');
+ button.setAttribute(
+ 'title',
+ this.optionsStore.options.localization.toggleMeridiem
+ );
+ button.setAttribute('data-action', ActionTypes.toggleMeridiem);
+ button.setAttribute('tabindex', '-1');
+ if (Namespace.css.toggleMeridiem.includes(',')) {
+ //todo move this to paint function?
+ button.classList.add(...Namespace.css.toggleMeridiem.split(','));
+ } else button.classList.add(Namespace.css.toggleMeridiem);
+
+ divElement = document.createElement('div');
+ divElement.classList.add(Namespace.css.noHighlight);
+ divElement.appendChild(button);
+ middle.push(divElement);
+
+ divElement = getSeparator();
+ bottom.push(divElement);
+ }
+
+ this._gridColumns = this._gridColumns.trim();
+
+ return [...top, ...middle, ...bottom];
+ }
+}
diff --git a/src/js/jQuery-provider.js b/src/js/jQuery-provider.js
new file mode 100644
index 000000000..bcf296cfd
--- /dev/null
+++ b/src/js/jQuery-provider.js
@@ -0,0 +1,154 @@
+///
+/*global $, tempusDominus */
+
+/*!
+ * Tempus Dominus v6.10.3 (https://getdatepicker.com/)
+ * Copyright 2013-2021 Jonathan Peterson
+ * Licensed under MIT (https://github.com/Eonasdan/tempus-dominus/blob/master/LICENSE)
+ */
+tempusDominus.jQueryInterface = function (option, argument) {
+ if (this.length === 1) {
+ return tempusDominus.jQueryHandleThis(this, option, argument);
+ }
+ // "this" is jquery here
+ return this.each(function () {
+ tempusDominus.jQueryHandleThis(this, option, argument);
+ });
+};
+
+tempusDominus.jQueryHandleThis = function (me, option, argument) {
+ let data = $(me).data(tempusDominus.Namespace.dataKey);
+ if (typeof option === 'object') {
+ option = $.extend({}, tempusDominus.DefaultOptions, option);
+ }
+
+ if (!data) {
+ data = new tempusDominus.TempusDominus($(me)[0], option);
+ $(me).data(tempusDominus.Namespace.dataKey, data);
+ }
+
+ if (typeof option === 'string') {
+ if (data[option] === undefined) {
+ throw new Error(`No method named "${option}"`);
+ }
+ if (argument === undefined) {
+ return data[option]();
+ } else {
+ if (option === 'date') {
+ data.isDateUpdateThroughDateOptionFromClientCode = true;
+ }
+ const ret = data[option](argument);
+ data.isDateUpdateThroughDateOptionFromClientCode = false;
+ return ret;
+ }
+ }
+};
+
+tempusDominus.getSelectorFromElement = function ($element) {
+ let selector = $element.data('target'),
+ $selector;
+
+ if (!selector) {
+ selector = $element.attr('href') || '';
+ selector = /^#[a-z]/i.test(selector) ? selector : null;
+ }
+ $selector = $(selector);
+ if ($selector.length === 0) {
+ return $element;
+ }
+
+ if (!$selector.data(tempusDominus.Namespace.dataKey)) {
+ $.extend({}, $selector.data(), $(this).data());
+ }
+
+ return $selector;
+};
+
+/**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+$(document)
+ .on(
+ `click${tempusDominus.Namespace.events.key}.data-api`,
+ `[data-toggle="${tempusDominus.Namespace.dataKey}"]`,
+ function () {
+ const $originalTarget = $(this),
+ $target = tempusDominus.getSelectorFromElement($originalTarget),
+ config = $target.data(tempusDominus.Namespace.dataKey);
+ if ($target.length === 0) {
+ return;
+ }
+ if (
+ config._options.allowInputToggle &&
+ $originalTarget.is('input[data-toggle="datetimepicker"]')
+ ) {
+ return;
+ }
+ tempusDominus.jQueryInterface.call($target, 'toggle');
+ }
+ )
+ .on(
+ tempusDominus.Namespace.events.change,
+ `.${tempusDominus.Namespace.NAME}-input`,
+ function (event) {
+ const $target = tempusDominus.getSelectorFromElement($(this));
+ if ($target.length === 0 || event.isInit) {
+ return;
+ }
+ tempusDominus.jQueryInterface.call($target, '_change', event);
+ }
+ )
+ .on(
+ tempusDominus.Namespace.events.blur,
+ `.${tempusDominus.Namespace.NAME}-input`,
+ function (event) {
+ const $target = tempusDominus.getSelectorFromElement($(this)),
+ config = $target.data(tempusDominus.Namespace.dataKey);
+ if ($target.length === 0) {
+ return;
+ }
+ if (config._options.debug || window.debug) {
+ return;
+ }
+ tempusDominus.jQueryInterface.call($target, 'hide', event);
+ }
+ )
+ /*.on(tempusDominus.Namespace.Events.keydown, `.${tempusDominus.Namespace.NAME}-input`, function (event) {
+ const $target = tempusDominus.getSelectorFromElement($(this));
+ if ($target.length === 0) {
+ return;
+ }
+ tempusDominus.jQueryInterface.call($target, '_keydown', event);
+ })
+ .on(tempusDominus.Namespace.Events.keyup, `.${tempusDominus.Namespace.NAME}-input`, function (event) {
+ const $target = tempusDominus.getSelectorFromElement($(this));
+ if ($target.length === 0) {
+ return;
+ }
+ tempusDominus.jQueryInterface.call($target, '_keyup', event);
+ })*/
+ .on(
+ tempusDominus.Namespace.events.focus,
+ `.${tempusDominus.Namespace.NAME}-input`,
+ function (event) {
+ const $target = tempusDominus.getSelectorFromElement($(this)),
+ config = $target.data(tempusDominus.Namespace.dataKey);
+ if ($target.length === 0) {
+ return;
+ }
+ if (!config._options.allowInputToggle) {
+ return;
+ }
+ tempusDominus.jQueryInterface.call($target, 'show', event);
+ }
+ );
+const name = 'tempusDominus';
+const JQUERY_NO_CONFLICT = $.fn[name];
+$.fn[name] = tempusDominus.jQueryInterface;
+$.fn[name].Constructor = tempusDominus.TempusDominus;
+$.fn[name].noConflict = function () {
+ $.fn[name] = JQUERY_NO_CONFLICT;
+ return tempusDominus.jQueryInterface;
+};
diff --git a/src/js/locales/ar-SA.ts b/src/js/locales/ar-SA.ts
new file mode 100644
index 000000000..419685b4f
--- /dev/null
+++ b/src/js/locales/ar-SA.ts
@@ -0,0 +1,45 @@
+const name = 'ar-SA';
+
+const localization = {
+ today: 'اليوم',
+ clear: 'مسح',
+ close: 'إغلاق',
+ selectMonth: 'اختر الشهر',
+ previousMonth: 'الشهر السابق',
+ nextMonth: 'الشهر التالي',
+ selectYear: 'اختر السنة',
+ previousYear: 'العام السابق',
+ nextYear: 'العام التالي',
+ selectDecade: 'اختر العقد',
+ previousDecade: 'العقد السابق',
+ nextDecade: 'العقد التالي',
+ previousCentury: 'القرن السابق',
+ nextCentury: 'القرن التالي',
+ pickHour: 'اختر الساعة',
+ incrementHour: 'أضف ساعة',
+ decrementHour: 'أنقص ساعة',
+ pickMinute: 'اختر الدقيقة',
+ incrementMinute: 'أضف دقيقة',
+ decrementMinute: 'أنقص دقيقة',
+ pickSecond: 'اختر الثانية',
+ incrementSecond: 'أضف ثانية',
+ decrementSecond: 'أنقص ثانية',
+ toggleMeridiem: 'تبديل الفترة',
+ selectTime: 'اخر الوقت',
+ selectDate: 'اختر التاريخ',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'ar-SA',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/ar.ts b/src/js/locales/ar.ts
new file mode 100644
index 000000000..7bb29bc54
--- /dev/null
+++ b/src/js/locales/ar.ts
@@ -0,0 +1,45 @@
+const name = 'ar';
+
+const localization = {
+ today: 'اليوم',
+ clear: 'مسح',
+ close: 'إغلاق',
+ selectMonth: 'اختر الشهر',
+ previousMonth: 'الشهر السابق',
+ nextMonth: 'الشهر التالي',
+ selectYear: 'اختر السنة',
+ previousYear: 'العام السابق',
+ nextYear: 'العام التالي',
+ selectDecade: 'اختر العقد',
+ previousDecade: 'العقد السابق',
+ nextDecade: 'العقد التالي',
+ previousCentury: 'القرن السابق',
+ nextCentury: 'القرن التالي',
+ pickHour: 'اختر الساعة',
+ incrementHour: 'أضف ساعة',
+ decrementHour: 'أنقص ساعة',
+ pickMinute: 'اختر الدقيقة',
+ incrementMinute: 'أضف دقيقة',
+ decrementMinute: 'أنقص دقيقة',
+ pickSecond: 'اختر الثانية',
+ incrementSecond: 'أضف ثانية',
+ decrementSecond: 'أنقص ثانية',
+ toggleMeridiem: 'تبديل الفترة',
+ selectTime: 'اخر الوقت',
+ selectDate: 'اختر التاريخ',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'ar',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'd/M/yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/bootstrap-datetimepicker.ar-ma.js b/src/js/locales/bootstrap-datetimepicker.ar-ma.js
deleted file mode 100644
index 44007c802..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ar-ma.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : Moroccan Arabic (ar-ma)
-// author : ElFadili Yassine : https://github.com/ElFadiliY
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ar-ma', {
- months : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
- monthsShort : "يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
- weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
- weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),
- weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[اليوم على الساعة] LT",
- nextDay: '[غدا على الساعة] LT',
- nextWeek: 'dddd [على الساعة] LT',
- lastDay: '[أمس على الساعة] LT',
- lastWeek: 'dddd [على الساعة] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "في %s",
- past : "منذ %s",
- s : "ثوان",
- m : "دقيقة",
- mm : "%d دقائق",
- h : "ساعة",
- hh : "%d ساعات",
- d : "يوم",
- dd : "%d أيام",
- M : "شهر",
- MM : "%d أشهر",
- y : "سنة",
- yy : "%d سنوات"
- },
- week : {
- dow : 6, // Saturday is the first day of the week.
- doy : 12 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ar.js b/src/js/locales/bootstrap-datetimepicker.ar.js
deleted file mode 100644
index 744406668..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ar.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : Arabic (ar)
-// author : Abdel Said : https://github.com/abdelsaid
-// changes in months, weekdays : Ahmed Elkhatib
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ar', {
- months : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
- monthsShort : "يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
- weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
- weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
- weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[اليوم على الساعة] LT",
- nextDay: '[غدا على الساعة] LT',
- nextWeek: 'dddd [على الساعة] LT',
- lastDay: '[أمس على الساعة] LT',
- lastWeek: 'dddd [على الساعة] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "في %s",
- past : "منذ %s",
- s : "ثوان",
- m : "دقيقة",
- mm : "%d دقائق",
- h : "ساعة",
- hh : "%d ساعات",
- d : "يوم",
- dd : "%d أيام",
- M : "شهر",
- MM : "%d أشهر",
- y : "سنة",
- yy : "%d سنوات"
- },
- week : {
- dow : 6, // Saturday is the first day of the week.
- doy : 12 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.bg.js b/src/js/locales/bootstrap-datetimepicker.bg.js
deleted file mode 100644
index 4076935fd..000000000
--- a/src/js/locales/bootstrap-datetimepicker.bg.js
+++ /dev/null
@@ -1,86 +0,0 @@
-// moment.js language configuration
-// language : bulgarian (bg)
-// author : Krasen Borisov : https://github.com/kraz
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('bg', {
- months : "януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),
- monthsShort : "янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),
- weekdays : "неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),
- weekdaysShort : "нед_пон_вто_сря_чет_пет_съб".split("_"),
- weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "D.MM.YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[Днес в] LT',
- nextDay : '[Утре в] LT',
- nextWeek : 'dddd [в] LT',
- lastDay : '[Вчера в] LT',
- lastWeek : function () {
- switch (this.day()) {
- case 0:
- case 3:
- case 6:
- return '[В изминалата] dddd [в] LT';
- case 1:
- case 2:
- case 4:
- case 5:
- return '[В изминалия] dddd [в] LT';
- }
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : "след %s",
- past : "преди %s",
- s : "няколко секунди",
- m : "минута",
- mm : "%d минути",
- h : "час",
- hh : "%d часа",
- d : "ден",
- dd : "%d дни",
- M : "месец",
- MM : "%d месеца",
- y : "година",
- yy : "%d години"
- },
- ordinal : function (number) {
- var lastDigit = number % 10,
- last2Digits = number % 100;
- if (number === 0) {
- return number + '-ев';
- } else if (last2Digits === 0) {
- return number + '-ен';
- } else if (last2Digits > 10 && last2Digits < 20) {
- return number + '-ти';
- } else if (lastDigit === 1) {
- return number + '-ви';
- } else if (lastDigit === 2) {
- return number + '-ри';
- } else if (lastDigit === 7 || lastDigit === 8) {
- return number + '-ми';
- } else {
- return number + '-ти';
- }
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.br.js b/src/js/locales/bootstrap-datetimepicker.br.js
deleted file mode 100644
index 39c60df07..000000000
--- a/src/js/locales/bootstrap-datetimepicker.br.js
+++ /dev/null
@@ -1,107 +0,0 @@
-// moment.js language configuration
-// language : breton (br)
-// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- function relativeTimeWithMutation(number, withoutSuffix, key) {
- var format = {
- 'mm': "munutenn",
- 'MM': "miz",
- 'dd': "devezh"
- };
- return number + ' ' + mutation(format[key], number);
- }
-
- function specialMutationForYears(number) {
- switch (lastNumber(number)) {
- case 1:
- case 3:
- case 4:
- case 5:
- case 9:
- return number + ' bloaz';
- default:
- return number + ' vloaz';
- }
- }
-
- function lastNumber(number) {
- if (number > 9) {
- return lastNumber(number % 10);
- }
- return number;
- }
-
- function mutation(text, number) {
- if (number === 2) {
- return softMutation(text);
- }
- return text;
- }
-
- function softMutation(text) {
- var mutationTable = {
- 'm': 'v',
- 'b': 'v',
- 'd': 'z'
- };
- if (mutationTable[text.charAt(0)] === undefined) {
- return text;
- }
- return mutationTable[text.charAt(0)] + text.substring(1);
- }
-
- return moment.lang('br', {
- months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),
- monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),
- weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),
- weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),
- weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),
- longDateFormat : {
- LT : "h[e]mm A",
- L : "DD/MM/YYYY",
- LL : "D [a viz] MMMM YYYY",
- LLL : "D [a viz] MMMM YYYY LT",
- LLLL : "dddd, D [a viz] MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[Hiziv da] LT',
- nextDay : '[Warc\'hoazh da] LT',
- nextWeek : 'dddd [da] LT',
- lastDay : '[Dec\'h da] LT',
- lastWeek : 'dddd [paset da] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "a-benn %s",
- past : "%s 'zo",
- s : "un nebeud segondennoù",
- m : "ur vunutenn",
- mm : relativeTimeWithMutation,
- h : "un eur",
- hh : "%d eur",
- d : "un devezh",
- dd : relativeTimeWithMutation,
- M : "ur miz",
- MM : relativeTimeWithMutation,
- y : "ur bloaz",
- yy : specialMutationForYears
- },
- ordinal : function (number) {
- var output = (number === 1) ? 'añ' : 'vet';
- return number + output;
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.bs.js b/src/js/locales/bootstrap-datetimepicker.bs.js
deleted file mode 100644
index 83a9b4c07..000000000
--- a/src/js/locales/bootstrap-datetimepicker.bs.js
+++ /dev/null
@@ -1,139 +0,0 @@
-// moment.js language configuration
-// language : bosnian (bs)
-// author : Nedim Cholich : https://github.com/frontyard
-// based on (hr) translation by Bojan Marković
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
-
- function translate(number, withoutSuffix, key) {
- var result = number + " ";
- switch (key) {
- case 'm':
- return withoutSuffix ? 'jedna minuta' : 'jedne minute';
- case 'mm':
- if (number === 1) {
- result += 'minuta';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'minute';
- } else {
- result += 'minuta';
- }
- return result;
- case 'h':
- return withoutSuffix ? 'jedan sat' : 'jednog sata';
- case 'hh':
- if (number === 1) {
- result += 'sat';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'sata';
- } else {
- result += 'sati';
- }
- return result;
- case 'dd':
- if (number === 1) {
- result += 'dan';
- } else {
- result += 'dana';
- }
- return result;
- case 'MM':
- if (number === 1) {
- result += 'mjesec';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'mjeseca';
- } else {
- result += 'mjeseci';
- }
- return result;
- case 'yy':
- if (number === 1) {
- result += 'godina';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'godine';
- } else {
- result += 'godina';
- }
- return result;
- }
- }
-
- return moment.lang('bs', {
- months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),
- monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
- weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
- weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
- weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD. MM. YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY LT",
- LLLL : "dddd, D. MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[danas u] LT',
- nextDay : '[sutra u] LT',
-
- nextWeek : function () {
- switch (this.day()) {
- case 0:
- return '[u] [nedjelju] [u] LT';
- case 3:
- return '[u] [srijedu] [u] LT';
- case 6:
- return '[u] [subotu] [u] LT';
- case 1:
- case 2:
- case 4:
- case 5:
- return '[u] dddd [u] LT';
- }
- },
- lastDay : '[jučer u] LT',
- lastWeek : function () {
- switch (this.day()) {
- case 0:
- case 3:
- return '[prošlu] dddd [u] LT';
- case 6:
- return '[prošle] [subote] [u] LT';
- case 1:
- case 2:
- case 4:
- case 5:
- return '[prošli] dddd [u] LT';
- }
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : "za %s",
- past : "prije %s",
- s : "par sekundi",
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : "dan",
- dd : translate,
- M : "mjesec",
- MM : translate,
- y : "godinu",
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ca.js b/src/js/locales/bootstrap-datetimepicker.ca.js
deleted file mode 100644
index f0cc02167..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ca.js
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js language configuration
-// language : catalan (ca)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ca', {
- months : "Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),
- monthsShort : "Gen._Febr._Mar._Abr._Mai._Jun._Jul._Ag._Set._Oct._Nov._Des.".split("_"),
- weekdays : "Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),
- weekdaysShort : "Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),
- weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay : function () {
- return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
- },
- nextDay : function () {
- return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
- },
- nextWeek : function () {
- return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
- },
- lastDay : function () {
- return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
- },
- lastWeek : function () {
- return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : "en %s",
- past : "fa %s",
- s : "uns segons",
- m : "un minut",
- mm : "%d minuts",
- h : "una hora",
- hh : "%d hores",
- d : "un dia",
- dd : "%d dies",
- M : "un mes",
- MM : "%d mesos",
- y : "un any",
- yy : "%d anys"
- },
- ordinal : '%dº',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.cs.js b/src/js/locales/bootstrap-datetimepicker.cs.js
deleted file mode 100644
index c1396cfbf..000000000
--- a/src/js/locales/bootstrap-datetimepicker.cs.js
+++ /dev/null
@@ -1,155 +0,0 @@
-// moment.js language configuration
-// language : czech (cs)
-// author : petrbela : https://github.com/petrbela
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var months = "leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),
- monthsShort = "led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");
-
- function plural(n) {
- return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
- }
-
- function translate(number, withoutSuffix, key, isFuture) {
- var result = number + " ";
- switch (key) {
- case 's': // a few seconds / in a few seconds / a few seconds ago
- return (withoutSuffix || isFuture) ? 'pár vteřin' : 'pár vteřinami';
- case 'm': // a minute / in a minute / a minute ago
- return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
- case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'minuty' : 'minut');
- } else {
- return result + 'minutami';
- }
- break;
- case 'h': // an hour / in an hour / an hour ago
- return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
- case 'hh': // 9 hours / in 9 hours / 9 hours ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'hodiny' : 'hodin');
- } else {
- return result + 'hodinami';
- }
- break;
- case 'd': // a day / in a day / a day ago
- return (withoutSuffix || isFuture) ? 'den' : 'dnem';
- case 'dd': // 9 days / in 9 days / 9 days ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'dny' : 'dní');
- } else {
- return result + 'dny';
- }
- break;
- case 'M': // a month / in a month / a month ago
- return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
- case 'MM': // 9 months / in 9 months / 9 months ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'měsíce' : 'měsíců');
- } else {
- return result + 'měsíci';
- }
- break;
- case 'y': // a year / in a year / a year ago
- return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
- case 'yy': // 9 years / in 9 years / 9 years ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'roky' : 'let');
- } else {
- return result + 'lety';
- }
- break;
- }
- }
-
- return moment.lang('cs', {
- months : months,
- monthsShort : monthsShort,
- monthsParse : (function (months, monthsShort) {
- var i, _monthsParse = [];
- for (i = 0; i < 12; i++) {
- // use custom parser to solve problem with July (červenec)
- _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
- }
- return _monthsParse;
- }(months, monthsShort)),
- weekdays : "neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),
- weekdaysShort : "ne_po_út_st_čt_pá_so".split("_"),
- weekdaysMin : "ne_po_út_st_čt_pá_so".split("_"),
- longDateFormat : {
- LT: "H:mm",
- L : "DD.MM.YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY LT",
- LLLL : "dddd D. MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[dnes v] LT",
- nextDay: '[zítra v] LT',
- nextWeek: function () {
- switch (this.day()) {
- case 0:
- return '[v neděli v] LT';
- case 1:
- case 2:
- return '[v] dddd [v] LT';
- case 3:
- return '[ve středu v] LT';
- case 4:
- return '[ve čtvrtek v] LT';
- case 5:
- return '[v pátek v] LT';
- case 6:
- return '[v sobotu v] LT';
- }
- },
- lastDay: '[včera v] LT',
- lastWeek: function () {
- switch (this.day()) {
- case 0:
- return '[minulou neděli v] LT';
- case 1:
- case 2:
- return '[minulé] dddd [v] LT';
- case 3:
- return '[minulou středu v] LT';
- case 4:
- case 5:
- return '[minulý] dddd [v] LT';
- case 6:
- return '[minulou sobotu v] LT';
- }
- },
- sameElse: "L"
- },
- relativeTime : {
- future : "za %s",
- past : "před %s",
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.cv.js b/src/js/locales/bootstrap-datetimepicker.cv.js
deleted file mode 100644
index ed9e26029..000000000
--- a/src/js/locales/bootstrap-datetimepicker.cv.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js language configuration
-// language : chuvash (cv)
-// author : Anatoly Mironov : https://github.com/mirontoli
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('cv', {
- months : "кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),
- monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),
- weekdays : "вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),
- weekdaysShort : "выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),
- weekdaysMin : "вр_тн_ыт_юн_кç_эр_шм".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD-MM-YYYY",
- LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",
- LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",
- LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"
- },
- calendar : {
- sameDay: '[Паян] LT [сехетре]',
- nextDay: '[Ыран] LT [сехетре]',
- lastDay: '[Ĕнер] LT [сехетре]',
- nextWeek: '[Çитес] dddd LT [сехетре]',
- lastWeek: '[Иртнĕ] dddd LT [сехетре]',
- sameElse: 'L'
- },
- relativeTime : {
- future : function (output) {
- var affix = /сехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран";
- return output + affix;
- },
- past : "%s каялла",
- s : "пĕр-ик çеккунт",
- m : "пĕр минут",
- mm : "%d минут",
- h : "пĕр сехет",
- hh : "%d сехет",
- d : "пĕр кун",
- dd : "%d кун",
- M : "пĕр уйăх",
- MM : "%d уйăх",
- y : "пĕр çул",
- yy : "%d çул"
- },
- ordinal : '%d-мĕш',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.da.js b/src/js/locales/bootstrap-datetimepicker.da.js
deleted file mode 100644
index 2fa8244c0..000000000
--- a/src/js/locales/bootstrap-datetimepicker.da.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : danish (da)
-// author : Ulrik Nielsen : https://github.com/mrbase
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('da', {
- months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),
- monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
- weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
- weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"),
- weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D. MMMM, YYYY LT"
- },
- calendar : {
- sameDay : '[I dag kl.] LT',
- nextDay : '[I morgen kl.] LT',
- nextWeek : 'dddd [kl.] LT',
- lastDay : '[I går kl.] LT',
- lastWeek : '[sidste] dddd [kl] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "om %s",
- past : "%s siden",
- s : "få sekunder",
- m : "et minut",
- mm : "%d minutter",
- h : "en time",
- hh : "%d timer",
- d : "en dag",
- dd : "%d dage",
- M : "en måned",
- MM : "%d måneder",
- y : "et år",
- yy : "%d år"
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.de.js b/src/js/locales/bootstrap-datetimepicker.de.js
deleted file mode 100644
index 988f32882..000000000
--- a/src/js/locales/bootstrap-datetimepicker.de.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// moment.js language configuration
-// language : german (de)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- function processRelativeTime(number, withoutSuffix, key, isFuture) {
- var format = {
- 'm': ['eine Minute', 'einer Minute'],
- 'h': ['eine Stunde', 'einer Stunde'],
- 'd': ['ein Tag', 'einem Tag'],
- 'dd': [number + ' Tage', number + ' Tagen'],
- 'M': ['ein Monat', 'einem Monat'],
- 'MM': [number + ' Monate', number + ' Monaten'],
- 'y': ['ein Jahr', 'einem Jahr'],
- 'yy': [number + ' Jahre', number + ' Jahren']
- };
- return withoutSuffix ? format[key][0] : format[key][1];
- }
-
- return moment.lang('de', {
- months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),
- monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),
- weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),
- weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),
- weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"),
- longDateFormat : {
- LT: "H:mm [Uhr]",
- L : "DD.MM.YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY LT",
- LLLL : "dddd, D. MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[Heute um] LT",
- sameElse: "L",
- nextDay: '[Morgen um] LT',
- nextWeek: 'dddd [um] LT',
- lastDay: '[Gestern um] LT',
- lastWeek: '[letzten] dddd [um] LT'
- },
- relativeTime : {
- future : "in %s",
- past : "vor %s",
- s : "ein paar Sekunden",
- m : processRelativeTime,
- mm : "%d Minuten",
- h : processRelativeTime,
- hh : "%d Stunden",
- d : processRelativeTime,
- dd : processRelativeTime,
- M : processRelativeTime,
- MM : processRelativeTime,
- y : processRelativeTime,
- yy : processRelativeTime
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.el.js b/src/js/locales/bootstrap-datetimepicker.el.js
deleted file mode 100644
index 665c65173..000000000
--- a/src/js/locales/bootstrap-datetimepicker.el.js
+++ /dev/null
@@ -1,79 +0,0 @@
-// moment.js language configuration
-// language : modern greek (el)
-// author : Aggelos Karalias : https://github.com/mehiel
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('el', {
- monthsNominativeEl : "Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),
- monthsGenitiveEl : "Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),
- months : function (momentToFormat, format) {
- if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM'
- return this._monthsGenitiveEl[momentToFormat.month()];
- } else {
- return this._monthsNominativeEl[momentToFormat.month()];
- }
- },
- monthsShort : "Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),
- weekdays : "Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),
- weekdaysShort : "Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),
- weekdaysMin : "Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),
- meridiem : function (hours, minutes, isLower) {
- if (hours > 11) {
- return isLower ? 'μμ' : 'ΜΜ';
- } else {
- return isLower ? 'πμ' : 'ΠΜ';
- }
- },
- longDateFormat : {
- LT : "h:mm A",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendarEl : {
- sameDay : '[Σήμερα {}] LT',
- nextDay : '[Αύριο {}] LT',
- nextWeek : 'dddd [{}] LT',
- lastDay : '[Χθες {}] LT',
- lastWeek : '[την προηγούμενη] dddd [{}] LT',
- sameElse : 'L'
- },
- calendar : function (key, mom) {
- var output = this._calendarEl[key],
- hours = mom && mom.hours();
-
- return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις"));
- },
- relativeTime : {
- future : "σε %s",
- past : "%s πριν",
- s : "δευτερόλεπτα",
- m : "ένα λεπτό",
- mm : "%d λεπτά",
- h : "μία ώρα",
- hh : "%d ώρες",
- d : "μία μέρα",
- dd : "%d μέρες",
- M : "ένας μήνας",
- MM : "%d μήνες",
- y : "ένας χρόνος",
- yy : "%d χρόνια"
- },
- ordinal : function (number) {
- return number + 'η';
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.en-au.js b/src/js/locales/bootstrap-datetimepicker.en-au.js
deleted file mode 100644
index 4d91e2569..000000000
--- a/src/js/locales/bootstrap-datetimepicker.en-au.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// moment.js language configuration
-// language : australian english (en-au)
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('en-au', {
- months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
- monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
- weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
- weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
- weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
- longDateFormat : {
- LT : "h:mm A",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[Today at] LT',
- nextDay : '[Tomorrow at] LT',
- nextWeek : 'dddd [at] LT',
- lastDay : '[Yesterday at] LT',
- lastWeek : '[Last] dddd [at] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "in %s",
- past : "%s ago",
- s : "a few seconds",
- m : "a minute",
- mm : "%d minutes",
- h : "an hour",
- hh : "%d hours",
- d : "a day",
- dd : "%d days",
- M : "a month",
- MM : "%d months",
- y : "a year",
- yy : "%d years"
- },
- ordinal : function (number) {
- var b = number % 10,
- output = (~~ (number % 100 / 10) === 1) ? 'th' :
- (b === 1) ? 'st' :
- (b === 2) ? 'nd' :
- (b === 3) ? 'rd' : 'th';
- return number + output;
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.en-ca.js b/src/js/locales/bootstrap-datetimepicker.en-ca.js
deleted file mode 100644
index a97e9f396..000000000
--- a/src/js/locales/bootstrap-datetimepicker.en-ca.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js language configuration
-// language : canadian english (en-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('en-ca', {
- months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
- monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
- weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
- weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
- weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
- longDateFormat : {
- LT : "h:mm A",
- L : "YYYY-MM-DD",
- LL : "D MMMM, YYYY",
- LLL : "D MMMM, YYYY LT",
- LLLL : "dddd, D MMMM, YYYY LT"
- },
- calendar : {
- sameDay : '[Today at] LT',
- nextDay : '[Tomorrow at] LT',
- nextWeek : 'dddd [at] LT',
- lastDay : '[Yesterday at] LT',
- lastWeek : '[Last] dddd [at] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "in %s",
- past : "%s ago",
- s : "a few seconds",
- m : "a minute",
- mm : "%d minutes",
- h : "an hour",
- hh : "%d hours",
- d : "a day",
- dd : "%d days",
- M : "a month",
- MM : "%d months",
- y : "a year",
- yy : "%d years"
- },
- ordinal : function (number) {
- var b = number % 10,
- output = (~~ (number % 100 / 10) === 1) ? 'th' :
- (b === 1) ? 'st' :
- (b === 2) ? 'nd' :
- (b === 3) ? 'rd' : 'th';
- return number + output;
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.en-gb.js b/src/js/locales/bootstrap-datetimepicker.en-gb.js
deleted file mode 100644
index 3a7907be5..000000000
--- a/src/js/locales/bootstrap-datetimepicker.en-gb.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js language configuration
-// language : great britain english (en-gb)
-// author : Chris Gedrim : https://github.com/chrisgedrim
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('en-gb', {
- months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
- monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
- weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
- weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
- weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[Today at] LT',
- nextDay : '[Tomorrow at] LT',
- nextWeek : 'dddd [at] LT',
- lastDay : '[Yesterday at] LT',
- lastWeek : '[Last] dddd [at] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "in %s",
- past : "%s ago",
- s : "a few seconds",
- m : "a minute",
- mm : "%d minutes",
- h : "an hour",
- hh : "%d hours",
- d : "a day",
- dd : "%d days",
- M : "a month",
- MM : "%d months",
- y : "a year",
- yy : "%d years"
- },
- ordinal : function (number) {
- var b = number % 10,
- output = (~~ (number % 100 / 10) === 1) ? 'th' :
- (b === 1) ? 'st' :
- (b === 2) ? 'nd' :
- (b === 3) ? 'rd' : 'th';
- return number + output;
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.eo.js b/src/js/locales/bootstrap-datetimepicker.eo.js
deleted file mode 100644
index 03b1abff1..000000000
--- a/src/js/locales/bootstrap-datetimepicker.eo.js
+++ /dev/null
@@ -1,65 +0,0 @@
-// moment.js language configuration
-// language : esperanto (eo)
-// author : Colin Dean : https://github.com/colindean
-// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
-// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('eo', {
- months : "januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),
- monthsShort : "jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),
- weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),
- weekdaysShort : "Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),
- weekdaysMin : "Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "YYYY-MM-DD",
- LL : "D[-an de] MMMM, YYYY",
- LLL : "D[-an de] MMMM, YYYY LT",
- LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT"
- },
- meridiem : function (hours, minutes, isLower) {
- if (hours > 11) {
- return isLower ? 'p.t.m.' : 'P.T.M.';
- } else {
- return isLower ? 'a.t.m.' : 'A.T.M.';
- }
- },
- calendar : {
- sameDay : '[Hodiaŭ je] LT',
- nextDay : '[Morgaŭ je] LT',
- nextWeek : 'dddd [je] LT',
- lastDay : '[Hieraŭ je] LT',
- lastWeek : '[pasinta] dddd [je] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "je %s",
- past : "antaŭ %s",
- s : "sekundoj",
- m : "minuto",
- mm : "%d minutoj",
- h : "horo",
- hh : "%d horoj",
- d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo
- dd : "%d tagoj",
- M : "monato",
- MM : "%d monatoj",
- y : "jaro",
- yy : "%d jaroj"
- },
- ordinal : "%da",
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.es.js b/src/js/locales/bootstrap-datetimepicker.es.js
deleted file mode 100644
index 0a38396d3..000000000
--- a/src/js/locales/bootstrap-datetimepicker.es.js
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js language configuration
-// language : spanish (es)
-// author : Julio Napurí : https://github.com/julionc
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('es', {
- months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),
- monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),
- weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),
- weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"),
- weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD/MM/YYYY",
- LL : "D [de] MMMM [de] YYYY",
- LLL : "D [de] MMMM [de] YYYY LT",
- LLLL : "dddd, D [de] MMMM [de] YYYY LT"
- },
- calendar : {
- sameDay : function () {
- return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
- },
- nextDay : function () {
- return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
- },
- nextWeek : function () {
- return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
- },
- lastDay : function () {
- return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
- },
- lastWeek : function () {
- return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : "en %s",
- past : "hace %s",
- s : "unos segundos",
- m : "un minuto",
- mm : "%d minutos",
- h : "una hora",
- hh : "%d horas",
- d : "un día",
- dd : "%d días",
- M : "un mes",
- MM : "%d meses",
- y : "un año",
- yy : "%d años"
- },
- ordinal : '%dº',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.et.js b/src/js/locales/bootstrap-datetimepicker.et.js
deleted file mode 100644
index 6dacb77c4..000000000
--- a/src/js/locales/bootstrap-datetimepicker.et.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// moment.js language configuration
-// language : estonian (et)
-// author : Henry Kehlmann : https://github.com/madhenry
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- function translateSeconds(number, withoutSuffix, key, isFuture) {
- return (isFuture || withoutSuffix) ? 'paari sekundi' : 'paar sekundit';
- }
-
- return moment.lang('et', {
- months : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),
- monthsShort : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),
- weekdays : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),
- weekdaysShort : "P_E_T_K_N_R_L".split("_"),
- weekdaysMin : "P_E_T_K_N_R_L".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD.MM.YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY LT",
- LLLL : "dddd, D. MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[Täna,] LT',
- nextDay : '[Homme,] LT',
- nextWeek : '[Järgmine] dddd LT',
- lastDay : '[Eile,] LT',
- lastWeek : '[Eelmine] dddd LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s pärast",
- past : "%s tagasi",
- s : translateSeconds,
- m : "minut",
- mm : "%d minutit",
- h : "tund",
- hh : "%d tundi",
- d : "päev",
- dd : "%d päeva",
- M : "kuu",
- MM : "%d kuud",
- y : "aasta",
- yy : "%d aastat"
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.eu.js b/src/js/locales/bootstrap-datetimepicker.eu.js
deleted file mode 100644
index 659b739bf..000000000
--- a/src/js/locales/bootstrap-datetimepicker.eu.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// moment.js language configuration
-// language : euskara (eu)
-// author : Eneko Illarramendi : https://github.com/eillarra
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('eu', {
- months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),
- monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),
- weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),
- weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"),
- weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "YYYY-MM-DD",
- LL : "YYYY[ko] MMMM[ren] D[a]",
- LLL : "YYYY[ko] MMMM[ren] D[a] LT",
- LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT",
- l : "YYYY-M-D",
- ll : "YYYY[ko] MMM D[a]",
- lll : "YYYY[ko] MMM D[a] LT",
- llll : "ddd, YYYY[ko] MMM D[a] LT"
- },
- calendar : {
- sameDay : '[gaur] LT[etan]',
- nextDay : '[bihar] LT[etan]',
- nextWeek : 'dddd LT[etan]',
- lastDay : '[atzo] LT[etan]',
- lastWeek : '[aurreko] dddd LT[etan]',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s barru",
- past : "duela %s",
- s : "segundo batzuk",
- m : "minutu bat",
- mm : "%d minutu",
- h : "ordu bat",
- hh : "%d ordu",
- d : "egun bat",
- dd : "%d egun",
- M : "hilabete bat",
- MM : "%d hilabete",
- y : "urte bat",
- yy : "%d urte"
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.fa.js b/src/js/locales/bootstrap-datetimepicker.fa.js
deleted file mode 100644
index 360ba9076..000000000
--- a/src/js/locales/bootstrap-datetimepicker.fa.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// moment.js language configuration
-// language : Persian Language
-// author : Ebrahim Byagowi : https://github.com/ebraminio
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var symbolMap = {
- '1': '۱',
- '2': '۲',
- '3': '۳',
- '4': '۴',
- '5': '۵',
- '6': '۶',
- '7': '۷',
- '8': '۸',
- '9': '۹',
- '0': '۰'
- }, numberMap = {
- '۱': '1',
- '۲': '2',
- '۳': '3',
- '۴': '4',
- '۵': '5',
- '۶': '6',
- '۷': '7',
- '۸': '8',
- '۹': '9',
- '۰': '0'
- };
-
- return moment.lang('fa', {
- months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
- monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
- weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
- weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
- weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
- longDateFormat : {
- LT : 'HH:mm',
- L : 'DD/MM/YYYY',
- LL : 'D MMMM YYYY',
- LLL : 'D MMMM YYYY LT',
- LLLL : 'dddd, D MMMM YYYY LT'
- },
- meridiem : function (hour, minute, isLower) {
- if (hour < 12) {
- return "قبل از ظهر";
- } else {
- return "بعد از ظهر";
- }
- },
- calendar : {
- sameDay : '[امروز ساعت] LT',
- nextDay : '[فردا ساعت] LT',
- nextWeek : 'dddd [ساعت] LT',
- lastDay : '[دیروز ساعت] LT',
- lastWeek : 'dddd [پیش] [ساعت] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : 'در %s',
- past : '%s پیش',
- s : 'چندین ثانیه',
- m : 'یک دقیقه',
- mm : '%d دقیقه',
- h : 'یک ساعت',
- hh : '%d ساعت',
- d : 'یک روز',
- dd : '%d روز',
- M : 'یک ماه',
- MM : '%d ماه',
- y : 'یک سال',
- yy : '%d سال'
- },
- preparse: function (string) {
- return string.replace(/[۰-۹]/g, function (match) {
- return numberMap[match];
- }).replace(/،/g, ',');
- },
- postformat: function (string) {
- return string.replace(/\d/g, function (match) {
- return symbolMap[match];
- }).replace(/,/g, '،');
- },
- ordinal : '%dم',
- week : {
- dow : 6, // Saturday is the first day of the week.
- doy : 12 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.fi.js b/src/js/locales/bootstrap-datetimepicker.fi.js
deleted file mode 100644
index 18529c10d..000000000
--- a/src/js/locales/bootstrap-datetimepicker.fi.js
+++ /dev/null
@@ -1,103 +0,0 @@
-// moment.js language configuration
-// language : finnish (fi)
-// author : Tarmo Aidantausta : https://github.com/bleadof
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
- numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
- numbers_past[7], numbers_past[8], numbers_past[9]];
-
- function translate(number, withoutSuffix, key, isFuture) {
- var result = "";
- switch (key) {
- case 's':
- return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
- case 'm':
- return isFuture ? 'minuutin' : 'minuutti';
- case 'mm':
- result = isFuture ? 'minuutin' : 'minuuttia';
- break;
- case 'h':
- return isFuture ? 'tunnin' : 'tunti';
- case 'hh':
- result = isFuture ? 'tunnin' : 'tuntia';
- break;
- case 'd':
- return isFuture ? 'päivän' : 'päivä';
- case 'dd':
- result = isFuture ? 'päivän' : 'päivää';
- break;
- case 'M':
- return isFuture ? 'kuukauden' : 'kuukausi';
- case 'MM':
- result = isFuture ? 'kuukauden' : 'kuukautta';
- break;
- case 'y':
- return isFuture ? 'vuoden' : 'vuosi';
- case 'yy':
- result = isFuture ? 'vuoden' : 'vuotta';
- break;
- }
- result = verbal_number(number, isFuture) + " " + result;
- return result;
- }
-
- function verbal_number(number, isFuture) {
- return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number;
- }
-
- return moment.lang('fi', {
- months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),
- monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),
- weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),
- weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"),
- weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"),
- longDateFormat : {
- LT : "HH.mm",
- L : "DD.MM.YYYY",
- LL : "Do MMMM[ta] YYYY",
- LLL : "Do MMMM[ta] YYYY, [klo] LT",
- LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT",
- l : "D.M.YYYY",
- ll : "Do MMM YYYY",
- lll : "Do MMM YYYY, [klo] LT",
- llll : "ddd, Do MMM YYYY, [klo] LT"
- },
- calendar : {
- sameDay : '[tänään] [klo] LT',
- nextDay : '[huomenna] [klo] LT',
- nextWeek : 'dddd [klo] LT',
- lastDay : '[eilen] [klo] LT',
- lastWeek : '[viime] dddd[na] [klo] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s päästä",
- past : "%s sitten",
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
- ordinal : "%d.",
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.fr-ca.js b/src/js/locales/bootstrap-datetimepicker.fr-ca.js
deleted file mode 100644
index 3280d7945..000000000
--- a/src/js/locales/bootstrap-datetimepicker.fr-ca.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// moment.js language configuration
-// language : canadian french (fr-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('fr-ca', {
- months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
- monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
- weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
- weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
- weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "YYYY-MM-DD",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[Aujourd'hui à] LT",
- nextDay: '[Demain à] LT',
- nextWeek: 'dddd [à] LT',
- lastDay: '[Hier à] LT',
- lastWeek: 'dddd [dernier à] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "dans %s",
- past : "il y a %s",
- s : "quelques secondes",
- m : "une minute",
- mm : "%d minutes",
- h : "une heure",
- hh : "%d heures",
- d : "un jour",
- dd : "%d jours",
- M : "un mois",
- MM : "%d mois",
- y : "un an",
- yy : "%d ans"
- },
- ordinal : function (number) {
- return number + (number === 1 ? 'er' : '');
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.fr.js b/src/js/locales/bootstrap-datetimepicker.fr.js
deleted file mode 100644
index 6b3dc526e..000000000
--- a/src/js/locales/bootstrap-datetimepicker.fr.js
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js language configuration
-// language : french (fr)
-// author : John Fischer : https://github.com/jfroffice
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('fr', {
- months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
- monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
- weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
- weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
- weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[Aujourd'hui à] LT",
- nextDay: '[Demain à] LT',
- nextWeek: 'dddd [à] LT',
- lastDay: '[Hier à] LT',
- lastWeek: 'dddd [dernier à] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "dans %s",
- past : "il y a %s",
- s : "quelques secondes",
- m : "une minute",
- mm : "%d minutes",
- h : "une heure",
- hh : "%d heures",
- d : "un jour",
- dd : "%d jours",
- M : "un mois",
- MM : "%d mois",
- y : "un an",
- yy : "%d ans"
- },
- ordinal : function (number) {
- return number + (number === 1 ? 'er' : '');
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.gl.js b/src/js/locales/bootstrap-datetimepicker.gl.js
deleted file mode 100644
index 8b141278e..000000000
--- a/src/js/locales/bootstrap-datetimepicker.gl.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// moment.js language configuration
-// language : galician (gl)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('gl', {
- months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),
- monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),
- weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),
- weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),
- weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay : function () {
- return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
- },
- nextDay : function () {
- return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
- },
- nextWeek : function () {
- return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
- },
- lastDay : function () {
- return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
- },
- lastWeek : function () {
- return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : function (str) {
- if (str === "uns segundos") {
- return "nuns segundos";
- }
- return "en " + str;
- },
- past : "hai %s",
- s : "uns segundos",
- m : "un minuto",
- mm : "%d minutos",
- h : "unha hora",
- hh : "%d horas",
- d : "un día",
- dd : "%d días",
- M : "un mes",
- MM : "%d meses",
- y : "un ano",
- yy : "%d anos"
- },
- ordinal : '%dº',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.he.js b/src/js/locales/bootstrap-datetimepicker.he.js
deleted file mode 100644
index abb3f9f53..000000000
--- a/src/js/locales/bootstrap-datetimepicker.he.js
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js language configuration
-// language : Hebrew (he)
-// author : Tomer Cohen : https://github.com/tomer
-// author : Moshe Simantov : https://github.com/DevelopmentIL
-// author : Tal Ater : https://github.com/TalAter
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('he', {
- months : "ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),
- monthsShort : "ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),
- weekdays : "ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),
- weekdaysShort : "א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),
- weekdaysMin : "א_ב_ג_ד_ה_ו_ש".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D [ב]MMMM YYYY",
- LLL : "D [ב]MMMM YYYY LT",
- LLLL : "dddd, D [ב]MMMM YYYY LT",
- l : "D/M/YYYY",
- ll : "D MMM YYYY",
- lll : "D MMM YYYY LT",
- llll : "ddd, D MMM YYYY LT"
- },
- calendar : {
- sameDay : '[היום ב־]LT',
- nextDay : '[מחר ב־]LT',
- nextWeek : 'dddd [בשעה] LT',
- lastDay : '[אתמול ב־]LT',
- lastWeek : '[ביום] dddd [האחרון בשעה] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "בעוד %s",
- past : "לפני %s",
- s : "מספר שניות",
- m : "דקה",
- mm : "%d דקות",
- h : "שעה",
- hh : function (number) {
- if (number === 2) {
- return "שעתיים";
- }
- return number + " שעות";
- },
- d : "יום",
- dd : function (number) {
- if (number === 2) {
- return "יומיים";
- }
- return number + " ימים";
- },
- M : "חודש",
- MM : function (number) {
- if (number === 2) {
- return "חודשיים";
- }
- return number + " חודשים";
- },
- y : "שנה",
- yy : function (number) {
- if (number === 2) {
- return "שנתיים";
- }
- return number + " שנים";
- }
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.hi.js b/src/js/locales/bootstrap-datetimepicker.hi.js
deleted file mode 100644
index 93b774167..000000000
--- a/src/js/locales/bootstrap-datetimepicker.hi.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js language configuration
-// language : hindi (hi)
-// author : Mayank Singhal : https://github.com/mayanksinghal
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var symbolMap = {
- '1': '१',
- '2': '२',
- '3': '३',
- '4': '४',
- '5': '५',
- '6': '६',
- '7': '७',
- '8': '८',
- '9': '९',
- '0': '०'
- },
- numberMap = {
- '१': '1',
- '२': '2',
- '३': '3',
- '४': '4',
- '५': '5',
- '६': '6',
- '७': '7',
- '८': '8',
- '९': '9',
- '०': '0'
- };
-
- return moment.lang('hi', {
- months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split("_"),
- monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split("_"),
- weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
- weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split("_"),
- weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
- longDateFormat : {
- LT : "A h:mm बजे",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY, LT",
- LLLL : "dddd, D MMMM YYYY, LT"
- },
- calendar : {
- sameDay : '[आज] LT',
- nextDay : '[कल] LT',
- nextWeek : 'dddd, LT',
- lastDay : '[कल] LT',
- lastWeek : '[पिछले] dddd, LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s में",
- past : "%s पहले",
- s : "कुछ ही क्षण",
- m : "एक मिनट",
- mm : "%d मिनट",
- h : "एक घंटा",
- hh : "%d घंटे",
- d : "एक दिन",
- dd : "%d दिन",
- M : "एक महीने",
- MM : "%d महीने",
- y : "एक वर्ष",
- yy : "%d वर्ष"
- },
- preparse: function (string) {
- return string.replace(/[१२३४५६७८९०]/g, function (match) {
- return numberMap[match];
- });
- },
- postformat: function (string) {
- return string.replace(/\d/g, function (match) {
- return symbolMap[match];
- });
- },
- // Hindi notation for meridiems are quite fuzzy in practice. While there exists
- // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
- meridiem : function (hour, minute, isLower) {
- if (hour < 4) {
- return "रात";
- } else if (hour < 10) {
- return "सुबह";
- } else if (hour < 17) {
- return "दोपहर";
- } else if (hour < 20) {
- return "शाम";
- } else {
- return "रात";
- }
- },
- week : {
- dow : 0, // Sunday is the first day of the week.
- doy : 6 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.hr.js b/src/js/locales/bootstrap-datetimepicker.hr.js
deleted file mode 100644
index 2e3bf1128..000000000
--- a/src/js/locales/bootstrap-datetimepicker.hr.js
+++ /dev/null
@@ -1,140 +0,0 @@
-// moment.js language configuration
-// language : hrvatski (hr)
-// author : Bojan Marković : https://github.com/bmarkovic
-
-// based on (sl) translation by Robert Sedovšek
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
-
- function translate(number, withoutSuffix, key) {
- var result = number + " ";
- switch (key) {
- case 'm':
- return withoutSuffix ? 'jedna minuta' : 'jedne minute';
- case 'mm':
- if (number === 1) {
- result += 'minuta';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'minute';
- } else {
- result += 'minuta';
- }
- return result;
- case 'h':
- return withoutSuffix ? 'jedan sat' : 'jednog sata';
- case 'hh':
- if (number === 1) {
- result += 'sat';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'sata';
- } else {
- result += 'sati';
- }
- return result;
- case 'dd':
- if (number === 1) {
- result += 'dan';
- } else {
- result += 'dana';
- }
- return result;
- case 'MM':
- if (number === 1) {
- result += 'mjesec';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'mjeseca';
- } else {
- result += 'mjeseci';
- }
- return result;
- case 'yy':
- if (number === 1) {
- result += 'godina';
- } else if (number === 2 || number === 3 || number === 4) {
- result += 'godine';
- } else {
- result += 'godina';
- }
- return result;
- }
- }
-
- return moment.lang('hr', {
- months : "sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),
- monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),
- weekdays : "nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),
- weekdaysShort : "ned._pon._uto._sri._čet._pet._sub.".split("_"),
- weekdaysMin : "ne_po_ut_sr_če_pe_su".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD. MM. YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY LT",
- LLLL : "dddd, D. MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[danas u] LT',
- nextDay : '[sutra u] LT',
-
- nextWeek : function () {
- switch (this.day()) {
- case 0:
- return '[u] [nedjelju] [u] LT';
- case 3:
- return '[u] [srijedu] [u] LT';
- case 6:
- return '[u] [subotu] [u] LT';
- case 1:
- case 2:
- case 4:
- case 5:
- return '[u] dddd [u] LT';
- }
- },
- lastDay : '[jučer u] LT',
- lastWeek : function () {
- switch (this.day()) {
- case 0:
- case 3:
- return '[prošlu] dddd [u] LT';
- case 6:
- return '[prošle] [subote] [u] LT';
- case 1:
- case 2:
- case 4:
- case 5:
- return '[prošli] dddd [u] LT';
- }
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : "za %s",
- past : "prije %s",
- s : "par sekundi",
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : "dan",
- dd : translate,
- M : "mjesec",
- MM : translate,
- y : "godinu",
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.hu.js b/src/js/locales/bootstrap-datetimepicker.hu.js
deleted file mode 100644
index 4d84ebdf6..000000000
--- a/src/js/locales/bootstrap-datetimepicker.hu.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// moment.js language configuration
-// language : hungarian (hu)
-// author : Adam Brunner : https://github.com/adambrunner
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
-
- function translate(number, withoutSuffix, key, isFuture) {
- var num = number,
- suffix;
-
- switch (key) {
- case 's':
- return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
- case 'm':
- return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
- case 'mm':
- return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
- case 'h':
- return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
- case 'hh':
- return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
- case 'd':
- return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
- case 'dd':
- return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
- case 'M':
- return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
- case 'MM':
- return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
- case 'y':
- return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
- case 'yy':
- return num + (isFuture || withoutSuffix ? ' év' : ' éve');
- }
-
- return '';
- }
-
- function week(isFuture) {
- return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
- }
-
- return moment.lang('hu', {
- months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),
- monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),
- weekdays : "vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),
- weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"),
- weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "YYYY.MM.DD.",
- LL : "YYYY. MMMM D.",
- LLL : "YYYY. MMMM D., LT",
- LLLL : "YYYY. MMMM D., dddd LT"
- },
- calendar : {
- sameDay : '[ma] LT[-kor]',
- nextDay : '[holnap] LT[-kor]',
- nextWeek : function () {
- return week.call(this, true);
- },
- lastDay : '[tegnap] LT[-kor]',
- lastWeek : function () {
- return week.call(this, false);
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s múlva",
- past : "%s",
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.id.js b/src/js/locales/bootstrap-datetimepicker.id.js
deleted file mode 100644
index f186280d8..000000000
--- a/src/js/locales/bootstrap-datetimepicker.id.js
+++ /dev/null
@@ -1,67 +0,0 @@
-// moment.js language configuration
-// language : Bahasa Indonesia (id)
-// author : Mohammad Satrio Utomo : https://github.com/tyok
-// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('id', {
- months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),
- monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),
- weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),
- weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),
- weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),
- longDateFormat : {
- LT : "HH.mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY [pukul] LT",
- LLLL : "dddd, D MMMM YYYY [pukul] LT"
- },
- meridiem : function (hours, minutes, isLower) {
- if (hours < 11) {
- return 'pagi';
- } else if (hours < 15) {
- return 'siang';
- } else if (hours < 19) {
- return 'sore';
- } else {
- return 'malam';
- }
- },
- calendar : {
- sameDay : '[Hari ini pukul] LT',
- nextDay : '[Besok pukul] LT',
- nextWeek : 'dddd [pukul] LT',
- lastDay : '[Kemarin pukul] LT',
- lastWeek : 'dddd [lalu pukul] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "dalam %s",
- past : "%s yang lalu",
- s : "beberapa detik",
- m : "semenit",
- mm : "%d menit",
- h : "sejam",
- hh : "%d jam",
- d : "sehari",
- dd : "%d hari",
- M : "sebulan",
- MM : "%d bulan",
- y : "setahun",
- yy : "%d tahun"
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.is.js b/src/js/locales/bootstrap-datetimepicker.is.js
deleted file mode 100644
index 5b6b2a821..000000000
--- a/src/js/locales/bootstrap-datetimepicker.is.js
+++ /dev/null
@@ -1,124 +0,0 @@
-// moment.js language configuration
-// language : icelandic (is)
-// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- function plural(n) {
- if (n % 100 === 11) {
- return true;
- } else if (n % 10 === 1) {
- return false;
- }
- return true;
- }
-
- function translate(number, withoutSuffix, key, isFuture) {
- var result = number + " ";
- switch (key) {
- case 's':
- return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
- case 'm':
- return withoutSuffix ? 'mínúta' : 'mínútu';
- case 'mm':
- if (plural(number)) {
- return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
- } else if (withoutSuffix) {
- return result + 'mínúta';
- }
- return result + 'mínútu';
- case 'hh':
- if (plural(number)) {
- return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
- }
- return result + 'klukkustund';
- case 'd':
- if (withoutSuffix) {
- return 'dagur';
- }
- return isFuture ? 'dag' : 'degi';
- case 'dd':
- if (plural(number)) {
- if (withoutSuffix) {
- return result + 'dagar';
- }
- return result + (isFuture ? 'daga' : 'dögum');
- } else if (withoutSuffix) {
- return result + 'dagur';
- }
- return result + (isFuture ? 'dag' : 'degi');
- case 'M':
- if (withoutSuffix) {
- return 'mánuður';
- }
- return isFuture ? 'mánuð' : 'mánuði';
- case 'MM':
- if (plural(number)) {
- if (withoutSuffix) {
- return result + 'mánuðir';
- }
- return result + (isFuture ? 'mánuði' : 'mánuðum');
- } else if (withoutSuffix) {
- return result + 'mánuður';
- }
- return result + (isFuture ? 'mánuð' : 'mánuði');
- case 'y':
- return withoutSuffix || isFuture ? 'ár' : 'ári';
- case 'yy':
- if (plural(number)) {
- return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
- }
- return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
- }
- }
-
- return moment.lang('is', {
- months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),
- monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),
- weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),
- weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"),
- weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD/MM/YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY [kl.] LT",
- LLLL : "dddd, D. MMMM YYYY [kl.] LT"
- },
- calendar : {
- sameDay : '[í dag kl.] LT',
- nextDay : '[á morgun kl.] LT',
- nextWeek : 'dddd [kl.] LT',
- lastDay : '[í gær kl.] LT',
- lastWeek : '[síðasta] dddd [kl.] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "eftir %s",
- past : "fyrir %s síðan",
- s : translate,
- m : translate,
- mm : translate,
- h : "klukkustund",
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.it.js b/src/js/locales/bootstrap-datetimepicker.it.js
deleted file mode 100644
index 5b8a99fb1..000000000
--- a/src/js/locales/bootstrap-datetimepicker.it.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// moment.js language configuration
-// language : italian (it)
-// author : Lorenzo : https://github.com/aliem
-// author: Mattia Larentis: https://github.com/nostalgiaz
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('it', {
- months : "Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"),
- monthsShort : "Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"),
- weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),
- weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),
- weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay: '[Oggi alle] LT',
- nextDay: '[Domani alle] LT',
- nextWeek: 'dddd [alle] LT',
- lastDay: '[Ieri alle] LT',
- lastWeek: '[lo scorso] dddd [alle] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : function (s) {
- return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s;
- },
- past : "%s fa",
- s : "secondi",
- m : "un minuto",
- mm : "%d minuti",
- h : "un'ora",
- hh : "%d ore",
- d : "un giorno",
- dd : "%d giorni",
- M : "un mese",
- MM : "%d mesi",
- y : "un anno",
- yy : "%d anni"
- },
- ordinal: '%dº',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ja.js b/src/js/locales/bootstrap-datetimepicker.ja.js
deleted file mode 100644
index d76ed55b5..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ja.js
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js language configuration
-// language : japanese (ja)
-// author : LI Long : https://github.com/baryon
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ja', {
- months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
- monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
- weekdays : "日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),
- weekdaysShort : "日_月_火_水_木_金_土".split("_"),
- weekdaysMin : "日_月_火_水_木_金_土".split("_"),
- longDateFormat : {
- LT : "Ah時m分",
- L : "YYYY/MM/DD",
- LL : "YYYY年M月D日",
- LLL : "YYYY年M月D日LT",
- LLLL : "YYYY年M月D日LT dddd"
- },
- meridiem : function (hour, minute, isLower) {
- if (hour < 12) {
- return "午前";
- } else {
- return "午後";
- }
- },
- calendar : {
- sameDay : '[今日] LT',
- nextDay : '[明日] LT',
- nextWeek : '[来週]dddd LT',
- lastDay : '[昨日] LT',
- lastWeek : '[前週]dddd LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s後",
- past : "%s前",
- s : "数秒",
- m : "1分",
- mm : "%d分",
- h : "1時間",
- hh : "%d時間",
- d : "1日",
- dd : "%d日",
- M : "1ヶ月",
- MM : "%dヶ月",
- y : "1年",
- yy : "%d年"
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ka.js b/src/js/locales/bootstrap-datetimepicker.ka.js
deleted file mode 100644
index 650b13a32..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ka.js
+++ /dev/null
@@ -1,108 +0,0 @@
-// moment.js language configuration
-// language : Georgian (ka)
-// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
-
- function monthsCaseReplace(m, format) {
- var months = {
- 'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
- 'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
- },
-
- nounCase = (/D[oD] *MMMM?/).test(format) ?
- 'accusative' :
- 'nominative';
-
- return months[nounCase][m.month()];
- }
-
- function weekdaysCaseReplace(m, format) {
- var weekdays = {
- 'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
- 'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
- },
-
- nounCase = (/(წინა|შემდეგ)/).test(format) ?
- 'accusative' :
- 'nominative';
-
- return weekdays[nounCase][m.day()];
- }
-
- return moment.lang('ka', {
- months : monthsCaseReplace,
- monthsShort : "იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),
- weekdays : weekdaysCaseReplace,
- weekdaysShort : "კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),
- weekdaysMin : "კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),
- longDateFormat : {
- LT : "h:mm A",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[დღეს] LT[-ზე]',
- nextDay : '[ხვალ] LT[-ზე]',
- lastDay : '[გუშინ] LT[-ზე]',
- nextWeek : '[შემდეგ] dddd LT[-ზე]',
- lastWeek : '[წინა] dddd LT-ზე',
- sameElse : 'L'
- },
- relativeTime : {
- future : function (s) {
- return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
- s.replace(/ი$/, "ში") :
- s + "ში";
- },
- past : function (s) {
- if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
- return s.replace(/(ი|ე)$/, "ის წინ");
- }
- if ((/წელი/).test(s)) {
- return s.replace(/წელი$/, "წლის წინ");
- }
- },
- s : "რამდენიმე წამი",
- m : "წუთი",
- mm : "%d წუთი",
- h : "საათი",
- hh : "%d საათი",
- d : "დღე",
- dd : "%d დღე",
- M : "თვე",
- MM : "%d თვე",
- y : "წელი",
- yy : "%d წელი"
- },
- ordinal : function (number) {
- if (number === 0) {
- return number;
- }
-
- if (number === 1) {
- return number + "-ლი";
- }
-
- if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
- return "მე-" + number;
- }
-
- return number + "-ე";
- },
- week : {
- dow : 1,
- doy : 7
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ko.js b/src/js/locales/bootstrap-datetimepicker.ko.js
deleted file mode 100644
index a584a45e3..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ko.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : korean (ko)
-// author : Kyungwook, Park : https://github.com/kyungw00k
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ko', {
- months : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
- monthsShort : "1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),
- weekdays : "일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),
- weekdaysShort : "일_월_화_수_목_금_토".split("_"),
- weekdaysMin : "일_월_화_수_목_금_토".split("_"),
- longDateFormat : {
- LT : "A h시 mm분",
- L : "YYYY.MM.DD",
- LL : "YYYY년 MMMM D일",
- LLL : "YYYY년 MMMM D일 LT",
- LLLL : "YYYY년 MMMM D일 dddd LT"
- },
- meridiem : function (hour, minute, isUpper) {
- return hour < 12 ? '오전' : '오후';
- },
- calendar : {
- sameDay : '오늘 LT',
- nextDay : '내일 LT',
- nextWeek : 'dddd LT',
- lastDay : '어제 LT',
- lastWeek : '지난주 dddd LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s 후",
- past : "%s 전",
- s : "몇초",
- ss : "%d초",
- m : "일분",
- mm : "%d분",
- h : "한시간",
- hh : "%d시간",
- d : "하루",
- dd : "%d일",
- M : "한달",
- MM : "%d달",
- y : "일년",
- yy : "%d년"
- },
- ordinal : '%d일'
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.lt.js b/src/js/locales/bootstrap-datetimepicker.lt.js
deleted file mode 100644
index 1cf6457d2..000000000
--- a/src/js/locales/bootstrap-datetimepicker.lt.js
+++ /dev/null
@@ -1,118 +0,0 @@
-// moment.js language configuration
-// language : Lithuanian (lt)
-// author : Mindaugas Mozūras : https://github.com/mmozuras
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var units = {
- "m" : "minutė_minutės_minutę",
- "mm": "minutės_minučių_minutes",
- "h" : "valanda_valandos_valandą",
- "hh": "valandos_valandų_valandas",
- "d" : "diena_dienos_dieną",
- "dd": "dienos_dienų_dienas",
- "M" : "mėnuo_mėnesio_mėnesį",
- "MM": "mėnesiai_mėnesių_mėnesius",
- "y" : "metai_metų_metus",
- "yy": "metai_metų_metus"
- },
- weekDays = "pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis_sekmadienis".split("_");
-
- function translateSeconds(number, withoutSuffix, key, isFuture) {
- if (withoutSuffix) {
- return "kelios sekundės";
- } else {
- return isFuture ? "kelių sekundžių" : "kelias sekundes";
- }
- }
-
- function translateSingular(number, withoutSuffix, key, isFuture) {
- return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
- }
-
- function special(number) {
- return number % 10 === 0 || (number > 10 && number < 20);
- }
-
- function forms(key) {
- return units[key].split("_");
- }
-
- function translate(number, withoutSuffix, key, isFuture) {
- var result = number + " ";
- if (number === 1) {
- return result + translateSingular(number, withoutSuffix, key[0], isFuture);
- } else if (withoutSuffix) {
- return result + (special(number) ? forms(key)[1] : forms(key)[0]);
- } else {
- if (isFuture) {
- return result + forms(key)[1];
- } else {
- return result + (special(number) ? forms(key)[1] : forms(key)[2]);
- }
- }
- }
-
- function relativeWeekDay(moment, format) {
- var nominative = format.indexOf('dddd LT') === -1,
- weekDay = weekDays[moment.weekday()];
-
- return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į";
- }
-
- return moment.lang("lt", {
- months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),
- monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),
- weekdays : relativeWeekDay,
- weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),
- weekdaysMin : "S_P_A_T_K_Pn_Š".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "YYYY-MM-DD",
- LL : "YYYY [m.] MMMM D [d.]",
- LLL : "YYYY [m.] MMMM D [d.], LT [val.]",
- LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]",
- l : "YYYY-MM-DD",
- ll : "YYYY [m.] MMMM D [d.]",
- lll : "YYYY [m.] MMMM D [d.], LT [val.]",
- llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]"
- },
- calendar : {
- sameDay : "[Šiandien] LT",
- nextDay : "[Rytoj] LT",
- nextWeek : "dddd LT",
- lastDay : "[Vakar] LT",
- lastWeek : "[Praėjusį] dddd LT",
- sameElse : "L"
- },
- relativeTime : {
- future : "po %s",
- past : "prieš %s",
- s : translateSeconds,
- m : translateSingular,
- mm : translate,
- h : translateSingular,
- hh : translate,
- d : translateSingular,
- dd : translate,
- M : translateSingular,
- MM : translate,
- y : translateSingular,
- yy : translate
- },
- ordinal : function (number) {
- return number + '-oji';
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.lv.js b/src/js/locales/bootstrap-datetimepicker.lv.js
deleted file mode 100644
index ffe25cfe4..000000000
--- a/src/js/locales/bootstrap-datetimepicker.lv.js
+++ /dev/null
@@ -1,77 +0,0 @@
-// moment.js language configuration
-// language : latvian (lv)
-// author : Kristaps Karlsons : https://github.com/skakri
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var units = {
- 'mm': 'minūti_minūtes_minūte_minūtes',
- 'hh': 'stundu_stundas_stunda_stundas',
- 'dd': 'dienu_dienas_diena_dienas',
- 'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
- 'yy': 'gadu_gadus_gads_gadi'
- };
-
- function format(word, number, withoutSuffix) {
- var forms = word.split('_');
- if (withoutSuffix) {
- return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
- } else {
- return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
- }
- }
-
- function relativeTimeWithPlural(number, withoutSuffix, key) {
- return number + ' ' + format(units[key], number, withoutSuffix);
- }
-
- return moment.lang('lv', {
- months : "janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),
- monthsShort : "jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),
- weekdays : "svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),
- weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"),
- weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD.MM.YYYY",
- LL : "YYYY. [gada] D. MMMM",
- LLL : "YYYY. [gada] D. MMMM, LT",
- LLLL : "YYYY. [gada] D. MMMM, dddd, LT"
- },
- calendar : {
- sameDay : '[Šodien pulksten] LT',
- nextDay : '[Rīt pulksten] LT',
- nextWeek : 'dddd [pulksten] LT',
- lastDay : '[Vakar pulksten] LT',
- lastWeek : '[Pagājušā] dddd [pulksten] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s vēlāk",
- past : "%s agrāk",
- s : "dažas sekundes",
- m : "minūti",
- mm : relativeTimeWithPlural,
- h : "stundu",
- hh : relativeTimeWithPlural,
- d : "dienu",
- dd : relativeTimeWithPlural,
- M : "mēnesi",
- MM : relativeTimeWithPlural,
- y : "gadu",
- yy : relativeTimeWithPlural
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ml.js b/src/js/locales/bootstrap-datetimepicker.ml.js
deleted file mode 100644
index 016a599a5..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ml.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// moment.js language configuration
-// language : malayalam (ml)
-// author : Floyd Pink : https://github.com/floydpink
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ml', {
- months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split("_"),
- monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split("_"),
- weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split("_"),
- weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split("_"),
- weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split("_"),
- longDateFormat : {
- LT : "A h:mm -നു",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY, LT",
- LLLL : "dddd, D MMMM YYYY, LT"
- },
- calendar : {
- sameDay : '[ഇന്ന്] LT',
- nextDay : '[നാളെ] LT',
- nextWeek : 'dddd, LT',
- lastDay : '[ഇന്നലെ] LT',
- lastWeek : '[കഴിഞ്ഞ] dddd, LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s കഴിഞ്ഞ്",
- past : "%s മുൻപ്",
- s : "അൽപ നിമിഷങ്ങൾ",
- m : "ഒരു മിനിറ്റ്",
- mm : "%d മിനിറ്റ്",
- h : "ഒരു മണിക്കൂർ",
- hh : "%d മണിക്കൂർ",
- d : "ഒരു ദിവസം",
- dd : "%d ദിവസം",
- M : "ഒരു മാസം",
- MM : "%d മാസം",
- y : "ഒരു വർഷം",
- yy : "%d വർഷം"
- },
- meridiem : function (hour, minute, isLower) {
- if (hour < 4) {
- return "രാത്രി";
- } else if (hour < 12) {
- return "രാവിലെ";
- } else if (hour < 17) {
- return "ഉച്ച കഴിഞ്ഞ്";
- } else if (hour < 20) {
- return "വൈകുന്നേരം";
- } else {
- return "രാത്രി";
- }
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.mr.js b/src/js/locales/bootstrap-datetimepicker.mr.js
deleted file mode 100644
index 72f52802f..000000000
--- a/src/js/locales/bootstrap-datetimepicker.mr.js
+++ /dev/null
@@ -1,104 +0,0 @@
-// moment.js language configuration
-// language : Marathi (mr)
-// author : Harshad Kale : https://github.com/kalehv
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var symbolMap = {
- '1': '१',
- '2': '२',
- '3': '३',
- '4': '४',
- '5': '५',
- '6': '६',
- '7': '७',
- '8': '८',
- '9': '९',
- '0': '०'
- },
- numberMap = {
- '१': '1',
- '२': '2',
- '३': '3',
- '४': '4',
- '५': '5',
- '६': '6',
- '७': '7',
- '८': '8',
- '९': '9',
- '०': '0'
- };
-
- return moment.lang('mr', {
- months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split("_"),
- monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split("_"),
- weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split("_"),
- weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split("_"),
- weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split("_"),
- longDateFormat : {
- LT : "A h:mm वाजता",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY, LT",
- LLLL : "dddd, D MMMM YYYY, LT"
- },
- calendar : {
- sameDay : '[आज] LT',
- nextDay : '[उद्या] LT',
- nextWeek : 'dddd, LT',
- lastDay : '[काल] LT',
- lastWeek: '[मागील] dddd, LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s नंतर",
- past : "%s पूर्वी",
- s : "सेकंद",
- m: "एक मिनिट",
- mm: "%d मिनिटे",
- h : "एक तास",
- hh : "%d तास",
- d : "एक दिवस",
- dd : "%d दिवस",
- M : "एक महिना",
- MM : "%d महिने",
- y : "एक वर्ष",
- yy : "%d वर्षे"
- },
- preparse: function (string) {
- return string.replace(/[१२३४५६७८९०]/g, function (match) {
- return numberMap[match];
- });
- },
- postformat: function (string) {
- return string.replace(/\d/g, function (match) {
- return symbolMap[match];
- });
- },
- meridiem: function (hour, minute, isLower)
- {
- if (hour < 4) {
- return "रात्री";
- } else if (hour < 10) {
- return "सकाळी";
- } else if (hour < 17) {
- return "दुपारी";
- } else if (hour < 20) {
- return "सायंकाळी";
- } else {
- return "रात्री";
- }
- },
- week : {
- dow : 0, // Sunday is the first day of the week.
- doy : 6 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ms-my.js b/src/js/locales/bootstrap-datetimepicker.ms-my.js
deleted file mode 100644
index 501d5aaa0..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ms-my.js
+++ /dev/null
@@ -1,66 +0,0 @@
-// moment.js language configuration
-// language : Bahasa Malaysia (ms-MY)
-// author : Weldan Jamili : https://github.com/weldan
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ms-my', {
- months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),
- monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),
- weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),
- weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),
- weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),
- longDateFormat : {
- LT : "HH.mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY [pukul] LT",
- LLLL : "dddd, D MMMM YYYY [pukul] LT"
- },
- meridiem : function (hours, minutes, isLower) {
- if (hours < 11) {
- return 'pagi';
- } else if (hours < 15) {
- return 'tengahari';
- } else if (hours < 19) {
- return 'petang';
- } else {
- return 'malam';
- }
- },
- calendar : {
- sameDay : '[Hari ini pukul] LT',
- nextDay : '[Esok pukul] LT',
- nextWeek : 'dddd [pukul] LT',
- lastDay : '[Kelmarin pukul] LT',
- lastWeek : 'dddd [lepas pukul] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "dalam %s",
- past : "%s yang lepas",
- s : "beberapa saat",
- m : "seminit",
- mm : "%d minit",
- h : "sejam",
- hh : "%d jam",
- d : "sehari",
- dd : "%d hari",
- M : "sebulan",
- MM : "%d bulan",
- y : "setahun",
- yy : "%d tahun"
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.nb.js b/src/js/locales/bootstrap-datetimepicker.nb.js
deleted file mode 100644
index 2f652efd1..000000000
--- a/src/js/locales/bootstrap-datetimepicker.nb.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// moment.js language configuration
-// language : norwegian bokmål (nb)
-// authors : Espen Hovlandsdal : https://github.com/rexxars
-// Sigurd Gartmann : https://github.com/sigurdga
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('nb', {
- months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
- monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),
- weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),
- weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"),
- weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"),
- longDateFormat : {
- LT : "H.mm",
- L : "DD.MM.YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY [kl.] LT",
- LLLL : "dddd D. MMMM YYYY [kl.] LT"
- },
- calendar : {
- sameDay: '[i dag kl.] LT',
- nextDay: '[i morgen kl.] LT',
- nextWeek: 'dddd [kl.] LT',
- lastDay: '[i går kl.] LT',
- lastWeek: '[forrige] dddd [kl.] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "om %s",
- past : "for %s siden",
- s : "noen sekunder",
- m : "ett minutt",
- mm : "%d minutter",
- h : "en time",
- hh : "%d timer",
- d : "en dag",
- dd : "%d dager",
- M : "en måned",
- MM : "%d måneder",
- y : "ett år",
- yy : "%d år"
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ne.js b/src/js/locales/bootstrap-datetimepicker.ne.js
deleted file mode 100644
index 130e26731..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ne.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// moment.js language configuration
-// language : nepali/nepalese
-// author : suvash : https://github.com/suvash
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var symbolMap = {
- '1': '१',
- '2': '२',
- '3': '३',
- '4': '४',
- '5': '५',
- '6': '६',
- '7': '७',
- '8': '८',
- '9': '९',
- '0': '०'
- },
- numberMap = {
- '१': '1',
- '२': '2',
- '३': '3',
- '४': '4',
- '५': '5',
- '६': '6',
- '७': '7',
- '८': '8',
- '९': '9',
- '०': '0'
- };
-
- return moment.lang('ne', {
- months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split("_"),
- monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split("_"),
- weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split("_"),
- weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split("_"),
- weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split("_"),
- longDateFormat : {
- LT : "Aको h:mm बजे",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY, LT",
- LLLL : "dddd, D MMMM YYYY, LT"
- },
- preparse: function (string) {
- return string.replace(/[१२३४५६७८९०]/g, function (match) {
- return numberMap[match];
- });
- },
- postformat: function (string) {
- return string.replace(/\d/g, function (match) {
- return symbolMap[match];
- });
- },
- meridiem : function (hour, minute, isLower) {
- if (hour < 3) {
- return "राती";
- } else if (hour < 10) {
- return "बिहान";
- } else if (hour < 15) {
- return "दिउँसो";
- } else if (hour < 18) {
- return "बेलुका";
- } else if (hour < 20) {
- return "साँझ";
- } else {
- return "राती";
- }
- },
- calendar : {
- sameDay : '[आज] LT',
- nextDay : '[भोली] LT',
- nextWeek : '[आउँदो] dddd[,] LT',
- lastDay : '[हिजो] LT',
- lastWeek : '[गएको] dddd[,] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%sमा",
- past : "%s अगाडी",
- s : "केही समय",
- m : "एक मिनेट",
- mm : "%d मिनेट",
- h : "एक घण्टा",
- hh : "%d घण्टा",
- d : "एक दिन",
- dd : "%d दिन",
- M : "एक महिना",
- MM : "%d महिना",
- y : "एक बर्ष",
- yy : "%d बर्ष"
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.nl.js b/src/js/locales/bootstrap-datetimepicker.nl.js
deleted file mode 100644
index ffd454faf..000000000
--- a/src/js/locales/bootstrap-datetimepicker.nl.js
+++ /dev/null
@@ -1,67 +0,0 @@
-// moment.js language configuration
-// language : dutch (nl)
-// author : Joris Röling : https://github.com/jjupiter
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),
- monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");
-
- return moment.lang('nl', {
- months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),
- monthsShort : function (m, format) {
- if (/-MMM-/.test(format)) {
- return monthsShortWithoutDots[m.month()];
- } else {
- return monthsShortWithDots[m.month()];
- }
- },
- weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),
- weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"),
- weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD-MM-YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: '[vandaag om] LT',
- nextDay: '[morgen om] LT',
- nextWeek: 'dddd [om] LT',
- lastDay: '[gisteren om] LT',
- lastWeek: '[afgelopen] dddd [om] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "over %s",
- past : "%s geleden",
- s : "een paar seconden",
- m : "één minuut",
- mm : "%d minuten",
- h : "één uur",
- hh : "%d uur",
- d : "één dag",
- dd : "%d dagen",
- M : "één maand",
- MM : "%d maanden",
- y : "één jaar",
- yy : "%d jaar"
- },
- ordinal : function (number) {
- return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.nn.js b/src/js/locales/bootstrap-datetimepicker.nn.js
deleted file mode 100644
index f59c4153b..000000000
--- a/src/js/locales/bootstrap-datetimepicker.nn.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : norwegian nynorsk (nn)
-// author : https://github.com/mechuwind
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('nn', {
- months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),
- monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
- weekdays : "sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),
- weekdaysShort : "sun_mån_tys_ons_tor_fre_lau".split("_"),
- weekdaysMin : "su_må_ty_on_to_fr_lø".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD.MM.YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: '[I dag klokka] LT',
- nextDay: '[I morgon klokka] LT',
- nextWeek: 'dddd [klokka] LT',
- lastDay: '[I går klokka] LT',
- lastWeek: '[Føregående] dddd [klokka] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "om %s",
- past : "for %s siden",
- s : "noen sekund",
- m : "ett minutt",
- mm : "%d minutt",
- h : "en time",
- hh : "%d timar",
- d : "en dag",
- dd : "%d dagar",
- M : "en månad",
- MM : "%d månader",
- y : "ett år",
- yy : "%d år"
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.pl.js b/src/js/locales/bootstrap-datetimepicker.pl.js
deleted file mode 100644
index 22aab205b..000000000
--- a/src/js/locales/bootstrap-datetimepicker.pl.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// moment.js language configuration
-// language : polish (pl)
-// author : Rafal Hirsz : https://github.com/evoL
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var monthsNominative = "styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),
- monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");
-
- function plural(n) {
- return (n % 10 < 5) && (n % 10 > 1) && (~~(n / 10) !== 1);
- }
-
- function translate(number, withoutSuffix, key) {
- var result = number + " ";
- switch (key) {
- case 'm':
- return withoutSuffix ? 'minuta' : 'minutę';
- case 'mm':
- return result + (plural(number) ? 'minuty' : 'minut');
- case 'h':
- return withoutSuffix ? 'godzina' : 'godzinę';
- case 'hh':
- return result + (plural(number) ? 'godziny' : 'godzin');
- case 'MM':
- return result + (plural(number) ? 'miesiące' : 'miesięcy');
- case 'yy':
- return result + (plural(number) ? 'lata' : 'lat');
- }
- }
-
- return moment.lang('pl', {
- months : function (momentToFormat, format) {
- if (/D MMMM/.test(format)) {
- return monthsSubjective[momentToFormat.month()];
- } else {
- return monthsNominative[momentToFormat.month()];
- }
- },
- monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),
- weekdays : "niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),
- weekdaysShort : "nie_pon_wt_śr_czw_pt_sb".split("_"),
- weekdaysMin : "N_Pn_Wt_Śr_Cz_Pt_So".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD.MM.YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay: '[Dziś o] LT',
- nextDay: '[Jutro o] LT',
- nextWeek: '[W] dddd [o] LT',
- lastDay: '[Wczoraj o] LT',
- lastWeek: function () {
- switch (this.day()) {
- case 0:
- return '[W zeszłą niedzielę o] LT';
- case 3:
- return '[W zeszłą środę o] LT';
- case 6:
- return '[W zeszłą sobotę o] LT';
- default:
- return '[W zeszły] dddd [o] LT';
- }
- },
- sameElse: 'L'
- },
- relativeTime : {
- future : "za %s",
- past : "%s temu",
- s : "kilka sekund",
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : "1 dzień",
- dd : '%d dni',
- M : "miesiąc",
- MM : translate,
- y : "rok",
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.pt-BR.js b/src/js/locales/bootstrap-datetimepicker.pt-BR.js
deleted file mode 100644
index 5cac19b69..000000000
--- a/src/js/locales/bootstrap-datetimepicker.pt-BR.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : brazilian portuguese (pt-br)
-// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('pt-br', {
- months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
- monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
- weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
- weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
- weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D [de] MMMM [de] YYYY",
- LLL : "D [de] MMMM [de] YYYY LT",
- LLLL : "dddd, D [de] MMMM [de] YYYY LT"
- },
- calendar : {
- sameDay: '[Hoje às] LT',
- nextDay: '[Amanhã às] LT',
- nextWeek: 'dddd [às] LT',
- lastDay: '[Ontem às] LT',
- lastWeek: function () {
- return (this.day() === 0 || this.day() === 6) ?
- '[Último] dddd [às] LT' : // Saturday + Sunday
- '[Última] dddd [às] LT'; // Monday - Friday
- },
- sameElse: 'L'
- },
- relativeTime : {
- future : "em %s",
- past : "%s atrás",
- s : "segundos",
- m : "um minuto",
- mm : "%d minutos",
- h : "uma hora",
- hh : "%d horas",
- d : "um dia",
- dd : "%d dias",
- M : "um mês",
- MM : "%d meses",
- y : "um ano",
- yy : "%d anos"
- },
- ordinal : '%dº'
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.pt.js b/src/js/locales/bootstrap-datetimepicker.pt.js
deleted file mode 100644
index 7c1f2b5ce..000000000
--- a/src/js/locales/bootstrap-datetimepicker.pt.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// moment.js language configuration
-// language : portuguese (pt)
-// author : Jefferson : https://github.com/jalex79
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('pt', {
- months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),
- monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),
- weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),
- weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),
- weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D [de] MMMM [de] YYYY",
- LLL : "D [de] MMMM [de] YYYY LT",
- LLLL : "dddd, D [de] MMMM [de] YYYY LT"
- },
- calendar : {
- sameDay: '[Hoje às] LT',
- nextDay: '[Amanhã às] LT',
- nextWeek: 'dddd [às] LT',
- lastDay: '[Ontem às] LT',
- lastWeek: function () {
- return (this.day() === 0 || this.day() === 6) ?
- '[Último] dddd [às] LT' : // Saturday + Sunday
- '[Última] dddd [às] LT'; // Monday - Friday
- },
- sameElse: 'L'
- },
- relativeTime : {
- future : "em %s",
- past : "%s atrás",
- s : "segundos",
- m : "um minuto",
- mm : "%d minutos",
- h : "uma hora",
- hh : "%d horas",
- d : "um dia",
- dd : "%d dias",
- M : "um mês",
- MM : "%d meses",
- y : "um ano",
- yy : "%d anos"
- },
- ordinal : '%dº',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ro.js b/src/js/locales/bootstrap-datetimepicker.ro.js
deleted file mode 100644
index e0bcc8f7a..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ro.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// moment.js language configuration
-// language : romanian (ro)
-// author : Vlad Gurdiga : https://github.com/gurdiga
-// author : Valentin Agachi : https://github.com/avaly
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('ro', {
- months : "Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),
- monthsShort : "Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"),
- weekdays : "Duminică_Luni_Marţi_Miercuri_Joi_Vineri_Sâmbătă".split("_"),
- weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),
- weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY H:mm",
- LLLL : "dddd, D MMMM YYYY H:mm"
- },
- calendar : {
- sameDay: "[azi la] LT",
- nextDay: '[mâine la] LT',
- nextWeek: 'dddd [la] LT',
- lastDay: '[ieri la] LT',
- lastWeek: '[fosta] dddd [la] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "peste %s",
- past : "%s în urmă",
- s : "câteva secunde",
- m : "un minut",
- mm : "%d minute",
- h : "o oră",
- hh : "%d ore",
- d : "o zi",
- dd : "%d zile",
- M : "o lună",
- MM : "%d luni",
- y : "un an",
- yy : "%d ani"
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.ru.js b/src/js/locales/bootstrap-datetimepicker.ru.js
deleted file mode 100644
index 667cf1b61..000000000
--- a/src/js/locales/bootstrap-datetimepicker.ru.js
+++ /dev/null
@@ -1,163 +0,0 @@
-// moment.js language configuration
-// language : russian (ru)
-// author : Viktorminator : https://github.com/Viktorminator
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- function plural(word, num) {
- var forms = word.split('_');
- return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
- }
-
- function relativeTimeWithPlural(number, withoutSuffix, key) {
- var format = {
- 'mm': 'минута_минуты_минут',
- 'hh': 'час_часа_часов',
- 'dd': 'день_дня_дней',
- 'MM': 'месяц_месяца_месяцев',
- 'yy': 'год_года_лет'
- };
- if (key === 'm') {
- return withoutSuffix ? 'минута' : 'минуту';
- }
- else {
- return number + ' ' + plural(format[key], +number);
- }
- }
-
- function monthsCaseReplace(m, format) {
- var months = {
- 'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
- 'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
- },
-
- nounCase = (/D[oD]? *MMMM?/).test(format) ?
- 'accusative' :
- 'nominative';
-
- return months[nounCase][m.month()];
- }
-
- function monthsShortCaseReplace(m, format) {
- var monthsShort = {
- 'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
- 'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
- },
-
- nounCase = (/D[oD]? *MMMM?/).test(format) ?
- 'accusative' :
- 'nominative';
-
- return monthsShort[nounCase][m.month()];
- }
-
- function weekdaysCaseReplace(m, format) {
- var weekdays = {
- 'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
- 'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
- },
-
- nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
- 'accusative' :
- 'nominative';
-
- return weekdays[nounCase][m.day()];
- }
-
- return moment.lang('ru', {
- months : monthsCaseReplace,
- monthsShort : monthsShortCaseReplace,
- weekdays : weekdaysCaseReplace,
- weekdaysShort : "вс_пн_вт_ср_чт_пт_сб".split("_"),
- weekdaysMin : "вс_пн_вт_ср_чт_пт_сб".split("_"),
- monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
- longDateFormat : {
- LT : "HH:mm",
- L : "DD.MM.YYYY",
- LL : "D MMMM YYYY г.",
- LLL : "D MMMM YYYY г., LT",
- LLLL : "dddd, D MMMM YYYY г., LT"
- },
- calendar : {
- sameDay: '[Сегодня в] LT',
- nextDay: '[Завтра в] LT',
- lastDay: '[Вчера в] LT',
- nextWeek: function () {
- return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
- },
- lastWeek: function () {
- switch (this.day()) {
- case 0:
- return '[В прошлое] dddd [в] LT';
- case 1:
- case 2:
- case 4:
- return '[В прошлый] dddd [в] LT';
- case 3:
- case 5:
- case 6:
- return '[В прошлую] dddd [в] LT';
- }
- },
- sameElse: 'L'
- },
- relativeTime : {
- future : "через %s",
- past : "%s назад",
- s : "несколько секунд",
- m : relativeTimeWithPlural,
- mm : relativeTimeWithPlural,
- h : "час",
- hh : relativeTimeWithPlural,
- d : "день",
- dd : relativeTimeWithPlural,
- M : "месяц",
- MM : relativeTimeWithPlural,
- y : "год",
- yy : relativeTimeWithPlural
- },
-
- // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
- meridiem : function (hour, minute, isLower) {
- if (hour < 4) {
- return "ночи";
- } else if (hour < 12) {
- return "утра";
- } else if (hour < 17) {
- return "дня";
- } else {
- return "вечера";
- }
- },
-
- ordinal: function (number, period) {
- switch (period) {
- case 'M':
- case 'd':
- case 'DDD':
- return number + '-й';
- case 'D':
- return number + '-го';
- case 'w':
- case 'W':
- return number + '-я';
- default:
- return number;
- }
- },
-
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.sk.js b/src/js/locales/bootstrap-datetimepicker.sk.js
deleted file mode 100644
index ed8a41d48..000000000
--- a/src/js/locales/bootstrap-datetimepicker.sk.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// moment.js language configuration
-// language : slovak (sk)
-// author : Martin Minka : https://github.com/k2s
-// based on work of petrbela : https://github.com/petrbela
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),
- monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");
-
- function plural(n) {
- return (n > 1) && (n < 5);
- }
-
- function translate(number, withoutSuffix, key, isFuture) {
- var result = number + " ";
- switch (key) {
- case 's': // a few seconds / in a few seconds / a few seconds ago
- return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
- case 'm': // a minute / in a minute / a minute ago
- return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
- case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'minúty' : 'minút');
- } else {
- return result + 'minútami';
- }
- break;
- case 'h': // an hour / in an hour / an hour ago
- return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
- case 'hh': // 9 hours / in 9 hours / 9 hours ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'hodiny' : 'hodín');
- } else {
- return result + 'hodinami';
- }
- break;
- case 'd': // a day / in a day / a day ago
- return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
- case 'dd': // 9 days / in 9 days / 9 days ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'dni' : 'dní');
- } else {
- return result + 'dňami';
- }
- break;
- case 'M': // a month / in a month / a month ago
- return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
- case 'MM': // 9 months / in 9 months / 9 months ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'mesiace' : 'mesiacov');
- } else {
- return result + 'mesiacmi';
- }
- break;
- case 'y': // a year / in a year / a year ago
- return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
- case 'yy': // 9 years / in 9 years / 9 years ago
- if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'roky' : 'rokov');
- } else {
- return result + 'rokmi';
- }
- break;
- }
- }
-
- return moment.lang('sk', {
- months : months,
- monthsShort : monthsShort,
- monthsParse : (function (months, monthsShort) {
- var i, _monthsParse = [];
- for (i = 0; i < 12; i++) {
- // use custom parser to solve problem with July (červenec)
- _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
- }
- return _monthsParse;
- }(months, monthsShort)),
- weekdays : "nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),
- weekdaysShort : "ne_po_ut_st_št_pi_so".split("_"),
- weekdaysMin : "ne_po_ut_st_št_pi_so".split("_"),
- longDateFormat : {
- LT: "H:mm",
- L : "DD.MM.YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY LT",
- LLLL : "dddd D. MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[dnes o] LT",
- nextDay: '[zajtra o] LT',
- nextWeek: function () {
- switch (this.day()) {
- case 0:
- return '[v nedeľu o] LT';
- case 1:
- case 2:
- return '[v] dddd [o] LT';
- case 3:
- return '[v stredu o] LT';
- case 4:
- return '[vo štvrtok o] LT';
- case 5:
- return '[v piatok o] LT';
- case 6:
- return '[v sobotu o] LT';
- }
- },
- lastDay: '[včera o] LT',
- lastWeek: function () {
- switch (this.day()) {
- case 0:
- return '[minulú nedeľu o] LT';
- case 1:
- case 2:
- return '[minulý] dddd [o] LT';
- case 3:
- return '[minulú stredu o] LT';
- case 4:
- case 5:
- return '[minulý] dddd [o] LT';
- case 6:
- return '[minulú sobotu o] LT';
- }
- },
- sameElse: "L"
- },
- relativeTime : {
- future : "za %s",
- past : "pred %s",
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.sl.js b/src/js/locales/bootstrap-datetimepicker.sl.js
deleted file mode 100644
index d260f80d9..000000000
--- a/src/js/locales/bootstrap-datetimepicker.sl.js
+++ /dev/null
@@ -1,144 +0,0 @@
-// moment.js language configuration
-// language : slovenian (sl)
-// author : Robert Sedovšek : https://github.com/sedovsek
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- function translate(number, withoutSuffix, key) {
- var result = number + " ";
- switch (key) {
- case 'm':
- return withoutSuffix ? 'ena minuta' : 'eno minuto';
- case 'mm':
- if (number === 1) {
- result += 'minuta';
- } else if (number === 2) {
- result += 'minuti';
- } else if (number === 3 || number === 4) {
- result += 'minute';
- } else {
- result += 'minut';
- }
- return result;
- case 'h':
- return withoutSuffix ? 'ena ura' : 'eno uro';
- case 'hh':
- if (number === 1) {
- result += 'ura';
- } else if (number === 2) {
- result += 'uri';
- } else if (number === 3 || number === 4) {
- result += 'ure';
- } else {
- result += 'ur';
- }
- return result;
- case 'dd':
- if (number === 1) {
- result += 'dan';
- } else {
- result += 'dni';
- }
- return result;
- case 'MM':
- if (number === 1) {
- result += 'mesec';
- } else if (number === 2) {
- result += 'meseca';
- } else if (number === 3 || number === 4) {
- result += 'mesece';
- } else {
- result += 'mesecev';
- }
- return result;
- case 'yy':
- if (number === 1) {
- result += 'leto';
- } else if (number === 2) {
- result += 'leti';
- } else if (number === 3 || number === 4) {
- result += 'leta';
- } else {
- result += 'let';
- }
- return result;
- }
- }
-
- return moment.lang('sl', {
- months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),
- monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
- weekdays : "nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),
- weekdaysShort : "ned._pon._tor._sre._čet._pet._sob.".split("_"),
- weekdaysMin : "ne_po_to_sr_če_pe_so".split("_"),
- longDateFormat : {
- LT : "H:mm",
- L : "DD. MM. YYYY",
- LL : "D. MMMM YYYY",
- LLL : "D. MMMM YYYY LT",
- LLLL : "dddd, D. MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[danes ob] LT',
- nextDay : '[jutri ob] LT',
-
- nextWeek : function () {
- switch (this.day()) {
- case 0:
- return '[v] [nedeljo] [ob] LT';
- case 3:
- return '[v] [sredo] [ob] LT';
- case 6:
- return '[v] [soboto] [ob] LT';
- case 1:
- case 2:
- case 4:
- case 5:
- return '[v] dddd [ob] LT';
- }
- },
- lastDay : '[včeraj ob] LT',
- lastWeek : function () {
- switch (this.day()) {
- case 0:
- case 3:
- case 6:
- return '[prejšnja] dddd [ob] LT';
- case 1:
- case 2:
- case 4:
- case 5:
- return '[prejšnji] dddd [ob] LT';
- }
- },
- sameElse : 'L'
- },
- relativeTime : {
- future : "čez %s",
- past : "%s nazaj",
- s : "nekaj sekund",
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : "en dan",
- dd : translate,
- M : "en mesec",
- MM : translate,
- y : "eno leto",
- yy : translate
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.sq.js b/src/js/locales/bootstrap-datetimepicker.sq.js
deleted file mode 100644
index eb735c6dc..000000000
--- a/src/js/locales/bootstrap-datetimepicker.sq.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// moment.js language configuration
-// language : Albanian (sq)
-// author : Flakërim Ismani : https://github.com/flakerimi
-// author: Menelion Elensúle: https://github.com/Oire (tests)
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('sq', {
- months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),
- monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),
- weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),
- weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),
- weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[Sot në] LT',
- nextDay : '[Neser në] LT',
- nextWeek : 'dddd [në] LT',
- lastDay : '[Dje në] LT',
- lastWeek : 'dddd [e kaluar në] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "në %s",
- past : "%s me parë",
- s : "disa seconda",
- m : "një minut",
- mm : "%d minutea",
- h : "një orë",
- hh : "%d orë",
- d : "një ditë",
- dd : "%d ditë",
- M : "një muaj",
- MM : "%d muaj",
- y : "një vit",
- yy : "%d vite"
- },
- ordinal : '%d.',
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.sv.js b/src/js/locales/bootstrap-datetimepicker.sv.js
deleted file mode 100644
index 0de8c40ba..000000000
--- a/src/js/locales/bootstrap-datetimepicker.sv.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// moment.js language configuration
-// language : swedish (sv)
-// author : Jens Alm : https://github.com/ulmus
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('sv', {
- months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),
- monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),
- weekdays : "söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),
- weekdaysShort : "sön_mån_tis_ons_tor_fre_lör".split("_"),
- weekdaysMin : "sö_må_ti_on_to_fr_lö".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "YYYY-MM-DD",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: '[Idag] LT',
- nextDay: '[Imorgon] LT',
- lastDay: '[Igår] LT',
- nextWeek: 'dddd LT',
- lastWeek: '[Förra] dddd[en] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "om %s",
- past : "för %s sedan",
- s : "några sekunder",
- m : "en minut",
- mm : "%d minuter",
- h : "en timme",
- hh : "%d timmar",
- d : "en dag",
- dd : "%d dagar",
- M : "en månad",
- MM : "%d månader",
- y : "ett år",
- yy : "%d år"
- },
- ordinal : function (number) {
- var b = number % 10,
- output = (~~ (number % 100 / 10) === 1) ? 'e' :
- (b === 1) ? 'a' :
- (b === 2) ? 'a' :
- (b === 3) ? 'e' : 'e';
- return number + output;
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.th.js b/src/js/locales/bootstrap-datetimepicker.th.js
deleted file mode 100644
index cc4f3c7b4..000000000
--- a/src/js/locales/bootstrap-datetimepicker.th.js
+++ /dev/null
@@ -1,58 +0,0 @@
-// moment.js language configuration
-// language : thai (th)
-// author : Kridsada Thanabulpong : https://github.com/sirn
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('th', {
- months : "มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),
- monthsShort : "มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),
- weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),
- weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"), // yes, three characters difference
- weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),
- longDateFormat : {
- LT : "H นาฬิกา m นาที",
- L : "YYYY/MM/DD",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY เวลา LT",
- LLLL : "วันddddที่ D MMMM YYYY เวลา LT"
- },
- meridiem : function (hour, minute, isLower) {
- if (hour < 12) {
- return "ก่อนเที่ยง";
- } else {
- return "หลังเที่ยง";
- }
- },
- calendar : {
- sameDay : '[วันนี้ เวลา] LT',
- nextDay : '[พรุ่งนี้ เวลา] LT',
- nextWeek : 'dddd[หน้า เวลา] LT',
- lastDay : '[เมื่อวานนี้ เวลา] LT',
- lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "อีก %s",
- past : "%sที่แล้ว",
- s : "ไม่กี่วินาที",
- m : "1 นาที",
- mm : "%d นาที",
- h : "1 ชั่วโมง",
- hh : "%d ชั่วโมง",
- d : "1 วัน",
- dd : "%d วัน",
- M : "1 เดือน",
- MM : "%d เดือน",
- y : "1 ปี",
- yy : "%d ปี"
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.tr.js b/src/js/locales/bootstrap-datetimepicker.tr.js
deleted file mode 100644
index e90f250e5..000000000
--- a/src/js/locales/bootstrap-datetimepicker.tr.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// moment.js language configuration
-// language : turkish (tr)
-// authors : Erhan Gundogan : https://github.com/erhangundogan,
-// Burak Yiğit Kaya: https://github.com/BYK
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
-
- var suffixes = {
- 1: "'inci",
- 5: "'inci",
- 8: "'inci",
- 70: "'inci",
- 80: "'inci",
-
- 2: "'nci",
- 7: "'nci",
- 20: "'nci",
- 50: "'nci",
-
- 3: "'üncü",
- 4: "'üncü",
- 100: "'üncü",
-
- 6: "'ncı",
-
- 9: "'uncu",
- 10: "'uncu",
- 30: "'uncu",
-
- 60: "'ıncı",
- 90: "'ıncı"
- };
-
- return moment.lang('tr', {
- months : "Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),
- monthsShort : "Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),
- weekdays : "Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),
- weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),
- weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD.MM.YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd, D MMMM YYYY LT"
- },
- calendar : {
- sameDay : '[bugün saat] LT',
- nextDay : '[yarın saat] LT',
- nextWeek : '[haftaya] dddd [saat] LT',
- lastDay : '[dün] LT',
- lastWeek : '[geçen hafta] dddd [saat] LT',
- sameElse : 'L'
- },
- relativeTime : {
- future : "%s sonra",
- past : "%s önce",
- s : "birkaç saniye",
- m : "bir dakika",
- mm : "%d dakika",
- h : "bir saat",
- hh : "%d saat",
- d : "bir gün",
- dd : "%d gün",
- M : "bir ay",
- MM : "%d ay",
- y : "bir yıl",
- yy : "%d yıl"
- },
- ordinal : function (number) {
- if (number === 0) { // special case for zero
- return number + "'ıncı";
- }
- var a = number % 10,
- b = number % 100 - a,
- c = number >= 100 ? 100 : null;
-
- return number + (suffixes[a] || suffixes[b] || suffixes[c]);
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.tzm-la.js b/src/js/locales/bootstrap-datetimepicker.tzm-la.js
deleted file mode 100644
index be1d878dd..000000000
--- a/src/js/locales/bootstrap-datetimepicker.tzm-la.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js language configuration
-// language : Morocco Central Atlas Tamaziɣt in Latin (tzm-la)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('tzm-la', {
- months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
- monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
- weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
- weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
- weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[asdkh g] LT",
- nextDay: '[aska g] LT',
- nextWeek: 'dddd [g] LT',
- lastDay: '[assant g] LT',
- lastWeek: 'dddd [g] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "dadkh s yan %s",
- past : "yan %s",
- s : "imik",
- m : "minuḍ",
- mm : "%d minuḍ",
- h : "saɛa",
- hh : "%d tassaɛin",
- d : "ass",
- dd : "%d ossan",
- M : "ayowr",
- MM : "%d iyyirn",
- y : "asgas",
- yy : "%d isgasn"
- },
- week : {
- dow : 6, // Saturday is the first day of the week.
- doy : 12 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.tzm.js b/src/js/locales/bootstrap-datetimepicker.tzm.js
deleted file mode 100644
index 538bc53e1..000000000
--- a/src/js/locales/bootstrap-datetimepicker.tzm.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js language configuration
-// language : Morocco Central Atlas Tamaziɣt (tzm)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('tzm', {
- months : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
- monthsShort : "ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),
- weekdays : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
- weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
- weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "dddd D MMMM YYYY LT"
- },
- calendar : {
- sameDay: "[ⴰⵙⴷⵅ ⴴ] LT",
- nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
- nextWeek: 'dddd [ⴴ] LT',
- lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
- lastWeek: 'dddd [ⴴ] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",
- past : "ⵢⴰⵏ %s",
- s : "ⵉⵎⵉⴽ",
- m : "ⵎⵉⵏⵓⴺ",
- mm : "%d ⵎⵉⵏⵓⴺ",
- h : "ⵙⴰⵄⴰ",
- hh : "%d ⵜⴰⵙⵙⴰⵄⵉⵏ",
- d : "ⴰⵙⵙ",
- dd : "%d oⵙⵙⴰⵏ",
- M : "ⴰⵢoⵓⵔ",
- MM : "%d ⵉⵢⵢⵉⵔⵏ",
- y : "ⴰⵙⴳⴰⵙ",
- yy : "%d ⵉⵙⴳⴰⵙⵏ"
- },
- week : {
- dow : 6, // Saturday is the first day of the week.
- doy : 12 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.uk.js b/src/js/locales/bootstrap-datetimepicker.uk.js
deleted file mode 100644
index f596ef8f8..000000000
--- a/src/js/locales/bootstrap-datetimepicker.uk.js
+++ /dev/null
@@ -1,157 +0,0 @@
-// moment.js language configuration
-// language : ukrainian (uk)
-// author : zemlanin : https://github.com/zemlanin
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- function plural(word, num) {
- var forms = word.split('_');
- return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
- }
-
- function relativeTimeWithPlural(number, withoutSuffix, key) {
- var format = {
- 'mm': 'хвилина_хвилини_хвилин',
- 'hh': 'година_години_годин',
- 'dd': 'день_дні_днів',
- 'MM': 'місяць_місяці_місяців',
- 'yy': 'рік_роки_років'
- };
- if (key === 'm') {
- return withoutSuffix ? 'хвилина' : 'хвилину';
- }
- else if (key === 'h') {
- return withoutSuffix ? 'година' : 'годину';
- }
- else {
- return number + ' ' + plural(format[key], +number);
- }
- }
-
- function monthsCaseReplace(m, format) {
- var months = {
- 'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
- 'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
- },
-
- nounCase = (/D[oD]? *MMMM?/).test(format) ?
- 'accusative' :
- 'nominative';
-
- return months[nounCase][m.month()];
- }
-
- function weekdaysCaseReplace(m, format) {
- var weekdays = {
- 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
- 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
- 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
- },
-
- nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
- 'accusative' :
- ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
- 'genitive' :
- 'nominative');
-
- return weekdays[nounCase][m.day()];
- }
-
- function processHoursFunction(str) {
- return function () {
- return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
- };
- }
-
- return moment.lang('uk', {
- months : monthsCaseReplace,
- monthsShort : "січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),
- weekdays : weekdaysCaseReplace,
- weekdaysShort : "нд_пн_вт_ср_чт_пт_сб".split("_"),
- weekdaysMin : "нд_пн_вт_ср_чт_пт_сб".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD.MM.YYYY",
- LL : "D MMMM YYYY р.",
- LLL : "D MMMM YYYY р., LT",
- LLLL : "dddd, D MMMM YYYY р., LT"
- },
- calendar : {
- sameDay: processHoursFunction('[Сьогодні '),
- nextDay: processHoursFunction('[Завтра '),
- lastDay: processHoursFunction('[Вчора '),
- nextWeek: processHoursFunction('[У] dddd ['),
- lastWeek: function () {
- switch (this.day()) {
- case 0:
- case 3:
- case 5:
- case 6:
- return processHoursFunction('[Минулої] dddd [').call(this);
- case 1:
- case 2:
- case 4:
- return processHoursFunction('[Минулого] dddd [').call(this);
- }
- },
- sameElse: 'L'
- },
- relativeTime : {
- future : "за %s",
- past : "%s тому",
- s : "декілька секунд",
- m : relativeTimeWithPlural,
- mm : relativeTimeWithPlural,
- h : "годину",
- hh : relativeTimeWithPlural,
- d : "день",
- dd : relativeTimeWithPlural,
- M : "місяць",
- MM : relativeTimeWithPlural,
- y : "рік",
- yy : relativeTimeWithPlural
- },
-
- // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
- meridiem : function (hour, minute, isLower) {
- if (hour < 4) {
- return "ночі";
- } else if (hour < 12) {
- return "ранку";
- } else if (hour < 17) {
- return "дня";
- } else {
- return "вечора";
- }
- },
-
- ordinal: function (number, period) {
- switch (period) {
- case 'M':
- case 'd':
- case 'DDD':
- case 'w':
- case 'W':
- return number + '-й';
- case 'D':
- return number + '-го';
- default:
- return number;
- }
- },
-
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 1st is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.uz.js b/src/js/locales/bootstrap-datetimepicker.uz.js
deleted file mode 100644
index b4904ec78..000000000
--- a/src/js/locales/bootstrap-datetimepicker.uz.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// moment.js language configuration
-// language : uzbek
-// author : Sardor Muminov : https://github.com/muminoff
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('uz', {
- months : "январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),
- monthsShort : "янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),
- weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),
- weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),
- weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM YYYY",
- LLL : "D MMMM YYYY LT",
- LLLL : "D MMMM YYYY, dddd LT"
- },
- calendar : {
- sameDay : '[Бугун соат] LT [да]',
- nextDay : '[Эртага] LT [да]',
- nextWeek : 'dddd [куни соат] LT [да]',
- lastDay : '[Кеча соат] LT [да]',
- lastWeek : '[Утган] dddd [куни соат] LT [да]',
- sameElse : 'L'
- },
- relativeTime : {
- future : "Якин %s ичида",
- past : "Бир неча %s олдин",
- s : "фурсат",
- m : "бир дакика",
- mm : "%d дакика",
- h : "бир соат",
- hh : "%d соат",
- d : "бир кун",
- dd : "%d кун",
- M : "бир ой",
- MM : "%d ой",
- y : "бир йил",
- yy : "%d йил"
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 7 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.vn.js b/src/js/locales/bootstrap-datetimepicker.vn.js
deleted file mode 100644
index f28e7c3b3..000000000
--- a/src/js/locales/bootstrap-datetimepicker.vn.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// moment.js language configuration
-// language : vietnamese (vn)
-// author : Bang Nguyen : https://github.com/bangnk
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('vn', {
- months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),
- monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),
- weekdays : "chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),
- weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"),
- weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"),
- longDateFormat : {
- LT : "HH:mm",
- L : "DD/MM/YYYY",
- LL : "D MMMM [năm] YYYY",
- LLL : "D MMMM [năm] YYYY LT",
- LLLL : "dddd, D MMMM [năm] YYYY LT",
- l : "DD/M/YYYY",
- ll : "D MMM YYYY",
- lll : "D MMM YYYY LT",
- llll : "ddd, D MMM YYYY LT"
- },
- calendar : {
- sameDay: "[Hôm nay lúc] LT",
- nextDay: '[Ngày mai lúc] LT',
- nextWeek: 'dddd [tuần tới lúc] LT',
- lastDay: '[Hôm qua lúc] LT',
- lastWeek: 'dddd [tuần rồi lúc] LT',
- sameElse: 'L'
- },
- relativeTime : {
- future : "%s tới",
- past : "%s trước",
- s : "vài giây",
- m : "một phút",
- mm : "%d phút",
- h : "một giờ",
- hh : "%d giờ",
- d : "một ngày",
- dd : "%d ngày",
- M : "một tháng",
- MM : "%d tháng",
- y : "một năm",
- yy : "%d năm"
- },
- ordinal : function (number) {
- return number;
- },
- week : {
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.zh-CN.js b/src/js/locales/bootstrap-datetimepicker.zh-CN.js
deleted file mode 100644
index 3d2d70d0a..000000000
--- a/src/js/locales/bootstrap-datetimepicker.zh-CN.js
+++ /dev/null
@@ -1,108 +0,0 @@
-// moment.js language configuration
-// language : chinese
-// author : suupic : https://github.com/suupic
-// author : Zeno Zeng : https://github.com/zenozeng
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('zh-cn', {
- months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
- monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
- weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
- weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"),
- weekdaysMin : "日_一_二_三_四_五_六".split("_"),
- longDateFormat : {
- LT : "Ah点mm",
- L : "YYYY年MMMD日",
- LL : "YYYY年MMMD日",
- LLL : "YYYY年MMMD日LT",
- LLLL : "YYYY年MMMD日ddddLT",
- l : "YYYY年MMMD日",
- ll : "YYYY年MMMD日",
- lll : "YYYY年MMMD日LT",
- llll : "YYYY年MMMD日ddddLT"
- },
- meridiem : function (hour, minute, isLower) {
- var hm = hour * 100 + minute;
- if (hm < 600) {
- return "凌晨";
- } else if (hm < 900) {
- return "早上";
- } else if (hm < 1130) {
- return "上午";
- } else if (hm < 1230) {
- return "中午";
- } else if (hm < 1800) {
- return "下午";
- } else {
- return "晚上";
- }
- },
- calendar : {
- sameDay : function () {
- return this.minutes() === 0 ? "[今天]Ah[点整]" : "[今天]LT";
- },
- nextDay : function () {
- return this.minutes() === 0 ? "[明天]Ah[点整]" : "[明天]LT";
- },
- lastDay : function () {
- return this.minutes() === 0 ? "[昨天]Ah[点整]" : "[昨天]LT";
- },
- nextWeek : function () {
- var startOfWeek, prefix;
- startOfWeek = moment().startOf('week');
- prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
- return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
- },
- lastWeek : function () {
- var startOfWeek, prefix;
- startOfWeek = moment().startOf('week');
- prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
- return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
- },
- sameElse : 'L'
- },
- ordinal : function (number, period) {
- switch (period) {
- case "d":
- case "D":
- case "DDD":
- return number + "日";
- case "M":
- return number + "月";
- case "w":
- case "W":
- return number + "周";
- default:
- return number;
- }
- },
- relativeTime : {
- future : "%s内",
- past : "%s前",
- s : "几秒",
- m : "1分钟",
- mm : "%d分钟",
- h : "1小时",
- hh : "%d小时",
- d : "1天",
- dd : "%d天",
- M : "1个月",
- MM : "%d个月",
- y : "1年",
- yy : "%d年"
- },
- week : {
- // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
- dow : 1, // Monday is the first day of the week.
- doy : 4 // The week that contains Jan 4th is the first week of the year.
- }
- });
-}));
diff --git a/src/js/locales/bootstrap-datetimepicker.zh-TW.js b/src/js/locales/bootstrap-datetimepicker.zh-TW.js
deleted file mode 100644
index 0d7b944b0..000000000
--- a/src/js/locales/bootstrap-datetimepicker.zh-TW.js
+++ /dev/null
@@ -1,84 +0,0 @@
-// moment.js language configuration
-// language : traditional chinese (zh-tw)
-// author : Ben : https://github.com/ben-lin
-
-(function (factory) {
- if (typeof define === 'function' && define.amd) {
- define(['moment'], factory); // AMD
- } else if (typeof exports === 'object') {
- module.exports = factory(require('../moment')); // Node
- } else {
- factory(window.moment); // Browser global
- }
-}(function (moment) {
- return moment.lang('zh-tw', {
- months : "一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),
- monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
- weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),
- weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"),
- weekdaysMin : "日_一_二_三_四_五_六".split("_"),
- longDateFormat : {
- LT : "Ah點mm",
- L : "YYYY年MMMD日",
- LL : "YYYY年MMMD日",
- LLL : "YYYY年MMMD日LT",
- LLLL : "YYYY年MMMD日ddddLT",
- l : "YYYY年MMMD日",
- ll : "YYYY年MMMD日",
- lll : "YYYY年MMMD日LT",
- llll : "YYYY年MMMD日ddddLT"
- },
- meridiem : function (hour, minute, isLower) {
- var hm = hour * 100 + minute;
- if (hm < 900) {
- return "早上";
- } else if (hm < 1130) {
- return "上午";
- } else if (hm < 1230) {
- return "中午";
- } else if (hm < 1800) {
- return "下午";
- } else {
- return "晚上";
- }
- },
- calendar : {
- sameDay : '[今天]LT',
- nextDay : '[明天]LT',
- nextWeek : '[下]ddddLT',
- lastDay : '[昨天]LT',
- lastWeek : '[上]ddddLT',
- sameElse : 'L'
- },
- ordinal : function (number, period) {
- switch (period) {
- case "d" :
- case "D" :
- case "DDD" :
- return number + "日";
- case "M" :
- return number + "月";
- case "w" :
- case "W" :
- return number + "週";
- default :
- return number;
- }
- },
- relativeTime : {
- future : "%s內",
- past : "%s前",
- s : "幾秒",
- m : "一分鐘",
- mm : "%d分鐘",
- h : "一小時",
- hh : "%d小時",
- d : "一天",
- dd : "%d天",
- M : "一個月",
- MM : "%d個月",
- y : "一年",
- yy : "%d年"
- }
- });
-}));
diff --git a/src/js/locales/ca.ts b/src/js/locales/ca.ts
new file mode 100644
index 000000000..a43ed2549
--- /dev/null
+++ b/src/js/locales/ca.ts
@@ -0,0 +1,45 @@
+const name = 'ca';
+
+const localization = {
+ today: 'Avui',
+ clear: 'Esborrar selecció',
+ close: 'Tancar selector',
+ selectMonth: 'Seleccionar mes',
+ previousMonth: 'Mes anterior',
+ nextMonth: 'Pròxim mes',
+ selectYear: 'Seleccionar any',
+ previousYear: 'Any anterior',
+ nextYear: 'Pròxim any',
+ selectDecade: 'Seleccionar dècada',
+ previousDecade: 'Dècada anterior',
+ nextDecade: 'Pròxima dècada',
+ previousCentury: 'Segle anterior',
+ nextCentury: 'Pròxim segle',
+ pickHour: 'Escollir hora',
+ incrementHour: 'Incrementar hora',
+ decrementHour: 'Decrementar hora',
+ pickMinute: 'Escollir minut',
+ incrementMinute: 'Incrementar minut',
+ decrementMinute: 'Decrementar minut',
+ pickSecond: 'Escollir segon',
+ incrementSecond: 'Incrementar segon',
+ decrementSecond: 'Decrementar segon',
+ toggleMeridiem: 'Canviar AM/PM',
+ selectTime: 'Seleccionar temps',
+ selectDate: 'Seleccionar data',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ startOfTheWeek: 1,
+ locale: 'ca',
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd [de] MMMM [de] yyyy',
+ LLL: 'd [de] MMMM [de] yyyy H:mm',
+ LLLL: 'dddd, d [de] MMMM [de] yyyy H:mm',
+ },
+ ordinal: (n) => `${n}º`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/cs.ts b/src/js/locales/cs.ts
new file mode 100644
index 000000000..f908edd6c
--- /dev/null
+++ b/src/js/locales/cs.ts
@@ -0,0 +1,45 @@
+const name = 'cs';
+
+const localization = {
+ today: 'Dnes',
+ clear: 'Vymazat výběr',
+ close: 'Zavřít výběrové okno',
+ selectMonth: 'Vybrat měsíc',
+ previousMonth: 'Předchozí měsíc',
+ nextMonth: 'Následující měsíc',
+ selectYear: 'Vybrat rok',
+ previousYear: 'Předchozí rok',
+ nextYear: 'Následující rok',
+ selectDecade: 'Vybrat desetiletí',
+ previousDecade: 'Předchozí desetiletí',
+ nextDecade: 'Následující desetiletí',
+ previousCentury: 'Předchozí století',
+ nextCentury: 'Následující století',
+ pickHour: 'Vybrat hodinu',
+ incrementHour: 'Zvýšit hodinu',
+ decrementHour: 'Snížit hodinu',
+ pickMinute: 'Vybrat minutu',
+ incrementMinute: 'Zvýšit minutu',
+ decrementMinute: 'Snížit minutu',
+ pickSecond: 'Vybrat sekundu',
+ incrementSecond: 'Zvýšit sekundu',
+ decrementSecond: 'Snížit sekundu',
+ toggleMeridiem: 'Přepnout ráno / odpoledne',
+ selectTime: 'Vybrat čas',
+ selectDate: 'Vybrat datum',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'cs',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LTS: 'HH:mm:ss',
+ LT: 'HH:mm',
+ L: 'dd.MM.yyyy',
+ LL: 'd. MMMM yyyy',
+ LLL: 'd. MMMM yyyy HH:mm',
+ LLLL: 'dddd, d. MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/de.ts b/src/js/locales/de.ts
new file mode 100644
index 000000000..6bd9d3eb7
--- /dev/null
+++ b/src/js/locales/de.ts
@@ -0,0 +1,45 @@
+const name = 'de';
+
+const localization = {
+ today: 'Heute',
+ clear: 'Auswahl löschen',
+ close: 'Auswahlbox schließen',
+ selectMonth: 'Monat wählen',
+ previousMonth: 'Letzter Monat',
+ nextMonth: 'Nächster Monat',
+ selectYear: 'Jahr wählen',
+ previousYear: 'Letztes Jahr',
+ nextYear: 'Nächstes Jahr',
+ selectDecade: 'Jahrzehnt wählen',
+ previousDecade: 'Letztes Jahrzehnt',
+ nextDecade: 'Nächstes Jahrzehnt',
+ previousCentury: 'Letztes Jahrhundert',
+ nextCentury: 'Nächstes Jahrhundert',
+ pickHour: 'Stunde wählen',
+ incrementHour: 'Stunde erhöhen',
+ decrementHour: 'Stunde verringern',
+ pickMinute: 'Minute wählen',
+ incrementMinute: 'Minute erhöhen',
+ decrementMinute: 'Minute verringern',
+ pickSecond: 'Sekunde wählen',
+ incrementSecond: 'Sekunde erhöhen',
+ decrementSecond: 'Sekunde verringern',
+ toggleMeridiem: 'Tageszeit umschalten',
+ selectTime: 'Zeit wählen',
+ selectDate: 'Datum wählen',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'de',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LTS: 'HH:mm:ss',
+ LT: 'HH:mm',
+ L: 'dd.MM.yyyy',
+ LL: 'd. MMMM yyyy',
+ LLL: 'd. MMMM yyyy HH:mm',
+ LLLL: 'dddd, d. MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/es.ts b/src/js/locales/es.ts
new file mode 100644
index 000000000..0c90a3e40
--- /dev/null
+++ b/src/js/locales/es.ts
@@ -0,0 +1,45 @@
+const name = 'es';
+
+const localization = {
+ today: 'Hoy',
+ clear: 'Borrar selección',
+ close: 'Cerrar selector',
+ selectMonth: 'Seleccionar mes',
+ previousMonth: 'Mes anterior',
+ nextMonth: 'Próximo mes',
+ selectYear: 'Seleccionar año',
+ previousYear: 'Año anterior',
+ nextYear: 'Próximo año',
+ selectDecade: 'Seleccionar década',
+ previousDecade: 'Década anterior',
+ nextDecade: 'Próxima década',
+ previousCentury: 'Siglo anterior',
+ nextCentury: 'Próximo siglo',
+ pickHour: 'Elegir hora',
+ incrementHour: 'Incrementar hora',
+ decrementHour: 'Decrementar hora',
+ pickMinute: 'Elegir minuto',
+ incrementMinute: 'Incrementar minuto',
+ decrementMinute: 'Decrementar minuto',
+ pickSecond: 'Elegir segundo',
+ incrementSecond: 'Incrementar segundo',
+ decrementSecond: 'Decrementar segundo',
+ toggleMeridiem: 'Cambiar AM/PM',
+ selectTime: 'Seleccionar tiempo',
+ selectDate: 'Seleccionar fecha',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ startOfTheWeek: 1,
+ locale: 'es',
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd [de] MMMM [de] yyyy',
+ LLL: 'd [de] MMMM [de] yyyy H:mm',
+ LLLL: 'dddd, d [de] MMMM [de] yyyy H:mm',
+ },
+ ordinal: (n) => `${n}º`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/fi.ts b/src/js/locales/fi.ts
new file mode 100644
index 000000000..4fade3f0d
--- /dev/null
+++ b/src/js/locales/fi.ts
@@ -0,0 +1,45 @@
+const name = 'fi';
+
+const localization = {
+ today: 'Tänään',
+ clear: 'Tyhjennä',
+ close: 'Sulje',
+ selectMonth: 'Valitse kuukausi',
+ previousMonth: 'Edellinen kuukausi',
+ nextMonth: 'Seuraava kuukausi',
+ selectYear: 'Valitse vuosi',
+ previousYear: 'Edellinen vuosi',
+ nextYear: 'Seuraava vuosi',
+ selectDecade: 'Valitse vuosikymmen',
+ previousDecade: 'Edellinen vuosikymmen',
+ nextDecade: 'Seuraava vuosikymmen',
+ previousCentury: 'Edellinen vuosisata',
+ nextCentury: 'Seuraava vuosisata',
+ pickHour: 'Valitse tunnit',
+ incrementHour: 'Vähennä tunteja',
+ decrementHour: 'Lisää tunteja',
+ pickMinute: 'Valitse minuutit',
+ incrementMinute: 'Vähennä minuutteja',
+ decrementMinute: 'Lisää minuutteja',
+ pickSecond: 'Valitse sekuntit',
+ incrementSecond: 'Vähennä sekunteja',
+ decrementSecond: 'Lisää sekunteja',
+ toggleMeridiem: 'Vaihda kellonaikaa',
+ selectTime: 'Valitse aika',
+ selectDate: 'Valise päivä',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'fi',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH.mm',
+ LTS: 'HH.mm.ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd. MMMM[ta] yyyy',
+ LLL: 'd. MMMM[ta] yyyy, [klo] HH.mm',
+ LLLL: 'dddd, d. MMMM[ta] yyyy, [klo] HH.mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/fr.ts b/src/js/locales/fr.ts
new file mode 100644
index 000000000..e691d3983
--- /dev/null
+++ b/src/js/locales/fr.ts
@@ -0,0 +1,48 @@
+const name = 'fr';
+
+const localization = {
+ today: "Aujourd'hui",
+ clear: 'Effacer la sélection',
+ close: 'Fermer',
+ selectMonth: 'Sélectionner le mois',
+ previousMonth: 'Mois précédent',
+ nextMonth: 'Mois suivant',
+ selectYear: "Sélectionner l'année",
+ previousYear: 'Année précédente',
+ nextYear: 'Année suivante',
+ selectDecade: 'Sélectionner la décennie',
+ previousDecade: 'Décennie précédente',
+ nextDecade: 'Décennie suivante',
+ previousCentury: 'Siècle précédente',
+ nextCentury: 'Siècle suivante',
+ pickHour: "Sélectionner l'heure",
+ incrementHour: "Incrementer l'heure",
+ decrementHour: "Diminuer l'heure",
+ pickMinute: 'Sélectionner les minutes',
+ incrementMinute: 'Incrementer les minutes',
+ decrementMinute: 'Diminuer les minutes',
+ pickSecond: 'Sélectionner les secondes',
+ incrementSecond: 'Incrementer les secondes',
+ decrementSecond: 'Diminuer les secondes',
+ toggleMeridiem: 'Basculer AM-PM',
+ selectTime: "Sélectionner l'heure",
+ selectDate: 'Sélectionner une date',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'fr',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => {
+ const o = n === 1 ? 'er' : '';
+ return `${n}${o}`;
+ },
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/hr.ts b/src/js/locales/hr.ts
new file mode 100644
index 000000000..195ea3296
--- /dev/null
+++ b/src/js/locales/hr.ts
@@ -0,0 +1,45 @@
+const name = 'hr';
+
+const localization = {
+ today: 'Danas',
+ clear: 'Poništi odabir',
+ close: 'Zatvori',
+ selectMonth: 'Odaberi mjesec',
+ previousMonth: 'Prethodni mjesec',
+ nextMonth: 'Sljedeći mjesec',
+ selectYear: 'Odaberi godinu',
+ previousYear: 'Prethodna godina',
+ nextYear: 'Sljedeće godina',
+ selectDecade: 'Odaberi desetljeće',
+ previousDecade: 'Prethodno desetljeće',
+ nextDecade: 'Sljedeće desetljeće',
+ previousCentury: 'Prethodno stoljeće',
+ nextCentury: 'Sljedeće stoljeće',
+ pickHour: 'Odaberi vrijeme',
+ incrementHour: 'Povećaj vrijeme',
+ decrementHour: 'Smanji vrijeme',
+ pickMinute: 'Odaberi minutu',
+ incrementMinute: 'Povećaj minute',
+ decrementMinute: 'Smanji minute',
+ pickSecond: 'Odaberi sekundu',
+ incrementSecond: 'Povećaj sekunde',
+ decrementSecond: 'Smanji sekunde',
+ toggleMeridiem: 'Razmijeni AM-PM',
+ selectTime: 'Odaberi vrijeme',
+ selectDate: 'Odaberi datum',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'hr',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/hy.ts b/src/js/locales/hy.ts
new file mode 100644
index 000000000..93ead03b3
--- /dev/null
+++ b/src/js/locales/hy.ts
@@ -0,0 +1,45 @@
+const name = 'hy';
+
+const localization = {
+ today: 'Այսօր',
+ clear: 'Ջնջել ընտրվածը',
+ close: 'Փակել',
+ selectMonth: 'Ընտրել ամիս',
+ previousMonth: 'Նախորդ ամիս',
+ nextMonth: 'Հաջորդ ամիս',
+ selectYear: 'Ընտրել տարի',
+ previousYear: 'Նախորդ տարի',
+ nextYear: 'Հաջորդ տարի',
+ selectDecade: 'Ընտրել տասնամյակ',
+ previousDecade: 'Նախորդ տասնամյակ',
+ nextDecade: 'Հաջորդ տասնամյակ',
+ previousCentury: 'Նախորդ դար',
+ nextCentury: 'Հաջորդ դար',
+ pickHour: 'Ընտրել ժամ',
+ incrementHour: 'Ավելացնել ժամ',
+ decrementHour: 'Նվազեցնել ժամ',
+ pickMinute: 'Ընտրել րոպե',
+ incrementMinute: 'Ավելացնել րոպե',
+ decrementMinute: 'Նվազեցնել րոպե',
+ pickSecond: 'Ընտրել երկրորդը',
+ incrementSecond: 'Ավելացնել վայրկյան',
+ decrementSecond: 'Նվազեցնել վայրկյան',
+ toggleMeridiem: 'Փոփոխել Ժամանակաշրջանը',
+ selectTime: 'Ընտրել Ժամ',
+ selectDate: 'Ընտրել ամսաթիվ',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'hy',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd MMMM yyyy թ.',
+ LLL: 'd MMMM yyyy թ., H:mm',
+ LLLL: 'dddd, d MMMM yyyy թ., H:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LTS',
+};
+
+export { localization, name };
diff --git a/src/js/locales/it.ts b/src/js/locales/it.ts
new file mode 100644
index 000000000..f51a4f434
--- /dev/null
+++ b/src/js/locales/it.ts
@@ -0,0 +1,45 @@
+const name = 'it';
+
+const localization = {
+ today: 'Oggi',
+ clear: 'Cancella selezione',
+ close: 'Chiudi',
+ selectMonth: 'Seleziona mese',
+ previousMonth: 'Mese precedente',
+ nextMonth: 'Mese successivo',
+ selectYear: 'Seleziona anno',
+ previousYear: 'Anno precedente',
+ nextYear: 'Anno successivo',
+ selectDecade: 'Seleziona decennio',
+ previousDecade: 'Decennio precedente',
+ nextDecade: 'Decennio successivo',
+ previousCentury: 'Secolo precedente',
+ nextCentury: 'Secolo successivo',
+ pickHour: "Seleziona l'ora",
+ incrementHour: "Incrementa l'ora",
+ decrementHour: "Decrementa l'ora",
+ pickMinute: 'Seleziona i minuti',
+ incrementMinute: 'Incrementa i minuti',
+ decrementMinute: 'Decrementa i minuti',
+ pickSecond: 'Seleziona i secondi',
+ incrementSecond: 'Incrementa i secondi',
+ decrementSecond: 'Decrementa i secondi',
+ toggleMeridiem: 'Scambia AM-PM',
+ selectTime: "Seleziona l'ora",
+ selectDate: 'Seleziona una data',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'it',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `${n}º`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/nl.ts b/src/js/locales/nl.ts
new file mode 100644
index 000000000..5e2b7ac48
--- /dev/null
+++ b/src/js/locales/nl.ts
@@ -0,0 +1,45 @@
+const name = 'nl';
+
+const localization = {
+ today: 'Vandaag',
+ clear: 'Verwijder selectie',
+ close: 'Sluit de picker',
+ selectMonth: 'Selecteer een maand',
+ previousMonth: 'Vorige maand',
+ nextMonth: 'Volgende maand',
+ selectYear: 'Selecteer een jaar',
+ previousYear: 'Vorige jaar',
+ nextYear: 'Volgende jaar',
+ selectDecade: 'Selecteer decennium',
+ previousDecade: 'Vorige decennium',
+ nextDecade: 'Volgende decennium',
+ previousCentury: 'Vorige eeuw',
+ nextCentury: 'Volgende eeuw',
+ pickHour: 'Kies een uur',
+ incrementHour: 'Verhoog uur',
+ decrementHour: 'Verlaag uur',
+ pickMinute: 'Kies een minute',
+ incrementMinute: 'Verhoog minuut',
+ decrementMinute: 'Verlaag minuut',
+ pickSecond: 'Kies een seconde',
+ incrementSecond: 'Verhoog seconde',
+ decrementSecond: 'Verlaag seconde',
+ toggleMeridiem: 'Schakel tussen AM/PM',
+ selectTime: 'Selecteer een tijd',
+ selectDate: 'Selecteer een datum',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'nl',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd-MM-yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `[${n}${n === 1 || n === 8 || n >= 20 ? 'ste' : 'de'}]`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/pl.ts b/src/js/locales/pl.ts
new file mode 100644
index 000000000..31c77e97a
--- /dev/null
+++ b/src/js/locales/pl.ts
@@ -0,0 +1,45 @@
+const name = 'pl';
+
+const localization = {
+ today: 'Dzisiaj',
+ clear: 'Wyczyść',
+ close: 'Zamknij',
+ selectMonth: 'Wybierz miesiąc',
+ previousMonth: 'Poprzedni miesiąc',
+ nextMonth: 'Następny miesiąc',
+ selectYear: 'Wybierz rok',
+ previousYear: 'Poprzedni rok',
+ nextYear: 'Następny rok',
+ selectDecade: 'Wybierz dekadę',
+ previousDecade: 'Poprzednia dekada',
+ nextDecade: 'Następna dekada',
+ previousCentury: 'Poprzednie stulecie',
+ nextCentury: 'Następne stulecie',
+ pickHour: 'Wybierz godzinę',
+ incrementHour: 'Kolejna godzina',
+ decrementHour: 'Poprzednia godzina',
+ pickMinute: 'Wybierz minutę',
+ incrementMinute: 'Kolejna minuta',
+ decrementMinute: 'Poprzednia minuta',
+ pickSecond: 'Wybierz sekundę',
+ incrementSecond: 'Kolejna sekunda',
+ decrementSecond: 'Poprzednia sekunda',
+ toggleMeridiem: 'Przełącz porę dnia',
+ selectTime: 'Ustaw godzinę',
+ selectDate: 'Ustaw datę',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'pl',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd, d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/pt-PT.ts b/src/js/locales/pt-PT.ts
new file mode 100644
index 000000000..7f82f6581
--- /dev/null
+++ b/src/js/locales/pt-PT.ts
@@ -0,0 +1,45 @@
+const name = 'pt-PT';
+
+const localization = {
+ today: 'Hoje',
+ clear: 'Limpar seleção',
+ close: 'Eliminar seleção',
+ selectMonth: 'Selecionar mês',
+ previousMonth: 'Mês anterior',
+ nextMonth: 'Próximo mês',
+ selectYear: 'Selecionar ano',
+ previousYear: 'Ano anterior',
+ nextYear: 'Próximo ano',
+ selectDecade: 'Seleccionar década',
+ previousDecade: 'Década anterior',
+ nextDecade: 'Próxima década',
+ previousCentury: 'Século anterior',
+ nextCentury: 'Próximo Século',
+ pickHour: 'Seleccionar hora',
+ incrementHour: 'Aumentar hora',
+ decrementHour: 'Diminuir hora',
+ pickMinute: 'Seleccionar minuto',
+ incrementMinute: 'Aumentar minuto',
+ decrementMinute: 'Diminuir minuto',
+ pickSecond: 'Seleccionar segundo',
+ incrementSecond: 'Aumentar segundo',
+ decrementSecond: 'Diminuir segundo',
+ toggleMeridiem: 'Alterar AM/PM',
+ selectTime: 'Selecionar hora',
+ selectDate: 'Seleccionar data',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ startOfTheWeek: 1,
+ locale: 'pt-PT',
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd [de] MMMM [de] yyyy',
+ LLL: 'd [de] MMMM [de] yyyy H:mm',
+ LLLL: 'dddd, d [de] MMMM [de] yyyy H:mm',
+ },
+ ordinal: (n) => `${n}º`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/ro.ts b/src/js/locales/ro.ts
new file mode 100644
index 000000000..084bb00c9
--- /dev/null
+++ b/src/js/locales/ro.ts
@@ -0,0 +1,45 @@
+const name = 'ro';
+
+const localization = {
+ today: 'Mergi la ziua de astăzi',
+ clear: 'Șterge selecția',
+ close: 'Închide calendarul',
+ selectMonth: 'Selectează luna',
+ previousMonth: 'Luna precedentă',
+ nextMonth: 'Luna următoare',
+ selectYear: 'Selectează anul',
+ previousYear: 'Anul precedent',
+ nextYear: 'Anul următor',
+ selectDecade: 'Selectează deceniul',
+ previousDecade: 'Deceniul precedent',
+ nextDecade: 'Deceniul următor',
+ previousCentury: 'Secolul precedent',
+ nextCentury: 'Secolul următor',
+ pickHour: 'Alege ora',
+ incrementHour: 'Incrementează ora',
+ decrementHour: 'Decrementează ora',
+ pickMinute: 'Alege minutul',
+ incrementMinute: 'Incrementează minutul',
+ decrementMinute: 'Decrementează minutul',
+ pickSecond: 'Alege secunda',
+ incrementSecond: 'Incrementează secunda',
+ decrementSecond: 'Decrementează secunda',
+ toggleMeridiem: 'Comută modul AM/PM',
+ selectTime: 'Selectează ora',
+ selectDate: 'Selectează data',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'ro',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy H:mm',
+ LLLL: 'dddd, d MMMM yyyy H:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/ru.ts b/src/js/locales/ru.ts
new file mode 100644
index 000000000..6931af2da
--- /dev/null
+++ b/src/js/locales/ru.ts
@@ -0,0 +1,45 @@
+const name = 'ru';
+
+const localization = {
+ today: 'Перейти сегодня',
+ clear: 'Очистить выделение',
+ close: 'Закрыть сборщик',
+ selectMonth: 'Выбрать месяц',
+ previousMonth: 'Предыдущий месяц',
+ nextMonth: 'В следующем месяце',
+ selectYear: 'Выбрать год',
+ previousYear: 'Предыдущий год',
+ nextYear: 'В следующем году',
+ selectDecade: 'Выбрать десятилетие',
+ previousDecade: 'Предыдущее десятилетие',
+ nextDecade: 'Следующее десятилетие',
+ previousCentury: 'Предыдущий век',
+ nextCentury: 'Следующий век',
+ pickHour: 'Выберите час',
+ incrementHour: 'Время увеличения',
+ decrementHour: 'Уменьшить час',
+ pickMinute: 'Выбрать минуту',
+ incrementMinute: 'Минута приращения',
+ decrementMinute: 'Уменьшить минуту',
+ pickSecond: 'Выбрать второй',
+ incrementSecond: 'Увеличение секунды',
+ decrementSecond: 'Уменьшение секунды',
+ toggleMeridiem: 'Переключить период',
+ selectTime: 'Выбрать время',
+ selectDate: 'Выбрать дату',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'ru',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd MMMM yyyy г.',
+ LLL: 'd MMMM yyyy г., H:mm',
+ LLLL: 'dddd, d MMMM yyyy г., H:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/sk.ts b/src/js/locales/sk.ts
new file mode 100644
index 000000000..15c9649b0
--- /dev/null
+++ b/src/js/locales/sk.ts
@@ -0,0 +1,45 @@
+const name = 'sk';
+
+const localization = {
+ today: 'Dnes',
+ clear: 'Vymazať výber',
+ close: 'Zavrieť výberové okno',
+ selectMonth: 'Vybrať mesiac',
+ previousMonth: 'Predchádzajúci mesiac',
+ nextMonth: 'Nasledujúci mesiac',
+ selectYear: 'Vybrať rok',
+ previousYear: 'Predchádzajúci rok',
+ nextYear: 'Nasledujúci rok',
+ selectDecade: 'Vybrať desaťročie',
+ previousDecade: 'Predchádzajúce desaťročie',
+ nextDecade: 'Nasledujúce desaťročie',
+ previousCentury: 'Predchádzajúce storočia',
+ nextCentury: 'Nasledujúce storočia',
+ pickHour: 'Vybrať hodinu',
+ incrementHour: 'Zvýšiť hodinu',
+ decrementHour: 'Znížiť hodinu',
+ pickMinute: 'Vybrať minútu',
+ incrementMinute: 'Zvýšiť minútu',
+ decrementMinute: 'Znížiť minútu',
+ pickSecond: 'Vybrať sekundu',
+ incrementSecond: 'Zvýšiť sekundu',
+ decrementSecond: 'Znížiť sekundu',
+ toggleMeridiem: 'Prepnúť ráno / popoludní',
+ selectTime: 'Vybrať čas',
+ selectDate: 'Vybrať dátum',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'sk',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LTS: 'HH:mm:ss',
+ LT: 'HH:mm',
+ L: 'dd.MM.yyyy',
+ LL: 'd. MMMM yyyy',
+ LLL: 'd. MMMM yyyy HH:mm',
+ LLLL: 'dddd, d. MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/sl.ts b/src/js/locales/sl.ts
new file mode 100644
index 000000000..ff1bfd258
--- /dev/null
+++ b/src/js/locales/sl.ts
@@ -0,0 +1,45 @@
+const name = 'sl';
+
+const localization = {
+ today: 'Danes',
+ clear: 'Počisti',
+ close: 'Zapri',
+ selectMonth: 'Izberite mesec',
+ previousMonth: 'Prejšnji mesec',
+ nextMonth: 'Naslednji mesec',
+ selectYear: 'Izberite leto',
+ previousYear: 'Prejšnje Leto',
+ nextYear: 'Naslednje leto',
+ selectDecade: 'Izberite desetletje',
+ previousDecade: 'Prejšnje desetletje',
+ nextDecade: 'Naslednje desetletje',
+ previousCentury: 'Prejšnje stoletje',
+ nextCentury: 'Naslednje stoletje',
+ pickHour: 'Izberite uro',
+ incrementHour: 'Povečaj ure',
+ decrementHour: 'Zmanjšaj uro',
+ pickMinute: 'Izberite minuto',
+ incrementMinute: 'Povečaj minuto',
+ decrementMinute: 'Zmanjšaj minuto',
+ pickSecond: 'Izberite drugo',
+ incrementSecond: 'Povečaj sekundo',
+ decrementSecond: 'Zmanjšaj sekundo',
+ toggleMeridiem: 'Preklop dopoldne/popoldne',
+ selectTime: 'Izberite čas',
+ selectDate: 'Izberite Datum',
+ dayViewHeaderFormat: { month: 'long', year: 'numeric' },
+ locale: 'sl',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd. MMMM yyyy',
+ LLL: 'd. MMMM yyyy H:mm',
+ LLLL: 'dddd, d. MMMM yyyy H:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/sr-Latn.ts b/src/js/locales/sr-Latn.ts
new file mode 100644
index 000000000..a723cfb77
--- /dev/null
+++ b/src/js/locales/sr-Latn.ts
@@ -0,0 +1,45 @@
+const name = 'sr-Latn';
+
+const localization = {
+ today: 'Danas',
+ clear: 'Izbriši izbor',
+ close: 'Zatvori',
+ selectMonth: 'Izaberi mesec',
+ previousMonth: 'Prethodni mesec',
+ nextMonth: 'Sledeći mesec',
+ selectYear: 'Izaberi godinu',
+ previousYear: 'Prethodna godina',
+ nextYear: 'Sledeća godina',
+ selectDecade: 'Izaberi dekadu',
+ previousDecade: 'Prethodna dekada',
+ nextDecade: 'Sledeća dekada',
+ previousCentury: 'Prethodni vek',
+ nextCentury: 'Sledeći vek',
+ pickHour: 'Izaberi vreme',
+ incrementHour: 'Povećaj vreme',
+ decrementHour: 'Smanji vreme',
+ pickMinute: 'Izaberi minute',
+ incrementMinute: 'Povećaj minute',
+ decrementMinute: 'Smanji minute',
+ pickSecond: 'Izaberi sekunde',
+ incrementSecond: 'Povećaj sekunde',
+ decrementSecond: 'Smanji sekunde',
+ toggleMeridiem: 'Razmeni AM-PM',
+ selectTime: 'Izaberi vreme',
+ selectDate: 'Izaberi datum',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'sr-Latn',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'D. M. YYYY.',
+ LL: 'D. MMMM YYYY.',
+ LLL: 'D. MMMM YYYY. H:mm',
+ LLLL: 'dddd, D. MMMM YYYY. H:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/sr.ts b/src/js/locales/sr.ts
new file mode 100644
index 000000000..e8cf6f24e
--- /dev/null
+++ b/src/js/locales/sr.ts
@@ -0,0 +1,45 @@
+const name = 'sr';
+
+const localization = {
+ today: 'Данас',
+ clear: 'Избриши избор',
+ close: 'Затвори',
+ selectMonth: 'Изабери месец',
+ previousMonth: 'Претходни месец',
+ nextMonth: 'Следећи месец',
+ selectYear: 'Изабери годину',
+ previousYear: 'Претходна година',
+ nextYear: 'Следећа година',
+ selectDecade: 'Изабери декаду',
+ previousDecade: 'Претходна декада',
+ nextDecade: 'Следећа декада',
+ previousCentury: 'Претходни век',
+ nextCentury: 'Следећи век',
+ pickHour: 'Изабери време',
+ incrementHour: 'Повећај време',
+ decrementHour: 'Смањи време',
+ pickMinute: 'Изабери минуте',
+ incrementMinute: 'Повећај минуте',
+ decrementMinute: 'Смањи минуте',
+ pickSecond: 'Изабери секунде',
+ incrementSecond: 'Повећај секунде',
+ decrementSecond: 'Смањи секунде',
+ toggleMeridiem: 'Размени AM-PM',
+ selectTime: 'Изабери време',
+ selectDate: 'Изабери датум',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'sr',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'D. M. YYYY.',
+ LL: 'D. MMMM YYYY.',
+ LLL: 'D. MMMM YYYY. H:mm',
+ LLLL: 'dddd, D. MMMM YYYY. H:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/tr.ts b/src/js/locales/tr.ts
new file mode 100644
index 000000000..ee4a38249
--- /dev/null
+++ b/src/js/locales/tr.ts
@@ -0,0 +1,45 @@
+const name = 'tr';
+
+const localization = {
+ today: 'Bugün',
+ clear: 'Temizle',
+ close: 'Kapat',
+ selectMonth: 'Ay seçin',
+ previousMonth: 'Önceki Ay',
+ nextMonth: 'Sonraki Ay',
+ selectYear: 'Yıl seçin',
+ previousYear: 'Önceki yıl',
+ nextYear: 'Sonraki yıl',
+ selectDecade: 'On yıl seçin',
+ previousDecade: 'Önceki on yıl',
+ nextDecade: 'Sonraki on yıl',
+ previousCentury: 'Önceki yüzyıl',
+ nextCentury: 'Sonraki yüzyıl',
+ pickHour: 'Saat seçin',
+ incrementHour: 'Saati ilerlet',
+ decrementHour: 'Saati gerilet',
+ pickMinute: 'Dakika seçin',
+ incrementMinute: 'Dakikayı ilerlet',
+ decrementMinute: 'Dakikayı gerilet',
+ pickSecond: 'Saniye seç',
+ incrementSecond: 'Saniyeyi ilerlet',
+ decrementSecond: 'Saniyeyi gerilet',
+ toggleMeridiem: 'Meridemi Değiştir AM-PM',
+ selectTime: 'Saat seçin',
+ selectDate: 'Tarih seçin',
+ dayViewHeaderFormat: { month: 'long', year: 'numeric' },
+ locale: 'tr',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd MMMM yyyy',
+ LLL: 'd MMMM yyyy HH:mm',
+ LLLL: 'dddd, d MMMM yyyy HH:mm',
+ },
+ ordinal: (n) => `${n}.`,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/uk.ts b/src/js/locales/uk.ts
new file mode 100644
index 000000000..f4b2a8b31
--- /dev/null
+++ b/src/js/locales/uk.ts
@@ -0,0 +1,45 @@
+const name = 'uk';
+
+const localization = {
+ today: 'Сьогодні',
+ clear: 'Очистити',
+ close: 'Закрити',
+ selectMonth: 'Обрати місяць',
+ previousMonth: 'Попередній місяць',
+ nextMonth: 'У наступному місяці',
+ selectYear: 'Обрати рік',
+ previousYear: 'Попередній рік',
+ nextYear: 'У наступному році',
+ selectDecade: 'Обрати десятиліття',
+ previousDecade: 'Попереднє десятиліття',
+ nextDecade: 'Наступне десятиліття',
+ previousCentury: 'Попереднє століття',
+ nextCentury: 'Наступне століття',
+ pickHour: 'Оберіть годину',
+ incrementHour: 'Час збільшення',
+ decrementHour: 'Зменшити годину',
+ pickMinute: 'Обрати хвилину',
+ incrementMinute: 'Хвилина приросту',
+ decrementMinute: 'Зменшити хвилину',
+ pickSecond: 'Обрати другий',
+ incrementSecond: 'Збільшення секунди',
+ decrementSecond: 'Зменшення секунди',
+ toggleMeridiem: 'Переключити період',
+ selectTime: 'Обрати час',
+ selectDate: 'Обрати дату',
+ dayViewHeaderFormat: { month: 'long', year: 'numeric' },
+ locale: 'uk',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd.MM.yyyy',
+ LL: 'd MMMM yyyy р.',
+ LLL: 'd MMMM yyyy р., H:mm',
+ LLLL: 'dddd, d MMMM yyyy р., H:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/zh-CN.ts b/src/js/locales/zh-CN.ts
new file mode 100644
index 000000000..556c1ed7b
--- /dev/null
+++ b/src/js/locales/zh-CN.ts
@@ -0,0 +1,45 @@
+const name = 'zh-CN';
+
+const localization = {
+ today: '今天',
+ clear: '清空',
+ close: '关闭',
+ selectMonth: '选择月份',
+ previousMonth: '上个月',
+ nextMonth: '下个月',
+ selectYear: '选择年份',
+ previousYear: '上一年',
+ nextYear: '下一年',
+ selectDecade: '选择年代',
+ previousDecade: '下个年代',
+ nextDecade: '上个年代',
+ previousCentury: '上个世纪',
+ nextCentury: '下个世纪',
+ pickHour: '选取时钟',
+ incrementHour: '加一小时',
+ decrementHour: '减一小时',
+ pickMinute: '选取分钟',
+ incrementMinute: '加一分钟',
+ decrementMinute: '减一分钟',
+ pickSecond: '选取秒钟',
+ incrementSecond: '加一秒钟',
+ decrementSecond: '减一秒钟',
+ toggleMeridiem: '切换上下午',
+ selectTime: '选择时间',
+ selectDate: '选择日期',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'zh-CN',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'yyyy/MM/dd',
+ LL: 'yyyy年Md日',
+ LLL: 'yyyy年Md日Th点mm分',
+ LLLL: 'yyyy年Md日ddddTh点mm分',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/zh-HK.ts b/src/js/locales/zh-HK.ts
new file mode 100644
index 000000000..f69721a13
--- /dev/null
+++ b/src/js/locales/zh-HK.ts
@@ -0,0 +1,45 @@
+const name = 'zh-HK';
+
+const localization = {
+ today: '今天',
+ clear: '清空',
+ close: '關閉',
+ selectMonth: '選擇月份',
+ previousMonth: '上個月',
+ nextMonth: '下個月',
+ selectYear: '選擇年份',
+ previousYear: '上一年',
+ nextYear: '下一年',
+ selectDecade: '選擇年代',
+ previousDecade: '下個年代',
+ nextDecade: '上個年代',
+ previousCentury: '上個世紀',
+ nextCentury: '下個世紀',
+ pickHour: '選取時鐘',
+ incrementHour: '加一小時',
+ decrementHour: '減一小時',
+ pickMinute: '選取分鐘',
+ incrementMinute: '加一分鐘',
+ decrementMinute: '減一分鐘',
+ pickSecond: '選取秒鐘',
+ incrementSecond: '加一秒鐘',
+ decrementSecond: '減一秒鐘',
+ toggleMeridiem: '切換上下午',
+ selectTime: '選擇時間',
+ selectDate: '選擇日期',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'zh-HK',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'yyyy/MM/dd',
+ LL: 'yyyy年Md日',
+ LLL: 'yyyy年Md日 HH:mm',
+ LLLL: 'yyyy年Md日dddd HH:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/zh-MO.ts b/src/js/locales/zh-MO.ts
new file mode 100644
index 000000000..bbc6c989e
--- /dev/null
+++ b/src/js/locales/zh-MO.ts
@@ -0,0 +1,45 @@
+const name = 'zh-MO';
+
+const localization = {
+ today: '今天',
+ clear: '清空',
+ close: '關閉',
+ selectMonth: '選擇月份',
+ previousMonth: '上個月',
+ nextMonth: '下個月',
+ selectYear: '選擇年份',
+ previousYear: '上一年',
+ nextYear: '下一年',
+ selectDecade: '選擇年代',
+ previousDecade: '下個年代',
+ nextDecade: '上個年代',
+ previousCentury: '上個世紀',
+ nextCentury: '下個世紀',
+ pickHour: '選取時鐘',
+ incrementHour: '加一小時',
+ decrementHour: '減一小時',
+ pickMinute: '選取分鐘',
+ incrementMinute: '加一分鐘',
+ decrementMinute: '減一分鐘',
+ pickSecond: '選取秒鐘',
+ incrementSecond: '加一秒鐘',
+ decrementSecond: '減一秒鐘',
+ toggleMeridiem: '切換上下午',
+ selectTime: '選擇時間',
+ selectDate: '選擇日期',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'zh-MO',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'yyyy年Md日',
+ LLL: 'yyyy年Md日 HH:mm',
+ LLLL: 'yyyy年Md日dddd HH:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/locales/zh-TW.ts b/src/js/locales/zh-TW.ts
new file mode 100644
index 000000000..f1b6e6546
--- /dev/null
+++ b/src/js/locales/zh-TW.ts
@@ -0,0 +1,45 @@
+const name = 'zh-TW';
+
+const localization = {
+ today: '今天',
+ clear: '清空',
+ close: '關閉',
+ selectMonth: '選擇月份',
+ previousMonth: '上個月',
+ nextMonth: '下個月',
+ selectYear: '選擇年份',
+ previousYear: '上一年',
+ nextYear: '下一年',
+ selectDecade: '選擇年代',
+ previousDecade: '下個年代',
+ nextDecade: '上個年代',
+ previousCentury: '上個世紀',
+ nextCentury: '下個世紀',
+ pickHour: '選取時鐘',
+ incrementHour: '加一小時',
+ decrementHour: '減一小時',
+ pickMinute: '選取分鐘',
+ incrementMinute: '加一分鐘',
+ decrementMinute: '減一分鐘',
+ pickSecond: '選取秒鐘',
+ incrementSecond: '加一秒鐘',
+ decrementSecond: '減一秒鐘',
+ toggleMeridiem: '切換上下午',
+ selectTime: '選擇時間',
+ selectDate: '選擇日期',
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ locale: 'zh-TW',
+ startOfTheWeek: 1,
+ dateFormats: {
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
+ L: 'yyyy/MM/dd',
+ LL: 'yyyy年MD日',
+ LLL: 'yyyy年MD日 HH:mm',
+ LLLL: 'yyyy年MD日dddd HH:mm',
+ },
+ ordinal: (n) => n,
+ format: 'L LT',
+};
+
+export { localization, name };
diff --git a/src/js/plugins/bi-one/index.ts b/src/js/plugins/bi-one/index.ts
new file mode 100644
index 000000000..543191ccf
--- /dev/null
+++ b/src/js/plugins/bi-one/index.ts
@@ -0,0 +1,21 @@
+// this obviously requires the Bootstrap Icons v1 libraries to be loaded
+
+const biOneIcons = {
+ type: 'icons',
+ time: 'bi bi-clock',
+ date: 'bi bi-calendar-week',
+ up: 'bi bi-arrow-up',
+ down: 'bi bi-arrow-down',
+ previous: 'bi bi-chevron-left',
+ next: 'bi bi-chevron-right',
+ today: 'bi bi-calendar-check',
+ clear: 'bi bi-trash',
+ close: 'bi bi-x',
+};
+
+// noinspection JSUnusedGlobalSymbols
+const load = (_, __, tdFactory) => {
+ tdFactory.DefaultOptions.display.icons = biOneIcons;
+};
+
+export { biOneIcons, load };
diff --git a/src/js/plugins/customDateFormat/index.ts b/src/js/plugins/customDateFormat/index.ts
new file mode 100644
index 000000000..502040df9
--- /dev/null
+++ b/src/js/plugins/customDateFormat/index.ts
@@ -0,0 +1,5 @@
+export default () => {
+ console.warn(
+ 'This plugin has been merged with the main picker and is now longer required'
+ );
+};
diff --git a/src/js/plugins/examples/custom-paint-job.ts b/src/js/plugins/examples/custom-paint-job.ts
new file mode 100644
index 000000000..bc0cae858
--- /dev/null
+++ b/src/js/plugins/examples/custom-paint-job.ts
@@ -0,0 +1,17 @@
+/* eslint-disable */
+// noinspection JSUnusedGlobalSymbols
+export default (option, tdClasses, tdFactory) => {
+ // noinspection JSUnusedLocalSymbols
+ tdClasses.Display.prototype.paint = (
+ unit,
+ date,
+ classes: string[],
+ element: HTMLElement
+ ) => {
+ if (unit === tdFactory.Unit.date) {
+ if (date.isSame(new tdFactory.DateTime(), unit)) {
+ classes.push('special-day');
+ }
+ }
+ };
+};
diff --git a/src/js/plugins/examples/sample.ts b/src/js/plugins/examples/sample.ts
new file mode 100644
index 000000000..a283f5ab2
--- /dev/null
+++ b/src/js/plugins/examples/sample.ts
@@ -0,0 +1,28 @@
+// noinspection JSUnusedGlobalSymbols
+
+export default (option, tdClasses, tdFactory) => {
+ // extend the picker
+ // e.g. add new tempusDominus.TempusDominus(...).someFunction()
+ tdClasses.TempusDominus.prototype.someFunction = (a, logger) => {
+ logger = logger || console.log;
+ logger(a);
+ };
+
+ // extend tempusDominus
+ // e.g. add tempusDominus.example()
+ tdFactory.example = (a, logger) => {
+ logger = logger || console.log;
+ logger(a);
+ };
+
+ // overriding existing API
+ // e.g. extend new tempusDominus.TempusDominus(...).show()
+ const oldShow = tdClasses.TempusDominus.prototype.show;
+ tdClasses.TempusDominus.prototype.show = function (a, logger) {
+ logger = logger || console.log;
+ alert('from plugin');
+ logger(a);
+ oldShow.bind(this)();
+ // return modified result
+ };
+};
diff --git a/src/js/plugins/fa-five/index.ts b/src/js/plugins/fa-five/index.ts
new file mode 100644
index 000000000..3e9e4ab42
--- /dev/null
+++ b/src/js/plugins/fa-five/index.ts
@@ -0,0 +1,21 @@
+// this obviously requires the FA 6 libraries to be loaded
+
+const faFiveIcons = {
+ type: 'icons',
+ time: 'fas fa-clock',
+ date: 'fas fa-calendar',
+ up: 'fas fa-arrow-up',
+ down: 'fas fa-arrow-down',
+ previous: 'fas fa-chevron-left',
+ next: 'fas fa-chevron-right',
+ today: 'fas fa-calendar-check',
+ clear: 'fas fa-trash',
+ close: 'fas fa-times',
+};
+
+// noinspection JSUnusedGlobalSymbols
+const load = (_, __, tdFactory) => {
+ tdFactory.DefaultOptions.display.icons = faFiveIcons;
+};
+
+export { faFiveIcons, load };
diff --git a/src/js/plugins/moment-parse/index.ts b/src/js/plugins/moment-parse/index.ts
new file mode 100644
index 000000000..d8c2c679e
--- /dev/null
+++ b/src/js/plugins/moment-parse/index.ts
@@ -0,0 +1,20 @@
+//obviously, loading moment js is required.
+declare let moment;
+export default (option, tdClasses, tdFactory) => {
+ tdClasses.Dates.prototype.setFromInput = function (value, index) {
+ const converted = moment(value, option);
+ if (converted.isValid()) {
+ const date = tdFactory.DateTime.convert(
+ converted.toDate(),
+ this.optionsStore.options.localization.locale
+ );
+ this.setValue(date, index);
+ } else {
+ console.warn('Momentjs failed to parse the input date.');
+ }
+ };
+
+ tdClasses.Dates.prototype.formatInput = function (date) {
+ return moment(date).format(option);
+ };
+};
diff --git a/src/js/tempus-dominus.ts b/src/js/tempus-dominus.ts
new file mode 100644
index 000000000..0116f3841
--- /dev/null
+++ b/src/js/tempus-dominus.ts
@@ -0,0 +1,712 @@
+import Display from './display/index';
+import Dates from './dates';
+import Actions from './actions';
+import {
+ DateTime,
+ DateTimeFormatOptions,
+ guessHourCycle,
+ Unit,
+} from './datetime';
+import Namespace from './utilities/namespace';
+import Options from './utilities/options';
+import {
+ BaseEvent,
+ ChangeEvent,
+ ViewUpdateEvent,
+} from './utilities/event-types';
+import { EventEmitters } from './utilities/event-emitter';
+import {
+ serviceLocator,
+ setupServiceLocator,
+} from './utilities/service-locator';
+import CalendarModes from './utilities/calendar-modes';
+import DefaultOptions, {
+ DefaultEnLocalization,
+} from './utilities/default-options';
+import ActionTypes from './utilities/action-types';
+import { OptionsStore } from './utilities/optionsStore';
+import { OptionConverter } from './utilities/optionConverter';
+
+/**
+ * A robust and powerful date/time picker component.
+ */
+class TempusDominus {
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ _subscribers: { [key: string]: ((event: any) => Record)[] } =
+ {};
+ private _isDisabled = false;
+ private _currentPromptTimeTimeout: NodeJS.Timeout;
+ private actions: Actions;
+ private optionsStore: OptionsStore;
+ private _eventEmitters: EventEmitters;
+ display: Display;
+ dates: Dates;
+
+ constructor(element: HTMLElement, options: Options = {} as Options) {
+ setupServiceLocator();
+ this._eventEmitters = serviceLocator.locate(EventEmitters);
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ this.display = serviceLocator.locate(Display);
+ this.dates = serviceLocator.locate(Dates);
+ this.actions = serviceLocator.locate(Actions);
+
+ if (!element) {
+ Namespace.errorMessages.mustProvideElement();
+ }
+
+ this.optionsStore.element = element;
+ this._initializeOptions(options, DefaultOptions, true);
+ this.optionsStore.viewDate.setLocalization(
+ this.optionsStore.options.localization
+ );
+ this.optionsStore.unset = true;
+
+ this._initializeInput();
+ this._initializeToggle();
+
+ if (this.optionsStore.options.display.inline) this.display.show();
+
+ this._eventEmitters.triggerEvent.subscribe((e) => {
+ this._triggerEvent(e);
+ });
+
+ this._eventEmitters.viewUpdate.subscribe(() => {
+ this._viewUpdate();
+ });
+
+ this._eventEmitters.updateViewDate.subscribe((dateTime) => {
+ this.viewDate = dateTime;
+ });
+ }
+
+ get viewDate() {
+ return this.optionsStore.viewDate;
+ }
+
+ set viewDate(value) {
+ this.optionsStore.viewDate = value;
+ this.optionsStore.viewDate.setLocalization(
+ this.optionsStore.options.localization
+ );
+ this.display._update(
+ this.optionsStore.currentView === 'clock' ? 'clock' : 'calendar'
+ );
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Update the picker options. If `reset` is provide `options` will be merged with DefaultOptions instead.
+ * @param options
+ * @param reset
+ * @public
+ */
+ updateOptions(options, reset = false): void {
+ if (reset) this._initializeOptions(options, DefaultOptions);
+ else this._initializeOptions(options, this.optionsStore.options);
+
+ this.optionsStore.viewDate.setLocalization(
+ this.optionsStore.options.localization
+ );
+ this.display.refreshCurrentView();
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Toggles the picker open or closed. If the picker is disabled, nothing will happen.
+ * @public
+ */
+ toggle(): void {
+ if (this._isDisabled) return;
+ this.display.toggle();
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Shows the picker unless the picker is disabled.
+ * @public
+ */
+ show(): void {
+ if (this._isDisabled) return;
+ this.display.show();
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Hides the picker unless the picker is disabled.
+ * @public
+ */
+ hide(): void {
+ this.display.hide();
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Disables the picker and the target input field.
+ * @public
+ */
+ disable(): void {
+ this._isDisabled = true;
+ // todo this might be undesired. If a dev disables the input field to
+ // only allow using the picker, this will break that.
+ this.optionsStore.input?.setAttribute('disabled', 'disabled');
+ this.display.hide();
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Enables the picker and the target input field.
+ * @public
+ */
+ enable(): void {
+ this._isDisabled = false;
+ this.optionsStore.input?.removeAttribute('disabled');
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Clears all the selected dates
+ * @public
+ */
+ clear(): void {
+ this.optionsStore.input.value = '';
+ this.dates.clear();
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Allows for a direct subscription to picker events, without having to use addEventListener on the element.
+ * @param eventTypes See Namespace.Events
+ * @param callbacks Function to call when event is triggered
+ * @public
+ */
+ subscribe(
+ eventTypes: string | string[],
+ callbacks: (event: any) => void | ((event: any) => void)[] //eslint-disable-line @typescript-eslint/no-explicit-any
+ ): { unsubscribe: () => void } | { unsubscribe: () => void }[] {
+ if (typeof eventTypes === 'string') {
+ eventTypes = [eventTypes];
+ }
+ let callBackArray: any[]; //eslint-disable-line @typescript-eslint/no-explicit-any
+ if (!Array.isArray(callbacks)) {
+ callBackArray = [callbacks];
+ } else {
+ callBackArray = callbacks;
+ }
+
+ if (eventTypes.length !== callBackArray.length) {
+ Namespace.errorMessages.subscribeMismatch();
+ }
+
+ const returnArray = [];
+
+ for (let i = 0; i < eventTypes.length; i++) {
+ const eventType = eventTypes[i];
+ if (!Array.isArray(this._subscribers[eventType])) {
+ this._subscribers[eventType] = [];
+ }
+
+ this._subscribers[eventType].push(callBackArray[i]);
+
+ returnArray.push({
+ unsubscribe: this._unsubscribe.bind(
+ this,
+ eventType,
+ this._subscribers[eventType].length - 1
+ ),
+ });
+
+ if (eventTypes.length === 1) {
+ return returnArray[0];
+ }
+ }
+
+ return returnArray;
+ }
+
+ // noinspection JSUnusedGlobalSymbols
+ /**
+ * Hides the picker and removes event listeners
+ */
+ dispose() {
+ this.display.hide();
+ // this will clear the document click event listener
+ this.display._dispose();
+ this._eventEmitters.destroy();
+ this.optionsStore.input?.removeEventListener(
+ 'change',
+ this._inputChangeEvent
+ );
+ if (this.optionsStore.options.allowInputToggle) {
+ this.optionsStore.input?.removeEventListener(
+ 'click',
+ this._openClickEvent
+ );
+ this.optionsStore.input?.removeEventListener(
+ 'focus',
+ this._openClickEvent
+ );
+ }
+ this.optionsStore.toggle?.removeEventListener(
+ 'click',
+ this._toggleClickEvent
+ );
+ this.optionsStore.toggle?.removeEventListener(
+ 'keydown',
+ this._handleToggleKeydown
+ );
+ this._subscribers = {};
+ }
+
+ /**
+ * Updates the options to use the provided language.
+ * THe language file must be loaded first.
+ * @param language
+ */
+ locale(language: string) {
+ const asked = loadedLocales[language];
+ if (!asked) return;
+ this.updateOptions({
+ localization: asked,
+ });
+ }
+
+ /**
+ * Triggers an event like ChangeEvent when the picker has updated the value
+ * of a selected date.
+ * @param event Accepts a BaseEvent object.
+ * @private
+ */
+ private _triggerEvent(event: BaseEvent) {
+ event.viewMode = this.optionsStore.currentView;
+
+ const isChangeEvent = event.type === Namespace.events.change;
+ if (isChangeEvent) {
+ const { date, oldDate, isClear } = event as ChangeEvent;
+ if (
+ (date && oldDate && date.isSame(oldDate)) ||
+ (!isClear && !date && !oldDate)
+ ) {
+ return;
+ }
+ this._handleAfterChangeEvent(event as ChangeEvent);
+
+ this.optionsStore.input?.dispatchEvent(
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ new CustomEvent('change', { detail: event as any })
+ );
+
+ if (this.optionsStore.toggle) {
+ let label = this.optionsStore.options.localization.toggleAriaLabel;
+ if (this.dates.picked.length > 0) {
+ const picked = this.dates.picked.map((x) => x.format()).join(', ');
+ label = `${label}, ${picked}`;
+ }
+
+ this.optionsStore.toggle.ariaLabel = label;
+ }
+ }
+
+ this.optionsStore.element.dispatchEvent(
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ new CustomEvent(event.type, { detail: event as any })
+ );
+
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ if ((window as any).jQuery) {
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const $ = (window as any).jQuery;
+
+ if (isChangeEvent && this.optionsStore.input) {
+ $(this.optionsStore.input).trigger(event);
+ } else {
+ $(this.optionsStore.element).trigger(event);
+ }
+ }
+
+ this._publish(event);
+ }
+
+ private _publish(event: BaseEvent) {
+ // return if event is not subscribed
+ if (!Array.isArray(this._subscribers[event.type])) {
+ return;
+ }
+
+ // Trigger callback for each subscriber
+ this._subscribers[event.type].forEach((callback) => {
+ callback(event);
+ });
+ }
+
+ /**
+ * Fires a ViewUpdate event when, for example, the month view is changed.
+ * @private
+ */
+ private _viewUpdate() {
+ this._triggerEvent({
+ type: Namespace.events.update,
+ viewDate: this.optionsStore.viewDate.clone,
+ } as ViewUpdateEvent);
+ }
+
+ private _unsubscribe(eventName, index) {
+ this._subscribers[eventName].splice(index, 1);
+ }
+
+ /**
+ * Merges two Option objects together and validates options type
+ * @param config new Options
+ * @param mergeTo Options to merge into
+ * @param includeDataset When true, the elements data-td attributes will be included in the
+ * @private
+ */
+ private _initializeOptions(
+ config: Options,
+ mergeTo: Options,
+ includeDataset = false
+ ): void {
+ let newConfig = OptionConverter.deepCopy(config);
+ newConfig = OptionConverter._mergeOptions(newConfig, mergeTo);
+ if (includeDataset)
+ newConfig = OptionConverter._dataToOptions(
+ this.optionsStore.element,
+ newConfig
+ );
+
+ OptionConverter._validateConflicts(newConfig);
+
+ newConfig.viewDate = newConfig.viewDate.setLocalization(
+ newConfig.localization
+ );
+
+ if (!this.optionsStore.viewDate.isSame(newConfig.viewDate)) {
+ this.optionsStore.viewDate = newConfig.viewDate;
+ }
+
+ /**
+ * Sets the minimum view allowed by the picker. For example the case of only
+ * allowing year and month to be selected but not date.
+ */
+ if (newConfig.display.components.year) {
+ this.optionsStore.minimumCalendarViewMode = 2;
+ }
+ if (newConfig.display.components.month) {
+ this.optionsStore.minimumCalendarViewMode = 1;
+ }
+ if (newConfig.display.components.date) {
+ this.optionsStore.minimumCalendarViewMode = 0;
+ }
+
+ this.optionsStore.currentCalendarViewMode = Math.max(
+ this.optionsStore.minimumCalendarViewMode,
+ this.optionsStore.currentCalendarViewMode
+ );
+
+ // Update view mode if needed
+ if (
+ CalendarModes[this.optionsStore.currentCalendarViewMode].name !==
+ newConfig.display.viewMode
+ ) {
+ this.optionsStore.currentCalendarViewMode = Math.max(
+ CalendarModes.findIndex((x) => x.name === newConfig.display.viewMode),
+ this.optionsStore.minimumCalendarViewMode
+ );
+ }
+
+ if (this.display?.isVisible) {
+ this.display._update('all');
+ }
+
+ if (
+ newConfig.display.components.useTwentyfourHour &&
+ newConfig.localization.hourCycle === undefined
+ )
+ newConfig.localization.hourCycle = 'h24';
+ else if (newConfig.localization.hourCycle === undefined) {
+ newConfig.localization.hourCycle = guessHourCycle(
+ newConfig.localization.locale
+ );
+ }
+
+ this.optionsStore.options = newConfig;
+
+ if (
+ newConfig.restrictions.maxDate &&
+ this.viewDate.isAfter(newConfig.restrictions.maxDate)
+ )
+ this.viewDate = newConfig.restrictions.maxDate.clone;
+
+ if (
+ newConfig.restrictions.minDate &&
+ this.viewDate.isBefore(newConfig.restrictions.minDate)
+ )
+ this.viewDate = newConfig.restrictions.minDate.clone;
+ }
+
+ /**
+ * Checks if an input field is being used, attempts to locate one and sets an
+ * event listener if found.
+ * @private
+ */
+ private _initializeInput() {
+ if (this.optionsStore.element.tagName == 'INPUT') {
+ this.optionsStore.input = this.optionsStore.element as HTMLInputElement;
+ } else {
+ const query = this.optionsStore.element.dataset.tdTargetInput;
+ if (query == undefined || query == 'nearest') {
+ this.optionsStore.input =
+ this.optionsStore.element.querySelector('input');
+ } else {
+ this.optionsStore.input =
+ this.optionsStore.element.querySelector(query);
+ }
+ }
+
+ if (!this.optionsStore.input) return;
+
+ if (!this.optionsStore.input.value && this.optionsStore.options.defaultDate)
+ this.optionsStore.input.value = this.dates.formatInput(
+ this.optionsStore.options.defaultDate
+ );
+
+ this.optionsStore.input.addEventListener('change', this._inputChangeEvent);
+ if (this.optionsStore.options.allowInputToggle) {
+ this.optionsStore.input.addEventListener('click', this._openClickEvent);
+ this.optionsStore.input.addEventListener('focus', this._openClickEvent);
+ }
+
+ if (this.optionsStore.input.value) {
+ this._inputChangeEvent();
+ }
+ }
+
+ /**
+ * Attempts to locate a toggle for the picker and sets an event listener
+ * @private
+ */
+ private _initializeToggle() {
+ if (this.optionsStore.options.display.inline) return;
+ let query = this.optionsStore.element.dataset.tdTargetToggle;
+ if (query == 'nearest') {
+ query = '[data-td-toggle="datetimepicker"]';
+ }
+ this.optionsStore.toggle =
+ query == undefined
+ ? this.optionsStore.element
+ : this.optionsStore.element.querySelector(query);
+
+ if (this.optionsStore.toggle == undefined) return;
+
+ this.optionsStore.toggle.addEventListener('click', this._toggleClickEvent);
+
+ if (this.optionsStore.toggle !== this.optionsStore.element) {
+ this.optionsStore.toggle.addEventListener(
+ 'keydown',
+ this._handleToggleKeydown.bind(this)
+ );
+ }
+ }
+
+ /**
+ * If the option is enabled this will render the clock view after a date pick.
+ * @param e change event
+ * @private
+ */
+ private _handleAfterChangeEvent(e: ChangeEvent) {
+ if (
+ // options is disabled
+ !this.optionsStore.options.promptTimeOnDateChange ||
+ this.optionsStore.options.multipleDates ||
+ this.optionsStore.options.display.inline ||
+ this.optionsStore.options.display.sideBySide ||
+ // time is disabled
+ !this.display._hasTime ||
+ // clock component is already showing
+ this.display.widget
+ ?.getElementsByClassName(Namespace.css.show)[0]
+ .classList.contains(Namespace.css.timeContainer)
+ )
+ return;
+
+ // First time ever. If useCurrent option is set to true (default), do nothing
+ // because the first date is selected automatically.
+ // or date didn't change (time did) or date changed because time did.
+ if (
+ (!e.oldDate && this.optionsStore.options.useCurrent) ||
+ (e.oldDate && e.date?.isSame(e.oldDate))
+ ) {
+ return;
+ }
+
+ clearTimeout(this._currentPromptTimeTimeout);
+ this._currentPromptTimeTimeout = setTimeout(() => {
+ if (this.display.widget) {
+ this._eventEmitters.action.emit({
+ e: {
+ currentTarget: this.display.widget.querySelector(
+ '[data-action="http://github.com/togglePicker"]'
+ ),
+ },
+ action: ActionTypes.togglePicker,
+ });
+ }
+ }, this.optionsStore.options.promptTimeOnDateChangeTransitionDelay);
+ }
+
+ /**
+ * Event for when the input field changes. This is a class level method so there's
+ * something for the remove listener function.
+ * @private
+ */
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ private _inputChangeEvent = (event?: any) => {
+ const internallyTriggered = event?.detail;
+ if (internallyTriggered) return;
+
+ const setViewDate = () => {
+ if (this.dates.lastPicked)
+ this.optionsStore.viewDate = this.dates.lastPicked.clone;
+ };
+
+ const value = this.optionsStore.input.value;
+ if (
+ this.optionsStore.options.multipleDates ||
+ this.optionsStore.options.dateRange
+ ) {
+ try {
+ const valueSplit = value.split(
+ this.optionsStore.options.multipleDatesSeparator
+ );
+ for (let i = 0; i < valueSplit.length; i++) {
+ this.dates.setFromInput(valueSplit[i], i);
+ }
+ setViewDate();
+ } catch {
+ console.warn(
+ 'TD: Something went wrong trying to set the multipleDates values from the input field.'
+ );
+ }
+ } else {
+ this.dates.setFromInput(value, 0);
+ setViewDate();
+ }
+ };
+
+ /**
+ * Event for when the toggle is clicked. This is a class level method so there's
+ * something for the remove listener function.
+ * @private
+ */
+ private _toggleClickEvent = () => {
+ if (
+ (this.optionsStore.element as HTMLInputElement)?.disabled ||
+ this.optionsStore.input?.disabled ||
+ //if we just have the input and allow input toggle is enabled, then don't cause a toggle
+ (this.optionsStore.toggle.nodeName === 'INPUT' &&
+ (this.optionsStore.toggle as HTMLInputElement)?.type === 'text' &&
+ this.optionsStore.options.allowInputToggle)
+ )
+ return;
+ this.toggle();
+ };
+
+ private _handleToggleKeydown(event: KeyboardEvent) {
+ if (event.key !== ' ' && event.key !== 'Enter') return;
+
+ this.optionsStore.toggle.click();
+
+ event.stopPropagation();
+ event.preventDefault();
+ }
+
+ /**
+ * Event for when the toggle is clicked. This is a class level method so there's
+ * something for the remove listener function.
+ * @private
+ */
+ private _openClickEvent = () => {
+ if (
+ (this.optionsStore.element as HTMLInputElement)?.disabled ||
+ this.optionsStore.input?.disabled
+ )
+ return;
+ if (!this.display.isVisible) this.show();
+ };
+}
+
+/**
+ * Whenever a locale is loaded via a plugin then store it here based on the
+ * locale name. E.g. loadedLocales['ru']
+ */
+const loadedLocales = {};
+
+// noinspection JSUnusedGlobalSymbols
+/**
+ * Called from a locale plugin.
+ * @param l locale object for localization options
+ */
+const loadLocale = (l) => {
+ if (loadedLocales[l.name]) return;
+ loadedLocales[l.name] = l.localization;
+};
+
+/**
+ * A sets the global localization options to the provided locale name.
+ * `loadLocale` MUST be called first.
+ * @param l
+ */
+const locale = (l: string) => {
+ const asked = loadedLocales[l];
+ if (!asked) return;
+ DefaultOptions.localization = asked;
+};
+
+// noinspection JSUnusedGlobalSymbols
+/**
+ * Called from a plugin to extend or override picker defaults.
+ * @param plugin
+ * @param option
+ */
+const extend = function (plugin, option = undefined) {
+ if (!plugin) return tempusDominus;
+ if (!plugin.installed) {
+ // install plugin only once
+ plugin(
+ option,
+ { TempusDominus, Dates, Display, DateTime, Namespace },
+ tempusDominus
+ );
+ plugin.installed = true;
+ }
+ return tempusDominus;
+};
+
+const version = '6.10.3';
+
+const tempusDominus = {
+ TempusDominus,
+ extend,
+ loadLocale,
+ locale,
+ Namespace,
+ DefaultOptions,
+ DateTime,
+ Unit,
+ version,
+ DefaultEnLocalization,
+};
+
+export {
+ TempusDominus,
+ extend,
+ loadLocale,
+ locale,
+ Namespace,
+ DefaultOptions,
+ DateTime,
+ Unit,
+ version,
+ DateTimeFormatOptions,
+ Options,
+ DefaultEnLocalization,
+};
diff --git a/src/js/utilities/action-types.ts b/src/js/utilities/action-types.ts
new file mode 100644
index 000000000..e183f68b6
--- /dev/null
+++ b/src/js/utilities/action-types.ts
@@ -0,0 +1,29 @@
+enum ActionTypes {
+ next = 'next',
+ previous = 'previous',
+ changeCalendarView = 'changeCalendarView',
+ selectMonth = 'selectMonth',
+ selectYear = 'selectYear',
+ selectDecade = 'selectDecade',
+ selectDay = 'selectDay',
+ selectHour = 'selectHour',
+ selectMinute = 'selectMinute',
+ selectSecond = 'selectSecond',
+ incrementHours = 'incrementHours',
+ incrementMinutes = 'incrementMinutes',
+ incrementSeconds = 'incrementSeconds',
+ decrementHours = 'decrementHours',
+ decrementMinutes = 'decrementMinutes',
+ decrementSeconds = 'decrementSeconds',
+ toggleMeridiem = 'toggleMeridiem',
+ togglePicker = 'togglePicker',
+ showClock = 'showClock',
+ showHours = 'showHours',
+ showMinutes = 'showMinutes',
+ showSeconds = 'showSeconds',
+ clear = 'clear',
+ close = 'close',
+ today = 'today',
+}
+
+export default ActionTypes;
diff --git a/src/js/utilities/calendar-modes.ts b/src/js/utilities/calendar-modes.ts
new file mode 100644
index 000000000..cf8eb6ade
--- /dev/null
+++ b/src/js/utilities/calendar-modes.ts
@@ -0,0 +1,37 @@
+import { Unit } from '../datetime';
+import Namespace from './namespace';
+import ViewMode from './view-mode';
+
+const CalendarModes: {
+ name: keyof ViewMode;
+ className: string;
+ unit: Unit;
+ step: number;
+}[] = [
+ {
+ name: 'calendar',
+ className: Namespace.css.daysContainer,
+ unit: Unit.month,
+ step: 1,
+ },
+ {
+ name: 'months',
+ className: Namespace.css.monthsContainer,
+ unit: Unit.year,
+ step: 1,
+ },
+ {
+ name: 'years',
+ className: Namespace.css.yearsContainer,
+ unit: Unit.year,
+ step: 10,
+ },
+ {
+ name: 'decades',
+ className: Namespace.css.decadesContainer,
+ unit: Unit.year,
+ step: 100,
+ },
+];
+
+export default CalendarModes;
diff --git a/src/js/utilities/default-format-localization.ts b/src/js/utilities/default-format-localization.ts
new file mode 100644
index 000000000..34c1ad707
--- /dev/null
+++ b/src/js/utilities/default-format-localization.ts
@@ -0,0 +1,22 @@
+import { FormatLocalization } from './options';
+
+const DefaultFormatLocalization: FormatLocalization = {
+ dateFormats: {
+ LTS: 'h:mm:ss T',
+ LT: 'h:mm T',
+ L: 'MM/dd/yyyy',
+ LL: 'MMMM d, yyyy',
+ LLL: 'MMMM d, yyyy h:mm T',
+ LLLL: 'dddd, MMMM d, yyyy h:mm T',
+ },
+ format: 'L LT',
+ locale: 'default',
+ hourCycle: undefined,
+ ordinal: (n) => {
+ const s = ['th', 'st', 'nd', 'rd'];
+ const v = n % 100;
+ return `[${n}${s[(v - 20) % 10] || s[v] || s[0]}]`;
+ },
+};
+
+export default { ...DefaultFormatLocalization };
diff --git a/src/js/utilities/default-options.ts b/src/js/utilities/default-options.ts
new file mode 100644
index 000000000..e9552fd32
--- /dev/null
+++ b/src/js/utilities/default-options.ts
@@ -0,0 +1,112 @@
+import Options, { Localization } from './options';
+import { DateTime } from '../datetime';
+import DefaultFormatLocalization from './default-format-localization';
+
+const defaultEnLocalization: Localization = {
+ clear: 'Clear selection',
+ close: 'Close the picker',
+ dateFormats: DefaultFormatLocalization.dateFormats,
+ dayViewHeaderFormat: { month: 'long', year: '2-digit' },
+ decrementHour: 'Decrement Hour',
+ decrementMinute: 'Decrement Minute',
+ decrementSecond: 'Decrement Second',
+ format: DefaultFormatLocalization.format,
+ hourCycle: DefaultFormatLocalization.hourCycle,
+ incrementHour: 'Increment Hour',
+ incrementMinute: 'Increment Minute',
+ incrementSecond: 'Increment Second',
+ locale: DefaultFormatLocalization.locale,
+ maxWeekdayLength: 0,
+ nextCentury: 'Next Century',
+ nextDecade: 'Next Decade',
+ nextMonth: 'Next Month',
+ nextYear: 'Next Year',
+ ordinal: DefaultFormatLocalization.ordinal,
+ pickHour: 'Pick Hour',
+ pickMinute: 'Pick Minute',
+ pickSecond: 'Pick Second',
+ previousCentury: 'Previous Century',
+ previousDecade: 'Previous Decade',
+ previousMonth: 'Previous Month',
+ previousYear: 'Previous Year',
+ selectDate: 'Select Date',
+ selectDecade: 'Select Decade',
+ selectMonth: 'Select Month',
+ selectTime: 'Select Time',
+ selectYear: 'Select Year',
+ startOfTheWeek: 0,
+ today: 'Go to today',
+ toggleMeridiem: 'Toggle Meridiem',
+ toggleAriaLabel: 'Change date',
+};
+
+const DefaultOptions: Options = {
+ allowInputToggle: false,
+ container: undefined,
+ dateRange: false,
+ debug: false,
+ defaultDate: undefined,
+ display: {
+ icons: {
+ type: 'icons',
+ time: 'fa-solid fa-clock',
+ date: 'fa-solid fa-calendar',
+ up: 'fa-solid fa-arrow-up',
+ down: 'fa-solid fa-arrow-down',
+ previous: 'fa-solid fa-chevron-left',
+ next: 'fa-solid fa-chevron-right',
+ today: 'fa-solid fa-calendar-check',
+ clear: 'fa-solid fa-trash',
+ close: 'fa-solid fa-xmark',
+ },
+ sideBySide: false,
+ calendarWeeks: false,
+ viewMode: 'calendar',
+ toolbarPlacement: 'bottom',
+ keepOpen: false,
+ buttons: {
+ today: false,
+ clear: false,
+ close: false,
+ },
+ components: {
+ calendar: true,
+ date: true,
+ month: true,
+ year: true,
+ decades: true,
+ clock: true,
+ hours: true,
+ minutes: true,
+ seconds: false,
+ useTwentyfourHour: undefined,
+ },
+ inline: false,
+ theme: 'auto',
+ placement: 'bottom',
+ keyboardNavigation: true,
+ },
+ keepInvalid: false,
+ localization: defaultEnLocalization,
+ meta: {},
+ multipleDates: false,
+ multipleDatesSeparator: '; ',
+ promptTimeOnDateChange: false,
+ promptTimeOnDateChangeTransitionDelay: 200,
+ restrictions: {
+ minDate: undefined,
+ maxDate: undefined,
+ disabledDates: [],
+ enabledDates: [],
+ daysOfWeekDisabled: [],
+ disabledTimeIntervals: [],
+ disabledHours: [],
+ enabledHours: [],
+ },
+ stepping: 1,
+ useCurrent: true,
+ viewDate: new DateTime(),
+};
+
+export default DefaultOptions;
+export const DefaultEnLocalization = { ...defaultEnLocalization };
diff --git a/src/js/utilities/errors.ts b/src/js/utilities/errors.ts
new file mode 100644
index 000000000..d4682a126
--- /dev/null
+++ b/src/js/utilities/errors.ts
@@ -0,0 +1,184 @@
+export class TdError extends Error {
+ code: number;
+}
+
+export class ErrorMessages {
+ private base = 'TD:';
+
+ //#region out to console
+
+ /**
+ * Throws an error indicating that a key in the options object is invalid.
+ * @param optionName
+ */
+ unexpectedOption(optionName: string) {
+ const error = new TdError(
+ `${this.base} Unexpected option: ${optionName} does not match a known option.`
+ );
+ error.code = 1;
+ throw error;
+ }
+
+ /**
+ * Throws an error indicating that one more keys in the options object is invalid.
+ * @param optionName
+ */
+ unexpectedOptions(optionName: string[]) {
+ const error = new TdError(`${this.base}: ${optionName.join(', ')}`);
+ error.code = 1;
+ throw error;
+ }
+
+ /**
+ * Throws an error when an option is provide an unsupported value.
+ * For example a value of 'cheese' for toolbarPlacement which only supports
+ * 'top', 'bottom', 'default'.
+ * @param optionName
+ * @param badValue
+ * @param validOptions
+ */
+ unexpectedOptionValue(
+ optionName: string,
+ badValue: string,
+ validOptions: string[]
+ ) {
+ const error = new TdError(
+ `${
+ this.base
+ } Unexpected option value: ${optionName} does not accept a value of "${badValue}". Valid values are: ${validOptions.join(
+ ', '
+ )}`
+ );
+ error.code = 2;
+ throw error;
+ }
+
+ /**
+ * Throws an error when an option value is the wrong type.
+ * For example a string value was provided to multipleDates which only
+ * supports true or false.
+ * @param optionName
+ * @param badType
+ * @param expectedType
+ */
+ typeMismatch(optionName: string, badType: string, expectedType: string) {
+ const error = new TdError(
+ `${this.base} Mismatch types: ${optionName} has a type of ${badType} instead of the required ${expectedType}`
+ );
+ error.code = 3;
+ throw error;
+ }
+
+ /**
+ * Throws an error when an option value is outside of the expected range.
+ * For example restrictions.daysOfWeekDisabled excepts a value between 0 and 6.
+ * @param optionName
+ * @param lower
+ * @param upper
+ */
+ numbersOutOfRange(optionName: string, lower: number, upper: number) {
+ const error = new TdError(
+ `${this.base} ${optionName} expected an array of number between ${lower} and ${upper}.`
+ );
+ error.code = 4;
+ throw error;
+ }
+
+ /**
+ * Throws an error when a value for a date options couldn't be parsed. Either
+ * the option was an invalid string or an invalid Date object.
+ * @param optionName
+ * @param date
+ * @param soft If true, logs a warning instead of an error.
+ */
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
+ failedToParseDate(optionName: string, date: any, soft = false) {
+ const error = new TdError(
+ `${this.base} Could not correctly parse "${date}" to a date for ${optionName}.`
+ );
+ error.code = 5;
+ if (!soft) throw error;
+ console.warn(error);
+ }
+
+ /**
+ * Throws when an element to attach to was not provided in the constructor.
+ */
+ mustProvideElement() {
+ const error = new TdError(`${this.base} No element was provided.`);
+ error.code = 6;
+ throw error;
+ }
+
+ /**
+ * Throws if providing an array for the events to subscribe method doesn't have
+ * the same number of callbacks. E.g., subscribe([1,2], [1])
+ */
+ subscribeMismatch() {
+ const error = new TdError(
+ `${this.base} The subscribed events does not match the number of callbacks`
+ );
+ error.code = 7;
+ throw error;
+ }
+
+ /**
+ * Throws if the configuration has conflicting rules e.g. minDate is after maxDate
+ */
+ conflictingConfiguration(message?: string) {
+ const error = new TdError(
+ `${this.base} A configuration value conflicts with another rule. ${message}`
+ );
+ error.code = 8;
+ throw error;
+ }
+
+ /**
+ * customDateFormat errors
+ */
+ customDateFormatError(message?: string) {
+ const error = new TdError(`${this.base} Custom Date Format: ${message}`);
+ error.code = 9;
+ throw error;
+ }
+
+ /**
+ * Logs a warning if a date option value is provided as a string, instead of
+ * a date/datetime object.
+ */
+ dateString() {
+ console.warn(
+ `${this.base} Using a string for date options is not recommended unless you specify an ISO string or use the customDateFormat plugin.`
+ );
+ }
+
+ deprecatedWarning(message: string, remediation?: string) {
+ console.warn(
+ `${this.base} Warning ${message} is deprecated and will be removed in a future version. ${remediation}`
+ );
+ }
+
+ throwError(message) {
+ const error = new TdError(`${this.base} ${message}`);
+ error.code = 9;
+ throw error;
+ }
+
+ //#endregion
+
+ //#region used with notify.error
+
+ /**
+ * Used with an Error Event type if the user selects a date that
+ * fails restriction validation.
+ */
+ failedToSetInvalidDate = 'Failed to set invalid date';
+
+ /**
+ * Used with an Error Event type when a user changes the value of the
+ * input field directly, and does not provide a valid date.
+ */
+ failedToParseInput = 'Failed parse input field';
+
+ //#endregion
+}
diff --git a/src/js/utilities/event-emitter.ts b/src/js/utilities/event-emitter.ts
new file mode 100644
index 000000000..ce074dab4
--- /dev/null
+++ b/src/js/utilities/event-emitter.ts
@@ -0,0 +1,45 @@
+import { DateTime, Unit } from '../datetime';
+import ActionTypes from './action-types';
+import { BaseEvent } from './event-types';
+
+export type ViewUpdateValues = Unit | 'decade' | 'clock' | 'calendar' | 'all';
+
+class EventEmitter {
+ private subscribers: ((value?: T) => void)[] = [];
+
+ subscribe(callback: (value: T) => void) {
+ this.subscribers.push(callback);
+ return this.unsubscribe.bind(this, this.subscribers.length - 1);
+ }
+
+ unsubscribe(index: number) {
+ this.subscribers.splice(index, 1);
+ }
+
+ emit(value?: T) {
+ this.subscribers.forEach((callback) => {
+ callback(value);
+ });
+ }
+
+ destroy() {
+ this.subscribers = null;
+ this.subscribers = [];
+ }
+}
+
+export class EventEmitters {
+ triggerEvent = new EventEmitter();
+ viewUpdate = new EventEmitter();
+ updateDisplay = new EventEmitter();
+ action = new EventEmitter<{ e: any; action?: ActionTypes }>(); //eslint-disable-line @typescript-eslint/no-explicit-any
+ updateViewDate = new EventEmitter();
+
+ destroy() {
+ this.triggerEvent.destroy();
+ this.viewUpdate.destroy();
+ this.updateDisplay.destroy();
+ this.action.destroy();
+ this.updateViewDate.destroy();
+ }
+}
diff --git a/src/js/utilities/event-types.ts b/src/js/utilities/event-types.ts
new file mode 100644
index 000000000..b32f553e0
--- /dev/null
+++ b/src/js/utilities/event-types.ts
@@ -0,0 +1,56 @@
+import { DateTime } from '../datetime';
+import ViewMode from './view-mode';
+
+interface BaseEvent {
+ type: string;
+ viewMode?: keyof ViewMode;
+}
+
+interface ParseErrorEvent extends BaseEvent {
+ reason: string;
+ value: unknown;
+ format: string;
+}
+
+/**
+ * Triggers when setValue fails because of validation rules etc.
+ * @event FailEvent
+ */
+interface FailEvent extends BaseEvent {
+ reason: string;
+ date: DateTime;
+ oldDate: DateTime;
+}
+
+/**
+ * Triggers when the picker is hidden.
+ */
+interface HideEvent extends BaseEvent {
+ date: DateTime;
+}
+
+/**
+ * Triggers when a change is successful.
+ */
+interface ChangeEvent extends BaseEvent {
+ date: DateTime | undefined;
+ oldDate: DateTime;
+ isClear: boolean;
+ isValid: boolean;
+}
+
+/**
+ * Triggers when the view is changed for instance from month to year.
+ */
+interface ViewUpdateEvent extends BaseEvent {
+ viewDate: DateTime;
+}
+
+export {
+ BaseEvent,
+ FailEvent,
+ HideEvent,
+ ChangeEvent,
+ ViewUpdateEvent,
+ ParseErrorEvent,
+};
diff --git a/src/js/utilities/namespace.ts b/src/js/utilities/namespace.ts
new file mode 100644
index 000000000..29b248811
--- /dev/null
+++ b/src/js/utilities/namespace.ts
@@ -0,0 +1,294 @@
+import { ErrorMessages } from './errors';
+// this is not the way I want this to stay but nested classes seemed to blown up once its compiled.
+const NAME = 'tempus-dominus',
+ dataKey = 'td';
+
+/**
+ * Events
+ */
+class Events {
+ key = `.${dataKey}`;
+
+ /**
+ * Change event. Fired when the user selects a date.
+ * See also EventTypes.ChangeEvent
+ */
+ change = `change${this.key}`;
+
+ /**
+ * Emit when the view changes for example from month view to the year view.
+ * See also EventTypes.ViewUpdateEvent
+ */
+ update = `update${this.key}`;
+
+ /**
+ * Emits when a selected date or value from the input field fails to meet the provided validation rules.
+ * See also EventTypes.FailEvent
+ */
+ error = `error${this.key}`;
+
+ /**
+ * Show event
+ * @event Events#show
+ */
+ show = `show${this.key}`;
+
+ /**
+ * Hide event
+ * @event Events#hide
+ */
+ hide = `hide${this.key}`;
+
+ // blur and focus are used in the jQuery provider but are otherwise unused.
+ // keyup/down will be used later for keybinding options
+
+ blur = `blur${this.key}`;
+ focus = `focus${this.key}`;
+ keyup = `keyup${this.key}`;
+ keydown = `keydown${this.key}`;
+}
+
+class Css {
+ /**
+ * The outer element for the widget.
+ */
+ widget = `${NAME}-widget`;
+
+ /**
+ * Hold the previous, next and switcher divs
+ */
+ calendarHeader = 'calendar-header';
+
+ /**
+ * The element for the action to change the calendar view. E.g. month -> year.
+ */
+ switch = 'picker-switch';
+
+ /**
+ * The elements for all the toolbar options
+ */
+ toolbar = 'toolbar';
+
+ /**
+ * Disables the hover and rounding affect.
+ */
+ noHighlight = 'no-highlight';
+
+ /**
+ * Applied to the widget element when the side by side option is in use.
+ */
+ sideBySide = 'timepicker-sbs';
+
+ /**
+ * The element for the action to change the calendar view, e.g. August -> July
+ */
+ previous = 'previous';
+
+ /**
+ * The element for the action to change the calendar view, e.g. August -> September
+ */
+ next = 'next';
+
+ /**
+ * Applied to any action that would violate any restriction options. ALso applied
+ * to an input field if the disabled function is called.
+ */
+ disabled = 'disabled';
+
+ /**
+ * Applied to any date that is less than requested view,
+ * e.g. the last day of the previous month.
+ */
+ old = 'old';
+
+ /**
+ * Applied to any date that is greater than of requested view,
+ * e.g. the last day of the previous month.
+ */
+ new = 'new';
+
+ /**
+ * Applied to any date that is currently selected.
+ */
+ active = 'active';
+
+ //#region date element
+
+ /**
+ * The outer element for the calendar view.
+ */
+ dateContainer = 'date-container';
+
+ /**
+ * The outer element for the decades view.
+ */
+ decadesContainer = `${this.dateContainer}-decades`;
+
+ /**
+ * Applied to elements within the decade container, e.g. 2020, 2030
+ */
+ decade = 'decade';
+
+ /**
+ * The outer element for the years view.
+ */
+ yearsContainer = `${this.dateContainer}-years`;
+
+ /**
+ * Applied to elements within the years container, e.g. 2021, 2021
+ */
+ year = 'year';
+
+ /**
+ * The outer element for the month view.
+ */
+ monthsContainer = `${this.dateContainer}-months`;
+
+ /**
+ * Applied to elements within the month container, e.g. January, February
+ */
+ month = 'month';
+
+ /**
+ * The outer element for the calendar view.
+ */
+ daysContainer = `${this.dateContainer}-days`;
+
+ /**
+ * Applied to elements within the day container, e.g. 1, 2..31
+ */
+ day = 'day';
+
+ /**
+ * If display.calendarWeeks is enabled, a column displaying the week of year
+ * is shown. This class is applied to each cell in that column.
+ */
+ calendarWeeks = 'cw';
+
+ /**
+ * Applied to the first row of the calendar view, e.g. Sunday, Monday
+ */
+ dayOfTheWeek = 'dow';
+
+ /**
+ * Applied to the current date on the calendar view.
+ */
+ today = 'today';
+
+ /**
+ * Applied to the locale's weekend dates on the calendar view, e.g. Sunday, Saturday
+ */
+ weekend = 'weekend';
+
+ rangeIn = 'range-in';
+ rangeStart = 'range-start';
+ rangeEnd = 'range-end';
+
+ //#endregion
+
+ //#region time element
+
+ /**
+ * The outer element for all time related elements.
+ */
+ timeContainer = 'time-container';
+
+ /**
+ * Applied the separator columns between time elements, e.g. hour *:* minute *:* second
+ */
+ separator = 'separator';
+
+ /**
+ * The outer element for the clock view.
+ */
+ clockContainer = `${this.timeContainer}-clock`;
+
+ /**
+ * The outer element for the hours selection view.
+ */
+ hourContainer = `${this.timeContainer}-hour`;
+
+ /**
+ * The outer element for the minutes selection view.
+ */
+ minuteContainer = `${this.timeContainer}-minute`;
+
+ /**
+ * The outer element for the seconds selection view.
+ */
+ secondContainer = `${this.timeContainer}-second`;
+
+ /**
+ * Applied to each element in the hours selection view.
+ */
+ hour = 'hour';
+
+ /**
+ * Applied to each element in the minutes selection view.
+ */
+ minute = 'minute';
+
+ /**
+ * Applied to each element in the seconds selection view.
+ */
+ second = 'second';
+
+ /**
+ * Applied AM/PM toggle button.
+ */
+ toggleMeridiem = 'toggleMeridiem';
+
+ //#endregion
+
+ //#region collapse
+
+ /**
+ * Applied the element of the current view mode, e.g. calendar or clock.
+ */
+ show = 'show';
+
+ /**
+ * Applied to the currently showing view mode during a transition
+ * between calendar and clock views
+ */
+ collapsing = 'td-collapsing';
+
+ /**
+ * Applied to the currently hidden view mode.
+ */
+ collapse = 'td-collapse';
+
+ //#endregion
+
+ /**
+ * Applied to the widget when the option display.inline is enabled.
+ */
+ inline = 'inline';
+
+ /**
+ * Applied to the widget when the option display.theme is light.
+ */
+ lightTheme = 'light';
+
+ /**
+ * Applied to the widget when the option display.theme is dark.
+ */
+ darkTheme = 'dark';
+
+ /**
+ * Used for detecting if the system color preference is dark mode
+ */
+ isDarkPreferredQuery = '(prefers-color-scheme: dark)';
+}
+
+export default class Namespace {
+ static NAME = NAME;
+ // noinspection JSUnusedGlobalSymbols
+ static dataKey = dataKey;
+
+ static events = new Events();
+
+ static css = new Css();
+
+ static errorMessages = new ErrorMessages();
+}
diff --git a/src/js/utilities/optionConverter.ts b/src/js/utilities/optionConverter.ts
new file mode 100644
index 000000000..dab1b428e
--- /dev/null
+++ b/src/js/utilities/optionConverter.ts
@@ -0,0 +1,383 @@
+import Namespace from './namespace';
+import { DateTime } from '../datetime';
+import DefaultOptions from './default-options';
+import Options, { FormatLocalization } from './options';
+import { processKey } from './optionProcessor';
+import {
+ convertToDateTime,
+ tryConvertToDateTime,
+ typeCheckDateArray,
+ typeCheckNumberArray,
+} from './typeChecker';
+
+export class OptionConverter {
+ private static ignoreProperties = [
+ 'meta',
+ 'dayViewHeaderFormat',
+ 'container',
+ 'dateForms',
+ 'ordinal',
+ ];
+
+ static deepCopy(input): Options {
+ const o = {};
+
+ Object.keys(input).forEach((key) => {
+ const inputElement = input[key];
+
+ if (inputElement instanceof DateTime) {
+ o[key] = inputElement.clone;
+ return;
+ } else if (inputElement instanceof Date) {
+ o[key] = new Date(inputElement.valueOf());
+ return;
+ }
+
+ o[key] = inputElement;
+ if (
+ typeof inputElement !== 'object' ||
+ inputElement instanceof HTMLElement ||
+ inputElement instanceof Element
+ )
+ return;
+ if (!Array.isArray(inputElement)) {
+ o[key] = OptionConverter.deepCopy(inputElement);
+ }
+ });
+
+ return o;
+ }
+
+ private static isValue = (a) => a != null; // everything except undefined + null
+
+ /**
+ * Finds value out of an object based on a string, period delimited, path
+ * @param paths
+ * @param obj
+ */
+ static objectPath(paths: string, obj) {
+ if (paths.charAt(0) === '.') paths = paths.slice(1);
+ if (!paths) return obj;
+ return paths
+ .split('.')
+ .reduce(
+ (value, key) =>
+ OptionConverter.isValue(value) || OptionConverter.isValue(value[key])
+ ? value[key]
+ : undefined,
+ obj
+ );
+ }
+
+ /**
+ * The spread operator caused sub keys to be missing after merging.
+ * This is to fix that issue by using spread on the child objects first.
+ * Also handles complex options like disabledDates
+ * @param provided An option from new providedOptions
+ * @param copyTo Destination object. This was added to prevent reference copies
+ * @param localization
+ * @param path
+ */
+ static spread(provided, copyTo, localization: FormatLocalization, path = '') {
+ const defaultOptions = OptionConverter.objectPath(path, DefaultOptions);
+
+ const unsupportedOptions = Object.keys(provided).filter(
+ (x) => !Object.keys(defaultOptions).includes(x)
+ );
+
+ if (unsupportedOptions.length > 0) {
+ const flattenedOptions = OptionConverter.getFlattenDefaultOptions();
+
+ const errors = unsupportedOptions.map((x) => {
+ const d = path ? '.' : '';
+ let error = `"${path}${d}${x}" is not a known option.`;
+ const didYouMean = flattenedOptions.find((y) => y.includes(x));
+ if (didYouMean) error += ` Did you mean "${didYouMean}"?`;
+ return error;
+ });
+ Namespace.errorMessages.unexpectedOptions(errors);
+ }
+
+ Object.keys(provided)
+ .filter((key) => key !== '__proto__' && key !== 'constructor')
+ .forEach((key) => {
+ path += `.${key}`;
+ if (path.charAt(0) === '.') path = path.slice(1);
+
+ const defaultOptionValue = defaultOptions[key];
+ const providedType = typeof provided[key];
+ const defaultType = typeof defaultOptionValue;
+ const value = provided[key];
+
+ if (value === undefined || value === null) {
+ copyTo[key] = value;
+ path = path.substring(0, path.lastIndexOf(`.${key}`));
+ return;
+ }
+
+ if (
+ typeof defaultOptionValue === 'object' &&
+ !Array.isArray(provided[key]) &&
+ !(
+ defaultOptionValue instanceof Date ||
+ OptionConverter.ignoreProperties.includes(key)
+ )
+ ) {
+ OptionConverter.spread(
+ provided[key],
+ copyTo[key],
+ localization,
+ path
+ );
+ } else {
+ copyTo[key] = OptionConverter.processKey(
+ key,
+ value,
+ providedType,
+ defaultType,
+ path,
+ localization
+ );
+ }
+
+ path = path.substring(0, path.lastIndexOf(`.${key}`));
+ });
+ }
+
+ static processKey(
+ key: string,
+ value: any, //eslint-disable-line @typescript-eslint/no-explicit-any
+ providedType: string,
+ defaultType: string,
+ path: string,
+ localization: FormatLocalization
+ ) {
+ return processKey({
+ key,
+ value,
+ providedType,
+ defaultType,
+ path,
+ localization,
+ });
+ }
+
+ static _mergeOptions(providedOptions: Options, mergeTo: Options): Options {
+ const newConfig = OptionConverter.deepCopy(mergeTo);
+ //see if the options specify a locale
+ const localization =
+ mergeTo.localization?.locale !== 'default'
+ ? mergeTo.localization
+ : providedOptions?.localization || DefaultOptions.localization;
+
+ OptionConverter.spread(providedOptions, newConfig, localization, '');
+
+ return newConfig;
+ }
+
+ static _dataToOptions(element, options: Options): Options {
+ const eData = JSON.parse(JSON.stringify(element.dataset));
+
+ if (eData?.tdTargetInput) delete eData.tdTargetInput;
+ if (eData?.tdTargetToggle) delete eData.tdTargetToggle;
+
+ if (!eData || Object.keys(eData).length === 0) return options;
+ const dataOptions = {} as Options;
+
+ // because dataset returns camelCase including the 'td' key the option
+ // key won't align
+ const objectToNormalized = (object) => {
+ const lowered = {};
+ Object.keys(object).forEach((x) => {
+ lowered[x.toLowerCase()] = x;
+ });
+
+ return lowered;
+ };
+
+ const normalizeObject = this.normalizeObject(objectToNormalized);
+ const optionsLower = objectToNormalized(options);
+
+ Object.keys(eData)
+ .filter((x) => x.startsWith(Namespace.dataKey))
+ .map((x) => x.substring(2))
+ .forEach((key) => {
+ let keyOption = optionsLower[key.toLowerCase()];
+
+ // dataset merges dashes to camelCase... yay
+ // i.e. key = display_components_seconds
+ if (key.includes('_')) {
+ // [display, components, seconds]
+ const split = key.split('_');
+ // display
+ keyOption = optionsLower[split[0].toLowerCase()];
+ if (
+ keyOption !== undefined &&
+ options[keyOption].constructor === Object
+ ) {
+ dataOptions[keyOption] = normalizeObject(
+ split,
+ 1,
+ options[keyOption],
+ eData[`td${key}`]
+ );
+ }
+ }
+ // or key = multipleDate
+ else if (keyOption !== undefined) {
+ dataOptions[keyOption] = eData[`td${key}`];
+ }
+ });
+
+ return this._mergeOptions(dataOptions, options);
+ }
+
+ //todo clean this up
+ private static normalizeObject(objectToNormalized: (object) => object) {
+ const normalizeObject = (
+ split: string[],
+ index: number,
+ optionSubgroup: unknown,
+ value: unknown
+ ) => {
+ // first round = display { ... }
+ const normalizedOptions = objectToNormalized(optionSubgroup);
+
+ const keyOption = normalizedOptions[split[index].toLowerCase()];
+ const internalObject = {};
+
+ if (keyOption === undefined) return internalObject;
+
+ // if this is another object, continue down the rabbit hole
+ if (optionSubgroup[keyOption]?.constructor === Object) {
+ index++;
+ internalObject[keyOption] = normalizeObject(
+ split,
+ index,
+ optionSubgroup[keyOption],
+ value
+ );
+ } else {
+ internalObject[keyOption] = value;
+ }
+ return internalObject;
+ };
+ return normalizeObject;
+ }
+
+ /**
+ * Attempts to prove `d` is a DateTime or Date or can be converted into one.
+ * @param d If a string will attempt creating a date from it.
+ * @param localization object containing locale and format settings. Only used with the custom formats
+ * @private
+ */
+ static _dateTypeCheck(
+ d: any, //eslint-disable-line @typescript-eslint/no-explicit-any
+ localization: FormatLocalization
+ ): DateTime | null {
+ return tryConvertToDateTime(d, localization);
+ }
+
+ /**
+ * Type checks that `value` is an array of Date or DateTime
+ * @param optionName Provides text to error messages e.g. disabledDates
+ * @param value Option value
+ * @param providedType Used to provide text to error messages
+ * @param localization
+ */
+ static _typeCheckDateArray(
+ optionName: string,
+ value,
+ providedType: string,
+ localization: FormatLocalization
+ ) {
+ return typeCheckDateArray(optionName, value, providedType, localization);
+ }
+
+ /**
+ * Type checks that `value` is an array of numbers
+ * @param optionName Provides text to error messages e.g. disabledDates
+ * @param value Option value
+ * @param providedType Used to provide text to error messages
+ */
+ static _typeCheckNumberArray(
+ optionName: string,
+ value,
+ providedType: string
+ ) {
+ return typeCheckNumberArray(optionName, value, providedType);
+ }
+
+ /**
+ * Attempts to convert `d` to a DateTime object
+ * @param d value to convert
+ * @param optionName Provides text to error messages e.g. disabledDates
+ * @param localization object containing locale and format settings. Only used with the custom formats
+ */
+ static dateConversion(
+ d: any, //eslint-disable-line @typescript-eslint/no-explicit-any
+ optionName: string,
+ localization: FormatLocalization
+ ): DateTime {
+ return convertToDateTime(d, optionName, localization);
+ }
+
+ private static _flattenDefaults: string[];
+
+ private static getFlattenDefaultOptions(): string[] {
+ if (this._flattenDefaults) return this._flattenDefaults;
+ const deepKeys = (t, pre = []) => {
+ if (Array.isArray(t)) return [];
+ if (Object(t) === t) {
+ return Object.entries(t).flatMap(([k, v]) => deepKeys(v, [...pre, k]));
+ } else {
+ return pre.join('.');
+ }
+ };
+
+ this._flattenDefaults = deepKeys(DefaultOptions);
+
+ return this._flattenDefaults;
+ }
+
+ /**
+ * Some options conflict like min/max date. Verify that these kinds of options
+ * are set correctly.
+ * @param config
+ */
+ static _validateConflicts(config: Options) {
+ if (
+ config.display.sideBySide &&
+ (!config.display.components.clock ||
+ !(
+ config.display.components.hours ||
+ config.display.components.minutes ||
+ config.display.components.seconds
+ ))
+ ) {
+ Namespace.errorMessages.conflictingConfiguration(
+ 'Cannot use side by side mode without the clock components'
+ );
+ }
+
+ if (config.restrictions.minDate && config.restrictions.maxDate) {
+ if (config.restrictions.minDate.isAfter(config.restrictions.maxDate)) {
+ Namespace.errorMessages.conflictingConfiguration(
+ 'minDate is after maxDate'
+ );
+ }
+
+ if (config.restrictions.maxDate.isBefore(config.restrictions.minDate)) {
+ Namespace.errorMessages.conflictingConfiguration(
+ 'maxDate is before minDate'
+ );
+ }
+ }
+
+ if (config.multipleDates && config.dateRange) {
+ Namespace.errorMessages.conflictingConfiguration(
+ 'Cannot uss option "multipleDates" with "dateRange"'
+ );
+ }
+ }
+}
diff --git a/src/js/utilities/optionProcessor.ts b/src/js/utilities/optionProcessor.ts
new file mode 100644
index 000000000..3d1e4d259
--- /dev/null
+++ b/src/js/utilities/optionProcessor.ts
@@ -0,0 +1,184 @@
+import Namespace from './namespace';
+import type { FormatLocalization } from './options';
+import {
+ convertToDateTime,
+ typeCheckNumberArray,
+ typeCheckDateArray,
+} from './typeChecker';
+
+interface OptionProcessorFunctionArguments {
+ key: string;
+ value: any; //eslint-disable-line @typescript-eslint/no-explicit-any
+ providedType: string;
+ defaultType: string;
+ path: string;
+ localization: FormatLocalization;
+}
+
+type OptionProcessorFunction = (
+ this: void,
+ args: OptionProcessorFunctionArguments
+) => any; //eslint-disable-line @typescript-eslint/no-explicit-any
+
+function mandatoryDate(key: string): OptionProcessorFunction {
+ return ({ value, localization }) => {
+ const dateTime = convertToDateTime(value, key, localization);
+ if (dateTime !== undefined) {
+ dateTime.setLocalization(localization);
+ return dateTime;
+ }
+ };
+}
+
+function optionalDate(key: string): OptionProcessorFunction {
+ const mandatory = mandatoryDate(key);
+ return (args) => {
+ if (args.value === undefined) {
+ return args.value;
+ }
+ return mandatory(args);
+ };
+}
+
+function numbersInRange(
+ key: string,
+ lower: number,
+ upper: number
+): OptionProcessorFunction {
+ return ({ value, providedType }) => {
+ if (value === undefined) {
+ return [];
+ }
+ typeCheckNumberArray(key, value, providedType);
+ if ((value as number[]).some((x) => x < lower || x > upper))
+ Namespace.errorMessages.numbersOutOfRange(key, lower, upper);
+ return value;
+ };
+}
+
+function validHourRange(key: string): OptionProcessorFunction {
+ return numbersInRange(key, 0, 23);
+}
+
+function validDateArray(key: string): OptionProcessorFunction {
+ return ({ value, providedType, localization }) => {
+ if (value === undefined) {
+ return [];
+ }
+ typeCheckDateArray(key, value, providedType, localization);
+ return value;
+ };
+}
+
+function validKeyOption(keyOptions: string[]): OptionProcessorFunction {
+ return ({ value, path }) => {
+ if (!keyOptions.includes(value))
+ Namespace.errorMessages.unexpectedOptionValue(
+ path.substring(1),
+ value,
+ keyOptions
+ );
+ return value;
+ };
+}
+
+const optionProcessors: { [key: string]: OptionProcessorFunction } =
+ Object.freeze({
+ defaultDate: mandatoryDate('defaultDate'),
+ viewDate: mandatoryDate('viewDate'),
+ minDate: optionalDate('restrictions.minDate'),
+ maxDate: optionalDate('restrictions.maxDate'),
+ disabledHours: validHourRange('restrictions.disabledHours'),
+ enabledHours: validHourRange('restrictions.enabledHours'),
+ disabledDates: validDateArray('restrictions.disabledDates'),
+ enabledDates: validDateArray('restrictions.enabledDates'),
+ daysOfWeekDisabled: numbersInRange('restrictions.daysOfWeekDisabled', 0, 6),
+ disabledTimeIntervals: ({ key, value, providedType, localization }) => {
+ if (value === undefined) {
+ return [];
+ }
+ if (!Array.isArray(value)) {
+ Namespace.errorMessages.typeMismatch(
+ key,
+ providedType,
+ 'array of { from: DateTime|Date, to: DateTime|Date }'
+ );
+ }
+ const valueObject = value as { from: any; to: any }[]; //eslint-disable-line @typescript-eslint/no-explicit-any
+ for (let i = 0; i < valueObject.length; i++) {
+ Object.keys(valueObject[i]).forEach((vk) => {
+ const subOptionName = `${key}[${i}].${vk}`;
+ const d = valueObject[i][vk];
+ const dateTime = convertToDateTime(d, subOptionName, localization);
+ dateTime.setLocalization(localization);
+ valueObject[i][vk] = dateTime;
+ });
+ }
+ return valueObject;
+ },
+ toolbarPlacement: validKeyOption(['top', 'bottom', 'default']),
+ type: validKeyOption(['icons', 'sprites']),
+ viewMode: validKeyOption([
+ 'clock',
+ 'calendar',
+ 'months',
+ 'years',
+ 'decades',
+ ]),
+ theme: validKeyOption(['light', 'dark', 'auto']),
+ placement: validKeyOption(['top', 'bottom']),
+ meta: ({ value }) => value,
+ dayViewHeaderFormat: ({ value }) => value,
+ container: ({ value, path }) => {
+ if (
+ value &&
+ !(
+ value instanceof HTMLElement ||
+ value instanceof Element ||
+ value?.appendChild
+ )
+ ) {
+ Namespace.errorMessages.typeMismatch(
+ path.substring(1),
+ typeof value,
+ 'HTMLElement'
+ );
+ }
+ return value;
+ },
+ useTwentyfourHour: ({ value, path, providedType, defaultType }) => {
+ Namespace.errorMessages.deprecatedWarning(
+ 'useTwentyfourHour',
+ 'Please use "options.localization.hourCycle" instead'
+ );
+ if (value === undefined || providedType === 'boolean') return value;
+ Namespace.errorMessages.typeMismatch(path, providedType, defaultType);
+ },
+ hourCycle: validKeyOption(['h11', 'h12', 'h23', 'h24']),
+ });
+
+const defaultProcessor: OptionProcessorFunction = ({
+ value,
+ defaultType,
+ providedType,
+ path,
+}) => {
+ switch (defaultType) {
+ case 'boolean':
+ return value === 'true' || value === true;
+ case 'number':
+ return +value;
+ case 'string':
+ return value.toString();
+ case 'object':
+ return {};
+ case 'function':
+ return value;
+ default:
+ Namespace.errorMessages.typeMismatch(path, providedType, defaultType);
+ }
+};
+
+export function processKey(this: void, args: OptionProcessorFunctionArguments) {
+ return (optionProcessors[args.key] || defaultProcessor)(args);
+}
diff --git a/src/js/utilities/options.ts b/src/js/utilities/options.ts
new file mode 100644
index 000000000..c8bf774cd
--- /dev/null
+++ b/src/js/utilities/options.ts
@@ -0,0 +1,114 @@
+import { DateTime, DateTimeFormatOptions } from '../datetime';
+import ViewMode from './view-mode';
+
+export default interface Options {
+ allowInputToggle?: boolean;
+ container?: HTMLElement;
+ dateRange?: boolean;
+ debug?: boolean;
+ defaultDate?: DateTime;
+ display?: {
+ keyboardNavigation?: boolean;
+ toolbarPlacement?: 'top' | 'bottom';
+ components?: {
+ calendar?: boolean;
+ date?: boolean;
+ month?: boolean;
+ year?: boolean;
+ decades?: boolean;
+ clock?: boolean;
+ hours?: boolean;
+ minutes?: boolean;
+ seconds?: boolean;
+ useTwentyfourHour?: boolean;
+ };
+ buttons?: { today?: boolean; close?: boolean; clear?: boolean };
+ calendarWeeks?: boolean;
+ icons?: {
+ clear?: string;
+ close?: string;
+ date?: string;
+ down?: string;
+ next?: string;
+ previous?: string;
+ time?: string;
+ today?: string;
+ type?: 'icons' | 'sprites';
+ up?: string;
+ };
+ viewMode?: keyof ViewMode;
+ sideBySide?: boolean;
+ inline?: boolean;
+ keepOpen?: boolean;
+ theme?: 'light' | 'dark' | 'auto';
+ placement?: 'top' | 'bottom';
+ };
+ keepInvalid?: boolean;
+ localization?: Localization;
+ meta?: Record;
+ multipleDates?: boolean;
+ multipleDatesSeparator?: string;
+ promptTimeOnDateChange?: boolean;
+ promptTimeOnDateChangeTransitionDelay?: number;
+ restrictions?: {
+ minDate?: DateTime;
+ maxDate?: DateTime;
+ enabledDates?: DateTime[];
+ disabledDates?: DateTime[];
+ enabledHours?: number[];
+ disabledHours?: number[];
+ disabledTimeIntervals?: { from: DateTime; to: DateTime }[];
+ daysOfWeekDisabled?: number[];
+ };
+ stepping?: number;
+ useCurrent?: boolean;
+ viewDate?: DateTime;
+}
+
+export interface FormatLocalization {
+ dateFormats?: {
+ L?: string;
+ LL?: string;
+ LLL?: string;
+ LLLL?: string;
+ LT?: string;
+ LTS?: string;
+ };
+ format?: string;
+ hourCycle?: Intl.LocaleHourCycleKey;
+ locale?: string;
+ ordinal?: (n: number) => any; //eslint-disable-line @typescript-eslint/no-explicit-any
+}
+
+export interface Localization extends FormatLocalization {
+ clear?: string;
+ close?: string;
+ dayViewHeaderFormat?: DateTimeFormatOptions;
+ decrementHour?: string;
+ decrementMinute?: string;
+ decrementSecond?: string;
+ incrementHour?: string;
+ incrementMinute?: string;
+ incrementSecond?: string;
+ maxWeekdayLength?: number;
+ nextCentury?: string;
+ nextDecade?: string;
+ nextMonth?: string;
+ nextYear?: string;
+ pickHour?: string;
+ pickMinute?: string;
+ pickSecond?: string;
+ previousCentury?: string;
+ previousDecade?: string;
+ previousMonth?: string;
+ previousYear?: string;
+ selectDate?: string;
+ selectDecade?: string;
+ selectMonth?: string;
+ selectTime?: string;
+ selectYear?: string;
+ startOfTheWeek?: number;
+ today?: string;
+ toggleMeridiem?: string;
+ toggleAriaLabel?: string;
+}
diff --git a/src/js/utilities/optionsStore.ts b/src/js/utilities/optionsStore.ts
new file mode 100644
index 000000000..67e925377
--- /dev/null
+++ b/src/js/utilities/optionsStore.ts
@@ -0,0 +1,48 @@
+import { DateTime } from '../datetime';
+import CalendarModes from './calendar-modes';
+import ViewMode from './view-mode';
+import Options from './options';
+
+export class OptionsStore {
+ options: Options;
+ element: HTMLElement;
+ toggle: HTMLElement;
+ input: HTMLInputElement;
+ unset: boolean;
+ private _currentCalendarViewMode = 0;
+
+ get currentCalendarViewMode() {
+ return this._currentCalendarViewMode;
+ }
+
+ set currentCalendarViewMode(value) {
+ this._currentCalendarViewMode = value;
+ this.currentView = CalendarModes[value].name;
+ }
+
+ _viewDate = new DateTime();
+
+ get viewDate() {
+ return this._viewDate;
+ }
+
+ set viewDate(v) {
+ this._viewDate = v;
+ if (this.options) this.options.viewDate = v;
+ }
+
+ /**
+ * When switching back to the calendar from the clock,
+ * this sets currentView to the correct calendar view.
+ */
+ refreshCurrentView() {
+ this.currentView = CalendarModes[this.currentCalendarViewMode].name;
+ }
+
+ minimumCalendarViewMode = 0;
+ currentView: keyof ViewMode = 'calendar';
+
+ get isTwelveHour() {
+ return ['h12', 'h11'].includes(this.options.localization.hourCycle);
+ }
+}
diff --git a/src/js/utilities/service-locator.ts b/src/js/utilities/service-locator.ts
new file mode 100644
index 000000000..d53490726
--- /dev/null
+++ b/src/js/utilities/service-locator.ts
@@ -0,0 +1,19 @@
+//eslint-disable-next-line @typescript-eslint/no-explicit-any
+export declare type Constructable = new (...args: any[]) => T;
+
+class ServiceLocator {
+ private cache: Map, unknown | symbol> = new Map();
+
+ locate(identifier: Constructable): T {
+ const service = this.cache.get(identifier);
+ if (service) return service as T;
+ const value = new identifier();
+ this.cache.set(identifier, value);
+ return value;
+ }
+}
+export const setupServiceLocator = () => {
+ serviceLocator = new ServiceLocator();
+};
+
+export let serviceLocator: ServiceLocator;
diff --git a/src/js/utilities/typeChecker.ts b/src/js/utilities/typeChecker.ts
new file mode 100644
index 000000000..8678710a5
--- /dev/null
+++ b/src/js/utilities/typeChecker.ts
@@ -0,0 +1,108 @@
+import Namespace from './namespace';
+import { DateTime } from '../datetime';
+import { FormatLocalization } from './options';
+import DefaultFormatLocalization from './default-format-localization';
+
+/**
+ * Attempts to prove `d` is a DateTime or Date or can be converted into one.
+ * @param d If a string will attempt creating a date from it.
+ * @param localization object containing locale and format settings. Only used with the custom formats
+ * @private
+ */
+export function tryConvertToDateTime(
+ this: void,
+ d: DateTime | Date | string,
+ localization: FormatLocalization
+): DateTime | null {
+ if (!d) return null;
+ if (d.constructor.name === DateTime.name) return d as DateTime;
+ if (d.constructor.name === Date.name) {
+ return DateTime.convert(d as Date);
+ }
+ if (typeof d === typeof '') {
+ const dateTime = DateTime.fromString(d as unknown as string, localization);
+ if (JSON.stringify(dateTime) === 'null') {
+ return null;
+ }
+ return dateTime;
+ }
+ return null;
+}
+
+/**
+ * Attempts to convert `d` to a DateTime object
+ * @param d value to convert
+ * @param optionName Provides text to error messages e.g. disabledDates
+ * @param localization object containing locale and format settings. Only used with the custom formats
+ */
+export function convertToDateTime(
+ this: void,
+ d: DateTime | Date | string,
+ optionName: string,
+ localization: FormatLocalization
+): DateTime {
+ if (typeof d === typeof '' && optionName !== 'input') {
+ Namespace.errorMessages.dateString();
+ }
+
+ const converted = tryConvertToDateTime(d, localization);
+
+ if (!converted) {
+ Namespace.errorMessages.failedToParseDate(
+ optionName,
+ d,
+ optionName === 'input'
+ );
+ }
+ return converted;
+}
+
+/**
+ * Type checks that `value` is an array of Date or DateTime
+ * @param optionName Provides text to error messages e.g. disabledDates
+ * @param value Option value
+ * @param providedType Used to provide text to error messages
+ * @param localization
+ */
+export function typeCheckDateArray(
+ this: void,
+ optionName: string,
+ value: any, //eslint-disable-line @typescript-eslint/no-explicit-any
+ providedType: string,
+ localization: FormatLocalization = DefaultFormatLocalization
+) {
+ if (!Array.isArray(value)) {
+ Namespace.errorMessages.typeMismatch(
+ optionName,
+ providedType,
+ 'array of DateTime or Date'
+ );
+ }
+ for (let i = 0; i < value.length; i++) {
+ const d = value[i];
+ const dateTime = convertToDateTime(d, optionName, localization);
+ dateTime.setLocalization(localization);
+ value[i] = dateTime;
+ }
+}
+
+/**
+ * Type checks that `value` is an array of numbers
+ * @param optionName Provides text to error messages e.g. disabledDates
+ * @param value Option value
+ * @param providedType Used to provide text to error messages
+ */
+export function typeCheckNumberArray(
+ this: void,
+ optionName: string,
+ value: any, //eslint-disable-line @typescript-eslint/no-explicit-any
+ providedType: string
+) {
+ if (!Array.isArray(value) || value.some((x) => typeof x !== typeof 0)) {
+ Namespace.errorMessages.typeMismatch(
+ optionName,
+ providedType,
+ 'array of numbers'
+ );
+ }
+}
diff --git a/src/js/utilities/view-mode.ts b/src/js/utilities/view-mode.ts
new file mode 100644
index 000000000..98090362f
--- /dev/null
+++ b/src/js/utilities/view-mode.ts
@@ -0,0 +1,9 @@
+type ViewMode = {
+ clock;
+ calendar;
+ months;
+ years;
+ decades;
+};
+
+export default ViewMode;
diff --git a/src/js/validation.ts b/src/js/validation.ts
new file mode 100644
index 000000000..7e3720fbc
--- /dev/null
+++ b/src/js/validation.ts
@@ -0,0 +1,223 @@
+import { DateTime, Unit } from './datetime';
+import { serviceLocator } from './utilities/service-locator';
+import { OptionsStore } from './utilities/optionsStore';
+
+/**
+ * Main class for date validation rules based on the options provided.
+ */
+export default class Validation {
+ private optionsStore: OptionsStore;
+
+ constructor() {
+ this.optionsStore = serviceLocator.locate(OptionsStore);
+ }
+
+ /**
+ * Checks to see if the target date is valid based on the rules provided in the options.
+ * Granularity can be provided to check portions of the date instead of the whole.
+ * @param targetDate
+ * @param granularity
+ */
+ isValid(targetDate: DateTime, granularity?: Unit): boolean {
+ if (!this._enabledDisabledDatesIsValid(granularity, targetDate))
+ return false;
+
+ if (
+ granularity !== Unit.month &&
+ granularity !== Unit.year &&
+ this.optionsStore.options.restrictions.daysOfWeekDisabled?.length > 0 &&
+ this.optionsStore.options.restrictions.daysOfWeekDisabled.indexOf(
+ targetDate.weekDay
+ ) !== -1
+ )
+ return false;
+
+ if (!this._minMaxIsValid(granularity, targetDate)) return false;
+
+ if (
+ granularity === Unit.hours ||
+ granularity === Unit.minutes ||
+ granularity === Unit.seconds
+ ) {
+ if (!this._enabledDisabledHoursIsValid(targetDate)) return false;
+
+ if (
+ this.optionsStore.options.restrictions.disabledTimeIntervals?.filter(
+ (internal) => targetDate.isBetween(internal.from, internal.to)
+ ).length !== 0
+ )
+ return false;
+ }
+
+ return true;
+ }
+
+ private _enabledDisabledDatesIsValid(
+ granularity: Unit,
+ targetDate: DateTime
+ ): boolean {
+ if (granularity !== Unit.date) return true;
+
+ if (
+ this.optionsStore.options.restrictions.disabledDates.length > 0 &&
+ this._isInDisabledDates(targetDate)
+ ) {
+ return false;
+ }
+
+ // noinspection RedundantIfStatementJS
+ if (
+ this.optionsStore.options.restrictions.enabledDates.length > 0 &&
+ !this._isInEnabledDates(targetDate)
+ ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks to see if the disabledDates option is in use and returns true (meaning invalid)
+ * if the `testDate` is with in the array. Granularity is by date.
+ * @param testDate
+ * @private
+ */
+ private _isInDisabledDates(testDate: DateTime) {
+ if (
+ !this.optionsStore.options.restrictions.disabledDates ||
+ this.optionsStore.options.restrictions.disabledDates.length === 0
+ )
+ return false;
+
+ return !!this.optionsStore.options.restrictions.disabledDates.find((x) =>
+ x.isSame(testDate, Unit.date)
+ );
+ }
+
+ /**
+ * Checks to see if the enabledDates option is in use and returns true (meaning valid)
+ * if the `testDate` is with in the array. Granularity is by date.
+ * @param testDate
+ * @private
+ */
+ private _isInEnabledDates(testDate: DateTime) {
+ if (
+ !this.optionsStore.options.restrictions.enabledDates ||
+ this.optionsStore.options.restrictions.enabledDates.length === 0
+ )
+ return true;
+
+ return !!this.optionsStore.options.restrictions.enabledDates.find((x) =>
+ x.isSame(testDate, Unit.date)
+ );
+ }
+
+ private _minMaxIsValid(granularity: Unit, targetDate: DateTime) {
+ if (
+ this.optionsStore.options.restrictions.minDate &&
+ targetDate.isBefore(
+ this.optionsStore.options.restrictions.minDate,
+ granularity
+ )
+ ) {
+ return false;
+ }
+
+ // noinspection RedundantIfStatementJS
+ if (
+ this.optionsStore.options.restrictions.maxDate &&
+ targetDate.isAfter(
+ this.optionsStore.options.restrictions.maxDate,
+ granularity
+ )
+ ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private _enabledDisabledHoursIsValid(targetDate: DateTime) {
+ if (
+ this.optionsStore.options.restrictions.disabledHours.length > 0 &&
+ this._isInDisabledHours(targetDate)
+ ) {
+ return false;
+ }
+
+ // noinspection RedundantIfStatementJS
+ if (
+ this.optionsStore.options.restrictions.enabledHours.length > 0 &&
+ !this._isInEnabledHours(targetDate)
+ ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks to see if the disabledHours option is in use and returns true (meaning invalid)
+ * if the `testDate` is with in the array. Granularity is by hours.
+ * @param testDate
+ * @private
+ */
+ private _isInDisabledHours(testDate: DateTime) {
+ if (
+ !this.optionsStore.options.restrictions.disabledHours ||
+ this.optionsStore.options.restrictions.disabledHours.length === 0
+ )
+ return false;
+
+ const formattedDate = testDate.hours;
+ return this.optionsStore.options.restrictions.disabledHours.includes(
+ formattedDate
+ );
+ }
+
+ /**
+ * Checks to see if the enabledHours option is in use and returns true (meaning valid)
+ * if the `testDate` is with in the array. Granularity is by hours.
+ * @param testDate
+ * @private
+ */
+ private _isInEnabledHours(testDate: DateTime) {
+ if (
+ !this.optionsStore.options.restrictions.enabledHours ||
+ this.optionsStore.options.restrictions.enabledHours.length === 0
+ )
+ return true;
+
+ const formattedDate = testDate.hours;
+ return this.optionsStore.options.restrictions.enabledHours.includes(
+ formattedDate
+ );
+ }
+
+ dateRangeIsValid(dates: DateTime[], index: number, target: DateTime) {
+ // if we're not using the option, then return valid
+ if (!this.optionsStore.options.dateRange) return true;
+
+ // if we've only selected 0..1 dates, and we're not setting the end date
+ // then return valid. We only want to validate the range if both are selected,
+ // because the other validation on the target has already occurred.
+ if (dates.length !== 2 && index !== 1) return true;
+
+ // initialize start date
+ const start = dates[0].clone;
+ // check if start date is not the same as target date
+ if (start.isSame(target, Unit.date)) return true;
+
+ // add one day to start; start has already been validated
+ start.manipulate(1, Unit.date);
+
+ // check each date in the range to make sure it's valid
+ while (!start.isSame(target, Unit.date)) {
+ const valid = this.isValid(start, Unit.date);
+ if (!valid) return false;
+ start.manipulate(1, Unit.date);
+ }
+
+ return true;
+ }
+}
diff --git a/src/less/bootstrap-datetimepicker-build.less b/src/less/bootstrap-datetimepicker-build.less
deleted file mode 100644
index 7f5288332..000000000
--- a/src/less/bootstrap-datetimepicker-build.less
+++ /dev/null
@@ -1,5 +0,0 @@
-// Import boostrap variables including default color palette and fonts
-@import "http://github.com/bootstrap/variables.less";
-
-// Import datepicker component
-@import "http://github.com/bootstrap-datetimepicker.less";
diff --git a/src/less/bootstrap-datetimepicker.less b/src/less/bootstrap-datetimepicker.less
deleted file mode 100755
index 519a72f9c..000000000
--- a/src/less/bootstrap-datetimepicker.less
+++ /dev/null
@@ -1,246 +0,0 @@
-/*!
- * Datetimepicker for Bootstrap v3
- * https://github.com/Eonasdan/bootstrap-datetimepicker/
- * Copyright 2012 Stefan Petre
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- */
-.bootstrap-datetimepicker-widget
-{
- top: 0;
- left: 0;
- width: 250px;
- padding: 4px;
- margin-top: 1px;
- z-index: 99999;
- border-radius: 4px;
-
- .btn {
- padding:6px;
- }
-
- &:before
- {
- content: '';
- display: inline-block;
- border-left: 7px solid transparent;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-bottom-color: rgba(0,0,0,.2);
- position: absolute;
- top: -7px;
- left: 6px;
- }
-
- &:after
- {
- content: '';
- display: inline-block;
- border-left: 6px solid transparent;
- border-right: 6px solid transparent;
- border-bottom: 6px solid white;
- position: absolute;
- top: -6px;
- left: 7px;
- }
-
- &.pull-right
- {
- &:before
- {
- left: auto;
- right: 6px;
- }
-
- &:after
- {
- left: auto;
- right: 7px;
- }
- }
-
- >ul
- {
- list-style-type: none;
- margin: 0;
- }
-
- .timepicker-hour, .timepicker-minute, .timepicker-second
- {
- width: 100%;
- font-weight: bold;
- font-size: 1.2em;
- }
-
- table[data-hour-format="12"] .separator
- {
- width: 4px;
- padding: 0;
- margin: 0;
- }
-
- .datepicker > div
- {
- display: none;
- }
-
- .picker-switch
- {
- text-align: center;
- }
-
- table
- {
- width: 100%;
- margin: 0;
- }
-
- td,
- th
- {
- text-align: center;
- width: 20px;
- height: 20px;
- border-radius: 4px;
- }
-
- td
- {
- &.day:hover,
- &.hour:hover,
- &.minute:hover,
- &.second:hover
- {
- background: @gray-lighter;
- cursor: pointer;
- }
-
- &.old,
- &.new
- {
- color: @gray-light;
- }
-
- &.active,
- &.active:hover
- {
- background-color: @btn-primary-bg;
- color: #fff;
- text-shadow: 0 -1px 0 rgba(0,0,0,.25);
- }
-
- &.disabled,
- &.disabled:hover
- {
- background: none;
- color: @gray-light;
- cursor: not-allowed;
- }
-
- span
- {
- display: block;
- width: 47px;
- height: 54px;
- line-height: 54px;
- float: left;
- margin: 2px;
- cursor: pointer;
- border-radius: 4px;
-
- &:hover
- {
- background: @gray-lighter;
- }
-
- &.active
- {
- background-color: @btn-primary-bg;
- color: #fff;
- text-shadow: 0 -1px 0 rgba(0,0,0,.25);
- }
-
- &.old
- {
- color: @gray-light;
- }
-
- &.disabled,
- &.disabled:hover
- {
- background: none;
- color: @gray-light;
- cursor: not-allowed;
- }
- }
- }
-
- th
- {
- &.switch
- {
- width: 145px;
- }
-
- &.next,
- &.prev
- {
- font-size: @font-size-base * 1.5;
- }
-
- &.disabled,
- &.disabled:hover
- {
- background: none;
- color: @gray-light;
- cursor: not-allowed;
- }
- }
-
- thead tr:first-child th
- {
- cursor: pointer;
-
- &:hover
- {
- background: @gray-lighter;
- }
- }
- /*.dow {
- border-top: 1px solid #ddd !important;
- }*/
-}
-
-.input-group
-{
- &.date
- {
- .input-group-addon span
- {
- display: block;
- cursor: pointer;
- width: 16px;
- height: 16px;
- }
- }
-}
-
-.bootstrap-datetimepicker-widget.left-oriented
-{
- &:before
- {
- left: auto;
- right: 6px;
- }
-
- &:after
- {
- left: auto;
- right: 7px;
- }
-}
-.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody > tr > td
-{
- padding: 0px !important;
-}
diff --git a/src/nuget/TempusDominus.nuspec b/src/nuget/TempusDominus.nuspec
new file mode 100644
index 000000000..6d70a2e88
--- /dev/null
+++ b/src/nuget/TempusDominus.nuspec
@@ -0,0 +1,33 @@
+
+
+
+ TempusDominus
+ 6.10.1
+ Tempus Dominus
+ Eonasdan
+ Eonasdan
+ Tempus Dominus css and javascript
+ https://github.com/Eonasdan/tempus-dominus
+ false
+ Powerful and robust date and time picker
+ README.md
+ https://getdatepicker.com/6/change-log.html
+ date time picker datetimepicker datepicker
+ td.png
+ https://github.com/Eonasdan/tempus-dominus/blob/master/LICENSE
+ Copyright 2013-2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/nuget/TempusDominus.scss.nuspec b/src/nuget/TempusDominus.scss.nuspec
new file mode 100644
index 000000000..cb1063e1a
--- /dev/null
+++ b/src/nuget/TempusDominus.scss.nuspec
@@ -0,0 +1,33 @@
+
+
+
+ TempusDominus.scss
+ 6.10.1
+ Tempus Dominus
+ Eonasdan
+ Eonasdan
+ Tempus Dominus sass and javascript
+ https://github.com/Eonasdan/tempus-dominus
+ false
+ Powerful and robust date and time picker
+ README.md
+ https://getdatepicker.com/6/change-log.html
+ date time picker datetimepicker datepicker
+ td.png
+ https://github.com/Eonasdan/tempus-dominus/blob/master/LICENSE
+ Copyright 2013-2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/nuget/td.png b/src/nuget/td.png
new file mode 100644
index 000000000..49403269b
Binary files /dev/null and b/src/nuget/td.png differ
diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss
new file mode 100644
index 000000000..d70f00c05
--- /dev/null
+++ b/src/scss/_variables.scss
@@ -0,0 +1,75 @@
+@use 'sass:color';
+
+$td-light: #fff !default;
+$td-widget-background: $td-light !default;
+$td-font-color: #000 !default;
+$td-timepicker-font-size: 1.2em !default;
+$td-active-bg: #0d6efd !default;
+$td-range-bg: color.scale($td-active-bg, $lightness: -40%) !default;
+$td-active-color: $td-light !default;
+$td-active-border-color: $td-light !default;
+$td-border-radius: 999px !default;
+$td-btn-hover-bg: #e9ecef !default;
+$td-disabled-color: #6c757d !default;
+$td-alternate-color: rgba(0, 0, 0, 0.38) !default;
+$td-secondary-border-color: #ccc !default;
+$td-secondary-border-color-rgba: rgba(0, 0, 0, 0.2) !default;
+$td-primary-border-color: $td-light !default;
+$td-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25) !default;
+$td-dow-color: rgba(0, 0, 0, 0.5) !default;
+
+$td-dark: #1b1b1b !default;
+$td-dark-widget-background: $td-dark !default;
+$td-dark-font-color: #e3e3e3 !default;
+$td-dark-active-bg: #4db2ff !default;
+$td-dark-range-bg: color.scale($td-dark-active-bg, $lightness: -40%) !default;
+$td-dark-active-color: #fff !default;
+$td-dark-active-border-color: $td-dark !default;
+$td-dark-btn-hover-bg: rgb(35, 38, 39) !default;
+$td-dark-disabled-color: #6c757d !default;
+$td-dark-alternate-color: rgba(232, 230, 227, 0.38) !default;
+$td-dark-secondary-border-color: #ccc !default;
+$td-dark-secondary-border-color-rgba: rgba(232, 230, 227, 0.2) !default;
+$td-dark-primary-border-color: $td-dark !default;
+$td-dark-text-shadow: 0 -1px 0 rgba(232, 230, 227, 0.25) !default;
+$td-dark-dow-color: rgba(232, 230, 227, 0.5) !default;
+
+$td-widget-z-index: 9999 !default;
+
+:root {
+ --td-light: #{$td-light};
+ --td-widget-background: #{$td-widget-background};
+ --td-font-color: #{$td-font-color};
+ --td-timepicker-font-size: #{$td-timepicker-font-size};
+ --td-active-bg: #{$td-active-bg};
+ --td-range-bg: #{$td-range-bg};
+ --td-active-color: #{$td-active-color};
+ --td-active-border-color: #{$td-active-border-color};
+ --td-border-radius: #{$td-border-radius};
+ --td-btn-hover-bg: #{$td-btn-hover-bg};
+ --td-disabled-color: #{$td-disabled-color};
+ --td-alternate-color: #{$td-alternate-color};
+ --td-secondary-border-color: #{$td-secondary-border-color};
+ --td-secondary-border-color-rgba: #{$td-secondary-border-color-rgba};
+ --td-primary-border-color: #{$td-primary-border-color};
+ --td-text-shadow: #{$td-text-shadow};
+ --td-dow-color: #{$td-dow-color};
+
+ --td-dark: #{$td-dark};
+ --td-dark-widget-background: #{$td-dark-widget-background};
+ --td-dark-font-color: #{$td-dark-font-color};
+ --td-dark-active-bg: #{$td-dark-active-bg};
+ --td-dark-range-bg: #{$td-dark-range-bg};
+ --td-dark-active-color: #{$td-dark-active-color};
+ --td-dark-active-border-color: #{$td-dark-active-border-color};
+ --td-dark-btn-hover-bg: #{$td-dark-btn-hover-bg};
+ --td-dark-disabled-color: #{$td-dark-disabled-color};
+ --td-dark-alternate-color: #{$td-dark-alternate-color};
+ --td-dark-secondary-border-color: #{$td-dark-secondary-border-color};
+ --td-dark-secondary-border-color-rgba: #{$td-dark-secondary-border-color-rgba};
+ --td-dark-primary-border-color: #{$td-dark-primary-border-color};
+ --td-dark-text-shadow: #{$td-dark-text-shadow};
+ --td-dark-dow-color: #{$td-dark-dow-color};
+
+ --td-widget-z-index: #{$td-widget-z-index};
+}
diff --git a/src/scss/tempus-dominus.scss b/src/scss/tempus-dominus.scss
new file mode 100644
index 000000000..32bfd2968
--- /dev/null
+++ b/src/scss/tempus-dominus.scss
@@ -0,0 +1,491 @@
+@import 'http://github.com/variables';
+
+.visually-hidden {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
+}
+
+.tempus-dominus-widget {
+ list-style: none;
+ padding: 4px;
+ width: 19rem;
+ border-radius: 4px;
+ display: none;
+ z-index: var(--td-widget-z-index);
+ box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14),
+ 0 1px 10px 0 rgba(0, 0, 0, 0.12);
+
+ :focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ }
+
+ &.calendarWeeks {
+ width: 21rem;
+
+ & .date-container-days {
+ grid-auto-columns: 12.5%;
+ grid-template-areas: 'a a a a a a a a';
+ }
+ }
+
+ [data-action] {
+ cursor: pointer;
+
+ &::after {
+ @extend .visually-hidden;
+ content: attr(title);
+ }
+
+ &.disabled,
+ &.disabled:hover {
+ background: none;
+ cursor: not-allowed;
+ }
+ }
+
+ //popper
+ .arrow {
+ display: none;
+ }
+
+ //end popper
+
+ &.show {
+ display: block;
+ &.date-container {
+ min-height: 315px;
+ }
+
+ &.time-container {
+ min-height: 217px;
+ }
+ }
+
+ .td-collapse {
+ &:not(.show) {
+ display: none;
+ }
+ }
+
+ .td-collapsing {
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+ }
+
+ &.timepicker-sbs {
+ @media (min-width: 576px) {
+ width: 38em;
+ }
+
+ @media (min-width: 768px) {
+ width: 38em;
+ }
+
+ @media (min-width: 992px) {
+ width: 38em;
+ }
+
+ .td-row {
+ display: flex;
+
+ .td-half {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ }
+ }
+
+ div[data-action]:active {
+ box-shadow: none;
+ }
+
+ .timepicker-hour,
+ .timepicker-minute,
+ .timepicker-second {
+ width: 54px;
+ font-weight: bold;
+ font-size: $td-timepicker-font-size;
+ margin: 0;
+ }
+
+ button[data-action] {
+ padding: 6px;
+ }
+
+ .toggleMeridiem {
+ text-align: center;
+ height: 38px;
+ }
+
+ .calendar-header {
+ display: grid;
+ grid-template-areas: 'a a a';
+ margin-bottom: 10px;
+ font-weight: bold;
+
+ & .next {
+ text-align: right;
+ padding-right: 10px;
+ }
+
+ & .previous {
+ text-align: left;
+ padding-left: 10px;
+ }
+
+ & .picker-switch {
+ text-align: center;
+ }
+ }
+
+ .toolbar {
+ display: grid;
+ grid-auto-flow: column;
+ grid-auto-rows: 40px;
+
+ & div {
+ border-radius: var(--td-border-radius);
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ display: flex;
+ }
+ }
+
+ .date-container-days {
+ display: grid;
+ grid-template-areas: 'a a a a a a a';
+ grid-auto-rows: 40px;
+ grid-auto-columns: calc(100% / 7);
+
+ .range-in {
+ @extend .active;
+ background-color: var(--td-range-bg) !important;
+ border: none;
+ border-radius: 0 !important;
+ box-shadow: -5px 0 0 var(--td-range-bg), 5px 0 0 var(--td-range-bg);
+ }
+
+ .range-end {
+ @extend .active;
+ border-radius: 0 50px 50px 0 !important;
+ }
+
+ .range-start {
+ @extend .active;
+ border-radius: 50px 0 0 50px !important;
+ }
+
+ & .dow {
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ }
+
+ & .cw {
+ width: 90%;
+ height: 90%;
+ align-items: center;
+ justify-content: center;
+ display: flex;
+ font-size: 0.8em;
+ line-height: 20px;
+ cursor: default;
+ }
+ }
+
+ .date-container-decades,
+ .date-container-years,
+ .date-container-months {
+ display: grid;
+ grid-template-areas: 'a a a';
+ grid-auto-rows: calc(calc(19rem - 2 * 4px) / 7);
+ }
+
+ .time-container-hour,
+ .time-container-minute,
+ .time-container-second {
+ display: grid;
+ grid-template-areas: 'a a a a';
+ grid-auto-rows: calc(calc(19rem - 2 * 4px) / 7);
+ }
+
+ .time-container-clock {
+ display: grid;
+ grid-auto-rows: calc(calc(19rem - 2 * 4px) / 7);
+
+ & .no-highlight {
+ width: 90%;
+ height: 90%;
+ align-items: center;
+ justify-content: center;
+ display: flex;
+ }
+ }
+
+ .date-container-decades,
+ .date-container-years,
+ .date-container-months,
+ .date-container-days,
+ .time-container-clock,
+ .time-container-hour,
+ .time-container-minute,
+ .time-container-second {
+ div:not(.no-highlight) {
+ width: 90%;
+ height: 90%;
+ border-radius: var(--td-border-radius);
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ display: flex;
+
+ &.disabled,
+ &.disabled:hover {
+ background: none;
+ cursor: not-allowed;
+ }
+
+ &.today {
+ position: relative;
+
+ &:before {
+ content: '';
+ display: inline-block;
+ border: solid transparent;
+ border-width: 0 0 7px 7px;
+ position: absolute;
+ bottom: 6px;
+ right: 6px;
+ }
+ }
+ }
+ }
+
+ .time-container {
+ margin-bottom: 0.5rem;
+ }
+
+ button {
+ display: inline-block;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ border-radius: 0.25rem;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
+ border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ }
+
+ &.tempus-dominus-widget-readonly {
+ table td.day,
+ table td.hour,
+ table td.minute,
+ table td.second,
+ table td [data-action='http://github.com/incrementHours'],
+ table td [data-action='http://github.com/incrementMinutes'],
+ table td [data-action='http://github.com/incrementSeconds'],
+ table td [data-action='http://github.com/decrementHours'],
+ table td [data-action='http://github.com/decrementMinutes'],
+ table td [data-action='http://github.com/decrementSeconds'],
+ table td [data-action='http://github.com/showHours'],
+ table td [data-action='http://github.com/showMinutes'],
+ table td [data-action='http://github.com/showSeconds'],
+ table td [data-action='http://github.com/togglePeriod'] {
+ pointer-events: none;
+ cursor: default;
+
+ &:hover {
+ background: none;
+ }
+ }
+ }
+
+ &.light {
+ color: var(--td-font-color);
+ background-color: var(--td-widget-background);
+
+ [data-action] {
+ &.disabled,
+ &.disabled:hover {
+ color: var(--td-disabled-color);
+ }
+ }
+
+ .toolbar {
+ & div {
+ &:hover {
+ background: var(--td-btn-hover-bg);
+ }
+ }
+ }
+
+ .date-container-days {
+ & .dow {
+ color: var(--td-dow-color);
+ }
+
+ & .cw {
+ color: var(--td-alternate-color);
+ }
+ }
+
+ .date-container-decades,
+ .date-container-years,
+ .date-container-months,
+ .date-container-days,
+ .time-container-clock,
+ .time-container-hour,
+ .time-container-minute,
+ .time-container-second {
+ div:not(.no-highlight) {
+ &:hover {
+ background: var(--td-btn-hover-bg);
+ }
+
+ &.active {
+ background-color: var(--td-active-bg);
+ color: var(--td-active-color);
+ text-shadow: var(--td-text-shadow);
+
+ &.old,
+ &.new {
+ color: var(--td-active-color);
+ }
+ }
+
+ &.active.today:before {
+ border-bottom-color: var(--td-active-border-color);
+ }
+
+ &.old,
+ &.new {
+ color: var(--td-alternate-color);
+ }
+
+ &.disabled,
+ &.disabled:hover {
+ color: var(--td-disabled-color);
+ }
+
+ &.today {
+ &:before {
+ border-bottom-color: var(--td-active-bg);
+ border-top-color: var(--td-secondary-border-color-rgba);
+ }
+ }
+ }
+ }
+
+ button {
+ color: var(--td-active-color);
+ background-color: var(--td-active-bg);
+ border-color: var(--td-active-bg);
+ }
+ }
+
+ &.dark {
+ color: var(--td-dark-font-color);
+ background-color: var(--td-dark-widget-background);
+
+ [data-action] {
+ &.disabled,
+ &.disabled:hover {
+ color: var(--td-dark-disabled-color);
+ }
+ }
+
+ .toolbar {
+ & div {
+ &:hover {
+ background: var(--td-dark-btn-hover-bg);
+ }
+ }
+ }
+
+ .date-container-days {
+ & .dow {
+ color: var(--td-dark-dow-color);
+ }
+
+ .range-in {
+ background-color: var(--td-dark-range-bg) !important;
+ box-shadow: -5px 0 0 var(--td-dark-range-bg),
+ 5px 0 0 var(--td-dark-range-bg);
+ }
+
+ & .cw {
+ color: var(--td-dark-alternate-color);
+ }
+ }
+
+ .date-container-decades,
+ .date-container-years,
+ .date-container-months,
+ .date-container-days,
+ .time-container-clock,
+ .time-container-hour,
+ .time-container-minute,
+ .time-container-second {
+ div:not(.no-highlight) {
+ &:hover {
+ background: var(--td-dark-btn-hover-bg);
+ }
+
+ &.active {
+ background-color: var(--td-dark-active-bg);
+ color: var(--td-dark-active-color);
+ text-shadow: var(--td-dark-text-shadow);
+
+ &.old,
+ &.new {
+ color: var(--td-dark-active-color);
+ }
+ }
+
+ &.active.today:before {
+ border-bottom-color: var(--td-dark-active-border-color);
+ }
+
+ &.old,
+ &.new {
+ color: var(--td-dark-alternate-color);
+ }
+
+ &.disabled,
+ &.disabled:hover {
+ color: var(--td-dark-disabled-color);
+ }
+
+ &.today {
+ &:before {
+ border-bottom-color: var(--td-dark-active-bg);
+ border-top-color: var(--td-dark-secondary-border-color-rgba);
+ }
+ }
+ }
+ }
+
+ button {
+ color: var(--td-dark-active-color);
+ background-color: var(--td-dark-active-bg);
+ border-color: var(--td-dark-active-bg);
+ }
+ }
+}
diff --git a/td logo.png b/td logo.png
new file mode 100644
index 000000000..8f8daf110
Binary files /dev/null and b/td logo.png differ
diff --git a/td logo.xcf b/td logo.xcf
new file mode 100644
index 000000000..6094e48a7
Binary files /dev/null and b/td logo.xcf differ
diff --git a/test/actions.test.ts b/test/actions.test.ts
new file mode 100644
index 000000000..61625bc37
--- /dev/null
+++ b/test/actions.test.ts
@@ -0,0 +1,575 @@
+import {
+ createElementWithClasses,
+ loadFixtures,
+ newDate,
+ reset,
+ store,
+} from './test-utilities';
+import { afterAll, beforeAll, beforeEach, expect, test, vi } from 'vitest';
+import Actions from '../src/js/actions';
+import { FixtureValidation } from './fixtures/validation.fixture';
+import { FixtureDates } from './fixtures/dates.fixture';
+import { FixtureDisplay } from './fixtures/display.fixture';
+import Namespace from '../src/js/utilities/namespace';
+import ActionTypes from '../src/js/utilities/action-types';
+import { Unit } from '../src/js/datetime';
+import { EventEmitters } from '../src/js/utilities/event-emitter';
+import Display from '../src/js/display';
+import Dates from '../src/js/dates';
+import Collapse from '../src/js/display/collapse';
+import Validation from '../src/js/validation';
+import { serviceLocator } from '../src/js/utilities/service-locator';
+
+let validation: Validation;
+let emitters: EventEmitters;
+let display: Display;
+let dates: Dates;
+
+let actions: Actions;
+let event;
+let element: HTMLElement;
+
+let isValidSpy;
+vi.spyOn(Collapse, 'hideImmediately').mockImplementation(vi.fn());
+vi.spyOn(Collapse, 'showImmediately').mockImplementation(vi.fn());
+vi.spyOn(Collapse, 'toggle').mockImplementation(vi.fn());
+
+beforeAll(() => {
+ loadFixtures({
+ Validation: FixtureValidation,
+ Dates: FixtureDates,
+ Display: FixtureDisplay,
+ });
+ reset();
+ const ee = serviceLocator.locate(EventEmitters);
+ let callback;
+ ee.action.subscribe = (cb) => {
+ callback = cb;
+ };
+ ee.action.emit = (value) => {
+ callback(value);
+ };
+});
+
+beforeEach(() => {
+ reset();
+ element = document.createElement('div');
+ event = { currentTarget: element };
+ actions = new Actions();
+ store.viewDate = newDate();
+ // @ts-ignore
+ validation = actions.validation;
+ // @ts-ignore
+ emitters = actions._eventEmitters;
+ // @ts-ignore
+ display = actions.display;
+ // @ts-ignore
+ dates = actions.dates;
+ dates.clear();
+
+ isValidSpy = vi.spyOn(validation, 'isValid');
+ isValidSpy.mockImplementation(() => true);
+
+ // @ts-ignore
+ display._widget = document.createElement('div');
+});
+
+afterAll(() => {
+ vi.restoreAllMocks();
+});
+
+test('disabled', () => {
+ element.classList.add(Namespace.css.disabled);
+ actions.do(event);
+ //what else could be done here?
+});
+
+test('next or previous', () => {
+ const viewUpdateSpy = vi.spyOn(emitters.viewUpdate, 'emit');
+ const showModeSpy = vi.spyOn(display, '_showMode');
+
+ expect(store.viewDate).toEqual(newDate());
+
+ //test from dataset
+ element.dataset.action = 'next';
+ actions.do(event);
+ expect(store.viewDate).toEqual(newDate().manipulate(1, Unit.month));
+ expect(viewUpdateSpy).toHaveBeenCalled();
+ expect(showModeSpy).toHaveBeenCalled();
+
+ store.viewDate = newDate();
+ actions.do(event, ActionTypes.previous);
+ expect(store.viewDate).toEqual(newDate().manipulate(-1, Unit.month));
+ expect(viewUpdateSpy).toHaveBeenCalled();
+ expect(showModeSpy).toHaveBeenCalled();
+});
+
+test('changeCalendarView', () => {
+ const updateCalendarHeaderSpy = vi.spyOn(display, '_updateCalendarHeader');
+ const showModeSpy = vi.spyOn(display, '_showMode');
+
+ actions.do(event, ActionTypes.changeCalendarView);
+ expect(updateCalendarHeaderSpy).toHaveBeenCalled();
+ expect(showModeSpy).toHaveBeenCalled();
+});
+
+test('handleSelectCalendarMode', () => {
+ const showModeSpy = vi.spyOn(display, '_showMode');
+ const hideSpy = vi.spyOn(display, 'hide');
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+
+ //test selecting month
+ element.dataset.value = '1';
+ actions.do(event, ActionTypes.selectMonth);
+ expect(store.viewDate.month).toBe(1);
+ expect(hideSpy).toHaveBeenCalled();
+ expect(setValueSpy).toHaveBeenCalled();
+
+ //test selecting year
+ store.currentCalendarViewMode = 1;
+ element.dataset.value = '2022';
+ actions.do(event, ActionTypes.selectYear);
+ expect(store.viewDate.year).toBe(2022);
+ expect(showModeSpy).toHaveBeenCalled();
+});
+
+test('selectDay', () => {
+ const hideSpy = vi.spyOn(display, 'hide');
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+
+ let shouldBe = newDate();
+ shouldBe.date = 21;
+
+ element.dataset.day = `${shouldBe.date}`;
+
+ //test select date without time
+ // @ts-ignore
+ display._hasTime = false;
+ actions.do(event, ActionTypes.selectDay);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(hideSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+
+ //test previous month
+ element.classList.add(Namespace.css.old);
+ actions.do(event, ActionTypes.selectDay);
+ shouldBe.manipulate(-1, Unit.month);
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).toHaveBeenCalled();
+ expect(setValueSpy).toHaveBeenCalled();
+ element.classList.remove(Namespace.css.old);
+ shouldBe.manipulate(1, Unit.month);
+
+ //test next month
+ element.classList.add(Namespace.css.new);
+ actions.do(event, ActionTypes.selectDay);
+ shouldBe.manipulate(1, Unit.month);
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).toHaveBeenCalled();
+ expect(setValueSpy).toHaveBeenCalled();
+ element.classList.remove(Namespace.css.new);
+});
+
+test('selectDay - range', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ const clearSpy = vi.spyOn(dates, 'clear');
+ const one = newDate().manipulate(1, Unit.date);
+ const two = newDate().manipulate(2, Unit.date);
+
+ let shouldBe = newDate();
+ shouldBe.date = 21;
+
+ element.dataset.day = `${shouldBe.date}`;
+ store.options.dateRange = true;
+
+ //test zero length selection
+ actions.do(event, ActionTypes.selectDay);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+
+ dates.clear();
+
+ //test already have two selected
+ dates.setValue(one, 0);
+ dates.setValue(two, 1);
+ expect(dates.picked).toEqual([one, two]);
+ actions.do(event, ActionTypes.selectDay);
+ expect(clearSpy).toHaveBeenCalled();
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+
+ dates.clear();
+
+ //test one selected
+ dates.setValue(one, 0);
+ expect(dates.picked).toEqual([one]);
+ actions.do(event, ActionTypes.selectDay);
+ expect(dates.picked).toEqual([one, shouldBe]);
+ expect(setValueSpy).toHaveBeenCalled();
+
+ dates.clear();
+
+ //test one selected and new date is the same
+ element.dataset.date = `${shouldBe.date}`;
+ dates.setValue(shouldBe, 0);
+ expect(dates.picked).toEqual([shouldBe]);
+ actions.do(event, ActionTypes.selectDay);
+ expect(clearSpy).toHaveBeenCalled();
+ expect(setValueSpy).toHaveBeenCalled();
+
+ element.dataset.date = `${shouldBe.date}`;
+
+ dates.clear();
+
+ //test new selected date is before currently selected
+ const before = shouldBe.clone.manipulate(14, Unit.date);
+ dates.add(before);
+ expect(dates.picked).toEqual([before]);
+ actions.do(event, ActionTypes.selectDay);
+ expect(dates.picked).toEqual([shouldBe, before]);
+});
+
+test('select day - multiple dates', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ const pickedIndexSpy = vi.spyOn(dates, 'pickedIndex');
+ const one = newDate().manipulate(1, Unit.date);
+
+ let shouldBe = newDate();
+ shouldBe.date = 21;
+
+ element.dataset.day = `${shouldBe.date}`;
+ store.options.multipleDates = true;
+
+ //test zero length selection
+ pickedIndexSpy.mockImplementationOnce(() => -1);
+ actions.do(event, ActionTypes.selectDay);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+
+ //test additional date
+ element.dataset.day = `${one.date}`;
+ pickedIndexSpy.mockImplementationOnce(() => -1);
+ actions.do(event, ActionTypes.selectDay);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe, one]);
+ expect(hideSpy).not.toHaveBeenCalled();
+
+ //test removing selected date
+ element.dataset.day = `${one.date}`;
+ pickedIndexSpy.mockImplementationOnce(() => 1);
+ actions.do(event, ActionTypes.selectDay);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+});
+
+test('select hour', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const hideOrClockSpy = vi.spyOn(actions, 'hideOrClock');
+ hideOrClockSpy.mockImplementation(vi.fn());
+
+ let shouldBe = newDate();
+ element.dataset.value = `1`;
+ actions.do(event, ActionTypes.selectHour);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(hideOrClockSpy).toHaveBeenCalled();
+});
+
+test('select minute', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const hideOrClockSpy = vi.spyOn(actions, 'hideOrClock');
+ hideOrClockSpy.mockImplementation(vi.fn());
+
+ let shouldBe = newDate();
+ element.dataset.value = `25`;
+ actions.do(event, ActionTypes.selectMinute);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(hideOrClockSpy).toHaveBeenCalled();
+});
+
+test('select second', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const hideOrClockSpy = vi.spyOn(actions, 'hideOrClock');
+ hideOrClockSpy.mockImplementation(vi.fn());
+
+ let shouldBe = newDate();
+ element.dataset.value = `42`;
+ actions.do(event, ActionTypes.selectSecond);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(hideOrClockSpy).toHaveBeenCalled();
+});
+
+test('increment/decrement hour', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const hideOrClockSpy = vi.spyOn(actions, 'hideOrClock');
+ hideOrClockSpy.mockImplementation(vi.fn());
+
+ let shouldBe = newDate();
+ shouldBe.manipulate(1, Unit.hours);
+
+ actions.do(event, ActionTypes.incrementHours);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+
+ shouldBe.manipulate(-1, Unit.hours);
+ actions.do(event, ActionTypes.decrementHours);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+});
+
+test('increment/decrement minute', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const hideOrClockSpy = vi.spyOn(actions, 'hideOrClock');
+ hideOrClockSpy.mockImplementation(vi.fn());
+
+ let shouldBe = newDate();
+ shouldBe.manipulate(1, Unit.minutes);
+
+ actions.do(event, ActionTypes.incrementMinutes);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+
+ shouldBe.manipulate(-1, Unit.minutes);
+ actions.do(event, ActionTypes.decrementMinutes);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+});
+
+test('increment/decrement second', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const hideOrClockSpy = vi.spyOn(actions, 'hideOrClock');
+ hideOrClockSpy.mockImplementation(vi.fn());
+
+ let shouldBe = newDate();
+ shouldBe.manipulate(1, Unit.seconds);
+
+ actions.do(event, ActionTypes.incrementSeconds);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+
+ shouldBe.manipulate(-1, Unit.seconds);
+ actions.do(event, ActionTypes.decrementSeconds);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+});
+
+test('toggleMeridiem', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const hideOrClockSpy = vi.spyOn(actions, 'hideOrClock');
+ hideOrClockSpy.mockImplementation(vi.fn());
+
+ let shouldBe = newDate();
+ dates.add(shouldBe);
+
+ //from PM to AM
+ actions.do(event, ActionTypes.toggleMeridiem);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe.manipulate(-12, Unit.hours)]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+
+ //from AM to PM
+ actions.do(event, ActionTypes.toggleMeridiem);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([shouldBe.manipulate(12, Unit.hours)]);
+ expect(hideSpy).not.toHaveBeenCalled();
+ expect(isValidSpy).toHaveBeenCalled();
+});
+
+test('togglePicker', () => {
+ const iconTagSpy = vi.spyOn(display, '_iconTag');
+ const updateCalendarHeaderSpy = vi.spyOn(display, '_updateCalendarHeader');
+ const updateSpy = vi.spyOn(display, '_update');
+ const refreshCurrentViewSpy = vi.spyOn(store, 'refreshCurrentView');
+ const viewUpdateSpy = vi.spyOn(emitters.viewUpdate, 'emit');
+
+ const handleShowClockContainersSpy = vi.spyOn(
+ actions,
+ // @ts-ignore
+ 'handleShowClockContainers'
+ );
+ handleShowClockContainersSpy.mockImplementation(vi.fn());
+
+ //toggle date to time
+ element.setAttribute('title', store.options.localization.selectDate);
+ actions.do(event, ActionTypes.togglePicker);
+ expect(iconTagSpy).toHaveBeenCalled();
+ expect(updateCalendarHeaderSpy).toHaveBeenCalled();
+ expect(refreshCurrentViewSpy).toHaveBeenCalled();
+ expect(viewUpdateSpy).toHaveBeenCalled();
+
+ //toggle time to date
+ // @ts-ignore
+ display._hasTime = true;
+ element.setAttribute('title', store.options.localization.selectTime);
+ const dateContainer = document.createElement('div');
+ dateContainer.classList.add(Namespace.css.dateContainer);
+ display.widget.appendChild(dateContainer);
+
+ actions.do(event, ActionTypes.togglePicker);
+ expect(iconTagSpy).toHaveBeenCalled();
+ expect(updateCalendarHeaderSpy).toHaveBeenCalled();
+ expect(refreshCurrentViewSpy).toHaveBeenCalled();
+ expect(viewUpdateSpy).toHaveBeenCalled();
+ expect(handleShowClockContainersSpy).toHaveBeenCalled();
+ expect(updateSpy).toHaveBeenCalled();
+});
+
+test('handleShowClockContainers', () => {
+ const updateSpy = vi.spyOn(display, '_update');
+ store.currentView = 'calendar';
+
+ const timeContainer = createElementWithClasses(
+ 'div',
+ Namespace.css.timeContainer
+ );
+ const clockContainer = createElementWithClasses(
+ 'div',
+ Namespace.css.clockContainer
+ );
+ const hourContainer = createElementWithClasses(
+ 'div',
+ Namespace.css.hourContainer
+ );
+ const minuteContainer = createElementWithClasses(
+ 'div',
+ Namespace.css.minuteContainer
+ );
+ const secondContainer = createElementWithClasses(
+ 'div',
+ Namespace.css.secondContainer
+ );
+ timeContainer.appendChild(clockContainer);
+ timeContainer.appendChild(hourContainer);
+ timeContainer.appendChild(minuteContainer);
+ timeContainer.appendChild(secondContainer);
+ display.widget.appendChild(timeContainer);
+
+ //test no time
+ // @ts-ignore
+ display._hasTime = false;
+ expect(() => actions.do(event, ActionTypes.showClock)).toThrow(
+ 'TD: Cannot show clock containers when time is disabled.'
+ );
+
+ // @ts-ignore
+ display._hasTime = true;
+
+ //test clock
+ actions.do(event, ActionTypes.showClock);
+ expect(updateSpy).toHaveBeenCalled();
+ expect(clockContainer.style.display).toBe('grid');
+ expect(hourContainer.style.display).toBe('none');
+
+ //test hour
+ actions.do(event, ActionTypes.showHours);
+ expect(updateSpy).toHaveBeenCalled();
+ expect(clockContainer.style.display).toBe('none');
+ expect(hourContainer.style.display).toBe('grid');
+
+ //test minute
+ actions.do(event, ActionTypes.showMinutes);
+ expect(updateSpy).toHaveBeenCalled();
+ expect(clockContainer.style.display).toBe('none');
+ expect(minuteContainer.style.display).toBe('grid');
+
+ //test seconds
+ actions.do(event, ActionTypes.showSeconds);
+ expect(updateSpy).toHaveBeenCalled();
+ expect(clockContainer.style.display).toBe('none');
+ expect(secondContainer.style.display).toBe('grid');
+});
+
+test('clear', () => {
+ const updateCalendarHeaderSpy = vi.spyOn(display, '_updateCalendarHeader');
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+
+ dates.add(newDate());
+ expect(dates.picked).toEqual([newDate()]);
+
+ actions.do(event, ActionTypes.clear);
+ expect(updateCalendarHeaderSpy).toHaveBeenCalled();
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([]);
+});
+
+test('close', () => {
+ const hideSpy = vi.spyOn(display, 'hide');
+
+ actions.do(event, ActionTypes.close);
+ expect(hideSpy).toHaveBeenCalled();
+});
+
+test('today', () => {
+ const setValueSpy = vi.spyOn(dates, 'setValue');
+ const viewUpdateSpy = vi.spyOn(emitters.updateViewDate, 'emit');
+
+ expect(dates.picked).toEqual([]);
+ actions.do(event, ActionTypes.today);
+ expect(setValueSpy).toHaveBeenCalled();
+ expect(viewUpdateSpy).toHaveBeenCalled();
+});
+
+test('hideOrClock', () => {
+ const hideSpy = vi.spyOn(display, 'hide');
+ // @ts-ignore
+ const method = actions.hideOrClock.bind(actions);
+ const doSpy = vi.spyOn(actions, 'do');
+ doSpy.mockImplementation(vi.fn());
+
+ //test showClock;
+ method(event);
+ expect(doSpy).toHaveBeenCalled();
+
+ //test should hide
+ // @ts-ignore
+ store.isTwelveHour = false;
+ store.options.display.components.minutes = false;
+ method(event);
+ expect(hideSpy).toHaveBeenCalled();
+});
+
+test('action emitter', () => {
+ const actionSpy = vi.spyOn(emitters.action, 'emit');
+ const doSpy = vi.spyOn(actions, 'do');
+ doSpy.mockImplementation(vi.fn());
+
+ emitters.action.emit({ e: {}, action: ActionTypes.close });
+ expect(actionSpy).toHaveBeenCalled();
+});
diff --git a/test/dates.test.ts b/test/dates.test.ts
new file mode 100644
index 000000000..ca96516a3
--- /dev/null
+++ b/test/dates.test.ts
@@ -0,0 +1,313 @@
+import {
+ loadFixtures,
+ newDate,
+ newDateMinute,
+ newDateStringMinute,
+ reset,
+ secondaryDate,
+ store,
+} from './test-utilities';
+import { afterAll, beforeAll, beforeEach, expect, test, vi } from 'vitest';
+import Dates from '../src/js/dates';
+import { DateTime, Unit } from '../src/js/datetime';
+import { OptionConverter } from '../src/js/utilities/optionConverter';
+import Validation from '../src/js/validation';
+import { FixtureValidation } from './fixtures/validation.fixture';
+import { EventEmitters } from '../src/js/utilities/event-emitter';
+
+let dates: Dates;
+
+let emitters: EventEmitters;
+let validation: Validation;
+const dateConversionSpy = vi.spyOn(OptionConverter, 'dateConversion');
+
+let setValueSpy;
+let parseInputSpy;
+let triggerEventSpy;
+let updateDisplaySpy;
+let formatInputSpy;
+let setValueNullSpy;
+let updateInputSpy;
+let isValidSpy;
+let dateRangeIsValidSpy;
+let updateViewDateSpy;
+
+const setupSpies = () => {
+ // @ts-ignore
+ validation = dates.validation;
+ // @ts-ignore
+ emitters = dates._eventEmitters;
+
+ triggerEventSpy = vi.spyOn(emitters.triggerEvent, 'emit');
+ updateDisplaySpy = vi.spyOn(emitters.updateDisplay, 'emit');
+ updateViewDateSpy = vi.spyOn(emitters.updateViewDate, 'emit');
+
+ isValidSpy = vi.spyOn(validation, 'isValid');
+ dateRangeIsValidSpy = vi.spyOn(validation, 'dateRangeIsValid');
+
+ setValueSpy = vi.spyOn(dates, 'setValue');
+ parseInputSpy = vi.spyOn(dates, 'parseInput');
+ formatInputSpy = vi.spyOn(dates, 'formatInput');
+ // @ts-ignore
+ setValueNullSpy = vi.spyOn(dates, '_setValueNull');
+ updateInputSpy = vi.spyOn(dates, 'updateInput');
+};
+
+beforeAll(() => {
+ loadFixtures({ Validation: FixtureValidation });
+ reset();
+});
+
+beforeEach(() => {
+ reset();
+ dates = new Dates();
+ setupSpies();
+});
+
+afterAll(() => {
+ vi.restoreAllMocks();
+});
+
+test('Picked getter returns array', () => {
+ expect(dates.picked instanceof Array).toBe(true);
+ expect(dates.picked.length).toBe(0);
+
+ dates.add(newDate());
+
+ expect(dates.picked.length).toBe(1);
+ expect(dates.picked).toEqual([newDate()]);
+});
+
+test('lastPicked to return last selected date', () => {
+ expect(dates.lastPickedIndex).toBe(0);
+
+ dates.add(new DateTime());
+ dates.add(newDate());
+
+ expect(dates.lastPicked.valueOf()).toBe(newDate().valueOf());
+ expect(dates.lastPickedIndex).toBe(1);
+});
+
+test('formatInput', () => {
+ expect(dates.formatInput(undefined)).toBe('');
+
+ expect(dates.formatInput(newDate())).toBe(newDateStringMinute);
+});
+
+test('parseInput', () => {
+ //by default this function just calls the option converter which does way
+ //too much for this unit test, so we'll just verify that the function can be called
+ //with undefined and string. Probably should just hide this from the coverage.
+
+ //test undefined
+ dateConversionSpy.mockImplementationOnce(() => null);
+ expect(dates.parseInput(undefined)).toBe(null);
+ expect(dateConversionSpy).toHaveBeenCalledTimes(1);
+
+ dateConversionSpy.mockImplementationOnce(() => newDateMinute());
+ expect(dates.parseInput(newDateStringMinute).toISOString()).toBe(
+ newDateMinute().toISOString()
+ );
+ expect(dateConversionSpy).toHaveBeenCalledTimes(2);
+});
+
+test('setFromInput', () => {
+ dates.add(newDate());
+ expect(dates.picked).toEqual([newDate()]);
+
+ //test clearing the selected dates
+
+ setValueSpy.mockImplementationOnce(() => dates.clear());
+ dates.setFromInput(undefined);
+ expect(dates.picked).toEqual([]);
+ expect(setValueSpy).toHaveBeenCalledTimes(1);
+ dates.clear();
+
+ //test setting date from string
+ setValueSpy.mockImplementationOnce(() => dates.add(newDateMinute()));
+ parseInputSpy.mockImplementationOnce(() => newDateMinute());
+ dates.setFromInput(newDateStringMinute);
+ expect(dates.picked).toEqual([newDateMinute()]);
+ expect(parseInputSpy).toHaveBeenCalledTimes(1);
+ expect(setValueSpy).toHaveBeenCalledTimes(2);
+});
+
+test('isPicked', () => {
+ //test invalid date
+ // @ts-ignore
+ expect(dates.isPicked('foo')).toBe(false);
+
+ //test unselected date
+ expect(dates.isPicked(newDate())).toBe(false);
+
+ //test selected date
+ dates.add(newDate());
+ expect(dates.isPicked(newDate())).toBe(true);
+ dates.clear();
+
+ //test unselected date
+ expect(dates.isPicked(newDate(), Unit.date)).toBe(false);
+
+ //test selected date
+ dates.add(newDate());
+ expect(dates.isPicked(newDate(), Unit.date)).toBe(true);
+});
+
+test('pickedIndex', () => {
+ //test invalid date
+ // @ts-ignore
+ expect(dates.pickedIndex('foo')).toBe(-1);
+
+ //test unselected date
+ expect(dates.pickedIndex(newDate())).toBe(-1);
+
+ //test selected date
+ dates.add(newDate());
+ expect(dates.pickedIndex(newDate())).toBe(+0);
+ dates.clear();
+
+ //test unselected date
+ expect(dates.pickedIndex(newDate(), Unit.date)).toBe(-1);
+
+ //test selected date
+ dates.add(newDate());
+ expect(dates.pickedIndex(newDate(), Unit.date)).toBe(+0);
+});
+
+test('clear', () => {
+ expect(store.unset).toBe(undefined);
+
+ //add a date to confirm clear works
+ dates.add(newDate());
+ expect(dates.picked).toEqual([newDate()]);
+
+ //test clear
+ dates.clear();
+ //change event should fire
+ expect(triggerEventSpy).toHaveBeenCalled();
+ //selected dates should be empty
+ expect(dates.picked).toEqual([]);
+ //updateDisplay should fire
+ expect(updateDisplaySpy).toHaveBeenCalled();
+
+ //reset to test clearing input field
+ dates.add(newDate());
+ expect(dates.picked).toEqual([newDate()]);
+ store.input = document.createElement('input');
+ store.input.value = 'foo';
+ expect(store.input.value).toBe('foo');
+
+ dates.clear();
+ expect(triggerEventSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([]);
+ expect(updateDisplaySpy).toHaveBeenCalled();
+ expect(store.input.value).toBe('');
+});
+
+test('getStartEndYear', () => {
+ expect(Dates.getStartEndYear(100, 2023)).toEqual([2000, 2090, 2020]);
+ expect(Dates.getStartEndYear(10, 2023)).toEqual([2020, 2029, 2023]);
+});
+
+test('updateInput', () => {
+ //test no input
+ dates.updateInput(undefined);
+
+ store.input = document.createElement('input');
+ formatInputSpy.mockImplementation(() => newDateStringMinute);
+
+ //test input
+ dates.updateInput(newDate());
+ expect(store.input.value).toBe('03/14/2023 1:25 PM');
+ expect(formatInputSpy).toHaveBeenCalled();
+
+ //test multipleDates
+ store.options.multipleDates = true;
+ dates.add(newDate());
+ dates.add(newDate());
+
+ dates.updateInput();
+ expect(store.input.value).toBe('03/14/2023 1:25 PM; 03/14/2023 1:25 PM');
+ expect(formatInputSpy).toHaveBeenCalled();
+});
+
+test('setValue', () => {
+ setValueNullSpy.mockImplementation(vi.fn());
+ updateInputSpy.mockImplementation(vi.fn());
+ //test null value and no index
+ store.unset = true;
+ dates.setValue();
+ expect(setValueNullSpy).toHaveBeenCalled();
+
+ //test getting last picked to clear
+ dates.add(newDate());
+ store.unset = false;
+ dates.setValue();
+ dates.clear();
+
+ //test old date is the same
+ dates.add(newDate());
+ store.unset = false;
+ dates.setValue(newDate(), 0);
+ expect(updateInputSpy).toHaveBeenCalled();
+
+ //test valid date with stepping
+ isValidSpy.mockImplementationOnce(() => true);
+ dateRangeIsValidSpy.mockImplementationOnce(() => true);
+
+ store.options.stepping = 5;
+ dates.setValue(newDate());
+ expect(isValidSpy).toHaveBeenCalled();
+ expect(dateRangeIsValidSpy).toHaveBeenCalled();
+ expect(dates.picked).toEqual([newDate().startOf(Unit.minutes)]);
+ expect(updateViewDateSpy).toHaveBeenCalled();
+ expect(triggerEventSpy).toHaveBeenCalled();
+ expect(store.unset).toBe(false);
+ store.options.stepping = 1;
+
+ //test keep invalid
+ store.options.keepInvalid = true;
+ isValidSpy.mockImplementationOnce(() => false);
+ dates.setValue(newDate());
+ expect(dates.picked).toEqual([newDate()]);
+ store.options.keepInvalid = false;
+ expect(updateViewDateSpy).toHaveBeenCalled();
+ expect(triggerEventSpy).toHaveBeenCalled();
+});
+
+test('_setValueNull', () => {
+ // @ts-ignore
+ const method = dates._setValueNull.bind(dates);
+ updateInputSpy.mockImplementation(vi.fn());
+
+ //test clear with no options
+ dates.add(newDate());
+ method();
+ expect(store.unset).toBe(true);
+ expect(dates.picked).toEqual([]);
+ expect(triggerEventSpy).toHaveBeenCalled();
+
+ //test clear with multiple dates and one selection
+ store.options.multipleDates = true;
+ dates.add(newDate());
+ method();
+ expect(store.unset).toBe(true);
+ expect(dates.picked).toEqual([]);
+ expect(triggerEventSpy).toHaveBeenCalled();
+
+ //test clear with multiple dates, two dates but passing isClear
+ dates.add(newDate());
+ dates.add(newDate());
+ method(true);
+ expect(store.unset).toBe(true);
+ expect(dates.picked).toEqual([]);
+ expect(triggerEventSpy).toHaveBeenCalled();
+
+ //test clearing given index
+ dates.add(newDate());
+ dates.add(secondaryDate());
+ method(false, 0);
+ expect(store.unset).toBe(true);
+ expect(dates.picked).toEqual([secondaryDate()]);
+ expect(triggerEventSpy).toHaveBeenCalled();
+});
diff --git a/test/datetime.test.ts b/test/datetime.test.ts
new file mode 100644
index 000000000..71498f2a5
--- /dev/null
+++ b/test/datetime.test.ts
@@ -0,0 +1,678 @@
+/* eslint-disable @typescript-eslint/ban-ts-comment */
+import {
+ defaultLocalization,
+ newDate,
+ newDateStringMinute,
+} from './test-utilities';
+import { expect, test } from 'vitest';
+import {
+ DateTime,
+ getFormatByUnit,
+ guessHourCycle,
+ Unit,
+} from '../src/js/datetime';
+
+test('getFormatByUnit', () => {
+ expect(getFormatByUnit(Unit.date)).toEqual({ dateStyle: 'short' });
+ expect(getFormatByUnit(Unit.month)).toEqual({
+ month: 'numeric',
+ year: 'numeric',
+ });
+ expect(getFormatByUnit(Unit.year)).toEqual({ year: 'numeric' });
+});
+
+test('Can create with string (ctor)', () => {
+ const dt = newDate();
+ expect(dt.month).toBe(2); //minus 1 because javascript 🙄
+ expect(dt.date).toBe(14);
+ expect(dt.year).toBe(2023);
+});
+
+test('Localization is stored', () => {
+ const dt = newDate();
+ expect(dt.localization).toEqual(defaultLocalization());
+ const es = {
+ locale: 'es',
+ dateFormats: {
+ LT: 'H:mm',
+ LTS: 'H:mm:ss',
+ L: 'dd/MM/yyyy',
+ LL: 'd [de] MMMM [de] yyyy',
+ LLL: 'd [de] MMMM [de] yyyy H:mm',
+ LLLL: 'dddd, d [de] MMMM [de] yyyy H:mm',
+ },
+ ordinal: (n) => `${n}º`,
+ format: 'L LT',
+ };
+ dt.setLocalization(es);
+ expect(dt.localization).toEqual(es);
+
+ //check setting just the locale
+ dt.localization = null;
+
+ const fr = defaultLocalization();
+ fr.locale = 'fr';
+ dt.setLocale('fr');
+ expect(dt.localization).toEqual(fr);
+});
+
+test('Can convert from a Date object', () => {
+ const d = new Date(2022, 11, 14);
+ const dt = DateTime.convert(d);
+
+ expect(dt.valueOf()).toBe(d.valueOf());
+});
+
+test('Convert fails with no parameter', () => {
+ expect(() => DateTime.convert(null)).toThrow('A date is required');
+});
+
+test('Can create with string', () => {
+ expect(() => DateTime.fromString('12/31/2022', null)).toThrow(/TD/);
+ const localization = defaultLocalization();
+ localization.format = localization.dateFormats.L;
+ const dt = DateTime.fromString('12/31/2022', localization);
+ expect(dt.month).toBe(12 - 1); //minus 1 because javascript 🙄
+ expect(dt.date).toBe(31);
+ expect(dt.year).toBe(2022);
+});
+
+test('Can create clone', () => {
+ const dt = new DateTime(2022, 11, 14);
+ const d = dt.clone;
+
+ expect(dt.valueOf()).toBe(d.valueOf());
+});
+new Date();
+test('startOf', () => {
+ let dt = new DateTime(2022, 11, 14, 13, 42, 59, 500);
+
+ //12/31/2022 13:42:59:0
+ dt = dt.startOf(Unit.seconds);
+ expect(dt.getMilliseconds()).toBe(0);
+
+ dt = dt.startOf(Unit.minutes);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 14, 13, 42, 0).valueOf());
+
+ dt = dt.startOf(Unit.hours);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 14, 13, 0, 0).valueOf());
+
+ dt = dt.startOf(Unit.date);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 14, 0, 0, 0).valueOf());
+
+ dt = dt.startOf('weekDay');
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 11, 0, 0, 0).valueOf());
+
+ dt = dt.startOf(Unit.month);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 1, 0, 0, 0).valueOf());
+
+ dt = dt.startOf(Unit.year);
+ expect(dt.valueOf()).toBe(new DateTime(2022, 0, 1, 0, 0, 0).valueOf());
+
+ // @ts-ignore
+ expect(() => dt.startOf('foo')).toThrow("Unit 'foo' is not valid");
+
+ //skip the process of the start of the week is the same weekday
+ dt = new DateTime(2022, 11, 25, 0, 0, 0);
+ dt = dt.startOf('weekDay');
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 25, 0, 0, 0).valueOf());
+
+ //check if weekday works when the week doesn't start on Sunday
+ dt = new DateTime(2022, 11, 18, 0, 0, 0);
+ dt = dt.startOf('weekDay', 1);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 12, 0, 0, 0).valueOf());
+});
+
+test('endOf', () => {
+ let dt = new DateTime(2022, 11, 14, 13, 42, 59, 50);
+
+ //12/31/2022 13:42:59:0
+ dt = dt.endOf(Unit.seconds);
+ expect(dt.getMilliseconds()).toBe(999);
+
+ dt = dt.endOf(Unit.minutes);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 14, 13, 42, 59, 999).valueOf());
+
+ dt = dt.endOf(Unit.hours);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 14, 13, 59, 59, 999).valueOf());
+
+ dt = dt.endOf(Unit.date);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 14, 23, 59, 59, 999).valueOf());
+
+ dt = dt.endOf('weekDay');
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 17, 23, 59, 59, 999).valueOf());
+
+ dt = dt.endOf(Unit.month);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 31, 23, 59, 59, 999).valueOf());
+
+ dt = dt.endOf(Unit.year);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 31, 23, 59, 59, 999).valueOf());
+
+ // @ts-ignore
+ expect(() => dt.endOf('foo')).toThrow("Unit 'foo' is not valid");
+
+ //skip the process if the end of the week is the same weekday
+ dt = new DateTime(2022, 11, 17, 0, 0, 0);
+ dt = dt.endOf('weekDay');
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 17, 23, 59, 59, 999).valueOf());
+
+ //check if weekday works when the week doesn't start on Sunday
+ dt = new DateTime(2022, 11, 14, 0, 0, 0);
+ dt = dt.endOf('weekDay', 1);
+ expect(dt.valueOf()).toBe(new Date(2022, 11, 18, 23, 59, 59, 999).valueOf());
+});
+
+test('manipulate throws an error with invalid part', () => {
+ // @ts-ignore
+ expect(() => newDate().manipulate(1, 'foo')).toThrow(
+ "Unit 'foo' is not valid"
+ );
+});
+
+test('Format should return formatted date', () => {
+ const dt = new DateTime(2022, 11, 17, 0, 0, 0);
+
+ expect(dt.format({ dateStyle: 'full' })).toBe('Saturday, December 17, 2022');
+});
+
+test('isBefore', () => {
+ const dt1 = new DateTime(2022, 11, 16, 0, 0, 0);
+ const dt2 = new DateTime(2022, 11, 17, 0, 0, 0);
+
+ expect(dt1.isBefore(dt2)).toBe(true);
+
+ expect(dt1.isBefore(dt2, Unit.date)).toBe(true);
+
+ // @ts-ignore
+ expect(() => dt1.isBefore(dt2, 'foo')).toThrow("Unit 'foo' is not valid");
+
+ //compare date is not valid
+ expect(dt1.isBefore(undefined, Unit.date)).toBe(false);
+});
+
+test('isAfter', () => {
+ const dt1 = new DateTime(2022, 11, 16, 0, 0, 0);
+ const dt2 = new DateTime(2022, 11, 17, 0, 0, 0);
+
+ expect(dt2.isAfter(dt1)).toBe(true);
+
+ expect(dt2.isAfter(dt1, Unit.date)).toBe(true);
+
+ // @ts-ignore
+ expect(() => dt2.isAfter(dt1, 'foo')).toThrow("Unit 'foo' is not valid");
+
+ //compare date is not valid
+ expect(dt1.isAfter(undefined, Unit.date)).toBe(false);
+});
+
+test('isSame', () => {
+ const dt1 = new DateTime(2022, 11, 16, 0, 0, 0);
+ const dt2 = new DateTime(2022, 11, 16, 0, 0, 0);
+
+ expect(dt1.isSame(dt2)).toBe(true);
+
+ expect(dt1.isSame(dt2, Unit.date)).toBe(true);
+
+ //if the compare date is invalid
+ expect(dt1.isSame(undefined, Unit.date)).toBe(false);
+
+ // @ts-ignore
+ expect(() => dt1.isSame(dt2, 'foo')).toThrow("Unit 'foo' is not valid");
+});
+
+//todo this is missing some conditions: https://github.com/moment/moment/blob/master/src/test/moment/is_between.js
+//but it hurts my brain
+test('isBetween', () => {
+ const dt1 = new DateTime(2022, 11, 16, 0, 0, 0);
+ const left = new DateTime(2022, 11, 15, 0, 0, 0);
+ const right = new DateTime(2022, 11, 17, 0, 0, 0);
+
+ expect(dt1.isBetween(left, right)).toBe(true);
+
+ expect(dt1.isBetween(left, right, Unit.date)).toBe(true);
+
+ // @ts-ignore
+ expect(() => dt1.isBetween(left, right, 'foo')).toThrow(
+ "Unit 'foo' is not valid"
+ );
+
+ const dateTime = new DateTime('2016-10-30');
+
+ expect(
+ dateTime.isBetween(dateTime, new DateTime('2016-12-30'), undefined, '()')
+ ).toBe(false);
+ expect(dateTime.isBetween(dateTime, dateTime, undefined, '[]')).toBe(true);
+ expect(
+ dateTime.isBetween(new DateTime('2016-01-01'), dateTime, undefined, '(]')
+ ).toBe(true);
+ expect(
+ dateTime.isBetween(dateTime, new DateTime('2016-12-30'), undefined, '[)')
+ ).toBe(true);
+
+ //compare date is not valid
+ expect(dt1.isBetween(undefined, undefined, Unit.date)).toBe(false);
+
+ //Unit is not valid
+ // @ts-ignore
+ expect(() => dt1.isBetween(dateTime, newDate(), 'foo')).toThrow(
+ "Unit 'foo' is not valid"
+ );
+});
+
+test('Getters/Setters', () => {
+ const dt = new DateTime(2022, 11, 17, 0, 0, 0);
+
+ dt.seconds = 4;
+
+ expect(dt.seconds).toBe(4);
+ expect(dt.secondsFormatted).toBe('04');
+
+ dt.minutes = 4;
+
+ expect(dt.minutes).toBe(4);
+ expect(dt.minutesFormatted).toBe('04');
+
+ dt.hours = 4;
+
+ expect(dt.hours).toBe(4);
+ expect(dt.getHoursFormatted()).toBe('04');
+
+ dt.hours = 14;
+
+ expect(dt.hours).toBe(14);
+ expect(dt.getHoursFormatted('h24')).toBe('14');
+ expect(dt.getHoursFormatted()).toBe('02');
+
+ dt.hours = 0;
+ expect(dt.getHoursFormatted('h11')).toBe('00');
+ expect(dt.getHoursFormatted('h12')).toBe('12');
+ expect(dt.getHoursFormatted('h23')).toBe('00');
+ expect(dt.getHoursFormatted('h24')).toBe('24');
+
+ dt.hours = 23;
+ expect(dt.getHoursFormatted('h11')).toBe('11');
+ expect(dt.getHoursFormatted('h12')).toBe('11');
+ expect(dt.getHoursFormatted('h23')).toBe('23');
+ expect(dt.getHoursFormatted('h24')).toBe('23');
+
+ dt.date = 4;
+
+ expect(dt.date).toBe(4);
+ expect(dt.dateFormatted).toBe('04');
+
+ dt.month = 4;
+
+ expect(dt.month).toBe(4);
+ expect(dt.monthFormatted).toBe('05');
+
+ //test date bubbling. JS doesn't handle a date of May 31st => June 31st but DateTime does.
+ dt.date = 31;
+ dt.month = 5;
+ expect(dt.monthFormatted).toBe('06');
+
+ dt.year = 2023;
+
+ expect(dt.year).toBe(2023);
+
+ expect(dt.week).toBe(26);
+
+ dt.year = 2004;
+
+ expect(dt.weeksInWeekYear()).toBe(53);
+
+ dt.year = 2017;
+
+ expect(dt.weeksInWeekYear()).toBe(52);
+
+ dt.year = 2020;
+
+ expect(dt.weeksInWeekYear()).toBe(53);
+
+ dt.year = 2000;
+ expect(dt.isLeapYear).toBe(true);
+ expect(dt.week).toBe(26);
+
+ dt.year = 2024;
+ expect(dt.isLeapYear).toBe(true);
+
+ dt.year = 2023;
+ expect(dt.isLeapYear).toBe(false);
+
+ dt.year = 2026;
+ expect(dt.weeksInWeekYear()).toBe(53);
+
+ expect(dt.meridiem()).toBe('PM');
+});
+
+test('Guess hour cycle', () => {
+ // @ts-ignore
+ let guess = guessHourCycle();
+ expect(guess).toBe('h12');
+
+ guess = guessHourCycle('en-US');
+ expect(guess).toBe('h12');
+
+ guess = guessHourCycle('en-GB');
+ expect(guess).toBe('h23');
+
+ guess = guessHourCycle('ar-IQ');
+ expect(guess).toBe('h12');
+
+ guess = guessHourCycle('sv-SE');
+ expect(guess).toBe('h23');
+});
+
+test('Get ALl Months', () => {
+ // @ts-ignore
+ const months = newDate().getAllMonths();
+ expect(months).toEqual([
+ 'January',
+ 'February',
+ 'March',
+ 'April',
+ 'May',
+ 'June',
+ 'July',
+ 'August',
+ 'September',
+ 'October',
+ 'November',
+ 'December',
+ ]);
+});
+
+test('replace tokens', () => {
+ const dateTime = newDate();
+
+ // @ts-ignore
+ const replaceTokens = dateTime.replaceTokens;
+
+ expect(replaceTokens('hi LTS', 'LTS')).toBe(
+ `hi ${defaultLocalization().dateFormats.LTS}`
+ );
+
+ expect(replaceTokens('LLLLL', defaultLocalization().dateFormats)).toBe(
+ `dddd, MMMM d, yyyy h:mm TMM/dd/yyyy`
+ );
+});
+
+test('parseTwoDigitYear', () => {
+ const dateTime = newDate();
+ // @ts-ignore
+ let parsed = dateTime.parseTwoDigitYear(70);
+
+ expect(parsed).toBe(1970);
+
+ // @ts-ignore
+ parsed = dateTime.parseTwoDigitYear(23);
+
+ expect(parsed).toBe(2023);
+});
+
+test('meridiemMatch', () => {
+ const dateTime = newDate();
+ // @ts-ignore
+ let match = dateTime.meridiemMatch('AM');
+
+ expect(match).toBe(false);
+
+ // @ts-ignore
+ match = dateTime.meridiemMatch('PM');
+
+ expect(match).toBe(true);
+});
+
+test('expressions', () => {
+ const dateTime = newDate();
+ // @ts-ignore
+ const e = { ...dateTime.expressions };
+ // @ts-ignore
+ const matchWord = dateTime.matchWord;
+ // @ts-ignore
+ const match2 = dateTime.match2;
+ // @ts-ignore
+ const match3 = dateTime.match3;
+ // @ts-ignore
+ const match4 = dateTime.match4;
+ // @ts-ignore
+ const match1to2 = dateTime.match1to2;
+ // @ts-ignore
+ const matchSigned = dateTime.matchSigned;
+
+ const o: any = {};
+
+ //#region meridiem
+ e.t.parser(o, 'AM');
+
+ expect(o.afternoon).toBe(false);
+
+ e.t.parser(o, 'pm');
+
+ expect(o.afternoon).toBe(true);
+
+ e.T.parser(o, 'AM');
+
+ expect(o.afternoon).toBe(false);
+
+ e.T.parser(o, 'pm');
+
+ expect(o.afternoon).toBe(true);
+
+ //#endregion
+
+ expect(e.fff.pattern).toBe(match3);
+
+ e.fff.parser(o, 42);
+
+ expect(o.milliseconds).toBe(42);
+
+ expect(e.s.pattern).toBe(match1to2);
+
+ e.s.parser(o, 5);
+
+ expect(o.seconds).toBe(5);
+
+ expect(e.ss.pattern).toBe(match1to2);
+
+ e.ss.parser(o, 6);
+
+ expect(o.seconds).toBe(6);
+
+ expect(e.m.pattern).toBe(match1to2);
+
+ e.m.parser(o, 7);
+
+ expect(o.minutes).toBe(7);
+
+ expect(e.mm.pattern).toBe(match1to2);
+
+ e.mm.parser(o, 10);
+
+ expect(o.minutes).toBe(10);
+
+ expect(e.h.pattern).toBe(match1to2);
+
+ e.h.parser(o, 11);
+
+ expect(o.hours).toBe(11);
+
+ expect(e.hh.pattern).toBe(match1to2);
+
+ e.hh.parser(o, 12);
+
+ expect(o.hours).toBe(12);
+
+ expect(e.HH.pattern).toBe(match1to2);
+
+ e.HH.parser(o, 13);
+
+ expect(o.hours).toBe(13);
+
+ expect(e.HH.pattern).toBe(match1to2);
+
+ e.HH.parser(o, 14);
+
+ expect(o.hours).toBe(14);
+
+ expect(e.d.pattern).toBe(match1to2);
+
+ e.d.parser(o, 15);
+
+ expect(o.day).toBe(15);
+
+ expect(e.dd.pattern).toBe(match2);
+
+ e.dd.parser(o, 16);
+
+ expect(o.day).toBe(16);
+
+ expect(e.Do.pattern).toBe(matchWord);
+
+ e.Do.parser(o, '1st');
+
+ expect(o.day).toBe(1);
+
+ dateTime.localization.ordinal = undefined;
+
+ e.Do.parser(o, '1st');
+
+ expect(o.day).toBe(1);
+
+ dateTime.localization.ordinal = defaultLocalization().ordinal;
+
+ //#region Months
+
+ expect(e.M.pattern).toBe(match1to2);
+
+ e.M.parser(o, 5);
+
+ expect(o.month).toBe(5);
+
+ expect(e.MM.pattern).toBe(match2);
+
+ e.MM.parser(o, 7);
+
+ expect(o.month).toBe(7);
+
+ expect(e.MMM.pattern).toBe(matchWord);
+
+ e.MMM.parser(o, 'Jan');
+
+ expect(o.month).toBe(1);
+
+ expect(e.MMMM.pattern).toBe(matchWord);
+
+ e.MMMM.parser(o, 'January');
+
+ expect(o.month).toBe(1);
+
+ //#endregion
+
+ //#region Year
+
+ expect(e.y.pattern).toBe(matchSigned);
+
+ e.y.parser(o, 2000);
+
+ expect(o.year).toBe(2000);
+
+ expect(e.yy.pattern).toBe(match2);
+
+ e.yy.parser(o, 20);
+
+ expect(o.year).toBe(2020);
+
+ expect(e.yyyy.pattern).toBe(match4);
+
+ e.yyyy.parser(o, 2023);
+
+ expect(o.year).toBe(2023);
+
+ //#endregion
+});
+
+test('correctHours', () => {
+ const dateTime = newDate();
+
+ // @ts-ignore
+ const correctHours = dateTime.correctHours;
+
+ const o = {
+ afternoon: true,
+ hours: 8,
+ };
+
+ correctHours(o);
+
+ expect(o.hours).toBe(20);
+ expect(o.afternoon).toBe(undefined);
+
+ o.hours = 12;
+ o.afternoon = false;
+
+ correctHours(o);
+
+ expect(o.hours).toBe(0);
+ expect(o.afternoon).toBe(undefined);
+});
+
+test('format', () => {
+ const dateTime = newDate();
+
+ dateTime.localization.hourCycle = 'h11';
+
+ expect(dateTime.format()).toBe(newDateStringMinute);
+
+ expect(dateTime.format('L LT')).toBe(newDateStringMinute);
+
+ dateTime.hours = 10;
+
+ expect(dateTime.format('dddd, MMMM, dd yy h:mm:ss:fff')).toBe(
+ 'Tuesday, March, 14 23 10:25:42:500'
+ );
+
+ expect(dateTime.format('dd-MMM-yyyy')).toBe('14-Mar-2023');
+
+ //test failure if no format
+ expect(() => DateTime.fromString('', undefined)).toThrow(
+ 'TD: Custom Date Format: No format was provided'
+ );
+
+ expect(DateTime.fromString('01-Mar-2023', { format: 'dd-MMM-yyyy' })).toEqual(
+ new DateTime(2023, 3 - 1, 1, 0, 0, 0, 0)
+ );
+
+ //test epoch seconds
+ expect(DateTime.fromString('1678814742', { format: 'X' }).getTime()).toBe(
+ 1678814742000
+ );
+
+ //test epoch millisecond
+ expect(DateTime.fromString('1678814742500', { format: 'x' }).getTime()).toBe(
+ 1678814742500
+ );
+
+ //test invalid input
+ expect(() => DateTime.fromString('--', { format: 'hjik' })).toThrow(
+ 'TD: Custom Date Format: Unable to parse provided input: --, format: hjik'
+ );
+
+ //test no format for defaults
+ const dt2 = newDate();
+ dt2.localization.format = undefined;
+ dt2.localization.hourCycle = undefined;
+ expect(dt2.format()).toBe('03/14/2023, 1:25 PM');
+
+ //test hour cycles
+ const dt3 = newDate();
+ dt3.localization.hourCycle = 'h23';
+ expect(dt3.format('HH')).toBe('13');
+ dt3.localization.hourCycle = 'h11';
+ expect(dt3.format('hh')).toBe('01');
+});
+
+test('isValid', () => {
+ expect(DateTime.isValid('asdf')).toBe(false);
+ expect(DateTime.isValid(undefined)).toBe(false);
+ expect(DateTime.isValid(newDate())).toBe(true);
+});
diff --git a/test/fixtures/dates.fixture.ts b/test/fixtures/dates.fixture.ts
new file mode 100644
index 000000000..6f031558f
--- /dev/null
+++ b/test/fixtures/dates.fixture.ts
@@ -0,0 +1,47 @@
+import { vi } from 'vitest';
+import { DateTime } from '../../src/js/datetime';
+import { EventEmitters } from '../../src/js/utilities/event-emitter';
+import { OptionsStore } from '../../src/js/utilities/optionsStore';
+import Validation from '../../src/js/validation';
+
+export class FixtureDates {
+ _dates: DateTime[] = [];
+ _eventEmitters: EventEmitters;
+ get lastPicked(): DateTime {
+ return this._dates[this.lastPickedIndex];
+ }
+
+ get lastPickedIndex(): number {
+ if (this._dates.length === 0) return 0;
+ return this._dates.length - 1;
+ }
+
+ optionsStore: OptionsStore;
+
+ get picked(): DateTime[] {
+ return this._dates;
+ }
+
+ validation: Validation;
+
+ add(value) {
+ this._dates.push(value);
+ }
+
+ clear() {
+ this._dates = [];
+ }
+
+ formatInput = vi.fn();
+ isPicked = vi.fn();
+ parseInput = vi.fn();
+ pickedIndex = vi.fn();
+ setFromInput = vi.fn();
+
+ setValue(value, index) {
+ if (!value) this._dates.splice(index, 1);
+ else this._dates[index] = value;
+ }
+
+ updateInput = vi.fn();
+}
diff --git a/test/fixtures/display.fixture.ts b/test/fixtures/display.fixture.ts
new file mode 100644
index 000000000..765952469
--- /dev/null
+++ b/test/fixtures/display.fixture.ts
@@ -0,0 +1,23 @@
+import { vi } from 'vitest';
+
+export class FixtureDisplay {
+ _showMode = vi.fn();
+ _updateCalendarHeader = vi.fn();
+ hide = vi.fn();
+ widget = document.createElement('div');
+
+ _update = vi.fn();
+
+ _iconTag() {
+ const iconSpan = document.createElement('span');
+ iconSpan.innerHTML = 'icon';
+ return iconSpan;
+ }
+
+ _hasTime = true;
+ _hasDate = true;
+
+ get _hasDateAndTime(): boolean {
+ return this._hasDate && this._hasTime;
+ }
+}
diff --git a/test/fixtures/eventemitters.fixture.ts b/test/fixtures/eventemitters.fixture.ts
new file mode 100644
index 000000000..2f58ed235
--- /dev/null
+++ b/test/fixtures/eventemitters.fixture.ts
@@ -0,0 +1,18 @@
+import { vi } from 'vitest';
+
+const fakeEmitter = () => ({
+ emit: vi.fn(),
+ subscribe: vi.fn(),
+ unsubscribe: vi.fn(),
+ destroy: vi.fn(),
+});
+
+export class FixtureEventEmitters {
+ triggerEvent = fakeEmitter();
+ viewUpdate = fakeEmitter();
+ updateDisplay = fakeEmitter();
+ action = fakeEmitter();
+ updateViewDate = fakeEmitter();
+
+ destroy = vi.fn();
+}
diff --git a/test/fixtures/optionStore.fixture.ts b/test/fixtures/optionStore.fixture.ts
new file mode 100644
index 000000000..f5b6d17c6
--- /dev/null
+++ b/test/fixtures/optionStore.fixture.ts
@@ -0,0 +1,27 @@
+import { OptionConverter } from '../../src/js/utilities/optionConverter';
+import DefaultOptions from '../../src/js/utilities/default-options';
+import { DateTime } from '../../src/js/datetime';
+import { vi } from 'vitest';
+
+export class FixtureOptionsStore {
+ options = OptionConverter.deepCopy(DefaultOptions);
+ element: HTMLElement;
+ input: HTMLInputElement;
+ unset: boolean;
+ currentCalendarViewMode = 0;
+ viewDate: DateTime;
+ minimumCalendarViewMode = 0;
+ refreshCurrentView = vi.fn();
+
+ isTwelveHour = true;
+
+ reset() {
+ this.options = OptionConverter.deepCopy(DefaultOptions);
+ this.unset = undefined;
+ this.input = undefined;
+ this.element = undefined;
+ this.currentCalendarViewMode = 0;
+ this.minimumCalendarViewMode = 0;
+ this.options.localization.hourCycle = 'h12';
+ }
+}
diff --git a/test/fixtures/serviceLocator.fixture.ts b/test/fixtures/serviceLocator.fixture.ts
new file mode 100644
index 000000000..75ab67d13
--- /dev/null
+++ b/test/fixtures/serviceLocator.fixture.ts
@@ -0,0 +1,23 @@
+import { Constructable } from '../../src/js/utilities/service-locator';
+
+export declare type MockLoad = { [key: string]: Constructable };
+
+export class FixtureServiceLocator {
+ private cache: Map = new Map();
+
+ locate(identifier: Constructable): T {
+ const service = this.cache.get(identifier.name);
+ if (service) return service as T;
+ throw `${identifier.name} Not Mocked`;
+ }
+
+ load(name: string, service: Constructable) {
+ this.cache.set(name, new service());
+ }
+
+ loadEach(toLoad: MockLoad) {
+ Object.entries(toLoad).forEach(([k, v]) => {
+ this.load(k, v);
+ });
+ }
+}
diff --git a/test/fixtures/validation.fixture.ts b/test/fixtures/validation.fixture.ts
new file mode 100644
index 000000000..e6656179f
--- /dev/null
+++ b/test/fixtures/validation.fixture.ts
@@ -0,0 +1,6 @@
+import { vi } from 'vitest';
+
+export class FixtureValidation {
+ isValid = vi.fn();
+ dateRangeIsValid = vi.fn();
+}
diff --git a/test/tempus-dominus.test.ts b/test/tempus-dominus.test.ts
new file mode 100644
index 000000000..c0d997478
--- /dev/null
+++ b/test/tempus-dominus.test.ts
@@ -0,0 +1,43 @@
+import { beforeEach, expect, test } from 'vitest';
+import { TempusDominus } from '../src/js/tempus-dominus';
+
+beforeEach(() => {
+ document.body.innerHTML = `
+`;
+});
+
+test('TD can construct', () => {
+ const element = document.getElementById('datetimepicker1');
+ expect(element).not.toBe(null);
+
+ const td = new TempusDominus(document.getElementById('datetimepicker1'));
+
+ expect(td).not.toBe(null);
+ expect(td instanceof TempusDominus).toBe(true);
+});
diff --git a/test/test-import.ts b/test/test-import.ts
new file mode 100644
index 000000000..7b8494188
--- /dev/null
+++ b/test/test-import.ts
@@ -0,0 +1,12 @@
+import { TempusDominus, version, extend } from '../src/js/tempus-dominus';
+//import { localization } from '../src/locales/ru';
+import * as cdf from '../src/js/plugins/customDateFormat';
+
+extend(cdf, undefined);
+
+const dp: TempusDominus = new TempusDominus(
+ document.getElementById('datetimepicker1'),
+ {
+ //localization: localization,
+ }
+);
diff --git a/test/test-utilities.ts b/test/test-utilities.ts
new file mode 100644
index 000000000..d3f8beeab
--- /dev/null
+++ b/test/test-utilities.ts
@@ -0,0 +1,70 @@
+import { DateTime, Unit } from '../src/js/datetime';
+import { OptionsStore } from '../src/js/utilities/optionsStore';
+import DefaultFormatLocalization from '../src/js/utilities/default-format-localization';
+import { vi } from 'vitest';
+import {
+ FixtureServiceLocator,
+ MockLoad,
+} from './fixtures/serviceLocator.fixture';
+import { FixtureOptionsStore } from './fixtures/optionStore.fixture';
+import { FixtureEventEmitters } from './fixtures/eventemitters.fixture';
+
+const fixtureServiceLocator = new FixtureServiceLocator();
+fixtureServiceLocator.loadEach({
+ OptionsStore: FixtureOptionsStore,
+ EventEmitters: FixtureEventEmitters,
+});
+
+vi.mock('../src/js/utilities/service-locator', () => ({
+ serviceLocator: fixtureServiceLocator,
+}));
+
+/**
+ * March 14th, 2023 1:25:42:500 PM
+ */
+const newDate = () => new DateTime(2023, 3 - 1, 14, 13, 25, 42, 500);
+const vanillaDate = () => new Date(2023, 3 - 1, 14, 13, 25, 42, 500);
+
+/**
+ * July 8th, 2023 3:00 AM
+ */
+const secondaryDate = () => new DateTime(2023, 7 - 1, 8, 3, 0);
+
+const newDateMinute = () => newDate().startOf(Unit.minutes);
+const newDateStringMinute = newDateMinute().format('L LT');
+const newDateStringIso = newDate().toISOString();
+
+let store = fixtureServiceLocator.locate(OptionsStore);
+
+const reset = () => {
+ (store as unknown as FixtureOptionsStore).reset();
+ store.viewDate = newDate();
+};
+
+const loadFixtures = (load: MockLoad) => {
+ fixtureServiceLocator.loadEach(load);
+};
+
+const defaultLocalization = () => ({ ...DefaultFormatLocalization });
+
+const createElementWithClasses = (tagName: string, ...classes) => {
+ const tag = document.createElement(tagName);
+ tag.classList.add(...classes);
+ return tag;
+};
+
+reset();
+
+export {
+ newDate,
+ newDateMinute,
+ newDateStringMinute,
+ newDateStringIso,
+ vanillaDate,
+ secondaryDate,
+ reset,
+ store,
+ defaultLocalization,
+ loadFixtures,
+ createElementWithClasses,
+};
diff --git a/test/utilities/optionProccessor.test.ts b/test/utilities/optionProccessor.test.ts
new file mode 100644
index 000000000..6d2327633
--- /dev/null
+++ b/test/utilities/optionProccessor.test.ts
@@ -0,0 +1,482 @@
+import {
+ newDate,
+ newDateMinute,
+ secondaryDate,
+ defaultLocalization,
+} from '../test-utilities';
+import { expect, test } from 'vitest';
+import { processKey } from '../../src/js/utilities/optionProcessor';
+
+test('defaultProcessor', () => {
+ expect(
+ processKey({
+ key: 'foo',
+ value: true,
+ defaultType: 'boolean',
+ providedType: 'boolean',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toBe(true);
+
+ expect(
+ processKey({
+ key: 'foo',
+ value: '42',
+ defaultType: 'number',
+ providedType: 'number',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toBe(42);
+
+ expect(
+ processKey({
+ key: 'foo',
+ value: 'tacos',
+ defaultType: 'string',
+ providedType: 'string',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toBe('tacos');
+
+ expect(
+ processKey({
+ key: 'foo',
+ value: '',
+ defaultType: 'object',
+ providedType: 'object',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual({});
+
+ const func = () => {};
+
+ expect(
+ processKey({
+ key: 'foo',
+ value: func,
+ defaultType: 'function',
+ providedType: 'function',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toBe(func);
+
+ expect(() =>
+ processKey({
+ key: 'foo',
+ value: '',
+ defaultType: 'taco',
+ providedType: 'taco',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+});
+
+test('mandatoryDate', () => {
+ //invalid date should throw
+ expect(() =>
+ processKey({
+ key: 'defaultDate',
+ value: 42,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //valid date should return
+ expect(
+ processKey({
+ key: 'defaultDate',
+ value: newDateMinute().format(),
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(newDateMinute());
+});
+
+test('optionalDate', () => {
+ //invalid date should throw
+ expect(() =>
+ processKey({
+ key: 'minDate',
+ value: 42,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //valid date should return
+ expect(
+ processKey({
+ key: 'minDate',
+ value: newDateMinute().format(),
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(newDateMinute());
+
+ //valid date should return
+ expect(
+ processKey({
+ key: 'minDate',
+ value: undefined,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(undefined);
+});
+
+test('validHourRange', () => {
+ //invalid value should throw
+ expect(() =>
+ processKey({
+ key: 'disabledHours',
+ value: 42,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //valid should return
+ expect(
+ processKey({
+ key: 'disabledHours',
+ value: [6, 5],
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([6, 5]);
+
+ //valid undefined should return empty
+ expect(
+ processKey({
+ key: 'disabledHours',
+ value: undefined,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([]);
+
+ //invalid range should throw
+ expect(() =>
+ processKey({
+ key: 'disabledHours',
+ value: [42],
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+});
+
+test('validDateArray', () => {
+ //invalid value should throw
+ expect(() =>
+ processKey({
+ key: 'disabledDates',
+ value: 42,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //valid should return
+ expect(
+ processKey({
+ key: 'disabledDates',
+ value: [newDate()],
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([newDate()]);
+
+ //valid undefined should return empty
+ expect(
+ processKey({
+ key: 'disabledDates',
+ value: undefined,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([]);
+
+ //invalid range should throw
+ expect(() =>
+ processKey({
+ key: 'disabledDates',
+ value: [42],
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+});
+
+test('numbersInRange', () => {
+ //invalid value should throw
+ expect(() =>
+ processKey({
+ key: 'daysOfWeekDisabled',
+ value: 42,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //valid should return
+ expect(
+ processKey({
+ key: 'daysOfWeekDisabled',
+ value: [1],
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([1]);
+
+ //valid undefined should return empty
+ expect(
+ processKey({
+ key: 'daysOfWeekDisabled',
+ value: undefined,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([]);
+
+ //invalid range should throw
+ expect(() =>
+ processKey({
+ key: 'daysOfWeekDisabled',
+ value: [42],
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+});
+
+test('disabledTimeIntervals', () => {
+ //invalid value should throw
+ expect(() =>
+ processKey({
+ key: 'disabledTimeIntervals',
+ value: 42,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //valid should return
+ expect(
+ processKey({
+ key: 'disabledTimeIntervals',
+ value: [1],
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([1]);
+
+ //valid undefined should return empty
+ expect(
+ processKey({
+ key: 'disabledTimeIntervals',
+ value: undefined,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual([]);
+
+ //invalid range should throw
+ expect(() =>
+ processKey({
+ key: 'disabledTimeIntervals',
+ value: 'taco',
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //valid undefined should return empty
+ const range = [{ from: newDate(), to: secondaryDate() }];
+ expect(
+ processKey({
+ key: 'disabledTimeIntervals',
+ value: range,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(range);
+});
+
+test('validKeyOption', () => {
+ //invalid value should throw
+ expect(() =>
+ processKey({
+ key: 'toolbarPlacement',
+ value: 42,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ //otherwise return
+ expect(
+ processKey({
+ key: 'toolbarPlacement',
+ value: 'top',
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toBe('top');
+});
+
+test('meta', () => {
+ expect(
+ processKey({
+ key: 'meta',
+ value: 'top',
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toBe('top');
+
+ const o = { foo: 'bar' };
+ expect(
+ processKey({
+ key: 'meta',
+ value: o,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(o);
+});
+
+test('dayViewHeaderFormat', () => {
+ expect(
+ processKey({
+ key: 'dayViewHeaderFormat',
+ value: 'top',
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toBe('top');
+
+ const o = { foo: 'bar' };
+ expect(
+ processKey({
+ key: 'dayViewHeaderFormat',
+ value: o,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(o);
+});
+
+test('container', () => {
+ //not an html element
+ expect(() =>
+ processKey({
+ key: 'container',
+ value: 'top',
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ const element = document.createElement('div');
+ expect(
+ processKey({
+ key: 'container',
+ value: element,
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(element);
+});
+
+test('useTwentyfourHour', () => {
+ //not an html element
+ expect(() =>
+ processKey({
+ key: 'useTwentyfourHour',
+ value: 'top',
+ defaultType: '',
+ providedType: '',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toThrow();
+
+ expect(
+ processKey({
+ key: 'useTwentyfourHour',
+ value: undefined,
+ defaultType: '',
+ providedType: 'boolean',
+ path: '',
+ localization: defaultLocalization(),
+ })
+ ).toEqual(undefined);
+});
diff --git a/test/utilities/optionStore.test.ts b/test/utilities/optionStore.test.ts
new file mode 100644
index 000000000..ee20a29e4
--- /dev/null
+++ b/test/utilities/optionStore.test.ts
@@ -0,0 +1,46 @@
+import { newDate, secondaryDate } from '../test-utilities';
+import { beforeEach, expect, test } from 'vitest';
+import { OptionsStore } from '../../src/js/utilities/optionsStore';
+
+let optionStore: OptionsStore;
+
+beforeEach(() => {
+ optionStore = new OptionsStore();
+ optionStore.viewDate = newDate();
+});
+
+test('currentCalendarViewMode', () => {
+ //default should be 0 on the calendar view
+ expect(optionStore.currentCalendarViewMode).toBe(0);
+ expect(optionStore.currentView).toBe('calendar');
+
+ //mode 1 should be the months view
+ optionStore.currentCalendarViewMode = 1;
+ expect(optionStore.currentCalendarViewMode).toBe(1);
+ expect(optionStore.currentView).toBe('months');
+
+ //set the view to the clock and then simulate it back to the calendar
+ optionStore.currentView = 'clock';
+ expect(optionStore.currentView).toBe('clock');
+ optionStore.refreshCurrentView();
+ expect(optionStore.currentView).toBe('months');
+});
+
+test('viewDate', () => {
+ //viewDate should be the initial date
+ expect(optionStore.viewDate).toEqual(newDate());
+
+ //using the setter
+ optionStore.options = {};
+ optionStore.viewDate = secondaryDate();
+ expect(optionStore.viewDate).toEqual(secondaryDate());
+ expect(optionStore.options.viewDate).toEqual(secondaryDate());
+});
+
+test('isTwelveHour', () => {
+ optionStore.options = { localization: { hourCycle: 'h12' } };
+ expect(optionStore.isTwelveHour).toBe(true);
+
+ optionStore.options = { localization: { hourCycle: 'h23' } };
+ expect(optionStore.isTwelveHour).toBe(false);
+});
diff --git a/test/utilities/serviceLocator.test.ts b/test/utilities/serviceLocator.test.ts
new file mode 100644
index 000000000..d7b9a6ae0
--- /dev/null
+++ b/test/utilities/serviceLocator.test.ts
@@ -0,0 +1,38 @@
+import { afterEach, expect, test, vi } from 'vitest';
+import {
+ serviceLocator,
+ setupServiceLocator,
+} from '../../src/js/utilities/service-locator';
+
+class MyService {
+ count = 0;
+
+ constructor() {
+ this.count++;
+ }
+}
+
+afterEach(() => {
+ vi.restoreAllMocks();
+});
+
+test('Setup Service Locator creates a new instance', () => {
+ expect(serviceLocator).toBe(undefined);
+ setupServiceLocator();
+ expect(typeof serviceLocator.locate).toBe('function');
+});
+
+test('Locate creates and caches service', () => {
+ const myService = serviceLocator.locate(MyService);
+ expect(myService).not.toBe(undefined);
+ expect(myService.count).toBe(1);
+});
+
+test('Locate returns caches service', () => {
+ const myService = serviceLocator.locate(MyService);
+ expect(myService).not.toBe(undefined);
+
+ myService.count++;
+
+ expect(myService.count).toBe(2);
+});
diff --git a/test/utilities/typeCechker.test.ts b/test/utilities/typeCechker.test.ts
new file mode 100644
index 000000000..365372e87
--- /dev/null
+++ b/test/utilities/typeCechker.test.ts
@@ -0,0 +1,83 @@
+import {
+ newDate,
+ newDateMinute,
+ vanillaDate,
+ secondaryDate,
+ defaultLocalization,
+} from '../test-utilities';
+import { expect, test, vi } from 'vitest';
+import {
+ convertToDateTime,
+ tryConvertToDateTime,
+ typeCheckDateArray,
+ typeCheckNumberArray,
+} from '../../src/js/utilities/typeChecker';
+import { DateTime } from '../../src/js/datetime';
+
+test('tryConvertToDateTime', () => {
+ const convertSpy = vi.spyOn(DateTime, 'convert');
+ convertSpy.mockImplementation(() => newDate());
+
+ const fromStringSpy = vi.spyOn(DateTime, 'fromString');
+ fromStringSpy.mockImplementationOnce(() => newDateMinute());
+
+ //null should return null
+ expect(tryConvertToDateTime(null, null)).toBe(null);
+
+ //a DateTime object should just return itself
+ expect(tryConvertToDateTime(newDate(), null)).toEqual(newDate());
+
+ //a Data object should get converted
+ expect(tryConvertToDateTime(vanillaDate(), null)).toEqual(newDate());
+ expect(convertSpy).toHaveBeenCalled();
+
+ //converting from string
+ expect(
+ tryConvertToDateTime('03/14/2023 1:25 PM', defaultLocalization())
+ ).toEqual(newDateMinute());
+ expect(fromStringSpy).toHaveBeenCalled();
+
+ // converting from an invalid string will produce an invalid date
+ fromStringSpy.mockImplementationOnce((a) => new DateTime(a));
+ expect(
+ tryConvertToDateTime('13/70/2023 1:25 PM', defaultLocalization())
+ ).toBe(null);
+ expect(fromStringSpy).toHaveBeenCalled();
+
+ // an invalid type should return null
+ // @ts-ignore
+ expect(tryConvertToDateTime(42, null)).toBe(null);
+});
+
+test('convertToDateTime', () => {
+ //can't convert empty string
+ expect(() => convertToDateTime('', 'maxDate', null)).toThrow();
+
+ //js date should convert
+ expect(convertToDateTime(vanillaDate(), null, null)).toEqual(newDate());
+});
+
+test('typeCheckDateArray', () => {
+ //wrong data type
+ expect(() => typeCheckDateArray('disabledDates', 42, '', null)).toThrow();
+
+ //check each excepted type for conversion
+ const dateArray = [newDate(), vanillaDate(), secondaryDate().format()];
+
+ typeCheckDateArray('disabledDates', dateArray, null);
+
+ expect(dateArray[0]).toEqual(newDate());
+ expect(dateArray[1]).toEqual(vanillaDate());
+ expect(dateArray[2]).toEqual(secondaryDate());
+
+ //invalid type should throw
+ expect(() => typeCheckDateArray('', [42], null)).toThrow();
+});
+
+test('typeCheckNumberArray', () => {
+ //invalid type should throw
+ expect(() => typeCheckNumberArray('disabledHours', null, null)).toThrow();
+
+ //array of numbers is expected
+ expect(() => typeCheckNumberArray('', [42], '')).not.toThrow();
+});
diff --git a/test/validation.test.ts b/test/validation.test.ts
new file mode 100644
index 000000000..84e5e48cd
--- /dev/null
+++ b/test/validation.test.ts
@@ -0,0 +1,266 @@
+/* eslint-disable @typescript-eslint/ban-ts-comment */
+import { newDate, reset, store } from './test-utilities';
+import { afterAll, beforeAll, beforeEach, expect, test, vi } from 'vitest';
+import Validation from '../src/js/validation';
+import { DateTime, Unit } from '../src/js/datetime';
+
+let validation: Validation;
+beforeAll(() => {
+ reset();
+});
+
+beforeEach(() => {
+ reset();
+ validation = new Validation();
+});
+
+afterAll(() => {
+ vi.restoreAllMocks();
+});
+
+test('isValid', () => {
+ let targetDate = new DateTime();
+
+ //no rules
+ expect(validation.isValid(targetDate, Unit.month)).toBe(true);
+ expect(validation.isValid(targetDate, Unit.date)).toBe(true);
+ expect(validation.isValid(targetDate, Unit.hours)).toBe(true);
+
+ //enabled date
+ store.options.restrictions.enabledDates = [targetDate];
+ expect(validation.isValid(targetDate, Unit.date)).toBe(true);
+
+ store.options.restrictions.enabledDates = [
+ targetDate.clone.manipulate(1, Unit.date),
+ ];
+ expect(validation.isValid(targetDate, Unit.date)).toBe(false);
+
+ store.options.restrictions.enabledDates = [];
+
+ store.options.restrictions.daysOfWeekDisabled = [targetDate.weekDay];
+ expect(validation.isValid(targetDate, Unit.date)).toBe(false);
+ store.options.restrictions.daysOfWeekDisabled = [];
+
+ store.options.restrictions.disabledHours = [targetDate.hours];
+ expect(validation.isValid(targetDate, Unit.hours)).toBe(false);
+ store.options.restrictions.disabledHours = [];
+
+ store.options.restrictions.disabledTimeIntervals = [
+ {
+ from: targetDate.clone.manipulate(-2, Unit.hours),
+ to: targetDate.clone.manipulate(2, Unit.hours),
+ },
+ ];
+ expect(validation.isValid(targetDate, Unit.hours)).toBe(false);
+});
+
+test('enabledDisabledDatesIsValid ignores granularity', () => {
+ let targetDate = new DateTime();
+ // @ts-ignore
+ const method = validation._enabledDisabledDatesIsValid.bind(validation);
+ //ignore month
+ expect(method(Unit.month, targetDate)).toBe(true);
+});
+
+test('enabledDisabledDatesIsValid', () => {
+ let targetDate = new DateTime();
+ // @ts-ignore
+ const method = validation._enabledDisabledDatesIsValid.bind(validation);
+ //ignore month
+ expect(method(Unit.month, targetDate)).toBe(true);
+ //no rules
+ expect(method(Unit.date, targetDate)).toBe(true);
+
+ //target date is one of the disabled dates
+ store.options.restrictions.disabledDates = [targetDate];
+ expect(method(Unit.date, targetDate)).toBe(false);
+
+ //target date is not one of the disabled dates
+ store.options.restrictions.disabledDates = [
+ targetDate.clone.manipulate(1, Unit.date),
+ ];
+ expect(method(Unit.date, targetDate)).toBe(true);
+
+ //target date is one of the enabledDates
+ store.options.restrictions.enabledDates = [targetDate];
+ expect(method(Unit.date, targetDate)).toBe(true);
+
+ //target date is not one of the enabledDates
+ store.options.restrictions.enabledDates = [
+ targetDate.clone.manipulate(1, Unit.date),
+ ];
+ expect(method(Unit.date, targetDate)).toBe(false);
+});
+
+test('isInDisabledDates', () => {
+ let targetDate = new DateTime();
+
+ // @ts-ignore
+ const method = validation._isInDisabledDates.bind(validation);
+
+ //no rules
+ store.options.restrictions.disabledDates = [];
+ expect(method(targetDate)).toBe(false);
+
+ //target date is in the array
+ store.options.restrictions.disabledDates = [targetDate];
+ expect(method(targetDate)).toBe(true);
+
+ //target date is not in the array
+ store.options.restrictions.disabledDates = [
+ targetDate.clone.manipulate(1, Unit.date),
+ ];
+ expect(method(Unit.date, targetDate)).toBe(false);
+});
+
+test('isInEnabledDates', () => {
+ let targetDate = new DateTime();
+
+ // @ts-ignore
+ const method = validation._isInEnabledDates.bind(validation);
+
+ //no rules
+ store.options.restrictions.enabledDates = [];
+ expect(method(targetDate)).toBe(true);
+
+ //target date is in the array
+ store.options.restrictions.enabledDates = [targetDate];
+ expect(method(targetDate)).toBe(true);
+
+ //target date is not in the array
+ store.options.restrictions.enabledDates = [
+ targetDate.clone.manipulate(1, Unit.date),
+ ];
+ expect(method(Unit.date, targetDate)).toBe(false);
+});
+
+test('minMaxIsValid', () => {
+ let targetDate = new DateTime();
+ let backOne = targetDate.clone.manipulate(-1, Unit.date);
+ let forwardOne = targetDate.clone.manipulate(1, Unit.date);
+
+ // @ts-ignore
+ const method = validation._minMaxIsValid.bind(validation);
+
+ //no rules
+ expect(method(Unit.date, targetDate)).toBe(true);
+
+ //min date
+ store.options.restrictions.minDate = backOne;
+ expect(method(Unit.date, targetDate)).toBe(true);
+ expect(method(Unit.date, targetDate.clone.manipulate(-2, Unit.date))).toBe(
+ false
+ );
+
+ //max date
+ store.options.restrictions.maxDate = forwardOne;
+ expect(method(Unit.date, targetDate)).toBe(true);
+ expect(method(Unit.date, targetDate.clone.manipulate(2, Unit.date))).toBe(
+ false
+ );
+});
+
+test('enabledDisabledHoursIsValid', () => {
+ let targetDate = new DateTime();
+ // @ts-ignore
+ const method = validation._enabledDisabledHoursIsValid.bind(validation);
+
+ //no rules
+ expect(method(Unit.date, targetDate)).toBe(true);
+
+ //target date's hour
+ store.options.restrictions.disabledHours = [targetDate.hours];
+ expect(method(targetDate)).toBe(false);
+
+ //target date is not one of the disabled dates
+ store.options.restrictions.disabledHours = [
+ targetDate.clone.manipulate(1, Unit.hours).hours,
+ ];
+ expect(method(targetDate)).toBe(true);
+
+ //target date is one of the enabledDates
+ store.options.restrictions.enabledHours = [targetDate.hours];
+ expect(method(targetDate)).toBe(true);
+
+ //target date is not one of the enabledDates
+ store.options.restrictions.enabledHours = [
+ targetDate.clone.manipulate(1, Unit.hours).hours,
+ ];
+ expect(method(targetDate)).toBe(false);
+});
+
+test('isInDisabledHours', () => {
+ let targetDate = new DateTime();
+
+ // @ts-ignore
+ const method = validation._isInDisabledHours.bind(validation);
+
+ //no rules
+ store.options.restrictions.disabledHours = [];
+ expect(method(targetDate)).toBe(false);
+
+ //target date's hour is in the array
+ store.options.restrictions.disabledHours = [targetDate.hours];
+ expect(method(targetDate)).toBe(true);
+
+ //target date's hour is not in the array
+ store.options.restrictions.disabledHours = [
+ targetDate.clone.manipulate(1, Unit.hours).hours,
+ ];
+ expect(method(Unit.date, targetDate)).toBe(false);
+});
+
+test('isInEnabledHours', () => {
+ let targetDate = new DateTime();
+
+ // @ts-ignore
+ const method = validation._isInEnabledHours.bind(validation);
+
+ //no rules
+ store.options.restrictions.enabledHours = [];
+ expect(method(targetDate)).toBe(true);
+
+ //target date's hour is in the array
+ store.options.restrictions.enabledHours = [targetDate.hours];
+ expect(method(targetDate)).toBe(true);
+
+ //target date's hour is in the array
+ store.options.restrictions.enabledHours = [
+ targetDate.clone.manipulate(1, Unit.hours).hours,
+ ];
+ expect(method(Unit.date, targetDate)).toBe(false);
+});
+
+test('dateRangeIsValid', () => {
+ const isValidSpy = vi.spyOn(validation, 'isValid');
+ let back = newDate().manipulate(-1, Unit.date);
+ let forward = newDate().clone.manipulate(3, Unit.date);
+
+ //no rules
+ expect(validation.dateRangeIsValid([], 0, newDate())).toBe(true);
+
+ //option is enabled but no dates are selected or not testing the end date
+ store.options.dateRange = true;
+ expect(validation.dateRangeIsValid([], 0, newDate())).toBe(true);
+
+ //test start is the same day
+ expect(validation.dateRangeIsValid([newDate(), forward], 0, newDate())).toBe(
+ true
+ );
+
+ store.options.restrictions.maxDate = forward;
+
+ //one of the dates in range fails validation
+ isValidSpy.mockImplementationOnce(() => false);
+ expect(
+ validation.dateRangeIsValid([back], 1, newDate().manipulate(5, Unit.date))
+ ).toBe(false);
+ expect(isValidSpy).toHaveBeenCalled();
+
+ //all dates pass
+ isValidSpy.mockImplementationOnce(() => true);
+ expect(
+ validation.dateRangeIsValid([back], 1, newDate().manipulate(2, Unit.date))
+ ).toBe(true);
+ expect(isValidSpy).toHaveBeenCalled();
+});
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 000000000..1cd2dfa7b
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,32 @@
+{
+ "compilerOptions": {
+ "module": "ES2020",
+ "target": "ES2020",
+ "lib": [
+ "es6",
+ "dom",
+ "es2016",
+ "es2017",
+ "dom.iterable",
+ "es2019",
+ "ES2021"
+ ],
+ "moduleResolution": "node",
+ "allowSyntheticDefaultImports": true,
+ "paths": {
+ "~src/*": ["../src/*"]
+ },
+ "rootDirs": ["./src/js", "./test"],
+ "declaration": true,
+ "declarationDir": "./types",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true
+ },
+ "include": ["./src/js/**/*.ts"],
+ "exclude": [
+ "node_modules",
+ "./src/js/plugins/**/*.ts",
+ "./src/js/locales/**/*.ts",
+ "./test"
+ ]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 000000000..0c5163334
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,16 @@
+import { defineConfig } from 'vitest/config';
+import GithubActionsReporter from 'vitest-github-actions-reporter';
+
+export default defineConfig({
+ test: {
+ include: ['test/**/*.test.ts'],
+ coverage: {
+ reporter: ['text', 'json', 'html', 'lcovonly'],
+ exclude: ['**/*.test.ts', '**/*.fixture.ts'],
+ } as any, //eslint-disable-line @typescript-eslint/no-explicit-any
+ reporters: process.env.GITHUB_ACTIONS
+ ? ['default', new GithubActionsReporter()]
+ : 'default',
+ environment: 'jsdom',
+ },
+});