asma-core-helpers 0.9.0 → 0.11.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.
@@ -16,13 +16,14 @@ export declare const EnvironmentsUrls1: (adcuris_subdomains?: string[]) => {
16
16
  SRV_WOPI: string;
17
17
  BUNJS_EDITOR: string;
18
18
  SRV_AO_DIRECTORY: string;
19
+ /**@deprecated not used anywhere no such service */
19
20
  SRV_WRAPPER: string;
20
21
  SRV_AUTH: string;
21
22
  ONLYOFFICE_DOCUMENT_SERVER: string;
22
23
  /**Use this in stead url is the same for all journal where relevant only use in api-assembly do not access those directly in code may be issues */
23
24
  /**@deprecated use SRV_WRAPPER instead */
24
25
  SRV_AO_WRAPPER_NEW: string;
25
- SRV_AO_WRAPPER: string;
26
+ HSR_AO_WRAPPER: string;
26
27
  DEVELOPMENT: boolean;
27
28
  ENVIRONMENT_TO_OPERATE: "dev" | "test" | "stage" | "prod" | undefined;
28
29
  DEBUG_ADCURIS: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"EnvironmentsUrls.d.ts","sourceRoot":"","sources":["../../src/helpers/EnvironmentsUrls.ts"],"names":[],"mappings":"AACA,OAAO,EAYH,gBAAgB,EAGnB,MAAM,kCAAkC,CAAA;AAEzC,eAAO,MAAM,iBAAiB,wBAAyB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;IA6BvD,mJAAmJ;IACnJ,yCAAyC;;;;;;;;;;;;;;;;;;;IAuBzC;;OAEG;;;;;CASV,CAAA"}
