build: fix build and add examples

This commit is contained in:
2025-02-05 23:55:00 +08:00
parent f00c1d1aef
commit 58d7b3c89e
127 changed files with 1340 additions and 3841 deletions

View File

@@ -0,0 +1,47 @@
import type { InjectionToken, Injector, Type } from '@outposts/injection-js';
import {
type PropsWithChildren,
createContext,
createElement,
useContext,
useMemo,
} from 'react';
import { OidcSecurityService } from '../..';
export const InjectorContextVoidInjector: Injector = {
get: <T>(_token: Type<T> | InjectionToken<T>, _notFoundValue?: T): T => {
throw new Error('Please wrap with a InjectorContext.Provider first');
},
};
export const InjectorContext = createContext<Injector>(
InjectorContextVoidInjector
);
export function InjectorProvider({
injector,
...props
}: PropsWithChildren<{ injector: Injector }>) {
return createElement(InjectorContext, {
...props,
value: injector,
});
}
export function useInjector() {
return useContext(InjectorContext);
}
export function useOidcClient() {
const injector = useInjector();
const oidcSecurityService = useMemo(
() => injector.get(OidcSecurityService),
[injector]
);
return {
injector,
oidcSecurityService,
};
}

View File

@@ -0,0 +1,45 @@
import { InjectionToken, inject } from '@outposts/injection-js';
import type {
AnyRoute,
Router,
TrailingSlashOption,
} from '@tanstack/react-router';
import { AbstractRouter } from 'src/router';
import type { AuthFeature } from '../../provide-auth';
export type TanStackRouter = Router<AnyRoute, TrailingSlashOption, boolean>;
export const TANSTACK_ROUTER = new InjectionToken<TanStackRouter>(
'TANSTACK_ROUTER'
);
export class TanStackRouterAdapter implements AbstractRouter<string> {
private router = inject(TANSTACK_ROUTER);
navigateByUrl(url: string): void {
this.router.navigate({
href: 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,
},
],
};
}

View File

@@ -1,5 +1,5 @@
import { HttpHeaders } from '@ngify/http';
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { Observable } from 'rxjs';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import { HttpParams } from '../http';

View File

@@ -1,5 +1,5 @@
import { HttpClient, type HttpHeaders } from '@ngify/http';
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { Observable } from 'rxjs';
import type { HttpParams } from '../http';
@@ -13,7 +13,7 @@ export class HttpBaseService {
): Observable<T> {
return this.http.get<T>(url, {
...options,
params: options.params.toNgify(),
params: options.params?.toNgify(),
});
}
@@ -24,7 +24,7 @@ export class HttpBaseService {
): Observable<T> {
return this.http.post<T>(url, body, {
...options,
params: options.params.toNgify(),
params: options.params?.toNgify(),
});
}
}

View File

@@ -1,4 +1,4 @@
import { InjectionToken, type Provider } from 'injection-js';
import { InjectionToken, type Provider } from '@outposts/injection-js';
import {
type StsConfigLoader,
StsConfigStaticLoader,

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { BehaviorSubject, type Observable, throwError } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, forkJoin, of, throwError } from 'rxjs';
import { catchError, map, switchMap, tap } from 'rxjs/operators';
import { AutoLoginService } from '../auto-login/auto-login.service';

View File

@@ -3,7 +3,7 @@ import {
Injector,
ReflectiveInjector,
type Type,
} from 'injection-js';
} from '@outposts/injection-js';
import type { PassedInitialConfig } from './auth-config';
import type { Module } from './injection';
import { _provideAuth } from './provide-auth';
@@ -34,7 +34,7 @@ export class AuthModule extends Injector {
}
get<T>(token: Type<T> | InjectionToken<T>, notFoundValue?: T): T;
get(token: any, notFoundValue?: any);
get(token: any, notFoundValue?: any): any;
get(token: unknown, notFoundValue?: unknown): any {
return this.injector.get(token, notFoundValue);
}

View File

