diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..4234470
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,29 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended-type-checked',
+ 'plugin:@typescript-eslint/stylistic-type-checked',
+ 'plugin:react-hooks/recommended',
+ 'plugin:react/recommended',
+ 'plugin:react/jsx-runtime',
+ ],
+ ignorePatterns: ['dist', '.eslintrc.cjs', 'vite.config.ts'],
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ project: ['./tsconfig.json', './tsconfig.node.json'],
+ tsconfigRootDir: __dirname,
+ },
+ plugins: ['react-refresh'],
+ rules: {
+ 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
+ },
+ settings: {
+ react: {
+ version: 'detect',
+ },
+ },
+};
diff --git a/.gitignore b/.gitignore
index 00ec607..c15ba5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,6 @@
npm-debug.log*
yarn-debug.log*
yarn-error.log*
+
+# customize
+/public/data
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..fff7455
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "semi": true,
+ "tabWidth": 2,
+ "singleQuote": true,
+ "printWidth": 100,
+ "trailingComma": "all"
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..26bdc66
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,7 @@
+{
+ "recommendations": [
+ "jawandarajbir.react-vscode-extension-pack",
+ "esbenp.prettier-vscode",
+ "streetsidesoftware.code-spell-checker"
+ ]
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..f9e0ead
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,12 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Vite Debugger",
+ "type": "chrome",
+ "request": "launch",
+ "url": "http://localhost:3000/",
+ "webRoot": "${workspaceFolder}"
+ }
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..586dbe8
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,71 @@
+{
+ "editor.formatOnSave": true,
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true
+ },
+ "[javascript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[javascriptreact]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[typescriptreact]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[html]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[css]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[json]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[jsonc]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ // Extensions - Code Spell Checker
+ "cSpell.ignoreWords": ["degu", "Neuroinformatics", "octodon", "RIKEN"],
+ "cSpell.words": [
+ "dobr",
+ "doesn",
+ "dohtml",
+ "doimage",
+ "dosmiley",
+ "doxcode",
+ "htmlspecialchars",
+ "itemcount",
+ "itemselect",
+ "itemsubtypesearch",
+ "itemtype",
+ "itemtypes",
+ "itemtypesearch",
+ "justsystem",
+ "lightbox",
+ "listitem",
+ "lokijs",
+ "mathematica",
+ "mday",
+ "mlang",
+ "navi",
+ "orderdir",
+ "pageview",
+ "pubmed",
+ "quicksearch",
+ "simpf",
+ "simplesort",
+ "subitemtype",
+ "xoonips",
+ "xoops"
+ ],
+ // Extensions - HTML
+ "html.format.wrapLineLength": 0,
+ // Extentions - Prettier
+ // - see: .prettierrc.json
+ // Extentions - Typescript
+ "javascript.updateImportsOnFileMove.enabled": "always",
+ "typescript.updateImportsOnFileMove.enabled": "always"
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..97181a8
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,40 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "npm: dev",
+ "detail": "vite dev",
+ "type": "npm",
+ "script": "dev",
+ "problemMatcher": "$tsc",
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ },
+ "presentation": {
+ "echo": true,
+ "reveal": "silent",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": true,
+ "clear": false
+ }
+ },
+ {
+ "label": "npm: build",
+ "detail": "vite build",
+ "type": "npm",
+ "script": "build",
+ "group": "build",
+ "problemMatcher": "$tsc",
+ "presentation": {
+ "echo": true,
+ "reveal": "silent",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": true,
+ "clear": false
+ }
+ }
+ ]
+}
diff --git a/public/index.html b/index.html
similarity index 57%
rename from public/index.html
rename to index.html
index 4c6201e..4970410 100644
--- a/public/index.html
+++ b/index.html
@@ -1,8 +1,8 @@
-
+
-
+
-
-
+
+
-
+
BSI-NI Brain Atlas
You need to enable JavaScript to run this app.
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..e694128
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,5515 @@
+{
+ "name": "brainatlas",
+ "version": "2.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "brainatlas",
+ "version": "2.0.0",
+ "dependencies": {
+ "@orrisroot/react-html-parser": "^2.1.1",
+ "async-lock": "^1.4.0",
+ "axios": "^1.4.0",
+ "lokijs": "^1.5.12",
+ "moment": "^2.29.4",
+ "node-stdlib-browser": "^1.2.0",
+ "rc-tree": "^5.7.9",
+ "react": "^18.2.0",
+ "react-app-polyfill": "^3.0.0",
+ "react-cookie": "^4.1.1",
+ "react-dom": "^18.2.0",
+ "react-ga4": "^2.1.0",
+ "react-helmet-async": "^1.3.0",
+ "react-overlays": "^5.2.1",
+ "react-router-dom": "^6.14.2",
+ "react-router-hash-link": "^2.4.3",
+ "react-spinner-material": "^1.4.0",
+ "sanitize.css": "^13.0.0",
+ "xregexp": "^5.1.1",
+ "yet-another-react-lightbox": "^3.11.4"
+ },
+ "devDependencies": {
+ "@types/async-lock": "^1.4.0",
+ "@types/jest": "^29.5.3",
+ "@types/lokijs": "^1.5.8",
+ "@types/node": "^18.17.1",
+ "@types/react": "^18.2.17",
+ "@types/react-dom": "^18.2.7",
+ "@types/react-router-dom": "^5.3.3",
+ "@types/react-router-hash-link": "^2.4.6",
+ "@types/react-syntax-highlighter": "^15.5.7",
+ "@typescript-eslint/eslint-plugin": "^6.2.0",
+ "@typescript-eslint/parser": "^6.2.0",
+ "@vitejs/plugin-react-swc": "^3.3.2",
+ "eslint": "^8.45.0",
+ "eslint-plugin-react": "^7.33.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.3",
+ "prettier": "^3.0.0",
+ "typescript": "^5.1.6",
+ "vite": "^4.4.7",
+ "vite-plugin-node-stdlib-browser": "^0.2.1",
+ "vite-plugin-rewrite-all": "^1.0.1"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+ "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "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/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/@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/@babel/runtime": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
+ "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.6.tgz",
+ "integrity": "sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==",
+ "dependencies": {
+ "core-js-pure": "^3.30.2",
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz",
+ "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz",
+ "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz",
+ "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz",
+ "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz",
+ "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz",
+ "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz",
+ "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz",
+ "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz",
+ "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz",
+ "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz",
+ "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz",
+ "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz",
+ "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz",
+ "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz",
+ "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz",
+ "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz",
+ "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz",
+ "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz",
+ "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz",
+ "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz",
+ "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz",
+ "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz",
+ "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
+ "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.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.44.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+ "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+ "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+ "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/@jest/expect-utils": {
+ "version": "29.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz",
+ "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==",
+ "dev": true,
+ "dependencies": {
+ "jest-get-type": "^29.4.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.0",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz",
+ "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==",
+ "dev": true,
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz",
+ "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.0",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "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/@orrisroot/react-html-parser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@orrisroot/react-html-parser/-/react-html-parser-2.1.1.tgz",
+ "integrity": "sha512-ZmTmhBj9uQmC4MlxhZg+c4CsTuvq2MepegcCXWrLUrmIDwNLScZ0BgUWcgkgLM97gDfFbl4EOa/6eNpp81D9Ug==",
+ "dependencies": {
+ "htmlparser2": "^8.0.1"
+ },
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz",
+ "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@restart/hooks": {
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.11.tgz",
+ "integrity": "sha512-Ft/ncTULZN6ldGHiF/k5qt72O8JyRMOeg0tApvCni8LkoiEahO+z3TNxfXIVGy890YtWVDvJAl662dVJSJXvMw==",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@rollup/plugin-inject": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz",
+ "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.27.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "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/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true
+ },
+ "node_modules/@swc/core": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.71.tgz",
+ "integrity": "sha512-T8dqj+SV/S8laW/FGmKHhCGw1o4GRUvJ2jHfbYgEwiJpeutT9uavHvG02t39HJvObBJ52EZs/krGtni4U5928Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.3.71",
+ "@swc/core-darwin-x64": "1.3.71",
+ "@swc/core-linux-arm-gnueabihf": "1.3.71",
+ "@swc/core-linux-arm64-gnu": "1.3.71",
+ "@swc/core-linux-arm64-musl": "1.3.71",
+ "@swc/core-linux-x64-gnu": "1.3.71",
+ "@swc/core-linux-x64-musl": "1.3.71",
+ "@swc/core-win32-arm64-msvc": "1.3.71",
+ "@swc/core-win32-ia32-msvc": "1.3.71",
+ "@swc/core-win32-x64-msvc": "1.3.71"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.71.tgz",
+ "integrity": "sha512-xOm0hDbcO2ShwQu1CjLtq3fwrG9AvhuE0s8vtBc8AsamYExHmR8bo6GQHJUtfPG1FVPk5a8xoQSd1fs09FQjLg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.71.tgz",
+ "integrity": "sha512-9sbDXBWgM22w/3Ll5kPhXMPkOiHRoqwMOyxLJBfGtIMnFlh5O+NRN3umRerK3pe4Q6/7hj2M5V+crEHYrXmuxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.71.tgz",
+ "integrity": "sha512-boKdMZsfKvhBs0FDeqH7KQj0lfYe0wCtrL1lv50oYMEeLajY9o4U5xSmc61Sg4HRXjlbR6dlM2cFfL84t7NpAA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.71.tgz",
+ "integrity": "sha512-yDatyHYMiOVwhyIA/LBwknPs2CUtLYWEMzPZjgLc+56PbgPs3oiEbNWeVUND5onPrfDQgK7NK1y8JeiXZqTgGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.71.tgz",
+ "integrity": "sha512-xAdCA0L/hoa0ULL5SR4sMZCxkWk7C90DOU7wJalNVG9qNWYICfq3G7AR0E9Ohphzqyahfb5QJED/nA7N0+XwbQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.71.tgz",
+ "integrity": "sha512-j94qLXP/yqhu2afnABAq/xrJIU8TEqcNkp1TlsAeO3R2nVLYL1w4XX8GW71SPnXmd2bwF102c3Cfv/2ilf2y2A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.71.tgz",
+ "integrity": "sha512-YiyU848ql6dLlmt0BHccGAaZ36Cf61VzCAMDKID/gd72snvzWcMCHrwSRW0gEFNXHsjBJrmNl+SLYZHfqoGwUA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.71.tgz",
+ "integrity": "sha512-1UsJ+6hnIRe/PVdgDPexvgGaN4KpBncT/bAOqlWc9XC7KeBXAWcGA08LrPUz2Ei00DJXzR622IGZVEYOHNkUOw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.71.tgz",
+ "integrity": "sha512-KnuI89+zojR9lDFELdQYZpxzPZ6pBfLwJfWTSGatnpL1ZHhIsV3tK1jwqIdJK1zkRxpBwc6p6FzSZdZwCSpnJw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.3.71",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.71.tgz",
+ "integrity": "sha512-Pcw7fFirpaBOZsU8fhO48ZCb7NxIjuLnLRPrHqWQ4Mapx1+w9ZNdGya2DKP9n8EAiUrJO20WDsrBNMT2MQSWkA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@types/async-lock": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@types/async-lock/-/async-lock-1.4.0.tgz",
+ "integrity": "sha512-2+rYSaWrpdbQG3SA0LmMT6YxWLrI81AqpMlSkw3QtFc2HGDufkweQSn30Eiev7x9LL0oyFrBqk1PXOnB9IEgKg==",
+ "dev": true
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz",
+ "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
+ "dev": true
+ },
+ "node_modules/@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
+ "dev": true
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "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/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+ "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "29.5.3",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz",
+ "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==",
+ "dev": true,
+ "dependencies": {
+ "expect": "^29.0.0",
+ "pretty-format": "^29.0.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
+ "dev": true
+ },
+ "node_modules/@types/lokijs": {
+ "version": "1.5.8",
+ "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.8.tgz",
+ "integrity": "sha512-HN4vmoYHqF0mx91Cci6xaH1uN1JAMbakqNFXggpbd2L/RTUMrvx//dJTJehEtEF+a/qXfLbVSeO6p3Oegx/hDg==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "18.17.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz",
+ "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==",
+ "dev": true
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.17",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.17.tgz",
+ "integrity": "sha512-u+e7OlgPPh+aryjOm5UJMX32OvB2E3QASOAqVMY6Ahs90djagxwv2ya0IctglNbNTexC12qCSMZG47KPfy1hAA==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
+ "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "dev": true,
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
+ "node_modules/@types/react-router-hash-link": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/@types/react-router-hash-link/-/react-router-hash-link-2.4.6.tgz",
+ "integrity": "sha512-JOV4Q1N60tJJUPisS/u1jiXn8c4jX7ThQf8XavzZYIWOIv0RP17nbyI9YgEZh1r3APXpP9ZkU1ytrlv+1+8jcw==",
+ "dev": true,
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router-dom": "^5.3.0"
+ }
+ },
+ "node_modules/@types/react-syntax-highlighter": {
+ "version": "15.5.7",
+ "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.7.tgz",
+ "integrity": "sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
+ "dev": true
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
+ "dev": true
+ },
+ "node_modules/@types/warning": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz",
+ "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA=="
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.24",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
+ "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz",
+ "integrity": "sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.2.0",
+ "@typescript-eslint/type-utils": "6.2.0",
+ "@typescript-eslint/utils": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.0.tgz",
+ "integrity": "sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.2.0",
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/typescript-estree": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz",
+ "integrity": "sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz",
+ "integrity": "sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.2.0",
+ "@typescript-eslint/utils": "6.2.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz",
+ "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz",
+ "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.0.tgz",
+ "integrity": "sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.2.0",
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/typescript-estree": "6.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz",
+ "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.2.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz",
+ "integrity": "sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==",
+ "dev": true,
+ "dependencies": {
+ "@swc/core": "^1.3.61"
+ },
+ "peerDependencies": {
+ "vite": "^4"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "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/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-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/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-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
+ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz",
+ "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "node_modules/asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/asn1.js/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "node_modules/assert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz",
+ "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==",
+ "dependencies": {
+ "es6-object-assign": "^1.1.0",
+ "is-nan": "^1.2.1",
+ "object-is": "^1.0.1",
+ "util": "^0.12.0"
+ }
+ },
+ "node_modules/async-lock": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz",
+ "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "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/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "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/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+ },
+ "node_modules/browser-resolve": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+ "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
+ "dependencies": {
+ "resolve": "^1.17.0"
+ }
+ },
+ "node_modules/browser-resolve/node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dependencies": {
+ "is-core-module": "^2.11.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/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "dependencies": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "node_modules/browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "dependencies": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "node_modules/browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dependencies": {
+ "pako": "~1.0.5"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "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": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="
+ },
+ "node_modules/builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ=="
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/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/ci-info": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
+ "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/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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/connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
+ },
+ "node_modules/constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ=="
+ },
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz",
+ "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.0.tgz",
+ "integrity": "sha512-qsev1H+dTNYpDUEURRuOXMvpdtAnNEvQWS/FMJ2Vb5AY8ZP4rAPQldkE27joykZPJTe0+IVgHZYh1P5Xu1/i1g==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "node_modules/create-ecdh/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dependencies": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+ },
+ "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/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/define-properties": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+ "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "dependencies": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/des.js": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
+ "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+ "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "node_modules/diffie-hellman/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "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-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domain-browser": {
+ "version": "4.22.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz",
+ "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz",
+ "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.1",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.2.1",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.0",
+ "safe-array-concat": "^1.0.0",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.7",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es6-object-assign": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
+ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw=="
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz",
+ "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.17",
+ "@esbuild/android-arm64": "0.18.17",
+ "@esbuild/android-x64": "0.18.17",
+ "@esbuild/darwin-arm64": "0.18.17",
+ "@esbuild/darwin-x64": "0.18.17",
+ "@esbuild/freebsd-arm64": "0.18.17",
+ "@esbuild/freebsd-x64": "0.18.17",
+ "@esbuild/linux-arm": "0.18.17",
+ "@esbuild/linux-arm64": "0.18.17",
+ "@esbuild/linux-ia32": "0.18.17",
+ "@esbuild/linux-loong64": "0.18.17",
+ "@esbuild/linux-mips64el": "0.18.17",
+ "@esbuild/linux-ppc64": "0.18.17",
+ "@esbuild/linux-riscv64": "0.18.17",
+ "@esbuild/linux-s390x": "0.18.17",
+ "@esbuild/linux-x64": "0.18.17",
+ "@esbuild/netbsd-x64": "0.18.17",
+ "@esbuild/openbsd-x64": "0.18.17",
+ "@esbuild/sunos-x64": "0.18.17",
+ "@esbuild/win32-arm64": "0.18.17",
+ "@esbuild/win32-ia32": "0.18.17",
+ "@esbuild/win32-x64": "0.18.17"
+ }
+ },
+ "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": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
+ "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.0",
+ "@humanwhocodes/config-array": "^0.11.10",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.6.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",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "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.3",
+ "strip-ansi": "^6.0.1",
+ "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-plugin-react": {
+ "version": "7.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz",
+ "integrity": "sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz",
+ "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/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,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
+ "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "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": "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/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/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.6.2",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz",
+ "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/expect-utils": "^29.6.2",
+ "@types/node": "*",
+ "jest-get-type": "^29.4.3",
+ "jest-matcher-utils": "^29.6.2",
+ "jest-message-util": "^29.6.2",
+ "jest-util": "^29.6.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "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-glob/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/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.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "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.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "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==",
+ "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/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "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.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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": "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/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/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "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==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg=="
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "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/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "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/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/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=="
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "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/isomorphic-timers-promises": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz",
+ "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "29.6.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz",
+ "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.4.3",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.6.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+ "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "29.6.2",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz",
+ "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.6.2",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.6.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "29.6.2",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz",
+ "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.6.2",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.6.2",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz",
+ "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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=="
+ },
+ "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/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/jsx-ast-utils": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz",
+ "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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/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==",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/lokijs": {
+ "version": "1.5.12",
+ "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.12.tgz",
+ "integrity": "sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q=="
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "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.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/miller-rabin/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "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==",
+ "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==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+ },
+ "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/moment": {
+ "version": "2.29.4",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "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/node-stdlib-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz",
+ "integrity": "sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==",
+ "dependencies": {
+ "assert": "^2.0.0",
+ "browser-resolve": "^2.0.0",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^5.7.1",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "create-require": "^1.1.1",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^4.22.0",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "isomorphic-timers-promises": "^1.0.1",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "^1.0.1",
+ "pkg-dir": "^5.0.0",
+ "process": "^0.11.10",
+ "punycode": "^1.4.1",
+ "querystring-es3": "^0.2.1",
+ "readable-stream": "^3.6.0",
+ "stream-browserify": "^3.0.0",
+ "stream-http": "^3.2.0",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.1",
+ "url": "^0.11.0",
+ "util": "^0.12.4",
+ "vm-browserify": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="
+ },
+ "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==",
+ "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==",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+ },
+ "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/parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "dependencies": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
+ },
+ "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==",
+ "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=="
+ },
+ "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/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "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/pkg-dir": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+ "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+ "dependencies": {
+ "find-up": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.27",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz",
+ "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "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/prettier": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz",
+ "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "29.6.2",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz",
+ "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.0",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.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/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/public-encrypt/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="
+ },
+ "node_modules/qs": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
+ "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "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/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dependencies": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/rc-motion": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.7.3.tgz",
+ "integrity": "sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.11.1",
+ "classnames": "^2.2.1",
+ "rc-util": "^5.21.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/rc-resize-observer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz",
+ "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.7",
+ "classnames": "^2.2.1",
+ "rc-util": "^5.27.0",
+ "resize-observer-polyfill": "^1.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/rc-tree": {
+ "version": "5.7.9",
+ "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.9.tgz",
+ "integrity": "sha512-1hKkToz/EVjJlMVwmZnpXeLXt/1iQMsaAq9m+GNkUbK746gkc7QpJXSN/TzjhTI5Hi+LOSlrMaXLMT0bHPqILQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.10.1",
+ "classnames": "2.x",
+ "rc-motion": "^2.0.1",
+ "rc-util": "^5.16.1",
+ "rc-virtual-list": "^3.5.1"
+ },
+ "engines": {
+ "node": ">=10.x"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
+ }
+ },
+ "node_modules/rc-util": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.35.0.tgz",
+ "integrity": "sha512-MTXlixb3EoSTEchsOc7XWsVyoUQqoCsh2Z1a2IptwNgqleMF6ZgQeY52UzUbNj5CcVBg9YljOWjuOV07jSSm4Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "react-is": "^16.12.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/rc-util/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/rc-virtual-list": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.5.3.tgz",
+ "integrity": "sha512-rG6IuD4EYM8K6oZ8Shu2BC/CmcTdqng4yBWkc/5fjWhB20bl6QwR2Upyt7+MxvfscoVm8zOQY+tcpEO5cu4GaQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.0",
+ "classnames": "^2.2.6",
+ "rc-resize-observer": "^1.0.0",
+ "rc-util": "^5.15.0"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-app-polyfill": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
+ "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
+ "dependencies": {
+ "core-js": "^3.19.2",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.9",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-cookie": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz",
+ "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.0.1",
+ "hoist-non-react-statics": "^3.0.0",
+ "universal-cookie": "^4.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.3.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
+ },
+ "node_modules/react-ga4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz",
+ "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ=="
+ },
+ "node_modules/react-helmet-async": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz",
+ "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "invariant": "^2.2.4",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.2.0",
+ "shallowequal": "^1.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.6.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+ "dev": true
+ },
+ "node_modules/react-lifecycles-compat": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+ },
+ "node_modules/react-overlays": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz",
+ "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.8",
+ "@popperjs/core": "^2.11.6",
+ "@restart/hooks": "^0.4.7",
+ "@types/warning": "^3.0.0",
+ "dom-helpers": "^5.2.0",
+ "prop-types": "^15.7.2",
+ "uncontrollable": "^7.2.1",
+ "warning": "^4.0.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.3.0",
+ "react-dom": ">=16.3.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz",
+ "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==",
+ "dependencies": {
+ "@remix-run/router": "1.7.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz",
+ "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==",
+ "dependencies": {
+ "@remix-run/router": "1.7.2",
+ "react-router": "6.14.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-router-hash-link": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/react-router-hash-link/-/react-router-hash-link-2.4.3.tgz",
+ "integrity": "sha512-NU7GWc265m92xh/aYD79Vr1W+zAIXDWp3L2YZOYP4rCqPnJ6LI6vh3+rKgkidtYijozHclaEQTAHaAaMWPVI4A==",
+ "dependencies": {
+ "prop-types": "^15.7.2"
+ },
+ "peerDependencies": {
+ "react": ">=15",
+ "react-router-dom": ">=4"
+ }
+ },
+ "node_modules/react-spinner-material": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/react-spinner-material/-/react-spinner-material-1.4.0.tgz",
+ "integrity": "sha512-4EAL+QgU/b5ubCjX3Yxmy4i0OGncix2wzfFlo25d4PXdDKFPGc1y6I57YmJ7QZykLkUIk32YSGeYP59FAq6sRA=="
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+ "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "node_modules/resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "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": "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/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/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/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.26.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz",
+ "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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-array-concat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz",
+ "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "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-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sanitize.css": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
+ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA=="
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+ },
+ "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/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stream-browserify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+ "dependencies": {
+ "inherits": "~2.0.4",
+ "readable-stream": "^3.5.0"
+ }
+ },
+ "node_modules/stream-http": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
+ "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+ "dependencies": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
+ "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-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/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/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==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/timers-browserify": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+ "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+ "dependencies": {
+ "setimmediate": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6.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/ts-api-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz",
+ "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
+ },
+ "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/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/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
+ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/uncontrollable": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz",
+ "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.6.3",
+ "@types/react": ">=16.9.11",
+ "invariant": "^2.2.4",
+ "react-lifecycles-compat": "^3.0.4"
+ },
+ "peerDependencies": {
+ "react": ">=15.0.0"
+ }
+ },
+ "node_modules/universal-cookie": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz",
+ "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==",
+ "dependencies": {
+ "@types/cookie": "^0.3.3",
+ "cookie": "^0.4.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/uri-js/node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/url": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz",
+ "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==",
+ "dependencies": {
+ "punycode": "^1.4.1",
+ "qs": "^6.11.0"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "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=="
+ },
+ "node_modules/vite": {
+ "version": "4.4.7",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz",
+ "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.18.10",
+ "postcss": "^8.4.26",
+ "rollup": "^3.25.2"
+ },
+ "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-plugin-node-stdlib-browser": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/vite-plugin-node-stdlib-browser/-/vite-plugin-node-stdlib-browser-0.2.1.tgz",
+ "integrity": "sha512-6u2i613Dkqj5KaTNIrnZvE6y3/awWAp0S5TjucTvGxdhetftB1Mgvblc+nwYzlw6sntPlac8UOC7ttXNh+LZKA==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/plugin-inject": "^5.0.3"
+ },
+ "peerDependencies": {
+ "node-stdlib-browser": "^1.2.0",
+ "vite": "^2.0.0 || ^3.0.0 || ^4.0.0"
+ }
+ },
+ "node_modules/vite-plugin-rewrite-all": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vite-plugin-rewrite-all/-/vite-plugin-rewrite-all-1.0.1.tgz",
+ "integrity": "sha512-W0DAchC8ynuQH0lYLIu5/5+JGfYlUTRD8GGNtHFXRJX4FzzB9MajtqHBp26zq/ly9sDt5BqrfdT08rv3RbB0LQ==",
+ "dev": true,
+ "dependencies": {
+ "connect-history-api-fallback": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^2.0.0 || ^3.0.0 || ^4.0.0"
+ }
+ },
+ "node_modules/vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
+ },
+ "node_modules/warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.17",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz",
+ "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ=="
+ },
+ "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/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
+ "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/xregexp": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.1.tgz",
+ "integrity": "sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg==",
+ "dependencies": {
+ "@babel/runtime-corejs3": "^7.16.5"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yet-another-react-lightbox": {
+ "version": "3.11.4",
+ "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.11.4.tgz",
+ "integrity": "sha512-h7JFRKnjlmsPEsBgdUyzFDZCLdPG6jv2YDAGoIxCOr3qVttzyPU2T9AgtMwUZv+soLrneeQOTJ+F89Rm6TPQrQ==",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 98c0058..490a3ee 100644
--- a/package.json
+++ b/package.json
@@ -1,65 +1,58 @@
{
"name": "brainatlas",
- "version": "1.0.0",
"private": true,
+ "version": "2.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "format": "prettier --write src/"
+ },
"dependencies": {
- "@orrisroot/react-html-parser": "^2.1.0",
- "@testing-library/jest-dom": "^5.16.4",
- "@testing-library/react": "^13.3.0",
- "@testing-library/user-event": "^14.2.0",
- "@types/async-lock": "^1.1.5",
- "@types/jest": "^28.1.1",
- "@types/lokijs": "^1.5.7",
- "@types/node": "^17.0.41",
- "@types/react": "^18.0.12",
- "@types/react-dom": "^18.0.5",
- "@types/react-router-dom": "^5.3.3",
- "@types/react-router-hash-link": "^2.4.5",
- "async-lock": "^1.3.1",
- "axios": "^0.27.2",
+ "@orrisroot/react-html-parser": "^2.1.1",
+ "async-lock": "^1.4.0",
+ "axios": "^1.4.0",
"lokijs": "^1.5.12",
- "moment": "^2.29.3",
- "rc-tree": "^5.6.5",
- "react": "^18.1.0",
+ "moment": "^2.29.4",
+ "node-stdlib-browser": "^1.2.0",
+ "rc-tree": "^5.7.9",
+ "react": "^18.2.0",
"react-app-polyfill": "^3.0.0",
"react-cookie": "^4.1.1",
- "react-dom": "^18.1.0",
- "react-ga4": "^1.4.1",
+ "react-dom": "^18.2.0",
+ "react-ga4": "^2.1.0",
"react-helmet-async": "^1.3.0",
- "react-image-lightbox": "^5.1.4",
- "react-overlays": "^5.2.0",
- "react-router-dom": "^6.3.0",
+ "react-overlays": "^5.2.1",
+ "react-router-dom": "^6.14.2",
"react-router-hash-link": "^2.4.3",
- "react-scripts": "^5.0.1",
"react-spinner-material": "^1.4.0",
- "typescript": "^4.7.3",
- "web-vitals": "^2.1.4",
- "xregexp": "^5.1.1"
+ "sanitize.css": "^13.0.0",
+ "xregexp": "^5.1.1",
+ "yet-another-react-lightbox": "^3.11.4"
},
- "resolutions": {
- "@svgr/webpack": "^6.2.1"
- },
- "scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
- "eject": "react-scripts eject"
- },
- "eslintConfig": {
- "extends": "react-app"
- },
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all",
- "ie 11"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version",
- "ie 11"
- ]
+ "devDependencies": {
+ "@types/async-lock": "^1.4.0",
+ "@types/jest": "^29.5.3",
+ "@types/lokijs": "^1.5.8",
+ "@types/node": "^18.17.1",
+ "@types/react": "^18.2.17",
+ "@types/react-dom": "^18.2.7",
+ "@types/react-router-dom": "^5.3.3",
+ "@types/react-router-hash-link": "^2.4.6",
+ "@types/react-syntax-highlighter": "^15.5.7",
+ "@typescript-eslint/eslint-plugin": "^6.2.0",
+ "@typescript-eslint/parser": "^6.2.0",
+ "@vitejs/plugin-react-swc": "^3.3.2",
+ "eslint": "^8.45.0",
+ "eslint-plugin-react": "^7.33.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.3",
+ "prettier": "^3.0.0",
+ "typescript": "^5.1.6",
+ "vite": "^4.4.7",
+ "vite-plugin-node-stdlib-browser": "^0.2.1",
+ "vite-plugin-rewrite-all": "^1.0.1"
}
}
diff --git a/public/.htaccess b/public/.htaccess
index 87f66f1..7ded808 100644
--- a/public/.htaccess
+++ b/public/.htaccess
@@ -1,17 +1,22 @@
-RewriteEngine on
+
+RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} (^|&)file_id=([0-9]+)($|&)
-RewriteRule ^degu/modules/xoonips/download.php /degu/file/%2? [R=301,L]
+RewriteRule ^degu/modules/xoonips/download.php /data/degu/file/%2? [R=301,L]
RewriteCond %{QUERY_STRING} (^|&)file_id=([0-9]+)($|&)
-RewriteRule ^jm/modules/xoonips/download.php /jm/file/%2? [R=301,L]
+RewriteRule ^jm/modules/xoonips/download.php /data/jm/file/%2? [R=301,L]
RewriteCond %{QUERY_STRING} (^|&)file_id=([0-9]+)($|&)
-RewriteRule ^marmoset/modules/xoonips/download.php /marmoset/file/%2? [R=301,L]
+RewriteRule ^marmoset/modules/xoonips/download.php /data/marmoset/file/%2? [R=301,L]
+
+RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
-RewriteCond %{REQUEST_FILENAME} !-d [OR]
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}index.html !-f
RewriteRule . /index.html [L]
+
diff --git a/src/App.css b/src/App.css
index 1803609..a7a99df 100644
--- a/src/App.css
+++ b/src/App.css
@@ -1,2 +1,2 @@
@import url('./common/assets/xoops.css');
-@import url('./common/assets/theme/style.css');
\ No newline at end of file
+@import url('./common/assets/theme/style.css');
diff --git a/src/App.test.tsx b/src/App.test.tsx
deleted file mode 100644
index 2a68616..0000000
--- a/src/App.test.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import { render, screen } from '@testing-library/react';
-import App from './App';
-
-test('renders learn react link', () => {
- render( );
- const linkElement = screen.getByText(/learn react/i);
- expect(linkElement).toBeInTheDocument();
-});
diff --git a/src/App.tsx b/src/App.tsx
index a19644b..f1f0687 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,26 +1,32 @@
-import React, { useEffect, useState } from "react";
-import { CookiesProvider, useCookies } from "react-cookie";
-import ReactGA from "react-ga4";
-import { HelmetProvider } from "react-helmet-async";
-import { BrowserRouter, useLocation } from "react-router-dom";
-import "./App.css";
-import AppRoot from "./common/AppRoot";
-import Config, { MultiLang } from "./config";
+import React from 'react';
+
+import { CookiesProvider, useCookies } from 'react-cookie';
+import ReactGA from 'react-ga4';
+import { HelmetProvider } from 'react-helmet-async';
+import { BrowserRouter, useLocation } from 'react-router-dom';
+import './App.css';
+import AppRoot from './common/AppRoot';
+import Config, { MultiLang } from './config';
+
+const mlang = ['en', 'ja'] as const;
+const isMultiLang = (name: string): name is MultiLang => {
+ return mlang.some((value) => value === name);
+};
const AppMain: React.FC = () => {
const [cookies, setCookie] = useCookies();
- const [lang, setLang] = useState(["en", "ja"].includes(cookies.ml_lang) ? cookies.ml_lang : "en");
+ const typedCookies = cookies as Record;
+ const [lang, setLang] = React.useState(
+ isMultiLang(typedCookies?.ml_lang ?? '') ? (cookies.ml_lang as MultiLang) : 'en',
+ );
const location = useLocation();
- useEffect(() => {
- if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== "") {
- ReactGA.send("pageview");
- }
+ React.useEffect(() => {
const params = new URLSearchParams(location.search);
- const ml_lang = params.get("ml_lang");
- if (ml_lang != null && ["en", "ja"].includes(ml_lang)) {
+ const ml_lang = params.get('ml_lang');
+ if (ml_lang != null && ['en', 'ja'].includes(ml_lang)) {
if (cookies.ml_lang !== ml_lang) {
- setCookie("ml_lang", ml_lang);
+ setCookie('ml_lang', ml_lang);
}
if (lang !== ml_lang) {
setLang(ml_lang as MultiLang);
@@ -33,7 +39,7 @@ const AppMain: React.FC = () => {
};
const App: React.FC = () => {
- if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== "") {
+ if (Config.GOOGLE_ANALYTICS_TRACKING_ID.startsWith('G-')) {
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID);
}
diff --git a/src/common/AppRoot.tsx b/src/common/AppRoot.tsx
index 68a6429..48990be 100644
--- a/src/common/AppRoot.tsx
+++ b/src/common/AppRoot.tsx
@@ -1,13 +1,14 @@
-import React from "react";
-import { Helmet } from "react-helmet-async";
-import { Route, Routes, useLocation } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../config";
-import SiteIndex from "../custom/SiteIndex";
-import Functions from "../functions";
-import Footer from "./Footer";
-import Header from "./Header";
-import PageNotFound from "./lib/PageNotFound";
-import MainContent from "./MainContent";
+import React from 'react';
+
+import { Helmet } from 'react-helmet-async';
+import { Route, Routes, useLocation } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../config';
+import SiteIndex from '../custom/SiteIndex';
+import Functions from '../functions';
+import Footer from './Footer';
+import Header from './Header';
+import MainContent from './MainContent';
+import PageNotFound from './lib/PageNotFound';
interface Props {
lang: MultiLang;
@@ -19,7 +20,7 @@ interface PropsMain extends Props {
isLink: boolean;
}
-const PageMain: React.FC = (props: PropsMain) => {
+const PageMain: React.FC = (props) => {
const { lang, type, isHtml, isLink } = props;
return (
<>
@@ -32,10 +33,12 @@ const PageMain: React.FC = (props: PropsMain) => {
);
};
-const AppRoot: React.FC = (props: Props) => {
+const AppRoot: React.FC = (props) => {
const { lang } = props;
const location = useLocation();
- const match = location.pathname.match(/^\/(degu|jm|marmoset)(?:\/|$|(?:_(html)(?:\/$|$|\/(link\.html$))))/);
+ const match = location.pathname.match(
+ /^\/(degu|jm|marmoset)(?:\/|$|(?:_(html)(?:\/$|$|\/(link\.html$))))/,
+ );
const isHtml = match !== null ? typeof match[2] !== 'undefined' : false;
const isLink = match !== null ? typeof match[3] !== 'undefined' : false;
@@ -48,12 +51,30 @@ const AppRoot: React.FC = (props: Props) => {
} />
- } />
- } />
- } />
- } />
- } />
- } />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
} />
diff --git a/src/common/Footer.tsx b/src/common/Footer.tsx
index f559a96..905162b 100644
--- a/src/common/Footer.tsx
+++ b/src/common/Footer.tsx
@@ -1,6 +1,7 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../config";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../config';
interface Props {
lang: MultiLang;
@@ -8,25 +9,40 @@ interface Props {
isLink: boolean;
}
-const Footer: React.FC = (props: Props) => {
+const Footer: React.FC = (props) => {
const { type, isLink } = props;
return (
- {type === "marmoset" ? Copyright (C) 2018 Laboratory for Symbolic Cognitive Development, RIKEN Center for Biosystems Dynamics Research.
: Copyright (C) 2017 BSI-NI Project & Laboratory for Symbolic Cognitive Development, RIKEN Brain Science Insititute.
}
+ {type === 'marmoset' ? (
+
+ Copyright (C) 2018 Laboratory for Symbolic Cognitive Development, RIKEN Center for
+ Biosystems Dynamics Research.
+
+ ) : (
+
+ Copyright (C) 2017 BSI-NI Project & Laboratory for Symbolic Cognitive Development,
+ RIKEN Brain Science Insititute.
+
+ )}
);
};
diff --git a/src/common/Header.tsx b/src/common/Header.tsx
index 270f182..3a43577 100644
--- a/src/common/Header.tsx
+++ b/src/common/Header.tsx
@@ -1,58 +1,59 @@
-import React from "react";
-import { Helmet } from "react-helmet-async";
-import { Link, useLocation } from "react-router-dom";
-import Config, { BrainAtlasType, MultiLang } from "../config";
+import React from 'react';
+
+import { Helmet } from 'react-helmet-async';
+import { Link, useLocation } from 'react-router-dom';
+import Config, { BrainAtlasType, MultiLang } from '../config';
interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-type HeaderType = BrainAtlasType | "marmoset_3d" | "marmoset_std";
+type HeaderType = BrainAtlasType | 'marmoset_3d' | 'marmoset_std';
const titles = {
- degu: "Degu - 3D Brain Atlas",
- jm: "Japanese Macaque Monkey - the MRI Standard Brain",
- marmoset: "Marmoset",
- marmoset_3d: "Marmoset - 3D Brain Atlas",
- marmoset_std: "Marmoset - the MRI Standard Brain",
+ degu: 'Degu - 3D Brain Atlas',
+ jm: 'Japanese Macaque Monkey - the MRI Standard Brain',
+ marmoset: 'Marmoset',
+ marmoset_3d: 'Marmoset - 3D Brain Atlas',
+ marmoset_std: 'Marmoset - the MRI Standard Brain',
};
const urls = {
- degu: "/degu/modules/xoonips/listitem.php?index_id=24",
- jm: "/jm/modules/xoonips/listitem.php?index_id=9",
- marmoset: "/marmoset_html/",
- marmoset_3d: "/marmoset/modules/xoonips/listitem.php?index_id=66",
- marmoset_std: "/marmoset/modules/xoonips/listitem.php?index_id=71",
+ degu: '/degu/modules/xoonips/listitem.php?index_id=24',
+ jm: '/jm/modules/xoonips/listitem.php?index_id=9',
+ marmoset: '/marmoset_html/',
+ marmoset_3d: '/marmoset/modules/xoonips/listitem.php?index_id=66',
+ marmoset_std: '/marmoset/modules/xoonips/listitem.php?index_id=71',
};
const getHeaderType = (type: BrainAtlasType, pathname: string, search: string): HeaderType => {
- if (type === "marmoset") {
+ if (type === 'marmoset') {
const params = new URLSearchParams(search);
switch (pathname) {
- case "/marmoset/modules/xoonips/listitem.php": {
- const index_id = params.get("index_id") || "3";
- if (["66", "69"].includes(index_id)) {
- return "marmoset_3d";
+ case '/marmoset/modules/xoonips/listitem.php': {
+ const index_id = params.get('index_id') ?? '3';
+ if (['66', '69'].includes(index_id)) {
+ return 'marmoset_3d';
}
- if (["71", "73"].includes(index_id)) {
- return "marmoset_std";
+ if (['71', '73'].includes(index_id)) {
+ return 'marmoset_std';
}
break;
}
- case "/marmoset/modules/xoonips/detail.php": {
- const item_id = params.get("item_id") || "";
- if (["77", "75", "79", "80"].includes(item_id)) {
- return "marmoset_3d";
+ case '/marmoset/modules/xoonips/detail.php': {
+ const item_id = params.get('item_id') ?? '';
+ if (['77', '75', '79', '80'].includes(item_id)) {
+ return 'marmoset_3d';
}
- if (["72"].includes(item_id)) {
- return "marmoset_std";
+ if (['72'].includes(item_id)) {
+ return 'marmoset_std';
}
- const id = params.get("id") || "";
- if (["Marmoset02", "Marmoset04", "Marmoset05", "Marmoset06"].includes(id)) {
- return "marmoset_3d";
+ const id = params.get('id') ?? '';
+ if (['Marmoset02', 'Marmoset04', 'Marmoset05', 'Marmoset06'].includes(id)) {
+ return 'marmoset_3d';
}
- if (["004"].includes(id)) {
- return "marmoset_std";
+ if (['004'].includes(id)) {
+ return 'marmoset_std';
}
break;
}
@@ -61,19 +62,19 @@ const getHeaderType = (type: BrainAtlasType, pathname: string, search: string):
return type;
};
-const Header: React.FC = (props: Props) => {
+const Header: React.FC = (props) => {
const { lang, type } = props;
const location = useLocation();
const { pathname, search } = location;
const params = new URLSearchParams(search);
- params.set("ml_lang", lang === "en" ? "ja" : "en");
- const langUrl = location.pathname + "?" + params.toString();
- const langLabel = lang === "en" ? "To Japanese" : "To English";
- const xtype = getHeaderType(type, pathname, search);
- const title = Config.SITE_TITLE + " " + titles[xtype];
- const url = urls[xtype];
+ params.set('ml_lang', lang === 'en' ? 'ja' : 'en');
+ const langUrl = `${location.pathname}?${params.toString()}`;
+ const langLabel = lang === 'en' ? 'To Japanese' : 'To English';
+ const hType = getHeaderType(type, pathname, search);
+ const title = Config.SITE_TITLE + ' ' + titles[hType];
+ const url = urls[hType];
return (
-
+
{title}
diff --git a/src/common/MainContent.tsx b/src/common/MainContent.tsx
index e1f4a86..ffa7059 100644
--- a/src/common/MainContent.tsx
+++ b/src/common/MainContent.tsx
@@ -1,11 +1,12 @@
-import React from "react";
-import { Route, Routes } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../config";
-import CoverPage from "../custom/CoverPage";
-import RelatedLink from "../custom/RelatedLink";
-import Database from "../database/Database";
-import DatabaseTop from "../database/DatabaseTop";
-import XoopsPathRedirect from "./XoopsPathRedirect";
+import React from 'react';
+
+import { Route, Routes } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../config';
+import CoverPage from '../custom/CoverPage';
+import RelatedLink from '../custom/RelatedLink';
+import Database from '../database/Database';
+import DatabaseTop from '../database/DatabaseTop';
+import XoopsPathRedirect from './XoopsPathRedirect';
interface Props {
lang: MultiLang;
@@ -14,7 +15,7 @@ interface Props {
isLink: boolean;
}
-const MainContent: React.FC = (props: Props) => {
+const MainContent: React.FC = (props) => {
const { lang, type, isHtml, isLink } = props;
return (
diff --git a/src/common/XoopsPathRedirect.tsx b/src/common/XoopsPathRedirect.tsx
index dd960ff..7a5132d 100644
--- a/src/common/XoopsPathRedirect.tsx
+++ b/src/common/XoopsPathRedirect.tsx
@@ -1,26 +1,27 @@
-import React from "react";
-import { Navigate, useLocation } from "react-router-dom";
-import { MultiLang } from "../config";
-import PageNotFound from "./lib/PageNotFound";
+import React from 'react';
+
+import { Navigate, useLocation } from 'react-router-dom';
+import { MultiLang } from '../config';
+import PageNotFound from './lib/PageNotFound';
interface Props {
lang: MultiLang;
}
-const XoopsPathRedirect: React.FC
= (props: Props) => {
+const XoopsPathRedirect: React.FC = (props) => {
const { lang } = props;
const location = useLocation();
const { pathname } = location;
const getRedirectUrl = () => {
- switch (pathname || "") {
- case "/index.php": {
- return "/";
+ switch (pathname || '') {
+ case '/index.php': {
+ return '/';
}
}
- return "";
+ return '';
};
const url = getRedirectUrl();
- if (url === "") {
+ if (url === '') {
return ;
}
return ;
diff --git a/src/common/assets/main-menu.json b/src/common/assets/main-menu.json
index aecb24c..11d093c 100644
--- a/src/common/assets/main-menu.json
+++ b/src/common/assets/main-menu.json
@@ -1,38 +1,38 @@
[
- {
- "title": "[en]Home[/en][ja]ホーム[/ja]",
- "link": "/"
- },
- {
- "title": "[en]About \"Dynamic Brain\"[/en][ja]\"Dynamic Brain\"とは[/ja]",
- "link": "/documents/concept.html"
- },
- {
- "title": "[en]Articles[/en][ja]特集記事[/ja]",
- "link": "/mediawiki/"
- },
- {
- "title": "[en]Academic Conferences[/en][ja]学術会議[/ja]",
- "link": "/mediawiki/Academic_conferences"
- },
- {
- "title": "[en]Collaborative Projects[/en][ja]連携プロジェクト[/ja]",
- "link": "/mediawiki/Collaborative_Projects"
- },
- {
- "title": "[en]Collaborative Hackathon[/en][ja]連携ハッカソン[/ja]",
- "link": "/mediawiki/Hackathon_Page"
- },
- {
- "title": "[en]Models[/en][ja]数理モデル[/ja]",
- "link": "/database/search/itemtype/model"
- },
- {
- "title": "[en]How to get \"PhysioDesigner\"[/en][ja]PhysioDesignerダウンロード[/ja]",
- "link": "http://physiodesigner.org/download/"
- },
- {
- "title": "[en]See more...[/en][ja]更に見る...[/ja]",
- "link": "/database"
- }
+ {
+ "title": "[en]Home[/en][ja]ホーム[/ja]",
+ "link": "/"
+ },
+ {
+ "title": "[en]About \"Dynamic Brain\"[/en][ja]\"Dynamic Brain\"とは[/ja]",
+ "link": "/documents/concept.html"
+ },
+ {
+ "title": "[en]Articles[/en][ja]特集記事[/ja]",
+ "link": "/mediawiki/"
+ },
+ {
+ "title": "[en]Academic Conferences[/en][ja]学術会議[/ja]",
+ "link": "/mediawiki/Academic_conferences"
+ },
+ {
+ "title": "[en]Collaborative Projects[/en][ja]連携プロジェクト[/ja]",
+ "link": "/mediawiki/Collaborative_Projects"
+ },
+ {
+ "title": "[en]Collaborative Hackathon[/en][ja]連携ハッカソン[/ja]",
+ "link": "/mediawiki/Hackathon_Page"
+ },
+ {
+ "title": "[en]Models[/en][ja]数理モデル[/ja]",
+ "link": "/database/search/itemtype/model"
+ },
+ {
+ "title": "[en]How to get \"PhysioDesigner\"[/en][ja]PhysioDesignerダウンロード[/ja]",
+ "link": "http://physiodesigner.org/download/"
+ },
+ {
+ "title": "[en]See more...[/en][ja]更に見る...[/ja]",
+ "link": "/database"
+ }
]
diff --git a/src/common/assets/theme/style.css b/src/common/assets/theme/style.css
index ac556a5..2c7ea7e 100644
--- a/src/common/assets/theme/style.css
+++ b/src/common/assets/theme/style.css
@@ -141,7 +141,7 @@ tr.even:hover {
}
.clearfix::after {
- content: "";
+ content: '';
display: block;
clear: both;
}
diff --git a/src/common/assets/xoops.css b/src/common/assets/xoops.css
index 88f768a..4bdb3bb 100644
--- a/src/common/assets/xoops.css
+++ b/src/common/assets/xoops.css
@@ -1,17 +1,62 @@
-img {border: 0;}
-
-#xoopsHiddenText {visibility: hidden; color: #000000; font-weight: normal; font-style: normal; text-decoration: none;}
-
-.pagneutral {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagneutral.gif);}
-.pagact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagact.gif);}
-.paginact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/paginact.gif);}
-
-
-#mainmenu a {text-align:left; display: block; margin: 0; padding: 4px;}
-#mainmenu a.menuTop {padding-left: 3px;}
-#mainmenu a.menuMain {padding-left: 3px;}
-#mainmenu a.menuSub {padding-left: 9px;}
-
-#usermenu a {text-align:left; display: block; margin: 0; padding: 4px;}
-#usermenu a.menuTop {}
-#usermenu a.highlight {color: #0000ff; background-color: #fcc;}
+img {
+ border: 0;
+}
+
+#xoopsHiddenText {
+ visibility: hidden;
+ color: #000000;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: none;
+}
+
+.pagneutral {
+ font-size: 10px;
+ width: 16px;
+ height: 19px;
+ text-align: center;
+ background-image: url(./images/pagneutral.gif);
+}
+.pagact {
+ font-size: 10px;
+ width: 16px;
+ height: 19px;
+ text-align: center;
+ background-image: url(./images/pagact.gif);
+}
+.paginact {
+ font-size: 10px;
+ width: 16px;
+ height: 19px;
+ text-align: center;
+ background-image: url(./images/paginact.gif);
+}
+
+#mainmenu a {
+ text-align: left;
+ display: block;
+ margin: 0;
+ padding: 4px;
+}
+#mainmenu a.menuTop {
+ padding-left: 3px;
+}
+#mainmenu a.menuMain {
+ padding-left: 3px;
+}
+#mainmenu a.menuSub {
+ padding-left: 9px;
+}
+
+#usermenu a {
+ text-align: left;
+ display: block;
+ margin: 0;
+ padding: 4px;
+}
+#usermenu a.menuTop {
+}
+#usermenu a.highlight {
+ color: #0000ff;
+ background-color: #fcc;
+}
diff --git a/src/common/lib/LinkImage.tsx b/src/common/lib/LinkImage.tsx
index 19d48ba..5d420ea 100644
--- a/src/common/lib/LinkImage.tsx
+++ b/src/common/lib/LinkImage.tsx
@@ -1,5 +1,6 @@
-import React, { Component } from "react";
-import { Link } from "react-router-dom";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
interface Props {
url: string;
@@ -8,50 +9,40 @@ interface Props {
imageHover?: string;
}
-interface State {
- image: string;
-}
+const LinkImage: React.FC = (props) => {
+ const { url, title, image: imageNormal, imageHover } = props;
+ const [image, setImage] = React.useState(imageNormal);
-class LinkImage extends Component {
- constructor(props: Props) {
- super(props);
- this.state = {
- image: props.image,
- };
- this.handleMouseOver = this.handleMouseOver.bind(this);
- this.handleMouseOut = this.handleMouseOut.bind(this);
- }
-
- handleMouseOver() {
- const { imageHover } = this.props;
- if (typeof imageHover !== "undefined") {
- this.setState({ image: imageHover });
+ const handleMouseOver = () => {
+ if (imageHover != null) {
+ setImage(imageHover);
}
- }
+ };
- handleMouseOut() {
- const { image: imageNormal, imageHover } = this.props;
- if (typeof imageHover !== "undefined") {
- this.setState({ image: imageNormal });
+ const handleMouseOut = () => {
+ if (imageHover != null) {
+ setImage(imageNormal);
}
- }
+ };
- render() {
- const { url, title } = this.props;
- const image = ;
- if (url.match(/^(\/|\.)/) === null) {
- return (
-
- {image}
-
- );
- }
+ if (url.match(/^(\/|\.)/) === null) {
return (
-
+
{image}
-
+
);
}
-}
+ return (
+
+
+
+ );
+};
export default LinkImage;
diff --git a/src/common/lib/Loading.tsx b/src/common/lib/Loading.tsx
index 6020bfb..30f90a4 100644
--- a/src/common/lib/Loading.tsx
+++ b/src/common/lib/Loading.tsx
@@ -1,10 +1,18 @@
-import React from "react";
-import Spinner from "react-spinner-material";
+import React from 'react';
+
+import Spinner from 'react-spinner-material';
const Loading: React.FC = () => {
return (
-
-
+
+
);
};
diff --git a/src/common/lib/NoticeSiteHasBeenArchived.tsx b/src/common/lib/NoticeSiteHasBeenArchived.tsx
index c89fe5b..054ab8d 100644
--- a/src/common/lib/NoticeSiteHasBeenArchived.tsx
+++ b/src/common/lib/NoticeSiteHasBeenArchived.tsx
@@ -1,15 +1,17 @@
-import React from "react";
-import { MultiLang } from "../../config";
-import Functions from "../../functions";
+import React from 'react';
+
+import { MultiLang } from '../../config';
+import Functions from '../../functions';
interface Props {
lang: MultiLang;
}
-const NoticeSiteHasBeenArchived: React.FC
= (props: Props) => {
+const NoticeSiteHasBeenArchived: React.FC = (props) => {
const { lang } = props;
- const notice = "[en]This site has been archived since FY2019 and is no longer updated.[/en][ja]このサイトは、2019年度よりアーカイブサイトとして運用されています。[/ja]";
- return {Functions.mlang(notice, lang)}
;
+ const notice =
+ '[en]This site has been archived since FY2019 and is no longer updated.[/en][ja]このサイトは、2019年度よりアーカイブサイトとして運用されています。[/ja]';
+ return {Functions.mlang(notice, lang)}
;
};
export default NoticeSiteHasBeenArchived;
diff --git a/src/common/lib/PageNotFound.tsx b/src/common/lib/PageNotFound.tsx
index de981dd..dde163d 100644
--- a/src/common/lib/PageNotFound.tsx
+++ b/src/common/lib/PageNotFound.tsx
@@ -1,8 +1,8 @@
-import React, { useEffect } from "react";
-import { Helmet } from "react-helmet-async";
-import { useLocation, useNavigate } from "react-router-dom";
-import { MultiLang } from "../../config";
-import Functions from "../../functions";
+import React from 'react';
+
+import { Helmet } from 'react-helmet-async';
+import { MultiLang } from '../../config';
+import Functions from '../../functions';
interface Props {
lang: MultiLang;
@@ -10,26 +10,7 @@ interface Props {
const PageNotFound: React.FC = (props) => {
const { lang } = props;
- const location = useLocation();
- const navigate = useNavigate();
- const url = "/";
-
- useEffect(() => {
- let timer: NodeJS.Timeout | null = null;
- if (location.pathname !== "/" && process.env.NODE_ENV === 'production') {
- if (timer === null) {
- timer = setTimeout(() => {
- navigate(url);
- }, 5000);
- }
- }
- return () => {
- if (timer !== null) {
- clearTimeout(timer);
- timer = null;
- }
- };
- }, [location, navigate]);
+ const url = '/';
return (
@@ -38,7 +19,7 @@ const PageNotFound: React.FC
= (props) => {
Page Not Found
- The page you were trying to access doesn't exist.
+ The page you were trying to access doesn't exist.
If the page does not automatically reload, please click here
diff --git a/src/common/lib/UserRankStarImage.tsx b/src/common/lib/UserRankStarImage.tsx
index acba8d9..ec30bca 100644
--- a/src/common/lib/UserRankStarImage.tsx
+++ b/src/common/lib/UserRankStarImage.tsx
@@ -1,13 +1,15 @@
-import React from "react";
-import { MultiLang } from "../../config";
-import Functions from "../../functions";
-import imageRank2 from "../assets/images/rank3dbf8e94a6f72.gif";
-import imageRank3 from "../assets/images/rank3dbf8e9e7d88d.gif";
-import imageRank4 from "../assets/images/rank3dbf8ea81e642.gif";
-import imageRank5 from "../assets/images/rank3dbf8eb1a72e7.gif";
-import imageRank6 from "../assets/images/rank3dbf8edf15093.gif";
-import imageRank7 from "../assets/images/rank3dbf8ee8681cd.gif";
-import imageRank1 from "../assets/images/rank3e632f95e81ca.gif";
+import React from 'react';
+
+import { MultiLang } from '../../config';
+import Functions from '../../functions';
+
+import imageRank2 from '../assets/images/rank3dbf8e94a6f72.gif';
+import imageRank3 from '../assets/images/rank3dbf8e9e7d88d.gif';
+import imageRank4 from '../assets/images/rank3dbf8ea81e642.gif';
+import imageRank5 from '../assets/images/rank3dbf8eb1a72e7.gif';
+import imageRank6 from '../assets/images/rank3dbf8edf15093.gif';
+import imageRank7 from '../assets/images/rank3dbf8ee8681cd.gif';
+import imageRank1 from '../assets/images/rank3e632f95e81ca.gif';
interface Props {
lang: MultiLang;
@@ -16,16 +18,52 @@ interface Props {
}
const userRanks = [
- { title: "[en]Just popping in[/en][ja]新米[/ja]", min: 0, max: 20, special: false, image: imageRank1 },
- { title: "[en]Not too shy to talk[/en][ja]半人前[/ja]", min: 21, max: 40, special: false, image: imageRank2 },
- { title: "[en]Quite a regular[/en][ja]常連[/ja]", min: 41, max: 70, special: false, image: imageRank3 },
- { title: "[en]Just can't stay away[/en][ja]一人前[/ja]", min: 71, max: 150, special: false, image: imageRank4 },
- { title: "[en]Home away from home[/en][ja]長老[/ja]", min: 151, max: 10000, special: false, image: imageRank5 },
- { title: "[en]Moderator[/en][ja]モデレータ[/ja]", min: 0, max: 0, special: true, image: imageRank6 },
- { title: "[en]Webmaster[/en][ja]管理人[/ja]", min: 0, max: 0, special: true, image: imageRank7 },
+ {
+ title: '[en]Just popping in[/en][ja]新米[/ja]',
+ min: 0,
+ max: 20,
+ special: false,
+ image: imageRank1,
+ },
+ {
+ title: '[en]Not too shy to talk[/en][ja]半人前[/ja]',
+ min: 21,
+ max: 40,
+ special: false,
+ image: imageRank2,
+ },
+ {
+ title: '[en]Quite a regular[/en][ja]常連[/ja]',
+ min: 41,
+ max: 70,
+ special: false,
+ image: imageRank3,
+ },
+ {
+ title: "[en]Just can't stay away[/en][ja]一人前[/ja]",
+ min: 71,
+ max: 150,
+ special: false,
+ image: imageRank4,
+ },
+ {
+ title: '[en]Home away from home[/en][ja]長老[/ja]',
+ min: 151,
+ max: 10000,
+ special: false,
+ image: imageRank5,
+ },
+ {
+ title: '[en]Moderator[/en][ja]モデレータ[/ja]',
+ min: 0,
+ max: 0,
+ special: true,
+ image: imageRank6,
+ },
+ { title: '[en]Webmaster[/en][ja]管理人[/ja]', min: 0, max: 0, special: true, image: imageRank7 },
];
-const UserRankStarImage: React.FC = (props: Props) => {
+const UserRankStarImage: React.FC = (props) => {
const { lang, rank, posts } = props;
const findRank = (posts: number) => {
const rank = userRanks.find((userRank) => {
@@ -34,7 +72,7 @@ const UserRankStarImage: React.FC = (props: Props) => {
}
return false;
});
- return typeof rank !== "undefined" ? rank : userRanks[0];
+ return typeof rank !== 'undefined' ? rank : userRanks[0];
};
const userRank = rank > 0 && rank <= 7 ? userRanks[rank - 1] : findRank(posts);
const title = Functions.mlang(userRank.title, lang);
diff --git a/src/common/lib/XoopsCode.tsx b/src/common/lib/XoopsCode.tsx
index c754794..c7b0ab4 100644
--- a/src/common/lib/XoopsCode.tsx
+++ b/src/common/lib/XoopsCode.tsx
@@ -1,8 +1,15 @@
-import ReactHtmlParser, { convertNodeToElement, DomElement, DomNode, Transform } from "@orrisroot/react-html-parser";
-import React from "react";
-import { HashLink } from "react-router-hash-link";
-import { MultiLang } from "../../config";
-import Functions from "../../functions";
+import React from 'react';
+
+import ReactHtmlParser, {
+ convertNodeToElement,
+ DomElement,
+ DomNode,
+ Transform,
+} from '@orrisroot/react-html-parser';
+import { ElementType } from 'htmlparser2';
+import { HashLink } from 'react-router-hash-link';
+import { MultiLang } from '../../config';
+import Functions from '../../functions';
interface Props {
lang: MultiLang;
@@ -16,8 +23,8 @@ interface Props {
const preConvertXCode = (text: string, doxcode: boolean): string => {
if (doxcode) {
- return text.replace(/\[code\](.*)\[\/code\]/gs, (m0, m1) => {
- return "[code]" + Functions.base64Encode(m1) + "[/code]";
+ return text.replace(/\[code\](.*)\[\/code\]/gs, (_: string, m1: string) => {
+ return '[code]' + Functions.base64Encode(m1) + '[/code]';
});
}
return text;
@@ -25,26 +32,42 @@ const preConvertXCode = (text: string, doxcode: boolean): string => {
const postConvertXCode = (text: string, doxcode: boolean, doimage: boolean): string => {
if (doxcode) {
- return text.replace(/\[code\](.*)\[\/code\]/gs, (m0, m1) => {
+ return text.replace(/\[code\](.*)\[\/code\]/gs, (_: string, m1: string) => {
const text = convertXCode(Functions.htmlspecialchars(Functions.base64Decode(m1)), doimage);
- return '";
+ return '';
});
}
return text;
};
const convertClickable = (text: string) => {
- text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/]+)((?:https?|ftp)(?::\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+[a-zA-Z0-9=]))/g, (...matches) => {
- return matches[1] + '' + matches[2] + " ";
- });
- text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/:.]+)([a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)/g, (...matches) => {
- return matches[1] + '' + matches[2] + " ";
- });
+ text = text.replace(
+ /(^|[^\]_a-zA-Z0-9-="'/]+)((?:https?|ftp)(?::\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+[a-zA-Z0-9=]))/g,
+ (...matches) => {
+ return (
+ matches[1] +
+ '' +
+ matches[2] +
+ ' '
+ );
+ },
+ );
+ text = text.replace(
+ /(^|[^\]_a-zA-Z0-9-="'/:.]+)([a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)/g,
+ (...matches) => {
+ return matches[1] + '' + matches[2] + ' ';
+ },
+ );
return text;
};
const convertXCode = (text: string, doimage: boolean): string => {
// TODO: implement
+ if (doimage) {
+ return text;
+ }
return text;
};
@@ -54,17 +77,17 @@ const convertSmiley = (text: string) => {
};
const convertBr = (text: string): string => {
- return text.replace(/(\r?\n|\r)/g, " ");
+ return text.replace(/(\r?\n|\r)/g, ' ');
};
-const cssConvert = (text: string): object => {
- const ret: any = {};
- text.split(";").forEach((line) => {
+const cssConvert = (text: string): Record => {
+ const ret: Record = {};
+ text.split(';').forEach((line) => {
const line_ = line.trim();
if (line.length === 0) {
return;
}
- const kv = line_.split(":");
+ const kv = line_.split(':');
const key = Functions.camelCase(kv[0].trim());
const value = kv[1].trim();
ret[key] = value;
@@ -72,19 +95,24 @@ const cssConvert = (text: string): object => {
return ret;
};
-const xoopsTransform: Transform = (node: DomNode, index: number | string, transform?: Transform): React.ReactNode => {
- if (node.type === "tag") {
+const xoopsTransform: Transform = (
+ node: DomNode,
+ index: number | string,
+ transform?: Transform,
+): React.ReactNode => {
+ if (node.type === ElementType.Tag) {
const node_ = node as DomElement;
- if (node_.name === "a") {
- const url = node_.attribs?.["href"] || "/";
- const download = (node_.attribs && node_.attribs["download"]) || "";
- const rel = (node_.attribs && node_.attribs["rel"]) || "";
- const klass = (node_.attribs && node_.attribs["class"]) || "";
- const isFile = download !== "" || /\.(zip|pdf|png|gif|jpg)$/.test(url);
- const isExternal = /external/.test(rel) || /external/.test(klass) || /^(mailto|https?:?\/\/)/.test(url);
+ if (node_.name === 'a') {
+ const url = node_.attribs?.href ?? '/';
+ const download = node_.attribs?.download ?? '';
+ const rel = node_.attribs?.rel ?? '';
+ const className = node_.attribs?.class ?? '';
+ const isFile = download !== '' || /\.(zip|pdf|png|gif|jpg)$/.test(url);
+ const isExternal =
+ /external/.test(rel) || /external/.test(className) || /^(mailto|https?:?\/\/)/.test(url);
if (!isFile && !isExternal) {
- const style = node_.attribs?.["style"] || "";
- const title = node_.attribs?.["title"];
+ const style = node_.attribs?.style || '';
+ const title = node_.attribs?.title;
return (
{node_.children.map((value: DomNode, index: number) => {
@@ -94,15 +122,15 @@ const xoopsTransform: Transform = (node: DomNode, index: number | string, transf
);
}
}
- if (node_.name === "img") {
- const src = (node_.attribs && node_.attribs["src"]) || "";
- node_.attribs["src"] = src.replace("`XOOPS_URL`", process.env.PUBLIC_URL);
+ if (node_.name === 'img') {
+ const src = node_.attribs?.src ?? '';
+ node_.attribs.src = src.replace('`XOOPS_URL`', '/');
return convertNodeToElement(node_, index, transform);
}
}
};
-const XoopsCode: React.FC = (props: Props) => {
+const XoopsCode: React.FC = (props) => {
const { lang } = props;
let text = props.text;
const dohtml = !!props.dohtml;
diff --git a/src/config.ts b/src/config.ts
index 2828022..f98b07d 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -1,12 +1,12 @@
-const SITE_TITLE = "BSI-NI Brain Atlas";
-const SITE_SLOGAN = "Welcome to BRAIN ATLAS";
-const GOOGLE_ANALYTICS_TRACKING_ID = "";
-const XOONIPS_ITEMTYPES = ["files", "url", "paper", "book"];
+const SITE_TITLE = 'BSI-NI Brain Atlas';
+const SITE_SLOGAN = 'Welcome to BRAIN ATLAS';
+const GOOGLE_ANALYTICS_TRACKING_ID = '';
+const XOONIPS_ITEMTYPES = ['files', 'url', 'paper', 'book'];
-export type MultiLang = "en" | "ja";
+export type MultiLang = 'en' | 'ja';
-export type BrainAtlasType = "degu" | "jm" | "marmoset";
-export const BrainAtlasTypes: ReadonlyArray = ["degu", "jm", "marmoset"];
+export type BrainAtlasType = 'degu' | 'jm' | 'marmoset';
+export const BrainAtlasTypes: readonly BrainAtlasType[] = ['degu', 'jm', 'marmoset'];
const Config = {
SITE_TITLE,
diff --git a/src/custom/CoverPage.tsx b/src/custom/CoverPage.tsx
index 344597e..a90df51 100644
--- a/src/custom/CoverPage.tsx
+++ b/src/custom/CoverPage.tsx
@@ -1,21 +1,25 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import PageNotFound from "../common/lib/PageNotFound";
-import { BrainAtlasType, MultiLang } from "../config";
-import styles from "./CoverPage.module.css";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import PageNotFound from '../common/lib/PageNotFound';
+import { BrainAtlasType, MultiLang } from '../config';
+import styles from './CoverPage.module.css';
interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-const CoverPage: React.FC = (props: Props) => {
+const CoverPage: React.FC = (props) => {
const { lang, type } = props;
const links = [
- { title: "Marmoset-3D Brain Atlas", url: "/marmoset/modules/xoonips/listitem.php?index_id=66" },
- { title: "Marmoset-the MRI Standard Brain", url: "/marmoset/modules/xoonips/listitem.php?index_id=71" },
+ { title: 'Marmoset-3D Brain Atlas', url: '/marmoset/modules/xoonips/listitem.php?index_id=66' },
+ {
+ title: 'Marmoset-the MRI Standard Brain',
+ url: '/marmoset/modules/xoonips/listitem.php?index_id=71',
+ },
];
- if (type !== "marmoset") {
+ if (type !== 'marmoset') {
return ;
}
return (
diff --git a/src/custom/RelatedLink.tsx b/src/custom/RelatedLink.tsx
index dc1e1b0..621fc85 100644
--- a/src/custom/RelatedLink.tsx
+++ b/src/custom/RelatedLink.tsx
@@ -1,22 +1,29 @@
-import React from "react";
-import { BrainAtlasType, MultiLang } from "../config";
-import styles from "./RelatedLink.module.css";
+import React from 'react';
+
+import { BrainAtlasType, MultiLang } from '../config';
+import styles from './RelatedLink.module.css';
interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-const RelatedLink: React.FC = (props: Props) => {
+const RelatedLink: React.FC = (props) => {
const { type } = props;
const links = {
- degu: [{ title: "RIKEN BSI", url: "http://www.brain.riken.jp/" }],
- jm: [{ title: "RIKEN BSI", url: "http://www.brain.riken.jp/" }],
+ degu: [{ title: 'RIKEN BSI', url: 'http://www.brain.riken.jp/' }],
+ jm: [{ title: 'RIKEN BSI', url: 'http://www.brain.riken.jp/' }],
marmoset: [
- { title: "RIKEN BSI", url: "http://www.brain.riken.jp/" },
- { title: "Keio-RIKEN Research centre for Human Congnition", url: "http://human-cognition.keio.ac.jp/english/" },
- { title: "FIRST project", url: "http://www.brain.riken.jp/first-okano/en/index.html" },
- { title: "Press release", url: "http://www.brain.riken.jp/first-okano/en/achievements/2010/papers.html" },
+ { title: 'RIKEN BSI', url: 'http://www.brain.riken.jp/' },
+ {
+ title: 'Keio-RIKEN Research centre for Human Cognition',
+ url: 'http://human-cognition.keio.ac.jp/english/',
+ },
+ { title: 'FIRST project', url: 'http://www.brain.riken.jp/first-okano/en/index.html' },
+ {
+ title: 'Press release',
+ url: 'http://www.brain.riken.jp/first-okano/en/achievements/2010/papers.html',
+ },
],
};
return (
diff --git a/src/custom/SiteIndex.tsx b/src/custom/SiteIndex.tsx
index 5a43edf..f8e7616 100644
--- a/src/custom/SiteIndex.tsx
+++ b/src/custom/SiteIndex.tsx
@@ -1,14 +1,15 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import NoticeSiteHasBeenArchived from "../common/lib/NoticeSiteHasBeenArchived";
-import { MultiLang } from "../config";
-import styles from "./SiteIndex.module.css";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived';
+import { MultiLang } from '../config';
+import styles from './SiteIndex.module.css';
interface Props {
lang: MultiLang;
}
-const SiteIndex: React.FC = (props: Props) => {
+const SiteIndex: React.FC = (props) => {
const { lang } = props;
return (
@@ -29,7 +30,10 @@ const SiteIndex: React.FC
= (props: Props) => {
-
+
Japanese Macaque Monkey
diff --git a/src/database/Database.tsx b/src/database/Database.tsx
index 048c201..be90913 100644
--- a/src/database/Database.tsx
+++ b/src/database/Database.tsx
@@ -1,88 +1,102 @@
-import React from "react";
-import { Helmet } from "react-helmet-async";
-import { Route, Routes, useLocation } from "react-router-dom";
-import PageNotFound from "../common/lib/PageNotFound";
-import { BrainAtlasType, MultiLang } from "../config";
-import Functions from "../functions";
-import styles from "./Database.module.css";
-import DatabaseAdvancedSearch from "./DatabaseAdvancedSearch";
-import DatabaseDetailItem from "./DatabaseDetailItem";
-import DatabaseSearchByAdvancedKeyword from "./DatabaseSearchByAdvancedKeyword";
-import DatabaseSearchByIndexId from "./DatabaseSearchByIndexId";
-import DatabaseSearchByItemType from "./DatabaseSearchByItemType";
-import DatabaseSearchByKeyword from "./DatabaseSearchByKeyword";
-import DatabaseTop from "./DatabaseTop";
-import { INDEX_ID_PUBLIC } from "./lib/IndexUtil";
+import React from 'react';
+
+import { Helmet } from 'react-helmet-async';
+import { Route, Routes, useLocation } from 'react-router-dom';
+import PageNotFound from '../common/lib/PageNotFound';
+import { BrainAtlasType, MultiLang } from '../config';
+import Functions from '../functions';
+import styles from './Database.module.css';
+import DatabaseAdvancedSearch from './DatabaseAdvancedSearch';
+import DatabaseDetailItem from './DatabaseDetailItem';
+import DatabaseSearchByAdvancedKeyword from './DatabaseSearchByAdvancedKeyword';
+import DatabaseSearchByIndexId from './DatabaseSearchByIndexId';
+import DatabaseSearchByItemType from './DatabaseSearchByItemType';
+import DatabaseSearchByKeyword from './DatabaseSearchByKeyword';
+import DatabaseTop from './DatabaseTop';
+import { INDEX_ID_PUBLIC } from './lib/IndexUtil';
interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-const ItemDetail: React.FC = (props: Props) => {
+const ItemDetail: React.FC = (props) => {
const { lang, type } = props;
const location = useLocation();
const params = new URLSearchParams(location.search);
- const itemId_ = params.get("item_id") || "";
+ const itemId_ = params.get('item_id') ?? '';
const itemId = /^\d+$/.test(itemId_) ? parseInt(itemId_, 10) : 0;
- const doi = params.get("id") || "";
+ const doi = params.get('id') ?? '';
return ;
};
-const ItemList: React.FC = (props: Props) => {
+const ItemList: React.FC = (props) => {
const { lang, type } = props;
const location = useLocation();
const params = new URLSearchParams(location.search);
- const id = params.get("index_id") || "";
+ const id = params.get('index_id') ?? '';
const indexId = /^\d+$/.test(id) ? parseInt(id, 10) : INDEX_ID_PUBLIC;
return ;
};
-const ItemSelect: React.FC = (props: Props) => {
+const ItemSelect: React.FC = (props) => {
const { lang, type } = props;
const location = useLocation();
const params = new URLSearchParams(location.search);
- const op = params.get("op") || "";
+ const op = params.get('op') ?? '';
switch (op) {
- case "itemtypesearch": {
- const searchItemtype = params.get("search_itemtype") || "";
+ case 'itemtypesearch': {
+ const searchItemtype = params.get('search_itemtype') ?? '';
const match = searchItemtype.match(/^xnp([a-z]+)$/);
- const itemType = match !== null ? match[1] : "";
- return ;
+ const itemType = match !== null ? match[1] : '';
+ return (
+
+ );
}
- case "itemsubtypesearch": {
- const searchItemtype = params.get("search_itemtype") || "";
+ case 'itemsubtypesearch': {
+ const searchItemtype = params.get('search_itemtype') ?? '';
const match = searchItemtype.match(/^xnp([a-z]+)$/);
- const itemType = match !== null ? match[1] : "";
- const subItemtype = params.get("search_subitemtype") || "";
- return ;
+ const itemType = match !== null ? match[1] : '';
+ const subItemtype = params.get('search_subitemtype') ?? '';
+ return (
+
+ );
}
- case "quicksearch": {
+ case 'quicksearch': {
return ;
}
- case "advanced": {
+ case 'advanced': {
return ;
}
}
return ;
};
-const Database: React.FC = (props: Props) => {
+const Database: React.FC = (props) => {
const { lang, type } = props;
return (
- {Functions.mlang("[en]Database[/en][ja]データベース[/ja]", lang)} - {Functions.siteTitle(lang)}
+ {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} -{' '}
+ {Functions.siteTitle(lang)}
} />
- } />
+ } />
} />
} />
} />
- } />
+ }
+ />
} />
diff --git a/src/database/DatabaseAdvancedSearch.tsx b/src/database/DatabaseAdvancedSearch.tsx
index 4df913c..64d6a63 100644
--- a/src/database/DatabaseAdvancedSearch.tsx
+++ b/src/database/DatabaseAdvancedSearch.tsx
@@ -1,63 +1,47 @@
-import React from "react";
-import { useNavigate } from "react-router-dom";
-import Config, { BrainAtlasType, MultiLang } from "../config";
-import Functions from "../functions";
-import ItemType from "./item-type";
-import AdvancedSearchQuery from "./lib/AdvancedSearchQuery";
-import ItemUtil from "./lib/ItemUtil";
+import React from 'react';
-interface PropsFC {
+import { useNavigate } from 'react-router-dom';
+import Config, { BrainAtlasType, MultiLang } from '../config';
+import Functions from '../functions';
+import ItemType from './item-type';
+import AdvancedSearchQuery from './lib/AdvancedSearchQuery';
+import ItemUtil from './lib/ItemUtil';
+
+interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-interface Props extends PropsFC {
- navigate: any;
-}
+const DatabaseAdvancedSearch: React.FC = (props) => {
+ const { lang, type } = props;
+ const query = new AdvancedSearchQuery();
+ const navigate = useNavigate();
-class DatabaseAdvancedSearch extends React.Component {
- private query: AdvancedSearchQuery = new AdvancedSearchQuery();
-
- constructor(props: Props) {
- super(props);
- this.handleClickSearchButton = this.handleClickSearchButton.bind(this);
- }
-
- handleClickSearchButton() {
- const { type, navigate } = this.props;
- if (!this.query.empty()) {
- const url = ItemUtil.getSearchByAdvancedKeywordsUrl(type, this.query);
+ const handleClickSearchButton = () => {
+ if (!query.empty()) {
+ const url = ItemUtil.getSearchByAdvancedKeywordsUrl(type, query);
navigate(url);
}
- }
+ };
- render() {
- const { lang } = this.props;
-
- return (
-
-
{Functions.mlang("[en]Search Items[/en][ja]アイテム検索[/ja]", lang)}
-
-
- Search
-
-
- {Config.XOONIPS_ITEMTYPES.map((type) => {
- return
;
- })}
-
-
- Search
-
-
+ return (
+
+
{Functions.mlang('[en]Search Items[/en][ja]アイテム検索[/ja]', lang)}
+
+
+ Search
+
- );
- }
-}
-
-const DatabaseAdvancedSearchFC: React.FC
= (props: PropsFC) => {
- const { lang, type } = props;
- return ;
+ {Config.XOONIPS_ITEMTYPES.map((type) => {
+ return ;
+ })}
+
+
+ Search
+
+
+
+ );
};
-export default DatabaseAdvancedSearchFC;
+export default DatabaseAdvancedSearch;
diff --git a/src/database/DatabaseDetailItem.tsx b/src/database/DatabaseDetailItem.tsx
index 19ca508..13e1de2 100644
--- a/src/database/DatabaseDetailItem.tsx
+++ b/src/database/DatabaseDetailItem.tsx
@@ -1,11 +1,12 @@
-import React from "react";
-import { Helmet } from "react-helmet-async";
-import Loading from "../common/lib/Loading";
-import PageNotFound from "../common/lib/PageNotFound";
-import { BrainAtlasType, MultiLang } from "../config";
-import Functions from "../functions";
-import ItemType from "./item-type";
-import ItemUtil, { Item } from "./lib/ItemUtil";
+import React from 'react';
+
+import { Helmet } from 'react-helmet-async';
+import Loading from '../common/lib/Loading';
+import PageNotFound from '../common/lib/PageNotFound';
+import { BrainAtlasType, MultiLang } from '../config';
+import Functions from '../functions';
+import ItemType from './item-type';
+import ItemUtil, { Item } from './lib/ItemUtil';
interface Props {
lang: MultiLang;
@@ -14,65 +15,49 @@ interface Props {
doi: string;
}
-interface State {
- loading: boolean;
- item: Item | null;
-}
+const DatabaseDetailItem: React.FC
= (props) => {
+ const { lang, type, id, doi } = props;
-class DatabaseDetailItem extends React.Component {
- constructor(props: Props) {
- super(props);
- this.state = {
- loading: true,
- item: null,
- };
- }
+ const [loading, setLoading] = React.useState(true);
+ const [item, setItem] = React.useState- (null);
- componentDidMount() {
- this.updateItem();
- }
-
- componentDidUpdate(prevProps: Props, prevState: State) {
- const { id, doi } = this.props;
- if (id !== prevProps.id || doi !== prevProps.doi) {
- this.updateItem();
- }
- }
-
- updateItem() {
- const { id, doi, type } = this.props;
- if (doi !== "") {
+ React.useEffect(() => {
+ if (doi !== '') {
ItemUtil.getByDoi(type, doi, (item) => {
- this.setState({ loading: false, item });
+ setItem(item);
+ setLoading(false);
});
} else if (id !== 0) {
ItemUtil.get(type, id, (item) => {
- this.setState({ loading: false, item });
+ setItem(item);
+ setLoading(false);
});
+ } else {
+ setLoading(true);
}
+ }, [type, id, doi]);
+
+ if (loading) {
+ return
;
+ }
+ if (item === null) {
+ return ;
}
- render() {
- const { lang, type } = this.props;
- if (this.state.loading) {
- return ;
- }
- if (this.state.item === null) {
- return ;
- }
- return (
- <>
-
-
- {Functions.mlang(this.state.item.title, lang)} - {Functions.mlang("[en]Database[/en][ja]データベース[/ja]", lang)} - {Functions.siteTitle(lang)}
-
-
- {Functions.mlang("[en]Detail[/en][ja]詳細[/ja]", lang)}
-
-
- >
- );
- }
-}
+ return (
+ <>
+
+
+ {Functions.mlang(item.title, lang)} -{' '}
+ {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} -{' '}
+ {Functions.siteTitle(lang)}
+
+
+ {Functions.mlang('[en]Detail[/en][ja]詳細[/ja]', lang)}
+
+
+ >
+ );
+};
export default DatabaseDetailItem;
diff --git a/src/database/DatabaseSearchByAdvancedKeyword.tsx b/src/database/DatabaseSearchByAdvancedKeyword.tsx
index edcaa03..203a4e9 100644
--- a/src/database/DatabaseSearchByAdvancedKeyword.tsx
+++ b/src/database/DatabaseSearchByAdvancedKeyword.tsx
@@ -1,67 +1,32 @@
-import React from "react";
-import { useLocation } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../config";
-import AdvancedSearchQuery from "./lib/AdvancedSearchQuery";
-import DatabaseListItem from "./lib/DatabaseListItem";
-import ItemUtil, { SearchCallbackFunc, SortCondition } from "./lib/ItemUtil";
+import React from 'react';
-interface PropsFC {
+import { useLocation } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../config';
+import DatabaseListItem from './lib/DatabaseListItem';
+import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
+
+interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-interface Props extends PropsFC {
- location: any;
-}
-
-interface State {
- search: string;
- query: AdvancedSearchQuery;
-}
-
-class DatabaseSearchByAdvancedKeyword extends React.Component {
- constructor(props: Props) {
- super(props);
- const search = props.location.search;
- const query = ItemUtil.getAdvancedSearchQueryByQuery(search);
- this.state = { search, query };
- this.searchFunc = this.searchFunc.bind(this);
- }
-
- static getDerivedStateFromProps(nextProps: Props, prevState: State) {
- const search = nextProps.location.search;
- if (prevState.search !== search) {
- const query = ItemUtil.getAdvancedSearchQueryByQuery(search);
- return { search, query };
- }
- return null;
- }
-
- getUrl() {
- const { type } = this.props;
- return ItemUtil.getSearchByAdvancedKeywordsUrl(type, this.state.query);
- }
-
- searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
- const { type } = this.props;
- ItemUtil.getListByAdvancedSearchQuery(type, this.state.query, condition, func);
- }
-
- render() {
- const { lang, type } = this.props;
- const baseUrl = this.getUrl();
- return (
-
-
Listing item
-
-
- );
- }
-}
-
-const DatabaseSearchByAdvancedKeywordFC: React.FC = (props: PropsFC) => {
+const DatabaseSearchByAdvancedKeyword: React.FC = (props) => {
const { lang, type } = props;
- return ;
+ const location = useLocation();
+ const query = ItemUtil.getAdvancedSearchQueryByQuery(location.search);
+
+ const searchFunc = (condition: SortCondition, func: SearchCallbackFunc) => {
+ ItemUtil.getListByAdvancedSearchQuery(type, query, condition, func);
+ };
+
+ const baseUrl = ItemUtil.getSearchByAdvancedKeywordsUrl(type, query);
+
+ return (
+
+
Listing item
+
+
+ );
};
-export default DatabaseSearchByAdvancedKeywordFC;
+export default DatabaseSearchByAdvancedKeyword;
diff --git a/src/database/DatabaseSearchByIndexId.tsx b/src/database/DatabaseSearchByIndexId.tsx
index 6fcf323..7b674da 100644
--- a/src/database/DatabaseSearchByIndexId.tsx
+++ b/src/database/DatabaseSearchByIndexId.tsx
@@ -1,80 +1,92 @@
-import React, { Fragment } from "react";
-import { Helmet } from "react-helmet-async";
-import { Link } from "react-router-dom";
-import PageNotFound from "../common/lib/PageNotFound";
-import { BrainAtlasType, MultiLang } from "../config";
-import Functions from "../functions";
-import DatabaseListIndex from "./lib/DatabaseListIndex";
-import DatabaseListItem from "./lib/DatabaseListItem";
-import IndexUtil, { Index } from "./lib/IndexUtil";
-import ItemUtil, { SearchCallbackFunc, SortCondition } from "./lib/ItemUtil";
+import React from 'react';
-export interface Props {
+import { Helmet } from 'react-helmet-async';
+import { Link } from 'react-router-dom';
+import Loading from '../common/lib/Loading';
+import PageNotFound from '../common/lib/PageNotFound';
+import { BrainAtlasType, MultiLang } from '../config';
+import Functions from '../functions';
+import DatabaseListIndex from './lib/DatabaseListIndex';
+import DatabaseListItem from './lib/DatabaseListItem';
+import IndexUtil, { Index } from './lib/IndexUtil';
+import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
+
+interface Props {
lang: MultiLang;
type: BrainAtlasType;
indexId: number;
}
-class DatabaseSearchByIndexId extends React.Component {
- constructor(props: Props) {
- super(props);
- this.searchFunc = this.searchFunc.bind(this);
- }
+const DatabaseSearchByIndexId: React.FC = (props) => {
+ const { lang, type, indexId } = props;
- getUrl() {
- const { type, indexId } = this.props;
- if (indexId === 0) {
- return "/";
- }
- return IndexUtil.getUrl(type, indexId);
- }
+ const [notFound, setNotFound] = React.useState(false);
+ const [index, setIndex] = React.useState(null);
+ const [parents, setParents] = React.useState<{ title: string; node: React.ReactNode }>({
+ title: '',
+ node: null,
+ });
- searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
- const { type, indexId } = this.props;
+ const searchFunc = (condition: SortCondition, func: SearchCallbackFunc) => {
if (indexId === 0) {
const res = { total: 0, data: [] };
func(res);
} else {
ItemUtil.getListByIndexId(type, indexId, condition, func);
}
+ };
+
+ React.useEffect(() => {
+ IndexUtil.get(type, indexId, (index) => {
+ setIndex(index);
+ if (index == null) {
+ setNotFound(true);
+ } else {
+ IndexUtil.getParents(type, indexId, (pIndexes) => {
+ const parents = pIndexes.map((index: Index) => {
+ const url: string = IndexUtil.getUrl(type, index.id);
+ const title = Functions.mlang(index.title, lang);
+ return (
+
+ / {title}{' '}
+
+ );
+ });
+ const title = pIndexes
+ .map((index) => {
+ return '/' + Functions.mlang(index.title, lang);
+ })
+ .join('');
+ setParents({ title: title, node: parents });
+ });
+ }
+ });
+ }, [indexId, lang, type]);
+
+ if (notFound) {
+ return ;
}
- render() {
- const { lang, type, indexId } = this.props;
- const index = IndexUtil.get(type, indexId);
- if (index === null) {
- return ;
- }
- const baseUrl = this.getUrl();
- const pIndexes = IndexUtil.getParents(type, indexId);
- const parents = pIndexes.map((value: Index) => {
- const url: string = IndexUtil.getUrl(type, value.id);
- const title = Functions.mlang(value.title, lang);
- return (
-
- / {title}{" "}
-
- );
- });
- const title = pIndexes
- .map((value) => {
- return "/" + Functions.mlang(value.title, lang);
- })
- .join("");
- return (
-
-
-
- {Functions.mlang(title, lang)} - {Functions.mlang("[en]Database[/en][ja]データベース[/ja]", lang)} - {Functions.siteTitle(lang)}
-
-
-
{Functions.mlang("[en]Listing item[/en][ja]アイテム一覧[/ja]", lang)}
-
{parents}
-
-
-
- );
+ if (index == null) {
+ return ;
}
-}
+ const baseUrl = indexId === 0 ? '/' : IndexUtil.getUrl(type, indexId);
+
+ return (
+
+
+
+ {Functions.mlang(parents.title, lang)} -{' '}
+ {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} -{' '}
+ {Functions.siteTitle(lang)}
+
+
+
{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}
+
{parents.node}
+
+
+
+ );
+};
export default DatabaseSearchByIndexId;
diff --git a/src/database/DatabaseSearchByItemType.tsx b/src/database/DatabaseSearchByItemType.tsx
index 2b5f6da..790d369 100644
--- a/src/database/DatabaseSearchByItemType.tsx
+++ b/src/database/DatabaseSearchByItemType.tsx
@@ -1,8 +1,9 @@
-import React from "react";
-import { BrainAtlasType, MultiLang } from "../config";
-import Functions from "../functions";
-import DatabaseListItem from "./lib/DatabaseListItem";
-import ItemUtil, { SearchCallbackFunc, SortCondition } from "./lib/ItemUtil";
+import React from 'react';
+
+import { BrainAtlasType, MultiLang } from '../config';
+import Functions from '../functions';
+import DatabaseListItem from './lib/DatabaseListItem';
+import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
interface Props {
lang: MultiLang;
@@ -11,38 +12,26 @@ interface Props {
type: BrainAtlasType;
}
-class DatabaseSearchByItemType extends React.Component {
- constructor(props: Props) {
- super(props);
- this.searchFunc = this.searchFunc.bind(this);
- }
+const DatabaseSearchByItemType: React.FC = (props) => {
+ const { lang, itemType, subItemType, type } = props;
- searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
- const { itemType, subItemType, type } = this.props;
- if (itemType === "") {
+ const searchFunc = (condition: SortCondition, func: SearchCallbackFunc) => {
+ if (itemType === '') {
const res = { total: 0, data: [] };
func(res);
} else {
ItemUtil.getListByItemType(type, itemType, subItemType, condition, func);
}
- }
+ };
- getUrl() {
- const { itemType, subItemType, type } = this.props;
- let url = ItemUtil.getItemTypeSearchUrl(type, itemType, subItemType);
- return url;
- }
+ const baseUrl = ItemUtil.getItemTypeSearchUrl(type, itemType, subItemType);
- render() {
- const { lang, type } = this.props;
- const baseUrl = this.getUrl();
- return (
-
-
{Functions.mlang("[en]Listing item[/en][ja]アイテム一覧[/ja]", lang)}
-
-
- );
- }
-}
+ return (
+
+
{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}
+
+
+ );
+};
export default DatabaseSearchByItemType;
diff --git a/src/database/DatabaseSearchByKeyword.tsx b/src/database/DatabaseSearchByKeyword.tsx
index fac1490..31ea9f2 100644
--- a/src/database/DatabaseSearchByKeyword.tsx
+++ b/src/database/DatabaseSearchByKeyword.tsx
@@ -1,74 +1,41 @@
-import React from "react";
-import { useLocation } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../config";
-import Functions from "../functions";
-import DatabaseListItem from "./lib/DatabaseListItem";
-import ItemUtil, { KeywordSearchType, SearchCallbackFunc, SortCondition } from "./lib/ItemUtil";
+import React from 'react';
-interface PropsFC {
+import { useLocation } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../config';
+import Functions from '../functions';
+import DatabaseListItem from './lib/DatabaseListItem';
+import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
+
+interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-interface Props extends PropsFC {
- location: any;
-}
+const DatabaseSearchByKeyword: React.FC = (props) => {
+ const { lang, type } = props;
-interface State {
- type: KeywordSearchType;
- keyword: string;
-}
+ const location = useLocation();
+ const query = ItemUtil.getSearchKeywordByQuery(location.search);
-class DatabaseSearchByKeyword extends React.Component {
- constructor(props: Props) {
- super(props);
- const { location } = props;
- const { type, keyword } = ItemUtil.getSearchKeywordByQuery(location.search);
- this.state = { type, keyword };
- this.searchFunc = this.searchFunc.bind(this);
- }
-
- static getDerivedStateFromProps(nextProps: Props, prevState: State) {
- const { type, keyword } = ItemUtil.getSearchKeywordByQuery(nextProps.location.search);
- if (prevState.type !== type || prevState.keyword !== keyword) {
- return { type, keyword };
- }
- return null;
- }
-
- getUrl() {
- const { type } = this.props;
- return ItemUtil.getSearchByKeywordUrl(type, this.state.type, this.state.keyword);
- }
-
- searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
- const { type } = this.props;
- if (this.state.keyword === "") {
+ const searchFunc = (condition: SortCondition, func: SearchCallbackFunc) => {
+ if (query.keyword === '') {
const res = { total: 0, data: [] };
func(res);
} else {
- ItemUtil.getListByKeyword(type, this.state.type, this.state.keyword, condition, func);
+ ItemUtil.getListByKeyword(type, query.type, query.keyword, condition, func);
}
- }
+ };
- render() {
- const { lang, type } = this.props;
- const baseUrl = this.getUrl();
- return (
-
-
{Functions.mlang("[en]Listing item[/en][ja]アイテム一覧[/ja]", lang)}
-
- {Functions.mlang("[en]Search Keyword[/en][ja]検索キーワード[/ja]", lang)} : {this.state.keyword}
-
-
-
- );
- }
-}
-
-const DatabaseSearchByKeywordFC: React.FC = (props: PropsFC) => {
- const { lang, type } = props;
- return ;
+ const baseUrl = ItemUtil.getSearchByKeywordUrl(type, query.type, query.keyword);
+ return (
+
+
{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}
+
+ {Functions.mlang('[en]Search Keyword[/en][ja]検索キーワード[/ja]', lang)} : {query.keyword}
+
+
+
+ );
};
-export default DatabaseSearchByKeywordFC;
+export default DatabaseSearchByKeyword;
diff --git a/src/database/DatabaseTop.tsx b/src/database/DatabaseTop.tsx
index 60dd78d..f96fbd1 100644
--- a/src/database/DatabaseTop.tsx
+++ b/src/database/DatabaseTop.tsx
@@ -1,14 +1,15 @@
-import React from "react";
-import Config, { BrainAtlasType, MultiLang } from "../config";
-import styles from "./DatabaseTop.module.css";
-import ItemType from "./item-type";
+import React from 'react';
+
+import Config, { BrainAtlasType, MultiLang } from '../config';
+import styles from './DatabaseTop.module.css';
+import ItemType from './item-type';
interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-const DatabaseTop: React.FC = (props: Props) => {
+const DatabaseTop: React.FC = (props) => {
const { lang, type } = props;
const types: string[][] = [];
const len = Config.XOONIPS_ITEMTYPES.length;
@@ -26,7 +27,9 @@ const DatabaseTop: React.FC = (props: Props) => {
{value.map((itemType, idx) => {
return (
- {itemType !== "" && }
+ {itemType !== '' && (
+
+ )}
);
})}
diff --git a/src/database/DatabaseXoopsPathRedirect.tsx b/src/database/DatabaseXoopsPathRedirect.tsx
index 6678bbc..9e095d2 100644
--- a/src/database/DatabaseXoopsPathRedirect.tsx
+++ b/src/database/DatabaseXoopsPathRedirect.tsx
@@ -1,121 +1,123 @@
-import React from "react";
-import { Navigate, useLocation } from "react-router-dom";
-import PageNotFound from "../common/lib/PageNotFound";
-import { MultiLang } from "../config";
-import Functions from "../functions";
+import React from 'react';
+
+import { Navigate, useLocation } from 'react-router-dom';
+import PageNotFound from '../common/lib/PageNotFound';
+import { MultiLang } from '../config';
+import Functions from '../functions';
interface Props {
lang: MultiLang;
}
-const DatabaseXoopsPathRedirect: React.FC = (props: Props) => {
+const DatabaseXoopsPathRedirect: React.FC = (props) => {
const { lang } = props;
+ const location = useLocation();
const getRedirectUrl = (): string => {
- const location = useLocation();
- const pathname = location.pathname || "";
+ const pathname = location.pathname || '';
const query = new URLSearchParams(location.search);
- const search = new RegExp("^/modules/xoonips(?:/+(.*))?$");
+ const search = new RegExp('^/modules/xoonips(?:/+(.*))?$');
const matches = pathname.match(search);
if (matches === null) {
- return "";
+ return '';
}
- const path = matches[1] || "";
+ const path = matches[1] || '';
switch (path) {
- case "":
- case "index.php": {
- return "/database";
+ case '':
+ case 'index.php': {
+ return '/database';
}
- case "detail.php": {
- const id = query.get("id");
+ case 'detail.php': {
+ const id = query.get('id');
if (id !== null) {
- return "/database/item/id/" + Functions.escape(id);
+ return '/database/item/id/' + Functions.escape(id);
}
- const itemId = query.get("item_id");
- if (itemId !== null && itemId.match(/^\d+$/) !== null) {
- return "/database/item/" + Functions.escape(itemId);
+ const itemId = query.get('item_id');
+ if (itemId?.match(/^\d+$/) != null) {
+ return '/database/item/' + Functions.escape(itemId);
}
- return "";
+ return '';
}
- case "listitem.php": {
- const indexId = query.get("index_id");
- if (indexId !== null && indexId.match(/^\d+$/) !== null) {
+ case 'listitem.php': {
+ const indexId = query.get('index_id');
+ if (indexId?.match(/^\d+$/) != null) {
const params = new URLSearchParams();
- const map: any = {
- orderby: { key: "orderby", isNumber: false },
- order_dir: { key: "order_dir", isNumber: true },
- itemcount: { key: "itemcount", isNumber: true },
- page: { key: "page", isNumber: true },
- };
- for (let k in map) {
- const v = query.get(k);
- if (v === null || v.length === 0) {
- continue;
+ [
+ { qKey: 'orderby', pKey: 'orderby', isNumber: false },
+ { qKey: 'order_dir', pKey: 'order_dir', isNumber: true },
+ { qKey: 'itemcount', pKey: 'itemcount', isNumber: true },
+ { qKey: 'page', pKey: 'page', isNumber: true },
+ ].forEach(({ qKey, pKey, isNumber }) => {
+ const v = query.get(qKey);
+ if (v == null || v.length === 0) {
+ return;
}
- if (map[k].isNumber && v.match(/^\d+$/) !== null) {
- continue;
+ if (isNumber && v.match(/^\d+$/) != null) {
+ return;
}
- params.set(map[k].key, v);
- }
+ params.set(pKey, v);
+ });
const paramStr = params.toString();
- return "/database/list/" + Functions.escape(indexId) + (paramStr.length > 0 ? "?" + paramStr : "");
+ return (
+ `/database/list/${Functions.escape(indexId)}` +
+ (paramStr.length > 0 ? `?${paramStr}` : '')
+ );
}
break;
}
- case "itemselect.php": {
- const op = query.get("op");
+ case 'itemselect.php': {
+ const op = query.get('op');
if (op === null) {
break;
}
switch (op) {
- case "quicksearch": {
- const keyword = query.get("keyword");
- const itemType = query.get("search_itemtype");
- if (keyword === null || itemType === null || keyword === "") {
- return "";
+ case 'quicksearch': {
+ const keyword = query.get('keyword');
+ const itemType = query.get('search_itemtype');
+ if (keyword === null || itemType === null || keyword === '') {
+ return '';
}
- const type = itemType.replace("xnp", "");
- if (itemType !== "basic" && itemType !== "all" && itemType.match(/^xnp.+/) === null) {
- return "";
+ const type = itemType.replace('xnp', '');
+ if (itemType !== 'basic' && itemType !== 'all' && itemType.match(/^xnp.+/) === null) {
+ return '';
}
const params = new URLSearchParams({ type, keyword });
- const map: any = {
- orderby: { key: "orderby", isNumber: false },
- orderdir: { key: "order_dir", isNumber: true },
- item_per_page: { key: "itemcount", isNumber: true },
- page: { key: "page", isNumber: true },
- };
- for (let k in map) {
- const v = query.get(k);
- if (v === null || v.length === 0) {
- continue;
+ [
+ { qKey: 'orderby', pKey: 'orderby', isNumber: false },
+ { qKey: 'orderdir', pKey: 'order_dir', isNumber: true },
+ { qKey: 'item_per_page', pKey: 'itemcount', isNumber: true },
+ { qKey: 'page', pKey: 'page', isNumber: true },
+ ].forEach(({ qKey, pKey, isNumber }) => {
+ const v = query.get(qKey);
+ if (v == null || v.length === 0) {
+ return;
}
- if (map[k].isNumber && v.match(/^\d+$/) !== null) {
- continue;
+ if (isNumber && v.match(/^\d+$/) != null) {
+ return;
}
- params.set(map[k].key, v);
- }
- return "/database/search?" + params.toString();
+ params.set(pKey, v);
+ });
+ return '/database/search?' + params.toString();
}
- case "itemtypesearch": {
- const itemType = query.get("search_itemtype");
- if (itemType === null || itemType.match(/^xnp.+/) === null) {
- return "";
+ case 'itemtypesearch': {
+ const itemType = query.get('search_itemtype');
+ if (itemType?.match(/^xnp.+/) == null) {
+ return '';
}
- const type = itemType.replace("xnp", "");
- return "/database/search/itemtype/" + Functions.escape(type);
+ const type = itemType.replace('xnp', '');
+ return '/database/search/itemtype/' + Functions.escape(type);
}
- case "itemsubtypesearch": {
- let type = "";
- let subtype = "";
+ case 'itemsubtypesearch': {
+ let type = '';
+ let subtype = '';
query.forEach((v, k) => {
if (k.match(/^xnp[a-z]+$/) !== null && !!v) {
- type = k.replace("xnp", "");
+ type = k.replace('xnp', '');
return;
}
});
- if (type === "") {
- return "";
+ if (type === '') {
+ return '';
}
query.forEach((v, k) => {
if (k.match(`^xnp${type}_.+$`) !== null && !!v) {
@@ -123,23 +125,28 @@ const DatabaseXoopsPathRedirect: React.FC = (props: Props) => {
return;
}
});
- if (subtype === "") {
- return "";
+ if (subtype === '') {
+ return '';
}
- return "/database/search/itemtype/" + Functions.escape(type) + "/" + Functions.escape(subtype);
+ return (
+ '/database/search/itemtype/' +
+ Functions.escape(type) +
+ '/' +
+ Functions.escape(subtype)
+ );
}
}
- return "";
+ return '';
}
- case "advanced_search.php": {
- return "/database/advanced";
+ case 'advanced_search.php': {
+ return '/database/advanced';
}
}
- return "";
+ return '';
};
const url = getRedirectUrl();
- if (url === "") {
+ if (url === '') {
return ;
}
return ;
diff --git a/src/database/assets/simpf-links.json b/src/database/assets/simpf-links.json
index 0637a08..fe51488 100644
--- a/src/database/assets/simpf-links.json
+++ b/src/database/assets/simpf-links.json
@@ -1 +1 @@
-[]
\ No newline at end of file
+[]
diff --git a/src/database/assets/trees.json b/src/database/assets/trees.json
deleted file mode 100644
index 470e967..0000000
--- a/src/database/assets/trees.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"type":"degu","tree":[{"id":3,"title":"Public","num_of_items":0,"children":[{"id":16,"title":"Degu (Octodon degu)","num_of_items":0,"children":[{"id":24,"title":"The Degu 3D Brain Atlas","num_of_items":4,"children":[{"id":18,"title":"References","num_of_items":0,"children":[]}]}]}]}]},{"type":"jm","tree":[{"id":3,"title":"Public","num_of_items":0,"children":[{"id":7,"title":"Japanese Macaque Monkey","num_of_items":0,"children":[{"id":9,"title":"The MRI Standard Brain of Japanese Macaque Monkey","num_of_items":1,"children":[{"id":44,"title":"References","num_of_items":0,"children":[]}]}]}]}]},{"type":"marmoset","tree":[{"id":3,"title":"Public","num_of_items":0,"children":[{"id":66,"title":"The Marmoset 3D Brain Atlas","num_of_items":4,"children":[{"id":69,"title":"References","num_of_items":0,"children":[]}]},{"id":71,"title":"The Marmoset MRI Standard Brain","num_of_items":1,"children":[{"id":73,"title":"References","num_of_items":0,"children":[]}]}]}]}]
\ No newline at end of file
diff --git a/src/database/blocks/IndexTree.module.css b/src/database/blocks/IndexTree.module.css
index 98a0f60..17c8cc9 100644
--- a/src/database/blocks/IndexTree.module.css
+++ b/src/database/blocks/IndexTree.module.css
@@ -41,13 +41,25 @@
width: 9px;
background: url(../assets/images/tree_line.png);
}
-.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child)) {
+.indexTree:global(
+ .rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child)
+ ) {
background-position: -9px 0;
}
-.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child).rc-tree-indent-unit-end) {
+.indexTree:global(
+ .rc-tree
+ .rc-tree-treenode
+ .rc-tree-indent
+ .rc-tree-indent-unit:not(:last-child).rc-tree-indent-unit-end
+ ) {
background-position: -18px 0;
}
-.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:last-child.rc-tree-indent-unit-end) {
+.indexTree:global(
+ .rc-tree
+ .rc-tree-treenode
+ .rc-tree-indent
+ .rc-tree-indent-unit:last-child.rc-tree-indent-unit-end
+ ) {
background-position: -27px 0;
}
@@ -69,14 +81,20 @@
.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-switcher.rc-tree-switcher_close) {
background-position: -32px 0;
}
-.indexTree:global(.rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher-noop) {
+.indexTree:global(
+ .rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher-noop
+ ) {
background-position: 0 -20px;
cursor: auto;
}
-.indexTree:global(.rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher_open) {
+.indexTree:global(
+ .rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher_open
+ ) {
background-position: -16px -20px;
}
-.indexTree:global(.rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher_close) {
+.indexTree:global(
+ .rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher_close
+ ) {
background-position: -32px -20px;
}
diff --git a/src/database/blocks/IndexTree.tsx b/src/database/blocks/IndexTree.tsx
index c6e5126..43325f2 100644
--- a/src/database/blocks/IndexTree.tsx
+++ b/src/database/blocks/IndexTree.tsx
@@ -1,136 +1,133 @@
-import Tree from "rc-tree";
-import { DataNode, EventDataNode } from "rc-tree/lib/interface";
-import React, { Key } from "react";
-import { useNavigate } from "react-router";
-import { BrainAtlasType, MultiLang } from "../../config";
-import Functions from "../../functions";
-import IndexUtil, { Index, INDEX_ID_PUBLIC } from "../lib/IndexUtil";
-import styles from "./IndexTree.module.css";
+import React from 'react';
+
+import Tree from 'rc-tree';
+import { DataNode, EventDataNode } from 'rc-tree/lib/interface';
+import { useNavigate } from 'react-router';
+import Loading from '../../common/lib/Loading';
+import { BrainAtlasType, MultiLang } from '../../config';
+import Functions from '../../functions';
+import IndexUtil, { INDEX_ID_PUBLIC, Index } from '../lib/IndexUtil';
+import styles from './IndexTree.module.css';
interface Props {
lang: MultiLang;
type: BrainAtlasType;
}
-interface State {
- tree: DataNode[];
- expandableKeys: string[];
- expandedKeys: string[];
- selectedKeys: number[];
-}
+const IndexTree: React.FC = (props) => {
+ const { lang, type } = props;
+ const navigate = useNavigate();
-class IndexTree extends React.Component {
- constructor(props: Props) {
- super(props);
- this.handleClickOpenAll = this.handleClickOpenAll.bind(this);
- this.handleClickCloseAll = this.handleClickCloseAll.bind(this);
- this.handleExpand = this.handleExpand.bind(this);
- this.handleSelect = this.handleSelect.bind(this);
- const res = this.load();
- this.state = {
- tree: res.elements,
- expandableKeys: res.keys,
- expandedKeys: res.expandedKeys,
- selectedKeys: [],
- };
- }
+ const [tree, setTree] = React.useState([]);
+ const [keys, setKeys] = React.useState([]);
+ const [expandedKeys, setExpandedKeys] = React.useState([]);
+ const [selectedKeys, setSelectedKeys] = React.useState([]);
- load() {
- const { lang, type } = this.props;
- let keys: string[] = [];
- let eKeys: string[] = [];
- const makeTreeNode = (index: Index, depth: number): DataNode => {
- const title = Functions.mlang(index.title, lang) + (index.numOfItems > 0 ? " (" + index.numOfItems + ")" : "");
- const children = IndexUtil.getChildren(type, index.id);
- if (children.length === 0) {
- return { key: String(index.id), title: title };
- }
- const childTreeNodes = children.map((value: Index) => {
- return makeTreeNode(value, depth + 1);
+ React.useEffect(() => {
+ const tree: DataNode[] = [];
+ const keys: string[] = [];
+ const eKeys: string[] = [];
+ const makeTreeNode = (index: Index, depth: number, func: (node: DataNode) => void): void => {
+ const title =
+ Functions.mlang(index.title, lang) +
+ (index.numOfItems > 0 ? ' (' + index.numOfItems + ')' : '');
+ IndexUtil.getChildren(type, index.id, (children) => {
+ if (children.length === 0) {
+ func({ key: String(index.id), title: title });
+ } else {
+ if (depth < 1) {
+ eKeys.push(String(index.id));
+ }
+ keys.push(String(index.id));
+ const childTreeNodes: DataNode[] = [];
+ let called = 0;
+ children.forEach((value: Index) => {
+ makeTreeNode(value, depth + 1, (cNode) => {
+ called++;
+ childTreeNodes.push(cNode);
+ if (called === children.length) {
+ func({ key: String(index.id), title: title, children: childTreeNodes });
+ }
+ });
+ });
+ }
});
- if (depth < 1) {
- eKeys.push(String(index.id));
+ };
+ IndexUtil.get(type, INDEX_ID_PUBLIC, (index) => {
+ if (index != null) {
+ makeTreeNode(index, 0, (node) => {
+ tree.push(node);
+ setTree(tree);
+ setKeys(keys);
+ setExpandedKeys(eKeys);
+ setSelectedKeys([]);
+ });
}
- keys.push(String(index.id));
- return { key: String(index.id), title: title, children: childTreeNodes };
- };
- let elements: DataNode[] = [];
- const index = IndexUtil.get(type, INDEX_ID_PUBLIC);
- if (index !== null) {
- elements.push(makeTreeNode(index, 0));
- }
- return {
- elements: elements,
- keys: keys,
- expandedKeys: eKeys,
- };
- }
+ });
+ }, [lang, type]);
- componentDidUpdate(prevProps: Props, prevState: State) {
- const { lang, type } = this.props;
- if (prevProps.lang !== lang || prevProps.type !== type) {
- const res = this.load();
- this.setState({
- tree: res.elements,
- selectedKeys: [],
- });
- }
- }
+ const handleClickOpenAll = () => {
+ setExpandedKeys(keys);
+ };
- handleClickOpenAll() {
- this.setState({ expandedKeys: this.state.expandableKeys });
- }
+ const handleClickCloseAll = () => {
+ setExpandedKeys([]);
+ };
- handleClickCloseAll() {
- this.setState({ expandedKeys: [] });
- }
-
- handleExpand(
- expandedKeys: Key[],
+ const handleExpand: (
+ expandedKeys: React.Key[],
info: {
node: EventDataNode;
expanded: boolean;
nativeEvent: MouseEvent;
- }
- ): void {
+ },
+ ) => void = (expandedKeys) => {
const keys: string[] = expandedKeys.map((key) => {
- return typeof key === "string" ? key : String(key);
+ return typeof key === 'string' ? key : String(key);
});
- this.setState({ expandedKeys: keys });
- }
+ setExpandedKeys(keys);
+ };
- handleSelect(
- selectedKeys: Key[],
+ const handleSelect: (
+ selectedKeys: React.Key[],
info: {
- event: "select";
+ event: 'select';
selected: boolean;
node: EventDataNode;
selectedNodes: DataNode[];
nativeEvent: MouseEvent;
- }
- ): void {
- const navigate = useNavigate();
- const { type } = this.props;
- const selectedKey = selectedKeys.shift() || 0;
- const key = typeof selectedKey === "string" ? parseInt(selectedKey, 10) : selectedKey;
+ },
+ ) => void = (selectedKeys) => {
+ const selectedKey = selectedKeys.shift() ?? 0;
+ const key = typeof selectedKey === 'string' ? parseInt(selectedKey, 10) : selectedKey;
const url = IndexUtil.getUrl(type, key);
navigate(url);
- this.setState({ selectedKeys: [] });
+ setSelectedKeys([]);
+ };
+
+ if (tree.length === 0) {
+ return ;
}
- render() {
- return (
-
-
- open all
-
-
- close all
-
-
-
- );
- }
-}
+ return (
+
+
+ open all
+
+
+ close all
+
+
+
+ );
+};
export default IndexTree;
diff --git a/src/database/item-type/binder/BinderAdvancedSearch.tsx b/src/database/item-type/binder/BinderAdvancedSearch.tsx
index 615a3e1..44bdd2b 100644
--- a/src/database/item-type/binder/BinderAdvancedSearch.tsx
+++ b/src/database/item-type/binder/BinderAdvancedSearch.tsx
@@ -1,22 +1,28 @@
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class BinderAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "binder";
- this.title = "Binder";
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
+ this.type = 'binder';
+ this.title = 'Binder';
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
];
return rows;
}
diff --git a/src/database/item-type/binder/BinderDetail.tsx b/src/database/item-type/binder/BinderDetail.tsx
index 056ae14..cfc7f35 100644
--- a/src/database/item-type/binder/BinderDetail.tsx
+++ b/src/database/item-type/binder/BinderDetail.tsx
@@ -1,10 +1,11 @@
-import React from "react";
-import ItemType from "..";
-import { BrainAtlasType, MultiLang } from "../../../config";
-import Functions from "../../../functions";
-import ItemUtil, { Item, ItemBinder } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
+import React from 'react';
+
+import ItemType from '..';
+import { BrainAtlasType, MultiLang } from '../../../config';
+import Functions from '../../../functions';
+import ItemUtil, { Item, ItemBinder } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
interface Props {
lang: MultiLang;
@@ -12,75 +13,81 @@ interface Props {
type: BrainAtlasType;
}
-interface State {
- items: Item[];
-}
+const BinderLinkItems: React.FC = (props) => {
+ const { lang, item, type } = props;
+ const [items, setItems] = React.useState- ([]);
-class BinderLinkItems extends React.Component
{
- constructor(props: Props) {
- super(props);
- this.state = {
- items: [],
+ const isMounted = React.useRef(false);
+ React.useEffect(() => {
+ isMounted.current = true;
+ return () => {
+ isMounted.current = false;
};
- }
+ }, []);
- componentDidMount() {
- this.updateItems();
- }
-
- componentDidUpdate(prevProps: Props, prevState: State) {
- const prevItemIds = prevProps.item.item_link;
- const nextItemIds = this.props.item.item_link;
- if (prevItemIds.toString() !== nextItemIds.toString()) {
- this.updateItems();
- }
- }
-
- updateItems() {
- const { item, type } = this.props;
+ React.useEffect(() => {
const itemIds = item.item_link;
ItemUtil.getList(type, itemIds, (results) => {
- const items = results.data;
- this.setState({ items });
+ if (isMounted.current) {
+ setItems(results.data);
+ }
});
- }
+ }, [item.item_link, type]);
- render() {
- const { lang, type } = this.props;
- return (
-
-
- {this.state.items.map((item, idx) => {
- const evenodd = idx % 2 ? "even" : "odd";
- return (
-
-
-
-
-
- );
- })}
-
-
- );
- }
-}
+ return (
+
+
+ {items.map((item, idx) => {
+ const evenodd = idx % 2 ? 'even' : 'odd';
+ return (
+
+
+
+
+
+ );
+ })}
+
+
+ );
+};
class BinderDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemBinder;
return [
- { label: "ID", value: item.doi },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "Index", value: },
+ { label: 'ID', value: item.doi },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
];
}
diff --git a/src/database/item-type/binder/BinderList.tsx b/src/database/item-type/binder/BinderList.tsx
index 86b1d8a..9cc0d9a 100644
--- a/src/database/item-type/binder/BinderList.tsx
+++ b/src/database/item-type/binder/BinderList.tsx
@@ -1,14 +1,13 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_binder.gif";
-import { ItemBinder } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_binder.gif';
+import { ItemBinder } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
class BinderList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Binder";
+ this.label = 'Binder';
this.icon = iconFile;
}
diff --git a/src/database/item-type/binder/BinderTop.tsx b/src/database/item-type/binder/BinderTop.tsx
index 53fdebf..47aaef6 100644
--- a/src/database/item-type/binder/BinderTop.tsx
+++ b/src/database/item-type/binder/BinderTop.tsx
@@ -1,13 +1,13 @@
-import iconFile from "../../assets/images/icon_binder.gif";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_binder.gif';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class BinderTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "binder";
- this.label = "Binder";
+ this.type = 'binder';
+ this.label = 'Binder';
this.icon = iconFile;
- this.description = "[en]Binder collection.[/en][ja]バインダー[/ja]";
+ this.description = '[en]Binder collection.[/en][ja]バインダー[/ja]';
}
}
diff --git a/src/database/item-type/binder/index.tsx b/src/database/item-type/binder/index.tsx
index 924e7b1..e7ba7bb 100644
--- a/src/database/item-type/binder/index.tsx
+++ b/src/database/item-type/binder/index.tsx
@@ -1,7 +1,7 @@
-import BinderAdvancedSearch from "./BinderAdvancedSearch";
-import BinderDetail from "./BinderDetail";
-import BinderList from "./BinderList";
-import BinderTop from "./BinderTop";
+import BinderAdvancedSearch from './BinderAdvancedSearch';
+import BinderDetail from './BinderDetail';
+import BinderList from './BinderList';
+import BinderTop from './BinderTop';
const ItemTypeBinder = {
Top: BinderTop,
diff --git a/src/database/item-type/book/BookAdvancedSearch.tsx b/src/database/item-type/book/BookAdvancedSearch.tsx
index 32f05b7..2e26f4e 100644
--- a/src/database/item-type/book/BookAdvancedSearch.tsx
+++ b/src/database/item-type/book/BookAdvancedSearch.tsx
@@ -1,34 +1,52 @@
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class BookAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "book";
- this.title = "Book";
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["author"] = "";
- this.state.values["editor"] = "";
- this.state.values["publisher"] = "";
- this.state.values["publication_year"] = "";
- this.state.values["isbn"] = "";
- this.state.values["file.book_pdf.original_file_name"] = "";
+ this.type = 'book';
+ this.title = 'Book';
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.author = '';
+ this.state.values.editor = '';
+ this.state.values.publisher = '';
+ this.state.values.publication_year = '';
+ this.state.values.isbn = '';
+ this.state.values['file.book_pdf.original_file_name'] = '';
}
getRows() {
const rows = [
- { label: "[en]Book Title[/en][ja]著書名[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Author[/en][ja]著者[/ja]", value: this.renderFieldInputText("author", 50) },
- { label: "[en]Editor[/en][ja]編集者[/ja]", value: this.renderFieldInputText("editor", 50) },
- { label: "[en]Publisher[/en][ja]出版社[/ja]", value: this.renderFieldInputText("publisher", 50) },
- { label: "[en]Publication Year[/en][ja]出版年[/ja]", value: this.renderFieldInputText("publication_year", 10) },
- { label: "ISBN", value: this.renderFieldInputText("isbn", 50) },
- { label: "[en]PDF File[/en][ja]PDF ファイル[/ja]", value: this.renderFieldInputText("file.book_pdf.original_file_name", 50) },
+ {
+ label: '[en]Book Title[/en][ja]著書名[/ja]',
+ value: this.renderFieldInputText('title', 50),
+ },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ { label: '[en]Author[/en][ja]著者[/ja]', value: this.renderFieldInputText('author', 50) },
+ { label: '[en]Editor[/en][ja]編集者[/ja]', value: this.renderFieldInputText('editor', 50) },
+ {
+ label: '[en]Publisher[/en][ja]出版社[/ja]',
+ value: this.renderFieldInputText('publisher', 50),
+ },
+ {
+ label: '[en]Publication Year[/en][ja]出版年[/ja]',
+ value: this.renderFieldInputText('publication_year', 10),
+ },
+ { label: 'ISBN', value: this.renderFieldInputText('isbn', 50) },
+ {
+ label: '[en]PDF File[/en][ja]PDF ファイル[/ja]',
+ value: this.renderFieldInputText('file.book_pdf.original_file_name', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/book/BookDetail.tsx b/src/database/item-type/book/BookDetail.tsx
index 13a7542..6d67237 100644
--- a/src/database/item-type/book/BookDetail.tsx
+++ b/src/database/item-type/book/BookDetail.tsx
@@ -1,39 +1,79 @@
-import React from "react";
-import Functions from "../../../functions";
-import { ItemBook } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
+import Functions from '../../../functions';
+import { ItemBook } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
class BookDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemBook;
return [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Book Title[/en][ja]著書名[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Author[/en][ja]著者[/ja]", value: },
- { label: "[en]Editor[/en][ja]編集者[/ja]", value: Functions.mlang(item.editor, lang) },
- { label: "[en]Publisher[/en][ja]出版社[/ja]", value: Functions.mlang(item.publisher, lang) },
- { label: "[en]Publication Year[/en][ja]出版年[/ja]", value: item.publication_year },
+ { label: 'ID', value: item.doi },
{
- label: "URL",
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Book Title[/en][ja]著書名[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Author[/en][ja]著者[/ja]',
+ value: ,
+ },
+ { label: '[en]Editor[/en][ja]編集者[/ja]', value: Functions.mlang(item.editor, lang) },
+ { label: '[en]Publisher[/en][ja]出版社[/ja]', value: Functions.mlang(item.publisher, lang) },
+ { label: '[en]Publication Year[/en][ja]出版年[/ja]', value: item.publication_year },
+ {
+ label: 'URL',
value: (
{item.url}
),
},
- { label: "[en]PDF File[/en][ja]PDF ファイル[/ja]", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ {
+ label: '[en]PDF File[/en][ja]PDF ファイル[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
}
}
diff --git a/src/database/item-type/book/BookList.tsx b/src/database/item-type/book/BookList.tsx
index a999890..d532ed3 100644
--- a/src/database/item-type/book/BookList.tsx
+++ b/src/database/item-type/book/BookList.tsx
@@ -1,14 +1,14 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_book.gif";
-import { ItemBook } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import { Fragment } from 'react';
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_book.gif';
+import { ItemBook } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
class BookList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Book";
+ this.label = 'Book';
this.icon = iconFile;
}
@@ -18,7 +18,7 @@ class BookList extends ListBase {
const authors = item.author.map((author, i) => {
return (
- {i > 0 && ", "}
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
);
diff --git a/src/database/item-type/book/BookTop.tsx b/src/database/item-type/book/BookTop.tsx
index 65cfd57..9385778 100644
--- a/src/database/item-type/book/BookTop.tsx
+++ b/src/database/item-type/book/BookTop.tsx
@@ -1,13 +1,13 @@
-import iconFile from "../../assets/images/icon_book.gif";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_book.gif';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class BookTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "book";
- this.label = "Book";
+ this.type = 'book';
+ this.label = 'Book';
this.icon = iconFile;
- this.description = "[en]Related book collection.[/en][ja]関連書籍[/ja]";
+ this.description = '[en]Related book collection.[/en][ja]関連書籍[/ja]';
}
}
diff --git a/src/database/item-type/book/index.tsx b/src/database/item-type/book/index.tsx
index b475402..028fafb 100644
--- a/src/database/item-type/book/index.tsx
+++ b/src/database/item-type/book/index.tsx
@@ -1,7 +1,7 @@
-import BookAdvancedSearch from "./BookAdvancedSearch";
-import BookDetail from "./BookDetail";
-import BookList from "./BookList";
-import BookTop from "./BookTop";
+import BookAdvancedSearch from './BookAdvancedSearch';
+import BookDetail from './BookDetail';
+import BookList from './BookList';
+import BookTop from './BookTop';
const ItemTypeBook = {
Top: BookTop,
diff --git a/src/database/item-type/conference/ConferenceAdvancedSearch.tsx b/src/database/item-type/conference/ConferenceAdvancedSearch.tsx
index 9098a55..a78aa6f 100644
--- a/src/database/item-type/conference/ConferenceAdvancedSearch.tsx
+++ b/src/database/item-type/conference/ConferenceAdvancedSearch.tsx
@@ -1,48 +1,67 @@
-import React from "react";
-import { ItemConferenceSubTypes } from "../../lib/ItemUtil";
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class ConferenceAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "conference";
- this.title = "Conference";
+ this.type = 'conference';
+ this.title = 'Conference';
const now = new Date();
const year = String(now.getFullYear());
const month = String(now.getMonth() + 1);
const mday = String(now.getDate());
- this.state.values["title"] = "";
- this.state.values["presentation_type"] = "";
- this.state.values["author"] = "";
- this.state.values["conference_from_year"] = year;
- this.state.values["conference_from_month"] = month;
- this.state.values["conference_from_mday"] = mday;
- this.state.values["conference_to_year"] = year;
- this.state.values["conference_to_month"] = month;
- this.state.values["conference_to_mday"] = mday;
- this.setIgnoreKey("conference_from_year");
- this.setIgnoreKey("conference_from_month");
- this.setIgnoreKey("conference_from_mday");
- this.setIgnoreKey("conference_to_year");
- this.setIgnoreKey("conference_to_month");
- this.setIgnoreKey("conference_to_mday");
+ this.state.values.title = '';
+ this.state.values.presentation_type = '';
+ this.state.values.author = '';
+ this.state.values.conference_from_year = year;
+ this.state.values.conference_from_month = month;
+ this.state.values.conference_from_mday = mday;
+ this.state.values.conference_to_year = year;
+ this.state.values.conference_to_month = month;
+ this.state.values.conference_to_mday = mday;
+ this.setIgnoreKey('conference_from_year');
+ this.setIgnoreKey('conference_from_month');
+ this.setIgnoreKey('conference_from_mday');
+ this.setIgnoreKey('conference_to_year');
+ this.setIgnoreKey('conference_to_month');
+ this.setIgnoreKey('conference_to_mday');
}
renderDate() {
return (
<>
- {this.renderFieldDate("From", "conference_from_year", "conference_from_month", "conference_from_mday")}
- {this.renderFieldDate("To", "conference_to_year", "conference_to_month", "conference_to_mday")}
+
+ {this.renderFieldDate(
+ 'From',
+ 'conference_from_year',
+ 'conference_from_month',
+ 'conference_from_mday',
+ )}
+
+
+ {this.renderFieldDate(
+ 'To',
+ 'conference_to_year',
+ 'conference_to_month',
+ 'conference_to_mday',
+ )}
+
>
);
}
getRows() {
const rows = [
- { label: "[en]Presentation Title[/en][ja]発表議題[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]", value: this.renderFieldSelect("presentation_type", ItemConferenceSubTypes) },
- { label: "[en]Author[/en][ja]発表者[/ja]", value: this.renderFieldInputText("author", 50) },
- { label: "[en]Date[/en][ja]日付[/ja]", value: this.renderDate() },
+ {
+ label: '[en]Presentation Title[/en][ja]発表議題[/ja]',
+ value: this.renderFieldInputText('title', 50),
+ },
+ {
+ label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]',
+ value: this.renderFieldSelect('presentation_type', ItemConferenceSubTypes),
+ },
+ { label: '[en]Author[/en][ja]発表者[/ja]', value: this.renderFieldInputText('author', 50) },
+ { label: '[en]Date[/en][ja]日付[/ja]', value: this.renderDate() },
];
return rows;
}
diff --git a/src/database/item-type/conference/ConferenceDetail.tsx b/src/database/item-type/conference/ConferenceDetail.tsx
index 6b7a6b5..9bdd3e1 100644
--- a/src/database/item-type/conference/ConferenceDetail.tsx
+++ b/src/database/item-type/conference/ConferenceDetail.tsx
@@ -1,33 +1,91 @@
-import React from "react";
-import Functions from "../../../functions";
-import { ItemConference } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
-import ConferenceUtil from "./ConferenceUtil";
+import Functions from '../../../functions';
+import { ItemConference } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
+import ConferenceUtil from './ConferenceUtil';
class ConferenceDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemConference;
return [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Conference Title[/en][ja]学会名[/ja]", value: Functions.mlang(item.conference_title, lang) },
- { label: "[en]Place[/en][ja]開催地[/ja]", value: item.place },
- { label: "[en]Date[/en][ja]日付[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Presentation Title[/en][ja]発表議題[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Author[/en][ja]発表者[/ja]", value: },
- { label: "[en]Abstract[/en][ja]要約[/ja]", value: },
- { label: "[en]Presentation File[/en][ja]発表資料[/ja]", value: },
- { label: "[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]", value: },
- { label: "[en]Conference Paper[/en][ja]学会資料[/ja]", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Conference Title[/en][ja]学会名[/ja]',
+ value: Functions.mlang(item.conference_title, lang),
+ },
+ { label: '[en]Place[/en][ja]開催地[/ja]', value: item.place },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Presentation Title[/en][ja]発表議題[/ja]',
+ value: Functions.mlang(item.title, lang),
+ },
+ {
+ label: '[en]Author[/en][ja]発表者[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Abstract[/en][ja]要約[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Presentation File[/en][ja]発表資料[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Conference Paper[/en][ja]学会資料[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
}
}
diff --git a/src/database/item-type/conference/ConferenceList.tsx b/src/database/item-type/conference/ConferenceList.tsx
index 2e1aed0..00e2cfa 100644
--- a/src/database/item-type/conference/ConferenceList.tsx
+++ b/src/database/item-type/conference/ConferenceList.tsx
@@ -1,15 +1,16 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_conference.gif";
-import { ItemConference } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
-import ConferenceUtil from "./ConferenceUtil";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_conference.gif';
+import { ItemConference } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
+import ConferenceUtil from './ConferenceUtil';
class ConferenceList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Conference";
+ this.label = 'Conference';
this.icon = iconFile;
}
@@ -18,17 +19,18 @@ class ConferenceList extends ListBase {
const item = this.props.item as ItemConference;
const authors = item.author.map((author, i) => {
return (
-
- {i > 0 && ", "}
+
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
-
+
);
});
return (
<>
{Functions.mlang(item.title, lang)}
- {Functions.mlang(item.conference_title, lang)} ( )
+ {Functions.mlang(item.conference_title, lang)} (
+ )
{authors}
>
);
diff --git a/src/database/item-type/conference/ConferenceTop.tsx b/src/database/item-type/conference/ConferenceTop.tsx
index df7fb7a..aeef252 100644
--- a/src/database/item-type/conference/ConferenceTop.tsx
+++ b/src/database/item-type/conference/ConferenceTop.tsx
@@ -1,14 +1,14 @@
-import iconFile from "../../assets/images/icon_conference.gif";
-import { ItemConferenceSubTypes } from "../../lib/ItemUtil";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_conference.gif';
+import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class ConferenceTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "conference";
- this.label = "Conference";
+ this.type = 'conference';
+ this.label = 'Conference';
this.icon = iconFile;
- this.description = "[en]Electrical presentation files for conference.[/en][ja]学会発表[/ja]";
+ this.description = '[en]Electrical presentation files for conference.[/en][ja]学会発表[/ja]';
this.subTypes = ItemConferenceSubTypes;
}
}
diff --git a/src/database/item-type/conference/ConferenceUtil.tsx b/src/database/item-type/conference/ConferenceUtil.tsx
index 31f3fa1..13ad72d 100644
--- a/src/database/item-type/conference/ConferenceUtil.tsx
+++ b/src/database/item-type/conference/ConferenceUtil.tsx
@@ -1,6 +1,6 @@
-import React from "react";
-import { MultiLang } from "../../../config";
-import { ItemConference, ItemConferenceSubType, ItemConferenceSubTypes } from "../../lib/ItemUtil";
+import React from 'react';
+import { MultiLang } from '../../../config';
+import { ItemConference, ItemConferenceSubType, ItemConferenceSubTypes } from '../../lib/ItemUtil';
interface PresentationTypeProps {
lang: MultiLang;
@@ -12,7 +12,7 @@ const PresentationType: React.FC = (props: PresentationTy
const subtype = ItemConferenceSubTypes.find((value) => {
return value.type === type;
});
- if (typeof subtype === "undefined") {
+ if (typeof subtype === 'undefined') {
return null;
}
return {subtype.label} ;
@@ -25,9 +25,34 @@ interface ConferenceDateProps {
const ConferenceDate: React.FC = (props: ConferenceDateProps) => {
const { item } = props;
- const monthStr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
- const from = "From: " + monthStr[item.conference_from_month - 1] + " " + item.conference_from_mday + ", " + item.conference_from_year;
- const to = "To: " + monthStr[item.conference_to_month - 1] + " " + item.conference_to_mday + ", " + item.conference_to_year;
+ const monthStr = [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ];
+ const from =
+ 'From: ' +
+ monthStr[item.conference_from_month - 1] +
+ ' ' +
+ item.conference_from_mday +
+ ', ' +
+ item.conference_from_year;
+ const to =
+ 'To: ' +
+ monthStr[item.conference_to_month - 1] +
+ ' ' +
+ item.conference_to_mday +
+ ', ' +
+ item.conference_to_year;
return (
{from} {to}
diff --git a/src/database/item-type/conference/index.tsx b/src/database/item-type/conference/index.tsx
index 4420912..ae4bef1 100644
--- a/src/database/item-type/conference/index.tsx
+++ b/src/database/item-type/conference/index.tsx
@@ -1,7 +1,7 @@
-import ConferenceAdvancedSearch from "./ConferenceAdvancedSearch";
-import ConferenceDetail from "./ConferenceDetail";
-import ConferenceList from "./ConferenceList";
-import ConferenceTop from "./ConferenceTop";
+import ConferenceAdvancedSearch from './ConferenceAdvancedSearch';
+import ConferenceDetail from './ConferenceDetail';
+import ConferenceList from './ConferenceList';
+import ConferenceTop from './ConferenceTop';
const ItemTypeConference = {
Top: ConferenceTop,
diff --git a/src/database/item-type/data/DataAdvancedSearch.tsx b/src/database/item-type/data/DataAdvancedSearch.tsx
index 40f04a7..2138b1e 100644
--- a/src/database/item-type/data/DataAdvancedSearch.tsx
+++ b/src/database/item-type/data/DataAdvancedSearch.tsx
@@ -1,42 +1,68 @@
-import { ItemDataSubTypes } from "../../lib/ItemUtil";
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import { ItemDataSubTypes } from '../../lib/ItemUtil';
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class DataAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "data";
- this.title = "Data";
+ this.type = 'data';
+ this.title = 'Data';
const now = new Date();
const year = String(now.getFullYear());
const month = String(now.getMonth() + 1);
const mday = String(now.getDate());
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["data_type"] = "";
- this.state.values["experimenter"] = "";
- this.state.values["publication_year"] = year;
- this.state.values["publication_month"] = month;
- this.state.values["publication_mday"] = mday;
- this.state.values["file.preview.caption"] = "";
- this.state.values["file.data_file.original_file_name"] = "";
- this.setIgnoreKey("publication_year");
- this.setIgnoreKey("publication_month");
- this.setIgnoreKey("publication_mday");
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.data_type = '';
+ this.state.values.experimenter = '';
+ this.state.values.publication_year = year;
+ this.state.values.publication_month = month;
+ this.state.values.publication_mday = mday;
+ this.state.values['file.preview.caption'] = '';
+ this.state.values['file.data_file.original_file_name'] = '';
+ this.setIgnoreKey('publication_year');
+ this.setIgnoreKey('publication_month');
+ this.setIgnoreKey('publication_mday');
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Data Type[/en][ja]データタイプ[/ja]", value: this.renderFieldSelect("data_type", ItemDataSubTypes) },
- { label: "[en]Experimenter[/en][ja]実験者[/ja]", value: this.renderFieldInputText("experimenter", 50) },
- { label: "[en]Date[/en][ja]日付[/ja]", value: this.renderFieldDate("", "publication_year", "publication_month", "publication_mday") },
- { label: "[en]Caption[/en][ja]キャプション[/ja]", value: this.renderFieldInputText("file.preview.caption", 50) },
- { label: "[en]Data File[/en][ja]データファイル[/ja]", value: this.renderFieldInputText("file.data_file.original_file_name", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ {
+ label: '[en]Data Type[/en][ja]データタイプ[/ja]',
+ value: this.renderFieldSelect('data_type', ItemDataSubTypes),
+ },
+ {
+ label: '[en]Experimenter[/en][ja]実験者[/ja]',
+ value: this.renderFieldInputText('experimenter', 50),
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: this.renderFieldDate(
+ '',
+ 'publication_year',
+ 'publication_month',
+ 'publication_mday',
+ ),
+ },
+ {
+ label: '[en]Caption[/en][ja]キャプション[/ja]',
+ value: this.renderFieldInputText('file.preview.caption', 50),
+ },
+ {
+ label: '[en]Data File[/en][ja]データファイル[/ja]',
+ value: this.renderFieldInputText('file.data_file.original_file_name', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/data/DataDetail.tsx b/src/database/item-type/data/DataDetail.tsx
index 9a26b67..5b2b890 100644
--- a/src/database/item-type/data/DataDetail.tsx
+++ b/src/database/item-type/data/DataDetail.tsx
@@ -1,39 +1,113 @@
-import React from "react";
-import Functions from "../../../functions";
-import ItemUtil, { ItemData } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
-import SimPFLinkIcon from "../lib/field/SimPFLinkIcon";
-import DataUtil from "./DataUtil";
+import Functions from '../../../functions';
+import ItemUtil, { ItemData } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
+import SimPFLinkIcon from '../lib/field/SimPFLinkIcon';
+import DataUtil from './DataUtil';
class DataDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemData;
const fields = [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Date[/en][ja]日付[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Data Type[/en][ja]データタイプ[/ja]", value: },
- { label: "[en]Experimenter[/en][ja]実験者[/ja]", value: },
- { label: "[en]Preview[/en][ja]プレビュー[/ja]", value: },
- { label: "[en]Data File[/en][ja]データファイル[/ja]", value: },
- { label: "Readme", value: },
- { label: "Rights", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Data Type[/en][ja]データタイプ[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Experimenter[/en][ja]実験者[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Preview[/en][ja]プレビュー[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Data File[/en][ja]データファイル[/ja]',
+ value: (
+
+ ),
+ },
+ { label: 'Readme', value: },
+ {
+ label: 'Rights',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
- if (simpfLinkUrl !== "") {
- const field = { label: "Online Simulation", value: };
+ if (simpfLinkUrl !== '') {
+ const field = {
+ label: 'Online Simulation',
+ value: ,
+ };
fields.splice(14, 0, field);
}
return fields;
diff --git a/src/database/item-type/data/DataList.tsx b/src/database/item-type/data/DataList.tsx
index 3a5913f..9b2b876 100644
--- a/src/database/item-type/data/DataList.tsx
+++ b/src/database/item-type/data/DataList.tsx
@@ -1,14 +1,15 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_data.gif";
-import { ItemData } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_data.gif';
+import { ItemData } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
class DataList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Data";
+ this.label = 'Data';
this.icon = iconFile;
}
@@ -17,10 +18,10 @@ class DataList extends ListBase {
const item = this.props.item as ItemData;
const authors = item.experimenter.map((author, i) => {
return (
-
- {i > 0 && ", "}
+
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
-
+
);
});
return (
diff --git a/src/database/item-type/data/DataTop.tsx b/src/database/item-type/data/DataTop.tsx
index a745f85..48a4c04 100644
--- a/src/database/item-type/data/DataTop.tsx
+++ b/src/database/item-type/data/DataTop.tsx
@@ -1,14 +1,15 @@
-import iconFile from "../../assets/images/icon_data.gif";
-import { ItemDataSubTypes } from "../../lib/ItemUtil";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_data.gif';
+import { ItemDataSubTypes } from '../../lib/ItemUtil';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class DataTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "data";
- this.label = "Data";
+ this.type = 'data';
+ this.label = 'Data';
this.icon = iconFile;
- this.description = "[en]Result data in numerical text/image/movie formats.[/en][ja]実験結果の数値データ/画像/動画など[/ja]";
+ this.description =
+ '[en]Result data in numerical text/image/movie formats.[/en][ja]実験結果の数値データ/画像/動画など[/ja]';
this.subTypes = ItemDataSubTypes;
}
}
diff --git a/src/database/item-type/data/DataUtil.tsx b/src/database/item-type/data/DataUtil.tsx
index 49cd70a..266e4a6 100644
--- a/src/database/item-type/data/DataUtil.tsx
+++ b/src/database/item-type/data/DataUtil.tsx
@@ -1,6 +1,6 @@
-import React from "react";
-import { MultiLang } from "../../../config";
-import { ItemDataSubType, ItemDataSubTypes } from "../../lib/ItemUtil";
+import React from 'react';
+import { MultiLang } from '../../../config';
+import { ItemDataSubType, ItemDataSubTypes } from '../../lib/ItemUtil';
interface DataTypeProps {
lang: MultiLang;
@@ -12,7 +12,7 @@ const DataType: React.FC = (props: DataTypeProps) => {
const subtype = ItemDataSubTypes.find((value) => {
return value.type === type;
});
- if (typeof subtype === "undefined") {
+ if (typeof subtype === 'undefined') {
return null;
}
return {subtype.label} ;
diff --git a/src/database/item-type/data/index.tsx b/src/database/item-type/data/index.tsx
index 4109e77..ceef05e 100644
--- a/src/database/item-type/data/index.tsx
+++ b/src/database/item-type/data/index.tsx
@@ -1,7 +1,7 @@
-import DataAdvancedSearch from "./DataAdvancedSearch";
-import DataDetail from "./DataDetail";
-import DataList from "./DataList";
-import DataTop from "./DataTop";
+import DataAdvancedSearch from './DataAdvancedSearch';
+import DataDetail from './DataDetail';
+import DataList from './DataList';
+import DataTop from './DataTop';
const ItemTypeData = {
Top: DataTop,
diff --git a/src/database/item-type/files/FilesAdvancedSearch.tsx b/src/database/item-type/files/FilesAdvancedSearch.tsx
index b16ceb1..4fe46fb 100644
--- a/src/database/item-type/files/FilesAdvancedSearch.tsx
+++ b/src/database/item-type/files/FilesAdvancedSearch.tsx
@@ -1,26 +1,41 @@
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class FilesAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "files";
- this.title = "Files";
- this.state.values["title"] = "";
- this.state.values["data_file_name"] = "";
- this.state.values["data_file_mimetype"] = "";
- this.state.values["data_file_filetype"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
+ this.type = 'files';
+ this.title = 'Files';
+ this.state.values.title = '';
+ this.state.values.data_file_name = '';
+ this.state.values.data_file_mimetype = '';
+ this.state.values.data_file_filetype = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "- [en]File Name[/en][ja]ファイル名[/ja]", value: this.renderFieldInputText("data_file_name", 50) },
- { label: "- [en]MIME Type[/en][ja]MIMEタイプ[/ja]", value: this.renderFieldInputText("data_file_mimetype", 50) },
- { label: "- [en]File Type[/en][ja]ファイルタイプ[/ja]", value: this.renderFieldInputText("data_file_filetype", 20) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '- [en]File Name[/en][ja]ファイル名[/ja]',
+ value: this.renderFieldInputText('data_file_name', 50),
+ },
+ {
+ label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]',
+ value: this.renderFieldInputText('data_file_mimetype', 50),
+ },
+ {
+ label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]',
+ value: this.renderFieldInputText('data_file_filetype', 20),
+ },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/files/FilesDetail.tsx b/src/database/item-type/files/FilesDetail.tsx
index bf9d365..6d87e58 100644
--- a/src/database/item-type/files/FilesDetail.tsx
+++ b/src/database/item-type/files/FilesDetail.tsx
@@ -1,30 +1,61 @@
-import React from "react";
-import Functions from "../../../functions";
-import { ItemFiles } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
+import Functions from '../../../functions';
+import { ItemFiles } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
class FilesDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemFiles;
return [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Data File[/en][ja]データファイル[/ja]", value: },
- { label: "- [en]File Name[/en][ja]ファイル名[/ja]", value: item.data_file_name },
- { label: "- [en]MIME Type[/en][ja]MIMEタイプ[/ja]", value: item.data_file_mimetype },
- { label: "- [en]File Type[/en][ja]ファイルタイプ[/ja]", value: item.data_file_filetype },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Data File[/en][ja]データファイル[/ja]',
+ value: (
+
+ ),
+ },
+ { label: '- [en]File Name[/en][ja]ファイル名[/ja]', value: item.data_file_name },
+ { label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]', value: item.data_file_mimetype },
+ { label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]', value: item.data_file_filetype },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
}
}
diff --git a/src/database/item-type/files/FilesList.tsx b/src/database/item-type/files/FilesList.tsx
index 328970c..02952d1 100644
--- a/src/database/item-type/files/FilesList.tsx
+++ b/src/database/item-type/files/FilesList.tsx
@@ -1,15 +1,14 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_files.gif";
-import { ItemFiles } from "../../lib/ItemUtil";
-import Contributer from "../lib/field/Contributer";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_files.gif';
+import { ItemFiles } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
+import Contributor from '../lib/field/Contributor';
class FilesList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Files";
+ this.label = 'Files';
this.icon = iconFile;
}
@@ -20,7 +19,7 @@ class FilesList extends ListBase {
<>
{Functions.mlang(item.title, lang)}
-
+
{item.data_file_mimetype}
>
diff --git a/src/database/item-type/files/FilesTop.tsx b/src/database/item-type/files/FilesTop.tsx
index 64c56fa..3f91270 100644
--- a/src/database/item-type/files/FilesTop.tsx
+++ b/src/database/item-type/files/FilesTop.tsx
@@ -1,14 +1,14 @@
-import iconFile from "../../assets/images/icon_files.gif";
-import { ItemFilesSubTypes } from "../../lib/ItemUtil";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_files.gif';
+import { ItemFilesSubTypes } from '../../lib/ItemUtil';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class FilesTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "files";
- this.label = "Files";
+ this.type = 'files';
+ this.label = 'Files';
this.icon = iconFile;
- this.description = "[en]Various type of File.[/en][ja]ファイル[/ja]";
+ this.description = '[en]Various type of File.[/en][ja]ファイル[/ja]';
this.subTypes = ItemFilesSubTypes;
}
}
diff --git a/src/database/item-type/files/index.tsx b/src/database/item-type/files/index.tsx
index 116672f..c34c2d7 100644
--- a/src/database/item-type/files/index.tsx
+++ b/src/database/item-type/files/index.tsx
@@ -1,7 +1,7 @@
-import FilesAdvancedSearch from "./FilesAdvancedSearch";
-import FilesDetail from "./FilesDetail";
-import FilesList from "./FilesList";
-import FilesTop from "./FilesTop";
+import FilesAdvancedSearch from './FilesAdvancedSearch';
+import FilesDetail from './FilesDetail';
+import FilesList from './FilesList';
+import FilesTop from './FilesTop';
const ItemTypeFiles = {
Top: FilesTop,
diff --git a/src/database/item-type/index.tsx b/src/database/item-type/index.tsx
index 09102ba..2e0a993 100644
--- a/src/database/item-type/index.tsx
+++ b/src/database/item-type/index.tsx
@@ -1,7 +1,21 @@
-import React from 'react';
-import { MultiLang, BrainAtlasType } from '../../config';
+import { BrainAtlasType, MultiLang } from '../../config';
import AdvancedSearchQuery from '../lib/AdvancedSearchQuery';
-import { Item, ItemBinder, ItemBook, ItemConference, ItemData, ItemFiles, ItemModel, ItemPaper, ItemPresentation, ItemSimulator, ItemStimulus, ItemTool, ItemUrl, ItemMemo } from '../lib/ItemUtil';
+import {
+ Item,
+ ItemBinder,
+ ItemBook,
+ ItemConference,
+ ItemData,
+ ItemFiles,
+ ItemMemo,
+ ItemModel,
+ ItemPaper,
+ ItemPresentation,
+ ItemSimulator,
+ ItemStimulus,
+ ItemTool,
+ ItemUrl,
+} from '../lib/ItemUtil';
import ItemTypeBinder from './binder';
import ItemTypeBook from './book';
import ItemTypeConference from './conference';
@@ -17,166 +31,168 @@ import ItemTypeTool from './tool';
import ItemTypeUrl from './url';
interface TopProps {
- lang: MultiLang;
- itemType: string;
- type: BrainAtlasType;
+ lang: MultiLang;
+ itemType: string;
+ type: BrainAtlasType;
}
const Top = (props: TopProps) => {
- const { lang, itemType, type } = props;
- switch (itemType) {
- case 'xnpbinder':
- return ;
- case 'xnpbook':
- return ;
- case 'xnpconference':
- return ;
- case 'xnpdata':
- return ;
- case 'xnpfiles':
- return ;
- case 'xnpmemo':
- return ;
- case 'xnpmodel':
- return ;
- case 'xnppaper':
- return ;
- case 'xnppresentation':
- return ;
- case 'xnpsimulator':
- return ;
- case 'xnpstimulus':
- return ;
- case 'xnptool':
- return ;
- case 'xnpurl':
- return ;
- default:
- return null;
- }
-}
+ const { lang, itemType, type } = props;
+ switch (itemType) {
+ case 'xnpbinder':
+ return ;
+ case 'xnpbook':
+ return ;
+ case 'xnpconference':
+ return ;
+ case 'xnpdata':
+ return ;
+ case 'xnpfiles':
+ return ;
+ case 'xnpmemo':
+ return ;
+ case 'xnpmodel':
+ return ;
+ case 'xnppaper':
+ return ;
+ case 'xnppresentation':
+ return ;
+ case 'xnpsimulator':
+ return ;
+ case 'xnpstimulus':
+ return ;
+ case 'xnptool':
+ return ;
+ case 'xnpurl':
+ return ;
+ default:
+ return null;
+ }
+};
interface ListProps {
- lang: MultiLang;
- item: Item;
- type: BrainAtlasType;
+ lang: MultiLang;
+ item: Item;
+ type: BrainAtlasType;
}
const List = (props: ListProps) => {
- const { lang, item, type } = props;
- switch (item.item_type_name) {
- case 'xnpbinder':
- return ;
- case 'xnpbook':
- return ;
- case 'xnpconference':
- return ;
- case 'xnpdata':
- return ;
- case 'xnpfiles':
- return ;
- case 'xnpmemo':
- return ;
- case 'xnpmodel':
- return ;
- case 'xnppaper':
- return ;
- case 'xnppresentation':
- return ;
- case 'xnpsimulator':
- return ;
- case 'xnpstimulus':
- return ;
- case 'xnptool':
- return ;
- case 'xnpurl':
- return ;
- default:
- return null;
- }
-}
+ const { lang, item, type } = props;
+ switch (item.item_type_name) {
+ case 'xnpbinder':
+ return ;
+ case 'xnpbook':
+ return ;
+ case 'xnpconference':
+ return ;
+ case 'xnpdata':
+ return ;
+ case 'xnpfiles':
+ return ;
+ case 'xnpmemo':
+ return ;
+ case 'xnpmodel':
+ return ;
+ case 'xnppaper':
+ return ;
+ case 'xnppresentation':
+ return ;
+ case 'xnpsimulator':
+ return ;
+ case 'xnpstimulus':
+ return ;
+ case 'xnptool':
+ return ;
+ case 'xnpurl':
+ return ;
+ default:
+ return null;
+ }
+};
interface DetailProps {
- lang: MultiLang;
- item: Item;
- type: BrainAtlasType;
+ lang: MultiLang;
+ item: Item;
+ type: BrainAtlasType;
}
const Detail = (props: DetailProps) => {
- const { lang, item, type } = props;
- switch (item.item_type_name) {
- case 'xnpbinder':
- return ;
- case 'xnpbook':
- return ;
- case 'xnpconference':
- return ;
- case 'xnpdata':
- return ;
- case 'xnpfiles':
- return ;
- case 'xnpmemo':
- return ;
- case 'xnpmodel':
- return ;
- case 'xnppaper':
- return ;
- case 'xnppresentation':
- return ;
- case 'xnpsimulator':
- return ;
- case 'xnpstimulus':
- return ;
- case 'xnptool':
- return ;
- case 'xnpurl':
- return ;
- default:
- return null;
- }
-}
+ const { lang, item, type } = props;
+ switch (item.item_type_name) {
+ case 'xnpbinder':
+ return ;
+ case 'xnpbook':
+ return ;
+ case 'xnpconference':
+ return ;
+ case 'xnpdata':
+ return ;
+ case 'xnpfiles':
+ return ;
+ case 'xnpmemo':
+ return ;
+ case 'xnpmodel':
+ return ;
+ case 'xnppaper':
+ return ;
+ case 'xnppresentation':
+ return (
+
+ );
+ case 'xnpsimulator':
+ return ;
+ case 'xnpstimulus':
+ return ;
+ case 'xnptool':
+ return ;
+ case 'xnpurl':
+ return ;
+ default:
+ return null;
+ }
+};
interface AdvancedSearchProps {
- lang: MultiLang;
- type: string;
- query: AdvancedSearchQuery;
+ lang: MultiLang;
+ type: string;
+ query: AdvancedSearchQuery;
}
const AdvancedSearch = (props: AdvancedSearchProps) => {
- const { lang, type, query } = props;
- switch (type) {
- case 'xnpbinder':
- return ;
- case 'xnpbook':
- return ;
- case 'xnpconference':
- return ;
- case 'xnpdata':
- return ;
- case 'xnpfiles':
- return ;
- case 'xnpmemo':
- return ;
- case 'xnpmodel':
- return ;
- case 'xnppaper':
- return ;
- case 'xnppresentation':
- return ;
- case 'xnpsimulator':
- return ;
- case 'xnpstimulus':
- return ;
- case 'xnptool':
- return ;
- case 'xnpurl':
- return ;
- default:
- return null;
- }
-}
+ const { lang, type, query } = props;
+ switch (type) {
+ case 'xnpbinder':
+ return ;
+ case 'xnpbook':
+ return ;
+ case 'xnpconference':
+ return ;
+ case 'xnpdata':
+ return ;
+ case 'xnpfiles':
+ return ;
+ case 'xnpmemo':
+ return ;
+ case 'xnpmodel':
+ return ;
+ case 'xnppaper':
+ return ;
+ case 'xnppresentation':
+ return ;
+ case 'xnpsimulator':
+ return ;
+ case 'xnpstimulus':
+ return ;
+ case 'xnptool':
+ return ;
+ case 'xnpurl':
+ return ;
+ default:
+ return null;
+ }
+};
const ItemType = {
- Top,
- List,
- Detail,
- AdvancedSearch
-}
+ Top,
+ List,
+ Detail,
+ AdvancedSearch,
+};
-export default ItemType;
\ No newline at end of file
+export default ItemType;
diff --git a/src/database/item-type/lib/AdvancedSearchBase.tsx b/src/database/item-type/lib/AdvancedSearchBase.tsx
index 7a1929c..760026c 100644
--- a/src/database/item-type/lib/AdvancedSearchBase.tsx
+++ b/src/database/item-type/lib/AdvancedSearchBase.tsx
@@ -1,8 +1,8 @@
-import React, { ChangeEvent } from "react";
-import { MultiLang } from "../../../config";
-import Functions from "../../../functions";
-import AdvancedSearchQuery from "../../lib/AdvancedSearchQuery";
-import { ItemSubTypes } from "../../lib/ItemUtil";
+import React from 'react';
+import { MultiLang } from '../../../config';
+import Functions from '../../../functions';
+import AdvancedSearchQuery from '../../lib/AdvancedSearchQuery';
+import { ItemSubTypesAll } from '../../lib/ItemUtil';
export interface AdvancedSearchBaseProps {
lang: MultiLang;
@@ -11,12 +11,12 @@ export interface AdvancedSearchBaseProps {
interface State {
show: boolean;
- values: any;
+ values: Record;
}
class AdvancedSearchBase extends React.Component {
- protected type: string = "base";
- protected title: string = "Base";
+ protected type = 'base';
+ protected title = 'Base';
protected query: AdvancedSearchQuery;
protected ignoreKeys: string[] = [];
@@ -55,13 +55,13 @@ class AdvancedSearchBase extends React.Component
}
updateField(key: string, value: string) {
- let values = Object.assign({}, this.state.values);
+ const values = Object.assign({}, this.state.values);
values[key] = value;
this.updateQuery(key, value);
this.setState({ values });
}
- handleChangeTitleCheck(e: ChangeEvent) {
+ handleChangeTitleCheck(e: React.ChangeEvent) {
const show = e.target.checked;
if (show) {
Object.keys(this.state.values).forEach((key) => {
@@ -79,14 +79,22 @@ class AdvancedSearchBase extends React.Component
}
renderFieldInputText(key: string, size: number) {
- const onChange = (e: ChangeEvent) => {
+ const onChange: React.ChangeEventHandler = (e) => {
this.updateField(key, e.target.value);
};
- return ;
+ return (
+
+ );
}
- renderFieldSelect(key: string, values: ItemSubTypes) {
- const onChange = (e: ChangeEvent) => {
+ renderFieldSelect(key: string, values: ItemSubTypesAll) {
+ const onChange: React.ChangeEventHandler = (e) => {
this.updateField(key, e.target.value);
};
const options = values.map(({ type, label }, i) => {
@@ -105,18 +113,31 @@ class AdvancedSearchBase extends React.Component
}
renderFieldDate(label: string, keyYear: string, keyMonth: string, keyMday: string) {
- const onChange = (e: ChangeEvent) => {
+ const onChange: React.ChangeEventHandler = (e) => {
if (e.target.checked) {
this.deleteIgnoreKey(keyYear);
- keyMonth !== "" && this.deleteIgnoreKey(keyMonth);
- keyMday !== "" && this.deleteIgnoreKey(keyMday);
+ keyMonth !== '' && this.deleteIgnoreKey(keyMonth);
+ keyMday !== '' && this.deleteIgnoreKey(keyMday);
} else {
this.setIgnoreKey(keyYear);
- keyMonth !== "" && this.setIgnoreKey(keyMonth);
- keyMday !== "" && this.setIgnoreKey(keyMday);
+ keyMonth !== '' && this.setIgnoreKey(keyMonth);
+ keyMday !== '' && this.setIgnoreKey(keyMday);
}
};
- const month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+ const month = [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ];
const monthOptions = month.map((value, i) => {
return (
@@ -124,29 +145,40 @@ class AdvancedSearchBase extends React.Component
);
});
- let mdayOptions: JSX.Element[] = [];
+ const mdayOptions: JSX.Element[] = [];
for (let i = 1; i <= 31; i++) {
mdayOptions.push(
{i}
-
+ ,
);
}
return (
{label.length !== 0 && {label} }
- {keyMonth !== "" && (
- this.updateField(keyMonth, e.target.value)}>
+ {keyMonth !== '' && (
+ this.updateField(keyMonth, e.target.value)}
+ >
{monthOptions}
)}
- {keyMday !== "" && (
- this.updateField(keyMday, e.target.value)}>
+ {keyMday !== '' && (
+ this.updateField(keyMday, e.target.value)}
+ >
{mdayOptions}
)}
- this.updateField(keyYear, e.target.value)} />
+ this.updateField(keyYear, e.target.value)}
+ />
);
}
@@ -158,7 +190,7 @@ class AdvancedSearchBase extends React.Component
}
const rows = this.getRows();
const fields = rows.map((value, idx) => {
- const evenodd = idx % 2 === 0 ? "even" : "odd";
+ const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return (
{Functions.mlang(value.label, lang)}
@@ -180,7 +212,11 @@ class AdvancedSearchBase extends React.Component
-
+ this.handleChangeTitleCheck(e)}
+ />
{this.title}
diff --git a/src/database/item-type/lib/DetailBase.tsx b/src/database/item-type/lib/DetailBase.tsx
index 7521213..1674108 100644
--- a/src/database/item-type/lib/DetailBase.tsx
+++ b/src/database/item-type/lib/DetailBase.tsx
@@ -1,11 +1,12 @@
-import React, { ReactNode } from "react";
-import { BrainAtlasType, MultiLang } from "../../../config";
-import Functions from "../../../functions";
-import { Item } from "../../lib/ItemUtil";
+import React from 'react';
+
+import { BrainAtlasType, MultiLang } from '../../../config';
+import Functions from '../../../functions';
+import { Item } from '../../lib/ItemUtil';
export interface DetailBaseField {
label: string;
- value: ReactNode;
+ value: React.ReactNode;
}
export interface DetailBaseProps {
@@ -22,7 +23,7 @@ class DetailBase extends React.Component {
render() {
const { lang } = this.props;
const elements = this.getFields().map((value, idx) => {
- const evenodd = idx % 2 === 0 ? "even" : "odd";
+ const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return (
{Functions.mlang(value.label, lang)}
diff --git a/src/database/item-type/lib/ListBase.tsx b/src/database/item-type/lib/ListBase.tsx
index 3a96c21..876124c 100644
--- a/src/database/item-type/lib/ListBase.tsx
+++ b/src/database/item-type/lib/ListBase.tsx
@@ -1,7 +1,8 @@
-import React from "react";
-import { BrainAtlasType, MultiLang } from "../../../config";
-import ItemUtil, { Item } from "../../lib/ItemUtil";
-import SimPFLinkIcon from "./field/SimPFLinkIcon";
+import React from 'react';
+
+import { BrainAtlasType, MultiLang } from '../../../config';
+import ItemUtil, { Item } from '../../lib/ItemUtil';
+import SimPFLinkIcon from './field/SimPFLinkIcon';
export interface ListBaseProps {
lang: MultiLang;
@@ -10,8 +11,8 @@ export interface ListBaseProps {
}
class ListBase extends React.Component {
- protected label = "";
- protected icon = "";
+ protected label = '';
+ protected icon = '';
protected url: string;
protected simpfLinkUrl: string;
diff --git a/src/database/item-type/lib/TopBase.tsx b/src/database/item-type/lib/TopBase.tsx
index 4e15ee0..2568a4c 100644
--- a/src/database/item-type/lib/TopBase.tsx
+++ b/src/database/item-type/lib/TopBase.tsx
@@ -1,8 +1,9 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../../../config";
-import Functions from "../../../functions";
-import ItemUtil, { ItemSubTypes } from "../../lib/ItemUtil";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../../../config';
+import Functions from '../../../functions';
+import ItemUtil, { ItemSubTypesAll } from '../../lib/ItemUtil';
export interface TopBaseProps {
lang: MultiLang;
@@ -10,22 +11,22 @@ export interface TopBaseProps {
}
class TopBase extends React.Component {
- protected type: string = "";
- protected label: string = "";
- protected icon: string = "";
- protected description: string = "";
- protected subTypes: ItemSubTypes = [];
+ protected type = '';
+ protected label = '';
+ protected icon = '';
+ protected description = '';
+ protected subTypes: ItemSubTypesAll = [];
render() {
const { lang, type } = this.props;
- const url = ItemUtil.getItemTypeSearchUrl(type, this.type, "");
+ const url = ItemUtil.getItemTypeSearchUrl(type, this.type, '');
const links = this.subTypes.map((subtype, i) => {
const url = ItemUtil.getItemTypeSearchUrl(type, this.type, subtype.type);
return (
-
- {i > 0 && " / "}
+
+ {i > 0 && ' / '}
{subtype.label}
-
+
);
});
return (
diff --git a/src/database/item-type/lib/field/Author.tsx b/src/database/item-type/lib/field/Author.tsx
index 3286e84..f2d6c9d 100644
--- a/src/database/item-type/lib/field/Author.tsx
+++ b/src/database/item-type/lib/field/Author.tsx
@@ -1,18 +1,19 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
interface Props {
lang: MultiLang;
author: string[];
}
-const Author: React.FC = (props: Props) => {
+const Author: React.FC = (props) => {
const { author } = props;
if (author.length === 0) {
return null;
}
const elements = author.map((value, idx) => {
- const evenodd = idx % 2 === 0 ? "even" : "odd";
+ const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return (
{value}
diff --git a/src/database/item-type/lib/field/ChangeLog.tsx b/src/database/item-type/lib/field/ChangeLog.tsx
index b95cdfa..a92470c 100644
--- a/src/database/item-type/lib/field/ChangeLog.tsx
+++ b/src/database/item-type/lib/field/ChangeLog.tsx
@@ -1,15 +1,16 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
-import Functions from "../../../../functions";
-import { ItemBasicChangeLog } from "../../../lib/ItemUtil";
-import DateTime from "./DateTime";
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
+import Functions from '../../../../functions';
+import { ItemBasicChangeLog } from '../../../lib/ItemUtil';
+import DateTime from './DateTime';
interface Props {
lang: MultiLang;
changelog: ItemBasicChangeLog[];
}
-const ChangeLog: React.FC = (props: Props) => {
+const ChangeLog: React.FC = (props) => {
const { lang, changelog } = props;
if (changelog.length === 0) {
return null;
diff --git a/src/database/item-type/lib/field/Contributer.tsx b/src/database/item-type/lib/field/Contributer.tsx
deleted file mode 100644
index 0ab3b80..0000000
--- a/src/database/item-type/lib/field/Contributer.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
-import Functions from "../../../../functions";
-
-interface Props {
- lang: MultiLang;
- uname: string;
- name: string;
-}
-
-const Contributer: React.FC = (props: Props) => {
- const { lang, name, uname } = props;
- const unsubscribed = "([en]Unsubscribed User[/en][ja]退会済みユーザ[/ja])";
- const label = uname === "" ? unsubscribed : name === "" ? uname : name + " (" + uname + ")";
- return {Functions.mlang(label, lang)} ;
-};
-
-export default Contributer;
diff --git a/src/database/item-type/lib/field/Contributor.tsx b/src/database/item-type/lib/field/Contributor.tsx
new file mode 100644
index 0000000..8b741ba
--- /dev/null
+++ b/src/database/item-type/lib/field/Contributor.tsx
@@ -0,0 +1,19 @@
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
+import Functions from '../../../../functions';
+
+interface Props {
+ lang: MultiLang;
+ uname: string;
+ name: string;
+}
+
+const Contributor: React.FC = (props) => {
+ const { lang, name, uname } = props;
+ const unsubscribed = '([en]Unsubscribed User[/en][ja]退会済みユーザ[/ja])';
+ const label = uname === '' ? unsubscribed : name === '' ? uname : name + ' (' + uname + ')';
+ return {Functions.mlang(label, lang)} ;
+};
+
+export default Contributor;
diff --git a/src/database/item-type/lib/field/CreativeCommons.tsx b/src/database/item-type/lib/field/CreativeCommons.tsx
index b542619..4505ec6 100644
--- a/src/database/item-type/lib/field/CreativeCommons.tsx
+++ b/src/database/item-type/lib/field/CreativeCommons.tsx
@@ -1,51 +1,57 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
+import React from 'react';
-export type CreativeCommonsType = "by" | "by-nc" | "by-nc-nd" | "by-nc-sa" | "by-nd" | "by-sa";
+import { MultiLang } from '../../../../config';
-export const getCreativeCommonsType = (ccCommercialUse: number, ccModification: number): CreativeCommonsType => {
+type CreativeCommonsType = 'by' | 'by-nc' | 'by-nc-nd' | 'by-nc-sa' | 'by-nd' | 'by-sa';
+
+const getCreativeCommonsType = (
+ ccCommercialUse: number,
+ ccModification: number,
+): CreativeCommonsType => {
const cc = ccCommercialUse * 10 + ccModification;
switch (cc) {
case 0:
- return "by-nc-nd";
+ return 'by-nc-nd';
case 1:
- return "by-nc-sa";
+ return 'by-nc-sa';
case 2:
- return "by-nc";
+ return 'by-nc';
case 10:
- return "by-nd";
+ return 'by-nd';
case 11:
- return "by-sa";
+ return 'by-sa';
case 12:
default:
- return "by";
+ return 'by';
}
};
interface Props {
lang: MultiLang;
- type: CreativeCommonsType;
+ ccCommercialUse: number;
+ ccModification: number;
}
-const CreativeCommons: React.FC = (props: Props) => {
- const { type } = props;
- const url = "http://creativecommons.org/licenses/" + type + "/4.0/";
- const logoUrl = "https://i.creativecommons.org/l/" + type + "/4.0/88x31.png";
+const CreativeCommons: React.FC = (props) => {
+ const { ccCommercialUse, ccModification } = props;
+ const type = getCreativeCommonsType(ccCommercialUse, ccModification);
+ const url = 'http://creativecommons.org/licenses/' + type + '/4.0/';
+ const logoUrl = 'https://i.creativecommons.org/l/' + type + '/4.0/88x31.png';
const labels = {
- by: "Attribution",
- nc: "NonCommercial",
- nd: "NoDerivatives",
- sa: "ShareAlike",
+ by: 'Attribution',
+ nc: 'NonCommercial',
+ nd: 'NoDerivatives',
+ sa: 'ShareAlike',
};
const label = type
- .split("-")
+ .split('-')
.map((value) => {
- const prop = value as "by" | "nc" | "nd" | "sa";
+ const prop = value as 'by' | 'nc' | 'nd' | 'sa';
return labels[prop];
})
- .join("-");
+ .join('-');
return (
-
+
@@ -54,9 +60,9 @@ const CreativeCommons: React.FC = (props: Props) => {
- This work is licensed under a{" "}
+ This work is licensed under a{' '}
- Criative Commons {label} 4.0 International License
+ Creative Commons {label} 4.0 International License
.
diff --git a/src/database/item-type/lib/field/DateTime.tsx b/src/database/item-type/lib/field/DateTime.tsx
index aa97e35..22b057e 100644
--- a/src/database/item-type/lib/field/DateTime.tsx
+++ b/src/database/item-type/lib/field/DateTime.tsx
@@ -1,6 +1,7 @@
-import moment from "moment";
-import React from "react";
-import { MultiLang } from "../../../../config";
+import React from 'react';
+
+import moment from 'moment';
+import { MultiLang } from '../../../../config';
interface Props {
lang: MultiLang;
@@ -8,12 +9,12 @@ interface Props {
onlyDate?: boolean;
}
-const DateTime: React.FC = (props: Props) => {
+const DateTime: React.FC = (props) => {
const { date, onlyDate } = props;
const d = moment(new Date(date * 1000));
- let format = "MMM D, Y";
- if (typeof onlyDate === "undefined" || !onlyDate) {
- format += " HH:mm:ss";
+ let format = 'MMM D, Y';
+ if (typeof onlyDate === 'undefined' || !onlyDate) {
+ format += ' HH:mm:ss';
}
return {d.format(format)} ;
};
diff --git a/src/database/item-type/lib/field/Description.tsx b/src/database/item-type/lib/field/Description.tsx
index 8560d9f..1d517c8 100644
--- a/src/database/item-type/lib/field/Description.tsx
+++ b/src/database/item-type/lib/field/Description.tsx
@@ -1,6 +1,7 @@
-import React from "react";
-import XoopsCode from "../../../../common/lib/XoopsCode";
-import { MultiLang } from "../../../../config";
+import React from 'react';
+
+import XoopsCode from '../../../../common/lib/XoopsCode';
+import { MultiLang } from '../../../../config';
interface Props {
lang: MultiLang;
@@ -8,10 +9,10 @@ interface Props {
className?: string;
}
-const Description: React.FC = (props: Props) => {
+const Description: React.FC = (props) => {
const { lang, description, className } = props;
const textarea = ;
- const name = typeof className === "undefined" ? "description" : className;
+ const name = typeof className === 'undefined' ? 'description' : className;
return {textarea}
;
};
diff --git a/src/database/item-type/lib/field/FileDownloadButton.tsx b/src/database/item-type/lib/field/FileDownloadButton.tsx
index 7aad15a..9a6eed8 100644
--- a/src/database/item-type/lib/field/FileDownloadButton.tsx
+++ b/src/database/item-type/lib/field/FileDownloadButton.tsx
@@ -1,8 +1,9 @@
-import React from "react";
-import { BrainAtlasType, MultiLang } from "../../../../config";
-import ItemUtil, { ItemBasicFile } from "../../../lib/ItemUtil";
-import styles from "./FileDownloadButton.module.css";
-import LicenseAgreementDialog from "./LicenseAgreementDialog";
+import React from 'react';
+
+import { BrainAtlasType, MultiLang } from '../../../../config';
+import ItemUtil, { ItemBasicFile } from '../../../lib/ItemUtil';
+import styles from './FileDownloadButton.module.css';
+import LicenseAgreementDialog from './LicenseAgreementDialog';
interface Props {
lang: MultiLang;
@@ -14,44 +15,45 @@ interface Props {
type: BrainAtlasType;
}
-interface State {
- show: boolean;
-}
+const FileDownloadButton: React.FC = (props) => {
+ const { lang, file, rights, useCc, ccCommercialUse, ccModification, type } = props;
-class FileDownloadButton extends React.Component {
- constructor(props: Props) {
- super(props);
- this.state = {
- show: false,
- };
- this.handleClickDownload = this.handleClickDownload.bind(this);
- this.unsetShow = this.unsetShow.bind(this);
- }
+ const [show, setShow] = React.useState(false);
- handleClickDownload(e: React.MouseEvent) {
- if (this.props.rights !== "") {
+ const handleClickDownload: React.MouseEventHandler = (e) => {
+ if (rights !== '') {
e.stopPropagation();
e.preventDefault();
- this.setState({ show: true });
+ setShow(true);
}
- }
+ };
- unsetShow() {
- this.setState({ show: false });
- }
-
- render() {
- const { lang, file, rights, useCc, ccCommercialUse, ccModification, type } = this.props;
- const url = ItemUtil.getFileUrl(type, this.props.file);
- return (
- <>
-
- Download
-
-
- >
- );
- }
-}
+ const url = ItemUtil.getFileUrl(type, file);
+ return (
+ <>
+
+ Download
+
+ setShow(false)}
+ type={type}
+ />
+ >
+ );
+};
export default FileDownloadButton;
diff --git a/src/database/item-type/lib/field/FileSize.tsx b/src/database/item-type/lib/field/FileSize.tsx
index d567676..11661e0 100644
--- a/src/database/item-type/lib/field/FileSize.tsx
+++ b/src/database/item-type/lib/field/FileSize.tsx
@@ -1,16 +1,17 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
interface Props {
lang: MultiLang;
size: number;
}
-const FileSize: React.FC = (props: Props) => {
+const FileSize: React.FC = (props) => {
const { size } = props;
- const units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
+ const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const power = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0;
- const label = Math.round((size / Math.pow(1024, power)) * 10) / 10 + " " + units[power];
+ const label = Math.round((size / Math.pow(1024, power)) * 10) / 10 + ' ' + units[power];
return {label} ;
};
diff --git a/src/database/item-type/lib/field/FreeKeyword.tsx b/src/database/item-type/lib/field/FreeKeyword.tsx
index 95445ef..29c8f8a 100644
--- a/src/database/item-type/lib/field/FreeKeyword.tsx
+++ b/src/database/item-type/lib/field/FreeKeyword.tsx
@@ -1,17 +1,18 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
interface Props {
lang: MultiLang;
keyword: string[];
}
-const FreeKeyword: React.FC = (props: Props) => {
+const FreeKeyword: React.FC = (props) => {
const { keyword } = props;
if (keyword.length === 0) {
return null;
}
- const label = keyword.join(", ");
+ const label = keyword.join(', ');
return {label} ;
};
diff --git a/src/database/item-type/lib/field/ItemFile.tsx b/src/database/item-type/lib/field/ItemFile.tsx
index b191cde..30bd565 100644
--- a/src/database/item-type/lib/field/ItemFile.tsx
+++ b/src/database/item-type/lib/field/ItemFile.tsx
@@ -1,15 +1,16 @@
-import React from "react";
-import { BrainAtlasType, MultiLang } from "../../../../config";
-import Functions from "../../../../functions";
-import { ItemBasicFile } from "../../../lib/ItemUtil";
-import DateTime from "./DateTime";
-import FileDownloadButton from "./FileDownloadButton";
-import FileSize from "./FileSize";
+import React from 'react';
+
+import { BrainAtlasType, MultiLang } from '../../../../config';
+import Functions from '../../../../functions';
+import { ItemBasicFile } from '../../../lib/ItemUtil';
+import DateTime from './DateTime';
+import FileDownloadButton from './FileDownloadButton';
+import FileSize from './FileSize';
interface Props {
lang: MultiLang;
file: ItemBasicFile[];
- ftype: string;
+ fileType: string;
rights?: string;
useCc?: number;
ccCommercialUse?: number;
@@ -18,17 +19,24 @@ interface Props {
type: BrainAtlasType;
}
-const ItemFile: React.FC = (props: Props) => {
- const { lang, file, ftype, type } = props;
- const rights = typeof props.rights === "undefined" ? "" : props.rights;
- const useCc = typeof props.useCc === "undefined" ? 0 : props.useCc;
- const ccCommercialUse = typeof props.ccCommercialUse === "undefined" ? 0 : props.ccCommercialUse;
- const ccModification = typeof props.ccModification === "undefined" ? 0 : props.ccModification;
- const downloadLimit = typeof props.downloadLimit === "undefined" ? 0 : props.downloadLimit;
+const ItemFile: React.FC = (props) => {
+ const {
+ lang,
+ file,
+ fileType,
+ type,
+ rights = '',
+ useCc = 0,
+ ccCommercialUse = 0,
+ ccModification = 0,
+ downloadLimit = 0,
+ } = props;
+
const data = file.find((value) => {
- return value.file_type_name === ftype;
+ return value.file_type_name === fileType;
});
- if (typeof data === "undefined") {
+
+ if (typeof data === 'undefined') {
return null;
}
const date = new Date(data.timestamp);
@@ -42,7 +50,19 @@ const ItemFile: React.FC = (props: Props) => {
Type
: {data.mime_type}
- {downloadLimit === 0 && }
+
+ {downloadLimit === 0 && (
+
+ )}
+
Size
@@ -60,7 +80,9 @@ const ItemFile: React.FC = (props: Props) => {
{downloadLimit === 1 && (
<>
- ({Functions.mlang("[en]File has been removed[/en][ja]ファイルは削除されました[/ja]", lang)})
+ (
+ {Functions.mlang('[en]File has been removed[/en][ja]ファイルは削除されました[/ja]', lang)}
+ )
>
)}
diff --git a/src/database/item-type/lib/field/ItemIndex.tsx b/src/database/item-type/lib/field/ItemIndex.tsx
index 4f49001..89e3776 100644
--- a/src/database/item-type/lib/field/ItemIndex.tsx
+++ b/src/database/item-type/lib/field/ItemIndex.tsx
@@ -1,9 +1,10 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../../../../config";
-import Functions from "../../../../functions";
-import IndexUtil from "../../../lib/IndexUtil";
-import { ItemBasicIndex } from "../../../lib/ItemUtil";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../../../../config';
+import Functions from '../../../../functions';
+import IndexUtil from '../../../lib/IndexUtil';
+import { ItemBasicIndex } from '../../../lib/ItemUtil';
interface Props {
lang: MultiLang;
@@ -11,13 +12,13 @@ interface Props {
type: BrainAtlasType;
}
-const ItemIndex: React.FC = (props: Props) => {
+const ItemIndex: React.FC = (props) => {
const { lang, index, type } = props;
if (index.length === 0) {
return null;
}
const elements = index.map((value, idx) => {
- const evenodd = idx % 2 === 0 ? "even" : "odd";
+ const evenodd = idx % 2 === 0 ? 'even' : 'odd';
const url = IndexUtil.getUrl(type, value.index_id);
return (
diff --git a/src/database/item-type/lib/field/Language.tsx b/src/database/item-type/lib/field/Language.tsx
index 6dc5859..1655c3e 100644
--- a/src/database/item-type/lib/field/Language.tsx
+++ b/src/database/item-type/lib/field/Language.tsx
@@ -1,30 +1,30 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
-import Functions from "../../../../functions";
-import { ItemBasicLang } from "../../../lib/ItemUtil";
+import React from 'react';
+import { MultiLang } from '../../../../config';
+import Functions from '../../../../functions';
+import { ItemBasicLang } from '../../../lib/ItemUtil';
interface Props {
lang: MultiLang;
itemLang: ItemBasicLang;
}
-const Language: React.FC = (props: Props) => {
+const Language: React.FC = (props) => {
const { lang, itemLang } = props;
const langStr = {
- eng: "[en]English[/en][ja]英語[/ja]",
- jpn: "[en]Japanese[/en][ja]日本語[/ja]",
- fra: "[en]French[/en][ja]フランス語[/ja]",
- deu: "[en]German[/en][ja]ドイツ語[/ja]",
- esl: "[en]Spanish[/en][ja]スペイン語[/ja]",
- ita: "[en]Italian[/en][ja]イタリア語[/ja]",
- dut: "[en]Dutch[/en][ja]オランダ語[/ja]",
- sve: "[en]Swedish[/en][ja]スウェーデン語[/ja]",
- nor: "[en]Norwegian[/en][ja]ノルウェー語[/ja]",
- dan: "[en]Danish[/en][ja]デンマーク語[/ja]",
- fin: "[en]Finnish[/en][ja]フィンランド語[/ja]",
- por: "[en]Portuguese[/en][ja]ポルトガル語[/ja]",
- chi: "[en]Chinese[/en][ja]中国語[/ja]",
- kor: "[en]Korean[/en][ja]韓国語[/ja]",
+ eng: '[en]English[/en][ja]英語[/ja]',
+ jpn: '[en]Japanese[/en][ja]日本語[/ja]',
+ fra: '[en]French[/en][ja]フランス語[/ja]',
+ deu: '[en]German[/en][ja]ドイツ語[/ja]',
+ esl: '[en]Spanish[/en][ja]スペイン語[/ja]',
+ ita: '[en]Italian[/en][ja]イタリア語[/ja]',
+ dut: '[en]Dutch[/en][ja]オランダ語[/ja]',
+ sve: '[en]Swedish[/en][ja]スウェーデン語[/ja]',
+ nor: '[en]Norwegian[/en][ja]ノルウェー語[/ja]',
+ dan: '[en]Danish[/en][ja]デンマーク語[/ja]',
+ fin: '[en]Finnish[/en][ja]フィンランド語[/ja]',
+ por: '[en]Portuguese[/en][ja]ポルトガル語[/ja]',
+ chi: '[en]Chinese[/en][ja]中国語[/ja]',
+ kor: '[en]Korean[/en][ja]韓国語[/ja]',
};
if (!(itemLang in langStr)) {
return null;
diff --git a/src/database/item-type/lib/field/LicenseAgreementDialog.tsx b/src/database/item-type/lib/field/LicenseAgreementDialog.tsx
index 95d4342..0d8cced 100644
--- a/src/database/item-type/lib/field/LicenseAgreementDialog.tsx
+++ b/src/database/item-type/lib/field/LicenseAgreementDialog.tsx
@@ -1,12 +1,14 @@
-import React, { ChangeEvent, MouseEvent } from "react";
-import { Modal } from "react-overlays";
-import { BrainAtlasType, MultiLang } from "../../../../config";
-import Functions from "../../../../functions";
-import ItemUtil, { ItemBasicFile } from "../../../lib/ItemUtil";
-import DateTime from "./DateTime";
-import FileSize from "./FileSize";
-import styles from "./LicenseAgreementDialog.module.css";
-import Rights from "./Rights";
+import React from 'react';
+
+import { Modal } from 'react-overlays';
+import { RenderModalBackdropProps } from 'react-overlays/cjs/Modal';
+import { BrainAtlasType, MultiLang } from '../../../../config';
+import Functions from '../../../../functions';
+import ItemUtil, { ItemBasicFile } from '../../../lib/ItemUtil';
+import DateTime from './DateTime';
+import FileSize from './FileSize';
+import styles from './LicenseAgreementDialog.module.css';
+import Rights from './Rights';
interface Props {
lang: MultiLang;
@@ -20,117 +22,138 @@ interface Props {
type: BrainAtlasType;
}
-interface State {
- show: boolean;
- disabled: boolean;
-}
+const LicenseAgreementDialog: React.FC = (props) => {
+ const { lang, file, rights, useCc, ccCommercialUse, ccModification, show, unsetShow, type } =
+ props;
-class LicenseAgreementDialog extends React.Component {
- constructor(props: Props) {
- super(props);
- this.state = {
- show: props.show,
- disabled: false,
- };
- this.handleChangeCheckbox = this.handleChangeCheckbox.bind(this);
- this.handleClickDownload = this.handleClickDownload.bind(this);
- this.handleClickCancel = this.handleClickCancel.bind(this);
- }
+ const [isShow, setIsShow] = React.useState(show);
+ const [disabled, setDisabled] = React.useState(false);
- static getDerivedStateFromProps(nextProps: Props, prevState: State) {
- if (nextProps.show && !prevState.show) {
- return { disabled: true, show: nextProps.show };
+ React.useEffect(() => {
+ if (show) {
+ setDisabled(true);
}
- return null;
- }
+ }, [show]);
- handleChangeCheckbox(e: ChangeEvent) {
- const disabled = e.target.value === "0";
- this.setState({ disabled });
- }
+ const handleChangeCheckbox: React.ChangeEventHandler = (e) => {
+ const disabled = e.target.value === '0';
+ setDisabled(disabled);
+ };
- handleClickDownload(e: MouseEvent) {
- this.props.unsetShow();
- this.setState({ show: false });
- }
+ const handleClickDownload: React.MouseEventHandler = () => {
+ unsetShow();
+ setIsShow(false);
+ };
- handleClickCancel() {
- this.props.unsetShow();
- this.setState({ show: false });
- }
+ const handleClickCancel = () => {
+ unsetShow();
+ setIsShow(false);
+ };
- renderBackdrop(props: any) {
+ const renderBackdrop = (props: RenderModalBackdropProps) => {
return
;
- }
+ };
- render() {
- const { lang, type } = this.props;
- const date = new Date(this.props.file.timestamp);
- const timestamp = Math.floor(date.valueOf() / 1000);
- const url = ItemUtil.getFileUrl(type, this.props.file);
- return (
-
+ const date = new Date(file.timestamp);
+ const timestamp = Math.floor(date.valueOf() / 1000);
+ const url = ItemUtil.getFileUrl(type, file);
+ return (
+
+
-
- {Functions.mlang("[en]Download file information[/en][ja]ダウンロードするファイルの情報[/ja]", lang)}
-
- {this.props.file.original_file_name}
-
-
-
-
- Type
- : {this.props.file.mime_type}
-
-
- Size
-
- :
-
-
-
- Last updated
-
- :
-
-
-
-
-
-
-
-
- {Functions.mlang("[en]License agreement[/en][ja]ファイルのライセンス[/ja]", lang)}
-
-
-
-
- Acceptance is needed to download this file.
+ {Functions.mlang(
+ '[en]Download file information[/en][ja]ダウンロードするファイルの情報[/ja]',
+ lang,
+ )}
+
+ {file.original_file_name}
-
-
- Download
-
-
-
- Cancel
-
+
+
+
+ Type
+ : {file.mime_type}
+
+
+ Size
+
+ :
+
+
+
+ Last updated
+
+ :
+
+
+
+
-
- );
- }
-}
+
+
+ {Functions.mlang('[en]License agreement[/en][ja]ファイルのライセンス[/ja]', lang)}
+
+
+
+
+ Acceptance is needed to download this file.
+
+
+
+ Download
+
+
+
+ Cancel
+
+
+
+
+ );
+};
export default LicenseAgreementDialog;
diff --git a/src/database/item-type/lib/field/Preview.module.css b/src/database/item-type/lib/field/Preview.module.css
index 7d1e2aa..351a794 100644
--- a/src/database/item-type/lib/field/Preview.module.css
+++ b/src/database/item-type/lib/field/Preview.module.css
@@ -4,7 +4,7 @@
}
.previewBox::after {
- content: "";
+ content: '';
display: block;
clear: both;
}
diff --git a/src/database/item-type/lib/field/Preview.tsx b/src/database/item-type/lib/field/Preview.tsx
index 83ac472..167168d 100644
--- a/src/database/item-type/lib/field/Preview.tsx
+++ b/src/database/item-type/lib/field/Preview.tsx
@@ -1,10 +1,12 @@
-import React from "react";
-import Lightbox from "react-image-lightbox";
-import "react-image-lightbox/style.css";
-import { BrainAtlasType, MultiLang } from "../../../../config";
-import Functions from "../../../../functions";
-import ItemUtil, { ItemBasicFile } from "../../../lib/ItemUtil";
-import styles from "./Preview.module.css";
+import React from 'react';
+
+import Lightbox, { SlideImage } from 'yet-another-react-lightbox';
+import { BrainAtlasType, MultiLang } from '../../../../config';
+import Functions from '../../../../functions';
+import ItemUtil, { ItemBasicFile } from '../../../lib/ItemUtil';
+
+import 'yet-another-react-lightbox/styles.css';
+import styles from './Preview.module.css';
interface Props {
lang: MultiLang;
@@ -12,75 +14,49 @@ interface Props {
type: BrainAtlasType;
}
-interface State {
- isOpen: boolean;
- imageIndex: number;
-}
+const Preview: React.FC
= (props) => {
+ const { lang, file, type } = props;
-class Preview extends React.Component {
- constructor(props: Props) {
- super(props);
- this.state = {
- isOpen: false,
- imageIndex: 0,
- };
+ const [isOpen, setIsOpen] = React.useState(false);
+ const [imageIndex, setImageIndex] = React.useState(0);
+
+ const data = file.filter((value) => {
+ return value.file_type_name === 'preview';
+ });
+ if (data.length === 0) {
+ return null;
}
+ const slides: SlideImage[] = [];
- render() {
- const { lang, file, type } = this.props;
- const data = file.filter((value) => {
- return value.file_type_name === "preview";
- });
- if (data.length === 0) {
- return null;
- }
- let imageUrls: string[] = [];
- const previews = data.map((value, idx) => {
- const fileUrl = ItemUtil.getFileUrl(type, value);
- const previewUrl = ItemUtil.getPreviewFileUrl(type, value);
- const caption = Functions.mlang(value.caption, lang);
- imageUrls.push(fileUrl);
- return (
-
- {
- e.preventDefault();
- this.setState({ isOpen: true, imageIndex: idx });
- }}
- >
-
-
- {caption}
-
- );
- });
- const { isOpen, imageIndex } = this.state;
+ const previews = data.map((value, idx) => {
+ const fileUrl = ItemUtil.getFileUrl(type, value);
+ const previewUrl = ItemUtil.getPreviewFileUrl(type, value);
+ const caption = Functions.mlang(value.caption, lang);
+ slides.push({ src: fileUrl });
return (
- <>
- {previews}
- {isOpen && (
- this.setState({ isOpen: false })}
- onMovePrevRequest={() =>
- this.setState({
- imageIndex: (imageIndex + data.length - 1) % data.length,
- })
- }
- onMoveNextRequest={() =>
- this.setState({
- imageIndex: (imageIndex + 1) % data.length,
- })
- }
- />
- )}
- >
+
+ {
+ e.preventDefault();
+ setIsOpen(true);
+ setImageIndex(idx);
+ }}
+ >
+
+
+ {caption}
+
);
- }
-}
+ });
+
+ return (
+ <>
+ {previews}
+ {isOpen && setIsOpen(false)} />}
+ >
+ );
+};
export default Preview;
diff --git a/src/database/item-type/lib/field/PublicationDate.tsx b/src/database/item-type/lib/field/PublicationDate.tsx
index 2e8fc08..d418b26 100644
--- a/src/database/item-type/lib/field/PublicationDate.tsx
+++ b/src/database/item-type/lib/field/PublicationDate.tsx
@@ -1,6 +1,7 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
-import DateTime from "./DateTime";
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
+import DateTime from './DateTime';
interface Props {
lang: MultiLang;
@@ -9,9 +10,9 @@ interface Props {
mday: number;
}
-const PublicationDate: React.FC = (props: Props) => {
+const PublicationDate: React.FC = (props) => {
const { lang, year, month, mday } = props;
- const d = new Date(year + "-" + month + "-" + mday);
+ const d = new Date(year + '-' + month + '-' + mday);
const timestamp = Math.floor(d.valueOf() / 1000);
return ;
};
diff --git a/src/database/item-type/lib/field/Readme.tsx b/src/database/item-type/lib/field/Readme.tsx
index 53eea97..e45e58a 100644
--- a/src/database/item-type/lib/field/Readme.tsx
+++ b/src/database/item-type/lib/field/Readme.tsx
@@ -1,13 +1,14 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
-import Description from "./Description";
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
+import Description from './Description';
interface Props {
lang: MultiLang;
readme: string;
}
-const Readme: React.FC = (props: Props) => {
+const Readme: React.FC = (props) => {
const { lang, readme } = props;
return ;
};
diff --git a/src/database/item-type/lib/field/RelatedTo.tsx b/src/database/item-type/lib/field/RelatedTo.tsx
index 1d4d7b5..db8a2fa 100644
--- a/src/database/item-type/lib/field/RelatedTo.tsx
+++ b/src/database/item-type/lib/field/RelatedTo.tsx
@@ -1,7 +1,8 @@
-import React from "react";
-import { BrainAtlasType, MultiLang } from "../../../../config";
-import ItemType from "../../../item-type";
-import ItemUtil from "../../../lib/ItemUtil";
+import React from 'react';
+
+import { BrainAtlasType, MultiLang } from '../../../../config';
+import ItemType from '../../../item-type';
+import ItemUtil from '../../../lib/ItemUtil';
interface Props {
lang: MultiLang;
@@ -9,44 +10,26 @@ interface Props {
type: BrainAtlasType;
}
-interface State {
- elements: JSX.Element[];
-}
+const RelatedTo: React.FC = (props) => {
+ const { lang, relatedTo, type } = props;
+ const isMounted = React.useRef(false);
-class RelatedTo extends React.Component {
- private isActive: boolean;
+ const [elements, setElements] = React.useState([]);
- constructor(props: Props) {
- super(props);
- this.state = {
- elements: [],
+ React.useEffect(() => {
+ isMounted.current = true;
+ return () => {
+ isMounted.current = false;
};
- this.isActive = false;
- }
+ }, []);
- componentDidMount() {
- this.isActive = true;
- this.updateElements(this.props.relatedTo);
- }
-
- componentDidUpdate(prevProps: Props) {
- if (JSON.stringify(this.props.relatedTo) !== JSON.stringify(prevProps.relatedTo)) {
- this.updateElements(this.props.relatedTo);
- }
- }
-
- componentWillUnmount() {
- this.isActive = false;
- }
-
- updateElements(relatedTo: number[]) {
- const { lang, type } = this.props;
+ React.useEffect(() => {
if (relatedTo.length === 0) {
- this.setState({ elements: [] });
+ setElements([]);
} else {
ItemUtil.getList(type, relatedTo, (results) => {
const elements = results.data.map((item, idx) => {
- const evenodd = idx % 0 ? "even" : "odd";
+ const evenodd = idx % 0 ? 'even' : 'odd';
return (
@@ -55,28 +38,26 @@ class RelatedTo extends React.Component {
);
});
- if (this.isActive) {
- this.setState({ elements });
+ if (isMounted.current) {
+ setElements(elements);
}
});
}
- }
+ }, [lang, relatedTo, type]);
- render() {
- if (this.state.elements.length === 0) {
- return null;
- }
- return (
-
-
-
- Item summary
-
- {this.state.elements}
-
-
- );
+ if (elements.length === 0) {
+ return null;
}
-}
+ return (
+
+
+
+ Item summary
+
+ {elements}
+
+
+ );
+};
export default RelatedTo;
diff --git a/src/database/item-type/lib/field/Rights.tsx b/src/database/item-type/lib/field/Rights.tsx
index cd223b5..6c26d25 100644
--- a/src/database/item-type/lib/field/Rights.tsx
+++ b/src/database/item-type/lib/field/Rights.tsx
@@ -1,7 +1,8 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
-import CreativeCommons, { getCreativeCommonsType } from "./CreativeCommons";
-import Description from "./Description";
+import React from 'react';
+
+import { MultiLang } from '../../../../config';
+import CreativeCommons from './CreativeCommons';
+import Description from './Description';
interface Props {
lang: MultiLang;
@@ -11,13 +12,18 @@ interface Props {
ccModification: number;
}
-const Rights: React.FC = (props: Props) => {
+const Rights: React.FC = (props) => {
const { lang, rights, useCc, ccCommercialUse, ccModification } = props;
if (useCc === 0) {
return ;
}
- const ccType = getCreativeCommonsType(ccCommercialUse, ccModification);
- return ;
+ return (
+
+ );
};
export default Rights;
diff --git a/src/database/item-type/lib/field/SimPFLinkIcon.tsx b/src/database/item-type/lib/field/SimPFLinkIcon.tsx
index 01bbde3..c2ca294 100644
--- a/src/database/item-type/lib/field/SimPFLinkIcon.tsx
+++ b/src/database/item-type/lib/field/SimPFLinkIcon.tsx
@@ -1,6 +1,6 @@
-import React from "react";
-import { MultiLang } from "../../../../config";
-import imageButton from "../../../assets/images/simpf_button.png";
+import React from 'react';
+import { MultiLang } from '../../../../config';
+import imageButton from '../../../assets/images/simpf_button.png';
interface Props {
lang: MultiLang;
@@ -8,11 +8,11 @@ interface Props {
isDetail: boolean;
}
-const SimPFLinkIcon: React.FC = (props: Props) => {
+const SimPFLinkIcon: React.FC = (props) => {
const { url, isDetail } = props;
- const title = "Online Simulation";
+ const title = 'Online Simulation';
const size = isDetail ? 64 : 35;
- if (url === "") {
+ if (url === '') {
return null;
}
return (
diff --git a/src/database/item-type/lib/field/index.tsx b/src/database/item-type/lib/field/index.tsx
index 5a98dbb..56726f0 100644
--- a/src/database/item-type/lib/field/index.tsx
+++ b/src/database/item-type/lib/field/index.tsx
@@ -1,25 +1,25 @@
-import Author from "./Author";
-import ChangeLog from "./ChangeLog";
-import Contributer from "./Contributer";
-import CreativeCommons from "./CreativeCommons";
-import DateTime from "./DateTime";
-import Description from "./Description";
-import FileDownloadButton from "./FileDownloadButton";
-import FileSize from "./FileSize";
-import FreeKeyword from "./FreeKeyword";
-import ItemFile from "./ItemFile";
-import ItemIndex from "./ItemIndex";
-import Language from "./Language";
-import Preview from "./Preview";
-import PublicationDate from "./PublicationDate";
-import Readme from "./Readme";
-import RelatedTo from "./RelatedTo";
-import Rights from "./Rights";
+import Author from './Author';
+import ChangeLog from './ChangeLog';
+import Contributor from './Contributor';
+import CreativeCommons from './CreativeCommons';
+import DateTime from './DateTime';
+import Description from './Description';
+import FileDownloadButton from './FileDownloadButton';
+import FileSize from './FileSize';
+import FreeKeyword from './FreeKeyword';
+import ItemFile from './ItemFile';
+import ItemIndex from './ItemIndex';
+import Language from './Language';
+import Preview from './Preview';
+import PublicationDate from './PublicationDate';
+import Readme from './Readme';
+import RelatedTo from './RelatedTo';
+import Rights from './Rights';
const ItemTypeField = {
Author,
ChangeLog,
- Contributer,
+ Contributor,
CreativeCommons,
DateTime,
Description,
diff --git a/src/database/item-type/memo/MemoAdvancedSearch.tsx b/src/database/item-type/memo/MemoAdvancedSearch.tsx
index be68075..1e14ba6 100644
--- a/src/database/item-type/memo/MemoAdvancedSearch.tsx
+++ b/src/database/item-type/memo/MemoAdvancedSearch.tsx
@@ -1,24 +1,33 @@
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class MemoAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "memo";
- this.title = "Memo";
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["item_link"] = "";
+ this.type = 'memo';
+ this.title = 'Memo';
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.item_link = '';
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Item Link[/en][ja]リンク[/ja]", value: this.renderFieldInputText("item_link", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ {
+ label: '[en]Item Link[/en][ja]リンク[/ja]',
+ value: this.renderFieldInputText('item_link', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/memo/MemoDetail.tsx b/src/database/item-type/memo/MemoDetail.tsx
index 79e4e3a..e11d2dd 100644
--- a/src/database/item-type/memo/MemoDetail.tsx
+++ b/src/database/item-type/memo/MemoDetail.tsx
@@ -1,29 +1,63 @@
-import React from "react";
-import XoopsCode from "../../../common/lib/XoopsCode";
-import Functions from "../../../functions";
-import { ItemMemo } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
+import XoopsCode from '../../../common/lib/XoopsCode';
+import Functions from '../../../functions';
+import { ItemMemo } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
class MemoDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemMemo;
const fields = [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Item Link[/en][ja]リンク[/ja]", value: },
- { label: "[en]Memo File[/en][ja]メモファイル[/ja]", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Item Link[/en][ja]リンク[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Memo File[/en][ja]メモファイル[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
return fields;
}
diff --git a/src/database/item-type/memo/MemoList.tsx b/src/database/item-type/memo/MemoList.tsx
index b5c32cd..dd049fe 100644
--- a/src/database/item-type/memo/MemoList.tsx
+++ b/src/database/item-type/memo/MemoList.tsx
@@ -1,22 +1,21 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import XoopsCode from "../../../common/lib/XoopsCode";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_memo.gif";
-import { ItemMemo } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import { Link } from 'react-router-dom';
+import XoopsCode from '../../../common/lib/XoopsCode';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_memo.gif';
+import { ItemMemo } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
class MemoList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Memo";
+ this.label = 'Memo';
this.icon = iconFile;
}
renderBody() {
const { lang } = this.props;
const item = this.props.item as ItemMemo;
- const link = item.item_link !== "" ? : null;
+ const link = item.item_link !== '' ? : null;
return (
<>
{Functions.mlang(item.title, lang)}
diff --git a/src/database/item-type/memo/MemoTop.tsx b/src/database/item-type/memo/MemoTop.tsx
index 18ccb71..41e6018 100644
--- a/src/database/item-type/memo/MemoTop.tsx
+++ b/src/database/item-type/memo/MemoTop.tsx
@@ -1,13 +1,13 @@
-import iconFile from "../../assets/images/icon_memo.gif";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_memo.gif';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class MemoTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "memo";
- this.label = "Memo";
+ this.type = 'memo';
+ this.label = 'Memo';
this.icon = iconFile;
- this.description = "[en]Personal Memo Pad.[/en][ja]汎用メモパッド[/ja]";
+ this.description = '[en]Personal Memo Pad.[/en][ja]汎用メモパッド[/ja]';
}
}
diff --git a/src/database/item-type/memo/index.tsx b/src/database/item-type/memo/index.tsx
index f6aa676..9d6842b 100644
--- a/src/database/item-type/memo/index.tsx
+++ b/src/database/item-type/memo/index.tsx
@@ -1,7 +1,7 @@
-import MemoAdvancedSearch from "./MemoAdvancedSearch";
-import MemoDetail from "./MemoDetail";
-import MemoList from "./MemoList";
-import MemoTop from "./MemoTop";
+import MemoAdvancedSearch from './MemoAdvancedSearch';
+import MemoDetail from './MemoDetail';
+import MemoList from './MemoList';
+import MemoTop from './MemoTop';
const ItemTypeMemo = {
Top: MemoTop,
diff --git a/src/database/item-type/model/ModelAdvancedSearch.tsx b/src/database/item-type/model/ModelAdvancedSearch.tsx
index d3d67eb..1706875 100644
--- a/src/database/item-type/model/ModelAdvancedSearch.tsx
+++ b/src/database/item-type/model/ModelAdvancedSearch.tsx
@@ -1,31 +1,46 @@
-import { ItemModelSubTypes } from "../../lib/ItemUtil";
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import { ItemModelSubTypes } from '../../lib/ItemUtil';
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class ModelAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "model";
- this.title = "Model";
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["model_type"] = "";
- this.state.values["creator"] = "";
- this.state.values["file.preview.caption"] = "";
- this.state.values["file.model_data.original_file_name"] = "";
+ this.type = 'model';
+ this.title = 'Model';
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.model_type = '';
+ this.state.values.creator = '';
+ this.state.values['file.preview.caption'] = '';
+ this.state.values['file.model_data.original_file_name'] = '';
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Model Type[/en][ja]モデルタイプ[/ja]", value: this.renderFieldSelect("model_type", ItemModelSubTypes) },
- { label: "[en]Creator[/en][ja]作成者[/ja]", value: this.renderFieldInputText("creator", 50) },
- { label: "[en]Caption[/en][ja]キャプション[/ja]", value: this.renderFieldInputText("file.preview.caption", 50) },
- { label: "[en]Model File[/en][ja]モデルファイル[/ja]", value: this.renderFieldInputText("file.model_data.original_file_name", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ {
+ label: '[en]Model Type[/en][ja]モデルタイプ[/ja]',
+ value: this.renderFieldSelect('model_type', ItemModelSubTypes),
+ },
+ { label: '[en]Creator[/en][ja]作成者[/ja]', value: this.renderFieldInputText('creator', 50) },
+ {
+ label: '[en]Caption[/en][ja]キャプション[/ja]',
+ value: this.renderFieldInputText('file.preview.caption', 50),
+ },
+ {
+ label: '[en]Model File[/en][ja]モデルファイル[/ja]',
+ value: this.renderFieldInputText('file.model_data.original_file_name', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/model/ModelDetail.tsx b/src/database/item-type/model/ModelDetail.tsx
index c0cddb8..5ec00b7 100644
--- a/src/database/item-type/model/ModelDetail.tsx
+++ b/src/database/item-type/model/ModelDetail.tsx
@@ -1,38 +1,102 @@
-import React from "react";
-import Functions from "../../../functions";
-import ItemUtil, { ItemModel } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
-import SimPFLinkIcon from "../lib/field/SimPFLinkIcon";
-import ModelUtil from "./ModelUtil";
+import Functions from '../../../functions';
+import ItemUtil, { ItemModel } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
+import SimPFLinkIcon from '../lib/field/SimPFLinkIcon';
+import ModelUtil from './ModelUtil';
class ModelDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemModel;
const fields = [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Model Type[/en][ja]モデルタイプ[/ja]", value: },
- { label: "[en]Creator[/en][ja]作成者[/ja]", value: },
- { label: "[en]Preview[/en][ja]プレビュー[/ja]", value: },
- { label: "[en]Model File[/en][ja]モデルファイル[/ja]", value: },
- { label: "Readme", value: },
- { label: "Rights", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Model Type[/en][ja]モデルタイプ[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Creator[/en][ja]作成者[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Preview[/en][ja]プレビュー[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Model File[/en][ja]モデルファイル[/ja]',
+ value: (
+
+ ),
+ },
+ { label: 'Readme', value: },
+ {
+ label: 'Rights',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
- if (simpfLinkUrl !== "") {
- const field = { label: "Online Simulation", value: };
+ if (simpfLinkUrl !== '') {
+ const field = {
+ label: 'Online Simulation',
+ value: ,
+ };
fields.splice(13, 0, field);
}
return fields;
diff --git a/src/database/item-type/model/ModelList.tsx b/src/database/item-type/model/ModelList.tsx
index 8456172..c552726 100644
--- a/src/database/item-type/model/ModelList.tsx
+++ b/src/database/item-type/model/ModelList.tsx
@@ -1,14 +1,15 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_model.gif";
-import { ItemModel } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_model.gif';
+import { ItemModel } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
class ModelList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Model";
+ this.label = 'Model';
this.icon = iconFile;
}
@@ -17,10 +18,10 @@ class ModelList extends ListBase {
const item = this.props.item as ItemModel;
const authors = item.creator.map((author, i) => {
return (
-
- {i > 0 && ", "}
+
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
-
+
);
});
return (
diff --git a/src/database/item-type/model/ModelTop.tsx b/src/database/item-type/model/ModelTop.tsx
index 80a6931..f2844da 100644
--- a/src/database/item-type/model/ModelTop.tsx
+++ b/src/database/item-type/model/ModelTop.tsx
@@ -1,14 +1,14 @@
-import iconFile from "../../assets/images/icon_model.gif";
-import { ItemModelSubTypes } from "../../lib/ItemUtil";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_model.gif';
+import { ItemModelSubTypes } from '../../lib/ItemUtil';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class ModelTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "model";
- this.label = "Model";
+ this.type = 'model';
+ this.label = 'Model';
this.icon = iconFile;
- this.description = "[en]Model programs/scripts.[/en][ja]モデル プログラム/スクリプト[/ja]";
+ this.description = '[en]Model programs/scripts.[/en][ja]モデル プログラム/スクリプト[/ja]';
this.subTypes = ItemModelSubTypes;
}
}
diff --git a/src/database/item-type/model/ModelUtil.tsx b/src/database/item-type/model/ModelUtil.tsx
index a636bff..7649e7a 100644
--- a/src/database/item-type/model/ModelUtil.tsx
+++ b/src/database/item-type/model/ModelUtil.tsx
@@ -1,6 +1,6 @@
-import React from "react";
-import { MultiLang } from "../../../config";
-import { ItemModelSubType, ItemModelSubTypes } from "../../lib/ItemUtil";
+import React from 'react';
+import { MultiLang } from '../../../config';
+import { ItemModelSubType, ItemModelSubTypes } from '../../lib/ItemUtil';
interface ModelTypeProps {
lang: MultiLang;
@@ -12,7 +12,7 @@ const ModelType: React.FC = (props: ModelTypeProps) => {
const subtype = ItemModelSubTypes.find((value) => {
return value.type === type;
});
- if (typeof subtype === "undefined") {
+ if (typeof subtype === 'undefined') {
return null;
}
return {subtype.label} ;
diff --git a/src/database/item-type/model/index.tsx b/src/database/item-type/model/index.tsx
index 2e0ca62..603192b 100644
--- a/src/database/item-type/model/index.tsx
+++ b/src/database/item-type/model/index.tsx
@@ -1,7 +1,7 @@
-import ModelAdvancedSearch from "./ModelAdvancedSearch";
-import ModelDetail from "./ModelDetail";
-import ModelList from "./ModelList";
-import ModelTop from "./ModelTop";
+import ModelAdvancedSearch from './ModelAdvancedSearch';
+import ModelDetail from './ModelDetail';
+import ModelList from './ModelList';
+import ModelTop from './ModelTop';
const ItemTypeModel = {
Top: ModelTop,
diff --git a/src/database/item-type/paper/PaperAdvancedSearch.tsx b/src/database/item-type/paper/PaperAdvancedSearch.tsx
index b9ffdd0..55bb513 100644
--- a/src/database/item-type/paper/PaperAdvancedSearch.tsx
+++ b/src/database/item-type/paper/PaperAdvancedSearch.tsx
@@ -1,36 +1,48 @@
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class PaperAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "paper";
- this.title = "Paper";
- this.state.values["pubmed_id"] = "";
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["author"] = "";
- this.state.values["journal"] = "";
- this.state.values["publication_year"] = "";
- this.state.values["volume"] = "";
- this.state.values["number"] = "";
- this.state.values["page"] = "";
+ this.type = 'paper';
+ this.title = 'Paper';
+ this.state.values.pubmed_id = '';
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.author = '';
+ this.state.values.journal = '';
+ this.state.values.publication_year = '';
+ this.state.values.volume = '';
+ this.state.values.number = '';
+ this.state.values.page = '';
}
getRows() {
const rows = [
- { label: "PubMed ID", value: this.renderFieldInputText("pubmed_id", 50) },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Author[/en][ja]著者[/ja]", value: this.renderFieldInputText("author", 50) },
- { label: "[en]Journal[/en][ja]ジャーナル[/ja]", value: this.renderFieldInputText("journal", 50) },
- { label: "[en]Publication Year[/en][ja]出版年[/ja]", value: this.renderFieldInputText("publication_year", 10) },
- { label: "[en]Volume[/en][ja]巻[/ja]", value: this.renderFieldInputText("volume", 50) },
- { label: "[en]Number[/en][ja]号[/ja]", value: this.renderFieldInputText("number", 50) },
- { label: "[en]Page[/en][ja]ページ[/ja]", value: this.renderFieldInputText("page", 50) },
+ { label: 'PubMed ID', value: this.renderFieldInputText('pubmed_id', 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ { label: '[en]Author[/en][ja]著者[/ja]', value: this.renderFieldInputText('author', 50) },
+ {
+ label: '[en]Journal[/en][ja]ジャーナル[/ja]',
+ value: this.renderFieldInputText('journal', 50),
+ },
+ {
+ label: '[en]Publication Year[/en][ja]出版年[/ja]',
+ value: this.renderFieldInputText('publication_year', 10),
+ },
+ { label: '[en]Volume[/en][ja]巻[/ja]', value: this.renderFieldInputText('volume', 50) },
+ { label: '[en]Number[/en][ja]号[/ja]', value: this.renderFieldInputText('number', 50) },
+ { label: '[en]Page[/en][ja]ページ[/ja]', value: this.renderFieldInputText('page', 50) },
];
return rows;
}
diff --git a/src/database/item-type/paper/PaperDetail.tsx b/src/database/item-type/paper/PaperDetail.tsx
index 76d0174..e5c1bc3 100644
--- a/src/database/item-type/paper/PaperDetail.tsx
+++ b/src/database/item-type/paper/PaperDetail.tsx
@@ -1,34 +1,63 @@
-import React from "react";
-import Functions from "../../../functions";
-import { ItemPaper } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
-import PaperUtil from "./PaperUtil";
+import Functions from '../../../functions';
+import { ItemPaper } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
+import PaperUtil from './PaperUtil';
class PaperDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemPaper;
return [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "PubMed ID", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Author[/en][ja]著者[/ja]", value: },
- { label: "[en]Journal[/en][ja]ジャーナル[/ja]", value: Functions.mlang(item.journal, lang) },
- { label: "[en]Publication Year[/en][ja]出版年[/ja]", value: item.publication_year },
- { label: "[en]Volume[/en][ja]巻[/ja]", value: item.volume },
- { label: "[en]Number[/en][ja]号[/ja]", value: item.number },
- { label: "[en]Page[/en][ja]ページ[/ja]", value: item.page },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: 'PubMed ID', value: },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Author[/en][ja]著者[/ja]',
+ value: ,
+ },
+ { label: '[en]Journal[/en][ja]ジャーナル[/ja]', value: Functions.mlang(item.journal, lang) },
+ { label: '[en]Publication Year[/en][ja]出版年[/ja]', value: item.publication_year },
+ { label: '[en]Volume[/en][ja]巻[/ja]', value: item.volume },
+ { label: '[en]Number[/en][ja]号[/ja]', value: item.number },
+ { label: '[en]Page[/en][ja]ページ[/ja]', value: item.page },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
}
}
diff --git a/src/database/item-type/paper/PaperList.tsx b/src/database/item-type/paper/PaperList.tsx
index 0a660d7..7600c34 100644
--- a/src/database/item-type/paper/PaperList.tsx
+++ b/src/database/item-type/paper/PaperList.tsx
@@ -1,15 +1,16 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_paper.gif";
-import { ItemPaper } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
-import PaperUtil from "./PaperUtil";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_paper.gif';
+import { ItemPaper } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
+import PaperUtil from './PaperUtil';
class PaperList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Paper";
+ this.label = 'Paper';
this.icon = iconFile;
}
@@ -18,10 +19,10 @@ class PaperList extends ListBase {
const item = this.props.item as ItemPaper;
const authors = item.author.map((author, i) => {
return (
-
- {i > 0 && ", "}
+
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
-
+
);
});
return (
@@ -32,12 +33,12 @@ class PaperList extends ListBase {
{Functions.mlang(item.journal, lang)}
{item.publication_year}
- {item.volume !== null && " ;" + item.volume}
- {item.number !== null && " (" + item.number + ")"}
- {item.page !== "" && " :" + item.page}
- {item.pubmed_id !== "" && (
+ {item.volume !== null && ' ;' + item.volume}
+ {item.number !== null && ' (' + item.number + ')'}
+ {item.page !== '' && ' :' + item.page}
+ {item.pubmed_id !== '' && (
<>
- {" "}
+ {' '}
[PMID:
]
>
diff --git a/src/database/item-type/paper/PaperTop.tsx b/src/database/item-type/paper/PaperTop.tsx
index 76a32cb..e31fd0a 100644
--- a/src/database/item-type/paper/PaperTop.tsx
+++ b/src/database/item-type/paper/PaperTop.tsx
@@ -1,13 +1,13 @@
-import iconFile from "../../assets/images/icon_paper.gif";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_paper.gif';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class PaperTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "paper";
- this.label = "Paper";
+ this.type = 'paper';
+ this.label = 'Paper';
this.icon = iconFile;
- this.description = "[en]Related paper collection.[/en][ja]関連論文[/ja]";
+ this.description = '[en]Related paper collection.[/en][ja]関連論文[/ja]';
}
}
diff --git a/src/database/item-type/paper/PaperUtil.tsx b/src/database/item-type/paper/PaperUtil.tsx
index ccbc999..d9314c2 100644
--- a/src/database/item-type/paper/PaperUtil.tsx
+++ b/src/database/item-type/paper/PaperUtil.tsx
@@ -1,5 +1,5 @@
-import React from "react";
-import { MultiLang } from "../../../config";
+import React from 'react';
+import { MultiLang } from '../../../config';
interface PubmedLinkProps {
lang: MultiLang;
@@ -8,10 +8,10 @@ interface PubmedLinkProps {
const PubmedLink: React.FC = (props: PubmedLinkProps) => {
const { pubmedId } = props;
- if (pubmedId === "") {
+ if (pubmedId === '') {
return null;
}
- const url = "https://www.ncbi.nlm.nih.gov/pubmed/" + pubmedId;
+ const url = 'https://www.ncbi.nlm.nih.gov/pubmed/' + pubmedId;
return (
{pubmedId}
diff --git a/src/database/item-type/paper/index.tsx b/src/database/item-type/paper/index.tsx
index 914b75b..4b8ca3a 100644
--- a/src/database/item-type/paper/index.tsx
+++ b/src/database/item-type/paper/index.tsx
@@ -1,7 +1,7 @@
-import PaperAdvancedSearch from "./PaperAdvancedSearch";
-import PaperDetail from "./PaperDetail";
-import PaperList from "./PaperList";
-import PaperTop from "./PaperTop";
+import PaperAdvancedSearch from './PaperAdvancedSearch';
+import PaperDetail from './PaperDetail';
+import PaperList from './PaperList';
+import PaperTop from './PaperTop';
const ItemTypePaper = {
Top: PaperTop,
diff --git a/src/database/item-type/presentation/PresentationAdvancedSearch.tsx b/src/database/item-type/presentation/PresentationAdvancedSearch.tsx
index 7c2ee52..e76d049 100644
--- a/src/database/item-type/presentation/PresentationAdvancedSearch.tsx
+++ b/src/database/item-type/presentation/PresentationAdvancedSearch.tsx
@@ -1,43 +1,66 @@
-import { ItemPresentationSubTypes } from "../../lib/ItemUtil";
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import { ItemPresentationSubTypes } from '../../lib/ItemUtil';
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class PresentationAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "presentation";
- this.title = "Presentation";
+ this.type = 'presentation';
+ this.title = 'Presentation';
const now = new Date();
const year = String(now.getFullYear());
const month = String(now.getMonth() + 1);
const mday = String(now.getDate());
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["meeting_name"] = "";
- this.state.values["presentation_type"] = "";
- this.state.values["creator"] = "";
- this.state.values["publication_year"] = year;
- this.state.values["publication_month"] = month;
- this.state.values["publication_mday"] = mday;
- this.state.values["file.preview.caption"] = "";
- this.state.values["file.presentation_file.original_file_name"] = "";
- this.setIgnoreKey("publication_year");
- this.setIgnoreKey("publication_month");
- this.setIgnoreKey("publication_mday");
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.meeting_name = '';
+ this.state.values.presentation_type = '';
+ this.state.values.creator = '';
+ this.state.values.publication_year = year;
+ this.state.values.publication_month = month;
+ this.state.values.publication_mday = mday;
+ this.state.values['file.preview.caption'] = '';
+ this.state.values['file.presentation_file.original_file_name'] = '';
+ this.setIgnoreKey('publication_year');
+ this.setIgnoreKey('publication_month');
+ this.setIgnoreKey('publication_mday');
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Presentation Type[/en][ja]ファイル形式[/ja]", value: this.renderFieldSelect("presentation_type", ItemPresentationSubTypes) },
- { label: "[en]Creator[/en][ja]作成者[/ja]", value: this.renderFieldInputText("creator", 50) },
- { label: "[en]Date[/en][ja]日付[/ja]", value: this.renderFieldDate("", "publication_year", "publication_month", "publication_mday") },
- { label: "[en]Caption[/en][ja]キャプション[/ja]", value: this.renderFieldInputText("file.preview.caption", 50) },
- { label: "[en]Presentation File[/en][ja]発表資料[/ja]", value: this.renderFieldInputText("file.presentation_file.original_file_name", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ {
+ label: '[en]Presentation Type[/en][ja]ファイル形式[/ja]',
+ value: this.renderFieldSelect('presentation_type', ItemPresentationSubTypes),
+ },
+ { label: '[en]Creator[/en][ja]作成者[/ja]', value: this.renderFieldInputText('creator', 50) },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: this.renderFieldDate(
+ '',
+ 'publication_year',
+ 'publication_month',
+ 'publication_mday',
+ ),
+ },
+ {
+ label: '[en]Caption[/en][ja]キャプション[/ja]',
+ value: this.renderFieldInputText('file.preview.caption', 50),
+ },
+ {
+ label: '[en]Presentation File[/en][ja]発表資料[/ja]',
+ value: this.renderFieldInputText('file.presentation_file.original_file_name', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/presentation/PresentationDetail.tsx b/src/database/item-type/presentation/PresentationDetail.tsx
index 58dbc31..0d140e3 100644
--- a/src/database/item-type/presentation/PresentationDetail.tsx
+++ b/src/database/item-type/presentation/PresentationDetail.tsx
@@ -1,34 +1,105 @@
-import React from "react";
-import Functions from "../../../functions";
-import { ItemPresentation } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
-import PresentationUtil from "./PresentationUtil";
+import Functions from '../../../functions';
+import { ItemPresentation } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
+import PresentationUtil from './PresentationUtil';
class PresentationDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemPresentation;
return [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Date[/en][ja]日付[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Presentation Type[/en][ja]ファイル形式[/ja]", value: },
- { label: "[en]Creator[/en][ja]作成者[/ja]", value: },
- { label: "[en]Preview[/en][ja]プレビュー[/ja]", value: },
- { label: "[en]Presentation File[/en][ja]発表資料[/ja]", value: },
- { label: "Readme", value: },
- { label: "Rights", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Presentation Type[/en][ja]ファイル形式[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Creator[/en][ja]作成者[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Preview[/en][ja]プレビュー[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Presentation File[/en][ja]発表資料[/ja]',
+ value: (
+
+ ),
+ },
+ { label: 'Readme', value: },
+ {
+ label: 'Rights',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
}
}
diff --git a/src/database/item-type/presentation/PresentationList.tsx b/src/database/item-type/presentation/PresentationList.tsx
index 1069d12..941e34b 100644
--- a/src/database/item-type/presentation/PresentationList.tsx
+++ b/src/database/item-type/presentation/PresentationList.tsx
@@ -1,15 +1,16 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_presentation.gif";
-import { ItemPresentation } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
-import PresentationUtil from "./PresentationUtil";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_presentation.gif';
+import { ItemPresentation } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
+import PresentationUtil from './PresentationUtil';
class PresentationList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Presentation";
+ this.label = 'Presentation';
this.icon = iconFile;
}
@@ -18,10 +19,10 @@ class PresentationList extends ListBase {
const item = this.props.item as ItemPresentation;
const authors = item.creator.map((author, i) => {
return (
-
- {i > 0 && ", "}
+
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
-
+
);
});
return (
diff --git a/src/database/item-type/presentation/PresentationTop.tsx b/src/database/item-type/presentation/PresentationTop.tsx
index a03c81e..5ab4532 100644
--- a/src/database/item-type/presentation/PresentationTop.tsx
+++ b/src/database/item-type/presentation/PresentationTop.tsx
@@ -1,14 +1,15 @@
-import iconFile from "../../assets/images/icon_presentation.gif";
-import { ItemPresentationSubTypes } from "../../lib/ItemUtil";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_presentation.gif';
+import { ItemPresentationSubTypes } from '../../lib/ItemUtil';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class PresentationTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "presentation";
- this.label = "Presentation";
+ this.type = 'presentation';
+ this.label = 'Presentation';
this.icon = iconFile;
- this.description = "[en]Electrical presentation files.[/en][ja]プレゼンテーション ファイル[/ja]";
+ this.description =
+ '[en]Electrical presentation files.[/en][ja]プレゼンテーション ファイル[/ja]';
this.subTypes = ItemPresentationSubTypes;
}
}
diff --git a/src/database/item-type/presentation/PresentationUtil.tsx b/src/database/item-type/presentation/PresentationUtil.tsx
index 8a13b8d..e1358c0 100644
--- a/src/database/item-type/presentation/PresentationUtil.tsx
+++ b/src/database/item-type/presentation/PresentationUtil.tsx
@@ -1,6 +1,6 @@
-import React from "react";
-import { MultiLang } from "../../../config";
-import { ItemPresentationSubType, ItemPresentationSubTypes } from "../../lib/ItemUtil";
+import React from 'react';
+import { MultiLang } from '../../../config';
+import { ItemPresentationSubType, ItemPresentationSubTypes } from '../../lib/ItemUtil';
interface PresentationTypeProps {
lang: MultiLang;
@@ -12,7 +12,7 @@ const PresentationType: React.FC = (props: PresentationTy
const subtype = ItemPresentationSubTypes.find((value) => {
return value.type === type;
});
- if (typeof subtype === "undefined") {
+ if (typeof subtype === 'undefined') {
return null;
}
return {subtype.label} ;
diff --git a/src/database/item-type/presentation/index.tsx b/src/database/item-type/presentation/index.tsx
index 1a1b016..5274c30 100644
--- a/src/database/item-type/presentation/index.tsx
+++ b/src/database/item-type/presentation/index.tsx
@@ -1,7 +1,7 @@
-import PresentationAdvancedSearch from "./PresentationAdvancedSearch";
-import PresentationDetail from "./PresentationDetail";
-import PresentationList from "./PresentationList";
-import PresentationTop from "./PresentationTop";
+import PresentationAdvancedSearch from './PresentationAdvancedSearch';
+import PresentationDetail from './PresentationDetail';
+import PresentationList from './PresentationList';
+import PresentationTop from './PresentationTop';
const ItemTypePresentation = {
Top: PresentationTop,
diff --git a/src/database/item-type/simulator/SimulatorAdvancedSearch.tsx b/src/database/item-type/simulator/SimulatorAdvancedSearch.tsx
index 672c797..774741d 100644
--- a/src/database/item-type/simulator/SimulatorAdvancedSearch.tsx
+++ b/src/database/item-type/simulator/SimulatorAdvancedSearch.tsx
@@ -1,40 +1,63 @@
-import { ItemSimulatorSubTypes } from "../../lib/ItemUtil";
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import { ItemSimulatorSubTypes } from '../../lib/ItemUtil';
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class SimulatorAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "simulator";
- this.title = "Simulator";
+ this.type = 'simulator';
+ this.title = 'Simulator';
const now = new Date();
const year = String(now.getFullYear());
const month = String(now.getMonth() + 1);
const mday = String(now.getDate());
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["simulator_type"] = "";
- this.state.values["developer"] = "";
- this.state.values["publication_year"] = year;
- this.state.values["publication_month"] = month;
- this.state.values["publication_mday"] = mday;
- this.state.values["file.preview.caption"] = "";
- this.setIgnoreKey("publication_year");
- this.setIgnoreKey("publication_month");
- this.setIgnoreKey("publication_mday");
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.simulator_type = '';
+ this.state.values.developer = '';
+ this.state.values.publication_year = year;
+ this.state.values.publication_month = month;
+ this.state.values.publication_mday = mday;
+ this.state.values['file.preview.caption'] = '';
+ this.setIgnoreKey('publication_year');
+ this.setIgnoreKey('publication_month');
+ this.setIgnoreKey('publication_mday');
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Simulator Type[/en][ja]シミュレータータイプ[/ja]", value: this.renderFieldSelect("simulator_type", ItemSimulatorSubTypes) },
- { label: "[en]Developer[/en][ja]開発者[/ja]", value: this.renderFieldInputText("developer", 50) },
- { label: "[en]Date[/en][ja]日付[/ja]", value: this.renderFieldDate("", "publication_year", "publication_month", "publication_mday") },
- { label: "[en]Caption[/en][ja]キャプション[/ja]", value: this.renderFieldInputText("file.preview.caption", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ {
+ label: '[en]Simulator Type[/en][ja]シミュレータータイプ[/ja]',
+ value: this.renderFieldSelect('simulator_type', ItemSimulatorSubTypes),
+ },
+ {
+ label: '[en]Developer[/en][ja]開発者[/ja]',
+ value: this.renderFieldInputText('developer', 50),
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: this.renderFieldDate(
+ '',
+ 'publication_year',
+ 'publication_month',
+ 'publication_mday',
+ ),
+ },
+ {
+ label: '[en]Caption[/en][ja]キャプション[/ja]',
+ value: this.renderFieldInputText('file.preview.caption', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/simulator/SimulatorDetail.tsx b/src/database/item-type/simulator/SimulatorDetail.tsx
index 4afbfcc..8feec1b 100644
--- a/src/database/item-type/simulator/SimulatorDetail.tsx
+++ b/src/database/item-type/simulator/SimulatorDetail.tsx
@@ -1,39 +1,113 @@
-import React from "react";
-import Functions from "../../../functions";
-import ItemUtil, { ItemSimulator } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
-import SimPFLinkIcon from "../lib/field/SimPFLinkIcon";
-import SimulatorUtil from "./SimulatorUtil";
+import Functions from '../../../functions';
+import ItemUtil, { ItemSimulator } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
+import SimPFLinkIcon from '../lib/field/SimPFLinkIcon';
+import SimulatorUtil from './SimulatorUtil';
class SimulatorDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemSimulator;
const fields = [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Date[/en][ja]日付[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Simulator Type[/en][ja]シミュレータータイプ[/ja]", value: },
- { label: "[en]Developer[/en][ja]開発者[/ja]", value: },
- { label: "[en]Preview[/en][ja]プレビュー[/ja]", value: },
- { label: "[en]Simulator File[/en][ja]ファイル[/ja]", value: },
- { label: "Readme", value: },
- { label: "Rights", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Simulator Type[/en][ja]シミュレータータイプ[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Developer[/en][ja]開発者[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Preview[/en][ja]プレビュー[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Simulator File[/en][ja]ファイル[/ja]',
+ value: (
+
+ ),
+ },
+ { label: 'Readme', value: },
+ {
+ label: 'Rights',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
- if (simpfLinkUrl !== "") {
- const field = { label: "Online Simulation", value: };
+ if (simpfLinkUrl !== '') {
+ const field = {
+ label: 'Online Simulation',
+ value: ,
+ };
fields.splice(14, 0, field);
}
return fields;
diff --git a/src/database/item-type/simulator/SimulatorList.tsx b/src/database/item-type/simulator/SimulatorList.tsx
index 3d58185..7d861ae 100644
--- a/src/database/item-type/simulator/SimulatorList.tsx
+++ b/src/database/item-type/simulator/SimulatorList.tsx
@@ -1,14 +1,15 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_simulator.gif";
-import { ItemSimulator } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_simulator.gif';
+import { ItemSimulator } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
class SimulatorList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Simulator";
+ this.label = 'Simulator';
this.icon = iconFile;
}
@@ -17,10 +18,10 @@ class SimulatorList extends ListBase {
const item = this.props.item as ItemSimulator;
const authors = item.developer.map((author, i) => {
return (
-
- {i > 0 && ", "}
+
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
-
+
);
});
return (
diff --git a/src/database/item-type/simulator/SimulatorTop.tsx b/src/database/item-type/simulator/SimulatorTop.tsx
index d752c35..bb56204 100644
--- a/src/database/item-type/simulator/SimulatorTop.tsx
+++ b/src/database/item-type/simulator/SimulatorTop.tsx
@@ -1,14 +1,15 @@
-import iconFile from "../../assets/images/icon_simulator.gif";
-import { ItemSimulatorSubTypes } from "../../lib/ItemUtil";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_simulator.gif';
+import { ItemSimulatorSubTypes } from '../../lib/ItemUtil';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class SimulatorTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "simulator";
- this.label = "Simulator";
+ this.type = 'simulator';
+ this.label = 'Simulator';
this.icon = iconFile;
- this.description = "[en]Programs/scripts for simulation.[/en][ja]シミュレーション用プログラム/スクリプト[/ja]";
+ this.description =
+ '[en]Programs/scripts for simulation.[/en][ja]シミュレーション用プログラム/スクリプト[/ja]';
this.subTypes = ItemSimulatorSubTypes;
}
}
diff --git a/src/database/item-type/simulator/SimulatorUtil.tsx b/src/database/item-type/simulator/SimulatorUtil.tsx
index 79f56e1..ff4d854 100644
--- a/src/database/item-type/simulator/SimulatorUtil.tsx
+++ b/src/database/item-type/simulator/SimulatorUtil.tsx
@@ -1,6 +1,5 @@
-import React from "react";
-import { MultiLang } from "../../../config";
-import { ItemSimulatorSubType, ItemSimulatorSubTypes } from "../../lib/ItemUtil";
+import { MultiLang } from '../../../config';
+import { ItemSimulatorSubType, ItemSimulatorSubTypes } from '../../lib/ItemUtil';
interface SimulatorTypeProps {
lang: MultiLang;
@@ -12,7 +11,7 @@ const SimulatorType = (props: SimulatorTypeProps) => {
const subtype = ItemSimulatorSubTypes.find((value) => {
return value.type === type;
});
- if (typeof subtype === "undefined") {
+ if (typeof subtype === 'undefined') {
return null;
}
return {subtype.label} ;
diff --git a/src/database/item-type/simulator/index.tsx b/src/database/item-type/simulator/index.tsx
index 566210b..333cdd6 100644
--- a/src/database/item-type/simulator/index.tsx
+++ b/src/database/item-type/simulator/index.tsx
@@ -1,7 +1,7 @@
-import SimulatorAdvancedSearch from "./SimulatorAdvancedSearch";
-import SimulatorDetail from "./SimulatorDetail";
-import SimulatorList from "./SimulatorList";
-import SimulatorTop from "./SimulatorTop";
+import SimulatorAdvancedSearch from './SimulatorAdvancedSearch';
+import SimulatorDetail from './SimulatorDetail';
+import SimulatorList from './SimulatorList';
+import SimulatorTop from './SimulatorTop';
const ItemTypeSimulator = {
Top: SimulatorTop,
diff --git a/src/database/item-type/stimulus/StimulusAdvancedSearch.tsx b/src/database/item-type/stimulus/StimulusAdvancedSearch.tsx
index ae061c2..a405f8d 100644
--- a/src/database/item-type/stimulus/StimulusAdvancedSearch.tsx
+++ b/src/database/item-type/stimulus/StimulusAdvancedSearch.tsx
@@ -1,40 +1,63 @@
-import { ItemStimulusSubTypes } from "../../lib/ItemUtil";
-import AdvancedSearchBase, { AdvancedSearchBaseProps } from "../lib/AdvancedSearchBase";
+import { ItemStimulusSubTypes } from '../../lib/ItemUtil';
+import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class StimulusAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
- this.type = "stimulus";
- this.title = "Stimulus";
+ this.type = 'stimulus';
+ this.title = 'Stimulus';
const now = new Date();
const year = String(now.getFullYear());
const month = String(now.getMonth() + 1);
const mday = String(now.getDate());
- this.state.values["title"] = "";
- this.state.values["keyword"] = "";
- this.state.values["description"] = "";
- this.state.values["doi"] = "";
- this.state.values["stimulus_type"] = "";
- this.state.values["developer"] = "";
- this.state.values["publication_year"] = year;
- this.state.values["publication_month"] = month;
- this.state.values["publication_mday"] = mday;
- this.state.values["file.preview.caption"] = "";
- this.setIgnoreKey("publication_year");
- this.setIgnoreKey("publication_month");
- this.setIgnoreKey("publication_mday");
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.stimulus_type = '';
+ this.state.values.developer = '';
+ this.state.values.publication_year = year;
+ this.state.values.publication_month = month;
+ this.state.values.publication_mday = mday;
+ this.state.values['file.preview.caption'] = '';
+ this.setIgnoreKey('publication_year');
+ this.setIgnoreKey('publication_month');
+ this.setIgnoreKey('publication_mday');
}
getRows() {
const rows = [
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: this.renderFieldInputText("title", 50) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: this.renderFieldInputText("keyword", 50) },
- { label: "[en]Description[/en][ja]概要[/ja]", value: this.renderFieldInputText("description", 50) },
- { label: "ID", value: this.renderFieldInputText("doi", 50) },
- { label: "[en]Stimulus Type[/en][ja]刺激タイプ[/ja]", value: this.renderFieldSelect("stimulus_type", ItemStimulusSubTypes) },
- { label: "[en]Developer[/en][ja]開発者[/ja]", value: this.renderFieldInputText("developer", 50) },
- { label: "[en]Date[/en][ja]日付[/ja]", value: this.renderFieldDate("", "publication_year", "publication_month", "publication_mday") },
- { label: "[en]Caption[/en][ja]キャプション[/ja]", value: this.renderFieldInputText("file.preview.caption", 50) },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ {
+ label: '[en]Stimulus Type[/en][ja]刺激タイプ[/ja]',
+ value: this.renderFieldSelect('stimulus_type', ItemStimulusSubTypes),
+ },
+ {
+ label: '[en]Developer[/en][ja]開発者[/ja]',
+ value: this.renderFieldInputText('developer', 50),
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: this.renderFieldDate(
+ '',
+ 'publication_year',
+ 'publication_month',
+ 'publication_mday',
+ ),
+ },
+ {
+ label: '[en]Caption[/en][ja]キャプション[/ja]',
+ value: this.renderFieldInputText('file.preview.caption', 50),
+ },
];
return rows;
}
diff --git a/src/database/item-type/stimulus/StimulusDetail.tsx b/src/database/item-type/stimulus/StimulusDetail.tsx
index c75846d..9ba56de 100644
--- a/src/database/item-type/stimulus/StimulusDetail.tsx
+++ b/src/database/item-type/stimulus/StimulusDetail.tsx
@@ -1,39 +1,113 @@
-import React from "react";
-import Functions from "../../../functions";
-import ItemUtil, { ItemStimulus } from "../../lib/ItemUtil";
-import DetailBase from "../lib/DetailBase";
-import ItemTypeField from "../lib/field";
-import SimPFLinkIcon from "../lib/field/SimPFLinkIcon";
-import StimulusUtil from "./StimulusUtil";
+import Functions from '../../../functions';
+import ItemUtil, { ItemStimulus } from '../../lib/ItemUtil';
+import DetailBase from '../lib/DetailBase';
+import ItemTypeField from '../lib/field';
+import SimPFLinkIcon from '../lib/field/SimPFLinkIcon';
+import StimulusUtil from './StimulusUtil';
class StimulusDetail extends DetailBase {
getFields() {
const { lang, type } = this.props;
const item = this.props.item as ItemStimulus;
const fields = [
- { label: "ID", value: item.doi },
- { label: "[en]Language[/en][ja]言語[/ja]", value: },
- { label: "[en]Title[/en][ja]タイトル[/ja]", value: Functions.mlang(item.title, lang) },
- { label: "[en]Free Keywords[/en][ja]フリーキーワード[/ja]", value: },
- { label: "[en]Description[/en][ja]概要[/ja]", value: },
- { label: "[en]Date[/en][ja]日付[/ja]", value: },
- { label: "[en]Last Modified Date[/en][ja]最終更新日[/ja]", value: },
- { label: "[en]Created Date[/en][ja]作成日[/ja]", value: },
- { label: "[en]Contributor[/en][ja]登録者[/ja]", value: },
- { label: "[en]Item Type[/en][ja]アイテムタイプ[/ja]", value: item.item_type_display_name },
- { label: "[en]Change Log(History)[/en][ja]変更履歴[/ja]", value: },
- { label: "[en]Stimulus Type[/en][ja]刺激タイプ[/ja]", value: },
- { label: "[en]Developer[/en][ja]開発者[/ja]", value: },
- { label: "[en]Preview[/en][ja]プレビュー[/ja]", value: },
- { label: "[en]Stimulus File[/en][ja]ファイル[/ja]", value: },
- { label: "Readme", value: },
- { label: "Rights", value: },
- { label: "Index", value: },
- { label: "[en]Related to[/en][ja]関連アイテム[/ja]", value: },
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: (
+
+ ),
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Stimulus Type[/en][ja]刺激タイプ[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Developer[/en][ja]開発者[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Preview[/en][ja]プレビュー[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Stimulus File[/en][ja]ファイル[/ja]',
+ value: (
+
+ ),
+ },
+ { label: 'Readme', value: },
+ {
+ label: 'Rights',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
];
const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
- if (simpfLinkUrl !== "") {
- const field = { label: "Online Simulation", value: };
+ if (simpfLinkUrl !== '') {
+ const field = {
+ label: 'Online Simulation',
+ value: ,
+ };
fields.splice(14, 0, field);
}
return fields;
diff --git a/src/database/item-type/stimulus/StimulusList.tsx b/src/database/item-type/stimulus/StimulusList.tsx
index d15f940..8e03e6d 100644
--- a/src/database/item-type/stimulus/StimulusList.tsx
+++ b/src/database/item-type/stimulus/StimulusList.tsx
@@ -1,14 +1,15 @@
-import React, { Fragment } from "react";
-import { Link } from "react-router-dom";
-import Functions from "../../../functions";
-import iconFile from "../../assets/images/icon_stimulus.gif";
-import { ItemStimulus } from "../../lib/ItemUtil";
-import ListBase, { ListBaseProps } from "../lib/ListBase";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import Functions from '../../../functions';
+import iconFile from '../../assets/images/icon_stimulus.gif';
+import { ItemStimulus } from '../../lib/ItemUtil';
+import ListBase, { ListBaseProps } from '../lib/ListBase';
class StimulusList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
- this.label = "Stimulus";
+ this.label = 'Stimulus';
this.icon = iconFile;
}
@@ -17,10 +18,10 @@ class StimulusList extends ListBase {
const item = this.props.item as ItemStimulus;
const authors = item.developer.map((author, i) => {
return (
-
- {i > 0 && ", "}
+
+ {i > 0 && ', '}
{Functions.mlang(author, lang)}
-
+
);
});
return (
diff --git a/src/database/item-type/stimulus/StimulusTop.tsx b/src/database/item-type/stimulus/StimulusTop.tsx
index 322c442..d395417 100644
--- a/src/database/item-type/stimulus/StimulusTop.tsx
+++ b/src/database/item-type/stimulus/StimulusTop.tsx
@@ -1,14 +1,15 @@
-import iconFile from "../../assets/images/icon_stimulus.gif";
-import { ItemStimulusSubTypes } from "../../lib/ItemUtil";
-import TopBase, { TopBaseProps } from "../lib/TopBase";
+import iconFile from '../../assets/images/icon_stimulus.gif';
+import { ItemStimulusSubTypes } from '../../lib/ItemUtil';
+import TopBase, { TopBaseProps } from '../lib/TopBase';
class StimulusTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
- this.type = "stimulus";
- this.label = "Stimulus";
+ this.type = 'stimulus';
+ this.label = 'Stimulus';
this.icon = iconFile;
- this.description = "[en]Picture, movie and program files for experimental stimuli.[/en][ja]実験用刺激プログラム/スクリプト[/ja]";
+ this.description =
+ '[en]Picture, movie and program files for experimental stimuli.[/en][ja]実験用刺激プログラム/スクリプト[/ja]';
this.subTypes = ItemStimulusSubTypes;
}
}
diff --git a/src/database/item-type/stimulus/StimulusUtil.tsx b/src/database/item-type/stimulus/StimulusUtil.tsx
index ac15d75..035a32d 100644
--- a/src/database/item-type/stimulus/StimulusUtil.tsx
+++ b/src/database/item-type/stimulus/StimulusUtil.tsx
@@ -1,6 +1,5 @@
-import React from "react";
-import { MultiLang } from "../../../config";
-import { ItemStimulusSubType, ItemStimulusSubTypes } from "../../lib/ItemUtil";
+import { MultiLang } from '../../../config';
+import { ItemStimulusSubType, ItemStimulusSubTypes } from '../../lib/ItemUtil';
interface StimulusTypeProps {
lang: MultiLang;
@@ -12,7 +11,7 @@ const StimulusType = (props: StimulusTypeProps) => {
const subtype = ItemStimulusSubTypes.find((value) => {
return value.type === type;
});
- if (typeof subtype === "undefined") {
+ if (typeof subtype === 'undefined') {
return null;
}
return {subtype.label} ;
diff --git a/src/database/item-type/stimulus/index.tsx b/src/database/item-type/stimulus/index.tsx
index 3aea68e..7a1df0b 100644
--- a/src/database/item-type/stimulus/index.tsx
+++ b/src/database/item-type/stimulus/index.tsx
@@ -1,7 +1,7 @@
-import StimulusAdvancedSearch from "./StimulusAdvancedSearch";
-import StimulusDetail from "./StimulusDetail";
-import StimulusList from "./StimulusList";
-import StimulusTop from "./StimulusTop";
+import StimulusAdvancedSearch from './StimulusAdvancedSearch';
+import StimulusDetail from './StimulusDetail';
+import StimulusList from './StimulusList';
+import StimulusTop from './StimulusTop';
const ItemTypeStimulus = {
Top: StimulusTop,
diff --git a/src/database/item-type/tool/ToolAdvancedSearch.tsx b/src/database/item-type/tool/ToolAdvancedSearch.tsx
index 6c9a8d3..5d4b571 100644
--- a/src/database/item-type/tool/ToolAdvancedSearch.tsx
+++ b/src/database/item-type/tool/ToolAdvancedSearch.tsx
@@ -2,45 +2,70 @@ import { ItemToolSubTypes } from '../../lib/ItemUtil';
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class ToolAdvancedSearch extends AdvancedSearchBase {
+ constructor(props: AdvancedSearchBaseProps) {
+ super(props);
+ this.type = 'tool';
+ this.title = 'Tool';
+ const now = new Date();
+ const year = String(now.getFullYear());
+ const month = String(now.getMonth() + 1);
+ const mday = String(now.getDate());
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.tool_type = '';
+ this.state.values.developer = '';
+ this.state.values.publication_year = year;
+ this.state.values.publication_month = month;
+ this.state.values.publication_mday = mday;
+ this.state.values['file.preview.caption'] = '';
+ this.state.values['file.tool_data.original_file_name'] = '';
+ this.setIgnoreKey('publication_year');
+ this.setIgnoreKey('publication_month');
+ this.setIgnoreKey('publication_mday');
+ }
- constructor(props: AdvancedSearchBaseProps) {
- super(props);
- this.type = 'tool';
- this.title = 'Tool';
- const now = new Date();
- const year = String(now.getFullYear());
- const month = String(now.getMonth() + 1);
- const mday = String(now.getDate());
- this.state.values['title'] = '';
- this.state.values['keyword'] = '';
- this.state.values['description'] = '';
- this.state.values['doi'] = '';
- this.state.values['tool_type'] = '';
- this.state.values['developer'] = '';
- this.state.values['publication_year'] = year;
- this.state.values['publication_month'] = month;
- this.state.values['publication_mday'] = mday;
- this.state.values['file.preview.caption'] = '';
- this.state.values['file.tool_data.original_file_name'] = '';
- this.setIgnoreKey('publication_year');
- this.setIgnoreKey('publication_month');
- this.setIgnoreKey('publication_mday');
- }
-
- getRows() {
- const rows = [
- { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
- { label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
- { label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
- { label: 'ID', value: this.renderFieldInputText('doi', 50) },
- { label: '[en]Tool Type[/en][ja]ファイルタイプ[/ja]', value: this.renderFieldSelect('tool_type', ItemToolSubTypes) },
- { label: '[en]Developer[/en][ja]開発者[/ja]', value: this.renderFieldInputText('developer', 50) },
- { label: '[en]Date[/en][ja]日付[/ja]', value: this.renderFieldDate('', 'publication_year', 'publication_month', 'publication_mday') },
- { label: '[en]Caption[/en][ja]キャプション[/ja]', value: this.renderFieldInputText('file.preview.caption', 50) },
- { label: '[en]Tool File[/en][ja]ファイル[/ja]', value: this.renderFieldInputText('file.tool_data.original_file_name', 50) },
- ];
- return rows;
- }
+ getRows() {
+ const rows = [
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ {
+ label: '[en]Tool Type[/en][ja]ファイルタイプ[/ja]',
+ value: this.renderFieldSelect('tool_type', ItemToolSubTypes),
+ },
+ {
+ label: '[en]Developer[/en][ja]開発者[/ja]',
+ value: this.renderFieldInputText('developer', 50),
+ },
+ {
+ label: '[en]Date[/en][ja]日付[/ja]',
+ value: this.renderFieldDate(
+ '',
+ 'publication_year',
+ 'publication_month',
+ 'publication_mday',
+ ),
+ },
+ {
+ label: '[en]Caption[/en][ja]キャプション[/ja]',
+ value: this.renderFieldInputText('file.preview.caption', 50),
+ },
+ {
+ label: '[en]Tool File[/en][ja]ファイル[/ja]',
+ value: this.renderFieldInputText('file.tool_data.original_file_name', 50),
+ },
+ ];
+ return rows;
+ }
}
export default ToolAdvancedSearch;
diff --git a/src/database/item-type/tool/ToolDetail.tsx b/src/database/item-type/tool/ToolDetail.tsx
index 866ee3f..bdbfce2 100644
--- a/src/database/item-type/tool/ToolDetail.tsx
+++ b/src/database/item-type/tool/ToolDetail.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import Functions from '../../../functions';
import ItemUtil, { ItemTool } from '../../lib/ItemUtil';
import DetailBase from '../lib/DetailBase';
@@ -7,37 +6,101 @@ import SimPFLinkIcon from '../lib/field/SimPFLinkIcon';
import ToolUtil from './ToolUtil';
class ToolDetail extends DetailBase {
-
- getFields() {
- const { lang, type } = this.props;
- const item = this.props.item as ItemTool;
- const fields = [
- { label: 'ID', value: item.doi },
- { label: '[en]Language[/en][ja]言語[/ja]', value: },
- { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
- { label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: },
- { label: '[en]Description[/en][ja]概要[/ja]', value: },
- { label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: },
- { label: '[en]Created Date[/en][ja]作成日[/ja]', value: },
- { label: '[en]Contributor[/en][ja]登録者[/ja]', value: },
- { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
- { label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: },
- { label: '[en]Tool Type[/en][ja]ファイルタイプ[/ja]', value: },
- { label: '[en]Developer[/en][ja]開発者[/ja]', value: },
- { label: '[en]Preview[/en][ja]プレビュー[/ja]', value: },
- { label: '[en]Tool File[/en][ja]ファイル[/ja]', value: },
- { label: 'Readme', value: },
- { label: 'Rights', value: },
- { label: 'Index', value: },
- { label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: },
- ];
- const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
- if (simpfLinkUrl !== '') {
- const field = { label: 'Online Simulation', value: };
- fields.splice(13, 0, field);
- }
- return fields;
+ getFields() {
+ const { lang, type } = this.props;
+ const item = this.props.item as ItemTool;
+ const fields = [
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Tool Type[/en][ja]ファイルタイプ[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Developer[/en][ja]開発者[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Preview[/en][ja]プレビュー[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Tool File[/en][ja]ファイル[/ja]',
+ value: (
+
+ ),
+ },
+ { label: 'Readme', value: },
+ {
+ label: 'Rights',
+ value: (
+
+ ),
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
+ ];
+ const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
+ if (simpfLinkUrl !== '') {
+ const field = {
+ label: 'Online Simulation',
+ value: ,
+ };
+ fields.splice(13, 0, field);
}
+ return fields;
+ }
}
-export default ToolDetail;
\ No newline at end of file
+export default ToolDetail;
diff --git a/src/database/item-type/tool/ToolList.tsx b/src/database/item-type/tool/ToolList.tsx
index 27ee027..bfd6705 100644
--- a/src/database/item-type/tool/ToolList.tsx
+++ b/src/database/item-type/tool/ToolList.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { Link } from 'react-router-dom';
import Functions from '../../../functions';
import iconFile from '../../assets/images/icon_tool.gif';
@@ -7,23 +6,23 @@ import ListBase, { ListBaseProps } from '../lib/ListBase';
import ToolUtil from './ToolUtil';
class ToolList extends ListBase {
+ constructor(props: ListBaseProps) {
+ super(props);
+ this.label = 'Tool';
+ this.icon = iconFile;
+ }
- constructor(props: ListBaseProps) {
- super(props);
- this.label = 'Tool';
- this.icon = iconFile;
- }
-
- renderBody() {
- const { lang } = this.props;
- const item = this.props.item as ItemTool;
- return (
- <>
- {Functions.mlang(item.title, lang)}
-
- >
- );
- }
+ renderBody() {
+ const { lang } = this.props;
+ const item = this.props.item as ItemTool;
+ return (
+ <>
+ {Functions.mlang(item.title, lang)}
+
+
+ >
+ );
+ }
}
-export default ToolList;
\ No newline at end of file
+export default ToolList;
diff --git a/src/database/item-type/tool/ToolTop.tsx b/src/database/item-type/tool/ToolTop.tsx
index 58b7a23..1489b89 100644
--- a/src/database/item-type/tool/ToolTop.tsx
+++ b/src/database/item-type/tool/ToolTop.tsx
@@ -3,15 +3,14 @@ import TopBase, { TopBaseProps } from '../lib/TopBase';
import iconFile from '../../assets/images/icon_tool.gif';
class ToolTop extends TopBase {
-
- constructor(props: TopBaseProps) {
- super(props);
- this.type = 'tool';
- this.label = 'Tool';
- this.icon = iconFile;
- this.description = '[en]Tool programs/scripts.[/en][ja]データ解析用プログラム/スクリプト[/ja]';
- this.subTypes = ItemToolSubTypes;
- }
+ constructor(props: TopBaseProps) {
+ super(props);
+ this.type = 'tool';
+ this.label = 'Tool';
+ this.icon = iconFile;
+ this.description = '[en]Tool programs/scripts.[/en][ja]データ解析用プログラム/スクリプト[/ja]';
+ this.subTypes = ItemToolSubTypes;
+ }
}
-export default ToolTop;
\ No newline at end of file
+export default ToolTop;
diff --git a/src/database/item-type/tool/ToolUtil.tsx b/src/database/item-type/tool/ToolUtil.tsx
index 3b3864c..c79c93e 100644
--- a/src/database/item-type/tool/ToolUtil.tsx
+++ b/src/database/item-type/tool/ToolUtil.tsx
@@ -1,23 +1,24 @@
-import React from 'react';
import { MultiLang } from '../../../config';
import { ItemToolSubType, ItemToolSubTypes } from '../../lib/ItemUtil';
interface ToolTypeProps {
- lang: MultiLang;
- type: ItemToolSubType;
+ lang: MultiLang;
+ type: ItemToolSubType;
}
const ToolType = (props: ToolTypeProps) => {
- const { type } = props;
- const subtype = ItemToolSubTypes.find((value) => { return value.type === type; });
- if (typeof subtype === 'undefined') {
- return null;
- }
- return ({subtype.label} );
-}
+ const { type } = props;
+ const subtype = ItemToolSubTypes.find((value) => {
+ return value.type === type;
+ });
+ if (typeof subtype === 'undefined') {
+ return null;
+ }
+ return {subtype.label} ;
+};
const ToolUtil = {
- ToolType,
-}
+ ToolType,
+};
-export default ToolUtil;
\ No newline at end of file
+export default ToolUtil;
diff --git a/src/database/item-type/tool/index.tsx b/src/database/item-type/tool/index.tsx
index 23a334c..9f7d4a2 100644
--- a/src/database/item-type/tool/index.tsx
+++ b/src/database/item-type/tool/index.tsx
@@ -4,10 +4,10 @@ import ToolDetail from './ToolDetail';
import ToolAdvancedSearch from './ToolAdvancedSearch';
const ItemTypeTool = {
- Top: ToolTop,
- List: ToolList,
- Detail: ToolDetail,
- AdvancedSearch: ToolAdvancedSearch,
+ Top: ToolTop,
+ List: ToolList,
+ Detail: ToolDetail,
+ AdvancedSearch: ToolAdvancedSearch,
};
-export default ItemTypeTool;
\ No newline at end of file
+export default ItemTypeTool;
diff --git a/src/database/item-type/url/UrlAdvancedSearch.tsx b/src/database/item-type/url/UrlAdvancedSearch.tsx
index 2062516..b56d5e7 100644
--- a/src/database/item-type/url/UrlAdvancedSearch.tsx
+++ b/src/database/item-type/url/UrlAdvancedSearch.tsx
@@ -1,28 +1,33 @@
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class UrlAdvancedSearch extends AdvancedSearchBase {
+ constructor(props: AdvancedSearchBaseProps) {
+ super(props);
+ this.type = 'url';
+ this.title = 'Url';
+ this.state.values.title = '';
+ this.state.values.keyword = '';
+ this.state.values.description = '';
+ this.state.values.doi = '';
+ this.state.values.url = '';
+ }
- constructor(props: AdvancedSearchBaseProps) {
- super(props);
- this.type = 'url';
- this.title = 'Url';
- this.state.values['title'] = '';
- this.state.values['keyword'] = '';
- this.state.values['description'] = '';
- this.state.values['doi'] = '';
- this.state.values['url'] = '';
- }
-
- getRows() {
- const rows = [
- { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
- { label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
- { label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
- { label: 'ID', value: this.renderFieldInputText('doi', 50) },
- { label: 'URL', value: this.renderFieldInputText('url', 50) },
- ];
- return rows;
- }
+ getRows() {
+ const rows = [
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: this.renderFieldInputText('keyword', 50),
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: this.renderFieldInputText('description', 50),
+ },
+ { label: 'ID', value: this.renderFieldInputText('doi', 50) },
+ { label: 'URL', value: this.renderFieldInputText('url', 50) },
+ ];
+ return rows;
+ }
}
export default UrlAdvancedSearch;
diff --git a/src/database/item-type/url/UrlDetail.tsx b/src/database/item-type/url/UrlDetail.tsx
index feca70c..52ade84 100644
--- a/src/database/item-type/url/UrlDetail.tsx
+++ b/src/database/item-type/url/UrlDetail.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import Functions from '../../../functions';
import { ItemUrl } from '../../lib/ItemUtil';
import DetailBase from '../lib/DetailBase';
@@ -6,27 +5,63 @@ import ItemTypeField from '../lib/field';
import UrlUtil from './UrlUtil';
class UrlDetail extends DetailBase {
-
- getFields() {
- const { lang, type } = this.props;
- const item = this.props.item as ItemUrl;
- return [
- { label: 'ID', value: item.doi },
- { label: '[en]Language[/en][ja]言語[/ja]', value: },
- { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
- { label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: },
- { label: '[en]Description[/en][ja]概要[/ja]', value: },
- { label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: },
- { label: '[en]Created Date[/en][ja]作成日[/ja]', value: },
- { label: '[en]Contributor[/en][ja]登録者[/ja]', value: },
- { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
- { label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: },
- { label: 'URL', value: {item.url} },
- { label: '[en]Banner File[/en][ja]バナー[/ja]', value: },
- { label: 'Index', value: },
- { label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: },
- ];
- }
+ getFields() {
+ const { lang, type } = this.props;
+ const item = this.props.item as ItemUrl;
+ return [
+ { label: 'ID', value: item.doi },
+ {
+ label: '[en]Language[/en][ja]言語[/ja]',
+ value: ,
+ },
+ { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
+ {
+ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Description[/en][ja]概要[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Created Date[/en][ja]作成日[/ja]',
+ value: ,
+ },
+ {
+ label: '[en]Contributor[/en][ja]登録者[/ja]',
+ value: ,
+ },
+ { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
+ {
+ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
+ value: ,
+ },
+ {
+ label: 'URL',
+ value: (
+
+ {item.url}
+
+ ),
+ },
+ {
+ label: '[en]Banner File[/en][ja]バナー[/ja]',
+ value: ,
+ },
+ {
+ label: 'Index',
+ value: ,
+ },
+ {
+ label: '[en]Related to[/en][ja]関連アイテム[/ja]',
+ value: ,
+ },
+ ];
+ }
}
-export default UrlDetail;
\ No newline at end of file
+export default UrlDetail;
diff --git a/src/database/item-type/url/UrlList.tsx b/src/database/item-type/url/UrlList.tsx
index 16905b1..712f9f4 100644
--- a/src/database/item-type/url/UrlList.tsx
+++ b/src/database/item-type/url/UrlList.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { Link } from 'react-router-dom';
import Functions from '../../../functions';
import iconFile from '../../assets/images/icon_url.gif';
@@ -6,23 +5,26 @@ import { ItemUrl } from '../../lib/ItemUtil';
import ListBase, { ListBaseProps } from '../lib/ListBase';
class UrlList extends ListBase {
+ constructor(props: ListBaseProps) {
+ super(props);
+ this.label = 'Url';
+ this.icon = iconFile;
+ }
- constructor(props: ListBaseProps) {
- super(props);
- this.label = 'Url';
- this.icon = iconFile;
- }
-
- renderBody() {
- const { lang } = this.props;
- const item = this.props.item as ItemUrl;
- return (
- <>
- {Functions.mlang(item.title, lang)}
- Link to {item.url}
- >
- );
- }
+ renderBody() {
+ const { lang } = this.props;
+ const item = this.props.item as ItemUrl;
+ return (
+ <>
+ {Functions.mlang(item.title, lang)}
+
+ Link to{' '}
+
+ {item.url}
+
+ >
+ );
+ }
}
-export default UrlList;
\ No newline at end of file
+export default UrlList;
diff --git a/src/database/item-type/url/UrlTop.tsx b/src/database/item-type/url/UrlTop.tsx
index ed0c472..7737780 100644
--- a/src/database/item-type/url/UrlTop.tsx
+++ b/src/database/item-type/url/UrlTop.tsx
@@ -2,14 +2,13 @@ import TopBase, { TopBaseProps } from '../lib/TopBase';
import iconFile from '../../assets/images/icon_url.gif';
class UrlTop extends TopBase {
-
- constructor(props: TopBaseProps) {
- super(props);
- this.type = 'url';
- this.label = 'Url';
- this.icon = iconFile;
- this.description = '[en]Link information.[/en][ja]関連リンク[/ja]';
- }
+ constructor(props: TopBaseProps) {
+ super(props);
+ this.type = 'url';
+ this.label = 'Url';
+ this.icon = iconFile;
+ this.description = '[en]Link information.[/en][ja]関連リンク[/ja]';
+ }
}
-export default UrlTop;
\ No newline at end of file
+export default UrlTop;
diff --git a/src/database/item-type/url/UrlUtil.tsx b/src/database/item-type/url/UrlUtil.tsx
index 09d5be6..7dd4090 100644
--- a/src/database/item-type/url/UrlUtil.tsx
+++ b/src/database/item-type/url/UrlUtil.tsx
@@ -1,29 +1,30 @@
-import React from 'react';
-import { MultiLang, BrainAtlasType } from '../../../config';
+import { BrainAtlasType, MultiLang } from '../../../config';
import ItemUtil, { ItemBasicFile } from '../../lib/ItemUtil';
interface BannerFileProps {
- lang: MultiLang;
- file: ItemBasicFile[];
- type: BrainAtlasType;
+ lang: MultiLang;
+ file: ItemBasicFile[];
+ type: BrainAtlasType;
}
const BannerFile = (props: BannerFileProps) => {
- const { file, type } = props;
- const data = file.find((value) => {
- return value.file_type_name === 'url_banner_file';
- });
- if (typeof data === 'undefined') {
- return null;
- }
- const url = ItemUtil.getFileUrl(type, data);
- return (
-
- );
-}
+ const { file, type } = props;
+ const data = file.find((value) => {
+ return value.file_type_name === 'url_banner_file';
+ });
+ if (typeof data === 'undefined') {
+ return null;
+ }
+ const url = ItemUtil.getFileUrl(type, data);
+ return (
+
+
+
+ );
+};
const UrlUtil = {
- BannerFile,
-}
+ BannerFile,
+};
export default UrlUtil;
diff --git a/src/database/item-type/url/index.tsx b/src/database/item-type/url/index.tsx
index b359df2..fd71bc8 100644
--- a/src/database/item-type/url/index.tsx
+++ b/src/database/item-type/url/index.tsx
@@ -4,10 +4,10 @@ import UrlDetail from './UrlDetail';
import UrlAdvancedSearch from './UrlAdvancedSearch';
const ItemTypeUrl = {
- Top: UrlTop,
- List: UrlList,
- Detail: UrlDetail,
- AdvancedSearch: UrlAdvancedSearch,
+ Top: UrlTop,
+ List: UrlList,
+ Detail: UrlDetail,
+ AdvancedSearch: UrlAdvancedSearch,
};
export default ItemTypeUrl;
diff --git a/src/database/lib/AdvancedSearchQuery.ts b/src/database/lib/AdvancedSearchQuery.ts
index 0b69c84..d0bb66f 100644
--- a/src/database/lib/AdvancedSearchQuery.ts
+++ b/src/database/lib/AdvancedSearchQuery.ts
@@ -1,3 +1,5 @@
+import { LokiSearchFilter } from './types';
+
type AdvancedSearchQueryData = Map;
class AdvancedSearchQuery {
@@ -19,7 +21,9 @@ class AdvancedSearchQuery {
set(type: string, key: string, value: string) {
type = type.trim();
key = key.trim();
- const data: URLSearchParams = this.dataset.has(type) ? (this.dataset.get(type) as URLSearchParams) : new URLSearchParams();
+ const data: URLSearchParams = this.dataset.has(type)
+ ? this.dataset.get(type)!
+ : new URLSearchParams();
data.set(key, value);
this.dataset.set(type, data);
}
@@ -27,7 +31,9 @@ class AdvancedSearchQuery {
delete(type: string, key: string) {
type = type.trim();
key = key.trim();
- const data: URLSearchParams = this.dataset.has(type) ? (this.dataset.get(type) as URLSearchParams) : new URLSearchParams();
+ const data: URLSearchParams = this.dataset.has(type)
+ ? this.dataset.get(type)!
+ : new URLSearchParams();
data.delete(key);
this.dataset.set(type, data);
}
@@ -38,11 +44,11 @@ class AdvancedSearchQuery {
}
getQueryParams() {
- let ret: URLSearchParams = new URLSearchParams();
+ const ret: URLSearchParams = new URLSearchParams();
this.dataset.forEach((data, type) => {
data.forEach((value, key) => {
value = value.trim();
- value.length > 0 && ret.set(type + "." + key, value);
+ value.length > 0 && ret.set(type + '.' + key, value);
});
});
return ret;
@@ -51,23 +57,23 @@ class AdvancedSearchQuery {
setByQueryString(queryString: string) {
const query = new URLSearchParams(queryString);
query.forEach((v, k) => {
- const [type, ...key] = k.split(".");
- if (typeof key === "undefined") {
+ const [type, ...key] = k.split('.');
+ if (typeof key === 'undefined') {
return;
}
- this.set(type, key.join("."), v);
+ this.set(type, key.join('.'), v);
});
}
- getSearchFilter() {
- let filter: any = [];
+ getSearchFilter(): LokiSearchFilter {
+ const filter: LokiSearchFilter[] = [];
this.dataset.forEach((data, type) => {
- let filter2: any = [];
+ const filter2: LokiSearchFilter[] = [];
filter2.push({
- item_type_name: "xnp" + type,
+ item_type_name: 'xnp' + type,
});
data.forEach((value, key) => {
- const regex = value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ const regex = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const file = key.match(/^file\.([^.]+)\.([^.]+)$/);
if (file !== null) {
const fileType = file[1];
@@ -79,10 +85,10 @@ class AdvancedSearchQuery {
// [subKey]: { '$regex': regex }
// };
// filter2.push({ file: { '$elemMatch': filter3 } });
- filter2.push({ "file.file_type_name": fileType });
- filter2.push({ ["file." + subKey]: { $regex: [regex, "i"] } });
+ filter2.push({ 'file.file_type_name': fileType });
+ filter2.push({ ['file.' + subKey]: { $regex: [regex, 'i'] } });
} else {
- filter2.push({ [key]: { $regex: [regex, "i"] } });
+ filter2.push({ [key]: { $regex: [regex, 'i'] } });
}
});
filter.push({ $and: filter2 });
diff --git a/src/database/lib/DatabaseListIndex.tsx b/src/database/lib/DatabaseListIndex.tsx
index 4cd8bc9..1471523 100644
--- a/src/database/lib/DatabaseListIndex.tsx
+++ b/src/database/lib/DatabaseListIndex.tsx
@@ -1,9 +1,10 @@
-import React from "react";
-import { Link } from "react-router-dom";
-import { BrainAtlasType, MultiLang } from "../../config";
-import Functions from "../../functions";
-import iconFile from "../assets/images/icon_folder.gif";
-import IndexUtil, { Index } from "./IndexUtil";
+import React from 'react';
+
+import { Link } from 'react-router-dom';
+import { BrainAtlasType, MultiLang } from '../../config';
+import Functions from '../../functions';
+import iconFile from '../assets/images/icon_folder.gif';
+import IndexUtil, { Index } from './IndexUtil';
interface Props {
lang: MultiLang;
@@ -11,11 +12,18 @@ interface Props {
type: BrainAtlasType;
}
-const ListIndexItem: React.FC = (props: Props) => {
+const ListIndexItem: React.FC = (props) => {
const { lang, index, type } = props;
const url = IndexUtil.getUrl(type, index.id);
const title = Functions.mlang(index.title, lang);
- const numOfIndexes = IndexUtil.countChildren(type, index.id);
+ const [numOfIndexes, setNumOfIndexes] = React.useState(0);
+
+ React.useEffect(() => {
+ IndexUtil.countChildren(type, index.id, (count) => {
+ setNumOfIndexes(count);
+ });
+ }, [index.id, type]);
+
return (
@@ -36,14 +44,22 @@ const ListIndexItem: React.FC = (props: Props) => {
);
};
-const DatabaseListIndex: React.FC = (props: Props) => {
- const { lang, type } = props;
- const children = IndexUtil.getChildren(type, props.index.id);
+const DatabaseListIndex: React.FC = (props) => {
+ const { lang, index, type } = props;
+
+ const [children, setChildren] = React.useState([]);
+
+ React.useEffect(() => {
+ IndexUtil.getChildren(type, index.id, (children) => {
+ setChildren(children);
+ });
+ }, [index.id, type]);
+
if (children.length === 0) {
return null;
}
const treeList = children.map((value: Index, idx) => {
- const evenodd = idx % 2 === 0 ? "even" : "odd";
+ const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return (
diff --git a/src/database/lib/DatabaseListItem.tsx b/src/database/lib/DatabaseListItem.tsx
index b45fea9..f091aa2 100644
--- a/src/database/lib/DatabaseListItem.tsx
+++ b/src/database/lib/DatabaseListItem.tsx
@@ -1,104 +1,120 @@
-import React, { ChangeEvent } from "react";
-import { Link, useLocation, useNavigate } from "react-router-dom";
-import Loading from "../../common/lib/Loading";
-import { BrainAtlasType, MultiLang } from "../../config";
-import Functions from "../../functions";
-import ItemType from "../item-type";
-import styles from "./DatabaseListItem.module.css";
-import { Item, SearchFunc, SearchResult, SortCondition, SortConditionLimit, SortConditionOrderBy, SortConditionOrderDir } from "./ItemUtil";
+import React from 'react';
+
+import { Link, useLocation, useNavigate } from 'react-router-dom';
+import Loading from '../../common/lib/Loading';
+import { BrainAtlasType, MultiLang } from '../../config';
+import Functions from '../../functions';
+import ItemType from '../item-type';
+import styles from './DatabaseListItem.module.css';
+import {
+ Item,
+ SearchFunc,
+ SearchResult,
+ SortCondition,
+ SortConditionLimit,
+ SortConditionOrderBy,
+ SortConditionOrderDir,
+} from './ItemUtil';
const SORT_CONDITION_DEFAULT: SortCondition = {
limit: 20,
page: 1,
- orderBy: "title",
+ orderBy: 'title',
orderDir: 1,
};
-const SORT_CONDITION_RANGE_ORDER_BY = ["title", "doi", "last_update_date", "creation_date", "publication_date"];
-const SORT_CONDITION_RANGE_ORDER_DIR = ["0", "1"];
-const SORT_CONDITION_RANGE_LIMIT = ["20", "50", "100"];
+const SORT_CONDITION_RANGE_ORDER_BY = [
+ 'title',
+ 'doi',
+ 'last_update_date',
+ 'creation_date',
+ 'publication_date',
+];
+const SORT_CONDITION_RANGE_ORDER_DIR = ['0', '1'];
+const SORT_CONDITION_RANGE_LIMIT = ['20', '50', '100'];
-interface PropsFC {
+interface Props {
lang: MultiLang;
url: string;
search: SearchFunc;
type: BrainAtlasType;
}
-interface Props extends PropsFC {
- location: any;
- navigate: any;
-}
+const DatabaseListItem: React.FC = (props) => {
+ const { lang, type, url, search } = props;
-interface State {
- loading: boolean;
- condition: SortCondition;
- result: SearchResult;
-}
+ const navigate = useNavigate();
+ const location = useLocation();
+ const [loading, setLoading] = React.useState(true);
+ const [result, setResult] = React.useState({ total: 0, data: [] });
-class DatabaseListItem extends React.Component {
- private isActive = false;
-
- constructor(props: Props) {
- super(props);
- const { location } = props;
- this.state = {
- loading: true,
- condition: this.getSortConditionByQuery(location.search),
- result: { total: 0, data: [] },
+ const isMounted = React.useRef(false);
+ React.useEffect(() => {
+ isMounted.current = true;
+ return () => {
+ isMounted.current = false;
};
- this.handleSelectOrderby = this.handleSelectOrderby.bind(this);
- this.handleSelectItemcount = this.handleSelectItemcount.bind(this);
- }
+ }, []);
- componentDidMount() {
- this.isActive = true;
- this.props.search(this.state.condition, (result) => {
- if (this.isActive) {
- this.setState({ loading: false, result });
+ const getDefaultSortCondition = () => {
+ return Object.assign({}, SORT_CONDITION_DEFAULT);
+ };
+
+ const getSortConditionByQuery = (queryString: string) => {
+ const query = new URLSearchParams(queryString);
+ const condition = getDefaultSortCondition();
+ const orderby = query.get('orderby');
+ if (orderby != null && SORT_CONDITION_RANGE_ORDER_BY.includes(orderby)) {
+ condition.orderBy = orderby as SortConditionOrderBy;
+ }
+ const order_dir = query.get('order_dir');
+ if (order_dir != null && SORT_CONDITION_RANGE_ORDER_DIR.includes(order_dir)) {
+ condition.orderDir = parseInt(order_dir, 10) as SortConditionOrderDir;
+ }
+ const itemcount = query.get('itemcount');
+ if (itemcount != null && SORT_CONDITION_RANGE_LIMIT.includes(itemcount)) {
+ condition.limit = parseInt(itemcount, 10) as SortConditionLimit;
+ }
+ const page = query.get('page');
+ if (page?.match(/^\d+$/) != null) {
+ condition.page = parseInt(page, 10);
+ }
+ return condition;
+ };
+
+ const condition = getSortConditionByQuery(location.search);
+
+ React.useEffect(() => {
+ search(condition, (result) => {
+ if (isMounted.current) {
+ setLoading(false);
+ setResult(result);
}
});
- }
+ }, [condition, search]);
- componentDidUpdate(prevProps: Props, prevState: State) {
- const { location } = this.props;
- const condition = this.getSortConditionByQuery(location.search);
- if (prevProps.url !== this.props.url || this.isConditionChanged(prevState.condition, condition)) {
- this.props.search(condition, (result) => {
- if (this.isActive) {
- this.setState({ loading: false, result, condition });
- }
- });
- }
- }
-
- componentWillUnmount() {
- this.isActive = false;
- }
-
- handleSelectOrderby(event: ChangeEvent) {
- const { navigate } = this.props;
+ const handleSelectOrderby: React.ChangeEventHandler = (event) => {
const value = event.target.value;
- const url = this.getListUrl({ orderby: value });
+ const url = getListUrl({ orderby: value });
navigate(url);
- }
+ };
- handleSelectItemcount(event: ChangeEvent) {
- const { navigate } = this.props;
+ const handleSelectItemcount: React.ChangeEventHandler = (event) => {
const value = parseInt(event.target.value, 10);
- const url = this.getListUrl({ limit: value });
+ const url = getListUrl({ limit: value });
navigate(url);
- }
+ };
- isConditionChanged(prev: SortCondition, next: SortCondition) {
- return prev.limit !== next.limit || prev.orderBy !== next.orderBy || prev.orderDir !== next.orderDir || prev.page !== next.page;
- }
-
- getListUrl(query: { orderby?: string; order_dir?: number; limit?: number; page?: number }) {
- const newOrderBy: string = typeof query.orderby !== "undefined" ? query.orderby : this.state.condition.orderBy;
- const newOrderDir: number = typeof query.order_dir !== "undefined" ? query.order_dir : this.state.condition.orderDir;
- const newLimit: number = typeof query.limit !== "undefined" ? query.limit : this.state.condition.limit;
- let newPage: number = typeof query.page !== "undefined" ? query.page : this.state.condition.page;
- if (newLimit !== this.state.condition.limit || newOrderBy !== this.state.condition.orderBy) {
+ const getListUrl = (query: {
+ orderby?: string;
+ order_dir?: number;
+ limit?: number;
+ page?: number;
+ }) => {
+ const newOrderBy: string = query?.orderby ?? condition.orderBy;
+ const newOrderDir: number = query?.order_dir ?? condition.orderDir;
+ const newLimit: number = query?.limit ?? condition.limit;
+ let newPage: number = query?.page ?? condition.page;
+ if (newLimit !== condition.limit || newOrderBy !== condition.orderBy) {
newPage = SORT_CONDITION_DEFAULT.page;
}
const params = new URLSearchParams({
@@ -107,48 +123,21 @@ class DatabaseListItem extends React.Component {
itemcount: String(newLimit),
page: String(newPage),
});
- const join = this.props.url.indexOf("?") < 0 ? "?" : "&";
- return this.props.url + join + params.toString();
- }
+ const join = url.indexOf('?') < 0 ? '?' : '&';
+ return url + join + params.toString();
+ };
- getDefaultSortCondition() {
- return Object.assign({}, SORT_CONDITION_DEFAULT);
- }
-
- getSortConditionByQuery(queryString: string) {
- const query = new URLSearchParams(queryString);
- const condition = this.getDefaultSortCondition();
- const orderby = query.get("orderby");
- if (orderby !== null && SORT_CONDITION_RANGE_ORDER_BY.includes(orderby)) {
- condition.orderBy = orderby as SortConditionOrderBy;
- }
- const order_dir = query.get("order_dir");
- if (order_dir !== null && SORT_CONDITION_RANGE_ORDER_DIR.includes(order_dir)) {
- condition.orderDir = parseInt(order_dir, 10) as SortConditionOrderDir;
- }
- const itemcount = query.get("itemcount");
- if (itemcount !== null && SORT_CONDITION_RANGE_LIMIT.includes(itemcount)) {
- condition.limit = parseInt(itemcount, 10) as SortConditionLimit;
- }
- const page = query.get("page");
- if (page !== null && page.match(/^\d+$/) !== null) {
- condition.page = parseInt(page, 10);
- }
- return condition;
- }
-
- renderSortCriteria() {
- const { lang } = this.props;
+ const renderSortCriteria = () => {
let orderDir;
- if (this.state.condition.orderDir !== SortConditionOrderDir.ASC) {
- const url = this.getListUrl({ order_dir: SortConditionOrderDir.ASC });
+ if (condition.orderDir !== SortConditionOrderDir.ASC) {
+ const url = getListUrl({ order_dir: SortConditionOrderDir.ASC });
orderDir = (
▼ ▲
);
} else {
- const url = this.getListUrl({ order_dir: SortConditionOrderDir.DESC });
+ const url = getListUrl({ order_dir: SortConditionOrderDir.DESC });
orderDir = (
▼ ▲
@@ -162,18 +151,26 @@ class DatabaseListItem extends React.Component {
Order by
-
- {Functions.mlang("[en]Title[/en][ja]タイトル[/ja]", lang)}
+
+
+ {Functions.mlang('[en]Title[/en][ja]タイトル[/ja]', lang)}
+
ID
- {Functions.mlang("[en]Last Modified Date[/en][ja]最終更新日[/ja]", lang)}
- {Functions.mlang("[en]Created Date[/en][ja]作成日[/ja]", lang)}
- {Functions.mlang("[en]Date[/en][ja]日付[/ja]", lang)}
+
+ {Functions.mlang('[en]Last Modified Date[/en][ja]最終更新日[/ja]', lang)}
+
+
+ {Functions.mlang('[en]Created Date[/en][ja]作成日[/ja]', lang)}
+
+
+ {Functions.mlang('[en]Date[/en][ja]日付[/ja]', lang)}
+
{orderDir}
No.Item per page
-
+
20
50
100
@@ -184,83 +181,75 @@ class DatabaseListItem extends React.Component {
);
- }
+ };
- renderPageNavi(result: SearchResult) {
- const maxPage = Math.floor(result.total / this.state.condition.limit) + (result.total % this.state.condition.limit !== 0 ? 1 : 0);
+ const renderPageNavi = (result: SearchResult) => {
+ const maxPage =
+ Math.floor(result.total / condition.limit) + (result.total % condition.limit !== 0 ? 1 : 0);
const link = (title: string, page: number, id: string) => {
- if (page === 0 || page === this.state.condition.page) {
+ if (page === 0 || page === condition.page) {
return (
{title}
);
}
- const url: string = this.getListUrl({ page: page });
+ const url: string = getListUrl({ page: page });
return (
{title}
);
};
- let startPage = this.state.condition.page - 4 > 1 ? this.state.condition.page - 4 : 1;
+ let startPage = condition.page - 4 > 1 ? condition.page - 4 : 1;
const endPage = startPage + 9 > maxPage ? maxPage : startPage + 9;
if (endPage - startPage < 9) {
startPage = endPage - 9 > 0 ? endPage - 9 : 1;
}
- let pageLinks: JSX.Element[] = [];
- pageLinks.push(link("PREV", this.state.condition.page - 1, "p"));
+ const pageLinks: JSX.Element[] = [];
+ pageLinks.push(link('PREV', condition.page - 1, 'p'));
for (let i = startPage; i <= endPage; i++) {
pageLinks.push(link(String(i), i, String(i)));
}
- pageLinks.push(link("NEXT", this.state.condition.page >= maxPage ? 0 : this.state.condition.page + 1, "n"));
+ pageLinks.push(link('NEXT', condition.page >= maxPage ? 0 : condition.page + 1, 'n'));
return {pageLinks}
;
- }
+ };
- render() {
- const { lang, type } = this.props;
- if (this.state.loading) {
- return ;
- }
- const result = this.state.result;
- if (result.data.length === 0) {
- return No items found.
;
- }
- const startNum = 1 + this.state.condition.limit * (this.state.condition.page - 1);
- let endNum = this.state.condition.limit * this.state.condition.page;
- if (endNum > result.total) {
- endNum = result.total;
- }
- const pageNavi = this.renderPageNavi(result);
- const items = result.data.map((item: Item, idx) => {
- const evenodd = idx % 2 === 0 ? "even" : "odd";
- return (
-
-
-
-
-
- );
- });
+ if (loading) {
+ return ;
+ }
+ if (result.data.length === 0) {
+ return No items found.
;
+ }
+ const startNum = 1 + condition.limit * (condition.page - 1);
+ let endNum = condition.limit * condition.page;
+ if (endNum > result.total) {
+ endNum = result.total;
+ }
+ const pageNavi = renderPageNavi(result);
+ const items = result.data.map((item: Item, idx) => {
+ const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return (
- <>
- {this.renderSortCriteria()}
-
- {startNum} - {endNum} of {result.total} Items
-
- {pageNavi}
-
- {pageNavi}
- >
+
+
+
+
+
);
- }
-}
-
-const DatabaseListItemFC: React.FC = (props: PropsFC) => {
- const { lang, type, url, search } = props;
- return ;
+ });
+ return (
+ <>
+ {renderSortCriteria()}
+
+ {startNum} - {endNum} of {result.total} Items
+
+ {pageNavi}
+
+ {pageNavi}
+ >
+ );
};
-export default DatabaseListItemFC;
+export default DatabaseListItem;
diff --git a/src/database/lib/IndexUtil.ts b/src/database/lib/IndexUtil.ts
index d94e95c..b34205e 100644
--- a/src/database/lib/IndexUtil.ts
+++ b/src/database/lib/IndexUtil.ts
@@ -1,6 +1,8 @@
-import loki from "lokijs";
-import { BrainAtlasType } from "../../config.js";
-import treesJson from "../assets/trees.json";
+import AsyncLock from 'async-lock';
+import axios from 'axios';
+import loki from 'lokijs';
+import { BrainAtlasType, BrainAtlasTypes } from '../../config.js';
+import { LokiSearchFilter } from './types.js';
export interface Index {
id: number;
@@ -21,97 +23,146 @@ interface IndexData {
}
type IndexesData = IndexData[];
-interface TreeJson {
- type: BrainAtlasType;
- tree: IndexesData;
-}
-type TreesJson = TreeJson[];
+export type GetCallbackFunc = (index: Index | null) => void;
+export type SearchCallbackFunc = (indexes: Index[]) => void;
+export type CountCallbackFunc = (count: number) => void;
+
+type IndexLoadCallbackFunc = (indexes: Collection) => void;
class IndexUtil {
private database: loki;
private indexes: Map>;
+ private loading: Map;
+ private callbacks: Map;
- constructor(trees: TreesJson) {
- this.database = new loki("database");
+ constructor() {
+ this.database = new loki('database', { env: 'BROWSER' });
this.indexes = new Map>();
- trees.forEach((tree) => {
- const collection = this.database.addCollection(tree.type + "_indexes");
- this.load(tree.tree, collection);
- this.indexes.set(tree.type, collection);
+ this.loading = new Map();
+ this.callbacks = new Map();
+ this.load();
+ }
+
+ load(): void {
+ BrainAtlasTypes.forEach((type) => {
+ const collection = this.database.addCollection(type + '_indexes');
+ this.indexes.set(type, collection);
+ this.loading.set(type, true);
+ this.callbacks.set(type, []);
+ axios
+ .get(`/data/${type}/tree.json`, { responseType: 'json' })
+ .then((response) => {
+ const store = (indexesData: IndexesData, parentId: number) => {
+ indexesData.forEach((indexData: IndexData, idx) => {
+ const entry: Index = {
+ id: indexData.id,
+ title: indexData.title,
+ numOfItems: indexData.num_of_items,
+ parentId: parentId,
+ weight: idx,
+ };
+ collection.insert(entry);
+ store(indexData.children, indexData.id);
+ });
+ };
+ store(response.data, INDEX_ID_ROOT);
+ const lock = new AsyncLock();
+ lock.acquire(
+ `${type}_indexes`,
+ () => {
+ this.loading.set(type, false);
+ const callbacks = this.callbacks.get(type);
+ if (typeof callbacks !== 'undefined') {
+ callbacks.forEach((callback) => {
+ callback(collection);
+ });
+ this.callbacks.set(type, []);
+ }
+ },
+ () => {
+ // ignore
+ },
+ );
+ })
+ .catch(() => {
+ // ignore
+ });
});
}
- load(json: IndexesData, collection: Collection): void {
- const store = (indexesData: IndexesData, parentId: number) => {
- indexesData.forEach((indexData: IndexData, idx) => {
- const entry: Index = {
- id: indexData.id,
- title: indexData.title,
- numOfItems: indexData.num_of_items,
- parentId: parentId,
- weight: idx,
- };
- collection.insert(entry);
- store(indexData.children, indexData.id);
- });
- };
- store(json, INDEX_ID_ROOT);
+ registerIndexLoadCallback(type: BrainAtlasType, func: IndexLoadCallbackFunc): void {
+ const lock = new AsyncLock();
+ lock.acquire(
+ `${type}_indexes`,
+ () => {
+ if (this.loading.get(type)) {
+ const callbacks = this.callbacks.get(type);
+ if (typeof callbacks !== 'undefined') {
+ callbacks.push(func);
+ }
+ } else {
+ const collection = this.indexes.get(type);
+ if (typeof collection !== 'undefined') {
+ func(collection);
+ }
+ }
+ },
+ () => {
+ // ignore
+ },
+ );
}
getUrl(type: BrainAtlasType, id: number): string {
- return "/" + type + "/modules/xoonips/listitem.php?index_id=" + String(id);
+ return '/' + type + '/modules/xoonips/listitem.php?index_id=' + String(id);
}
- get(type: BrainAtlasType, indexId: number): Index | null {
- const filter = {
- id: indexId,
- };
- const collection = this.indexes.get(type);
- if (typeof collection === "undefined") {
- return null;
- }
- const res = collection.findOne(filter);
- return res;
+ get(type: BrainAtlasType, indexId: number, func: GetCallbackFunc): void {
+ this.registerIndexLoadCallback(type, (indexes) => {
+ const filter: LokiSearchFilter = {
+ id: indexId,
+ };
+ const index = indexes.findOne(filter);
+ func(index);
+ });
}
- getChildren(type: BrainAtlasType, indexId: number): Index[] {
- const filter = {
- parentId: indexId,
- };
- const collection = this.indexes.get(type);
- if (typeof collection === "undefined") {
- return [];
- }
- const res = collection.chain().find(filter).simplesort("weight").data();
- return res;
+ getChildren(type: BrainAtlasType, indexId: number, func: SearchCallbackFunc): void {
+ this.registerIndexLoadCallback(type, (indexes) => {
+ const filter: LokiSearchFilter = {
+ parentId: indexId,
+ };
+ const children = indexes.chain().find(filter).simplesort('weight').data();
+ func(children);
+ });
}
- countChildren(type: BrainAtlasType, indexId: number): number {
- const filter = {
- parentId: indexId,
- };
- const collection = this.indexes.get(type);
- if (typeof collection === "undefined") {
- return 0;
- }
- const res = collection.count(filter);
- return res;
+ countChildren(type: BrainAtlasType, indexId: number, func: CountCallbackFunc): void {
+ this.registerIndexLoadCallback(type, (indexes) => {
+ const filter: LokiSearchFilter = {
+ parentId: indexId,
+ };
+ const count = indexes.count(filter);
+ func(count);
+ });
}
- getParents(type: BrainAtlasType, parentId: number): Index[] {
- let parents: Index[] = [];
- const loop = (parentId: number) => {
- if (parentId !== INDEX_ID_ROOT) {
- const parent = this.get(type, parentId);
- if (parent !== null) {
- loop(parent.parentId);
- parents.push(parent);
- }
+ getParents(type: BrainAtlasType, parentId: number, func: SearchCallbackFunc): void {
+ const parents: Index[] = [];
+ const loop = (parentId: number, func: SearchCallbackFunc) => {
+ if (parentId === INDEX_ID_ROOT) {
+ func(parents);
+ } else {
+ this.get(type, parentId, (parent) => {
+ if (parent != null) {
+ loop(parent.parentId, func);
+ parents.push(parent);
+ }
+ });
}
};
- loop(parentId);
- return parents;
+ loop(parentId, func);
}
}
-export default new IndexUtil(treesJson as TreesJson);
+export default new IndexUtil();
diff --git a/src/database/lib/ItemUtil.ts b/src/database/lib/ItemUtil.ts
index 3f31219..bd9d62c 100644
--- a/src/database/lib/ItemUtil.ts
+++ b/src/database/lib/ItemUtil.ts
@@ -1,10 +1,11 @@
-import AsyncLock from "async-lock";
-import axios from "axios";
-import loki from "lokijs";
-import { BrainAtlasType, BrainAtlasTypes } from "../../config";
-import Functions from "../../functions";
-import simpfLinksJson from "../assets/simpf-links.json";
-import AdvancedSearchQuery from "./AdvancedSearchQuery";
+import AsyncLock from 'async-lock';
+import axios from 'axios';
+import loki from 'lokijs';
+import { BrainAtlasType, BrainAtlasTypes } from '../../config';
+import Functions from '../../functions';
+import simpfLinksJson from '../assets/simpf-links.json';
+import AdvancedSearchQuery from './AdvancedSearchQuery';
+import { LokiSearchFilter } from './types';
interface SimPFLink {
id: number;
@@ -18,7 +19,21 @@ interface ItemSubType {
export type ItemSubTypes = readonly ItemSubType[];
-export type ItemBasicLang = "eng" | "jpn" | "fra" | "deu" | "esl" | "ita" | "dut" | "sve" | "nor" | "dan" | "fin" | "por" | "chi" | "kor";
+export type ItemBasicLang =
+ | 'eng'
+ | 'jpn'
+ | 'fra'
+ | 'deu'
+ | 'esl'
+ | 'ita'
+ | 'dut'
+ | 'sve'
+ | 'nor'
+ | 'dan'
+ | 'fin'
+ | 'por'
+ | 'chi'
+ | 'kor';
export interface ItemBasicIndex {
index_id: number;
title: string;
@@ -69,7 +84,7 @@ export interface ItemBinder extends ItemBasic {
}
export interface ItemBook extends ItemBasic {
- classfication: string;
+ classification: string;
editor: string;
publisher: string;
isbn: string;
@@ -79,12 +94,12 @@ export interface ItemBook extends ItemBasic {
author: string[];
}
-export type ItemConferenceSubType = "powerpoint" | "pdf" | "illustrator" | "other";
+export type ItemConferenceSubType = 'powerpoint' | 'pdf' | 'illustrator' | 'other';
export const ItemConferenceSubTypes: ItemSubTypes = [
- { type: "powerpoint", label: "PowerPoint" },
- { type: "pdf", label: "PDF" },
- { type: "illustrator", label: "Illustrator" },
- { type: "other", label: "Other" },
+ { type: 'powerpoint', label: 'PowerPoint' },
+ { type: 'pdf', label: 'PDF' },
+ { type: 'illustrator', label: 'Illustrator' },
+ { type: 'other', label: 'Other' },
];
export interface ItemConference extends ItemBasic {
presentation_type: ItemConferenceSubType;
@@ -102,13 +117,13 @@ export interface ItemConference extends ItemBasic {
author: string[];
}
-export type ItemDataSubType = "excel" | "movie" | "text" | "picture" | "other";
+export type ItemDataSubType = 'excel' | 'movie' | 'text' | 'picture' | 'other';
export const ItemDataSubTypes: ItemSubTypes = [
- { type: "excel", label: "Excel" },
- { type: "movie", label: "Movie" },
- { type: "text", label: "Text" },
- { type: "picture", label: "Picture" },
- { type: "other", label: "Other" },
+ { type: 'excel', label: 'Excel' },
+ { type: 'movie', label: 'Movie' },
+ { type: 'text', label: 'Text' },
+ { type: 'picture', label: 'Picture' },
+ { type: 'other', label: 'Other' },
];
export interface ItemData extends ItemBasic {
data_type: ItemDataSubType;
@@ -122,10 +137,10 @@ export interface ItemData extends ItemBasic {
experimenter: string[];
}
-export type ItemFilesSubType = "pdf" | "zip"; // Brain Atlas extended
+export type ItemFilesSubType = 'pdf' | 'zip'; // Brain Atlas extended
export const ItemFilesSubTypes: ItemSubTypes = [
- { type: "pdf", label: "pdf" },
- { type: "zip", label: "zip" },
+ { type: 'pdf', label: 'pdf' },
+ { type: 'zip', label: 'zip' },
];
export interface ItemFiles extends ItemBasic {
data_file_name: string;
@@ -137,15 +152,22 @@ export interface ItemMemo extends ItemBasic {
item_link: string;
}
-export type ItemModelSubType = "matlab" | "neuron" | "original_program" | "satellite" | "genesis" | "a_cell" | "other";
+export type ItemModelSubType =
+ | 'matlab'
+ | 'neuron'
+ | 'original_program'
+ | 'satellite'
+ | 'genesis'
+ | 'a_cell'
+ | 'other';
export const ItemModelSubTypes: ItemSubTypes = [
- { type: "matlab", label: "Matlab" },
- { type: "neuron", label: "Neuron" },
- { type: "original_program", label: "Original Program" },
- { type: "satellite", label: "Satellite" },
- { type: "genesis", label: "Genesis" },
- { type: "a_cell", label: "A-Cell" },
- { type: "other", label: "Other" },
+ { type: 'matlab', label: 'Matlab' },
+ { type: 'neuron', label: 'Neuron' },
+ { type: 'original_program', label: 'Original Program' },
+ { type: 'satellite', label: 'Satellite' },
+ { type: 'genesis', label: 'Genesis' },
+ { type: 'a_cell', label: 'A-Cell' },
+ { type: 'other', label: 'Other' },
];
export interface ItemModel extends ItemBasic {
model_type: ItemModelSubType;
@@ -169,14 +191,20 @@ export interface ItemPaper extends ItemBasic {
author: string[];
}
-export type ItemPresentationSubType = "powerpoint" | "lotus" | "justsystem" | "html" | "pdf" | "other";
+export type ItemPresentationSubType =
+ | 'powerpoint'
+ | 'lotus'
+ | 'justsystem'
+ | 'html'
+ | 'pdf'
+ | 'other';
export const ItemPresentationSubTypes: ItemSubTypes = [
- { type: "powerpoint", label: "PowerPoint" },
- { type: "lotus", label: "Lotus" },
- { type: "justsystem", label: "JustSystem" },
- { type: "html", label: "HTML" },
- { type: "pdf", label: "PDF" },
- { type: "other", label: "Other" },
+ { type: 'powerpoint', label: 'PowerPoint' },
+ { type: 'lotus', label: 'Lotus' },
+ { type: 'justsystem', label: 'JustSystem' },
+ { type: 'html', label: 'HTML' },
+ { type: 'pdf', label: 'PDF' },
+ { type: 'other', label: 'Other' },
];
export interface ItemPresentation extends ItemBasic {
presentation_type: ItemPresentationSubType;
@@ -190,12 +218,12 @@ export interface ItemPresentation extends ItemBasic {
creator: string[];
}
-export type ItemSimulatorSubType = "matlab" | "mathematica" | "program" | "other";
+export type ItemSimulatorSubType = 'matlab' | 'mathematica' | 'program' | 'other';
export const ItemSimulatorSubTypes: ItemSubTypes = [
- { type: "matlab", label: "Matlab" },
- { type: "mathematica", label: "Mathematica" },
- { type: "program", label: "Program" },
- { type: "other", label: "Other" },
+ { type: 'matlab', label: 'Matlab' },
+ { type: 'mathematica', label: 'Mathematica' },
+ { type: 'program', label: 'Program' },
+ { type: 'other', label: 'Other' },
];
export interface ItemSimulator extends ItemBasic {
simulator_type: ItemSimulatorSubType;
@@ -209,12 +237,12 @@ export interface ItemSimulator extends ItemBasic {
developer: string[];
}
-export type ItemStimulusSubType = "picture" | "movie" | "program" | "other";
+export type ItemStimulusSubType = 'picture' | 'movie' | 'program' | 'other';
export const ItemStimulusSubTypes: ItemSubTypes = [
- { type: "picture", label: "Picture" },
- { type: "movie", label: "Movie" },
- { type: "program", label: "Program" },
- { type: "other", label: "Other" },
+ { type: 'picture', label: 'Picture' },
+ { type: 'movie', label: 'Movie' },
+ { type: 'program', label: 'Program' },
+ { type: 'other', label: 'Other' },
];
export interface ItemStimulus extends ItemBasic {
stimulus_type: ItemStimulusSubType;
@@ -228,12 +256,12 @@ export interface ItemStimulus extends ItemBasic {
developer: string[];
}
-export type ItemToolSubType = "matlab" | "mathematica" | "program" | "other";
+export type ItemToolSubType = 'matlab' | 'mathematica' | 'program' | 'other';
export const ItemToolSubTypes: ItemSubTypes = [
- { type: "matlab", label: "Matlab" },
- { type: "mathematica", label: "Mathematica" },
- { type: "program", label: "Program" },
- { type: "other", label: "Other" },
+ { type: 'matlab', label: 'Matlab' },
+ { type: 'mathematica', label: 'Mathematica' },
+ { type: 'program', label: 'Program' },
+ { type: 'other', label: 'Other' },
];
export interface ItemTool extends ItemBasic {
tool_type: ItemToolSubType;
@@ -252,17 +280,76 @@ export interface ItemUrl extends ItemBasic {
url_count: number;
}
-export type Item = ItemBinder | ItemBook | ItemConference | ItemData | ItemFiles | ItemMemo | ItemModel | ItemPaper | ItemPresentation | ItemSimulator | ItemStimulus | ItemTool | ItemUrl;
+export type Item =
+ | ItemBinder
+ | ItemBook
+ | ItemConference
+ | ItemData
+ | ItemFiles
+ | ItemMemo
+ | ItemModel
+ | ItemPaper
+ | ItemPresentation
+ | ItemSimulator
+ | ItemStimulus
+ | ItemTool
+ | ItemUrl;
-export type KeywordSearchType = "all" | "basic" | "binder" | "book" | "conference" | "data" | "files" | "memo" | "model" | "paper" | "presentation" | "simulator" | "stimulus" | "tool" | "url";
+export type ItemSubTypesAll =
+ | ItemSubTypes
+ | ItemSubTypes
+ | ItemSubTypes // Brain Atlas extended
+ | ItemSubTypes
+ | ItemSubTypes
+ | ItemSubTypes
+ | ItemSubTypes
+ | ItemSubTypes;
+
+export type KeywordSearchType =
+ | 'all'
+ | 'basic'
+ | 'binder'
+ | 'book'
+ | 'conference'
+ | 'data'
+ | 'files'
+ | 'memo'
+ | 'model'
+ | 'paper'
+ | 'presentation'
+ | 'simulator'
+ | 'stimulus'
+ | 'tool'
+ | 'url';
export interface KeywordSearchQuery {
type: KeywordSearchType;
keyword: string;
}
-const KEYWORD_SEARCH_TYPE_RANGE = ["all", "basic", "binder", "book", "conference", "files", "data", "memo", "model", "paper", "presentation", "simulator", "stimulus", "tool", "url"];
+const KEYWORD_SEARCH_TYPE_RANGE = [
+ 'all',
+ 'basic',
+ 'binder',
+ 'book',
+ 'conference',
+ 'files',
+ 'data',
+ 'memo',
+ 'model',
+ 'paper',
+ 'presentation',
+ 'simulator',
+ 'stimulus',
+ 'tool',
+ 'url',
+];
export type SortConditionLimit = 20 | 50 | 100;
-export type SortConditionOrderBy = "title" | "doi" | "last_update_date" | "creation_date" | "publication_date";
+export type SortConditionOrderBy =
+ | 'title'
+ | 'doi'
+ | 'last_update_date'
+ | 'creation_date'
+ | 'publication_date';
export enum SortConditionOrderDir {
ASC,
DESC,
@@ -285,27 +372,27 @@ class ItemSorter {
this.sort = this.sort.bind(this);
}
- sort(a: Item, b: Item) {
- let av: string = "";
- let bv: string = "";
+ sort(a: Item, b: Item): number {
+ let av = '';
+ let bv = '';
switch (this.orderBy) {
- case "title":
+ case 'title':
av = a.title.toLocaleUpperCase();
bv = b.title.toLocaleUpperCase();
break;
- case "doi":
+ case 'doi':
av = a.doi.toLocaleUpperCase();
bv = b.doi.toLocaleUpperCase();
break;
- case "last_update_date":
+ case 'last_update_date':
av = String(a.last_update_date);
bv = String(b.last_update_date);
break;
- case "creation_date":
+ case 'creation_date':
av = String(a.creation_date);
bv = String(b.creation_date);
break;
- case "publication_date":
+ case 'publication_date':
av = String(a.publication_year * 10000 + a.publication_month * 100 + a.publication_mday);
bv = String(b.publication_year * 10000 + b.publication_month * 100 + b.publication_mday);
break;
@@ -324,23 +411,15 @@ class ItemSorter {
}
type GetResult = Item | null;
-export interface GetCallbackFunc {
- (item: GetResult): void;
-}
+export type GetCallbackFunc = (item: GetResult) => void;
export interface SearchResult {
total: number;
data: Item[];
}
-export interface SearchCallbackFunc {
- (results: SearchResult): void;
-}
-export interface SearchFunc {
- (condition: SortCondition, func: SearchCallbackFunc): void;
-}
+export type SearchCallbackFunc = (results: SearchResult) => void;
+export type SearchFunc = (condition: SortCondition, func: SearchCallbackFunc) => void;
-interface ItemLoadCallbackFunc {
- (items: Collection- ): void;
-}
+type ItemLoadCallbackFunc = (items: Collection
- ) => void;
class ItemUtil {
private database: loki;
@@ -350,9 +429,9 @@ class ItemUtil {
private callbacks: Map
;
constructor() {
- this.database = new loki("database");
+ this.database = new loki('database', { env: 'BROWSER' });
this.items = new Map>();
- this.simpfLinks = this.database.addCollection("simpf-links");
+ this.simpfLinks = this.database.addCollection('simpf-links');
this.loading = new Map();
this.callbacks = new Map();
this.load();
@@ -360,27 +439,38 @@ class ItemUtil {
load(): void {
BrainAtlasTypes.forEach((type) => {
- const collection = this.database.addCollection(type + "_items");
+ const collection = this.database.addCollection- (type + '_items');
this.items.set(type, collection);
this.loading.set(type, true);
this.callbacks.set(type, []);
- axios.get(process.env.PUBLIC_URL + "/" + type + "/items.json", { responseType: "json" }).then((response) => {
- const itemsJson = response.data as Item[];
- itemsJson.forEach((json: Item) => {
- collection.insert(json);
+ axios
+ .get
- (`/data/${type}/items.json`, { responseType: 'json' })
+ .then((response) => {
+ const itemsJson = response.data;
+ itemsJson.forEach((json: Item) => {
+ collection.insert(json);
+ });
+ const lock = new AsyncLock();
+ lock.acquire(
+ `${type}_items`,
+ () => {
+ this.loading.set(type, false);
+ const callbacks = this.callbacks.get(type);
+ if (typeof callbacks !== 'undefined') {
+ callbacks.forEach((callback) => {
+ callback(collection);
+ });
+ this.callbacks.set(type, []);
+ }
+ },
+ () => {
+ // ignore
+ },
+ );
+ })
+ .catch(() => {
+ // ignore
});
- const lock = new AsyncLock();
- lock.acquire("items", () => {
- this.loading.set(type, false);
- const callbacks = this.callbacks.get(type);
- if (typeof callbacks !== "undefined") {
- callbacks.forEach((callback) => {
- callback(collection);
- });
- this.callbacks.set(type, []);
- }
- });
- });
});
const simpfLinks = simpfLinksJson as SimPFLink[];
simpfLinks.forEach((simpfLink: SimPFLink) => {
@@ -390,61 +480,78 @@ class ItemUtil {
registerItemLoadCallback(type: BrainAtlasType, func: ItemLoadCallbackFunc): void {
const lock = new AsyncLock();
- lock.acquire("items", () => {
- if (this.loading.get(type)) {
- const callbacks = this.callbacks.get(type);
- if (typeof callbacks !== "undefined") {
- callbacks.push(func);
+ lock.acquire(
+ `${type}_items`,
+ () => {
+ if (this.loading.get(type)) {
+ const callbacks = this.callbacks.get(type);
+ if (typeof callbacks !== 'undefined') {
+ callbacks.push(func);
+ }
+ } else {
+ const collection = this.items.get(type);
+ if (typeof collection !== 'undefined') {
+ func(collection);
+ }
}
- } else {
- const collection = this.items.get(type);
- if (typeof collection !== "undefined") {
- func(collection);
- }
- }
- });
+ },
+ () => {
+ // ignore
+ },
+ );
}
getUrl(type: BrainAtlasType, item: ItemCore): string {
const url = `/${type}/modules/xoonips/detail.php`;
- if (item.doi !== "") {
- return url + "?id=" + Functions.escape(item.doi);
+ if (item.doi !== '') {
+ return url + '?id=' + Functions.escape(item.doi);
}
- return url + "?item_id=" + String(item.item_id);
+ return url + '?item_id=' + String(item.item_id);
}
getFileUrl(type: BrainAtlasType, file: ItemBasicFile): string {
- return `${process.env.PUBLIC_URL}/${type}/file/` + String(file.file_id) + "/" + Functions.escape(file.original_file_name);
+ return `/data/${type}/file/${file.file_id}/${Functions.escape(file.original_file_name)}`;
}
getPreviewFileUrl(type: BrainAtlasType, file: ItemBasicFile): string {
- return `${process.env.PUBLIC_URL}/${type}/file/` + String(file.file_id) + ".png";
+ return `/data/${type}/file/${file.file_id}/.png`;
}
- getSearchByKeywordUrl(type: BrainAtlasType, kstype: KeywordSearchType, keyword: string): string {
- const params = new URLSearchParams({ keyword, search_itemtype: kstype });
- return `/${type}/modules/xoonips/itemselect.php?op=quicksearch&` + params.toString();
+ getSearchByKeywordUrl(type: BrainAtlasType, ksType: KeywordSearchType, keyword: string): string {
+ const params = new URLSearchParams({ keyword, search_itemtype: ksType });
+ return `/${type}/modules/xoonips/itemselect.php?op=quicksearch&${params.toString()}`;
}
getItemTypeSearchUrl(type: BrainAtlasType, itemType: string, subItemType: string): string {
const url = `/${type}/modules/xoonips/itemselect.php`;
- if (subItemType !== "") {
- return url + "?op=itemsubtypesearch&search_itemtype=xnp" + Functions.escape(itemType) + "&search_subitemtype=" + Functions.escape(subItemType);
+ if (subItemType !== '') {
+ return (
+ url +
+ '?op=itemsubtypesearch&search_itemtype=xnp' +
+ Functions.escape(itemType) +
+ '&search_subitemtype=' +
+ Functions.escape(subItemType)
+ );
}
- return url + "?op=itemtypesearch&search_itemtype=xnp" + Functions.escape(itemType);
+ return url + '?op=itemtypesearch&search_itemtype=xnp' + Functions.escape(itemType);
}
getSearchByAdvancedKeywordsUrl(type: BrainAtlasType, query: AdvancedSearchQuery): string {
const paramString = query.getQueryParams().toString();
- return `/${type}/modules/xoonips/itemselect.php?op=advanced` + (paramString.length > 0 ? "&" + paramString : "");
+ return (
+ `/${type}/modules/xoonips/itemselect.php?op=advanced` +
+ (paramString.length > 0 ? '&' + paramString : '')
+ );
}
getSearchKeywordByQuery(queryString: string): KeywordSearchQuery {
const query = new URLSearchParams(queryString);
- const qtype = query.get("search_itemtype");
- const type = qtype !== null && KEYWORD_SEARCH_TYPE_RANGE.includes(qtype) ? (qtype as KeywordSearchType) : "all";
- const qkeyword = query.get("keyword");
- const keyword = qkeyword === null ? "" : qkeyword;
+ const qType = query.get('search_itemtype');
+ const type =
+ qType !== null && KEYWORD_SEARCH_TYPE_RANGE.includes(qType)
+ ? (qType as KeywordSearchType)
+ : 'all';
+ const keyword = query.get('keyword') ?? '';
return { type, keyword };
}
@@ -456,7 +563,7 @@ class ItemUtil {
get(type: BrainAtlasType, itemId: number, func: GetCallbackFunc): void {
this.registerItemLoadCallback(type, (items) => {
- const filter = {
+ const filter: LokiSearchFilter = {
item_id: itemId,
};
const item = items.findOne(filter);
@@ -466,7 +573,7 @@ class ItemUtil {
getByDoi(type: BrainAtlasType, doi: string, func: GetCallbackFunc): void {
this.registerItemLoadCallback(type, (items) => {
- const filter = {
+ const filter: LokiSearchFilter = {
doi: doi,
};
const item = items.findOne(filter);
@@ -476,7 +583,7 @@ class ItemUtil {
getList(type: BrainAtlasType, itemIds: number[], func: SearchCallbackFunc): void {
this.registerItemLoadCallback(type, (items) => {
- const filter = {
+ const filter: LokiSearchFilter = {
item_id: {
$in: itemIds,
},
@@ -504,51 +611,66 @@ class ItemUtil {
});
}
- getListByIndexId(type: BrainAtlasType, indexId: number, condition: SortCondition, func: SearchCallbackFunc): void {
+ getListByIndexId(
+ type: BrainAtlasType,
+ indexId: number,
+ condition: SortCondition,
+ func: SearchCallbackFunc,
+ ): void {
this.registerItemLoadCallback(type, (items) => {
- const filter: any = {
- "index.index_id": indexId,
+ const filter: LokiSearchFilter = {
+ 'index.index_id': indexId,
};
const offset = condition.limit * (condition.page - 1);
const result = items.chain().find(filter);
const itemSorter = new ItemSorter(condition);
const ret = {
total: result.count(),
- data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data(),
+ data: result
+ .sort((a, b) => itemSorter.sort(a, b))
+ .offset(offset)
+ .limit(condition.limit)
+ .data(),
};
func(ret);
});
}
- getListByItemType(type: BrainAtlasType, itemType: string, subItemType: string, condition: SortCondition, func: SearchCallbackFunc): void {
+ getListByItemType(
+ type: BrainAtlasType,
+ itemType: string,
+ subItemType: string,
+ condition: SortCondition,
+ func: SearchCallbackFunc,
+ ): void {
this.registerItemLoadCallback(type, (items) => {
- let filter: any = {
- item_type_name: "xnp" + itemType,
+ const filter: LokiSearchFilter = {
+ item_type_name: 'xnp' + itemType,
};
- if (subItemType !== "") {
+ if (subItemType !== '') {
switch (itemType) {
- case "conference":
+ case 'conference':
filter.presentation_type = subItemType;
break;
- case "data":
+ case 'data':
filter.data_type = subItemType;
break;
- case "files":
+ case 'files':
filter.data_file_filetype = subItemType;
break;
- case "model":
+ case 'model':
filter.model_type = subItemType;
break;
- case "presentation":
+ case 'presentation':
filter.presentation_type = subItemType;
break;
- case "simulator":
+ case 'simulator':
filter.simulator_type = subItemType;
break;
- case "stimulus":
+ case 'stimulus':
filter.stimulus_type = subItemType;
break;
- case "tool":
+ case 'tool':
filter.tool_type = subItemType;
break;
default:
@@ -560,133 +682,283 @@ class ItemUtil {
const itemSorter = new ItemSorter(condition);
const ret = {
total: result.count(),
- data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data(),
+ data: result
+ .sort((a, b) => itemSorter.sort(a, b))
+ .offset(offset)
+ .limit(condition.limit)
+ .data(),
};
func(ret);
});
}
- getListByKeyword(type: BrainAtlasType, kstype: KeywordSearchType, keyword: string, condition: SortCondition, func: SearchCallbackFunc): void {
+ getListByKeyword(
+ type: BrainAtlasType,
+ ksType: KeywordSearchType,
+ keyword: string,
+ condition: SortCondition,
+ func: SearchCallbackFunc,
+ ): void {
this.registerItemLoadCallback(type, (items) => {
- const regex = keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ const regex = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const num = keyword.match(/^[0-9]+$/) ? parseInt(keyword, 10) : null;
- let filter: any = { $or: [] };
+ const filter: LokiSearchFilter = {};
+ const filterOr: LokiSearchFilter[] = [];
const appendToFilter = (type: string, strKeys: string[], numKeys: string[]) => {
- const basicStrKeys: string[] = ["title", "keyword", "doi", "description", "uname", "name", "index.title"];
+ const basicStrKeys: string[] = [
+ 'title',
+ 'keyword',
+ 'doi',
+ 'description',
+ 'uname',
+ 'name',
+ 'index.title',
+ ];
const basicNumKeys: string[] = [];
- let filterItemType: any = {
- item_type_name: "xnp" + type,
- $or: [],
- };
- let sKeys: string[] = basicStrKeys.concat(strKeys);
- let nKeys: string[] = basicNumKeys.concat(numKeys);
+ const filterItemTypeOr: LokiSearchFilter[] = [];
+ const sKeys: string[] = basicStrKeys.concat(strKeys);
+ const nKeys: string[] = basicNumKeys.concat(numKeys);
sKeys.forEach((key) => {
- let criteria: any = {};
- criteria[key] = { $regex: [regex, "i"] };
- filterItemType["$or"].push(criteria);
+ const criteria: LokiSearchFilter = {};
+ criteria[key] = { $regex: [regex, 'i'] };
+ filterItemTypeOr.push(criteria);
});
if (num !== null) {
nKeys.forEach((key) => {
- let criteria: any = {};
+ const criteria: LokiSearchFilter = {};
criteria[key] = { $eq: num };
- filterItemType["$or"].push(criteria);
+ filterItemTypeOr.push(criteria);
});
}
- filter["$or"].push(filterItemType);
+ filterOr.push({
+ item_type_name: 'xnp' + type,
+ $or: filterItemTypeOr,
+ });
};
- if (kstype === "basic") {
- filter["$or"].push({ title: { $regex: [regex, "i"] } });
- filter["$or"].push({ keyword: { $regex: [regex, "i"] } });
+ if (ksType === 'basic') {
+ filterOr.push({ title: { $regex: [regex, 'i'] } });
+ filterOr.push({ keyword: { $regex: [regex, 'i'] } });
} else {
- if (kstype === "all" || kstype === "binder") {
- const strKeys: string[] = ["doi", "title", "keyword", "description"];
+ if (ksType === 'all' || ksType === 'binder') {
+ const strKeys: string[] = ['doi', 'title', 'keyword', 'description'];
const numKeys: string[] = [];
- appendToFilter("binder", strKeys, numKeys);
+ appendToFilter('binder', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "book") {
- const strKeys: string[] = ["doi", "title", "keyword", "classification", "editor", "publisher", "isbn", "url", "author", "file.caption", "file.original_file_name"];
+ if (ksType === 'all' || ksType === 'book') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'classification',
+ 'editor',
+ 'publisher',
+ 'isbn',
+ 'url',
+ 'author',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
const numKeys: string[] = [];
- appendToFilter("book", strKeys, numKeys);
+ appendToFilter('book', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "conference") {
- const strKeys: string[] = ["doi", "title", "conference_title", "place", "abstract", "author", "file.caption", "file.original_file_name"];
- const numKeys: string[] = ["conference_from_year", "conference_from_month", "conference_from_mday", "conference_to_year", "conference_to_month", "conference_to_mday"];
- appendToFilter("conference", strKeys, numKeys);
+ if (ksType === 'all' || ksType === 'conference') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'conference_title',
+ 'place',
+ 'abstract',
+ 'author',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
+ const numKeys: string[] = [
+ 'conference_from_year',
+ 'conference_from_month',
+ 'conference_from_mday',
+ 'conference_to_year',
+ 'conference_to_month',
+ 'conference_to_mday',
+ ];
+ appendToFilter('conference', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "data") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "readme", "rights", "experimenter", "data_type", "file.caption", "file.original_file_name"];
- const numKeys: string[] = ["publication_year", "publication_month", "publication_mday"];
- appendToFilter("data", strKeys, numKeys);
+ if (ksType === 'all' || ksType === 'data') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'readme',
+ 'rights',
+ 'experimenter',
+ 'data_type',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
+ const numKeys: string[] = ['publication_year', 'publication_month', 'publication_mday'];
+ appendToFilter('data', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "files") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "data_file_name", "data_file_mimetype", "data_file_filetype"];
+ if (ksType === 'all' || ksType === 'files') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'data_file_name',
+ 'data_file_mimetype',
+ 'data_file_filetype',
+ ];
const numKeys: string[] = [];
- appendToFilter("files", strKeys, numKeys);
+ appendToFilter('files', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "memo") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "item_link", "file.original_file_name"];
+ if (ksType === 'all' || ksType === 'memo') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'item_link',
+ 'file.original_file_name',
+ ];
const numKeys: string[] = [];
- appendToFilter("memo", strKeys, numKeys);
+ appendToFilter('memo', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "model") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "readme", "rights", "creator", "model_type", "file.caption", "file.original_file_name"];
+ if (ksType === 'all' || ksType === 'model') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'readme',
+ 'rights',
+ 'creator',
+ 'model_type',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
const numKeys: string[] = [];
- appendToFilter("model", strKeys, numKeys);
+ appendToFilter('model', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "paper") {
- const strKeys: string[] = ["doi", "title", "keyword", "journal", "page", "pubmed_id", "author"];
- const numKeys: string[] = ["publication_year", "volume", "number"];
- appendToFilter("paper", strKeys, numKeys);
+ if (ksType === 'all' || ksType === 'paper') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'journal',
+ 'page',
+ 'pubmed_id',
+ 'author',
+ ];
+ const numKeys: string[] = ['publication_year', 'volume', 'number'];
+ appendToFilter('paper', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "presentation") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "readme", "rights", "creator", "presentation_type", "file.caption", "file.original_file_name"];
- const numKeys: string[] = ["publication_year", "publication_month", "publication_mday"];
- appendToFilter("presentation", strKeys, numKeys);
+ if (ksType === 'all' || ksType === 'presentation') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'readme',
+ 'rights',
+ 'creator',
+ 'presentation_type',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
+ const numKeys: string[] = ['publication_year', 'publication_month', 'publication_mday'];
+ appendToFilter('presentation', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "simulator") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "readme", "rights", "developer", "simulator_type", "file.caption", "file.original_file_name"];
- const numKeys: string[] = ["publication_year", "publication_month", "publication_mday"];
- appendToFilter("simulator", strKeys, numKeys);
+ if (ksType === 'all' || ksType === 'simulator') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'readme',
+ 'rights',
+ 'developer',
+ 'simulator_type',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
+ const numKeys: string[] = ['publication_year', 'publication_month', 'publication_mday'];
+ appendToFilter('simulator', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "stimulus") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "readme", "rights", "developer", "stimulus_type", "file.caption", "file.original_file_name"];
- const numKeys: string[] = ["publication_year", "publication_month", "publication_mday"];
- appendToFilter("stimulus", strKeys, numKeys);
+ if (ksType === 'all' || ksType === 'stimulus') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'readme',
+ 'rights',
+ 'developer',
+ 'stimulus_type',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
+ const numKeys: string[] = ['publication_year', 'publication_month', 'publication_mday'];
+ appendToFilter('stimulus', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "tool") {
- const strKeys: string[] = ["doi", "title", "keyword", "description", "readme", "rights", "developer", "tool_type", "file.caption", "file.original_file_name"];
+ if (ksType === 'all' || ksType === 'tool') {
+ const strKeys: string[] = [
+ 'doi',
+ 'title',
+ 'keyword',
+ 'description',
+ 'readme',
+ 'rights',
+ 'developer',
+ 'tool_type',
+ 'file.caption',
+ 'file.original_file_name',
+ ];
const numKeys: string[] = [];
- appendToFilter("tool", strKeys, numKeys);
+ appendToFilter('tool', strKeys, numKeys);
}
- if (kstype === "all" || kstype === "url") {
- const strKeys: string[] = ["doi", "title", "keyword", "url", "file.original_file_name"];
+ if (ksType === 'all' || ksType === 'url') {
+ const strKeys: string[] = ['doi', 'title', 'keyword', 'url', 'file.original_file_name'];
const numKeys: string[] = [];
- appendToFilter("url", strKeys, numKeys);
+ appendToFilter('url', strKeys, numKeys);
}
- if (kstype !== "all") {
- filter["item_type_name"] = "xnp" + kstype;
+ if (ksType !== 'all') {
+ filter.item_type_name = 'xnp' + ksType;
}
}
+ filter.$or = filterOr;
const offset = condition.limit * (condition.page - 1);
const result = items.chain().find(filter);
const itemSorter = new ItemSorter(condition);
const ret = {
total: result.count(),
- data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data(),
+ data: result
+ .sort((a, b) => itemSorter.sort(a, b))
+ .offset(offset)
+ .limit(condition.limit)
+ .data(),
};
func(ret);
});
}
- getListByAdvancedSearchQuery(type: BrainAtlasType, query: AdvancedSearchQuery, condition: SortCondition, func: SearchCallbackFunc): void {
+ getListByAdvancedSearchQuery(
+ type: BrainAtlasType,
+ query: AdvancedSearchQuery,
+ condition: SortCondition,
+ func: SearchCallbackFunc,
+ ): void {
this.registerItemLoadCallback(type, (items) => {
- const filter: any = query.getSearchFilter();
+ const filter: LokiSearchFilter = query.getSearchFilter();
const offset = condition.limit * (condition.page - 1);
const result = items.chain().find(filter);
const itemSorter = new ItemSorter(condition);
const ret = {
total: result.count(),
- data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data(),
+ data: result
+ .sort((a, b) => itemSorter.sort(a, b))
+ .offset(offset)
+ .limit(condition.limit)
+ .data(),
};
func(ret);
});
@@ -695,7 +967,7 @@ class ItemUtil {
getSimPFLinkUrl(itemId: number) {
const simpfLink = this.simpfLinks.findOne({ id: itemId });
if (simpfLink === null) {
- return "";
+ return '';
}
return simpfLink.url;
}
diff --git a/src/database/lib/types.ts b/src/database/lib/types.ts
new file mode 100644
index 0000000..bbc2f4c
--- /dev/null
+++ b/src/database/lib/types.ts
@@ -0,0 +1,3 @@
+export interface LokiSearchFilter {
+ [key: string]: string | string[] | number | number[] | LokiSearchFilter | LokiSearchFilter[];
+}
diff --git a/src/functions.ts b/src/functions.ts
index 150fce4..cd63f2a 100644
--- a/src/functions.ts
+++ b/src/functions.ts
@@ -1,9 +1,9 @@
-import XRegExp from "xregexp";
-import Config, { MultiLang } from "./config";
+import XRegExp from 'xregexp';
+import Config, { MultiLang } from './config';
const escape = (str: string) => {
return encodeURIComponent(str).replace(/[!'()*]/g, (c) => {
- return "%" + c.charCodeAt(0).toString(16);
+ return '%' + c.charCodeAt(0).toString(16);
});
};
@@ -14,36 +14,36 @@ const unescape = (str: string) => {
const htmlspecialchars = (str: string) => {
return str.replace(/(<|>|&|'|")/g, (match) => {
switch (match) {
- case "<":
- return "<";
- case ">":
- return ">";
- case "&":
- return "&";
+ case '<':
+ return '<';
+ case '>':
+ return '>';
+ case '&':
+ return '&';
case "'":
- return "'";
+ return ''';
case '"':
- return """;
+ return '"';
}
- return "";
+ return '';
});
};
const camelCase = (str: string) => {
return str.replace(/[-_](.)/g, (...matches) => {
- return matches[1].toUpperCase();
+ return (matches[1] as string).toUpperCase();
});
};
const snakeCase = (str: string) => {
- var camel = camelCase(str);
+ const camel = camelCase(str);
return camel.replace(/[A-Z]/g, (...matches) => {
- return "_" + matches[0].charAt(0).toLowerCase();
+ return '_' + matches[0].charAt(0).toLowerCase();
});
};
const pascalCase = (str: string) => {
- var camel = camelCase(str);
+ const camel = camelCase(str);
return camel.charAt(0).toUpperCase() + camel.slice(1);
};
@@ -58,49 +58,68 @@ const base64Decode = (str: string) => {
const ordinal = (num: number) => {
const hundred = num % 100;
if (hundred >= 10 && hundred <= 20) {
- return "th";
+ return 'th';
}
const ten = num % 10;
- const suffix = ["st", "nd", "rd"];
- return ten > 0 && ten < 4 ? suffix[ten - 1] : "th";
+ const suffix = ['st', 'nd', 'rd'];
+ return ten > 0 && ten < 4 ? suffix[ten - 1] : 'th';
};
const mlang = (str: string, lang: MultiLang) => {
- const mlLangs = ["en", "ja"];
+ const mlLangs = ['en', 'ja'];
// escape brackets inside of
- let text = str.replace(/( ]*)(>)/gis, (whole, m1, m2, m3) => {
- if (m2.match(/type=["']?(?:text|hidden)["']?/is)) {
- return m1 + m2.replace(/\[/g, "__ml[ml__") + m3;
- }
- return whole;
- });
+ let text = str.replace(
+ /( ]*)(>)/gis,
+ (whole: string, m1: string, m2: string, m3: string) => {
+ if (m2.match(/type=["']?(?:text|hidden)["']?/is)) {
+ return m1 + m2.replace(/\[/g, '__ml[ml__') + m3;
+ }
+ return whole;
+ },
+ );
// escape brackets inside of
- text = text.replace(/(