1
+ {"version":3,"file":"EnvironmentsUrls.d.ts","sourceRoot":"","sources":["../../src/helpers/EnvironmentsUrls.ts"],"names":[],"mappings":"AACA,OAAO,EAYH,gBAAgB,EAGnB,MAAM,kCAAkC,CAAA;AAEzC,eAAO,MAAM,iBAAiB,wBAAyB,MAAM,EAAE;;;;;;;;;;;;;;;;;IAwBvD,mDAAmD;;;;IAMnD,mJAAmJ;IACnJ,yCAAyC;;;;;;;;;;;;;;;;;;;IAuBzC;;OAEG;;;;;CASV,CAAA"}
@@ -29,6 +29,7 @@ export const EnvironmentsUrls1 = (adcuris_subdomains) => {
29
29
  SRV_WOPI: `${ac_prefix}/wopi`,
30
30
  BUNJS_EDITOR: `${ac_prefix}/api/editor`,
31
31
  SRV_AO_DIRECTORY: `${ac_prefix}/api-ao/directory`,
32
+ /**@deprecated not used anywhere no such service */
32
33
  SRV_WRAPPER: `${ac_prefix}/api/wrapper`,
33
34
  SRV_AUTH: '/api/auth',
34
35
  // FIXME replace with dynamic url
@@ -36,7 +37,7 @@ export const EnvironmentsUrls1 = (adcuris_subdomains) => {
36
37
  /**Use this in stead url is the same for all journal where relevant only use in api-assembly do not access those directly in code may be issues */
37
38
  /**@deprecated use SRV_WRAPPER instead */
38
39
  SRV_AO_WRAPPER_NEW: '/api/wrapper',
39
- SRV_AO_WRAPPER: '',
40
+ HSR_AO_WRAPPER: '/api/hsr-wrapper',
40
41
  DEVELOPMENT: realWindow.location.hostname.includes('dev.') || realWindow.location.hostname.includes('localhost'),
41
42
  ENVIRONMENT_TO_OPERATE: env_to_operate,
42
43
  DEBUG_ADCURIS: false,
@@ -1 +1 @@
1
- {"version":3,"file":"EnvironmentsUrls.js","sourceRoot":"","sources":["../../src/helpers/EnvironmentsUrls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EnvironmentsUrls.js","sourceRoot":"","sources":["../../src/helpers/EnvironmentsUrls.ts"],"names":[],"mappings":"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"}
@@ -11,8 +11,8 @@
11
11
  * 5. response: strip the `<slug>_` prefix from `__typename` values
12
12
  *
13
13
  * `prefixedTypes` is the exact set of names the engine prefixes for the tenant source —
14
- * generated at codegen time by adopus-hsr-wrapper/scripts/unwrap_client_schema.mjs
15
- * (adopus-prefixed-types.json) so the runtime never guesses which names carry the prefix.
14
+ * generated at codegen time by the `asma-gql-unwrap` bin (asma-core-toolchain)
15
+ * (adopus-prefixed-types.ts) so the runtime never guesses which names carry the prefix.
16
16
  *
17
17
  * Install it only on the SRV_AO_WRAPPER client and only when the resolved endpoint is the
18
18
  * consolidated engine (`/api/hsr-wrapper/`) — the per-tenant `srv_urls.ao_wrapper` flip then
@@ -0,0 +1,53 @@
1
+ /**
2
+ * createTadaBrowserClient — shared urql client factory for ASMA frontend apps.
3
+ *
4
+ * Wraps the urql core (fetchExchange + optional service-specific exchanges) with
5
+ * an authExchange that attaches a JWT Bearer token and refreshes on 401.
6
+ *
7
+ * URL resolution stays in the app (imports EnvConfigs from asma-helpers);
8
+ * this factory accepts the resolved URL so it has zero dependency on asma-helpers.
9
+ *
10
+ * @see asma-modules/_docs/frontend/operations/2026-07-11-23-00-runbook-graphql-schema-generation-secrets.md
11
+ */
12
+ import { type Client, type ClientOptions, type Exchange } from '@urql/core';
13
+ /**
14
+ * Contributes service-specific exchanges (e.g. the Adopus per-tenant namespace
15
+ * rewrite) without baking that knowledge into the generic factory. Called once
16
+ * per client build with the resolved endpoint; returned exchanges are inserted
17
+ * just before `fetchExchange` (and after `authExchange`).
18
+ */
19
+ export type ResolveExchanges = (ctx: {
20
+ /** The fully-resolved GraphQL endpoint URL. */
21
+ url: string;
22
+ /** Resolves the current JWT (may be stale — the auth exchange handles refresh). */
23
+ getJwt: () => Promise<string | undefined>;
24
+ }) => Exchange[] | Promise<Exchange[]>;
25
+ export interface CreateTadaBrowserClientOptions {
26
+ /** Fully-resolved GraphQL endpoint URL (caller resolves via EnvConfigs / srv_urls). */
27
+ url: string;
28
+ /** Resolves the current JWT. Typically `getCachedJwt` from asma-core-react. */
29
+ getJwt: () => Promise<string | undefined>;
30
+ /** Returns true when the cached JWT is still valid. Typically `isJwtValid` from asma-core-react. */
31
+ isJwtValid: () => boolean;
32
+ /** Optional service-specific exchanges injected before fetchExchange. */
33
+ resolveExchanges?: ResolveExchanges;
34
+ /** Passthrough to urql ClientOptions (url is overridden by the `url` param above). */
35
+ clientOptions?: Partial<ClientOptions>;
36
+ }
37
+ /**
38
+ * Creates a configured, authenticated urql Client for an ASMA frontend app.
39
+ *
40
+ * Exchange order (first = outermost):
41
+ * 1. authExchange — attach Bearer token, refresh on 401
42
+ * 2. resolveExchanges — optional service-specific transforms (e.g. namespace)
43
+ * 3. fetchExchange — standard HTTP fetch
44
+ * 4. caller-provided — appended via clientOptions.exchanges (end of pipeline)
45
+ */
46
+ export declare function createTadaBrowserClient({ url, getJwt, isJwtValid, resolveExchanges, clientOptions, }: CreateTadaBrowserClientOptions): {
47
+ getClient: () => Promise<Client>;
48
+ createClient: (opts?: {
49
+ clientOptions?: Partial<ClientOptions>;
50
+ anonymous?: boolean;
51
+ }) => Promise<Client>;
52
+ };
53
+ //# sourceMappingURL=createTadaBrowserClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTadaBrowserClient.d.ts","sourceRoot":"","sources":["../../src/helpers/createTadaBrowserClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACH,KAAK,MAAM,EACX,KAAK,aAAa,EAElB,KAAK,QAAQ,EAEhB,MAAM,YAAY,CAAA;AAGnB;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;IACjC,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,mFAAmF;IACnF,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAC5C,KAAK,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;AAEtC,MAAM,WAAW,8BAA8B;IAC3C,uFAAuF;IACvF,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACzC,oGAAoG;IACpG,UAAU,EAAE,MAAM,OAAO,CAAA;IACzB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,sFAAsF;IACtF,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,GAAG,EACH,MAAM,EACN,UAAU,EACV,gBAAgB,EAChB,aAAa,GAChB,EAAE,8BAA8B,GAAG;IAAE,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,YAAY,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAiElL"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * createTadaBrowserClient — shared urql client factory for ASMA frontend apps.
3
+ *
4
+ * Wraps the urql core (fetchExchange + optional service-specific exchanges) with
5
+ * an authExchange that attaches a JWT Bearer token and refreshes on 401.
6
+ *
7
+ * URL resolution stays in the app (imports EnvConfigs from asma-helpers);
8
+ * this factory accepts the resolved URL so it has zero dependency on asma-helpers.
9
+ *
10
+ * @see asma-modules/_docs/frontend/operations/2026-07-11-23-00-runbook-graphql-schema-generation-secrets.md
11
+ */
12
+ import { createClient, fetchExchange, } from '@urql/core';
13
+ import { authExchange } from '@urql/exchange-auth';
14
+ /**
15
+ * Creates a configured, authenticated urql Client for an ASMA frontend app.
16
+ *
17
+ * Exchange order (first = outermost):
18
+ * 1. authExchange — attach Bearer token, refresh on 401
19
+ * 2. resolveExchanges — optional service-specific transforms (e.g. namespace)
20
+ * 3. fetchExchange — standard HTTP fetch
21
+ * 4. caller-provided — appended via clientOptions.exchanges (end of pipeline)
22
+ */
23
+ export function createTadaBrowserClient({ url, getJwt, isJwtValid, resolveExchanges, clientOptions, }) {
24
+ let tadaClient;
25
+ const getClient = async () => {
26
+ tadaClient = await buildClient({ clientOptions });
27
+ return tadaClient;
28
+ };
29
+ async function buildClient(opts) {
30
+ const _clientOptions = { ...(opts?.clientOptions ?? {}) };
31
+ const anonymous = opts?.anonymous;
32
+ _clientOptions.url = url;
33
+ _clientOptions.preferGetMethod = false;
34
+ _clientOptions.requestPolicy = 'cache-and-network';
35
+ // Start with fetchExchange + caller-provided exchanges
36
+ _clientOptions.exchanges = [
37
+ fetchExchange,
38
+ ...(_clientOptions.exchanges || []),
39
+ ];
40
+ // Inject service-specific exchanges before fetchExchange
41
+ if (resolveExchanges) {
42
+ const extra = await resolveExchanges({
43
+ getJwt,
44
+ url,
45
+ });
46
+ if (extra.length) {
47
+ _clientOptions.exchanges.unshift(...extra);
48
+ }
49
+ }
50
+ // authExchange is outermost (first to receive the operation)
51
+ if (!anonymous) {
52
+ _clientOptions.exchanges.unshift(authExchange(async (utils) => {
53
+ const token = await getJwt();
54
+ return {
55
+ addAuthToOperation(operation) {
56
+ return utils.appendHeaders(operation, {
57
+ Authorization: `Bearer ${token}`,
58
+ });
59
+ },
60
+ didAuthError(error) {
61
+ return error.response.status === 401;
62
+ },
63
+ async refreshAuth() {
64
+ tadaClient = await buildClient({ clientOptions: opts?.clientOptions });
65
+ },
66
+ willAuthError() {
67
+ return !isJwtValid();
68
+ },
69
+ };
70
+ }));
71
+ }
72
+ return createClient(_clientOptions);
73
+ }
74
+ return { getClient, createClient: buildClient };
75
+ }
76
+ //# sourceMappingURL=createTadaBrowserClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTadaBrowserClient.js","sourceRoot":"","sources":["../../src/helpers/createTadaBrowserClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAGH,YAAY,EAEZ,aAAa,GAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA4BlD;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACpC,GAAG,EACH,MAAM,EACN,UAAU,EACV,gBAAgB,EAChB,aAAa,GACgB;IAC7B,IAAI,UAA8B,CAAA;IAElC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QACzB,UAAU,GAAG,MAAM,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QACjD,OAAO,UAAU,CAAA;IACrB,CAAC,CAAA;IAED,KAAK,UAAU,WAAW,CAAC,IAG1B;QACG,MAAM,cAAc,GAA2B,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC,EAAE,CAAA;QACjF,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,CAAA;QAEjC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAA;QACxB,cAAc,CAAC,eAAe,GAAG,KAAK,CAAA;QACtC,cAAc,CAAC,aAAa,GAAG,mBAAmB,CAAA;QAElD,uDAAuD;QACvD,cAAc,CAAC,SAAS,GAAG;YACvB,aAAa;YACb,GAAG,CAAC,cAAc,CAAC,SAAS,IAAI,EAAE,CAAC;SACtC,CAAA;QAED,yDAAyD;QACzD,IAAI,gBAAgB,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC;gBACjC,MAAM;gBACN,GAAG;aACN,CAAC,CAAA;YACF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACf,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAA;YAC9C,CAAC;QACL,CAAC;QAED,6DAA6D;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,cAAc,CAAC,SAAS,CAAC,OAAO,CAC5B,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACzB,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAA;gBAC5B,OAAO;oBACH,kBAAkB,CAAC,SAAS;wBACxB,OAAO,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE;4BAClC,aAAa,EAAE,UAAU,KAAK,EAAE;yBACnC,CAAC,CAAA;oBACN,CAAC;oBACD,YAAY,CAAC,KAAK;wBACd,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAA;oBACxC,CAAC;oBACD,KAAK,CAAC,WAAW;wBACb,UAAU,GAAG,MAAM,WAAW,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;oBAC1E,CAAC;oBACD,aAAa;wBACT,OAAO,CAAC,UAAU,EAAE,CAAA;oBACxB,CAAC;iBACJ,CAAA;YACL,CAAC,CAAC,CACL,CAAA;QACL,CAAC;QAED,OAAO,YAAY,CAAC,cAA+B,CAAC,CAAA;IACxD,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,CAAA;AACnD,CAAC"}
@@ -51,7 +51,7 @@ export declare function generateEnvConfigsBindings<T extends IBasicEnv, K extend
51
51
  SRV_AUTH: string;
52
52
  ONLYOFFICE_DOCUMENT_SERVER: string;
53
53
  SRV_AO_WRAPPER_NEW: string;
54
- SRV_AO_WRAPPER: string;
54
+ HSR_AO_WRAPPER: string;
55
55
  DEVELOPMENT: boolean;
56
56
  ENVIRONMENT_TO_OPERATE: "dev" | "test" | "stage" | "prod" | undefined;
57
57
  DEBUG_ADCURIS: boolean;
@@ -72,7 +72,7 @@ export declare function generateEnvConfigsBindings<T extends IBasicEnv, K extend
72
72
  ADOPUS_ACCESS_URL: string;
73
73
  NBID_ENV: string | null;
74
74
  OPENREPLAY_INGEST_POINT: string;
75
- }, K extends "SRV_DIRECTORY" | "SRV_CALENDAR" | "SRV_PROXY_OLD" | "SRV_PROXY_OLD_HELSE" | "SRV_PROXY_OLD_WEB" | "SRV_STORAGE" | "SRV_CHAT" | "SRV_CONNECTOR" | "SRV_ARTIFACT" | "SRV_ADVOCA" | "SRV_PROXY" | "SRV_NOTIFICATION" | "SRV_ACTIVITIES" | "SRV_WOPI" | "BUNJS_EDITOR" | "SRV_AO_DIRECTORY" | "SRV_WRAPPER" | "SRV_AUTH" | "ONLYOFFICE_DOCUMENT_SERVER" | "SRV_AO_WRAPPER_NEW" | "SRV_AO_WRAPPER" | "DEVELOPMENT" | "ENVIRONMENT_TO_OPERATE" | "DEBUG_ADCURIS" | "SIGNICAT_SIGN_URL" | "CRIIPTO_SIGN_URL" | "CRIIPTO_SIGN_URL_NONPROD" | "INFO_ADVOCA" | "DEVEXPRESS" | "ADVOCA_ACCESS_URL" | "AUTO_SAVE_INTERVAL_IN_MINUTES" | "ENV" | "API_KEY_GEOCODE" | "AZURE_APP_ID" | "AZURE_APP_REDIRECT_URI" | "OPENREPLAY_PROJECT_KEY" | "CDN_ASMA_BASE_URL" | "NBID_REDIRECT_URL" | "ADOPUS_ACCESS_URL" | "NBID_ENV" | "OPENREPLAY_INGEST_POINT" | (keyof T & string) ? K : never> & S;
75
+ }, K extends "SRV_DIRECTORY" | "SRV_CALENDAR" | "SRV_PROXY_OLD" | "SRV_PROXY_OLD_HELSE" | "SRV_PROXY_OLD_WEB" | "SRV_STORAGE" | "SRV_CHAT" | "SRV_CONNECTOR" | "SRV_ARTIFACT" | "SRV_ADVOCA" | "SRV_PROXY" | "SRV_NOTIFICATION" | "SRV_ACTIVITIES" | "SRV_WOPI" | "BUNJS_EDITOR" | "SRV_AO_DIRECTORY" | "SRV_WRAPPER" | "SRV_AUTH" | "ONLYOFFICE_DOCUMENT_SERVER" | "SRV_AO_WRAPPER_NEW" | "HSR_AO_WRAPPER" | "DEVELOPMENT" | "ENVIRONMENT_TO_OPERATE" | "DEBUG_ADCURIS" | "SIGNICAT_SIGN_URL" | "CRIIPTO_SIGN_URL" | "CRIIPTO_SIGN_URL_NONPROD" | "INFO_ADVOCA" | "DEVEXPRESS" | "ADVOCA_ACCESS_URL" | "AUTO_SAVE_INTERVAL_IN_MINUTES" | "ENV" | "API_KEY_GEOCODE" | "AZURE_APP_ID" | "AZURE_APP_REDIRECT_URI" | "OPENREPLAY_PROJECT_KEY" | "CDN_ASMA_BASE_URL" | "NBID_REDIRECT_URL" | "ADOPUS_ACCESS_URL" | "NBID_ENV" | "OPENREPLAY_INGEST_POINT" | (keyof T & string) ? K : never> & S;
76
76
  };
