From dff1e1f9a621bab14b9ea3da139eec83cdedb253 Mon Sep 17 00:00:00 2001 From: lonelyhentxi Date: Sat, 1 Mar 2025 23:22:02 +0800 Subject: [PATCH] feat: add solid-js support --- examples/react-tanstack-router/src/index.tsx | 2 +- package.json | 36 +- pnpm-lock.yaml | 399 ++++++++++++++++-- rslib.config.ts | 6 +- .../index.ts => @tanstack/react-router.ts} | 0 src/adapters/@tanstack/solid-router.ts | 41 ++ src/adapters/react/index.ts | 2 +- src/adapters/solid-js/index.ts | 44 ++ src/{features.ts => features/core.ts} | 14 +- src/features/index.ts | 8 + src/features/with-check-auth-result-event.ts | 45 ++ 11 files changed, 533 insertions(+), 64 deletions(-) rename src/adapters/{tanstack-router/index.ts => @tanstack/react-router.ts} (100%) create mode 100644 src/adapters/@tanstack/solid-router.ts create mode 100644 src/adapters/solid-js/index.ts rename src/{features.ts => features/core.ts} (87%) create mode 100644 src/features/index.ts create mode 100644 src/features/with-check-auth-result-event.ts diff --git a/examples/react-tanstack-router/src/index.tsx b/examples/react-tanstack-router/src/index.tsx index e5213ab..eb4df73 100644 --- a/examples/react-tanstack-router/src/index.tsx +++ b/examples/react-tanstack-router/src/index.tsx @@ -7,11 +7,11 @@ import { provideAuth, withDefaultFeatures, } from 'oidc-client-rx'; +import { withTanstackRouter } from 'oidc-client-rx/adapters/@tanstack/react-router'; import { InjectorContextVoidInjector, InjectorProvider, } from 'oidc-client-rx/adapters/react'; -import { withTanstackRouter } from 'oidc-client-rx/adapters/tanstack-router'; import React from 'react'; import ReactDOM from 'react-dom/client'; import { routeTree } from './routeTree.gen'; diff --git a/package.json b/package.json index 5de6711..3e4f9a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oidc-client-rx", - "version": "0.1.0-alpha.6", + "version": "0.1.0-alpha.7", "homepage": "https://github.com/lonelyhentxi/oidc-client-rx", "author": "lonelyhentxi", "description": "ReactiveX enhanced OIDC and OAuth2 protocol support for browser-based JavaScript applications", @@ -23,10 +23,20 @@ "import": "./dist/adapters/react/index.js", "require": "./dist/adapters/react.cjs" }, - "./adapters/tanstack-router": { - "types": "./dist/adapters/tanstack-router/index.d.ts", - "import": "./dist/adapters/tanstack-router/index.js", - "require": "./dist/adapters/tanstack-router.cjs" + "./adapters/solid-js": { + "types": "./dist/adapters/solid-js/index.d.ts", + "import": "./dist/adapters/solid-js/index.js", + "require": "./dist/adapters/solid-js.cjs" + }, + "./adapters/@tanstack/react-router": { + "types": "./dist/adapters/@tanstack/react-router.d.ts", + "import": "./dist/adapters/@tanstack/react-router.js", + "require": "./dist/adapters/@tanstack/react-router.cjs" + }, + "./adapters/@tanstack/solid-router": { + "types": "./dist/adapters/@tanstack/solid-router.d.ts", + "import": "./dist/adapters/@tanstack/solid-router.js", + "require": "./dist/adapters/@tanstack/solid-router.cjs" } }, "main": "./dist/index.cjs", @@ -50,8 +60,10 @@ }, "peerDependencies": { "@tanstack/react-router": "*", + "@tanstack/solid-router": "*", "react": ">=16.8.0", - "rxjs": "^7.4.0||>=8.0.0" + "rxjs": "^7.4.0||>=8.0.0", + "solid-js": "^1" }, "devDependencies": { "@biomejs/biome": "1.9.4", @@ -60,7 +72,8 @@ "@playwright/test": "^1.49.1", "@rslib/core": "^0.5.0", "@swc/core": "^1.10.12", - "@tanstack/react-router": "^1.99.6", + "@tanstack/react-router": "^1.112.11", + "@tanstack/solid-router": "^1.112.11", "@types/lodash-es": "^4.17.12", "@types/node": "^22.12.0", "@types/react": "^19.0.8", @@ -68,12 +81,13 @@ "commander": "^13.1.0", "happy-dom": "^17.1.0", "lodash-es": "^4.17.21", - "oxc-parser": "^0.48.1", + "oxc-parser": "^0.54.0", "oxc-walker": "^0.2.2", "playwright": "^1.50.0", "react": "^19.0.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.4.0", + "solid-js": "^1.9.5", "tsx": "^4.19.2", "typescript": "^5.7.3", "ultracite": "^4.1.15", @@ -87,6 +101,12 @@ }, "@tanstack/react-router": { "optional": true + }, + "@tanstack/solid-router": { + "optional": true + }, + "solid-js": { + "optional": true } }, "keywords": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 878abd2..35aad5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,8 +37,11 @@ importers: specifier: ^1.10.12 version: 1.10.12(@swc/helpers@0.5.15) '@tanstack/react-router': - specifier: ^1.99.6 - version: 1.99.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^1.112.11 + version: 1.112.11(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/solid-router': + specifier: ^1.112.11 + version: 1.112.11(solid-js@1.9.5) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 @@ -61,11 +64,11 @@ importers: specifier: ^4.17.21 version: 4.17.21 oxc-parser: - specifier: ^0.48.1 - version: 0.48.1 + specifier: ^0.54.0 + version: 0.54.0 oxc-walker: specifier: ^0.2.2 - version: 0.2.2(oxc-parser@0.48.1) + version: 0.2.2(oxc-parser@0.54.0) playwright: specifier: ^1.50.0 version: 1.50.0 @@ -78,6 +81,9 @@ importers: rxjs: specifier: ^7.4.0 version: 7.8.1 + solid-js: + specifier: ^1.9.5 + version: 1.9.5 tsx: specifier: ^4.19.2 version: 4.19.2 @@ -821,6 +827,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nothing-but/utils@0.17.0': + resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -833,48 +842,48 @@ packages: '@outposts/injection-js@2.5.1': resolution: {integrity: sha512-f2HCfEM9k7WqLw5Bs2Sh2rWrwuuQFE3c5yKueQfO4WAnJBvlC6tU0JWSG1j8A7NsEfcdUtMVmIzGIRIHo7ALPw==} - '@oxc-parser/binding-darwin-arm64@0.48.1': - resolution: {integrity: sha512-qCpCWt+8B1c76KndRgTQmCswsd1Nx+7/8Rm/JCee+tSB+emW/EcJEP5cIHvnUAueqlF0ZUuQ9LQWdPNN2n5SiQ==} + '@oxc-parser/binding-darwin-arm64@0.54.0': + resolution: {integrity: sha512-LiNsE4YZ7UUCvkRvqKSr0ubWvOAyqeCKbqzhBQ4Dvj3EpkORX+MLj8c6/LcFWHtulNS066DvvB9nmd4FkMGeDQ==} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.48.1': - resolution: {integrity: sha512-Uf2IYgKizJEiUoDi3u6NrQTH6WvNFj0XS3g1KC3/rXdM/UQghTo4dhe1oll/NdrQ5i/EuY0qRwdOxPdxHr50pQ==} + '@oxc-parser/binding-darwin-x64@0.54.0': + resolution: {integrity: sha512-sMoLDWK636eNkhxxu8Zfpgh1m64B68hU+D3qPOopzO9sMri2Xd+/Qy4AIe2CiQMTLf6Sb4+jTeqYqRrR8cgsPg==} cpu: [x64] os: [darwin] - '@oxc-parser/binding-linux-arm64-gnu@0.48.1': - resolution: {integrity: sha512-5rxOgUkXpp3q988y86HMTk8+Jw8AdILpHzS3MPTptGySXrv/7g41Xp+KVwLzd8FQpu0fMCy9VAzcBMwCe+aojg==} + '@oxc-parser/binding-linux-arm64-gnu@0.54.0': + resolution: {integrity: sha512-TgnttTu46sdbMTDiObIX21okp58qiGaLk/qAPj8NorQHfBKnK9BWaCb0PBfDxeYozRDW4vppPPq4GXQlzhyQ9w==} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-arm64-musl@0.48.1': - resolution: {integrity: sha512-NqVaud/N3jOJiwt7afrXG+b6guqglPuTIvuQnhmokq0i8q0fQUgmg0/ZdNI5bu941wijmCC+eCg52H5jD1iaHA==} + '@oxc-parser/binding-linux-arm64-musl@0.54.0': + resolution: {integrity: sha512-4J1Uc6vCbWp62fU7XbwPM93QwM/5ZTldbY/iXzyn/qX3+I6QYA2YaFgssO+zelYM0Bdaqpgeq8jeTAyN3HsLpw==} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-x64-gnu@0.48.1': - resolution: {integrity: sha512-x+THqLaXVwgi6+YxNz9KmxdfIed89UNr1Ez1IsOew/Rg57RcX9XP4rT9fcjAZ9GM3krszkYAVq2KxP471Dgv8g==} + '@oxc-parser/binding-linux-x64-gnu@0.54.0': + resolution: {integrity: sha512-qG5fxcIVIpQefZ71fTPetlr5FQ+MVKsDvC1Ozgy66apNKeWdjV8Aqx1k1yaZiTsENThhxP6zAOTOek398vsBSw==} cpu: [x64] os: [linux] - '@oxc-parser/binding-linux-x64-musl@0.48.1': - resolution: {integrity: sha512-m6XDdH6kEQsM3DAOK+jIN9hMAM9bHPQfdw0Ldbg6W1M9S8vvAvz0nQHkLF2ChBBV1HkTjLolK40sR0W6BGCYww==} + '@oxc-parser/binding-linux-x64-musl@0.54.0': + resolution: {integrity: sha512-dcS2iP7hyF2AO6h3UAcC1OemKpElbiZdNW+88dP8fw5KArMWGH/GRNk2r/kBGq2YCETdP8ROlnUXMqGMaY3NEA==} cpu: [x64] os: [linux] - '@oxc-parser/binding-win32-arm64-msvc@0.48.1': - resolution: {integrity: sha512-Zxfnuea6THWQiGmnLyJXlpi3bmN0lcWf7QYLVr71ZaTs9S14eOFwHuH2efZ7zcto+a8osysQT9xMDvdIkiqGZA==} + '@oxc-parser/binding-win32-arm64-msvc@0.54.0': + resolution: {integrity: sha512-YiSM4tZYDGVgT3VXFlzZ86NCgp46BdLjCe85Pq/jfPXGFFSA0EU0Xg94jY8F+6w0BO/NjWJ1mEJwjhUzlWRq3Q==} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.48.1': - resolution: {integrity: sha512-klialzt6wZOzGl2W+tAKPJAGu0vO3iqPGd13+ZY+VCC2xM+EA5/mYuv+NEK1WDFSxlmz/898Puhqk4teCbxZug==} + '@oxc-parser/binding-win32-x64-msvc@0.54.0': + resolution: {integrity: sha512-NqsfN0pCJcB94bHzZtPzyKkeeGKo6U6Qj//lAE88XaZxVMlw58sz77wHIhIo0p9/KuKiMcD5VO2AIGG56AsJfg==} cpu: [x64] os: [win32] - '@oxc-project/types@0.48.1': - resolution: {integrity: sha512-/CoLnZmEI+FmpMvF8vOdVpQddt9Me+paM3c56m5jMZ7EMaU1TQFCrNH0JZr1Cwn4wKb/ALY32HPaCtA8dvgkrw==} + '@oxc-project/types@0.54.0': + resolution: {integrity: sha512-Tf0TGE96lQglNMyGKpIxSz7RmPtf410FY93QAD03XN40Rutpq4UsVePYQ9Nia8xb/YYLX9IskhJ7DK8rkcAabQ==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -1182,6 +1191,96 @@ packages: '@rushstack/ts-command-line@4.23.4': resolution: {integrity: sha512-pqmzDJCm0TS8VyeqnzcJ7ncwXgiLDQ6LVmXXfqv2nPL6VIz+UpyTpNVfZRJpyyJ+UDxqob1vIj2liaUfBjv8/A==} + '@solid-devtools/debugger@0.26.0': + resolution: {integrity: sha512-36QxZ+s/lY60E+Pb9q0eTsdqgaog4c823WIj5dC2LFdGrGXbVGBQEj6k7CgvMnEETdwndrd0Fm72fQyYPlZrVA==} + peerDependencies: + solid-js: ^1.9.0 + + '@solid-devtools/logger@0.9.7': + resolution: {integrity: sha512-JHZ0ejkQnRoMcV8bgqogSYFlYdo0wJ1S/vAHEROSHQk1jNtErTXJwLrCXdR+LNuBWhJJ0aq/y7Pjit/ssvKrDw==} + peerDependencies: + solid-js: ^1.9.0 + + '@solid-devtools/shared@0.19.0': + resolution: {integrity: sha512-OGo6l84f9X5YEAqSEM4Xl94+xKXSqmACMzKWsAqO0BStLBMVL0vIVu286AQk5XkNxn11/EB9wrdkZc9GUzKlxA==} + peerDependencies: + solid-js: ^1.9.0 + + '@solid-primitives/bounds@0.0.122': + resolution: {integrity: sha512-kUq/IprOdFr/rg2upon5lQGOoTnDAmxQS4ASKK2l+VwoKSctdPwgu/4qJxEITZikL+nB0myYZzBZWptySV0cRg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/cursor@0.0.115': + resolution: {integrity: sha512-8nEmUN/sacXPChwuJOAi6Yi6VnxthW/Jk8VGvvcF38AenjUvOA6FHI6AkJILuFXjQw1PGxia1YbH/Mn77dPiOA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/event-listener@2.4.0': + resolution: {integrity: sha512-TSfR1PNTfojFEYGSxSMCnUhXsaYWBo4p+cm73QmWODa9YnaQAk6PB7VjzG2bOT2D817VlvuOqTj0Qdq+MZrdGg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/keyboard@1.3.0': + resolution: {integrity: sha512-0QX9O3eUaQorNNmXZn8a4efSByayIScVq+iGSwheD7m3SL/ACLM5oZlCNpTPLcemnVVfUPAHFiViEj86XpN5qw==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/media@2.3.0': + resolution: {integrity: sha512-7+C3wfbWnGE/WPoNsqcp/EeOP2aNNB92RCpsWhBth8E5lZo/J+rK6jMb7umVsK0zguT8HBpeXp1pFyFbcsHStA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/platform@0.1.2': + resolution: {integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/refs@1.1.0': + resolution: {integrity: sha512-QJ3bTSQOlPdHBP2m6llrT13FvVzAwZfx41lTN8lQrRwwcZoWb7kfCAjhaohPnwkAsQ6nJpLjtGfT5GOyuCA4tA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/resize-observer@2.1.0': + resolution: {integrity: sha512-tO9MDAc2pNjpcRd5B8LWbiR1qzIgvGZ5BtTuO98N7CLwd+fnuyGwtlQtJpz5hcLcTnoawpQYLpiRGNgaYW+YzQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/rootless@1.5.0': + resolution: {integrity: sha512-YJ+EveQeDv9DLqfDKfsPAAGy2x3vBruoD23yn+nD2dT84QjoBxWT1T0qA0TMFjek6/xuN3flqnHtQ4r++4zdjg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/scheduled@1.5.0': + resolution: {integrity: sha512-RVw24IRNh1FQ4DCMb3OahB70tXIwc5vH8nhR4nNPsXwUPQeuOkLsDI5BlxaPk0vyZgqw9lDpufgI3HnPwplgDw==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/static-store@0.0.8': + resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/static-store@0.1.0': + resolution: {integrity: sha512-6Coau0Kv/dF83UQpbBzc+gnJafOQAPe2jCbB4jmTK5UocsR5cWmFBVRm3kin+nZFVaO4WkuELw0cKANWgTVh8Q==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/styles@0.0.114': + resolution: {integrity: sha512-SFXr16mgr6LvZAIj6L7i59HHg+prAmIF8VP/U3C6jSHz68Eh1G71vaWr9vlJVpy/j6bh1N8QUzu5CgtvIC92OQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/utils@6.3.0': + resolution: {integrity: sha512-e7hTlJ1Ywh2+g/Qug+n4L1mpfxsikoIS4/sHE2EK9WatQt8UJqop/vE6bsLnXlU1xuhb/jo94Ah5Y27rd4wP7A==} + peerDependencies: + solid-js: ^1.6.12 + + '@solidjs/meta@0.29.4': + resolution: {integrity: sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g==} + peerDependencies: + solid-js: '>=1.8.4' + '@swc/core-darwin-arm64@1.10.12': resolution: {integrity: sha512-pOANQegUTAriW7jq3SSMZGM5l89yLVMs48R0F2UG6UZsH04SiViCnDctOGlA/Sa++25C+rL9MGMYM1jDLylBbg==} engines: {node: '>=10'} @@ -1260,10 +1359,21 @@ packages: '@swc/types@0.1.17': resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + '@tanstack/history@1.112.8': + resolution: {integrity: sha512-+EPOvUtnA3PnIBF2oUhggdy7UrVimLZd1SpULhV1UiesNgKtmLjArO7ZdGPrRq7pRXhc8V0ZAWTI9vfplhZfeA==} + engines: {node: '>=12'} + '@tanstack/history@1.99.0': resolution: {integrity: sha512-MQS1Lg8D+1vpasEJKf4zs1sxhxbXcoejmVCZDbo0bq2wq+xVK+kRixj5Pae2kb2APzdXYga4u236GBbgCKTcnQ==} engines: {node: '>=12'} + '@tanstack/react-router@1.112.11': + resolution: {integrity: sha512-UfCaLOL8uMn1uhuk8NCUQ4xYoyFdDLSGrP4BdemYeOsgDuTCIGfZeN9e+fk0CCgsXCCVIweeBsarvkVP8KofGA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + '@tanstack/react-router@1.99.6': resolution: {integrity: sha512-mH4wkW2h4uILKsCB4qxJWZ8LtVlxvDzZXnXmb5FuAigdTN2qsQhgpxM1bxecII1cDQMjqq8bZvqYw/62MZ5elg==} engines: {node: '>=12'} @@ -1277,6 +1387,10 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/router-core@1.112.8': + resolution: {integrity: sha512-IaCWqePzsUQWMAhtQObnM4dmFSxUEzH94jAjBiMGD/FfwMjojFNOzuLe4HG1rGCAbF2M9Q1HjdzHzG0BptjDsQ==} + engines: {node: '>=12'} + '@tanstack/router-core@1.99.6': resolution: {integrity: sha512-tEfMLeONfyoyI1e/ygUeGFtTWeWQu0GR3OT8OR75EOeNXRmUEtI6H4ThrXcV8nwBd6B88wmp9LhSPLl9H2VwSA==} engines: {node: '>=12'} @@ -1320,6 +1434,17 @@ packages: resolution: {integrity: sha512-weYNg+aqXX1aZkcD7nOkjymtJiLgyp5A1Gtg6Ey0ttIaAlL3NuLlwX9z0CCnCLb3AGxGL4OgdZ2xVbH/DVaURQ==} engines: {node: '>=12'} + '@tanstack/solid-router@1.112.11': + resolution: {integrity: sha512-de2B3bWeXO3SZ8uG6w74HWHaZpO3vRoSIizXc797pmMzGlkUFaxYeGidBXjnm/SnuEFr7VxKFHiEqCD92t2Uew==} + engines: {node: '>=12'} + peerDependencies: + solid-js: ^1.9.5 + + '@tanstack/solid-store@0.7.0': + resolution: {integrity: sha512-uDQYkUuH3MppitiduZLTEcItkTr8vEJ33jzp2rH2VvlNRMGbuU54GQcqf3dLIlTbZ1/Z2TtIBtBjjl+N/OhwRg==} + peerDependencies: + solid-js: ^1.6.0 + '@tanstack/store@0.7.0': resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} @@ -2541,8 +2666,8 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - oxc-parser@0.48.1: - resolution: {integrity: sha512-06Y1yBSlUP5j7wdcyLdjXUe3kBw1QYu7E4vowi59IcwZ7jc/iUCMXxqnSoJLdqex3fZAjCnuzW7/gPi3h5bumA==} + oxc-parser@0.54.0: + resolution: {integrity: sha512-nYqnBdqWL/yOJayDoSe8a/twaaersgXKOwypR9XuSf6gbzsI+aGDm8gg9vn1p+GcRN8P+Z3erTHjUdAvuUhfHQ==} oxc-walker@0.2.2: resolution: {integrity: sha512-beQrIxhRrJigGgct4HJ2UtZv8HHA5553rAhD5rydHPPfLHnVzxEHNRiop8VU3zmhL6COMq4XxLVHnTMXiwNGxQ==} @@ -2868,6 +2993,16 @@ packages: resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} engines: {node: '>=14.16'} + seroval-plugins@1.2.1: + resolution: {integrity: sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.2.1: + resolution: {integrity: sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==} + engines: {node: '>=10'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -2902,6 +3037,9 @@ packages: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solid-js@1.9.5: + resolution: {integrity: sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -3983,6 +4121,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 + '@nothing-but/utils@0.17.0': {} + '@open-draft/deferred-promise@2.2.0': optional: true @@ -3999,31 +4139,31 @@ snapshots: dependencies: tslib: 2.8.1 - '@oxc-parser/binding-darwin-arm64@0.48.1': + '@oxc-parser/binding-darwin-arm64@0.54.0': optional: true - '@oxc-parser/binding-darwin-x64@0.48.1': + '@oxc-parser/binding-darwin-x64@0.54.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.48.1': + '@oxc-parser/binding-linux-arm64-gnu@0.54.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.48.1': + '@oxc-parser/binding-linux-arm64-musl@0.54.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.48.1': + '@oxc-parser/binding-linux-x64-gnu@0.54.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.48.1': + '@oxc-parser/binding-linux-x64-musl@0.54.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.48.1': + '@oxc-parser/binding-win32-arm64-msvc@0.54.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.48.1': + '@oxc-parser/binding-win32-x64-msvc@0.54.0': optional: true - '@oxc-project/types@0.48.1': {} + '@oxc-project/types@0.54.0': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -4298,6 +4438,125 @@ snapshots: - '@types/node' optional: true + '@solid-devtools/debugger@0.26.0(solid-js@1.9.5)': + dependencies: + '@nothing-but/utils': 0.17.0 + '@solid-devtools/shared': 0.19.0(solid-js@1.9.5) + '@solid-primitives/bounds': 0.0.122(solid-js@1.9.5) + '@solid-primitives/cursor': 0.0.115(solid-js@1.9.5) + '@solid-primitives/event-listener': 2.4.0(solid-js@1.9.5) + '@solid-primitives/keyboard': 1.3.0(solid-js@1.9.5) + '@solid-primitives/platform': 0.1.2(solid-js@1.9.5) + '@solid-primitives/rootless': 1.5.0(solid-js@1.9.5) + '@solid-primitives/scheduled': 1.5.0(solid-js@1.9.5) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-devtools/logger@0.9.7(solid-js@1.9.5)': + dependencies: + '@nothing-but/utils': 0.17.0 + '@solid-devtools/debugger': 0.26.0(solid-js@1.9.5) + '@solid-devtools/shared': 0.19.0(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-devtools/shared@0.19.0(solid-js@1.9.5)': + dependencies: + '@nothing-but/utils': 0.17.0 + '@solid-primitives/event-listener': 2.4.0(solid-js@1.9.5) + '@solid-primitives/media': 2.3.0(solid-js@1.9.5) + '@solid-primitives/refs': 1.1.0(solid-js@1.9.5) + '@solid-primitives/rootless': 1.5.0(solid-js@1.9.5) + '@solid-primitives/scheduled': 1.5.0(solid-js@1.9.5) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.5) + '@solid-primitives/styles': 0.0.114(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/bounds@0.0.122(solid-js@1.9.5)': + dependencies: + '@solid-primitives/event-listener': 2.4.0(solid-js@1.9.5) + '@solid-primitives/resize-observer': 2.1.0(solid-js@1.9.5) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/cursor@0.0.115(solid-js@1.9.5)': + dependencies: + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/event-listener@2.4.0(solid-js@1.9.5)': + dependencies: + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/keyboard@1.3.0(solid-js@1.9.5)': + dependencies: + '@solid-primitives/event-listener': 2.4.0(solid-js@1.9.5) + '@solid-primitives/rootless': 1.5.0(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/media@2.3.0(solid-js@1.9.5)': + dependencies: + '@solid-primitives/event-listener': 2.4.0(solid-js@1.9.5) + '@solid-primitives/rootless': 1.5.0(solid-js@1.9.5) + '@solid-primitives/static-store': 0.1.0(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/platform@0.1.2(solid-js@1.9.5)': + dependencies: + solid-js: 1.9.5 + + '@solid-primitives/refs@1.1.0(solid-js@1.9.5)': + dependencies: + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/resize-observer@2.1.0(solid-js@1.9.5)': + dependencies: + '@solid-primitives/event-listener': 2.4.0(solid-js@1.9.5) + '@solid-primitives/rootless': 1.5.0(solid-js@1.9.5) + '@solid-primitives/static-store': 0.1.0(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/rootless@1.5.0(solid-js@1.9.5)': + dependencies: + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/scheduled@1.5.0(solid-js@1.9.5)': + dependencies: + solid-js: 1.9.5 + + '@solid-primitives/static-store@0.0.8(solid-js@1.9.5)': + dependencies: + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/static-store@0.1.0(solid-js@1.9.5)': + dependencies: + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/styles@0.0.114(solid-js@1.9.5)': + dependencies: + '@solid-primitives/rootless': 1.5.0(solid-js@1.9.5) + '@solid-primitives/utils': 6.3.0(solid-js@1.9.5) + solid-js: 1.9.5 + + '@solid-primitives/utils@6.3.0(solid-js@1.9.5)': + dependencies: + solid-js: 1.9.5 + + '@solidjs/meta@0.29.4(solid-js@1.9.5)': + dependencies: + solid-js: 1.9.5 + '@swc/core-darwin-arm64@1.10.12': optional: true @@ -4355,8 +4614,21 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@tanstack/history@1.112.8': {} + '@tanstack/history@1.99.0': {} + '@tanstack/react-router@1.112.11(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/history': 1.112.8 + '@tanstack/react-store': 0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-core': 1.112.8 + jsesc: 3.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + '@tanstack/react-router@1.99.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@tanstack/history': 1.99.0 @@ -4375,6 +4647,11 @@ snapshots: react-dom: 19.0.0(react@19.0.0) use-sync-external-store: 1.4.0(react@19.0.0) + '@tanstack/router-core@1.112.8': + dependencies: + '@tanstack/history': 1.112.8 + '@tanstack/store': 0.7.0 + '@tanstack/router-core@1.99.6': dependencies: '@tanstack/history': 1.99.0 @@ -4431,6 +4708,24 @@ snapshots: ansis: 3.10.0 diff: 7.0.0 + '@tanstack/solid-router@1.112.11(solid-js@1.9.5)': + dependencies: + '@solid-devtools/logger': 0.9.7(solid-js@1.9.5) + '@solid-primitives/refs': 1.1.0(solid-js@1.9.5) + '@solidjs/meta': 0.29.4(solid-js@1.9.5) + '@tanstack/history': 1.112.8 + '@tanstack/router-core': 1.112.8 + '@tanstack/solid-store': 0.7.0(solid-js@1.9.5) + jsesc: 3.1.0 + solid-js: 1.9.5 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/solid-store@0.7.0(solid-js@1.9.5)': + dependencies: + '@tanstack/store': 0.7.0 + solid-js: 1.9.5 + '@tanstack/store@0.7.0': {} '@tanstack/virtual-file-routes@1.99.0': {} @@ -5885,24 +6180,24 @@ snapshots: outvariant@1.4.3: optional: true - oxc-parser@0.48.1: + oxc-parser@0.54.0: dependencies: - '@oxc-project/types': 0.48.1 + '@oxc-project/types': 0.54.0 optionalDependencies: - '@oxc-parser/binding-darwin-arm64': 0.48.1 - '@oxc-parser/binding-darwin-x64': 0.48.1 - '@oxc-parser/binding-linux-arm64-gnu': 0.48.1 - '@oxc-parser/binding-linux-arm64-musl': 0.48.1 - '@oxc-parser/binding-linux-x64-gnu': 0.48.1 - '@oxc-parser/binding-linux-x64-musl': 0.48.1 - '@oxc-parser/binding-win32-arm64-msvc': 0.48.1 - '@oxc-parser/binding-win32-x64-msvc': 0.48.1 + '@oxc-parser/binding-darwin-arm64': 0.54.0 + '@oxc-parser/binding-darwin-x64': 0.54.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.54.0 + '@oxc-parser/binding-linux-arm64-musl': 0.54.0 + '@oxc-parser/binding-linux-x64-gnu': 0.54.0 + '@oxc-parser/binding-linux-x64-musl': 0.54.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.54.0 + '@oxc-parser/binding-win32-x64-msvc': 0.54.0 - oxc-walker@0.2.2(oxc-parser@0.48.1): + oxc-walker@0.2.2(oxc-parser@0.54.0): dependencies: estree-walker: 3.0.3 magic-regexp: 0.8.0 - oxc-parser: 0.48.1 + oxc-parser: 0.54.0 pac-proxy-agent@7.1.0: dependencies: @@ -6254,6 +6549,12 @@ snapshots: type-fest: 2.19.0 optional: true + seroval-plugins@1.2.1(seroval@1.2.1): + dependencies: + seroval: 1.2.1 + + seroval@1.2.1: {} + setimmediate@1.0.5: optional: true @@ -6292,6 +6593,12 @@ snapshots: smart-buffer: 4.2.0 optional: true + solid-js@1.9.5: + dependencies: + csstype: 3.1.3 + seroval: 1.2.1 + seroval-plugins: 1.2.1(seroval@1.2.1) + source-map-js@1.2.1: {} source-map@0.6.1: diff --git a/rslib.config.ts b/rslib.config.ts index 0758f70..bc4fbab 100644 --- a/rslib.config.ts +++ b/rslib.config.ts @@ -24,7 +24,11 @@ export default defineConfig({ entry: { index: './src/index.ts', 'adapters/react': './src/adapters/react/index.ts', - 'adapters/tanstack-router': './src/adapters/tanstack-router/index.ts', + 'adapters/solid-js': './src/adapters/solid-js/index.ts', + 'adapters/@tanstack/react-router': + './src/adapters/@tanstack/react-router.ts', + 'adapters/@tanstack/solid-router': + './src/adapters/@tanstack/solid-router.ts', }, }, }, diff --git a/src/adapters/tanstack-router/index.ts b/src/adapters/@tanstack/react-router.ts similarity index 100% rename from src/adapters/tanstack-router/index.ts rename to src/adapters/@tanstack/react-router.ts diff --git a/src/adapters/@tanstack/solid-router.ts b/src/adapters/@tanstack/solid-router.ts new file mode 100644 index 0000000..0f79454 --- /dev/null +++ b/src/adapters/@tanstack/solid-router.ts @@ -0,0 +1,41 @@ +import { InjectionToken, inject } from '@outposts/injection-js'; +import type { AnyRouter } from '@tanstack/solid-router'; +import type { AuthFeature } from '../../features'; +import { AbstractRouter, ROUTER_ABS_PATH_PATTERN } from '../../router'; + +export type TanStackRouter = AnyRouter; + +export const TANSTACK_ROUTER = new InjectionToken( + 'TANSTACK_ROUTER' +); + +export class TanStackRouterAdapter implements AbstractRouter { + private router = inject(TANSTACK_ROUTER); + + navigateByUrl(url: string): void { + this.router.navigate({ + href: ROUTER_ABS_PATH_PATTERN.test(url) ? url : `/${url}`, + }); + } + + getCurrentNavigation() { + return { + extractedUrl: this.router.state.location.href, + }; + } +} + +export function withTanstackRouter(router: TanStackRouter): AuthFeature { + return { + ɵproviders: [ + { + provide: TANSTACK_ROUTER, + useValue: router, + }, + { + provide: AbstractRouter, + useClass: TanStackRouterAdapter, + }, + ], + }; +} diff --git a/src/adapters/react/index.ts b/src/adapters/react/index.ts index bf5e74c..a1fecd9 100644 --- a/src/adapters/react/index.ts +++ b/src/adapters/react/index.ts @@ -6,7 +6,7 @@ import { useContext, useMemo, } from 'react'; -import { OidcSecurityService } from '../..'; +import { OidcSecurityService } from '../../oidc.security.service'; export const InjectorContextVoidInjector: Injector = { get: (_token: Type | InjectionToken, _notFoundValue?: T): T => { diff --git a/src/adapters/solid-js/index.ts b/src/adapters/solid-js/index.ts new file mode 100644 index 0000000..b7ddec9 --- /dev/null +++ b/src/adapters/solid-js/index.ts @@ -0,0 +1,44 @@ +import type { InjectionToken, Injector, Type } from '@outposts/injection-js'; +import { + type ParentProps, + createContext, + createMemo, + mergeProps, + splitProps, + useContext, +} from 'solid-js'; +import h from 'solid-js/h'; +import { OidcSecurityService } from '../../oidc.security.service'; + +export const InjectorContextVoidInjector: Injector = { + get: (_token: Type | InjectionToken, _notFoundValue?: T): T => { + throw new Error('Please wrap with a InjectorContext.Provider first'); + }, +}; + +export const InjectorContext = createContext( + InjectorContextVoidInjector +); + +export function InjectorProvider(props: ParentProps<{ injector: Injector }>) { + const [local, others] = splitProps(props, ['children', 'injector']); + const providerProps = mergeProps(others, { value: local.injector }); + return h(InjectorContext.Provider, providerProps, local.children); +} + +export function useInjector() { + return useContext(InjectorContext); +} + +export function useOidcClient() { + const injector = useInjector(); + + const oidcSecurityService = createMemo(() => + injector.get(OidcSecurityService) + ); + + return { + injector, + oidcSecurityService, + }; +} diff --git a/src/features.ts b/src/features/core.ts similarity index 87% rename from src/features.ts rename to src/features/core.ts index 1bb4fc3..944e2e8 100644 --- a/src/features.ts +++ b/src/features/core.ts @@ -1,16 +1,16 @@ import type { HttpFeature } from '@ngify/http'; import type { Provider } from '@outposts/injection-js'; -import { DOCUMENT } from './dom'; -import { provideHttpClient } from './http'; +import { DOCUMENT } from '../dom'; +import { provideHttpClient } from '../http'; import { AbstractRouter, VanillaHistoryRouter, VanillaLocationRouter, -} from './router'; -import { AbstractSecurityStorage } from './storage/abstract-security-storage'; -import { DefaultLocalStorageService } from './storage/default-localstorage.service'; -import { DefaultSessionStorageService } from './storage/default-sessionstorage.service'; -import { PLATFORM_ID } from './utils/platform-provider/platform.provider'; +} from '../router'; +import { AbstractSecurityStorage } from '../storage/abstract-security-storage'; +import { DefaultLocalStorageService } from '../storage/default-localstorage.service'; +import { DefaultSessionStorageService } from '../storage/default-sessionstorage.service'; +import { PLATFORM_ID } from '../utils/platform-provider/platform.provider'; /** * A feature to be used with `provideAuth`. diff --git a/src/features/index.ts b/src/features/index.ts new file mode 100644 index 0000000..5f01b00 --- /dev/null +++ b/src/features/index.ts @@ -0,0 +1,8 @@ +export type * from './core'; +export * from './core'; +export { + CHECK_AUTH_RESULT_EVENT, + withCheckAuthResultEvent, + type CheckAuthResultEventType, + type WithCheckAuthResultEventProps, +} from './with-check-auth-result-event'; diff --git a/src/features/with-check-auth-result-event.ts b/src/features/with-check-auth-result-event.ts new file mode 100644 index 0000000..98734ec --- /dev/null +++ b/src/features/with-check-auth-result-event.ts @@ -0,0 +1,45 @@ +import { InjectionToken, inject } from '@outposts/injection-js'; +import { type Observable, filter, shareReplay } from 'rxjs'; +import { EventTypes } from '../public-events/event-types'; +import { PublicEventsService } from '../public-events/public-events.service'; +import type { AuthFeature } from './core'; + +export type CheckAuthResultEventType = + | { type: EventTypes.CheckingAuthFinished } + | { + type: EventTypes.CheckingAuthFinishedWithError; + value: string; + }; + +export const CHECK_AUTH_RESULT_EVENT = new InjectionToken< + Observable +>('CHECK_AUTH_RESULT_EVENT'); + +export interface WithCheckAuthResultEventProps { + shareReplayCount?: number; +} + +export function withCheckAuthResultEvent({ + shareReplayCount = 1, +}: WithCheckAuthResultEventProps = {}): AuthFeature { + return { + ɵproviders: [ + { + provide: CHECK_AUTH_RESULT_EVENT, + useFactory: () => { + const publishEventService = inject(PublicEventsService); + + return publishEventService.registerForEvents().pipe( + filter( + (e) => + e.type === EventTypes.CheckingAuthFinishedWithError || + e.type === EventTypes.CheckingAuthFinished + ), + shareReplay(shareReplayCount) + ); + }, + deps: [PublicEventsService], + }, + ], + }; +}