@@ -1,4 +1,4 @@
import { TestBed, mockRouterProvider } from '@/testing';
import { type MockRouter, TestBed, mockRouterProvider } from '@/testing';
import {
AbstractRouter,
type ActivatedRouteSnapshot,
@@ -43,7 +43,7 @@ describe('AutoLoginPartialRoutesGuard', () => {
let storagePersistenceService: StoragePersistenceService;
let configurationService: ConfigurationService;
let autoLoginService: AutoLoginService;
let router: AbstractRouter;
let router: MockRouter;
beforeEach(() => {
authStateService = TestBed.inject(AuthStateService);
@@ -293,11 +293,6 @@ describe('AutoLoginPartialRoutesGuard', () => {
extractedUrl: router.parseUrl(
'some-url12/with/some-param?queryParam=true'
),
extras: {},
id: 1,
initialUrl: router.parseUrl(''),
previousNavigation: null,
trigger: 'imperative',
});
await firstValueFrom(guard.canLoad());
@@ -342,7 +337,7 @@ describe('AutoLoginPartialRoutesGuard', () => {
let storagePersistenceService: StoragePersistenceService;
let configurationService: ConfigurationService;
let autoLoginService: AutoLoginService;
let router: AbstractRouter;
let router: MockRouter;
beforeEach(() => {
authStateService = TestBed.inject(AuthStateService);
@@ -398,11 +393,6 @@ describe('AutoLoginPartialRoutesGuard', () => {
extractedUrl: router.parseUrl(
'some-url12/with/some-param?queryParam=true'
),
extras: {},
id: 1,
initialUrl: router.parseUrl(''),
previousNavigation: null,
trigger: 'imperative',
});
vi.spyOn(authStateService, 'areAuthStorageTokensValid').mockReturnValue(

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import type { AuthOptions } from '../auth-options';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import { injectAbstractType } from '../injection';
import { AbstractRouter } from '../router';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { Observable, Subject } from 'rxjs';
import { tap } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, throwError } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, throwError } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, type Subscription, interval } from 'rxjs';
import { DOCUMENT } from '../dom';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, ReplaySubject, forkJoin, of, throwError } from 'rxjs';
import { catchError, map, share, switchMap } from 'rxjs/operators';
import { AuthStateService } from '../auth-state/auth-state.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, throwError } from 'rxjs';
import { catchError, finalize } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import {
type Observable,
TimeoutError,

View File

@@ -1,4 +1,4 @@
import { inject, Injectable } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, throwError } from 'rxjs';
import { map, retry } from 'rxjs/operators';
import { DataService } from '../../api/data.service';
@@ -42,7 +42,7 @@ export class AuthWellKnownDataService {
introspectionEndpoint: wellKnownEndpoints.introspection_endpoint,
parEndpoint:
wellKnownEndpoints.pushed_authorization_request_endpoint,
} as AuthWellKnownEndpoints)
}) as AuthWellKnownEndpoints
),
map((mappedWellKnownEndpoints) => ({
...mappedWellKnownEndpoints,

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, throwError } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
import { EventTypes } from '../../public-events/event-types';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, forkJoin, of } from 'rxjs';
import { concatMap, map } from 'rxjs/operators';
import { injectAbstractType } from '../injection/inject';

View File

@@ -1,4 +1,4 @@
import type { Provider } from 'injection-js';
import type { Provider } from '@outposts/injection-js';
import { type Observable, forkJoin, of } from 'rxjs';
import { map } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../openid-configuration';

View File

@@ -1,4 +1,4 @@
import { TestBed, mockImplementationWhenArgsEqual } from '@/testing';
import { TestBed } from '@/testing';
import { mockImplementationWhenArgs, spyOnWithOrigin } from '@/testing/spy';
import { vi } from 'vitest';
import { LogLevel } from '../../logging/log-level';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { LoggerService } from '../../logging/logger.service';
import type { OpenIdConfiguration } from '../openid-configuration';
import type { Level, RuleValidationResult } from './rule';

View File

@@ -1,3 +1,3 @@
import { InjectionToken } from "injection-js";
import { InjectionToken } from '@outposts/injection-js';
export const DOCUMENT = new InjectionToken<Document>('document');
export const DOCUMENT = new InjectionToken<Document>('document');

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
@Injectable()
export class JwkExtractor {

View File

@@ -1,5 +1,5 @@
import { HttpHeaders } from '@ngify/http';
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError, timer } from 'rxjs';
import { catchError, mergeMap, retryWhen, switchMap } from 'rxjs/operators';
import { DataService } from '../../api/data.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError } from 'rxjs';
import { catchError, switchMap, tap } from 'rxjs/operators';
import { AuthStateService } from '../../auth-state/auth-state.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of } from 'rxjs';
import type { OpenIdConfiguration } from '../../config/openid-configuration';
import { DOCUMENT } from '../../dom';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError } from 'rxjs';
import { AuthStateService } from '../../auth-state/auth-state.service';
import type { OpenIdConfiguration } from '../../config/openid-configuration';

View File

@@ -1,5 +1,5 @@
import { HttpHeaders } from '@ngify/http';
import { inject, Injectable } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError, timer } from 'rxjs';
import { catchError, mergeMap, retryWhen, switchMap } from 'rxjs/operators';
import { DataService } from '../../api/data.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { AuthStateService } from '../../auth-state/auth-state.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError } from 'rxjs';
import { catchError, switchMap } from 'rxjs/operators';
import { AuthStateService } from '../../auth-state/auth-state.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import { LoggerService } from '../logging/logger.service';
import { StoragePersistenceService } from '../storage/storage-persistence.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { Observable } from 'rxjs';
import { concatMap } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../../config/openid-configuration';
import { LoggerService } from '../../logging/logger.service';
import { CryptoService } from '../../utils/crypto/crypto.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { AuthStateService } from '../auth-state/auth-state.service';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import { LoggerService } from '../logging/logger.service';