77
77
  export {};
78
78
  //# sourceMappingURL=generateEnvConfigsBindings.d.ts.map
@@ -0,0 +1,4 @@
1
+ export { adopusNamespaceExchange, adopusSlugFromJwt, denamespaceData, namespaceDocument } from './adopusNamespaceExchange.js';
2
+ export { createTadaBrowserClient } from './createTadaBrowserClient.js';
3
+ export type { CreateTadaBrowserClientOptions, ResolveExchanges } from './createTadaBrowserClient.js';
4
+ //# sourceMappingURL=urql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urql.d.ts","sourceRoot":"","sources":["../../src/helpers/urql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAC7H,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,YAAY,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { adopusNamespaceExchange, adopusSlugFromJwt, denamespaceData, namespaceDocument } from './adopusNamespaceExchange.js';
2
+ export { createTadaBrowserClient } from './createTadaBrowserClient.js';
3
+ //# sourceMappingURL=urql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urql.js","sourceRoot":"","sources":["../../src/helpers/urql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAC7H,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA"}
package/lib/index.d.ts CHANGED
@@ -39,4 +39,6 @@ export * from './helpers/isUUID.js';
39
39
  export * from './helpers/JSONToBase64EncodeDecode.js';
40
40
  export * from './helpers/getActivityStatus.js';
