diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 16bf684..2bb139a 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -4,20 +4,45 @@ module.exports = { "es2021": true }, "extends": [ + "prettier", "eslint:recommended", - "plugin:@typescript-eslint/recommended" + "plugin:@typescript-eslint/recommended", + "plugin:solid/typescript", + "plugin:import/typescript", + "plugin:import/recommended" ], "overrides": [ ], "parser": "@typescript-eslint/parser", "parserOptions": { + "tsconfigRootDir": "./", + "project": ["./tsconfig.json"], "ecmaVersion": "latest", - "sourceType": "module" + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } }, "plugins": [ - "@typescript-eslint" + "@typescript-eslint", + "solid", + "import" ], "rules": { "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_", destructuredArrayIgnorePattern: "^_", varsIgnorePattern: "^_" }], + "solid/reactivity": "warn", + "solid/no-destructure": "warn", + "solid/jsx-no-undef": "error", + }, + "settings": { + "import/parsers": { + "@typescript-eslint/parser": [".ts", ".tsx"] + }, + "import/resolver": { + "typescript": { + "project": ["./tsconfig.json"], + "alwaysTryTypes": true + } + } } } diff --git a/package.json b/package.json index 334f3a9..ac6e64e 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,15 @@ "type": "module", "devDependencies": { "@types/node": "^18.15.11", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", + "@typescript-eslint/eslint-plugin": "^5.58.0", + "@typescript-eslint/parser": "^5.58.0", "autoprefixer": "^10.4.14", "esbuild": "^0.14.54", "eslint": "^8.38.0", + "eslint-import-resolver-typescript": "2.7.1", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-solid": "0.11.0", "postcss": "^8.4.21", "solid-start-node": "^0.2.26", "tailwindcss": "^3.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2eb219f..ac2cbed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ dependencies: version: 0.2.3 '@nostr-dev-kit/ndk': specifier: ^0.0.13 - version: 0.0.13(typescript@4.9.5) + version: 0.0.13(eslint-import-resolver-typescript@2.7.1)(typescript@4.9.5) '@solidjs/meta': specifier: ^0.28.4 version: 0.28.4(solid-js@1.7.3) @@ -36,7 +36,7 @@ dependencies: version: 0.0.8(qr.js@0.0.0)(solid-js@1.7.3) solid-start: specifier: ^0.2.26 - version: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.3)(solid-start-node@0.2.26)(vite@4.2.1) + version: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.3)(solid-start-node@0.2.26)(vite@4.2.1)(vue@3.2.47) undici: specifier: ^5.21.2 version: 5.21.2 @@ -46,11 +46,11 @@ devDependencies: specifier: ^18.15.11 version: 18.15.11 '@typescript-eslint/eslint-plugin': - specifier: ^5.57.1 - version: 5.57.1(@typescript-eslint/parser@5.57.1)(eslint@8.38.0)(typescript@4.9.5) + specifier: ^5.58.0 + version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.9.5) '@typescript-eslint/parser': - specifier: ^5.57.1 - version: 5.57.1(eslint@8.38.0)(typescript@4.9.5) + specifier: ^5.58.0 + version: 5.58.0(eslint@8.38.0)(typescript@4.9.5) autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.4.21) @@ -60,6 +60,18 @@ devDependencies: eslint: specifier: ^8.38.0 version: 8.38.0 + eslint-import-resolver-typescript: + specifier: 2.7.1 + version: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.38.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.38.0) + eslint-plugin-prettier: + specifier: 4.2.1 + version: 4.2.1(eslint@8.38.0)(prettier@2.8.7) + eslint-plugin-solid: + specifier: 0.11.0 + version: 0.11.0(eslint@8.38.0)(typescript@4.9.5) postcss: specifier: ^8.4.21 version: 8.4.21 @@ -1628,16 +1640,16 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@nostr-dev-kit/ndk@0.0.13(typescript@4.9.5): + /@nostr-dev-kit/ndk@0.0.13(eslint-import-resolver-typescript@2.7.1)(typescript@4.9.5): resolution: {integrity: sha512-14oVsreLiafhHRBBMF7YcgBk8HBciPyFVSRkpAw9or9N9xRbWYmg4HVNrYWnFsD7b2tlOxwz3uIU4iH6T2Bjdw==} dependencies: '@scure/base': 1.1.1 - '@typescript-eslint/eslint-plugin': 5.57.1(@typescript-eslint/parser@5.57.1)(eslint@8.38.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.57.1(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.9.5) debug: 4.3.4 eslint: 8.38.0 eslint-config-prettier: 8.8.0(eslint@8.38.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.57.1)(eslint@8.38.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.38.0) eventemitter3: 5.0.0 light-bolt11-decoder: 3.0.0 node-fetch: 3.3.1 @@ -1970,7 +1982,6 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: false /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} @@ -1995,8 +2006,8 @@ packages: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: true - /@typescript-eslint/eslint-plugin@5.57.1(@typescript-eslint/parser@5.57.1)(eslint@8.38.0)(typescript@4.9.5): - resolution: {integrity: sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==} + /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.9.5): + resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -2007,23 +2018,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.0 - '@typescript-eslint/parser': 5.57.1(eslint@8.38.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.57.1 - '@typescript-eslint/type-utils': 5.57.1(eslint@8.38.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.57.1(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/type-utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) debug: 4.3.4 eslint: 8.38.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 - semver: 7.3.8 + semver: 7.4.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color - /@typescript-eslint/parser@5.57.1(eslint@8.38.0)(typescript@4.9.5): - resolution: {integrity: sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==} + /@typescript-eslint/parser@5.58.0(eslint@8.38.0)(typescript@4.9.5): + resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2032,24 +2043,24 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.57.1 - '@typescript-eslint/types': 5.57.1 - '@typescript-eslint/typescript-estree': 5.57.1(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) debug: 4.3.4 eslint: 8.38.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color - /@typescript-eslint/scope-manager@5.57.1: - resolution: {integrity: sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==} + /@typescript-eslint/scope-manager@5.58.0: + resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.57.1 - '@typescript-eslint/visitor-keys': 5.57.1 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/visitor-keys': 5.58.0 - /@typescript-eslint/type-utils@5.57.1(eslint@8.38.0)(typescript@4.9.5): - resolution: {integrity: sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==} + /@typescript-eslint/type-utils@5.58.0(eslint@8.38.0)(typescript@4.9.5): + resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -2058,8 +2069,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.57.1(typescript@4.9.5) - '@typescript-eslint/utils': 5.57.1(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) debug: 4.3.4 eslint: 8.38.0 tsutils: 3.21.0(typescript@4.9.5) @@ -2067,12 +2078,12 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/types@5.57.1: - resolution: {integrity: sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==} + /@typescript-eslint/types@5.58.0: + resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@typescript-eslint/typescript-estree@5.57.1(typescript@4.9.5): - resolution: {integrity: sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==} + /@typescript-eslint/typescript-estree@5.58.0(typescript@4.9.5): + resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -2080,19 +2091,19 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.57.1 - '@typescript-eslint/visitor-keys': 5.57.1 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/visitor-keys': 5.58.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 + semver: 7.4.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color - /@typescript-eslint/utils@5.57.1(eslint@8.38.0)(typescript@4.9.5): - resolution: {integrity: sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==} + /@typescript-eslint/utils@5.58.0(eslint@8.38.0)(typescript@4.9.5): + resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2100,23 +2111,96 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.57.1 - '@typescript-eslint/types': 5.57.1 - '@typescript-eslint/typescript-estree': 5.57.1(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) eslint: 8.38.0 eslint-scope: 5.1.1 - semver: 7.3.8 + semver: 7.4.0 transitivePeerDependencies: - supports-color - typescript - /@typescript-eslint/visitor-keys@5.57.1: - resolution: {integrity: sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==} + /@typescript-eslint/visitor-keys@5.58.0: + resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.57.1 + '@typescript-eslint/types': 5.58.0 eslint-visitor-keys: 3.4.0 + /@vue/compiler-core@3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + + /@vue/compiler-dom@3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/compiler-sfc@3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.21 + source-map: 0.6.1 + + /@vue/compiler-ssr@3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/reactivity-transform@3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + + /@vue/reactivity@3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} + dependencies: + '@vue/shared': 3.2.47 + + /@vue/runtime-core@3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} + dependencies: + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/runtime-dom@3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} + dependencies: + '@vue/runtime-core': 3.2.47 + '@vue/shared': 3.2.47 + csstype: 2.6.21 + + /@vue/server-renderer@3.2.47(vue@3.2.47): + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} + peerDependencies: + vue: 3.2.47 + dependencies: + '@vue/compiler-ssr': 3.2.47 + '@vue/shared': 3.2.47 + vue: 3.2.47 + + /@vue/shared@3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2202,7 +2286,6 @@ packages: es-abstract: 1.21.2 get-intrinsic: 1.2.0 is-string: 1.0.7 - dev: false /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -2216,7 +2299,6 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - dev: false /array.prototype.flatmap@1.3.1: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} @@ -2226,7 +2308,6 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - dev: false /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} @@ -2347,7 +2428,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001477 - electron-to-chromium: 1.4.356 + electron-to-chromium: 1.4.357 node-releases: 2.0.10 update-browserslist-db: 1.0.10(browserslist@4.21.5) @@ -2536,6 +2617,9 @@ packages: hasBin: true dev: true + /csstype@2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} @@ -2570,7 +2654,6 @@ packages: optional: true dependencies: ms: 2.1.3 - dev: false /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -2624,7 +2707,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 - dev: false /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} @@ -2636,6 +2718,12 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} + /echarts@5.4.2: + resolution: {integrity: sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==} + dependencies: + tslib: 2.3.0 + zrender: 5.4.3 + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -2647,8 +2735,8 @@ packages: jake: 10.8.5 dev: true - /electron-to-chromium@1.4.356: - resolution: {integrity: sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==} + /electron-to-chromium@1.4.357: + resolution: {integrity: sha512-UTkCbNTAcGXABmEnQrGcW4m3cG6fcyBfD4KDF0iyEAlbrGZiY9dmslyDAGOD1Kr5biN2F743Y30aRCOtau35Vw==} /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2711,7 +2799,6 @@ packages: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 - dev: false /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -3026,13 +3113,29 @@ packages: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.11.0 + is-core-module: 2.12.0 resolve: 1.22.2 transitivePeerDependencies: - supports-color - dev: false - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.57.1)(eslint-import-resolver-node@0.3.7)(eslint@8.38.0): + /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.27.5)(eslint@8.38.0): + resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + eslint: 8.38.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.38.0) + glob: 7.2.3 + is-glob: 4.0.3 + resolve: 1.22.2 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - supports-color + + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.38.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -3053,15 +3156,15 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.57.1(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.9.5) debug: 3.2.7 eslint: 8.38.0 eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.38.0) transitivePeerDependencies: - supports-color - dev: false - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.57.1)(eslint@8.38.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.38.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -3071,7 +3174,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.57.1(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@4.9.5) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -3079,9 +3182,9 @@ packages: doctrine: 2.1.0 eslint: 8.38.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.57.1)(eslint-import-resolver-node@0.3.7)(eslint@8.38.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.38.0) has: 1.0.3 - is-core-module: 2.11.0 + is-core-module: 2.12.0 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 @@ -3092,7 +3195,40 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false + + /eslint-plugin-prettier@4.2.1(eslint@8.38.0)(prettier@2.8.7): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.38.0 + prettier: 2.8.7 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-solid@0.11.0(eslint@8.38.0)(typescript@4.9.5): + resolution: {integrity: sha512-3ve6IpEtl8nOvJnjaJACqlBmv449l6dMMhMczjQWvvLlRqkzLemgsJ9H+Isu8GLSBTNxDIm5oSKx/lO2j8vKbA==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@4.9.5) + eslint: 8.38.0 + is-html: 2.0.0 + jsx-ast-utils: 3.3.3 + kebab-case: 1.0.2 + known-css-properties: 0.24.0 + style-to-object: 0.3.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -3212,6 +3348,10 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -3514,6 +3654,11 @@ packages: /html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + /idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} dev: true @@ -3542,6 +3687,10 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: true + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -3585,8 +3734,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} dependencies: has: 1.0.3 @@ -3615,6 +3764,13 @@ packages: dependencies: is-extglob: 2.1.1 + /is-html@2.0.0: + resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} + engines: {node: '>=8'} + dependencies: + html-tags: 3.3.1 + dev: true + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -3786,7 +3942,6 @@ packages: hasBin: true dependencies: minimist: 1.2.8 - dev: false /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -3805,6 +3960,22 @@ packages: engines: {node: '>=0.10.0'} dev: true + /jsx-ast-utils@3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + object.assign: 4.1.4 + dev: true + + /kebab-case@1.0.2: + resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} + dev: true + + /known-css-properties@0.24.0: + resolution: {integrity: sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==} + dev: true + /kolorist@1.7.0: resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==} @@ -3869,7 +4040,6 @@ packages: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 - dev: true /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} @@ -3938,7 +4108,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -4041,7 +4210,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.21.2 - dev: false /on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} @@ -4218,6 +4386,19 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.2.0 + dev: true + + /prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -4323,6 +4504,9 @@ packages: engines: {node: '>=0.10.0'} dev: true + /resize-detector@0.3.0: + resolution: {integrity: sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==} + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4331,7 +4515,7 @@ packages: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.12.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -4436,8 +4620,8 @@ packages: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + /semver@7.4.0: + resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -4526,14 +4710,14 @@ packages: polka: 1.0.0-next.22 rollup: 3.20.2 sirv: 2.0.2 - solid-start: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.3)(solid-start-node@0.2.26)(vite@4.2.1) + solid-start: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.3)(solid-start-node@0.2.26)(vite@4.2.1)(vue@3.2.47) terser: 5.16.9 undici: 5.21.2 vite: 4.2.1(@types/node@18.15.11) transitivePeerDependencies: - supports-color - /solid-start@0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.3)(solid-start-node@0.2.26)(vite@4.2.1): + /solid-start@0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.3)(solid-start-node@0.2.26)(vite@4.2.1)(vue@3.2.47): resolution: {integrity: sha512-kne2HZlnSMzsirdnvNs1CsDqBl0L0uvKKt1t4de1CH7JIngyqoMcER97jTE0Ejr84KknANaKAdvJAzZcL7Ueng==} hasBin: true peerDependencies: @@ -4600,11 +4784,13 @@ packages: terser: 5.16.9 undici: 5.21.2 vite: 4.2.1(@types/node@18.15.11) - vite-plugin-inspect: 0.7.19(rollup@3.20.2)(vite@4.2.1) + vite-plugin-inspect: 0.7.20(rollup@3.20.2)(vite@4.2.1)(vue@3.2.47) vite-plugin-solid: 2.7.0(solid-js@1.7.3)(vite@4.2.1) wait-on: 6.0.1(debug@4.3.4) transitivePeerDependencies: + - '@vue/composition-api' - supports-color + - vue /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} @@ -4634,7 +4820,6 @@ packages: /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} @@ -4705,7 +4890,6 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: false /strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} @@ -4716,6 +4900,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + /style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + dependencies: + inline-style-parser: 0.1.1 + dev: true + /sucrase@3.32.0: resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} engines: {node: '>=8'} @@ -4859,11 +5049,13 @@ packages: json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} @@ -5020,8 +5212,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite-plugin-inspect@0.7.19(rollup@3.20.2)(vite@4.2.1): - resolution: {integrity: sha512-OdKObJGdzOMR7SuqykN/Rb6rVtMK1wp4EmUTM3xhTCuSR1K/oM7fi4CKeBWhpYSkqop7O4gVB/MOUk7+RO7gIQ==} + /vite-plugin-inspect@0.7.20(rollup@3.20.2)(vite@4.2.1)(vue@3.2.47): + resolution: {integrity: sha512-vpfIAGtkBtpeEWFWUulxmU9tG/EgLMS37te7zzXnoshH+FxcgO7/kUTHaKTF7gOXkMNpHsVX9+BWMMx4iM5dqg==} engines: {node: '>=14'} peerDependencies: vite: ^3.1.0 || ^4.0.0 @@ -5029,14 +5221,18 @@ packages: '@antfu/utils': 0.7.2 '@rollup/pluginutils': 5.0.2(rollup@3.20.2) debug: 4.3.4 + echarts: 5.4.2 fs-extra: 11.1.1 kolorist: 1.7.0 sirv: 2.0.2 ufo: 1.1.1 vite: 4.2.1(@types/node@18.15.11) + vue-echarts: 6.5.4(echarts@5.4.2)(vue@3.2.47) transitivePeerDependencies: + - '@vue/composition-api' - rollup - supports-color + - vue /vite-plugin-pwa@0.14.7(vite@4.2.1)(workbox-build@6.5.4)(workbox-window@6.5.4): resolution: {integrity: sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==} @@ -5126,6 +5322,45 @@ packages: dependencies: vite: 4.2.1(@types/node@18.15.11) + /vue-demi@0.13.11(vue@3.2.47): + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.47 + + /vue-echarts@6.5.4(echarts@5.4.2)(vue@3.2.47): + resolution: {integrity: sha512-pLJTk2hfhauoWdmiZGXByAtcO6bpfnAS+jkJqKimSBSV5I5ckh2nka9duLlIVbTvQOEb2tFa0XiXjACQNcEfpA==} + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.5 + echarts: ^5.4.1 + vue: ^2.6.12 || ^3.1.1 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + echarts: 5.4.2 + resize-detector: 0.3.0 + vue: 3.2.47 + vue-demi: 0.13.11(vue@3.2.47) + + /vue@3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/runtime-dom': 3.2.47 + '@vue/server-renderer': 3.2.47(vue@3.2.47) + '@vue/shared': 3.2.47 + /wait-on@6.0.1(debug@4.3.4): resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} engines: {node: '>=10.0.0'} @@ -5406,3 +5641,8 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + + /zrender@5.4.3: + resolution: {integrity: sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==} + dependencies: + tslib: 2.3.0 diff --git a/src/components/App.tsx b/src/components/App.tsx index 563f673..5dc0c90 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1,6 +1,6 @@ import logo from '~/assets/icons/mutiny-logo.svg'; +import { SafeArea } from "~/components/layout"; import BalanceBox from "~/components/BalanceBox"; -import SafeArea from "~/components/SafeArea"; import NavBar from "~/components/NavBar"; // TODO: use this reload prompt for real diff --git a/src/components/BalanceBox.tsx b/src/components/BalanceBox.tsx index 1bb6435..9e23535 100644 --- a/src/components/BalanceBox.tsx +++ b/src/components/BalanceBox.tsx @@ -1,7 +1,7 @@ import { Motion, Presence } from "@motionone/solid"; import { createResource, Show, Suspense } from "solid-js"; -import { ButtonLink } from "~/components/Button"; +import { ButtonLink } from "~/components/layout"; import { useMegaStore } from "~/state/megaStore"; function prettyPrintAmount(n?: number | bigint): string { diff --git a/src/components/Card.tsx b/src/components/Card.tsx deleted file mode 100644 index 557f2e7..0000000 --- a/src/components/Card.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { ParentComponent } from "solid-js" - -const Card: ParentComponent<{ title?: string }> = (props) => { - return ( -
- {props.title &&
{props.title}
} - {props.children} -
- - ) -} - -export default Card \ No newline at end of file diff --git a/src/components/KitchenSink.tsx b/src/components/KitchenSink.tsx index bb4ddb5..e9ab0cc 100644 --- a/src/components/KitchenSink.tsx +++ b/src/components/KitchenSink.tsx @@ -1,21 +1,198 @@ import { useMegaStore } from "~/state/megaStore"; -import { ButtonLink } from "./Button"; -import Card from "./Card"; -import PeerConnectModal from "./PeerConnectModal"; -import { createResource } from "solid-js"; +import { ButtonLink, Card, Hr, SmallHeader, Button } from "~/components/layout"; +import PeerConnectModal from "~/components/PeerConnectModal"; +import { For, Show, Suspense, createResource, createSignal } from "solid-js"; +import { MutinyChannel, MutinyPeer } from "@mutinywallet/node-manager"; +import { TextField } from "@kobalte/core"; +import mempoolTxUrl from "~/utils/mempoolTxUrl"; +import eify from "~/utils/eify"; + +function PeersList() { + const [state, _] = useMegaStore() + + const getPeers = async () => { + return await state.node_manager?.list_peers() as Promise + }; + + const [peers, { refetch }] = createResource(getPeers); + + return ( + <> + + Peers + + {/* By wrapping this in a suspense I don't cause the page to jump to the top */} + + No peers}> + {(peer) => ( +
+                            {JSON.stringify(peer, null, 2)}
+                        
+ )} +
+
+ + + + ) +} + +function ConnectPeer(props: { refetchPeers: () => any }) { + const [state, _] = useMegaStore() + + const [value, setValue] = createSignal(""); + + const onSubmit = async (e: SubmitEvent) => { + e.preventDefault(); + + const peerConnectString = value().trim(); + const nodes = await state.node_manager?.list_nodes(); + const firstNode = nodes[0] as string || "" + + await state.node_manager?.connect_to_peer(firstNode, peerConnectString) + + await props.refetchPeers() + + setValue(""); + }; + + return ( +
+ + Connect Peer + + Expecting something like mutiny:abc123... + + +
+ ) +} + +function ChannelsList() { + const [state, _] = useMegaStore() + + const getChannels = async () => { + return await state.node_manager?.list_channels() as Promise + }; + + const [channels, { refetch }] = createResource(getChannels); + + const network = state.node_manager?.get_network(); + + return ( + <> + + Channels + + {/* By wrapping this in a suspense I don't cause the page to jump to the top */} + + No channels}> + {(channel) => ( + <> +
+                                {JSON.stringify(channel, null, 2)}
+                            
+ + Mempool Link + + + )} + +
+
+ + + + ) +} + +function OpenChannel(props: { refetchChannels: () => any }) { + const [state, _] = useMegaStore() + + const [creationError, setCreationError] = createSignal(); + + const [amount, setAmount] = createSignal(""); + const [peerPubkey, setPeerPubkey] = createSignal(""); + + const [newChannel, setNewChannel] = createSignal(); + + const onSubmit = async (e: SubmitEvent) => { + e.preventDefault(); + + // TODO: figure out why this doesn't catch the rust error + // src/logging.rs:29 + // ERROR: Could not create a signed transaction to open channel with: The invoice or address is on a different network. + try { + const pubkey = peerPubkey().trim(); + const bigAmount = BigInt(amount()); + + const nodes = await state.node_manager?.list_nodes(); + const firstNode = nodes[0] as string || "" + + const new_channel = await state.node_manager?.open_channel(firstNode, pubkey, bigAmount) + + setNewChannel(new_channel) + + await props.refetchChannels() + + setAmount(""); + setPeerPubkey(""); + + } catch (e) { + setCreationError(eify(e)) + } + }; + + return ( + <> +
+ + Pubkey + + + + Amount + + + +
+ +
+                    {JSON.stringify(newChannel()?.outpoint, null, 2)}
+                
+
{newChannel()?.outpoint}
+ + Mempool Link + +
+ +
{creationError()?.message}
+
+ + ) +} export default function KitchenSink() { const [state, _] = useMegaStore() // TODO: would be nice if this was just newest unused address const getNewAddress = async () => { - if (state.node_manager) { - console.log("Getting new address"); - const address = await state.node_manager?.get_new_address(); - return address - } else { - return undefined - } + return await state.node_manager?.get_new_address(); }; const [address] = createResource(getNewAddress); @@ -24,6 +201,10 @@ export default function KitchenSink() { Tap the Faucet +
+ +
+
) } \ No newline at end of file diff --git a/src/components/PeerConnectModal.tsx b/src/components/PeerConnectModal.tsx index bce2a72..29b9dbb 100644 --- a/src/components/PeerConnectModal.tsx +++ b/src/components/PeerConnectModal.tsx @@ -1,7 +1,6 @@ import { QRCodeSVG } from "solid-qr-code"; -import Card from "~/components/Card"; import { As, Dialog } from "@kobalte/core"; -import { Button } from "~/components/Button"; +import { Button, Card } from "~/components/layout"; import { useMegaStore } from "~/state/megaStore"; import { Show, createResource } from "solid-js"; import { getExistingSettings } from "~/logic/nodeManagerSetup"; @@ -12,7 +11,7 @@ const DIALOG_POSITIONER = "fixed inset-0 z-50 flex items-center justify-center" const DIALOG_CONTENT = "w-[80vw] max-w-[400px] p-4 bg-gray/50 backdrop-blur-md shadow-xl rounded-xl border border-white/10" const SMALL_HEADER = "text-sm font-semibold uppercase" -export default function PeerConnectModalKobalte() { +export default function PeerConnectModal() { const [state, _] = useMegaStore() const getPeerConnectString = async () => { diff --git a/src/components/Reader.tsx b/src/components/Reader.tsx index 8caa7e5..8a88028 100644 --- a/src/components/Reader.tsx +++ b/src/components/Reader.tsx @@ -1,7 +1,7 @@ import QrScanner from 'qr-scanner'; import { createSignal, onCleanup, onMount } from 'solid-js'; -export default function Scanner({ onResult }: { onResult: (result: string) => void }) { +export default function Scanner(props: { onResult: (result: string) => void }) { let container: HTMLVideoElement | null; // TODO: not sure it's appropriate to use a signal for this but it works! @@ -12,7 +12,7 @@ export default function Scanner({ onResult }: { onResult: (result: string) => vo const newScanner = new QrScanner( container, (result: { data: string }) => { - onResult(result.data); + props.onResult(result.data); }, { returnDetailedScanResult: true, diff --git a/src/components/Reload.tsx b/src/components/Reload.tsx index 0b2de17..73c4a6b 100644 --- a/src/components/Reload.tsx +++ b/src/components/Reload.tsx @@ -1,8 +1,7 @@ import type { Component } from 'solid-js' import { Show } from 'solid-js' import { useRegisterSW } from 'virtual:pwa-register/solid' -import Card from './Card' -import { Button } from './Button' +import { Button, Card } from '~/components/layout' const ReloadPrompt: Component = () => { const { diff --git a/src/components/SafeArea.tsx b/src/components/SafeArea.tsx deleted file mode 100644 index 64832d0..0000000 --- a/src/components/SafeArea.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { JSX } from "solid-js"; - -export default function SafeArea(props: { children: JSX.Element }) { - return ( -
-
- {props.children} -
-
- ) -} \ No newline at end of file diff --git a/src/components/Button.tsx b/src/components/layout/Button.tsx similarity index 97% rename from src/components/Button.tsx rename to src/components/layout/Button.tsx index 9c71b55..fb1a8d9 100644 --- a/src/components/Button.tsx +++ b/src/components/layout/Button.tsx @@ -14,7 +14,8 @@ const button = cva(["p-4", "rounded-xl", "text-xl", "font-semibold"], { }, layout: { flex: "flex-1", - pad: "px-8" + pad: "px-8", + small: "p-1 w-auto", }, }, diff --git a/src/components/Linkify.tsx b/src/components/layout/Linkify.tsx similarity index 75% rename from src/components/Linkify.tsx rename to src/components/layout/Linkify.tsx index 529ece4..86d49d7 100644 --- a/src/components/Linkify.tsx +++ b/src/components/layout/Linkify.tsx @@ -4,19 +4,17 @@ interface LinkifyProps { text: string; } -// chat gpt wrote this lol export default function Linkify(props: LinkifyProps): JSX.Element { - const { text } = props; const links: (string | JSX.Element)[] = []; const pattern = /((https?:\/\/|www\.)\S+)/gi; let lastIndex = 0; let match; - while ((match = pattern.exec(text)) !== null) { + while ((match = pattern.exec(props.text)) !== null) { const link = match[1]; const href = link.startsWith('http') ? link : `https://${link}`; - const beforeLink = text.slice(lastIndex, match.index); + const beforeLink = props.text.slice(lastIndex, match.index); lastIndex = pattern.lastIndex; if (beforeLink) { @@ -26,7 +24,7 @@ export default function Linkify(props: LinkifyProps): JSX.Element { links.push({link}); } - const remainingText = text.slice(lastIndex); + const remainingText = props.text.slice(lastIndex); if (remainingText) { links.push(remainingText); } diff --git a/src/components/LoadingSpinner.tsx b/src/components/layout/index.tsx similarity index 56% rename from src/components/LoadingSpinner.tsx rename to src/components/layout/index.tsx index 04280ae..b6644d4 100644 --- a/src/components/LoadingSpinner.tsx +++ b/src/components/layout/index.tsx @@ -1,4 +1,31 @@ -export default function LoadingSpinner() { +import { ParentComponent } from "solid-js" +import Linkify from "./Linkify" +import { Button, ButtonLink } from "./Button" +import { Separator } from "@kobalte/core" + +const SmallHeader: ParentComponent = (props) =>
{props.children}
+ +const Card: ParentComponent<{ title?: string }> = (props) => { + return ( +
+ {props.title && {props.title}} + {props.children} +
+ + ) +} + +const SafeArea: ParentComponent = (props) => { + return ( +
+
+ {props.children} +
+
+ ) +} + +const LoadingSpinner = () => { return (
Loading...
); -} \ No newline at end of file +} + +const Hr = () => + +export { SmallHeader, Card, SafeArea, LoadingSpinner, Button, ButtonLink, Linkify, Hr } diff --git a/src/components/waitlist/Notes.tsx b/src/components/waitlist/Notes.tsx index 074747b..ead8f95 100644 --- a/src/components/waitlist/Notes.tsx +++ b/src/components/waitlist/Notes.tsx @@ -1,7 +1,7 @@ import { Component, For } from "solid-js"; import { Event, nip19 } from "nostr-tools" -import Linkify from "~/components/Linkify"; +import { Linkify } from "~/components/layout"; type NostrEvent = { "content": string, "created_at": number, id?: string diff --git a/src/components/waitlist/WaitlistAlreadyIn.tsx b/src/components/waitlist/WaitlistAlreadyIn.tsx index 7bd2441..149b30c 100644 --- a/src/components/waitlist/WaitlistAlreadyIn.tsx +++ b/src/components/waitlist/WaitlistAlreadyIn.tsx @@ -10,7 +10,7 @@ const relayUrls = [ ] import { SimplePool } from 'nostr-tools' -import LoadingSpinner from "~/components/LoadingSpinner"; +import { LoadingSpinner } from "~/components/layout"; import Notes from "~/components/waitlist/Notes"; const pool = new SimplePool() diff --git a/src/components/waitlist/WaitlistForm.tsx b/src/components/waitlist/WaitlistForm.tsx index b31b085..d2dc508 100644 --- a/src/components/waitlist/WaitlistForm.tsx +++ b/src/components/waitlist/WaitlistForm.tsx @@ -1,6 +1,5 @@ import { createSignal } from "solid-js"; -import { Button } from "~/components/Button"; -import LoadingSpinner from "../LoadingSpinner"; +import { Button, LoadingSpinner } from "~/components/layout"; const INPUT = "w-full mb-4 p-2 rounded-lg text-black" diff --git a/src/routes/Receive.tsx b/src/routes/Receive.tsx index fb49d3a..f1bc189 100644 --- a/src/routes/Receive.tsx +++ b/src/routes/Receive.tsx @@ -1,8 +1,7 @@ import { createResource, Show } from "solid-js"; import { QRCodeSVG } from "solid-qr-code"; -import { Button } from "~/components/Button"; +import { Button, SafeArea } from "~/components/layout"; import NavBar from "~/components/NavBar"; -import SafeArea from "~/components/SafeArea"; import { useMegaStore } from "~/state/megaStore"; import { useCopy } from "~/utils/useCopy"; diff --git a/src/routes/Scanner.tsx b/src/routes/Scanner.tsx index f607702..3cab949 100644 --- a/src/routes/Scanner.tsx +++ b/src/routes/Scanner.tsx @@ -1,7 +1,7 @@ import Reader from "~/components/Reader"; import { createSignal, Show } from "solid-js"; import { useNavigate } from "solid-start"; -import { Button } from "~/components/Button"; +import { Button } from "~/components/layout"; export default function Scanner() { const [scanResult, setScanResult] = createSignal(null); @@ -27,7 +27,7 @@ export default function Scanner() { -
+
diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index dc1e065..5824e99 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -1,7 +1,6 @@ import { useNavigate } from "solid-start"; -import { Button } from "~/components/Button"; +import { Button, SafeArea } from "~/components/layout"; import NavBar from "~/components/NavBar"; -import SafeArea from "~/components/SafeArea"; import { useMegaStore } from "~/state/megaStore"; export default function Settings() { diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 8b84b33..7a405fe 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -4,7 +4,7 @@ import { Switch, Match } from "solid-js"; import { WaitlistAlreadyIn } from "~/components/waitlist/WaitlistAlreadyIn"; import WaitlistForm from "~/components/waitlist/WaitlistForm"; import { useMegaStore } from "~/state/megaStore"; -import LoadingSpinner from "~/components/LoadingSpinner"; +import { LoadingSpinner } from "~/components/layout"; function FullscreenLoader() { return ( diff --git a/src/state/megaStore.tsx b/src/state/megaStore.tsx index 199f71d..46893e4 100644 --- a/src/state/megaStore.tsx +++ b/src/state/megaStore.tsx @@ -63,16 +63,17 @@ export const Provider: ParentComponent = (props) => { }; // Fetch status from remote on load - createEffect(async () => { - const status = await actions.status() - setState({ user_status: status }) + createEffect(() => { + actions.status().then(status => { + setState({ user_status: status }) + }) }) // Only node manager when status is approved - createEffect(async () => { + createEffect(() => { if (state.user_status === "approved" && !state.node_manager) { console.log("running setup node manager...") - await actions.setupNodeManager() + actions.setupNodeManager().then(() => console.log("node manager setup done")) } }) diff --git a/src/utils/eify.ts b/src/utils/eify.ts new file mode 100644 index 0000000..c16f147 --- /dev/null +++ b/src/utils/eify.ts @@ -0,0 +1,10 @@ +/// Sometimes we catch an error as `unknown` so this turns it into an Error. +export default function eify(e: unknown): Error { + if (e instanceof Error) { + return e; + } else if (typeof e === 'string') { + return new Error(e); + } else { + return new Error('Unknown error'); + } +} \ No newline at end of file diff --git a/src/utils/mempoolTxUrl.ts b/src/utils/mempoolTxUrl.ts new file mode 100644 index 0000000..c2f9a53 --- /dev/null +++ b/src/utils/mempoolTxUrl.ts @@ -0,0 +1,21 @@ +export default function mempoolTxUrl(txid?: string, network?: string) { + if (!txid || !network) { + console.error("Problem creating the mempool url") + return "#" + } + + if (network) { + switch (network) { + case "mainnet": + return `https://mempool.space/tx/${txid}` + case "testnet": + return `https://mempool.space/testnet/tx/${txid}` + case "signet": + return `https://mutinynet.com/tx/${txid}` + default: + return `https://mempool.space/tx/${txid}` + } + } + + return `https://mempool.space/tx/${txid}` +} \ No newline at end of file