@obsidiane/auth-client-js 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +725 -105
  2. package/fesm2022/obsidiane-auth-client-js.mjs +961 -0
  3. package/fesm2022/obsidiane-auth-client-js.mjs.map +1 -0
  4. package/index.d.ts +361 -0
  5. package/obsidiane-auth-client-js-0.1.0.tgz +0 -0
  6. package/package.json +15 -40
  7. package/dist/index.d.ts +0 -9
  8. package/dist/index.js +0 -10
  9. package/dist/index.js.map +0 -1
  10. package/dist/src/lib/bridge/rest/api-platform.adapter.d.ts +0 -18
  11. package/dist/src/lib/bridge/rest/api-platform.adapter.js +0 -67
  12. package/dist/src/lib/bridge/rest/api-platform.adapter.js.map +0 -1
  13. package/dist/src/lib/bridge/rest/http-request.options.d.ts +0 -4
  14. package/dist/src/lib/bridge/rest/http-request.options.js +0 -17
  15. package/dist/src/lib/bridge/rest/http-request.options.js.map +0 -1
  16. package/dist/src/lib/bridge/rest/query-builder.d.ts +0 -3
  17. package/dist/src/lib/bridge/rest/query-builder.js +0 -41
  18. package/dist/src/lib/bridge/rest/query-builder.js.map +0 -1
  19. package/dist/src/lib/bridge/sse/eventsource-wrapper.d.ts +0 -17
  20. package/dist/src/lib/bridge/sse/eventsource-wrapper.js +0 -57
  21. package/dist/src/lib/bridge/sse/eventsource-wrapper.js.map +0 -1
  22. package/dist/src/lib/bridge/sse/mercure-topic.mapper.d.ts +0 -19
  23. package/dist/src/lib/bridge/sse/mercure-topic.mapper.js +0 -45
  24. package/dist/src/lib/bridge/sse/mercure-topic.mapper.js.map +0 -1
  25. package/dist/src/lib/bridge/sse/mercure-url.builder.d.ts +0 -7
  26. package/dist/src/lib/bridge/sse/mercure-url.builder.js +0 -18
  27. package/dist/src/lib/bridge/sse/mercure-url.builder.js.map +0 -1
  28. package/dist/src/lib/bridge/sse/mercure.adapter.d.ts +0 -37
  29. package/dist/src/lib/bridge/sse/mercure.adapter.js +0 -242
  30. package/dist/src/lib/bridge/sse/mercure.adapter.js.map +0 -1
  31. package/dist/src/lib/bridge/sse/ref-count-topic.registry.d.ts +0 -17
  32. package/dist/src/lib/bridge/sse/ref-count-topic.registry.js +0 -42
  33. package/dist/src/lib/bridge/sse/ref-count-topic.registry.js.map +0 -1
  34. package/dist/src/lib/bridge.types.d.ts +0 -27
  35. package/dist/src/lib/bridge.types.js +0 -8
  36. package/dist/src/lib/bridge.types.js.map +0 -1
  37. package/dist/src/lib/facades/bridge.facade.d.ts +0 -27
  38. package/dist/src/lib/facades/bridge.facade.js +0 -100
  39. package/dist/src/lib/facades/bridge.facade.js.map +0 -1
  40. package/dist/src/lib/facades/facade.factory.d.ts +0 -22
  41. package/dist/src/lib/facades/facade.factory.js +0 -36
  42. package/dist/src/lib/facades/facade.factory.js.map +0 -1
  43. package/dist/src/lib/facades/facade.interface.d.ts +0 -13
  44. package/dist/src/lib/facades/facade.interface.js +0 -2
  45. package/dist/src/lib/facades/facade.interface.js.map +0 -1
  46. package/dist/src/lib/facades/resource.facade.d.ts +0 -30
  47. package/dist/src/lib/facades/resource.facade.js +0 -61
  48. package/dist/src/lib/facades/resource.facade.js.map +0 -1
  49. package/dist/src/lib/interceptors/bridge-debug.interceptor.d.ts +0 -6
  50. package/dist/src/lib/interceptors/bridge-debug.interceptor.js +0 -27
  51. package/dist/src/lib/interceptors/bridge-debug.interceptor.js.map +0 -1
  52. package/dist/src/lib/interceptors/bridge-defaults.interceptor.d.ts +0 -5
  53. package/dist/src/lib/interceptors/bridge-defaults.interceptor.js +0 -43
  54. package/dist/src/lib/interceptors/bridge-defaults.interceptor.js.map +0 -1
  55. package/dist/src/lib/interceptors/content-type.interceptor.d.ts +0 -9
  56. package/dist/src/lib/interceptors/content-type.interceptor.js +0 -34
  57. package/dist/src/lib/interceptors/content-type.interceptor.js.map +0 -1
  58. package/dist/src/lib/interceptors/singleflight.interceptor.d.ts +0 -3
  59. package/dist/src/lib/interceptors/singleflight.interceptor.js +0 -42
  60. package/dist/src/lib/interceptors/singleflight.interceptor.js.map +0 -1
  61. package/dist/src/lib/ports/realtime.port.d.ts +0 -28
  62. package/dist/src/lib/ports/realtime.port.js +0 -2
  63. package/dist/src/lib/ports/realtime.port.js.map +0 -1
  64. package/dist/src/lib/ports/resource-repository.port.d.ts +0 -64
  65. package/dist/src/lib/ports/resource-repository.port.js +0 -2
  66. package/dist/src/lib/ports/resource-repository.port.js.map +0 -1
  67. package/dist/src/lib/provide-bridge.d.ts +0 -40
  68. package/dist/src/lib/provide-bridge.js +0 -81
  69. package/dist/src/lib/provide-bridge.js.map +0 -1
  70. package/dist/src/lib/tokens.d.ts +0 -14
  71. package/dist/src/lib/tokens.js +0 -14
  72. package/dist/src/lib/tokens.js.map +0 -1
  73. package/dist/src/lib/utils/url.d.ts +0 -6
  74. package/dist/src/lib/utils/url.js +0 -17
  75. package/dist/src/lib/utils/url.js.map +0 -1
  76. package/dist/src/models/Auth.d.ts +0 -4
  77. package/dist/src/models/Auth.js +0 -2
  78. package/dist/src/models/Auth.js.map +0 -1
  79. package/dist/src/models/AuthInviteCompleteInputInviteComplete.d.ts +0 -6
  80. package/dist/src/models/AuthInviteCompleteInputInviteComplete.js +0 -2
  81. package/dist/src/models/AuthInviteCompleteInputInviteComplete.js.map +0 -1
  82. package/dist/src/models/AuthInviteUserInputInviteSend.d.ts +0 -4
  83. package/dist/src/models/AuthInviteUserInputInviteSend.js +0 -2
  84. package/dist/src/models/AuthInviteUserInputInviteSend.js.map +0 -1
  85. package/dist/src/models/AuthLdJson.d.ts +0 -4
  86. package/dist/src/models/AuthLdJson.js +0 -2
  87. package/dist/src/models/AuthLdJson.js.map +0 -1
  88. package/dist/src/models/AuthPasswordForgotInputPasswordForgot.d.ts +0 -4
  89. package/dist/src/models/AuthPasswordForgotInputPasswordForgot.js +0 -2
  90. package/dist/src/models/AuthPasswordForgotInputPasswordForgot.js.map +0 -1
  91. package/dist/src/models/AuthPasswordResetInputPasswordReset.d.ts +0 -5
  92. package/dist/src/models/AuthPasswordResetInputPasswordReset.js +0 -2
  93. package/dist/src/models/AuthPasswordResetInputPasswordReset.js.map +0 -1
  94. package/dist/src/models/AuthRegisterUserInputUserRegister.d.ts +0 -5
  95. package/dist/src/models/AuthRegisterUserInputUserRegister.js +0 -2
  96. package/dist/src/models/AuthRegisterUserInputUserRegister.js.map +0 -1
  97. package/dist/src/models/FrontendConfig.d.ts +0 -11
  98. package/dist/src/models/FrontendConfig.js +0 -2
  99. package/dist/src/models/FrontendConfig.js.map +0 -1
  100. package/dist/src/models/InvitePreview.d.ts +0 -7
  101. package/dist/src/models/InvitePreview.js +0 -2
  102. package/dist/src/models/InvitePreview.js.map +0 -1
  103. package/dist/src/models/InviteUserInviteRead.d.ts +0 -8
  104. package/dist/src/models/InviteUserInviteRead.js +0 -2
  105. package/dist/src/models/InviteUserInviteRead.js.map +0 -1
  106. package/dist/src/models/Setup.d.ts +0 -4
  107. package/dist/src/models/Setup.js +0 -2
  108. package/dist/src/models/Setup.js.map +0 -1
  109. package/dist/src/models/SetupRegisterUserInputUserRegister.d.ts +0 -5
  110. package/dist/src/models/SetupRegisterUserInputUserRegister.js +0 -2
  111. package/dist/src/models/SetupRegisterUserInputUserRegister.js.map +0 -1
  112. package/dist/src/models/UserUpdateUserRolesInputUserRoles.d.ts +0 -4
  113. package/dist/src/models/UserUpdateUserRolesInputUserRoles.js +0 -2
  114. package/dist/src/models/UserUpdateUserRolesInputUserRoles.js.map +0 -1
  115. package/dist/src/models/UserUserRead.d.ts +0 -8
  116. package/dist/src/models/UserUserRead.js +0 -2
  117. package/dist/src/models/UserUserRead.js.map +0 -1
  118. package/dist/src/models/index.d.ts +0 -14
  119. package/dist/src/models/index.js +0 -2
  120. package/dist/src/models/index.js.map +0 -1
  121. package/dist/src/public-api.d.ts +0 -8
  122. package/dist/src/public-api.js +0 -9
  123. package/dist/src/public-api.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidiane-auth-client-js.mjs","sources":["../../.meridiane-workspace/projects/auth-client-js/src/lib/tokens.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/interceptors/content-type.interceptor.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/interceptors/bridge-defaults.interceptor.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/interceptors/bridge-debug.interceptor.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/interceptors/singleflight.interceptor.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/provide-bridge.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge.types.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/sse/eventsource-wrapper.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/sse/mercure-url.builder.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/sse/ref-count-topic.registry.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/sse/mercure-topic.mapper.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/sse/mercure.adapter.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/rest/query-builder.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/rest/http-request.options.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/utils/url.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/bridge/rest/api-platform.adapter.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/facades/resource.facade.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/facades/facade.factory.ts","../../.meridiane-workspace/projects/auth-client-js/src/lib/facades/bridge.facade.ts","../../.meridiane-workspace/projects/auth-client-js/src/obsidiane-auth-client-js.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\nimport {BridgeDefaults, BridgeLogger, MercureTopicMode} from './bridge.types';\n\n/** Base URL of the API (e.g. `http://localhost:8000`). */\nexport const API_BASE_URL = new InjectionToken<string>('API_BASE_URL');\n\n/** Mercure hub URL (e.g. `http://localhost:8000/.well-known/mercure`). */\nexport const MERCURE_HUB_URL = new InjectionToken<string>('MERCURE_HUB_URL');\n\n/**\n * Default credential policy for HTTP requests and Mercure EventSource.\n * When `true`, the bridge sets `withCredentials: true` on HTTP calls and uses cookies for SSE.\n */\nexport const BRIDGE_WITH_CREDENTIALS = new InjectionToken<boolean>('BRIDGE_WITH_CREDENTIALS');\n\nexport const MERCURE_TOPIC_MODE = new InjectionToken<MercureTopicMode>('MERCURE_TOPIC_MODE');\n\nexport const BRIDGE_LOGGER = new InjectionToken<BridgeLogger>('BRIDGE_LOGGER');\n\nexport const BRIDGE_DEFAULTS = new InjectionToken<BridgeDefaults>('BRIDGE_DEFAULTS');\n","import {HttpInterceptorFn} from '@angular/common/http';\n\nexport interface ApiMediaTypes {\n accept: string;\n post: string;\n put: string;\n patch: string;\n}\n\nexport const DEFAULT_MEDIA_TYPES: ApiMediaTypes = {\n accept: 'application/ld+json',\n post: 'application/ld+json',\n put: 'application/ld+json',\n patch: 'application/merge-patch+json',\n};\n\nexport const contentTypeInterceptor: HttpInterceptorFn = (req, next) => {\n const mediaTypes = DEFAULT_MEDIA_TYPES;\n let headers = req.headers;\n\n // Set Accept if missing.\n if (!headers.has('Accept')) {\n headers = headers.set('Accept', mediaTypes.accept);\n }\n\n // Only methods with a body.\n const isBodyMethod = ['POST', 'PUT', 'PATCH'].includes(req.method);\n // Ignore FormData (browser sets multipart boundary).\n const isFormData = typeof FormData !== 'undefined' && req.body instanceof FormData;\n\n if (isBodyMethod && !isFormData && !headers.has('Content-Type')) {\n let contentType: string;\n\n switch (req.method) {\n case 'PATCH':\n contentType = mediaTypes.patch;\n break;\n case 'PUT':\n contentType = mediaTypes.put;\n break;\n default:\n contentType = mediaTypes.post;\n }\n\n headers = headers.set('Content-Type', contentType);\n }\n\n return next(req.clone({headers}));\n};\n","import {HttpInterceptorFn} from '@angular/common/http';\nimport {inject} from '@angular/core';\nimport {BRIDGE_DEFAULTS, BRIDGE_LOGGER} from '../tokens';\nimport {retry, timeout, timer} from 'rxjs';\n\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS'];\n\n/**\n * Applies default headers, timeout and retry policy configured via `provideBridge({defaults: ...})`.\n */\nexport const bridgeDefaultsInterceptor: HttpInterceptorFn = (req, next) => {\n const defaults = inject(BRIDGE_DEFAULTS, {optional: true}) ?? {};\n const logger = inject(BRIDGE_LOGGER, {optional: true});\n\n let nextReq = req;\n\n if (defaults.headers) {\n for (const [k, v] of Object.entries(defaults.headers)) {\n if (!nextReq.headers.has(k)) {\n nextReq = nextReq.clone({headers: nextReq.headers.set(k, v)});\n }\n }\n }\n\n let out$ = next(nextReq);\n\n const timeoutMs = typeof defaults.timeoutMs === 'number' ? defaults.timeoutMs : undefined;\n if (timeoutMs && timeoutMs > 0) {\n out$ = out$.pipe(timeout({first: timeoutMs}));\n }\n\n const retryCfg = defaults.retries;\n const retryCount = typeof retryCfg === 'number' ? retryCfg : retryCfg?.count;\n if (retryCount && retryCount > 0) {\n const methods = (typeof retryCfg === 'object' && retryCfg.methods) ? retryCfg.methods : DEFAULT_RETRY_METHODS;\n const normalizedMethod = req.method.toUpperCase();\n const methodAllowList = new Set(methods.map((m) => m.toUpperCase()));\n if (methodAllowList.has(normalizedMethod)) {\n const delayMs = typeof retryCfg === 'object' ? (retryCfg.delayMs ?? 250) : 250;\n out$ = out$.pipe(\n retry({\n count: retryCount,\n delay: (_err, retryIndex) => {\n logger?.debug?.('[Bridge] retry', {url: req.urlWithParams, method: req.method, retryIndex});\n return timer(delayMs);\n },\n })\n );\n }\n }\n\n return out$;\n};\n","import {HttpInterceptorFn, HttpResponse} from '@angular/common/http';\nimport {inject} from '@angular/core';\nimport {BRIDGE_LOGGER} from '../tokens';\nimport {catchError, finalize, tap, throwError} from 'rxjs';\n\n/**\n * Lightweight request/response logging controlled by `provideBridge({debug: true})`.\n * Logs are delegated to the injected `BRIDGE_LOGGER`.\n */\nexport const bridgeDebugInterceptor: HttpInterceptorFn = (req, next) => {\n const logger = inject(BRIDGE_LOGGER, {optional: true});\n if (!logger) return next(req);\n\n const startedAt = Date.now();\n logger.debug('[Bridge] request', {method: req.method, url: req.urlWithParams});\n\n return next(req).pipe(\n tap((evt) => {\n if (evt instanceof HttpResponse) {\n logger.debug('[Bridge] response', {method: req.method, url: req.urlWithParams, status: evt.status});\n }\n }),\n catchError((err) => {\n logger.error('[Bridge] error', {method: req.method, url: req.urlWithParams, err});\n return throwError(() => err);\n }),\n finalize(() => {\n const durationMs = Date.now() - startedAt;\n logger.debug('[Bridge] done', {method: req.method, url: req.urlWithParams, durationMs});\n })\n );\n};\n","import {HttpEvent, HttpInterceptorFn, HttpRequest} from '@angular/common/http';\nimport {finalize, Observable, shareReplay} from 'rxjs';\n\nexport type SingleFlightMode = 'off' | 'safe';\n\nconst DEFAULT_MODE: SingleFlightMode = 'safe';\nconst SAFE_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\n\nexport function createSingleFlightInterceptor(mode: SingleFlightMode = DEFAULT_MODE): HttpInterceptorFn {\n const inflight = new Map<string, Observable<HttpEvent<unknown>>>();\n\n return (req, next) => {\n if (mode === 'off') {\n return next(req);\n }\n\n const method = req.method.toUpperCase();\n if (!SAFE_METHODS.has(method)) {\n return next(req);\n }\n if (req.reportProgress === true) {\n return next(req);\n }\n\n const key = computeKey(req);\n const existing = inflight.get(key);\n if (existing) {\n return existing;\n }\n\n const shared$ = next(req).pipe(\n finalize(() => inflight.delete(key)),\n shareReplay({bufferSize: 1, refCount: true})\n );\n\n inflight.set(key, shared$);\n return shared$;\n };\n}\n\nfunction computeKey(req: HttpRequest<unknown>): string {\n const auth = req.headers.get('Authorization') ?? '';\n const accept = req.headers.get('Accept') ?? '';\n const contentType = req.headers.get('Content-Type') ?? '';\n const creds = req.withCredentials ? '1' : '0';\n return [\n req.method.toUpperCase(),\n req.urlWithParams,\n `rt=${req.responseType}`,\n `wc=${creds}`,\n `a=${auth}`,\n `acc=${accept}`,\n `ct=${contentType}`,\n ].join('::');\n}\n","import {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport {HttpInterceptorFn, provideHttpClient, withFetch, withInterceptors} from '@angular/common/http';\nimport {\n API_BASE_URL,\n BRIDGE_DEFAULTS,\n BRIDGE_LOGGER,\n BRIDGE_WITH_CREDENTIALS,\n MERCURE_HUB_URL,\n MERCURE_TOPIC_MODE,\n} from './tokens';\nimport {BridgeDefaults, BridgeLogger, MercureTopicMode} from './bridge.types';\nimport {contentTypeInterceptor} from './interceptors/content-type.interceptor';\nimport {bridgeDefaultsInterceptor} from './interceptors/bridge-defaults.interceptor';\nimport {bridgeDebugInterceptor} from './interceptors/bridge-debug.interceptor';\nimport {from, switchMap} from 'rxjs';\nimport {createSingleFlightInterceptor} from './interceptors/singleflight.interceptor';\n\nexport type BridgeAuth =\n | string\n | {type: 'bearer'; token: string}\n | {type: 'bearer'; getToken: () => string | undefined | Promise<string | undefined>}\n | HttpInterceptorFn;\n\nexport interface BridgeMercureOptions {\n hubUrl?: string;\n init?: RequestInit;\n topicMode?: MercureTopicMode;\n}\n\nexport interface BridgeOptions {\n /** Base URL of the API (e.g. `http://localhost:8000`). */\n baseUrl: string;\n /** Auth strategy used to attach an Authorization header. */\n auth?: BridgeAuth;\n /**\n * Use `topicMode` to control the `topic=` values sent to the hub.\n */\n mercure?: BridgeMercureOptions;\n /** Default HTTP behaviour (headers, timeout, retries). */\n defaults?: BridgeDefaults;\n /**\n * De-duplicates in-flight HTTP requests.\n *\n * - `true` (default): single-flight for safe methods (`GET/HEAD/OPTIONS`)\n * - `false`: disabled (each call triggers a new request)\n */\n singleFlight?: boolean;\n /** Enables debug logging via the debug interceptor and console logger. */\n debug?: boolean;\n /** Extra `HttpInterceptorFn` applied after bridge interceptors. */\n extraInterceptors?: HttpInterceptorFn[];\n}\n\n/** Registers the bridge HTTP client, interceptors, Mercure realtime adapter and configuration tokens. */\nexport function provideBridge(opts: BridgeOptions): EnvironmentProviders {\n const {\n baseUrl,\n auth,\n mercure,\n defaults,\n singleFlight = true,\n debug = false,\n extraInterceptors = [],\n } = opts;\n\n if (!baseUrl) {\n throw new Error(\"provideBridge(): missing 'baseUrl'\");\n }\n\n const resolvedMercureInit: RequestInit = mercure?.init ?? {credentials: 'include' as RequestCredentials};\n const resolvedMercureHubUrl = mercure?.hubUrl;\n const resolvedMercureTopicMode: MercureTopicMode = mercure?.topicMode ?? 'url';\n const withCredentials = resolveWithCredentials(resolvedMercureInit);\n\n const loggerProvider: BridgeLogger = createBridgeLogger(debug);\n\n const interceptors: HttpInterceptorFn[] = [\n contentTypeInterceptor,\n bridgeDefaultsInterceptor,\n ...createAuthInterceptors(auth),\n ...(singleFlight ? [createSingleFlightInterceptor('safe')] : [createSingleFlightInterceptor('off')]),\n ...(debug ? [bridgeDebugInterceptor] : []),\n ...extraInterceptors,\n ];\n\n return makeEnvironmentProviders([\n provideHttpClient(\n withFetch(),\n withInterceptors(interceptors)\n ),\n {provide: API_BASE_URL, useValue: baseUrl},\n {provide: BRIDGE_WITH_CREDENTIALS, useValue: withCredentials},\n ...(resolvedMercureHubUrl ? [{provide: MERCURE_HUB_URL, useValue: resolvedMercureHubUrl}] : []),\n {provide: MERCURE_TOPIC_MODE, useValue: resolvedMercureTopicMode},\n {provide: BRIDGE_DEFAULTS, useValue: defaults ?? {}},\n {provide: BRIDGE_LOGGER, useValue: loggerProvider},\n ]);\n}\n\nfunction createBridgeLogger(debug: boolean): BridgeLogger {\n const noop = () => undefined;\n return {\n debug: debug ? console.debug.bind(console) : noop,\n info: debug ? console.info.bind(console) : noop,\n warn: debug ? console.warn.bind(console) : noop,\n error: console.error.bind(console),\n };\n}\n\nfunction resolveWithCredentials(init: RequestInit | undefined): boolean {\n if (!init) return false;\n const anyInit = init as RequestInit & {withCredentials?: boolean};\n return anyInit.withCredentials === true || init.credentials === 'include';\n}\n\nfunction createAuthInterceptors(auth?: BridgeAuth): HttpInterceptorFn[] {\n if (!auth) return [];\n\n if (typeof auth === 'function') {\n return [auth as HttpInterceptorFn];\n }\n\n const bearer =\n typeof auth === 'string'\n ? {type: 'bearer' as const, token: auth}\n : (auth as Exclude<BridgeAuth, string | HttpInterceptorFn>);\n\n if (bearer.type !== 'bearer') return [];\n\n if ('token' in bearer) {\n const token = bearer.token;\n return [createBearerAuthInterceptor(() => token)];\n }\n\n return [createBearerAuthInterceptor(bearer.getToken)];\n}\n\nfunction createBearerAuthInterceptor(getToken: () => string | undefined | Promise<string | undefined>): HttpInterceptorFn {\n return (req, next) => {\n if (req.headers.has('Authorization')) return next(req);\n return from(Promise.resolve(getToken())).pipe(\n switchMap((token) => {\n if (!token) return next(req);\n return next(req.clone({headers: req.headers.set('Authorization', `Bearer ${token}`)}));\n })\n );\n };\n}\n","/**\n * Public configuration types for the bridge.\n *\n * Keep this file dependency-free (no Angular imports) so it can be used from both\n * runtime code and type-only contexts.\n */\n\nexport interface BridgeLogger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nexport interface BridgeDefaults {\n headers?: Record<string, string>;\n timeoutMs?: number;\n retries?:\n | number\n | {\n count: number;\n delayMs?: number;\n methods?: string[];\n };\n}\n\n/**\n * Controls how Mercure topics are sent in the hub URL.\n * - `url`: topics are absolute URLs (recommended default)\n * - `iri`: topics are same-origin relative IRIs (e.g. `/api/...`)\n */\nexport type MercureTopicMode = 'url' | 'iri';\n\n","import {ReplaySubject, Subject} from 'rxjs';\nimport {SseEvent, SseOptions, RealtimeStatus} from '../../ports/realtime.port';\nimport {BridgeLogger} from '../../bridge.types';\n\nexport class EventSourceWrapper {\n private es?: EventSource;\n\n private readonly statusSub = new ReplaySubject<RealtimeStatus>(1);\n private readonly eventSub = new Subject<SseEvent>();\n\n readonly status$ = this.statusSub.asObservable();\n readonly events$ = this.eventSub.asObservable();\n\n constructor(\n private readonly url: string,\n private readonly opts: SseOptions = {},\n private readonly logger?: BridgeLogger,\n ) {\n this.setState('closed');\n this.log('[SSE] init', {url, withCredentials: !!opts.withCredentials});\n }\n\n open(): void {\n if (this.es) {\n this.log('[SSE] open() ignored: already open');\n return;\n }\n\n this.setState('connecting');\n this.log('[SSE] open', {url: this.url});\n\n const es = new EventSource(this.url, {\n withCredentials: !!this.opts.withCredentials,\n });\n this.es = es;\n\n es.onopen = () => {\n this.setState('connected');\n };\n\n es.onmessage = (ev) => {\n this.eventSub.next({type: 'message', data: ev.data, lastEventId: ev.lastEventId || undefined});\n };\n\n es.onerror = () => {\n // The browser will retry automatically. We stay in \"connecting\".\n this.log('[SSE] error');\n this.setState('connecting');\n };\n }\n\n close(): void {\n if (this.es) {\n this.es.close();\n this.es = undefined;\n this.log('[SSE] closed');\n }\n this.setState('closed');\n }\n\n // ──────────────── internals ────────────────\n\n private setState(state: RealtimeStatus): void {\n this.statusSub.next(state);\n }\n\n private log(...args: unknown[]): void {\n this.logger?.debug?.(...args);\n }\n}\n","export class MercureUrlBuilder {\n /**\n * Builds the Mercure hub URL with one `topic=` parameter per topic.\n * The adapter is responsible for canonicalising topics beforehand.\n */\n build(hubUrl: string, topics: ReadonlySet<string>, lastEventId?: string): string {\n const url = new URL(hubUrl);\n if (lastEventId) {\n url.searchParams.set('lastEventID', lastEventId);\n }\n url.searchParams.delete('topic');\n for (const topic of topics) {\n url.searchParams.append('topic', topic);\n }\n return url.toString();\n }\n}\n","export class RefCountTopicRegistry {\n private readonly topics = new Set<string>();\n private readonly refCounts = new Map<string, number>();\n\n /**\n * Increments ref-count for each topic.\n * Callers should pass unique topic strings (deduped).\n */\n addAll(topics: Iterable<string>): void {\n for (const topic of topics) {\n const next = (this.refCounts.get(topic) ?? 0) + 1;\n this.refCounts.set(topic, next);\n this.topics.add(topic);\n }\n }\n\n /**\n * Decrements ref-count for each topic.\n * Callers should pass unique topic strings (deduped).\n */\n removeAll(topics: Iterable<string>): void {\n for (const topic of topics) {\n const next = (this.refCounts.get(topic) ?? 0) - 1;\n if (next <= 0) {\n this.refCounts.delete(topic);\n this.topics.delete(topic);\n } else {\n this.refCounts.set(topic, next);\n }\n }\n }\n\n hasAny(): boolean {\n return this.topics.size > 0;\n }\n\n snapshot(): ReadonlySet<string> {\n return new Set(this.topics);\n }\n\n computeKey(hubUrl: string, credentialsOn: boolean): string {\n const topicsSorted = Array.from(this.topics).sort().join('|');\n return `${hubUrl}::${credentialsOn ? '1' : '0'}::${topicsSorted}`;\n }\n}\n","import {MercureTopicMode} from '../../bridge.types';\n\nexport class MercureTopicMapper {\n private readonly apiBaseUrl: URL;\n\n constructor(\n apiBase: string,\n private readonly mode: MercureTopicMode,\n ) {\n this.apiBaseUrl = new URL(apiBase);\n }\n\n /**\n * Canonical value used for ref-counting and as the \"topic\" query param value.\n * - mode \"url\": always absolute, same-origin resolved\n * - mode \"iri\": same-origin path+query+hash (\"/api/...\"), otherwise keep as-is\n */\n toTopic(input: string): string {\n if (this.mode === 'url') return this.toAbsoluteUrl(input);\n return this.toRelativeIriIfSameOrigin(input);\n }\n\n /**\n * Canonical value used to compare incoming payload IRIs with subscribed IRIs.\n * We keep payload matching stable by using same-origin relative IRIs (\"/api/...\").\n */\n toPayloadIri(input: string): string {\n return this.toRelativeIriIfSameOrigin(input);\n }\n\n private toAbsoluteUrl(input: string): string {\n try {\n return new URL(input, this.apiBaseUrl).toString();\n } catch {\n return input;\n }\n }\n\n private toRelativeIriIfSameOrigin(input: string): string {\n try {\n const url = new URL(input, this.apiBaseUrl);\n if (url.origin !== this.apiBaseUrl.origin) return input;\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n return input;\n }\n }\n}\n","import {Inject, Injectable, OnDestroy, Optional, PLATFORM_ID} from '@angular/core';\nimport {BehaviorSubject, defer, EMPTY, fromEvent, Observable, of, Subject} from 'rxjs';\nimport {auditTime, concatMap, filter, finalize, map, share, takeUntil} from 'rxjs/operators';\nimport {API_BASE_URL, BRIDGE_LOGGER, BRIDGE_WITH_CREDENTIALS, MERCURE_HUB_URL, MERCURE_TOPIC_MODE} from '../../tokens';\nimport {BridgeLogger, MercureTopicMode} from '../../bridge.types';\nimport {RealtimeEvent, RealtimePort, RealtimeStatus} from '../../ports/realtime.port';\nimport {EventSourceWrapper} from './eventsource-wrapper';\nimport {Item} from '../../ports/resource-repository.port';\nimport {isPlatformBrowser} from '@angular/common';\nimport {MercureUrlBuilder} from './mercure-url.builder';\nimport {RefCountTopicRegistry} from './ref-count-topic.registry';\nimport {MercureTopicMapper} from './mercure-topic.mapper';\n\n\n@Injectable({providedIn: 'root'})\nexport class MercureRealtimeAdapter implements RealtimePort, OnDestroy {\n private lastEventId?: string;\n private es?: EventSourceWrapper;\n private currentKey?: string;\n\n private readonly topicsRegistry = new RefCountTopicRegistry();\n private readonly urlBuilder: MercureUrlBuilder;\n private readonly topicMapper: MercureTopicMapper;\n\n private readonly destroy$ = new Subject<void>();\n private connectionStop$ = new Subject<void>();\n private readonly rebuild$ = new Subject<void>();\n private shuttingDown = false;\n\n private readonly _status$ = new BehaviorSubject<RealtimeStatus>('closed');\n private readonly incoming$ = new Subject<{ type: string; data: string }>();\n\n constructor(\n @Inject(API_BASE_URL) private readonly apiBase: string,\n @Inject(BRIDGE_WITH_CREDENTIALS) private readonly withCredentialsDefault: boolean,\n @Inject(PLATFORM_ID) private readonly platformId: object,\n @Optional() @Inject(MERCURE_HUB_URL) private readonly hubUrl?: string,\n @Optional() @Inject(MERCURE_TOPIC_MODE) topicMode?: MercureTopicMode,\n @Optional() @Inject(BRIDGE_LOGGER) private readonly logger?: BridgeLogger,\n ) {\n this.urlBuilder = new MercureUrlBuilder();\n // `topicMode` affects only the `topic=` query param sent to the hub.\n // Payload IRIs are always matched using same-origin relative IRIs (`/api/...`) when possible.\n this.topicMapper = new MercureTopicMapper(apiBase, topicMode ?? 'url');\n\n this.rebuild$\n .pipe(\n auditTime(10),\n concatMap(() => this.rebuildOnce$()),\n )\n .subscribe();\n\n if (isPlatformBrowser(this.platformId)) {\n fromEvent<PageTransitionEvent>(window, 'pagehide')\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.shutdownBeforeExit());\n\n fromEvent<BeforeUnloadEvent>(window, 'beforeunload')\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.shutdownBeforeExit());\n }\n }\n\n // ──────────────── API publique ────────────────\n\n status$(): Observable<RealtimeStatus> {\n return this._status$.asObservable();\n }\n\n\n subscribe$<T>(iris: string[], _filter?: { field?: string }): Observable<RealtimeEvent<T>> {\n return defer(() => {\n const inputIris = iris.filter((v): v is string => typeof v === 'string' && v.length > 0);\n if (inputIris.length === 0) return EMPTY;\n\n if (!this.hubUrl) {\n this.logger?.debug?.('[Mercure] hubUrl not configured → realtime disabled');\n return EMPTY;\n }\n\n // Canonicalise topics (ref-count + URL) to avoid duplicates like:\n // - \"/api/conversations/1\" and \"http://localhost:8000/api/conversations/1\"\n const registeredTopics = Array.from(new Set(inputIris.map((i) => this.topicMapper.toTopic(i))));\n\n this.topicsRegistry.addAll(registeredTopics);\n this.scheduleRebuild();\n\n // Matching is done against the payload IRIs (typically \"/api/...\").\n const subscribed = inputIris.map((i) => normalizeIri(this.topicMapper.toPayloadIri(i)));\n const fieldPath = _filter?.field;\n\n return this.incoming$.pipe(\n map((evt) => this.safeParse(evt.data)),\n filter((raw): raw is Item => !!raw),\n\n filter((raw: any) => {\n if (fieldPath) {\n const relIris = this.extractRelationIris(raw, fieldPath).map((i) => normalizeIri(this.topicMapper.toPayloadIri(i)));\n return relIris.some((relIri) => matchesAnySubscribed(relIri, subscribed));\n }\n const rawId = raw?.['@id'];\n const id = typeof rawId === 'string' ? normalizeIri(this.topicMapper.toPayloadIri(rawId)) : undefined;\n return typeof id === 'string' && matchesAnySubscribed(id, subscribed);\n }),\n map((payload) => ({iri: payload['@id'] as string, data: payload as T})),\n finalize(() => {\n this.topicsRegistry.removeAll(registeredTopics);\n this.scheduleRebuild();\n }),\n share()\n );\n });\n }\n\n unsubscribe(iris: string[]): void {\n const inputIris = iris.filter((v): v is string => typeof v === 'string' && v.length > 0);\n if (inputIris.length === 0) return;\n const topics = Array.from(new Set(inputIris.map((i) => this.topicMapper.toTopic(i))));\n this.topicsRegistry.removeAll(topics);\n this.scheduleRebuild();\n }\n\n public shutdownBeforeExit(): void {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n this.teardownConnection();\n }\n\n ngOnDestroy(): void {\n this.teardownConnection();\n this._status$.complete();\n this.incoming$.complete();\n this.destroy$.next();\n this.destroy$.complete();\n this.rebuild$.complete();\n }\n\n // ───────────────── PRIVATE ─────────────────\n\n private scheduleRebuild(): void {\n if (this.shuttingDown) return;\n this.rebuild$.next();\n }\n\n private rebuildOnce$() {\n return defer(() => {\n if (this.shuttingDown) return of(void 0);\n\n try {\n if (!this.hubUrl) {\n this.currentKey = undefined;\n this._status$.next('closed');\n return of(void 0);\n }\n\n const hasTopics = this.topicsRegistry.hasAny();\n const key = hasTopics ? this.topicsRegistry.computeKey(this.hubUrl, this.withCredentialsDefault) : undefined;\n\n if (!hasTopics) {\n if (this.es) this.teardownConnection();\n this.currentKey = undefined;\n this._status$.next('closed');\n return of(void 0);\n }\n\n if (key && key === this.currentKey) {\n return of(void 0);\n }\n\n this.teardownConnection();\n\n const url = this.urlBuilder.build(this.hubUrl, this.topicsRegistry.snapshot(), this.lastEventId);\n this.logger?.debug?.('[Mercure] connect', {hubUrl: this.hubUrl, topics: this.topicsRegistry.snapshot(), lastEventId: this.lastEventId});\n this.es = new EventSourceWrapper(url, {withCredentials: this.withCredentialsDefault}, this.logger);\n\n this.connectionStop$ = new Subject<void>();\n\n this.es.status$\n .pipe(takeUntil(this.connectionStop$), takeUntil(this.destroy$))\n .subscribe((st) => this.updateGlobalStatus(st));\n\n this.es.events$\n .pipe(takeUntil(this.connectionStop$), takeUntil(this.destroy$))\n .subscribe((e) => {\n this.lastEventId = e.lastEventId ?? this.lastEventId;\n this.incoming$.next(e);\n });\n\n this._status$.next('connecting');\n this.es.open();\n this.currentKey = key;\n } catch (err) {\n this.logger?.error?.('[Mercure] rebuild failed:', err);\n this.currentKey = undefined;\n this._status$.next(this.topicsRegistry.hasAny() ? 'connecting' : 'closed');\n }\n\n return of(void 0);\n });\n }\n\n private teardownConnection(): void {\n this.es?.close();\n this.es = undefined;\n this.connectionStop$.next();\n this.connectionStop$.complete();\n }\n\n private updateGlobalStatus(sse: RealtimeStatus): void {\n if (sse === 'connected') {\n this._status$.next('connected');\n return;\n }\n if (sse === 'connecting') {\n this._status$.next('connecting');\n return;\n }\n this._status$.next(this.topicsRegistry.hasAny() ? 'connecting' : 'closed');\n }\n\n private safeParse(raw: string): Item | undefined {\n try {\n return JSON.parse(raw) as Item;\n } catch (err) {\n this.logger?.debug?.('[Mercure] invalid JSON payload ignored', {raw});\n return undefined;\n }\n }\n\n private extractRelationIris(raw: any, path: string): string[] {\n const readPath = (obj: any, dotPath: string): any => {\n return dotPath\n .split('.')\n .filter(Boolean)\n .reduce((acc, key) => acc?.[key], obj);\n };\n\n const normalize = (value: any): string[] => {\n if (!value) return [];\n if (typeof value === 'string') return value.length > 0 ? [value] : [];\n if (typeof value === 'object' && typeof value['@id'] === 'string') return [value['@id']];\n if (Array.isArray(value)) return value.flatMap(normalize);\n return [];\n };\n\n return normalize(readPath(raw, path));\n }\n\n}\n\nfunction normalizeIri(iri: string): string {\n return iri.endsWith('/') ? iri.slice(0, -1) : iri;\n}\n\nfunction matchesAnySubscribed(candidate: string, subscribed: string[]): boolean {\n for (const iri of subscribed) {\n if (candidate === iri) return true;\n if (candidate.startsWith(`${iri}/`)) return true;\n }\n return false;\n}\n","import {HttpParams} from '@angular/common/http';\nimport {AnyQuery, Query, QueryParamValue} from '../../ports/resource-repository.port';\n\nexport function toHttpParams(q: AnyQuery | undefined): HttpParams {\n if (!q) return new HttpParams();\n if (q instanceof HttpParams) return q;\n\n const fromObject: Record<string, string | string[]> = {};\n\n const consumed = new Set<string>();\n const maybeQuery = q as Query;\n if (maybeQuery.page != null) {\n fromObject['page'] = String(maybeQuery.page);\n consumed.add('page');\n }\n if (maybeQuery.itemsPerPage != null) {\n fromObject['itemsPerPage'] = String(maybeQuery.itemsPerPage);\n consumed.add('itemsPerPage');\n }\n\n if (q.filters) {\n consumed.add('filters');\n for (const [k, v] of Object.entries(q.filters)) {\n assign(fromObject, k, v);\n }\n }\n\n for (const [k, v] of Object.entries(q as Record<string, QueryParamValue>)) {\n if (consumed.has(k)) continue;\n assign(fromObject, k, v);\n }\n\n return new HttpParams({fromObject});\n}\n\nfunction assign(target: Record<string, string | string[]>, key: string, value: QueryParamValue | undefined) {\n if (value == null) return;\n if (Array.isArray(value)) {\n target[key] = value.map(String);\n } else {\n target[key] = String(value);\n }\n}\n","import {HttpRequestConfig} from '../../ports/resource-repository.port';\nimport {toHttpParams} from './query-builder';\n\nexport function buildHttpRequestOptions(\n req: HttpRequestConfig,\n {withCredentialsDefault}: {withCredentialsDefault: boolean}\n): Record<string, unknown> {\n const {query, body, headers, responseType, withCredentials, options = {}} = req;\n const mergedOptions: Record<string, unknown> = {...options};\n\n if (headers) mergedOptions['headers'] = headers;\n if (query) mergedOptions['params'] = toHttpParams(query);\n if (body !== undefined) mergedOptions['body'] = body;\n\n mergedOptions['responseType'] = (responseType ?? (mergedOptions['responseType'] as any) ?? 'json') as any;\n mergedOptions['withCredentials'] =\n withCredentials ?? (mergedOptions['withCredentials'] as any) ?? withCredentialsDefault;\n mergedOptions['observe'] = 'body';\n\n return mergedOptions;\n}\n","export function joinUrl(base: string, path: string): string {\n const normalizedBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n}\n\n/**\n * Resolves an API IRI (e.g. `/api/books/1`) to a full URL using the API base.\n * If `path` is already absolute (http/https), it is returned as-is.\n */\nexport function resolveUrl(base: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('//')) return path;\n return joinUrl(base, path);\n}\n","import {HttpClient} from '@angular/common/http';\nimport {Observable} from 'rxjs';\nimport {toHttpParams} from './query-builder';\nimport {buildHttpRequestOptions} from './http-request.options';\nimport {\n Collection,\n HttpCallOptions,\n HttpRequestConfig,\n Iri,\n IriRequired,\n Item,\n AnyQuery,\n ResourceRepository,\n} from '../../ports/resource-repository.port';\nimport {resolveUrl} from '../../utils/url';\n\nexport class ApiPlatformRestRepository<T extends Item> implements ResourceRepository<T> {\n constructor(\n private readonly http: HttpClient,\n private readonly apiBase: string,\n private readonly resourcePath: Iri,\n private readonly withCredentialsDefault: boolean,\n ) {\n }\n\n getCollection$(query?: AnyQuery, opts?: HttpCallOptions): Observable<Collection<T>> {\n const params = toHttpParams(query);\n return this.http.get<Collection<T>>(this.resolveUrl(this.resourcePath), {\n params,\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n get$(iri: IriRequired, opts?: HttpCallOptions): Observable<T> {\n return this.http.get<T>(this.resolveUrl(iri), {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n post$(payload: Partial<T>, opts?: HttpCallOptions): Observable<T> {\n return this.http.post<T>(this.resolveUrl(this.resourcePath), payload, {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n patch$(iri: IriRequired, changes: Partial<T>, opts?: HttpCallOptions): Observable<T> {\n return this.http.patch<T>(this.resolveUrl(iri), changes, {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n put$(iri: IriRequired, payload: Partial<T>, opts?: HttpCallOptions): Observable<T> {\n return this.http.put<T>(this.resolveUrl(iri), payload, {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n delete$(iri: IriRequired, opts?: HttpCallOptions): Observable<void> {\n return this.http.delete<void>(this.resolveUrl(iri), {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n request$<R = unknown, B = unknown>(req: HttpRequestConfig<B>): Observable<R> {\n // Low-level escape hatch for non-standard endpoints (custom controllers, uploads, etc.).\n const {method, url} = req;\n\n const targetUrl = this.resolveUrl(url ?? this.resourcePath);\n const mergedOptions = buildHttpRequestOptions(req, {withCredentialsDefault: this.withCredentialsDefault});\n return this.http.request<R>(method, targetUrl, mergedOptions as {observe: 'body'});\n }\n\n private resolveUrl(path?: Iri): string {\n const effectivePath = path ?? this.resourcePath;\n if (!effectivePath) throw new Error('ApiPlatformRestRepository: missing url and resourcePath');\n return resolveUrl(this.apiBase, effectivePath);\n }\n}\n","import {Signal} from '@angular/core';\nimport {\n ResourceRepository,\n AnyQuery,\n HttpCallOptions,\n Iri,\n IriRequired,\n Collection,\n Item,\n HttpRequestConfig\n} from '../ports/resource-repository.port';\nimport {RealtimePort, RealtimeStatus} from '../ports/realtime.port';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {filter, map, Observable, share} from 'rxjs';\nimport {Facade} from './facade.interface';\n\nexport class ResourceFacade<T extends Item> implements Facade<T> {\n\n readonly connectionStatus: Signal<RealtimeStatus>;\n\n constructor(\n protected readonly repo: ResourceRepository<T>,\n protected readonly realtime: RealtimePort\n ) {\n this.connectionStatus = toSignal(\n this.realtime.status$(),\n {initialValue: 'closed'}\n );\n }\n\n getCollection$(query?: AnyQuery, opts?: HttpCallOptions): Observable<Collection<T>> {\n return this.repo.getCollection$(query, opts);\n }\n\n get$(iri: IriRequired, opts?: HttpCallOptions): Observable<T> {\n return this.repo.get$(iri, opts);\n }\n\n patch$(iri: IriRequired, changes: Partial<T>, opts?: HttpCallOptions): Observable<T> {\n return this.repo.patch$(iri, changes, opts);\n }\n\n post$(payload: Partial<T>, opts?: HttpCallOptions): Observable<T> {\n return this.repo.post$(payload, opts);\n }\n\n put$(iri: IriRequired, payload: Partial<T>, opts?: HttpCallOptions): Observable<T> {\n return this.repo.put$(iri, payload, opts);\n }\n\n delete$(iri: IriRequired, opts?: HttpCallOptions): Observable<void> {\n return this.repo.delete$(iri, opts);\n }\n\n request$<R = unknown, B = unknown>(req: HttpRequestConfig<B>): Observable<R> {\n return this.repo.request$<R, B>(req);\n }\n\n /**\n * Subscribes to real-time updates for one or many IRIs.\n * Undefined/empty values are ignored.\n */\n watch$(iri: Iri | Iri[]): Observable<T> {\n const iris = (Array.isArray(iri) ? iri : [iri]).filter((v): v is string => typeof v === 'string' && v.length > 0);\n return this.subscribeAndSync(iris);\n }\n\n\n unwatch(iri: Iri | Iri[]): void {\n const iris = (Array.isArray(iri) ? iri : [iri]).filter((v): v is string => typeof v === 'string' && v.length > 0);\n this.realtime.unsubscribe(iris);\n }\n\n /**\n * Subscribes to updates of a related sub-resource published on the parent topic.\n * Example: subscribe to Message events on a Conversation topic, filtering by `message.conversation`.\n */\n watchSubResource$<R>(\n iri: Iri | Iri[],\n field: string\n ): Observable<R> {\n const iris = (Array.isArray(iri) ? iri : [iri]).filter((v): v is string => typeof v === 'string' && v.length > 0);\n return this.realtime\n .subscribe$<R>(iris, {field: field})\n .pipe(\n map(e => e.data),\n filter((d): d is R => d !== undefined),\n share()\n );\n }\n\n protected subscribeAndSync(iris: string[]): Observable<T> {\n return this.realtime\n .subscribe$<T>(iris)\n .pipe(\n map(event => event.data),\n filter((data): data is T => data !== undefined),\n share()\n );\n }\n}\n","import {EnvironmentInjector, inject, Injectable, runInInjectionContext} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {RealtimePort} from '../ports/realtime.port';\nimport {Item, ResourceRepository} from '../ports/resource-repository.port';\nimport {API_BASE_URL, BRIDGE_WITH_CREDENTIALS} from '../tokens';\nimport {MercureRealtimeAdapter} from '../bridge/sse/mercure.adapter';\nimport {ApiPlatformRestRepository} from '../bridge/rest/api-platform.adapter';\nimport {ResourceFacade} from './resource.facade';\n\nexport type FacadeConfig<T> = {\n url: string;\n repo?: ResourceRepository<T>;\n realtime?: RealtimePort;\n};\n\n\n@Injectable({providedIn: 'root'})\nexport class FacadeFactory {\n private readonly env = inject(EnvironmentInjector);\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(API_BASE_URL);\n private readonly withCredentials = inject(BRIDGE_WITH_CREDENTIALS);\n private readonly mercure = inject(MercureRealtimeAdapter);\n\n /**\n * Creates a `ResourceFacade<T>`.\n *\n * Important: `ResourceFacade` uses `toSignal()`, which requires an injection context.\n * This factory ensures that by using `runInInjectionContext`.\n */\n create<T extends Item>(config: FacadeConfig<T>): ResourceFacade<T> {\n const url = config.url;\n const repo = config.repo ?? new ApiPlatformRestRepository<T>(this.http, this.baseUrl, url, this.withCredentials);\n const realtime = config.realtime ?? this.mercure;\n\n return runInInjectionContext(this.env, () => new ResourceFacade<T>(repo, realtime));\n }\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {Observable} from 'rxjs';\nimport {filter, map, share} from 'rxjs/operators';\nimport {toHttpParams} from '../bridge/rest/query-builder';\nimport {buildHttpRequestOptions} from '../bridge/rest/http-request.options';\nimport {MercureRealtimeAdapter} from '../bridge/sse/mercure.adapter';\nimport {API_BASE_URL, BRIDGE_WITH_CREDENTIALS} from '../tokens';\nimport {AnyQuery, Collection, HttpCallOptions, HttpRequestConfig, Iri, IriRequired, Item} from '../ports/resource-repository.port';\nimport {SubscribeFilter} from '../ports/realtime.port';\nimport {resolveUrl} from '../utils/url';\n\n/**\n * High-level facade for ad-hoc HTTP calls and Mercure subscriptions.\n *\n * Prefer `FacadeFactory` + `ResourceFacade<T>` when you want a resource-oriented API.\n */\n@Injectable({providedIn: 'root'})\nexport class BridgeFacade {\n constructor(\n private readonly http: HttpClient,\n private readonly realtime: MercureRealtimeAdapter,\n @Inject(API_BASE_URL) private readonly apiBase: string,\n @Inject(BRIDGE_WITH_CREDENTIALS) private readonly withCredentialsDefault: boolean,\n ) {\n }\n\n // ──────────────── HTTP ────────────────\n\n get$<R = unknown>(url: IriRequired, opts?: HttpCallOptions): Observable<R> {\n return this.http.get<R>(this.resolveUrl(url), {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n getCollection$<T extends Item = Item>(\n url: IriRequired,\n query?: AnyQuery,\n opts?: HttpCallOptions\n ): Observable<Collection<T>> {\n const params = toHttpParams(query);\n return this.http.get<Collection<T>>(this.resolveUrl(url), {\n params,\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n post$<R = unknown, B = unknown>(url: IriRequired, payload: B, opts?: HttpCallOptions): Observable<R> {\n return this.http.post<R>(this.resolveUrl(url), payload, {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n patch$<R = unknown, B = unknown>(url: IriRequired, changes: B, opts?: HttpCallOptions): Observable<R> {\n return this.http.patch<R>(this.resolveUrl(url), changes, {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n put$<R = unknown, B = unknown>(url: IriRequired, payload: B, opts?: HttpCallOptions): Observable<R> {\n return this.http.put<R>(this.resolveUrl(url), payload, {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n delete$(url: IriRequired, opts?: HttpCallOptions): Observable<void> {\n return this.http.delete<void>(this.resolveUrl(url), {\n headers: opts?.headers,\n withCredentials: opts?.withCredentials ?? this.withCredentialsDefault,\n });\n }\n\n request$<R = unknown, B = unknown>(req: HttpRequestConfig<B>): Observable<R> {\n const {method, url} = req;\n const targetUrl = this.resolveUrl(url);\n\n const mergedOptions = buildHttpRequestOptions(req, {withCredentialsDefault: this.withCredentialsDefault});\n return this.http.request<R>(method, targetUrl, mergedOptions as {observe: 'body'});\n }\n\n // ──────────────── SSE / Mercure ────────────────\n\n watch$<T = Item>(iri: Iri | Iri[], subscribeFilter?: SubscribeFilter): Observable<T> {\n const iris = (Array.isArray(iri) ? iri : [iri]).filter((v): v is string => typeof v === 'string' && v.length > 0);\n return this.realtime\n .subscribe$<T>(iris, subscribeFilter)\n .pipe(\n map((event) => event.data),\n filter((data): data is T => data !== undefined),\n share()\n );\n }\n\n unwatch(iri: Iri | Iri[]): void {\n const iris = (Array.isArray(iri) ? iri : [iri]).filter((v): v is string => typeof v === 'string' && v.length > 0);\n this.realtime.unsubscribe(iris);\n }\n\n private resolveUrl(path?: Iri): string {\n if (!path) throw new Error('BridgeFacade: missing url');\n return resolveUrl(this.apiBase, path);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["finalize","map","filter","share","i2.MercureRealtimeAdapter"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,361 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EnvironmentProviders, Signal, OnDestroy } from '@angular/core';
3
+ import { HttpInterceptorFn, HttpParams, HttpHeaders, HttpClient } from '@angular/common/http';
4
+ import { Observable } from 'rxjs';
5
+
6
+ /**
7
+ * Public configuration types for the bridge.
8
+ *
9
+ * Keep this file dependency-free (no Angular imports) so it can be used from both
10
+ * runtime code and type-only contexts.
11
+ */
12
+ interface BridgeLogger {
13
+ debug: (...args: unknown[]) => void;
14
+ info: (...args: unknown[]) => void;
15
+ warn: (...args: unknown[]) => void;
16
+ error: (...args: unknown[]) => void;
17
+ }
18
+ interface BridgeDefaults {
19
+ headers?: Record<string, string>;
20
+ timeoutMs?: number;
21
+ retries?: number | {
22
+ count: number;
23
+ delayMs?: number;
24
+ methods?: string[];
25
+ };
26
+ }
27
+ /**
28
+ * Controls how Mercure topics are sent in the hub URL.
29
+ * - `url`: topics are absolute URLs (recommended default)
30
+ * - `iri`: topics are same-origin relative IRIs (e.g. `/api/...`)
31
+ */
32
+ type MercureTopicMode = 'url' | 'iri';
33
+
34
+ type BridgeAuth = string | {
35
+ type: 'bearer';
36
+ token: string;
37
+ } | {
38
+ type: 'bearer';
39
+ getToken: () => string | undefined | Promise<string | undefined>;
40
+ } | HttpInterceptorFn;
41
+ interface BridgeMercureOptions {
42
+ hubUrl?: string;
43
+ init?: RequestInit;
44
+ topicMode?: MercureTopicMode;
45
+ }
46
+ interface BridgeOptions {
47
+ /** Base URL of the API (e.g. `http://localhost:8000`). */
48
+ baseUrl: string;
49
+ /** Auth strategy used to attach an Authorization header. */
50
+ auth?: BridgeAuth;
51
+ /**
52
+ * Use `topicMode` to control the `topic=` values sent to the hub.
53
+ */
54
+ mercure?: BridgeMercureOptions;
55
+ /** Default HTTP behaviour (headers, timeout, retries). */
56
+ defaults?: BridgeDefaults;
57
+ /**
58
+ * De-duplicates in-flight HTTP requests.
59
+ *
60
+ * - `true` (default): single-flight for safe methods (`GET/HEAD/OPTIONS`)
61
+ * - `false`: disabled (each call triggers a new request)
62
+ */
63
+ singleFlight?: boolean;
64
+ /** Enables debug logging via the debug interceptor and console logger. */
65
+ debug?: boolean;
66
+ /** Extra `HttpInterceptorFn` applied after bridge interceptors. */
67
+ extraInterceptors?: HttpInterceptorFn[];
68
+ }
69
+ /** Registers the bridge HTTP client, interceptors, Mercure realtime adapter and configuration tokens. */
70
+ declare function provideBridge(opts: BridgeOptions): EnvironmentProviders;
71
+
72
+ type Iri = string | undefined;
73
+ type IriRequired = string;
74
+ type BaseHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';
75
+ type HttpMethod = BaseHttpMethod | Lowercase<BaseHttpMethod>;
76
+ type QueryParamValue = string | number | boolean | Array<string | number | boolean>;
77
+ type AnyQuery = Query | Record<string, QueryParamValue> | HttpParams;
78
+ interface Item {
79
+ '@id'?: Iri;
80
+ '@context'?: string;
81
+ '@type'?: string;
82
+ }
83
+ interface View extends Item {
84
+ first?: Iri;
85
+ last?: Iri;
86
+ next?: Iri;
87
+ previous?: Iri;
88
+ }
89
+ interface IriTemplateMapping extends Item {
90
+ variable: string;
91
+ property?: string;
92
+ required?: boolean;
93
+ }
94
+ interface IriTemplate extends Item {
95
+ template: string;
96
+ variableRepresentation?: string;
97
+ mapping: IriTemplateMapping[];
98
+ }
99
+ interface Collection<T> extends Item {
100
+ member: T[];
101
+ totalItems?: number;
102
+ search?: IriTemplate;
103
+ view?: View;
104
+ }
105
+ interface Query {
106
+ itemsPerPage?: number;
107
+ page?: number;
108
+ filters?: Record<string, QueryParamValue>;
109
+ }
110
+ interface HttpCallOptions {
111
+ headers?: HttpHeaders | Record<string, string>;
112
+ withCredentials?: boolean;
113
+ }
114
+ interface ResourceRepository<T> {
115
+ getCollection$(query?: AnyQuery, opts?: HttpCallOptions): Observable<Collection<T>>;
116
+ get$(iri: IriRequired, opts?: HttpCallOptions): Observable<T>;
117
+ post$(payload: Partial<T>, opts?: HttpCallOptions): Observable<T>;
118
+ patch$(iri: IriRequired, changes: Partial<T>, opts?: HttpCallOptions): Observable<T>;
119
+ put$(iri: IriRequired, payload: Partial<T>, opts?: HttpCallOptions): Observable<T>;
120
+ delete$(iri: IriRequired, opts?: HttpCallOptions): Observable<void>;
121
+ request$<R = unknown, B = unknown>(req: HttpRequestConfig<B>): Observable<R>;
122
+ }
123
+ interface HttpRequestConfig<TBody = unknown> {
124
+ method: HttpMethod;
125
+ url?: Iri;
126
+ query?: AnyQuery;
127
+ body?: TBody;
128
+ headers?: HttpHeaders | Record<string, string>;
129
+ responseType?: 'json' | 'text' | 'blob';
130
+ withCredentials?: boolean;
131
+ options?: Record<string, unknown>;
132
+ }
133
+
134
+ type RealtimeStatus = 'connecting' | 'connected' | 'closed';
135
+ interface RealtimeEvent<T> {
136
+ iri: string;
137
+ data?: T;
138
+ }
139
+ type SubscribeFilter = {
140
+ field: string;
141
+ };
142
+ interface RealtimePort {
143
+ /**
144
+ * Subscribes to Mercure events for the given topics.
145
+ *
146
+ * Note: topics must be stable strings. Undefined values are ignored by the adapter.
147
+ */
148
+ subscribe$<T>(iris: Iri[], filter?: SubscribeFilter): Observable<RealtimeEvent<T>>;
149
+ unsubscribe(iris: Iri[]): void;
150
+ status$(): Observable<RealtimeStatus>;
151
+ }
152
+
153
+ interface Facade<T extends Item> {
154
+ getCollection$(query?: AnyQuery, opts?: HttpCallOptions): Observable<Collection<T>>;
155
+ get$(iri: IriRequired, opts?: HttpCallOptions): Observable<T>;
156
+ post$(payload: Partial<T>, opts?: HttpCallOptions): Observable<T>;
157
+ patch$(iri: IriRequired, changes: Partial<T>, opts?: HttpCallOptions): Observable<T>;
158
+ put$(iri: IriRequired, payload: Partial<T>, opts?: HttpCallOptions): Observable<T>;
159
+ delete$(iri: IriRequired, opts?: HttpCallOptions): Observable<void>;
160
+ request$<R = unknown, B = unknown>(req: HttpRequestConfig<B>): Observable<R>;
161
+ watch$(iri: Iri | Iri[]): Observable<T>;
162
+ unwatch(iri: Iri | Iri[]): void;
163
+ }
164
+
165
+ declare class ResourceFacade<T extends Item> implements Facade<T> {
166
+ protected readonly repo: ResourceRepository<T>;
167
+ protected readonly realtime: RealtimePort;
168
+ readonly connectionStatus: Signal<RealtimeStatus>;
169
+ constructor(repo: ResourceRepository<T>, realtime: RealtimePort);
170
+ getCollection$(query?: AnyQuery, opts?: HttpCallOptions): Observable<Collection<T>>;
171
+ get$(iri: IriRequired, opts?: HttpCallOptions): Observable<T>;
172
+ patch$(iri: IriRequired, changes: Partial<T>, opts?: HttpCallOptions): Observable<T>;
173
+ post$(payload: Partial<T>, opts?: HttpCallOptions): Observable<T>;
174
+ put$(iri: IriRequired, payload: Partial<T>, opts?: HttpCallOptions): Observable<T>;
175
+ delete$(iri: IriRequired, opts?: HttpCallOptions): Observable<void>;
176
+ request$<R = unknown, B = unknown>(req: HttpRequestConfig<B>): Observable<R>;
177
+ /**
178
+ * Subscribes to real-time updates for one or many IRIs.
179
+ * Undefined/empty values are ignored.
180
+ */
181
+ watch$(iri: Iri | Iri[]): Observable<T>;
182
+ unwatch(iri: Iri | Iri[]): void;
183
+ /**
184
+ * Subscribes to updates of a related sub-resource published on the parent topic.
185
+ * Example: subscribe to Message events on a Conversation topic, filtering by `message.conversation`.
186
+ */
187
+ watchSubResource$<R>(iri: Iri | Iri[], field: string): Observable<R>;
188
+ protected subscribeAndSync(iris: string[]): Observable<T>;
189
+ }
190
+
191
+ type FacadeConfig<T> = {
192
+ url: string;
193
+ repo?: ResourceRepository<T>;
194
+ realtime?: RealtimePort;
195
+ };
196
+ declare class FacadeFactory {
197
+ private readonly env;
198
+ private readonly http;
199
+ private readonly baseUrl;
200
+ private readonly withCredentials;
201
+ private readonly mercure;
202
+ /**
203
+ * Creates a `ResourceFacade<T>`.
204
+ *
205
+ * Important: `ResourceFacade` uses `toSignal()`, which requires an injection context.
206
+ * This factory ensures that by using `runInInjectionContext`.
207
+ */
208
+ create<T extends Item>(config: FacadeConfig<T>): ResourceFacade<T>;
209
+ static ɵfac: i0.ɵɵFactoryDeclaration<FacadeFactory, never>;
210
+ static ɵprov: i0.ɵɵInjectableDeclaration<FacadeFactory>;
211
+ }
212
+
213
+ declare class MercureRealtimeAdapter implements RealtimePort, OnDestroy {
214
+ private readonly apiBase;
215
+ private readonly withCredentialsDefault;
216
+ private readonly platformId;
217
+ private readonly hubUrl?;
218
+ private readonly logger?;
219
+ private lastEventId?;
220
+ private es?;
221
+ private currentKey?;
222
+ private readonly topicsRegistry;
223
+ private readonly urlBuilder;
224
+ private readonly topicMapper;
225
+ private readonly destroy$;
226
+ private connectionStop$;
227
+ private readonly rebuild$;
228
+ private shuttingDown;
229
+ private readonly _status$;
230
+ private readonly incoming$;
231
+ constructor(apiBase: string, withCredentialsDefault: boolean, platformId: object, hubUrl?: string | undefined, topicMode?: MercureTopicMode, logger?: BridgeLogger | undefined);
232
+ status$(): Observable<RealtimeStatus>;
233
+ subscribe$<T>(iris: string[], _filter?: {
234
+ field?: string;
235
+ }): Observable<RealtimeEvent<T>>;
236
+ unsubscribe(iris: string[]): void;
237
+ shutdownBeforeExit(): void;
238
+ ngOnDestroy(): void;
239
+ private scheduleRebuild;
240
+ private rebuildOnce$;
241
+ private teardownConnection;
242
+ private updateGlobalStatus;
243
+ private safeParse;
244
+ private extractRelationIris;
245
+ static ɵfac: i0.ɵɵFactoryDeclaration<MercureRealtimeAdapter, [null, null, null, { optional: true; }, { optional: true; }, { optional: true; }]>;
246
+ static ɵprov: i0.ɵɵInjectableDeclaration<MercureRealtimeAdapter>;
247
+ }
248
+
249
+ /**
250
+ * High-level facade for ad-hoc HTTP calls and Mercure subscriptions.
251
+ *
252
+ * Prefer `FacadeFactory` + `ResourceFacade<T>` when you want a resource-oriented API.
253
+ */
254
+ declare class BridgeFacade {
255
+ private readonly http;
256
+ private readonly realtime;
257
+ private readonly apiBase;
258
+ private readonly withCredentialsDefault;
259
+ constructor(http: HttpClient, realtime: MercureRealtimeAdapter, apiBase: string, withCredentialsDefault: boolean);
260
+ get$<R = unknown>(url: IriRequired, opts?: HttpCallOptions): Observable<R>;
261
+ getCollection$<T extends Item = Item>(url: IriRequired, query?: AnyQuery, opts?: HttpCallOptions): Observable<Collection<T>>;
262
+ post$<R = unknown, B = unknown>(url: IriRequired, payload: B, opts?: HttpCallOptions): Observable<R>;
263
+ patch$<R = unknown, B = unknown>(url: IriRequired, changes: B, opts?: HttpCallOptions): Observable<R>;
264
+ put$<R = unknown, B = unknown>(url: IriRequired, payload: B, opts?: HttpCallOptions): Observable<R>;
265
+ delete$(url: IriRequired, opts?: HttpCallOptions): Observable<void>;
266
+ request$<R = unknown, B = unknown>(req: HttpRequestConfig<B>): Observable<R>;
267
+ watch$<T = Item>(iri: Iri | Iri[], subscribeFilter?: SubscribeFilter): Observable<T>;
268
+ unwatch(iri: Iri | Iri[]): void;
269
+ private resolveUrl;
270
+ static ɵfac: i0.ɵɵFactoryDeclaration<BridgeFacade, never>;
271
+ static ɵprov: i0.ɵɵInjectableDeclaration<BridgeFacade>;
272
+ }
273
+
274
+ declare function joinUrl(base: string, path: string): string;
275
+ /**
276
+ * Resolves an API IRI (e.g. `/api/books/1`) to a full URL using the API base.
277
+ * If `path` is already absolute (http/https), it is returned as-is.
278
+ */
279
+ declare function resolveUrl(base: string, path: string): string;
280
+
281
+ interface Auth extends Item {
282
+ tokenId?: string | null;
283
+ }
284
+
285
+ interface AuthInviteCompleteInputInviteComplete extends Item {
286
+ token: string;
287
+ password: string;
288
+ confirmPassword: string;
289
+ }
290
+
291
+ interface AuthInviteUserInputInviteSend extends Item {
292
+ email: string | null;
293
+ }
294
+
295
+ interface AuthLdJson extends Item {
296
+ tokenId?: string | null;
297
+ }
298
+
299
+ interface AuthPasswordForgotInputPasswordForgot extends Item {
300
+ email: string | null;
301
+ }
302
+
303
+ interface AuthPasswordResetInputPasswordReset extends Item {
304
+ token: string;
305
+ password: string;
306
+ }
307
+
308
+ interface AuthRegisterUserInputUserRegister extends Item {
309
+ email: string | null;
310
+ password: string | null;
311
+ }
312
+
313
+ interface FrontendConfig extends Item {
314
+ id?: string | null;
315
+ registrationEnabled?: boolean;
316
+ passwordStrengthLevel?: number;
317
+ brandingName?: string;
318
+ frontendRedirectUrl?: string;
319
+ environment?: string;
320
+ themeMode?: string;
321
+ themeColor?: string;
322
+ }
323
+
324
+ interface InvitePreview extends Item {
325
+ token?: string | null;
326
+ email?: string | null;
327
+ accepted?: boolean;
328
+ expired?: boolean;
329
+ }
330
+
331
+ interface InviteUserInviteRead extends Item {
332
+ id?: number;
333
+ email?: string;
334
+ createdAt?: string;
335
+ expiresAt?: string;
336
+ acceptedAt?: string | null;
337
+ }
338
+
339
+ interface Setup extends Item {
340
+ tokenId?: string | null;
341
+ }
342
+
343
+ interface SetupRegisterUserInputUserRegister extends Item {
344
+ email: string | null;
345
+ password: string | null;
346
+ }
347
+
348
+ interface UserUserRead extends Item {
349
+ id?: number;
350
+ email: string;
351
+ roles?: string[];
352
+ emailVerified?: boolean;
353
+ lastLoginAt?: string | null;
354
+ }
355
+
356
+ interface UserUpdateUserRolesInputUserRoles extends Item {
357
+ roles: string[] | null;
358
+ }
359
+
360
+ export { BridgeFacade, FacadeFactory, ResourceFacade, joinUrl, provideBridge, resolveUrl };
361
+ export type { AnyQuery, Auth, AuthInviteCompleteInputInviteComplete, AuthInviteUserInputInviteSend, AuthLdJson, AuthPasswordForgotInputPasswordForgot, AuthPasswordResetInputPasswordReset, AuthRegisterUserInputUserRegister, BridgeAuth, BridgeDefaults, BridgeLogger, BridgeMercureOptions, BridgeOptions, Collection, FacadeConfig, FrontendConfig, HttpCallOptions, HttpMethod, HttpRequestConfig, InvitePreview, InviteUserInviteRead, Iri, IriRequired, IriTemplate, IriTemplateMapping, Item, MercureTopicMode, Query, QueryParamValue, ResourceRepository, Setup, SetupRegisterUserInputUserRegister, UserUpdateUserRolesInputUserRoles, UserUserRead, View };
package/package.json CHANGED
@@ -1,49 +1,24 @@
1
1
  {
2
2
  "name": "@obsidiane/auth-client-js",
3
- "version": "1.0.4",
4
- "description": "Obsidiane Auth API Client - Angular/TypeScript SDK",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
12
- }
13
- },
14
- "files": [
15
- "dist",
16
- "README.md"
17
- ],
18
- "scripts": {
19
- "build": "tsc",
20
- "prepublish": "npm run build"
21
- },
3
+ "version": "1.0.5",
22
4
  "peerDependencies": {
23
- "@angular/common": "^20.0.0",
24
- "@angular/core": "^20.0.0",
5
+ "@angular/common": "^20.1.0",
6
+ "@angular/core": "^20.1.0",
25
7
  "rxjs": "^7.8.0"
26
8
  },