41
41
  export * from './helpers/stringToKeyValueMap.js';
42
+ export { createTadaBrowserClient } from './helpers/createTadaBrowserClient.js';
43
+ export type { CreateTadaBrowserClientOptions, ResolveExchanges } from './helpers/createTadaBrowserClient.js';
42
44
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA;AAChD,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,mCAAmC,CAAA;AACjD,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mDAAmD,CAAA;AACjE,cAAc,iCAAiC,CAAA;AAE/C,cAAc,kCAAkC,CAAA;AAChD,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,wCAAwC,CAAA;AACtD,cAAc,sCAAsC,CAAA;AACpD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,2BAA2B,CAAA;AACzC,cAAc,2CAA2C,CAAA;AACzD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2CAA2C,CAAA;AACzD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,+BAA+B,CAAA;AAE7C,cAAc,qBAAqB,CAAA;AACnC,cAAc,kCAAkC,CAAA;AAEhD,cAAc,oBAAoB,CAAA;AAElC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,uBAAuB,CAAA;AAErC,cAAc,oBAAoB,CAAA;AAElC,cAAc,8CAA8C,CAAA;AAC5D,cAAc,+CAA+C,CAAA;AAC7D,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,uCAAuC,CAAA;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA;AAChD,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,mCAAmC,CAAA;AACjD,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mDAAmD,CAAA;AACjE,cAAc,iCAAiC,CAAA;AAE/C,cAAc,kCAAkC,CAAA;AAChD,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,wCAAwC,CAAA;AACtD,cAAc,sCAAsC,CAAA;AACpD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,2BAA2B,CAAA;AACzC,cAAc,2CAA2C,CAAA;AACzD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2CAA2C,CAAA;AACzD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,+BAA+B,CAAA;AAE7C,cAAc,qBAAqB,CAAA;AACnC,cAAc,kCAAkC,CAAA;AAEhD,cAAc,oBAAoB,CAAA;AAElC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,uBAAuB,CAAA;AAErC,cAAc,oBAAoB,CAAA;AAElC,cAAc,8CAA8C,CAAA;AAC5D,cAAc,+CAA+C,CAAA;AAC7D,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,uCAAuC,CAAA;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA;AAEhD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,YAAY,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA"}
package/lib/index.js CHANGED
@@ -40,4 +40,5 @@ export * from './helpers/isUUID.js';
40
40
  export * from './helpers/JSONToBase64EncodeDecode.js';