View File

@@ -1,5 +1,5 @@
import { HttpResponse } from '@ngify/http';
import { inject, Injectable } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, throwError } from 'rxjs';
import { catchError, retry } from 'rxjs/operators';
import { DataService } from '../api/data.service';

View File

@@ -8,9 +8,13 @@ import {
withInterceptors,
withLegacyInterceptors,
} from '@ngify/http';
import { InjectionToken, Optional, type Provider } from 'injection-js';
import {
InjectionToken,
Optional,
type Provider,
} from '@outposts/injection-js';
import type { ArrayOrNullableOne } from '../utils/types';
export { HttpParams, HttpParamsOptions } from './params';
export { HttpParams, type HttpParamsOptions } from './params';
export const HTTP_FEATURES = new InjectionToken<HttpFeature[]>('HTTP_FEATURES');

View File

@@ -88,6 +88,7 @@ function paramParser(
// The `window.location.search` can be used while creating an instance of the `HttpParams` class
// (e.g. `new HttpParams({ fromString: window.location.search })`). The `window.location.search`
// may start with the `?` char, so we strip it if it's present.
// biome-ignore lint/performance/useTopLevelRegex: <explanation>
const params: string[] = rawParams.replace(/^\?/, '').split('&');
params.forEach((param: string) => {
const eqIdx = param.indexOf('=');
@@ -304,7 +305,7 @@ export class HttpParams {
toNgify(): NgifyHttpParams {
this.init();
return new NgifyHttpParams().appendAll(
Object.fromEntries(this.map.entries())
Object.fromEntries(this.map!.entries())
);
}

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { BehaviorSubject, Observable, of } from 'rxjs';
import { take } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import { DOCUMENT } from '../dom';
import { LoggerService } from '../logging/logger.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import {
Observable,
ReplaySubject,
@@ -82,14 +82,14 @@ export class RefreshSessionIframeService {
): void {
const instanceId = Math.random();
const oidcSilentRenewInit$ = fromEventPattern(
const oidcSilentRenewInit$ = fromEventPattern<CustomEvent>(
(handler) =>
this.document.defaultView.window.addEventListener(
this.document.defaultView?.window?.addEventListener(
'oidc-silent-renew-init',
handler
),
(handler) =>
this.document.defaultView.window.removeEventListener(
this.document.defaultView?.window?.removeEventListener(
'oidc-silent-renew-init',
handler
)
@@ -104,12 +104,12 @@ export class RefreshSessionIframeService {
}
this.silentRenewEventHandlerSubscription = fromEventPattern<CustomEvent>(
(handler) =>
this.document.defaultView.window.addEventListener(
this.document.defaultView?.window?.addEventListener(
'oidc-silent-renew-message',
handler
),
(handler) =>
this.document.defaultView.window.removeEventListener(
this.document.defaultView?.window?.removeEventListener(
'oidc-silent-renew-message',
handler
)

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, Subject, of, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { AuthStateService } from '../auth-state/auth-state.service';

View File

@@ -1,7 +0,0 @@
import { InjectionToken } from 'injection-js';
import type { Observable } from 'rxjs';
export const APP_INITIALIZER = new InjectionToken<
// biome-ignore lint/suspicious/noConfusingVoidType: <explanation>
readonly (() => void | Observable<unknown> | Promise<unknown>)[]
>('APP_INITIALIZER');

View File

@@ -1,3 +1,2 @@
export type { Module } from './module';
export { APP_INITIALIZER } from './convention';
export { injectAbstractType } from './inject';

View File

@@ -1,4 +1,4 @@
import { inject } from 'injection-js';
import { inject } from '@outposts/injection-js';
// biome-ignore lint/complexity/noBannedTypes: <explanation>
export interface AbstractType<T> extends Function {

View File

@@ -1,3 +1,3 @@
import type { Injector } from 'injection-js';
import type { Injector } from '@outposts/injection-js';
export type Module = (parentInjector: Injector) => Injector;

View File

@@ -6,7 +6,7 @@ import type {
HttpInterceptorFn,
HttpRequest,
} from '@ngify/http';
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { Observable } from 'rxjs';
import { AuthStateService } from '../auth-state/auth-state.service';
import { ConfigurationService } from '../config/config.service';

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
@Injectable()

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
/**
* Implement this class-interface to create a custom logger service.

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
import type { AbstractLoggerService } from './abstract-logger.service';
@Injectable()

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import { injectAbstractType } from '../injection/inject';
import { AbstractLoggerService } from './abstract-logger.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError } from 'rxjs';
import type { AuthOptions } from '../auth-options';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError } from 'rxjs';
import { map, switchMap, take } from 'rxjs/operators';
import type { AuthOptions } from '../../auth-options';

View File

@@ -1,5 +1,5 @@
import { HttpHeaders } from '@ngify/http';
import { inject, Injectable } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, throwError } from 'rxjs';
import { catchError, map, retry, switchMap } from 'rxjs/operators';
import { DataService } from '../../api/data.service';
@@ -74,7 +74,8 @@ export class ParService {
};
}),
catchError((error) => {
const errorMessage = 'There was an error on ParService postParRequest';
const errorMessage =
'There was an error on ParService postParRequest';
this.loggerService.logError(configuration, errorMessage, error);

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError } from 'rxjs';
import { switchMap, take, tap } from 'rxjs/operators';
import type { AuthOptions } from '../../auth-options';

View File

@@ -1,7 +1,7 @@
import { DOCUMENT } from '../../dom';
import { inject, Injectable } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, Subject } from 'rxjs';
import type { OpenIdConfiguration } from '../../config/openid-configuration';
import { DOCUMENT } from '../../dom';
import { LoggerService } from '../../logging/logger.service';
import { StoragePersistenceService } from '../../storage/storage-persistence.service';
import type { PopupOptions } from './popup-options';

View File

@@ -1,4 +1,4 @@
import { inject, Injectable } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../../config/openid-configuration';
import { LoggerService } from '../../logging/logger.service';
import { FlowHelper } from '../../utils/flowHelper/flow-helper.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, map, of, switchMap } from 'rxjs';
import type { AuthOptions } from '../../auth-options';
import { AuthWellKnownService } from '../../config/auth-well-known/auth-well-known.service';

View File

@@ -1,5 +1,5 @@
import { HttpHeaders } from '@ngify/http';
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of, throwError } from 'rxjs';
import { catchError, concatMap, retry, switchMap } from 'rxjs/operators';
import { DataService } from '../api/data.service';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { BehaviorSubject, type Observable } from 'rxjs';
import { concatMap, map, switchMap } from 'rxjs/operators';
import type { AuthOptions, LogoutAuthOptions } from './auth-options';

View File

@@ -1,8 +1,6 @@
import { TestBed } from '@/testing';
import { mockClass, mockProvider } from '@/testing/mock';
import { APP_INITIALIZER } from 'oidc-client-rx';
import { mockProvider } from '@/testing/mock';
import { of } from 'rxjs';
import { vi } from 'vitest';
import { PASSED_CONFIG } from './auth-config';
import { ConfigurationService } from './config/config.service';
import {
@@ -10,8 +8,7 @@ import {
StsConfigLoader,
StsConfigStaticLoader,
} from './config/loader/config-loader';
import { OidcSecurityService } from './oidc.security.service';
import { provideAuth, withAppInitializerAuthCheck } from './provide-auth';
import { provideAuth } from './provide-auth';
describe('provideAuth', () => {
describe('APP_CONFIG', () => {
@@ -59,37 +56,37 @@ describe('provideAuth', () => {
});
});
describe('features', () => {
let oidcSecurityServiceMock: OidcSecurityService;
let spy: any;
// describe('features', () => {
// let oidcSecurityServiceMock: OidcSecurityService;
// let spy: any;
beforeEach(async () => {
//@ts-ignore
// beforeEach(async () => {
// //@ts-ignore
oidcSecurityServiceMock = new (mockClass(OidcSecurityService))();
spy = vi.spyOn(oidcSecurityServiceMock, 'checkAuthMultiple');
await TestBed.configureTestingModule({
providers: [
provideAuth(
{ config: { authority: 'something' } },
withAppInitializerAuthCheck()
),
mockProvider(ConfigurationService),
{
provide: OidcSecurityService,
useValue: oidcSecurityServiceMock,
},
],
}).compileComponents();
});
// oidcSecurityServiceMock = new (mockClass(OidcSecurityService))();
// spy = vi.spyOn(oidcSecurityServiceMock, 'checkAuthMultiple');
// await TestBed.configureTestingModule({
// providers: [
// provideAuth(
// { config: { authority: 'something' } },
// withAppInitializerAuthCheck()
// ),
// mockProvider(ConfigurationService),
// {
// provide: OidcSecurityService,
// useValue: oidcSecurityServiceMock,
// },
// ],
// }).compileComponents();
// });
it('should provide APP_INITIALIZER config', () => {
const config = TestBed.inject(APP_INITIALIZER);
expect(
config.length,
'Expected an APP_INITIALIZER to be registered'
).toBe(1);
expect(spy).toHaveBeenCalledTimes(1);
});
});
// it('should provide APP_INITIALIZER config', () => {
// const config = TestBed.inject(APP_INITIALIZER);
// expect(
// config.length,
// 'Expected an APP_INITIALIZER to be registered'
// ).toBe(1);
// expect(spy).toHaveBeenCalledTimes(1);
// });
// });
});

View File

@@ -1,15 +1,12 @@
import type { Provider } from 'injection-js';
import { firstValueFrom } from 'rxjs';
import type { Provider } from '@outposts/injection-js';
import {
PASSED_CONFIG,
type PassedInitialConfig,
createStaticLoader,
} from './auth-config';
import { StsConfigLoader } from './config/loader/config-loader';
import { APP_INITIALIZER } from './injection';
import { AbstractLoggerService } from './logging/abstract-logger.service';
import { ConsoleLoggerService } from './logging/console-logger.service';
import { OidcSecurityService } from './oidc.security.service';
import { AbstractSecurityStorage } from './storage/abstract-security-storage';
import { DefaultSessionStorageService } from './storage/default-sessionstorage.service';
@@ -51,26 +48,3 @@ export function _provideAuth(passedConfig: PassedInitialConfig): Provider[] {
{ provide: AbstractLoggerService, useClass: ConsoleLoggerService },
];
}
/**
* Configures an app initializer, which is called before the app starts, and
* resolves any OAuth callback variables.
* When used, it replaces the need to manually call
* `OidcSecurityService.checkAuth(...)` or
* `OidcSecurityService.checkAuthMultiple(...)`.
*
* @see https://angular.dev/api/core/APP_INITIALIZER
*/
export function withAppInitializerAuthCheck(): AuthFeature {
return {
ɵproviders: [
{
provide: APP_INITIALIZER,
useFactory: (oidcSecurityService: OidcSecurityService) =>
oidcSecurityService.checkAuthMultiple(),
multi: true,
deps: [OidcSecurityService],
},
],
};
}

View File

@@ -1,5 +0,0 @@
/*
* Public API Surface of oidc-client-rx
*/
export * from '.';

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
import { type Observable, ReplaySubject } from 'rxjs';
import type { EventTypes } from './event-types';
import type { OidcClientNotification } from './notification';

View File

@@ -14,24 +14,15 @@ export interface UrlTree {
toString(): string;
}
export interface NavigationExtras {
[key: string]: any;
export interface Navigation<URL extends UrlTree = UrlTree> {
extractedUrl: URL;
}
export interface Navigation {
id: number;
initialUrl: UrlTree;
extractedUrl: UrlTree;
finalUrl?: UrlTree | undefined;
trigger: 'imperative' | 'popstate' | 'hashchange';
previousNavigation: Navigation | null;
extras?: NavigationExtras;
}
export abstract class AbstractRouter {
export abstract class AbstractRouter<
URL extends UrlTree = UrlTree,
NAVIGATION extends Navigation<URL> = Navigation<URL>,
> {
abstract navigateByUrl(url: string): void;
abstract getCurrentNavigation(): Navigation;
abstract parseUrl(_url: string): any;
abstract getCurrentNavigation(): NAVIGATION;
}

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
/**
* Implement this class-interface to create a custom storage.

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import { injectAbstractType } from '../injection';
import { LoggerService } from '../logging/logger.service';

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
import type { AbstractSecurityStorage } from './abstract-security-storage';
@Injectable()

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
import type { AbstractSecurityStorage } from './abstract-security-storage';
@Injectable()

View File

@@ -1,4 +1,4 @@
import { inject } from 'injection-js';
import { inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import type { AuthResult } from '../flows/callback-context';
import { BrowserStorageService } from './browser-storage.service';

View File

@@ -1,5 +1,5 @@
import { HttpClientTestingBackend } from '@ngify/http/testing';
import { InjectionToken, type Provider } from 'injection-js';
import { InjectionToken, type Provider } from '@outposts/injection-js';
import { HTTP_BACKEND, provideHttpClient } from 'oidc-client-rx';
export const HTTP_CLIENT_TEST_CONTROLLER =

View File

@@ -1,4 +1,4 @@
import type { Provider } from 'injection-js';
import type { Provider } from '@outposts/injection-js';
export function mockClass<T>(
obj: new (...args: any[]) => T

View File

@@ -1,4 +1,4 @@
import type { Provider } from 'injection-js';
import type { Provider } from '@outposts/injection-js';
import { JSDOM } from 'jsdom';
import { AbstractRouter, type Navigation, type UrlTree } from 'oidc-client-rx';
@@ -8,26 +8,15 @@ export class MockRouter extends AbstractRouter {
});
navigation: Navigation = {
id: 1,
extras: {},
initialUrl: this.parseUrl(this.dom.window.location.href),
extractedUrl: this.parseUrl(this.dom.window.location.href),
trigger: 'imperative',
previousNavigation: null,
};
navigateByUrl(url: string): void {
const prevNavigation = this.navigation;
this.dom.reconfigure({
url: new URL(url, this.dom.window.location.href).href,
});
this.navigation = {
id: prevNavigation.id + 1,
extras: {},
initialUrl: prevNavigation.initialUrl,
extractedUrl: this.parseUrl(this.dom.window.location.href),
trigger: prevNavigation.trigger,
previousNavigation: prevNavigation,
};
}
getCurrentNavigation(): Navigation {

View File

@@ -4,8 +4,8 @@ import {
type Provider,
ReflectiveInjector,
type Type,
} from 'injection-js';
import { setCurrentInjector } from 'injection-js/lib/injector_compatibility';
runInInjectionContext,
} from '@outposts/injection-js';
export interface TestModuleMetadata {
providers?: Provider[];
@@ -45,9 +45,6 @@ export class TestBed {
return newTestBed;
}
/**
* 在 TestBed 的注入上下文中运行函数
*/
static runInInjectionContext<T>(fn: () => T): T {
const injector = TestBed.#instance?.injector;
if (!injector) {
@@ -56,16 +53,7 @@ export class TestBed {
);
}
// 保存当前的注入器
const previousInjector = setCurrentInjector(injector);
try {
// 在注入上下文中执行函数
return fn();
} finally {
// 恢复之前的注入器
setCurrentInjector(previousInjector);
}
return runInInjectionContext(injector, fn);
}
compileComponents(): Promise<any> {

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { BehaviorSubject, type Observable, of, throwError } from 'rxjs';
import { map, retry, switchMap } from 'rxjs/operators';
import { DataService } from '../api/data.service';

View File

@@ -1,5 +1,5 @@
import { Injectable, inject } from '@outposts/injection-js';
import { DOCUMENT } from '../../dom';
import { inject, Injectable } from 'injection-js';
@Injectable()
export class CryptoService {

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
@Injectable()
export class EqualityService {

View File

@@ -1,4 +1,4 @@
import { Injectable } from 'injection-js';
import { Injectable } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../../config/openid-configuration';
@Injectable()

View File

@@ -1,4 +1,4 @@
import { Injectable, InjectionToken, inject } from 'injection-js';
import { Injectable, InjectionToken, inject } from '@outposts/injection-js';
export type PlatformId = 'browser' | 'server';

View File

@@ -1,6 +1,5 @@
import { Injectable, inject } from '@outposts/injection-js';
import { DOCUMENT } from '../../dom';
import { inject, Injectable } from 'injection-js';
@Injectable()
export class RedirectService {

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import type { OpenIdConfiguration } from '../../config/openid-configuration';
import { DOCUMENT } from '../../dom';
import { LoggerService } from '../../logging/logger.service';

View File

@@ -1,5 +1,5 @@
import { Injectable, inject } from '@outposts/injection-js';
import { DOCUMENT } from '../../dom';
import { inject, Injectable } from 'injection-js';
@Injectable()
export class CurrentUrlService {

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';
import type { AuthOptions } from '../../auth-options';

View File

@@ -1,4 +1,4 @@
import { inject, Injectable } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { CryptoService } from '../utils/crypto/crypto.service';
@Injectable()

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { BehaviorSubject, type Observable, from } from 'rxjs';
import { map } from 'rxjs/operators';
import { CryptoService } from '../utils/crypto/crypto.service';

View File

@@ -1,8 +1,5 @@
import { TestBed } from '@/testing';
import {
mockImplementationWhenArgs,
mockImplementationWhenArgsEqual,
} from '@/testing/spy';
import { mockImplementationWhenArgsEqual } from '@/testing/spy';
import { firstValueFrom, of } from 'rxjs';
import { vi } from 'vitest';
import type { AuthWellKnownEndpoints } from '../config/auth-well-known/auth-well-known-endpoints';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { type Observable, of } from 'rxjs';
import { map, mergeMap } from 'rxjs/operators';
import type { OpenIdConfiguration } from '../config/openid-configuration';

View File

@@ -1,4 +1,4 @@
import { Injectable, inject } from 'injection-js';
import { Injectable, inject } from '@outposts/injection-js';
import { base64url } from 'rfc4648';
import { type Observable, from, of } from 'rxjs';
import { map, mergeMap, tap } from 'rxjs/operators';
@@ -390,7 +390,6 @@ export class TokenValidationService {
localState: any,
configuration: OpenIdConfiguration
): boolean {
console.error(state, localState, `${state}`, `${localState}`);
if (`${state}` !== `${localState}`) {
this.loggerService.logDebug(
configuration,