27
9
  "dependencies": {
28
10
  "tslib": "^2.8.1"
29
11
  },
30
- "devDependencies": {
31
- "@angular/common": "^20.0.2",
32
- "@angular/core": "^20.0.2",
33
- "rxjs": "^7.8.1",
34
- "typescript": "^5.8.3"
35
- },
36
- "repository": {
37
- "type": "git",
38
- "url": "https://github.com/obsidiane-lab/obsidiane-auth.git",
39
- "directory": "packages/auth-client-js"
40
- },
41
- "license": "MIT",
42
- "keywords": [
43
- "auth",
44
- "authentication",
45
- "obsidiane",
46
- "api-client",
47
- "angular"
48
- ]
12
+ "sideEffects": false,
13
+ "module": "fesm2022/obsidiane-auth-client-js.mjs",
14
+ "typings": "index.d.ts",
15
+ "exports": {
16
+ "./package.json": {
17
+ "default": "./package.json"
18
+ },
19
+ ".": {
20
+ "types": "./index.d.ts",
21
+ "default": "./fesm2022/obsidiane-auth-client-js.mjs"
22
+ }
23
+ }
49
24
  }
package/dist/index.d.ts DELETED
@@ -1,9 +0,0 @@
1
- /**
2
- * Obsidiane Auth Client for Angular/TypeScript
3
- *
4
- * Main entry point that exports the Meridiane-generated bridge:
5
- * - HTTP client (BridgeFacade)
6
- * - Facades (resource-based API)
7
- * - Models (auto-generated types from OpenAPI)
8
- */
9
- export * from './src/public-api';
package/dist/index.js DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * Obsidiane Auth Client for Angular/TypeScript
3
- *
4
- * Main entry point that exports the Meridiane-generated bridge:
5
- * - HTTP client (BridgeFacade)
6
- * - Facades (resource-based API)
7
- * - Models (auto-generated types from OpenAPI)
8
- */
9
- export * from './src/public-api';
10
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,kBAAkB,CAAC"}