41
41
  export * from './helpers/getActivityStatus.js';
42
42
  export * from './helpers/stringToKeyValueMap.js';
43
+ export { createTadaBrowserClient } from './helpers/createTadaBrowserClient.js';
43
44
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA;AAChD,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,mCAAmC,CAAA;AACjD,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mDAAmD,CAAA;AACjE,cAAc,iCAAiC,CAAA;AAE/C,cAAc,kCAAkC,CAAA;AAChD,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,wCAAwC,CAAA;AACtD,cAAc,sCAAsC,CAAA;AACpD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,2BAA2B,CAAA;AACzC,cAAc,2CAA2C,CAAA;AACzD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2CAA2C,CAAA;AACzD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,+BAA+B,CAAA;AAC7C,gDAAgD;AAChD,cAAc,qBAAqB,CAAA;AACnC,cAAc,kCAAkC,CAAA;AAEhD,cAAc,oBAAoB,CAAA;AAElC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,uBAAuB,CAAA;AAErC,cAAc,oBAAoB,CAAA;AAElC,cAAc,8CAA8C,CAAA;AAC5D,cAAc,+CAA+C,CAAA;AAC7D,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,uCAAuC,CAAA;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA;AAChD,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,mCAAmC,CAAA;AACjD,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mDAAmD,CAAA;AACjE,cAAc,iCAAiC,CAAA;AAE/C,cAAc,kCAAkC,CAAA;AAChD,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,wCAAwC,CAAA;AACtD,cAAc,sCAAsC,CAAA;AACpD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,2BAA2B,CAAA;AACzC,cAAc,2CAA2C,CAAA;AACzD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2CAA2C,CAAA;AACzD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,+BAA+B,CAAA;AAC7C,gDAAgD;AAChD,cAAc,qBAAqB,CAAA;AACnC,cAAc,kCAAkC,CAAA;AAEhD,cAAc,oBAAoB,CAAA;AAElC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,uBAAuB,CAAA;AAErC,cAAc,oBAAoB,CAAA;AAElC,cAAc,8CAA8C,CAAA;AAC5D,cAAc,+CAA+C,CAAA;AAC7D,cAAc,mCAAmC,CAAA;AACjD,cAAc,qBAAqB,CAAA;AACnC,cAAc,uCAAuC,CAAA;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA;AAEhD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asma-core-helpers",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Core helper utilities for ASMA applications",
5
5
  "files": [
6
6
  "lib/**/*",
@@ -12,8 +12,8 @@
12
12
  ".": "./lib/index.js",
13
13
  "./lib": "./lib/index.js",
14
14
  "./urql": {
15
- "types": "./lib/helpers/adopusNamespaceExchange.d.ts",
16
- "default": "./lib/helpers/adopusNamespaceExchange.js"
15
+ "types": "./lib/helpers/urql.d.ts",
16
+ "default": "./lib/helpers/urql.js"
17
17
  }
18
18
  },
