@trismegisto/spine 3.0.5 → 3.1.0

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.
package/README.md CHANGED
@@ -113,6 +113,42 @@ O `spine-layout` também monta os avisos: o `spine-notification` (`NotificationS
113
113
  (`HermesToastService`, usado nas configurações, inclusive em MFA e Sessões, e no auto-serviço). O app não monta outro; se
114
114
  montar, os avisos não aparecem em dobro (só uma pilha desenha).
115
115
 
116
+ ## Ambiente em tempo de execução (`config.json`)
117
+
118
+ Cada versão do app gera **uma imagem só**; o ambiente (homologação, produção…) é escolhido no deploy, por um
119
+ `config.json` servido junto do app (montado no container), e não mais por um `environment.<ambiente>.ts` no build.
120
+ No `main.ts`, antes de tudo:
121
+
122
+ ```ts
123
+ import { applyRuntimeEnvironment, loadRuntimeConfig } from '@trismegisto/spine';
124
+ import { environment } from './environments/environment';
125
+
126
+ loadRuntimeConfig(environment, { required: !isDevMode() })
127
+ .then(async () => {
128
+ applyRuntimeEnvironment(environment);
129
+ const [{ appConfig }, { AppComponent }] = await Promise.all([import('./app/app.config'), import('./app/app.component')]);
130
+ return bootstrapApplication(AppComponent, appConfig);
131
+ })
132
+ .catch((e) => console.error(e));
133
+ ```
134
+
135
+ - **`loadRuntimeConfig(environment, { file?, required? })`** (do `@trismegisto/primitives`, reexportado aqui;
136
+ app sem o spine importa direto de lá) busca `file` (padrão `config.json`)
137
+ relativo ao base href (sob `/app-exemplo/` busca `/app-exemplo/config.json`), sem cache, e mescla o JSON **no
138
+ próprio** `environment`, em profundidade: objetos mesclam chave a chave; arrays e valores simples substituem;
139
+ chaves novas entram. O `config.json` só precisa trazer o que muda. Devolve o próprio `environment`.
140
+ - Sem o arquivo (404, rede, ou o `index.html` do fallback de SPA): com `required: true` lança erro
141
+ ("config.json não encontrado: o ambiente do app não foi configurado no deploy"); sem, avisa no console e segue
142
+ com o environment do build. JSON inválido lança erro sempre.
143
+ - **`applyRuntimeEnvironment(environment)`** vem depois: ajusta `redirectUrl`/`postLogoutRedirectUri` à origem e
144
+ ao prefixo atuais e, atrás do proxy, deriva `authority` e os endpoints GraphQL ainda vazios/`CHANGE_ME` — o que o
145
+ `config.json` definir explicitamente prevalece.
146
+ - **`required: !isDevMode()`**, não `environment.production`: com um environment base só, `production` é o do
147
+ build até o merge, e a imagem de produção subiria sem `config.json` sem erro nenhum.
148
+ - **Import dinâmico** do `app.config` e do componente raiz: o que lê o `environment` ao carregar o módulo (providers,
149
+ tokens) com import estático é avaliado antes do merge e fica com os valores do build.
150
+ - **Sem top-level await:** o build de app com Zone.js não aceita; use o `.then`.
151
+
116
152
  ## Logo e favicon
117
153
 
118
154
  O spine não traz marca nenhuma: o logo do cabeçalho e o favicon são arquivos do app.
@@ -1 +1 @@
1
- {"version":3,"file":"trismegisto-spine-graphql.mjs","sources":["../../../projects/ui/graphql/src/envelope.ts","../../../projects/ui/graphql/src/graphql-client.ts","../../../projects/ui/graphql/src/provide-graphql.ts","../../../projects/ui/graphql/src/trismegisto-spine-graphql.ts"],"sourcesContent":["import { currentSpineMessages } from '@trismegisto/spine';\n\n/** Shape every root query/mutation field returns on the platform: business status travels in the payload. */\nexport interface GraphqlEnvelope<T> {\n readonly status?: number | string | null;\n readonly message?: string | null;\n readonly data?: T | null;\n}\n\n/** Business failure carried by an envelope. `status` is kept exactly as the backend sent it. */\nexport class GraphqlEnvelopeError extends Error {\n readonly status: number | string | null | undefined;\n\n constructor(status: number | string | null | undefined, message: string) {\n super(message);\n this.name = 'GraphqlEnvelopeError';\n this.status = status;\n // Keeps `instanceof` working when the output is down-levelled.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nconst FAILURE_WORDS = new Set(['error', 'failed', 'failure', 'fail']);\n\nexport function isEnvelopeOk(status: GraphqlEnvelope<unknown>['status']): boolean {\n if (status === null || status === undefined) return true;\n if (typeof status === 'number') return status >= 200 && status < 300;\n if (typeof status !== 'string') return true;\n // Numeric text is deliberately not parsed: only the failure words count as failure.\n return !FAILURE_WORDS.has(status.trim().toLowerCase());\n}\n\n/** Returns `data` of an ok envelope; throws `GraphqlEnvelopeError` for a missing or failed one. */\nexport function unwrap<T>(envelope: GraphqlEnvelope<T> | null | undefined): T {\n if (envelope === null || envelope === undefined) {\n throw new GraphqlEnvelopeError(null, currentSpineMessages().graphql.noResponse);\n }\n if (!isEnvelopeOk(envelope.status)) {\n throw new GraphqlEnvelopeError(envelope.status, envelope.message || currentSpineMessages().graphql.failed);\n }\n return envelope.data as T;\n}\n\ntype Fields = [string, Record<string, unknown>][];\n\nfunction objectFields(data: unknown): Fields {\n if (!data || typeof data !== 'object') return [];\n return Object.entries(data as Record<string, unknown>).filter(\n (entry): entry is [string, Record<string, unknown>] => typeof entry[1] === 'object' && entry[1] !== null,\n );\n}\n\nconst hasStatus = (value: Record<string, unknown>): boolean =>\n 'status' in value && value['status'] !== null && value['status'] !== undefined;\n\n/** First-level envelopes found in an operation's `data` (fields that carry both `status` and `message`). */\nexport function envelopesOf(data: unknown): { field: string; status: number | string; message: string; ok: boolean }[] {\n return objectFields(data)\n .filter(([, value]) => 'message' in value && hasStatus(value))\n .map(([field, value]) => {\n const status = value['status'] as number | string;\n return { field, status, message: (value['message'] as string | null) ?? '', ok: isEnvelopeOk(status) };\n });\n}\n\n/** First-level fields whose status is a failure; `message` is optional here. */\nexport function failedEnvelopes(\n data: unknown,\n fallbackMessage: string = currentSpineMessages().graphql.serviceFailure,\n): { field: string; status: unknown; message: string }[] {\n return objectFields(data)\n .filter(([, value]) => hasStatus(value) && !isEnvelopeOk(value['status'] as GraphqlEnvelope<unknown>['status']))\n .map(([field, value]) => ({\n field,\n status: value['status'],\n message: (value['message'] as string | null | undefined) || fallbackMessage,\n }));\n}\n","import { inject } from '@angular/core';\nimport type { DefaultContext, OperationVariables, TypedDocumentNode } from '@apollo/client/core';\nimport { Apollo } from 'apollo-angular';\nimport { Observable, filter, firstValueFrom, map } from 'rxjs';\n\nimport { currentSpineMessages } from '@trismegisto/spine';\nimport { GraphqlEnvelopeError } from './envelope';\n\n/** Opções de uma chamada. `silenceEnvelope`: a tela trata a falha sozinha, sem o toast automático. */\nexport interface GraphqlCallOptions {\n readonly silenceEnvelope?: boolean;\n readonly context?: DefaultContext;\n}\n\n/**\n * Cliente GraphQL de UM backend do app, tipado pelo documento gerado no codegen\n * (`TypedDocumentNode`): o retorno é o `data` da operação, sem `<any>`. Junto com o `unwrap` do\n * envelope, é o caminho padrão dos serviços de domínio:\n *\n * private readonly gql = injectGraphqlClient('kalliope');\n * async listTeams() { return unwrap((await this.gql.query(ListTeamsDocument)).teams); }\n *\n * Erro de transporte/GraphQL (`errors[]`) rejeita a Promise (o `errorPolicy` é o padrão `none`);\n * resposta sem `data` também. Falha de NEGÓCIO vem no envelope e quem decide é o `unwrap`.\n */\nexport interface GraphqlClient {\n query<T, V extends OperationVariables = OperationVariables>(\n document: TypedDocumentNode<T, V>, variables?: V, options?: GraphqlCallOptions): Promise<T>;\n mutate<T, V extends OperationVariables = OperationVariables>(\n document: TypedDocumentNode<T, V>, variables?: V, options?: GraphqlCallOptions): Promise<T>;\n /** Eventos da subscription (sem envelope: evento não é resposta). Mensagem sem `data` é ignorada. */\n subscribe<T, V extends OperationVariables = OperationVariables>(\n document: TypedDocumentNode<T, V>, variables?: V): Observable<T>;\n}\n\nconst contextOf = (options?: GraphqlCallOptions): DefaultContext | undefined =>\n options?.silenceEnvelope ? { ...options.context, silenceEnvelope: true } : options?.context;\n\nconst required = <T>(data: T | null | undefined): T => {\n if (data === null || data === undefined) throw new GraphqlEnvelopeError(null, currentSpineMessages().graphql.noResponse);\n return data;\n};\n\n/** O `GraphqlClient` do backend `namedClient` (`environment.graphql.<chave>.namedClient`). Chamar em contexto de injeção. */\nexport function injectGraphqlClient(namedClient: string): GraphqlClient {\n const apollo = inject(Apollo);\n const client = () => apollo.use(namedClient);\n // Os genéricos do apollo-angular não casam 1:1 com os do TypedDocumentNode (variáveis opcionais):\n // o tipo público acima é o contrato; aqui dentro o cast é deliberado.\n /* eslint-disable @typescript-eslint/no-explicit-any */\n return {\n async query(document: any, variables?: any, options?: GraphqlCallOptions) {\n const result = await firstValueFrom(client().query<any, any>({ query: document, variables, context: contextOf(options) }));\n return required(result.data);\n },\n async mutate(document: any, variables?: any, options?: GraphqlCallOptions) {\n const result = await firstValueFrom(client().mutate<any, any>({ mutation: document, variables, context: contextOf(options) }));\n return required(result.data);\n },\n subscribe(document: any, variables?: any) {\n return client().subscribe<any, any>({ query: document, variables }).pipe(\n map((result) => result.data),\n filter((data) => data !== null && data !== undefined),\n );\n },\n } as GraphqlClient;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n","import { DOCUMENT, DestroyRef, PLATFORM_ID, Provider, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { HttpHeaders } from '@angular/common/http';\nimport { ApolloLink, CombinedGraphQLErrors, InMemoryCache } from '@apollo/client';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { NamedOptions, provideNamedApollo } from 'apollo-angular';\nimport { HttpBatchLink } from 'apollo-angular/http';\nimport { OperationTypeNode } from 'graphql';\nimport { Client, createClient } from 'graphql-ws';\nimport { Subject, tap } from 'rxjs';\n\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { SPINE_CONFIG, SPINE_MESSAGES, SpineMessages } from '@trismegisto/spine';\nimport { AlertType, NotificationService } from '@trismegisto/spine/notification';\nimport { LoggerService } from '@trismegisto/spine/routing';\n\nimport { envelopesOf } from './envelope';\n\nexport interface GraphqlEndpoint {\n // Mutable on purpose: the runtime environment rewrites `http`/`ws` before bootstrap.\n namedClient: string;\n http: string;\n ws?: string;\n}\n\nexport interface GraphqlOptions {\n readonly endpoints: Readonly<Record<string, GraphqlEndpoint>>;\n}\n\n/** Emits the `namedClient` whose socket came back after a drop (never on the first connection). */\nexport const wsReconnected$ = new Subject<string>();\n\nconst TOKEN_HEADER = 'x-access-token';\nconst AUTH_CODES = new Set([401, 4401, 4403]);\nconst AUTH_RESET_WINDOW_MS = 5_000;\nconst STALE_TAB_MS = 60_000;\n// Well under the ~60 s idle cut most reverse proxies apply.\nconst PING_EVERY_MS = 20_000;\nconst RETRY_BASE_MS = 1_000;\nconst RETRY_CAP_MS = 30_000;\nconst TOAST_OK_SECONDS = 4;\nconst TOAST_FAIL_SECONDS = 8;\n// graphql-ws gives up on some close codes no matter what `shouldRetry` says; reporting them as this\n// \"try again later\" code keeps the socket coming back.\nconst RETRYABLE_CLOSE = 1013;\n\ntype InitPayload = Record<string, unknown>;\n\nexport function provideGraphql(options: GraphqlOptions): Provider {\n return provideNamedApollo(() => buildClients(options));\n}\n\nfunction buildClients(options: GraphqlOptions): NamedOptions {\n const auth = inject(AuthorizationService);\n const messages = inject(SPINE_MESSAGES);\n const batchLink = inject(HttpBatchLink);\n const notifications = inject(NotificationService, { optional: true });\n const logger = inject(LoggerService, { optional: true });\n const config = inject(SPINE_CONFIG, { optional: true });\n const browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n const sockets: Client[] = [];\n const dropAllSockets = () => {\n for (const socket of sockets) {\n try {\n socket.terminate();\n } catch {\n // already dead: nothing to do\n }\n }\n };\n\n let lastAuthReset = -Infinity;\n const authErrorLink = new ErrorLink(({ error }) => {\n if (!carriesAuthCode(error)) return;\n const now = Date.now();\n if (now - lastAuthReset < AUTH_RESET_WINDOW_MS) return;\n lastAuthReset = now;\n dropAllSockets();\n });\n\n const tokenLink = new ApolloLink((operation, forward) => {\n const token = auth.getToken();\n if (token) {\n operation.setContext(({ headers }: { headers?: HttpHeaders | Record<string, string> }) => ({\n headers: toHttpHeaders(headers).set(TOKEN_HEADER, token),\n }));\n }\n return forward(operation);\n });\n\n const toastLink = notifications ? envelopeToastLink(notifications, messages) : null;\n\n const socketParams = (): InitPayload => {\n const token = auth.getToken();\n if (!token) return {};\n const params: InitPayload = { [TOKEN_HEADER]: token, headers: { [TOKEN_HEADER]: token } };\n const routeId = logger?.routeId;\n if (routeId) params['routeId'] = routeId;\n if (config?.clientId) params['clientId'] = config.clientId;\n return params;\n };\n\n const named: NamedOptions = {};\n for (const endpoint of Object.values(options.endpoints)) {\n const httpLink = ApolloLink.concat(tokenLink, batchLink.create({ uri: endpoint.http }));\n let transport: ApolloLink = httpLink;\n\n if (browser && endpoint.ws) {\n const socket = openSocket(endpoint, socketParams);\n sockets.push(socket);\n transport = ApolloLink.split(\n (operation) => operation.operationType === OperationTypeNode.SUBSCRIPTION,\n new GraphQLWsLink(socket),\n httpLink,\n );\n }\n\n named[endpoint.namedClient] = {\n link: ApolloLink.from(toastLink ? [authErrorLink, toastLink, transport] : [authErrorLink, transport]),\n cache: new InMemoryCache(),\n defaultOptions: {\n query: { fetchPolicy: 'no-cache' },\n watchQuery: { fetchPolicy: 'no-cache' },\n },\n };\n }\n\n const destroyRef = inject(DestroyRef);\n if (browser && sockets.length) {\n const doc = inject(DOCUMENT);\n let hiddenAt: number | null = null;\n const onVisibility = () => {\n if (doc.visibilityState === 'hidden') {\n hiddenAt = Date.now();\n return;\n }\n if (doc.visibilityState !== 'visible' || hiddenAt === null) return;\n const away = Date.now() - hiddenAt;\n hiddenAt = null;\n if (away >= STALE_TAB_MS) dropAllSockets();\n };\n doc.addEventListener('visibilitychange', onVisibility);\n destroyRef.onDestroy(() => doc.removeEventListener('visibilitychange', onVisibility));\n }\n destroyRef.onDestroy(() => {\n for (const socket of sockets) {\n Promise.resolve()\n .then(() => socket.dispose())\n .catch(() => undefined);\n }\n });\n\n return named;\n}\n\nfunction openSocket(endpoint: GraphqlEndpoint, connectionParams: () => InitPayload): Client {\n let everConnected = false;\n return createClient({\n url: endpoint.ws!,\n connectionParams,\n keepAlive: PING_EVERY_MS,\n retryAttempts: Infinity,\n shouldRetry: () => true,\n retryWait: backoff,\n webSocketImpl: forgivingSocket(globalThis.WebSocket),\n on: {\n connected: (_socket, _payload, wasRetry) => {\n if (wasRetry && everConnected) wsReconnected$.next(endpoint.namedClient);\n everConnected = true;\n },\n },\n });\n}\n\n/** Exponential wait with \"equal jitter\": half fixed, half random, capped. */\nfunction backoff(attempt: number): Promise<void> {\n const ceiling = Math.min(RETRY_CAP_MS, RETRY_BASE_MS * 2 ** attempt);\n const wait = ceiling / 2 + Math.random() * (ceiling / 2);\n return new Promise((resolve) => setTimeout(resolve, wait));\n}\n\n/**\n * Thin wrapper around the platform WebSocket that reports every abnormal close as retryable, so the\n * client keeps reconnecting even after closes graphql-ws would otherwise treat as final.\n */\nfunction forgivingSocket(Native: typeof WebSocket): typeof WebSocket {\n class ForgivingSocket {\n static readonly CONNECTING = 0;\n static readonly OPEN = 1;\n static readonly CLOSING = 2;\n static readonly CLOSED = 3;\n\n private readonly inner: WebSocket;\n\n constructor(url: string | URL, protocols?: string | string[]) {\n this.inner = new Native(url, protocols);\n }\n\n get readyState(): number {\n return this.inner.readyState;\n }\n\n get protocol(): string {\n return this.inner.protocol;\n }\n\n set onopen(handler: WebSocket['onopen']) {\n this.inner.onopen = handler;\n }\n\n set onmessage(handler: WebSocket['onmessage']) {\n this.inner.onmessage = handler;\n }\n\n set onerror(handler: WebSocket['onerror']) {\n this.inner.onerror = handler;\n }\n\n set onclose(handler: ((event: CloseEvent) => void) | null) {\n this.inner.onclose = handler\n ? (event: CloseEvent) =>\n handler({\n code: event.code === 1000 ? 1000 : RETRYABLE_CLOSE,\n reason: event.reason,\n wasClean: event.wasClean,\n } as CloseEvent)\n : null;\n }\n\n send(data: string): void {\n this.inner.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this.inner.close(code, reason);\n }\n }\n return ForgivingSocket as unknown as typeof WebSocket;\n}\n\nfunction toHttpHeaders(headers: HttpHeaders | Record<string, string> | undefined): HttpHeaders {\n if (headers instanceof HttpHeaders) return headers;\n return new HttpHeaders(headers ?? {});\n}\n\nfunction codeOf(source: unknown): number | null {\n if (!source || typeof source !== 'object') return null;\n const record = source as Record<string, unknown>;\n for (const key of ['code', 'status', 'statusCode']) {\n const value = record[key];\n if (value !== undefined && value !== null && value !== '') {\n const code = Number(value);\n if (Number.isFinite(code)) return code;\n }\n }\n return null;\n}\n\nfunction carriesAuthCode(error: unknown): boolean {\n const codes = CombinedGraphQLErrors.is(error)\n ? error.errors.map((entry) => codeOf(entry.extensions))\n : [codeOf(error)];\n return codes.some((code) => code !== null && AUTH_CODES.has(code));\n}\n\nfunction envelopeToastLink(notifications: NotificationService, messages: SpineMessages): ApolloLink {\n return new ApolloLink((operation, forward) => {\n const kind = operation.operationType;\n if (kind === OperationTypeNode.SUBSCRIPTION || operation.getContext()['silenceEnvelope'] === true) {\n return forward(operation);\n }\n const isMutation = kind === OperationTypeNode.MUTATION;\n return forward(operation).pipe(\n tap((result) => {\n for (const envelope of envelopesOf(result.data)) {\n if (envelope.ok ? !isMutation || !envelope.message : !isMutation && String(envelope.status) === '404') {\n continue;\n }\n const numeric = Number(envelope.status);\n notifications.addNotification({\n timer: envelope.ok ? TOAST_OK_SECONDS : TOAST_FAIL_SECONDS,\n hermesAlertType: Number.isFinite(numeric)\n ? notifications.resolveAlertType(numeric)\n : envelope.ok\n ? AlertType.SUCCESS\n : AlertType.DANGER,\n message: envelope.message || (envelope.ok ? messages.graphql.done : messages.graphql.failed),\n hermesAlertClosable: true,\n });\n }\n }),\n );\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AASA;AACM,MAAO,oBAAqB,SAAQ,KAAK,CAAA;IAG7C,WAAA,CAAY,MAA0C,EAAE,OAAe,EAAA;QACrE,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,sBAAsB;AAClC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;;QAEpB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IACnD;AACD;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAE/D,SAAU,YAAY,CAAC,MAA0C,EAAA;AACrE,IAAA,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IACxD,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;IACpE,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;;AAE3C,IAAA,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACxD;AAEA;AACM,SAAU,MAAM,CAAI,QAA+C,EAAA;IACvE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC/C,QAAA,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACjF;IACA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAClC,QAAA,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,IAAI,oBAAoB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5G;IACA,OAAO,QAAQ,CAAC,IAAS;AAC3B;AAIA,SAAS,YAAY,CAAC,IAAa,EAAA;AACjC,IAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,EAAE;AAChD,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC,MAAM,CAC3D,CAAC,KAAK,KAAiD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CACzG;AACH;AAEA,MAAM,SAAS,GAAG,CAAC,KAA8B,KAC/C,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS;AAEhF;AACM,SAAU,WAAW,CAAC,IAAa,EAAA;IACvC,OAAO,YAAY,CAAC,IAAI;AACrB,SAAA,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC;SAC5D,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAI;AACtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAoB;QACjD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAG,KAAK,CAAC,SAAS,CAAmB,IAAI,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE;AACxG,IAAA,CAAC,CAAC;AACN;AAEA;AACM,SAAU,eAAe,CAC7B,IAAa,EACb,eAAA,GAA0B,oBAAoB,EAAE,CAAC,OAAO,CAAC,cAAc,EAAA;IAEvE,OAAO,YAAY,CAAC,IAAI;SACrB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAuC,CAAC;SAC9G,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM;QACxB,KAAK;AACL,QAAA,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;AACvB,QAAA,OAAO,EAAG,KAAK,CAAC,SAAS,CAA+B,IAAI,eAAe;AAC5E,KAAA,CAAC,CAAC;AACP;;AC1CA,MAAM,SAAS,GAAG,CAAC,OAA4B,KAC7C,OAAO,EAAE,eAAe,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,OAAO;AAE7F,MAAM,QAAQ,GAAG,CAAI,IAA0B,KAAO;AACpD,IAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;AACxH,IAAA,OAAO,IAAI;AACb,CAAC;AAED;AACM,SAAU,mBAAmB,CAAC,WAAmB,EAAA;AACrD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;;;;IAI5C,OAAO;AACL,QAAA,MAAM,KAAK,CAAC,QAAa,EAAE,SAAe,EAAE,OAA4B,EAAA;YACtE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC,KAAK,CAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC1H,YAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC;AACD,QAAA,MAAM,MAAM,CAAC,QAAa,EAAE,SAAe,EAAE,OAA4B,EAAA;YACvE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC,MAAM,CAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9H,YAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,SAAS,CAAC,QAAa,EAAE,SAAe,EAAA;YACtC,OAAO,MAAM,EAAE,CAAC,SAAS,CAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CACtE,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,EAC5B,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CACtD;QACH,CAAC;KACe;;AAEpB;;ACrCA;AACO,MAAM,cAAc,GAAG,IAAI,OAAO;AAEzC,MAAM,YAAY,GAAG,gBAAgB;AACrC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,MAAM,oBAAoB,GAAG,KAAK;AAClC,MAAM,YAAY,GAAG,MAAM;AAC3B;AACA,MAAM,aAAa,GAAG,MAAM;AAC5B,MAAM,aAAa,GAAG,KAAK;AAC3B,MAAM,YAAY,GAAG,MAAM;AAC3B,MAAM,gBAAgB,GAAG,CAAC;AAC1B,MAAM,kBAAkB,GAAG,CAAC;AAC5B;AACA;AACA,MAAM,eAAe,GAAG,IAAI;AAItB,SAAU,cAAc,CAAC,OAAuB,EAAA;IACpD,OAAO,kBAAkB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AACxD;AAEA,SAAS,YAAY,CAAC,OAAuB,EAAA;AAC3C,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACzC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC;AACvC,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrE,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAa,EAAE;IAC5B,MAAM,cAAc,GAAG,MAAK;AAC1B,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI;gBACF,MAAM,CAAC,SAAS,EAAE;YACpB;AAAE,YAAA,MAAM;;YAER;QACF;AACF,IAAA,CAAC;AAED,IAAA,IAAI,aAAa,GAAG,CAAC,QAAQ;IAC7B,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;AAChD,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,IAAI,GAAG,GAAG,aAAa,GAAG,oBAAoB;YAAE;QAChD,aAAa,GAAG,GAAG;AACnB,QAAA,cAAc,EAAE;AAClB,IAAA,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,SAAS,EAAE,OAAO,KAAI;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC7B,IAAI,KAAK,EAAE;YACT,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,EAAsD,MAAM;gBACzF,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC;AACzD,aAAA,CAAC,CAAC;QACL;AACA,QAAA,OAAO,OAAO,CAAC,SAAS,CAAC;AAC3B,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,aAAa,GAAG,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,IAAI;IAEnF,MAAM,YAAY,GAAG,MAAkB;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,MAAM,MAAM,GAAgB,EAAE,CAAC,YAAY,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,GAAG,KAAK,EAAE,EAAE;AACzF,QAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO;AAC/B,QAAA,IAAI,OAAO;AAAE,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO;QACxC,IAAI,MAAM,EAAE,QAAQ;AAAE,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,QAAQ;AAC1D,QAAA,OAAO,MAAM;AACf,IAAA,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE;AAC9B,IAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,IAAI,SAAS,GAAe,QAAQ;AAEpC,QAAA,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC;AACjD,YAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACpB,SAAS,GAAG,UAAU,CAAC,KAAK,CAC1B,CAAC,SAAS,KAAK,SAAS,CAAC,aAAa,KAAK,iBAAiB,CAAC,YAAY,EACzE,IAAI,aAAa,CAAC,MAAM,CAAC,EACzB,QAAQ,CACT;QACH;AAEA,QAAA,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG;YAC5B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YACrG,KAAK,EAAE,IAAI,aAAa,EAAE;AAC1B,YAAA,cAAc,EAAE;AACd,gBAAA,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;AAClC,gBAAA,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;AACxC,aAAA;SACF;IACH;AAEA,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,IAAA,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;AAC7B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC5B,IAAI,QAAQ,GAAkB,IAAI;QAClC,MAAM,YAAY,GAAG,MAAK;AACxB,YAAA,IAAI,GAAG,CAAC,eAAe,KAAK,QAAQ,EAAE;AACpC,gBAAA,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE;gBACrB;YACF;YACA,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;gBAAE;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;YAClC,QAAQ,GAAG,IAAI;YACf,IAAI,IAAI,IAAI,YAAY;AAAE,gBAAA,cAAc,EAAE;AAC5C,QAAA,CAAC;AACD,QAAA,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY,CAAC;AACtD,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IACvF;AACA,IAAA,UAAU,CAAC,SAAS,CAAC,MAAK;AACxB,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,OAAO,CAAC,OAAO;iBACZ,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE;AAC3B,iBAAA,KAAK,CAAC,MAAM,SAAS,CAAC;QAC3B;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,UAAU,CAAC,QAAyB,EAAE,gBAAmC,EAAA;IAChF,IAAI,aAAa,GAAG,KAAK;AACzB,IAAA,OAAO,YAAY,CAAC;QAClB,GAAG,EAAE,QAAQ,CAAC,EAAG;QACjB,gBAAgB;AAChB,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,aAAa,EAAE,QAAQ;AACvB,QAAA,WAAW,EAAE,MAAM,IAAI;AACvB,QAAA,SAAS,EAAE,OAAO;AAClB,QAAA,aAAa,EAAE,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC;AACpD,QAAA,EAAE,EAAE;YACF,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAI;gBACzC,IAAI,QAAQ,IAAI,aAAa;AAAE,oBAAA,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACxE,aAAa,GAAG,IAAI;YACtB,CAAC;AACF,SAAA;AACF,KAAA,CAAC;AACJ;AAEA;AACA,SAAS,OAAO,CAAC,OAAe,EAAA;AAC9B,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,GAAG,CAAC,IAAI,OAAO,CAAC;AACpE,IAAA,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC;AACxD,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC5D;AAEA;;;AAGG;AACH,SAAS,eAAe,CAAC,MAAwB,EAAA;AAC/C,IAAA,MAAM,eAAe,CAAA;iBACH,IAAA,CAAA,UAAU,GAAG,CAAC,CAAC;iBACf,IAAA,CAAA,IAAI,GAAG,CAAC,CAAC;iBACT,IAAA,CAAA,OAAO,GAAG,CAAC,CAAC;iBACZ,IAAA,CAAA,MAAM,GAAG,CAAC,CAAC;QAI3B,WAAA,CAAY,GAAiB,EAAE,SAA6B,EAAA;YAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;QACzC;AAEA,QAAA,IAAI,UAAU,GAAA;AACZ,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU;QAC9B;AAEA,QAAA,IAAI,QAAQ,GAAA;AACV,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ;QAC5B;QAEA,IAAI,MAAM,CAAC,OAA4B,EAAA;AACrC,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO;QAC7B;QAEA,IAAI,SAAS,CAAC,OAA+B,EAAA;AAC3C,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO;QAChC;QAEA,IAAI,OAAO,CAAC,OAA6B,EAAA;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;QAC9B;QAEA,IAAI,OAAO,CAAC,OAA6C,EAAA;AACvD,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;AACnB,kBAAE,CAAC,KAAiB,KAChB,OAAO,CAAC;AACN,oBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,eAAe;oBAClD,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACX;kBACjB,IAAI;QACV;AAEA,QAAA,IAAI,CAAC,IAAY,EAAA;AACf,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB;QAEA,KAAK,CAAC,IAAa,EAAE,MAAe,EAAA;YAClC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;QAChC;;AAEF,IAAA,OAAO,eAA8C;AACvD;AAEA,SAAS,aAAa,CAAC,OAAyD,EAAA;IAC9E,IAAI,OAAO,YAAY,WAAW;AAAE,QAAA,OAAO,OAAO;AAClD,IAAA,OAAO,IAAI,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;AACvC;AAEA,SAAS,MAAM,CAAC,MAAe,EAAA;AAC7B,IAAA,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;IACtD,MAAM,MAAM,GAAG,MAAiC;IAChD,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE;AAClD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;AACzB,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACzD,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI;QACxC;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,eAAe,CAAC,KAAc,EAAA;AACrC,IAAA,MAAM,KAAK,GAAG,qBAAqB,CAAC,EAAE,CAAC,KAAK;AAC1C,UAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;AACtD,UAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpE;AAEA,SAAS,iBAAiB,CAAC,aAAkC,EAAE,QAAuB,EAAA;IACpF,OAAO,IAAI,UAAU,CAAC,CAAC,SAAS,EAAE,OAAO,KAAI;AAC3C,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa;AACpC,QAAA,IAAI,IAAI,KAAK,iBAAiB,CAAC,YAAY,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;AACjG,YAAA,OAAO,OAAO,CAAC,SAAS,CAAC;QAC3B;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,KAAK,iBAAiB,CAAC,QAAQ;AACtD,QAAA,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAC5B,GAAG,CAAC,CAAC,MAAM,KAAI;YACb,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC/C,gBAAA,IAAI,QAAQ,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;oBACrG;gBACF;gBACA,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACvC,aAAa,CAAC,eAAe,CAAC;oBAC5B,KAAK,EAAE,QAAQ,CAAC,EAAE,GAAG,gBAAgB,GAAG,kBAAkB;AAC1D,oBAAA,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;AACtC,0BAAE,aAAa,CAAC,gBAAgB,CAAC,OAAO;0BACtC,QAAQ,CAAC;8BACP,SAAS,CAAC;8BACV,SAAS,CAAC,MAAM;oBACtB,OAAO,EAAE,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;AAC5F,oBAAA,mBAAmB,EAAE,IAAI;AAC1B,iBAAA,CAAC;YACJ;QACF,CAAC,CAAC,CACH;AACH,IAAA,CAAC,CAAC;AACJ;;ACvSA;;AAEG;;"}
1
+ {"version":3,"file":"trismegisto-spine-graphql.mjs","sources":["../../../projects/ui/graphql/src/envelope.ts","../../../projects/ui/graphql/src/graphql-client.ts","../../../projects/ui/graphql/src/provide-graphql.ts","../../../projects/ui/graphql/src/trismegisto-spine-graphql.ts"],"sourcesContent":["import { currentSpineMessages } from '@trismegisto/spine';\n\n/** Shape every root query/mutation field returns on the platform: business status travels in the payload. */\nexport interface GraphqlEnvelope<T> {\n readonly status?: number | string | null;\n readonly message?: string | null;\n readonly data?: T | null;\n}\n\n/** Business failure carried by an envelope. `status` is kept exactly as the backend sent it. */\nexport class GraphqlEnvelopeError extends Error {\n readonly status: number | string | null | undefined;\n\n constructor(status: number | string | null | undefined, message: string) {\n super(message);\n this.name = 'GraphqlEnvelopeError';\n this.status = status;\n // Keeps `instanceof` working when the output is down-levelled.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nconst FAILURE_WORDS = new Set(['error', 'failed', 'failure', 'fail']);\n\nexport function isEnvelopeOk(status: GraphqlEnvelope<unknown>['status']): boolean {\n if (status === null || status === undefined) return true;\n if (typeof status === 'number') return status >= 200 && status < 300;\n if (typeof status !== 'string') return true;\n // Numeric text is deliberately not parsed: only the failure words count as failure.\n return !FAILURE_WORDS.has(status.trim().toLowerCase());\n}\n\n/** Returns `data` of an ok envelope; throws `GraphqlEnvelopeError` for a missing or failed one. */\nexport function unwrap<T>(envelope: GraphqlEnvelope<T> | null | undefined): T {\n if (envelope === null || envelope === undefined) {\n throw new GraphqlEnvelopeError(null, currentSpineMessages().graphql.noResponse);\n }\n if (!isEnvelopeOk(envelope.status)) {\n throw new GraphqlEnvelopeError(envelope.status, envelope.message || currentSpineMessages().graphql.failed);\n }\n return envelope.data as T;\n}\n\ntype Fields = [string, Record<string, unknown>][];\n\nfunction objectFields(data: unknown): Fields {\n if (!data || typeof data !== 'object') return [];\n return Object.entries(data as Record<string, unknown>).filter(\n (entry): entry is [string, Record<string, unknown>] => typeof entry[1] === 'object' && entry[1] !== null,\n );\n}\n\nconst hasStatus = (value: Record<string, unknown>): boolean =>\n 'status' in value && value['status'] !== null && value['status'] !== undefined;\n\n/** First-level envelopes found in an operation's `data` (fields that carry both `status` and `message`). */\nexport function envelopesOf(data: unknown): { field: string; status: number | string; message: string; ok: boolean }[] {\n return objectFields(data)\n .filter(([, value]) => 'message' in value && hasStatus(value))\n .map(([field, value]) => {\n const status = value['status'] as number | string;\n return { field, status, message: (value['message'] as string | null) ?? '', ok: isEnvelopeOk(status) };\n });\n}\n\n/** First-level fields whose status is a failure; `message` is optional here. */\nexport function failedEnvelopes(\n data: unknown,\n fallbackMessage: string = currentSpineMessages().graphql.serviceFailure,\n): { field: string; status: unknown; message: string }[] {\n return objectFields(data)\n .filter(([, value]) => hasStatus(value) && !isEnvelopeOk(value['status'] as GraphqlEnvelope<unknown>['status']))\n .map(([field, value]) => ({\n field,\n status: value['status'],\n message: (value['message'] as string | null | undefined) || fallbackMessage,\n }));\n}\n","import { inject } from '@angular/core';\nimport type { DefaultContext, OperationVariables, TypedDocumentNode } from '@apollo/client/core';\nimport { Apollo } from 'apollo-angular';\nimport { Observable, filter, firstValueFrom, map } from 'rxjs';\n\nimport { currentSpineMessages } from '@trismegisto/spine';\nimport { GraphqlEnvelopeError } from './envelope';\n\n/** Opções de uma chamada. `silenceEnvelope`: a tela trata a falha sozinha, sem o toast automático. */\nexport interface GraphqlCallOptions {\n readonly silenceEnvelope?: boolean;\n readonly context?: DefaultContext;\n}\n\n/**\n * Cliente GraphQL de UM backend do app, tipado pelo documento gerado no codegen\n * (`TypedDocumentNode`): o retorno é o `data` da operação, sem `<any>`. Junto com o `unwrap` do\n * envelope, é o caminho padrão dos serviços de domínio:\n *\n * private readonly gql = injectGraphqlClient('main');\n * async listTeams() { return unwrap((await this.gql.query(ListTeamsDocument)).teams); }\n *\n * Erro de transporte/GraphQL (`errors[]`) rejeita a Promise (o `errorPolicy` é o padrão `none`);\n * resposta sem `data` também. Falha de NEGÓCIO vem no envelope e quem decide é o `unwrap`.\n */\nexport interface GraphqlClient {\n query<T, V extends OperationVariables = OperationVariables>(\n document: TypedDocumentNode<T, V>, variables?: V, options?: GraphqlCallOptions): Promise<T>;\n mutate<T, V extends OperationVariables = OperationVariables>(\n document: TypedDocumentNode<T, V>, variables?: V, options?: GraphqlCallOptions): Promise<T>;\n /** Eventos da subscription (sem envelope: evento não é resposta). Mensagem sem `data` é ignorada. */\n subscribe<T, V extends OperationVariables = OperationVariables>(\n document: TypedDocumentNode<T, V>, variables?: V): Observable<T>;\n}\n\nconst contextOf = (options?: GraphqlCallOptions): DefaultContext | undefined =>\n options?.silenceEnvelope ? { ...options.context, silenceEnvelope: true } : options?.context;\n\nconst required = <T>(data: T | null | undefined): T => {\n if (data === null || data === undefined) throw new GraphqlEnvelopeError(null, currentSpineMessages().graphql.noResponse);\n return data;\n};\n\n/** O `GraphqlClient` do backend `namedClient` (`environment.graphql.<chave>.namedClient`). Chamar em contexto de injeção. */\nexport function injectGraphqlClient(namedClient: string): GraphqlClient {\n const apollo = inject(Apollo);\n const client = () => apollo.use(namedClient);\n // Os genéricos do apollo-angular não casam 1:1 com os do TypedDocumentNode (variáveis opcionais):\n // o tipo público acima é o contrato; aqui dentro o cast é deliberado.\n /* eslint-disable @typescript-eslint/no-explicit-any */\n return {\n async query(document: any, variables?: any, options?: GraphqlCallOptions) {\n const result = await firstValueFrom(client().query<any, any>({ query: document, variables, context: contextOf(options) }));\n return required(result.data);\n },\n async mutate(document: any, variables?: any, options?: GraphqlCallOptions) {\n const result = await firstValueFrom(client().mutate<any, any>({ mutation: document, variables, context: contextOf(options) }));\n return required(result.data);\n },\n subscribe(document: any, variables?: any) {\n return client().subscribe<any, any>({ query: document, variables }).pipe(\n map((result) => result.data),\n filter((data) => data !== null && data !== undefined),\n );\n },\n } as GraphqlClient;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n","import { DOCUMENT, DestroyRef, PLATFORM_ID, Provider, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { HttpHeaders } from '@angular/common/http';\nimport { ApolloLink, CombinedGraphQLErrors, InMemoryCache } from '@apollo/client';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { NamedOptions, provideNamedApollo } from 'apollo-angular';\nimport { HttpBatchLink } from 'apollo-angular/http';\nimport { OperationTypeNode } from 'graphql';\nimport { Client, createClient } from 'graphql-ws';\nimport { Subject, tap } from 'rxjs';\n\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { SPINE_CONFIG, SPINE_MESSAGES, SpineMessages } from '@trismegisto/spine';\nimport { AlertType, NotificationService } from '@trismegisto/spine/notification';\nimport { LoggerService } from '@trismegisto/spine/routing';\n\nimport { envelopesOf } from './envelope';\n\nexport interface GraphqlEndpoint {\n // Mutable on purpose: the runtime environment rewrites `http`/`ws` before bootstrap.\n namedClient: string;\n http: string;\n ws?: string;\n}\n\nexport interface GraphqlOptions {\n readonly endpoints: Readonly<Record<string, GraphqlEndpoint>>;\n}\n\n/** Emits the `namedClient` whose socket came back after a drop (never on the first connection). */\nexport const wsReconnected$ = new Subject<string>();\n\nconst TOKEN_HEADER = 'x-access-token';\nconst AUTH_CODES = new Set([401, 4401, 4403]);\nconst AUTH_RESET_WINDOW_MS = 5_000;\nconst STALE_TAB_MS = 60_000;\n// Well under the ~60 s idle cut most reverse proxies apply.\nconst PING_EVERY_MS = 20_000;\nconst RETRY_BASE_MS = 1_000;\nconst RETRY_CAP_MS = 30_000;\nconst TOAST_OK_SECONDS = 4;\nconst TOAST_FAIL_SECONDS = 8;\n// graphql-ws gives up on some close codes no matter what `shouldRetry` says; reporting them as this\n// \"try again later\" code keeps the socket coming back.\nconst RETRYABLE_CLOSE = 1013;\n\ntype InitPayload = Record<string, unknown>;\n\nexport function provideGraphql(options: GraphqlOptions): Provider {\n return provideNamedApollo(() => buildClients(options));\n}\n\nfunction buildClients(options: GraphqlOptions): NamedOptions {\n const auth = inject(AuthorizationService);\n const messages = inject(SPINE_MESSAGES);\n const batchLink = inject(HttpBatchLink);\n const notifications = inject(NotificationService, { optional: true });\n const logger = inject(LoggerService, { optional: true });\n const config = inject(SPINE_CONFIG, { optional: true });\n const browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n const sockets: Client[] = [];\n const dropAllSockets = () => {\n for (const socket of sockets) {\n try {\n socket.terminate();\n } catch {\n // already dead: nothing to do\n }\n }\n };\n\n let lastAuthReset = -Infinity;\n const authErrorLink = new ErrorLink(({ error }) => {\n if (!carriesAuthCode(error)) return;\n const now = Date.now();\n if (now - lastAuthReset < AUTH_RESET_WINDOW_MS) return;\n lastAuthReset = now;\n dropAllSockets();\n });\n\n const tokenLink = new ApolloLink((operation, forward) => {\n const token = auth.getToken();\n if (token) {\n operation.setContext(({ headers }: { headers?: HttpHeaders | Record<string, string> }) => ({\n headers: toHttpHeaders(headers).set(TOKEN_HEADER, token),\n }));\n }\n return forward(operation);\n });\n\n const toastLink = notifications ? envelopeToastLink(notifications, messages) : null;\n\n const socketParams = (): InitPayload => {\n const token = auth.getToken();\n if (!token) return {};\n const params: InitPayload = { [TOKEN_HEADER]: token, headers: { [TOKEN_HEADER]: token } };\n const routeId = logger?.routeId;\n if (routeId) params['routeId'] = routeId;\n if (config?.clientId) params['clientId'] = config.clientId;\n return params;\n };\n\n const named: NamedOptions = {};\n for (const endpoint of Object.values(options.endpoints)) {\n const httpLink = ApolloLink.concat(tokenLink, batchLink.create({ uri: endpoint.http }));\n let transport: ApolloLink = httpLink;\n\n if (browser && endpoint.ws) {\n const socket = openSocket(endpoint, socketParams);\n sockets.push(socket);\n transport = ApolloLink.split(\n (operation) => operation.operationType === OperationTypeNode.SUBSCRIPTION,\n new GraphQLWsLink(socket),\n httpLink,\n );\n }\n\n named[endpoint.namedClient] = {\n link: ApolloLink.from(toastLink ? [authErrorLink, toastLink, transport] : [authErrorLink, transport]),\n cache: new InMemoryCache(),\n defaultOptions: {\n query: { fetchPolicy: 'no-cache' },\n watchQuery: { fetchPolicy: 'no-cache' },\n },\n };\n }\n\n const destroyRef = inject(DestroyRef);\n if (browser && sockets.length) {\n const doc = inject(DOCUMENT);\n let hiddenAt: number | null = null;\n const onVisibility = () => {\n if (doc.visibilityState === 'hidden') {\n hiddenAt = Date.now();\n return;\n }\n if (doc.visibilityState !== 'visible' || hiddenAt === null) return;\n const away = Date.now() - hiddenAt;\n hiddenAt = null;\n if (away >= STALE_TAB_MS) dropAllSockets();\n };\n doc.addEventListener('visibilitychange', onVisibility);\n destroyRef.onDestroy(() => doc.removeEventListener('visibilitychange', onVisibility));\n }\n destroyRef.onDestroy(() => {\n for (const socket of sockets) {\n Promise.resolve()\n .then(() => socket.dispose())\n .catch(() => undefined);\n }\n });\n\n return named;\n}\n\nfunction openSocket(endpoint: GraphqlEndpoint, connectionParams: () => InitPayload): Client {\n let everConnected = false;\n return createClient({\n url: endpoint.ws!,\n connectionParams,\n keepAlive: PING_EVERY_MS,\n retryAttempts: Infinity,\n shouldRetry: () => true,\n retryWait: backoff,\n webSocketImpl: forgivingSocket(globalThis.WebSocket),\n on: {\n connected: (_socket, _payload, wasRetry) => {\n if (wasRetry && everConnected) wsReconnected$.next(endpoint.namedClient);\n everConnected = true;\n },\n },\n });\n}\n\n/** Exponential wait with \"equal jitter\": half fixed, half random, capped. */\nfunction backoff(attempt: number): Promise<void> {\n const ceiling = Math.min(RETRY_CAP_MS, RETRY_BASE_MS * 2 ** attempt);\n const wait = ceiling / 2 + Math.random() * (ceiling / 2);\n return new Promise((resolve) => setTimeout(resolve, wait));\n}\n\n/**\n * Thin wrapper around the platform WebSocket that reports every abnormal close as retryable, so the\n * client keeps reconnecting even after closes graphql-ws would otherwise treat as final.\n */\nfunction forgivingSocket(Native: typeof WebSocket): typeof WebSocket {\n class ForgivingSocket {\n static readonly CONNECTING = 0;\n static readonly OPEN = 1;\n static readonly CLOSING = 2;\n static readonly CLOSED = 3;\n\n private readonly inner: WebSocket;\n\n constructor(url: string | URL, protocols?: string | string[]) {\n this.inner = new Native(url, protocols);\n }\n\n get readyState(): number {\n return this.inner.readyState;\n }\n\n get protocol(): string {\n return this.inner.protocol;\n }\n\n set onopen(handler: WebSocket['onopen']) {\n this.inner.onopen = handler;\n }\n\n set onmessage(handler: WebSocket['onmessage']) {\n this.inner.onmessage = handler;\n }\n\n set onerror(handler: WebSocket['onerror']) {\n this.inner.onerror = handler;\n }\n\n set onclose(handler: ((event: CloseEvent) => void) | null) {\n this.inner.onclose = handler\n ? (event: CloseEvent) =>\n handler({\n code: event.code === 1000 ? 1000 : RETRYABLE_CLOSE,\n reason: event.reason,\n wasClean: event.wasClean,\n } as CloseEvent)\n : null;\n }\n\n send(data: string): void {\n this.inner.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this.inner.close(code, reason);\n }\n }\n return ForgivingSocket as unknown as typeof WebSocket;\n}\n\nfunction toHttpHeaders(headers: HttpHeaders | Record<string, string> | undefined): HttpHeaders {\n if (headers instanceof HttpHeaders) return headers;\n return new HttpHeaders(headers ?? {});\n}\n\nfunction codeOf(source: unknown): number | null {\n if (!source || typeof source !== 'object') return null;\n const record = source as Record<string, unknown>;\n for (const key of ['code', 'status', 'statusCode']) {\n const value = record[key];\n if (value !== undefined && value !== null && value !== '') {\n const code = Number(value);\n if (Number.isFinite(code)) return code;\n }\n }\n return null;\n}\n\nfunction carriesAuthCode(error: unknown): boolean {\n const codes = CombinedGraphQLErrors.is(error)\n ? error.errors.map((entry) => codeOf(entry.extensions))\n : [codeOf(error)];\n return codes.some((code) => code !== null && AUTH_CODES.has(code));\n}\n\nfunction envelopeToastLink(notifications: NotificationService, messages: SpineMessages): ApolloLink {\n return new ApolloLink((operation, forward) => {\n const kind = operation.operationType;\n if (kind === OperationTypeNode.SUBSCRIPTION || operation.getContext()['silenceEnvelope'] === true) {\n return forward(operation);\n }\n const isMutation = kind === OperationTypeNode.MUTATION;\n return forward(operation).pipe(\n tap((result) => {\n for (const envelope of envelopesOf(result.data)) {\n if (envelope.ok ? !isMutation || !envelope.message : !isMutation && String(envelope.status) === '404') {\n continue;\n }\n const numeric = Number(envelope.status);\n notifications.addNotification({\n timer: envelope.ok ? TOAST_OK_SECONDS : TOAST_FAIL_SECONDS,\n hermesAlertType: Number.isFinite(numeric)\n ? notifications.resolveAlertType(numeric)\n : envelope.ok\n ? AlertType.SUCCESS\n : AlertType.DANGER,\n message: envelope.message || (envelope.ok ? messages.graphql.done : messages.graphql.failed),\n hermesAlertClosable: true,\n });\n }\n }),\n );\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AASA;AACM,MAAO,oBAAqB,SAAQ,KAAK,CAAA;IAG7C,WAAA,CAAY,MAA0C,EAAE,OAAe,EAAA;QACrE,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,sBAAsB;AAClC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;;QAEpB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IACnD;AACD;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAE/D,SAAU,YAAY,CAAC,MAA0C,EAAA;AACrE,IAAA,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IACxD,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;IACpE,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;;AAE3C,IAAA,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACxD;AAEA;AACM,SAAU,MAAM,CAAI,QAA+C,EAAA;IACvE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC/C,QAAA,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IACjF;IACA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAClC,QAAA,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,IAAI,oBAAoB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5G;IACA,OAAO,QAAQ,CAAC,IAAS;AAC3B;AAIA,SAAS,YAAY,CAAC,IAAa,EAAA;AACjC,IAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,EAAE;AAChD,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC,MAAM,CAC3D,CAAC,KAAK,KAAiD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CACzG;AACH;AAEA,MAAM,SAAS,GAAG,CAAC,KAA8B,KAC/C,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS;AAEhF;AACM,SAAU,WAAW,CAAC,IAAa,EAAA;IACvC,OAAO,YAAY,CAAC,IAAI;AACrB,SAAA,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC;SAC5D,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAI;AACtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAoB;QACjD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAG,KAAK,CAAC,SAAS,CAAmB,IAAI,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE;AACxG,IAAA,CAAC,CAAC;AACN;AAEA;AACM,SAAU,eAAe,CAC7B,IAAa,EACb,eAAA,GAA0B,oBAAoB,EAAE,CAAC,OAAO,CAAC,cAAc,EAAA;IAEvE,OAAO,YAAY,CAAC,IAAI;SACrB,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAuC,CAAC;SAC9G,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM;QACxB,KAAK;AACL,QAAA,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;AACvB,QAAA,OAAO,EAAG,KAAK,CAAC,SAAS,CAA+B,IAAI,eAAe;AAC5E,KAAA,CAAC,CAAC;AACP;;AC1CA,MAAM,SAAS,GAAG,CAAC,OAA4B,KAC7C,OAAO,EAAE,eAAe,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,OAAO;AAE7F,MAAM,QAAQ,GAAG,CAAI,IAA0B,KAAO;AACpD,IAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;AAAE,QAAA,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;AACxH,IAAA,OAAO,IAAI;AACb,CAAC;AAED;AACM,SAAU,mBAAmB,CAAC,WAAmB,EAAA;AACrD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;;;;IAI5C,OAAO;AACL,QAAA,MAAM,KAAK,CAAC,QAAa,EAAE,SAAe,EAAE,OAA4B,EAAA;YACtE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC,KAAK,CAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC1H,YAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC;AACD,QAAA,MAAM,MAAM,CAAC,QAAa,EAAE,SAAe,EAAE,OAA4B,EAAA;YACvE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC,MAAM,CAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9H,YAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,SAAS,CAAC,QAAa,EAAE,SAAe,EAAA;YACtC,OAAO,MAAM,EAAE,CAAC,SAAS,CAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CACtE,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,EAC5B,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CACtD;QACH,CAAC;KACe;;AAEpB;;ACrCA;AACO,MAAM,cAAc,GAAG,IAAI,OAAO;AAEzC,MAAM,YAAY,GAAG,gBAAgB;AACrC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,MAAM,oBAAoB,GAAG,KAAK;AAClC,MAAM,YAAY,GAAG,MAAM;AAC3B;AACA,MAAM,aAAa,GAAG,MAAM;AAC5B,MAAM,aAAa,GAAG,KAAK;AAC3B,MAAM,YAAY,GAAG,MAAM;AAC3B,MAAM,gBAAgB,GAAG,CAAC;AAC1B,MAAM,kBAAkB,GAAG,CAAC;AAC5B;AACA;AACA,MAAM,eAAe,GAAG,IAAI;AAItB,SAAU,cAAc,CAAC,OAAuB,EAAA;IACpD,OAAO,kBAAkB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AACxD;AAEA,SAAS,YAAY,CAAC,OAAuB,EAAA;AAC3C,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACzC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC;AACvC,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrE,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAa,EAAE;IAC5B,MAAM,cAAc,GAAG,MAAK;AAC1B,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,IAAI;gBACF,MAAM,CAAC,SAAS,EAAE;YACpB;AAAE,YAAA,MAAM;;YAER;QACF;AACF,IAAA,CAAC;AAED,IAAA,IAAI,aAAa,GAAG,CAAC,QAAQ;IAC7B,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;AAChD,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,IAAI,GAAG,GAAG,aAAa,GAAG,oBAAoB;YAAE;QAChD,aAAa,GAAG,GAAG;AACnB,QAAA,cAAc,EAAE;AAClB,IAAA,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,SAAS,EAAE,OAAO,KAAI;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC7B,IAAI,KAAK,EAAE;YACT,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,EAAsD,MAAM;gBACzF,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC;AACzD,aAAA,CAAC,CAAC;QACL;AACA,QAAA,OAAO,OAAO,CAAC,SAAS,CAAC;AAC3B,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,aAAa,GAAG,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,IAAI;IAEnF,MAAM,YAAY,GAAG,MAAkB;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,MAAM,MAAM,GAAgB,EAAE,CAAC,YAAY,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,GAAG,KAAK,EAAE,EAAE;AACzF,QAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO;AAC/B,QAAA,IAAI,OAAO;AAAE,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO;QACxC,IAAI,MAAM,EAAE,QAAQ;AAAE,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,QAAQ;AAC1D,QAAA,OAAO,MAAM;AACf,IAAA,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE;AAC9B,IAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,IAAI,SAAS,GAAe,QAAQ;AAEpC,QAAA,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC;AACjD,YAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACpB,SAAS,GAAG,UAAU,CAAC,KAAK,CAC1B,CAAC,SAAS,KAAK,SAAS,CAAC,aAAa,KAAK,iBAAiB,CAAC,YAAY,EACzE,IAAI,aAAa,CAAC,MAAM,CAAC,EACzB,QAAQ,CACT;QACH;AAEA,QAAA,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG;YAC5B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YACrG,KAAK,EAAE,IAAI,aAAa,EAAE;AAC1B,YAAA,cAAc,EAAE;AACd,gBAAA,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;AAClC,gBAAA,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;AACxC,aAAA;SACF;IACH;AAEA,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,IAAA,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;AAC7B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC5B,IAAI,QAAQ,GAAkB,IAAI;QAClC,MAAM,YAAY,GAAG,MAAK;AACxB,YAAA,IAAI,GAAG,CAAC,eAAe,KAAK,QAAQ,EAAE;AACpC,gBAAA,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE;gBACrB;YACF;YACA,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;gBAAE;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;YAClC,QAAQ,GAAG,IAAI;YACf,IAAI,IAAI,IAAI,YAAY;AAAE,gBAAA,cAAc,EAAE;AAC5C,QAAA,CAAC;AACD,QAAA,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY,CAAC;AACtD,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IACvF;AACA,IAAA,UAAU,CAAC,SAAS,CAAC,MAAK;AACxB,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,OAAO,CAAC,OAAO;iBACZ,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE;AAC3B,iBAAA,KAAK,CAAC,MAAM,SAAS,CAAC;QAC3B;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,UAAU,CAAC,QAAyB,EAAE,gBAAmC,EAAA;IAChF,IAAI,aAAa,GAAG,KAAK;AACzB,IAAA,OAAO,YAAY,CAAC;QAClB,GAAG,EAAE,QAAQ,CAAC,EAAG;QACjB,gBAAgB;AAChB,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,aAAa,EAAE,QAAQ;AACvB,QAAA,WAAW,EAAE,MAAM,IAAI;AACvB,QAAA,SAAS,EAAE,OAAO;AAClB,QAAA,aAAa,EAAE,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC;AACpD,QAAA,EAAE,EAAE;YACF,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAI;gBACzC,IAAI,QAAQ,IAAI,aAAa;AAAE,oBAAA,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACxE,aAAa,GAAG,IAAI;YACtB,CAAC;AACF,SAAA;AACF,KAAA,CAAC;AACJ;AAEA;AACA,SAAS,OAAO,CAAC,OAAe,EAAA;AAC9B,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,GAAG,CAAC,IAAI,OAAO,CAAC;AACpE,IAAA,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC;AACxD,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC5D;AAEA;;;AAGG;AACH,SAAS,eAAe,CAAC,MAAwB,EAAA;AAC/C,IAAA,MAAM,eAAe,CAAA;iBACH,IAAA,CAAA,UAAU,GAAG,CAAC,CAAC;iBACf,IAAA,CAAA,IAAI,GAAG,CAAC,CAAC;iBACT,IAAA,CAAA,OAAO,GAAG,CAAC,CAAC;iBACZ,IAAA,CAAA,MAAM,GAAG,CAAC,CAAC;QAI3B,WAAA,CAAY,GAAiB,EAAE,SAA6B,EAAA;YAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;QACzC;AAEA,QAAA,IAAI,UAAU,GAAA;AACZ,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU;QAC9B;AAEA,QAAA,IAAI,QAAQ,GAAA;AACV,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ;QAC5B;QAEA,IAAI,MAAM,CAAC,OAA4B,EAAA;AACrC,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO;QAC7B;QAEA,IAAI,SAAS,CAAC,OAA+B,EAAA;AAC3C,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO;QAChC;QAEA,IAAI,OAAO,CAAC,OAA6B,EAAA;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;QAC9B;QAEA,IAAI,OAAO,CAAC,OAA6C,EAAA;AACvD,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;AACnB,kBAAE,CAAC,KAAiB,KAChB,OAAO,CAAC;AACN,oBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,eAAe;oBAClD,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACX;kBACjB,IAAI;QACV;AAEA,QAAA,IAAI,CAAC,IAAY,EAAA;AACf,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB;QAEA,KAAK,CAAC,IAAa,EAAE,MAAe,EAAA;YAClC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;QAChC;;AAEF,IAAA,OAAO,eAA8C;AACvD;AAEA,SAAS,aAAa,CAAC,OAAyD,EAAA;IAC9E,IAAI,OAAO,YAAY,WAAW;AAAE,QAAA,OAAO,OAAO;AAClD,IAAA,OAAO,IAAI,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;AACvC;AAEA,SAAS,MAAM,CAAC,MAAe,EAAA;AAC7B,IAAA,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;IACtD,MAAM,MAAM,GAAG,MAAiC;IAChD,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE;AAClD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;AACzB,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACzD,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI;QACxC;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,eAAe,CAAC,KAAc,EAAA;AACrC,IAAA,MAAM,KAAK,GAAG,qBAAqB,CAAC,EAAE,CAAC,KAAK;AAC1C,UAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;AACtD,UAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpE;AAEA,SAAS,iBAAiB,CAAC,aAAkC,EAAE,QAAuB,EAAA;IACpF,OAAO,IAAI,UAAU,CAAC,CAAC,SAAS,EAAE,OAAO,KAAI;AAC3C,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa;AACpC,QAAA,IAAI,IAAI,KAAK,iBAAiB,CAAC,YAAY,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;AACjG,YAAA,OAAO,OAAO,CAAC,SAAS,CAAC;QAC3B;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,KAAK,iBAAiB,CAAC,QAAQ;AACtD,QAAA,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAC5B,GAAG,CAAC,CAAC,MAAM,KAAI;YACb,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC/C,gBAAA,IAAI,QAAQ,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;oBACrG;gBACF;gBACA,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACvC,aAAa,CAAC,eAAe,CAAC;oBAC5B,KAAK,EAAE,QAAQ,CAAC,EAAE,GAAG,gBAAgB,GAAG,kBAAkB;AAC1D,oBAAA,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;AACtC,0BAAE,aAAa,CAAC,gBAAgB,CAAC,OAAO;0BACtC,QAAQ,CAAC;8BACP,SAAS,CAAC;8BACV,SAAS,CAAC,MAAM;oBACtB,OAAO,EAAE,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;AAC5F,oBAAA,mBAAmB,EAAE,IAAI;AAC1B,iBAAA,CAAC;YACJ;QACF,CAAC,CAAC,CACH;AACH,IAAA,CAAC,CAAC;AACJ;;ACvSA;;AAEG;;"}
@@ -4,6 +4,7 @@ import * as i0 from '@angular/core';
4
4
  import { InjectionToken, inject, effect, PLATFORM_ID, Inject, Optional, Injectable, makeEnvironmentProviders, provideAppInitializer, NgZone, signal, computed, untracked, DestroyRef } from '@angular/core';
5
5
  import { HERMES_ICONS } from '@trismegisto/icons/catalog';
6
6
  import { extendThemeConfig, DEFAULT_THEME_CONFIG, normalizeTextScale, normalizeMotionPreference, mergeCatalog } from '@trismegisto/primitives';
7
+ export { loadRuntimeConfig } from '@trismegisto/primitives';
7
8
  import { AuthorizationService } from '@orfeu/angular/core';
8
9
 
9
10
  /** `router_id` da tela (nó 'page'), aceitando o argos antigo (que só mandava `route_id`, mesmo valor). */
@@ -980,11 +981,12 @@ function sameTrail(a, b) {
980
981
 
981
982
  /**
982
983
  * Ajusta o `environment` ao lugar onde o app está rodando — chamar no `main.ts`, ANTES do
983
- * `bootstrapApplication`. Antes cada app tinha a sua versão (só o Hefesto derivava as URLs); agora a
984
+ * `bootstrapApplication` e DEPOIS do `loadRuntimeConfig` (que traz o `config.json` do deploy: o que ele definir
985
+ * explicitamente não é derivado aqui). Antes cada app tinha a sua versão (só o Hefesto derivava as URLs); agora a
984
986
  * regra é uma só:
985
987
  *
986
988
  * - **Sempre:** `redirectUrl`/`postLogoutRedirectUri` = origem + prefixo atual. O servidor exige
987
- * `redirect_uri` absoluto e o app pode viver sob um prefixo (`/prometeu`); um valor fixo no
989
+ * `redirect_uri` absoluto e o app pode viver sob um prefixo (`/app-exemplo`); um valor fixo no
988
990
  * environment não bate com a rota real e o callback nunca casa.
989
991
  * - **Atrás do proxy (sem porta na URL):**
990
992
  * - `authority` = `<origem>/argos` — mesmo domínio da página, senão o cookie de sessão sai com o