19
19
  "scripts": {
@@ -29,12 +29,16 @@
29
29
  "license": "MIT",
30
30
  "peerDependencies": {
31
31
  "@urql/core": ">=4",
32
+ "@urql/exchange-auth": ">=3",
32
33
  "wonka": ">=6"
33
34
  },
34
35
  "peerDependenciesMeta": {
35
36
  "@urql/core": {
36
37
  "optional": true
37
38
  },
39
+ "@urql/exchange-auth": {
40
+ "optional": true
41
+ },
38
42
  "wonka": {
39
43
  "optional": true
40
44
  }
@@ -42,6 +46,7 @@
42
46
  "devDependencies": {
43
47
  "@openreplay/tracker": "^16.4.10",
44
48
  "@urql/core": "^6.0.3",
49
+ "@urql/exchange-auth": "^3.0.0",
45
50
  "asma-qiankun-react-loader": "^0.8.2",
46
51
  "asma-types": "^2.8.0",
47
52
  "history": "^5.3.0",
@@ -40,6 +40,7 @@ export const EnvironmentsUrls1 = (adcuris_subdomains?: string[]) => {
40
40
  SRV_WOPI: `${ac_prefix}/wopi`,
41
41
  BUNJS_EDITOR: `${ac_prefix}/api/editor`,
42
42
  SRV_AO_DIRECTORY: `${ac_prefix}/api-ao/directory`,
43
+ /**@deprecated not used anywhere no such service */
43
44
  SRV_WRAPPER: `${ac_prefix}/api/wrapper`,
44
45
  SRV_AUTH: '/api/auth',
45
46
  // FIXME replace with dynamic url
@@ -49,7 +50,7 @@ export const EnvironmentsUrls1 = (adcuris_subdomains?: string[]) => {
49
50
  /**@deprecated use SRV_WRAPPER instead */
50
51
  SRV_AO_WRAPPER_NEW: '/api/wrapper',
51
52
 
52
- SRV_AO_WRAPPER: '',
53
+ HSR_AO_WRAPPER: '/api/hsr-wrapper',
53
54
  DEVELOPMENT:
54
55
  realWindow.location.hostname.includes('dev.') || realWindow.location.hostname.includes('localhost'),
55
56
  ENVIRONMENT_TO_OPERATE: env_to_operate,
@@ -11,8 +11,8 @@
11
11
  * 5. response: strip the `<slug>_` prefix from `__typename` values
12
12
  *
13
13
  * `prefixedTypes` is the exact set of names the engine prefixes for the tenant source —
14
- * generated at codegen time by adopus-hsr-wrapper/scripts/unwrap_client_schema.mjs
15
- * (adopus-prefixed-types.json) so the runtime never guesses which names carry the prefix.
14
+ * generated at codegen time by the `asma-gql-unwrap` bin (asma-core-toolchain)
15
+ * (adopus-prefixed-types.ts) so the runtime never guesses which names carry the prefix.
16
16
  *
17
17
  * Install it only on the SRV_AO_WRAPPER client and only when the resolved endpoint is the
18
18
  * consolidated engine (`/api/hsr-wrapper/`) — the per-tenant `srv_urls.ao_wrapper` flip then
@@ -0,0 +1,127 @@
1
+ /**
2
+ * createTadaBrowserClient — shared urql client factory for ASMA frontend apps.
3
+ *
4
+ * Wraps the urql core (fetchExchange + optional service-specific exchanges) with
5
+ * an authExchange that attaches a JWT Bearer token and refreshes on 401.
6
+ *
7
+ * URL resolution stays in the app (imports EnvConfigs from asma-helpers);
8
+ * this factory accepts the resolved URL so it has zero dependency on asma-helpers.
9
+ *
10
+ * @see asma-modules/_docs/frontend/operations/2026-07-11-23-00-runbook-graphql-schema-generation-secrets.md
11
+ */
12
+ import {
13
+ type Client,
14
+ type ClientOptions,
15
+ createClient,
16
+ type Exchange,
17
+ fetchExchange,
18
+ } from '@urql/core'
19
+ import { authExchange } from '@urql/exchange-auth'
20
+
21
+ /**
22
+ * Contributes service-specific exchanges (e.g. the Adopus per-tenant namespace
23
+ * rewrite) without baking that knowledge into the generic factory. Called once
24
+ * per client build with the resolved endpoint; returned exchanges are inserted
25
+ * just before `fetchExchange` (and after `authExchange`).
26
+ */
27
+ export type ResolveExchanges = (ctx: {
28
+ /** The fully-resolved GraphQL endpoint URL. */
29
+ url: string
30
+ /** Resolves the current JWT (may be stale — the auth exchange handles refresh). */
31
+ getJwt: () => Promise<string | undefined>
32
+ }) => Exchange[] | Promise<Exchange[]>
33
+
34
+ export interface CreateTadaBrowserClientOptions {
35
+ /** Fully-resolved GraphQL endpoint URL (caller resolves via EnvConfigs / srv_urls). */
36
+ url: string
37
+ /** Resolves the current JWT. Typically `getCachedJwt` from asma-core-react. */
38
+ getJwt: () => Promise<string | undefined>
39
+ /** Returns true when the cached JWT is still valid. Typically `isJwtValid` from asma-core-react. */
40
+ isJwtValid: () => boolean
41
+ /** Optional service-specific exchanges injected before fetchExchange. */
42
+ resolveExchanges?: ResolveExchanges
43
+ /** Passthrough to urql ClientOptions (url is overridden by the `url` param above). */
44
+ clientOptions?: Partial<ClientOptions>
45
+ }
46
+
47
+ /**
48
+ * Creates a configured, authenticated urql Client for an ASMA frontend app.
49
+ *
50
+ * Exchange order (first = outermost):
51
+ * 1. authExchange — attach Bearer token, refresh on 401
52
+ * 2. resolveExchanges — optional service-specific transforms (e.g. namespace)
53
+ * 3. fetchExchange — standard HTTP fetch
54
+ * 4. caller-provided — appended via clientOptions.exchanges (end of pipeline)
55
+ */
56
+ export function createTadaBrowserClient({
57
+ url,
58
+ getJwt,
59
+ isJwtValid,
60
+ resolveExchanges,
61
+ clientOptions,
62
+ }: CreateTadaBrowserClientOptions): { getClient: () => Promise<Client>; createClient: (opts?: { clientOptions?: Partial<ClientOptions>; anonymous?: boolean }) => Promise<Client> } {
63
+ let tadaClient: Client | undefined
64
+
65
+ const getClient = async () => {
66
+ tadaClient = await buildClient({ clientOptions })
67
+ return tadaClient
68
+ }
69
+
70
+ async function buildClient(opts?: {
71
+ clientOptions?: Partial<ClientOptions>
72
+ anonymous?: boolean
73
+ }) {
74
+ const _clientOptions: Partial<ClientOptions> = { ...(opts?.clientOptions ?? {}) }
75
+ const anonymous = opts?.anonymous
76
+
77
+ _clientOptions.url = url
78
+ _clientOptions.preferGetMethod = false
79
+ _clientOptions.requestPolicy = 'cache-and-network'
80
+
81
+ // Start with fetchExchange + caller-provided exchanges
82
+ _clientOptions.exchanges = [
83
+ fetchExchange,
84
+ ...(_clientOptions.exchanges || []),
85
+ ]
86
+
87
+ // Inject service-specific exchanges before fetchExchange
88
+ if (resolveExchanges) {
89
+ const extra = await resolveExchanges({
90
+ getJwt,
91
+ url,
92
+ })
93
+ if (extra.length) {
94
+ _clientOptions.exchanges.unshift(...extra)
95
+ }
96
+ }
97
+
98
+ // authExchange is outermost (first to receive the operation)
99
+ if (!anonymous) {
100
+ _clientOptions.exchanges.unshift(
101
+ authExchange(async (utils) => {
102
+ const token = await getJwt()
103
+ return {
104
+ addAuthToOperation(operation) {
105
+ return utils.appendHeaders(operation, {
106
+ Authorization: `Bearer ${token}`,
107
+ })
108
+ },
109
+ didAuthError(error) {
110
+ return error.response.status === 401
111
+ },
112
+ async refreshAuth() {
113
+ tadaClient = await buildClient({ clientOptions: opts?.clientOptions })
114
+ },
115
+ willAuthError() {
116
+ return !isJwtValid()
117
+ },
118
+ }
119
+ }),
120
+ )
121
+ }
122
+
123
+ return createClient(_clientOptions as ClientOptions)
124
+ }
125
+
126
+ return { getClient, createClient: buildClient }
127
+ }
@@ -0,0 +1,3 @@
1
+ export { adopusNamespaceExchange, adopusSlugFromJwt, denamespaceData, namespaceDocument } from './adopusNamespaceExchange.js'
2
+ export { createTadaBrowserClient } from './createTadaBrowserClient.js'
3
+ export type { CreateTadaBrowserClientOptions, ResolveExchanges } from './createTadaBrowserClient.js'
package/src/index.ts CHANGED
@@ -46,3 +46,6 @@ export * from './helpers/isUUID.js'
46
46
  export * from './helpers/JSONToBase64EncodeDecode.js'
47
47
  export * from './helpers/getActivityStatus.js'
48
48
  export * from './helpers/stringToKeyValueMap.js'
49
+
50
+ export { createTadaBrowserClient } from './helpers/createTadaBrowserClient.js'
51
+ export type { CreateTadaBrowserClientOptions, ResolveExchanges } from './helpers/createTadaBrowserClient.js'