@proveanything/smartlinks 2.0.6 → 2.0.9
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/dist/api/ai.d.ts +1 -1
- package/dist/api/ai.js +1 -1
- package/dist/api/analytics.d.ts +1 -1
- package/dist/api/analytics.js +1 -1
- package/dist/api/appConfiguration.d.ts +3 -3
- package/dist/api/appConfiguration.js +3 -3
- package/dist/api/appObjects.d.ts +1 -1
- package/dist/api/appObjects.js +1 -1
- package/dist/api/asset.d.ts +1 -1
- package/dist/api/asset.js +2 -2
- package/dist/api/async.d.ts +1 -1
- package/dist/api/async.js +1 -1
- package/dist/api/attestation.d.ts +1 -1
- package/dist/api/attestation.js +1 -1
- package/dist/api/attestations.d.ts +1 -1
- package/dist/api/attestations.js +1 -1
- package/dist/api/auth.d.ts +2 -2
- package/dist/api/auth.js +2 -2
- package/dist/api/authKit.d.ts +1 -1
- package/dist/api/authKit.js +1 -1
- package/dist/api/batch.d.ts +1 -1
- package/dist/api/batch.js +1 -1
- package/dist/api/broadcasts.d.ts +2 -2
- package/dist/api/broadcasts.js +1 -1
- package/dist/api/claimSet.d.ts +1 -1
- package/dist/api/claimSet.js +1 -1
- package/dist/api/collection.d.ts +1 -1
- package/dist/api/collection.js +1 -1
- package/dist/api/comms.d.ts +15 -15
- package/dist/api/comms.js +1 -1
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/contact.d.ts +1 -1
- package/dist/api/contact.js +1 -1
- package/dist/api/containers.d.ts +1 -1
- package/dist/api/containers.js +1 -1
- package/dist/api/crate.d.ts +1 -1
- package/dist/api/crate.js +1 -1
- package/dist/api/facets.d.ts +1 -1
- package/dist/api/facets.js +1 -1
- package/dist/api/form.js +1 -1
- package/dist/api/http.js +1 -1
- package/dist/api/index.d.ts +46 -46
- package/dist/api/index.js +46 -46
- package/dist/api/integrations.d.ts +1 -1
- package/dist/api/integrations.js +1 -1
- package/dist/api/interactions.d.ts +1 -1
- package/dist/api/interactions.js +1 -1
- package/dist/api/jobs.d.ts +1 -1
- package/dist/api/jobs.js +1 -1
- package/dist/api/journeys.d.ts +1 -1
- package/dist/api/journeys.js +1 -1
- package/dist/api/journeysAnalytics.d.ts +1 -1
- package/dist/api/journeysAnalytics.js +1 -1
- package/dist/api/location.d.ts +1 -1
- package/dist/api/location.js +1 -1
- package/dist/api/lots.d.ts +1 -1
- package/dist/api/lots.js +1 -1
- package/dist/api/loyalty.d.ts +1 -1
- package/dist/api/loyalty.js +1 -1
- package/dist/api/navigation.d.ts +1 -1
- package/dist/api/navigation.js +1 -1
- package/dist/api/nfc.d.ts +1 -1
- package/dist/api/nfc.js +1 -1
- package/dist/api/order.d.ts +1 -1
- package/dist/api/order.js +1 -1
- package/dist/api/product.d.ts +1 -1
- package/dist/api/product.js +1 -1
- package/dist/api/products.d.ts +1 -1
- package/dist/api/products.js +1 -1
- package/dist/api/proof.d.ts +1 -1
- package/dist/api/proof.js +1 -1
- package/dist/api/qr.d.ts +1 -1
- package/dist/api/qr.js +1 -1
- package/dist/api/realtime.d.ts +1 -1
- package/dist/api/realtime.js +1 -1
- package/dist/api/research.d.ts +1 -1
- package/dist/api/research.js +1 -1
- package/dist/api/secrets.d.ts +1 -1
- package/dist/api/secrets.js +1 -1
- package/dist/api/segments.d.ts +1 -1
- package/dist/api/segments.js +1 -1
- package/dist/api/sequence.js +1 -1
- package/dist/api/tags.d.ts +1 -1
- package/dist/api/tags.js +1 -1
- package/dist/api/template.d.ts +1 -1
- package/dist/api/template.js +1 -1
- package/dist/api/translations.d.ts +1 -1
- package/dist/api/translations.js +2 -2
- package/dist/api/variant.d.ts +1 -1
- package/dist/api/variant.js +1 -1
- package/dist/containers/types.d.ts +1 -1
- package/dist/docs/API_SUMMARY.md +7 -7
- package/dist/docs/ai.md +14 -520
- package/dist/docs/analytics.md +41 -2
- package/dist/docs/app-data-storage.md +0 -38
- package/dist/docs/app-manifest.md +104 -7
- package/dist/docs/app-objects.md +0 -148
- package/dist/docs/app-records-pattern.md +2 -2
- package/dist/docs/building-react-components.md +6 -14
- package/dist/docs/caching.md +20 -21
- package/dist/docs/container-tracking.md +2 -0
- package/dist/docs/containers.md +14 -66
- package/dist/docs/executor.md +4 -4
- package/dist/docs/host-dependency-contract.md +27 -0
- package/dist/docs/iframe-responder.md +308 -0
- package/dist/docs/item-context.md +0 -2
- package/dist/docs/manifests.md +3 -3
- package/dist/docs/mobile-admin-container.md +4 -4
- package/dist/docs/mpa.md +5 -5
- package/dist/docs/native-facade.md +1 -1
- package/dist/docs/overview.md +34 -15
- package/dist/docs/portal-back-button.md +2 -3
- package/dist/docs/widgets.md +11 -69
- package/dist/http.d.ts +24 -8
- package/dist/http.js +32 -14
- package/dist/iframe.d.ts +2 -2
- package/dist/iframe.js +1 -1
- package/dist/iframeResponder.d.ts +7 -1
- package/dist/iframeResponder.js +45 -4
- package/dist/index.d.ts +30 -27
- package/dist/index.js +10 -8
- package/dist/mobile-admin/errors.d.ts +1 -1
- package/dist/mobile-admin/types.d.ts +2 -2
- package/dist/openapi.yaml +12 -0
- package/dist/shared-dependencies.d.ts +37 -0
- package/dist/shared-dependencies.js +79 -0
- package/dist/testing/index.d.ts +1 -1
- package/dist/translationCache.d.ts +1 -1
- package/dist/types/appManifest.d.ts +23 -0
- package/dist/types/broadcasts.d.ts +1 -1
- package/dist/types/collection.d.ts +2 -2
- package/dist/types/comms.d.ts +5 -5
- package/dist/types/contact.d.ts +1 -1
- package/dist/types/facets.d.ts +1 -1
- package/dist/types/iframeResponder.d.ts +3 -3
- package/dist/types/index.d.ts +44 -44
- package/dist/types/index.js +44 -44
- package/dist/types/interaction.d.ts +1 -1
- package/dist/types/itemContext.d.ts +1 -1
- package/dist/types/journeysAnalytics.d.ts +1 -1
- package/dist/types/navigation.d.ts +1 -1
- package/dist/types/product.d.ts +1 -1
- package/dist/types/proof.d.ts +1 -1
- package/dist/types/segments.d.ts +1 -1
- package/dist/types/widgets.d.ts +2 -2
- package/dist/utils/conditions.d.ts +1 -1
- package/dist/utils/index.d.ts +3 -3
- package/dist/utils/index.js +3 -3
- package/dist/utils/paths.d.ts +4 -4
- package/docs/API_SUMMARY.md +7 -7
- package/docs/ai.md +14 -520
- package/docs/analytics.md +41 -2
- package/docs/app-data-storage.md +0 -38
- package/docs/app-manifest.md +104 -7
- package/docs/app-objects.md +0 -148
- package/docs/app-records-pattern.md +2 -2
- package/docs/building-react-components.md +6 -14
- package/docs/caching.md +20 -21
- package/docs/container-tracking.md +2 -0
- package/docs/containers.md +14 -66
- package/docs/executor.md +4 -4
- package/docs/host-dependency-contract.md +27 -0
- package/docs/iframe-responder.md +308 -0
- package/docs/item-context.md +0 -2
- package/docs/mobile-admin-container.md +4 -4
- package/docs/mpa.md +5 -5
- package/docs/native-facade.md +1 -1
- package/docs/overview.md +34 -15
- package/docs/portal-back-button.md +2 -3
- package/docs/widgets.md +11 -69
- package/openapi.yaml +12 -0
- package/package.json +17 -6
- package/scripts/doctor.mjs +171 -0
- package/docs/analytics-metadata-conventions.md +0 -88
- package/docs/iframe-streaming-parent-changes.md +0 -308
- package/docs/manifests.md +0 -204
package/dist/http.d.ts
CHANGED
|
@@ -168,22 +168,38 @@ export declare function configureSdkCache(options: {
|
|
|
168
168
|
serveStaleOnOffline?: boolean;
|
|
169
169
|
clearOnPageLoad?: boolean;
|
|
170
170
|
}): void;
|
|
171
|
+
/** Options for {@link invalidateCache}. */
|
|
172
|
+
export interface InvalidateCacheOptions {
|
|
173
|
+
/**
|
|
174
|
+
* Match the path **exactly** (ignoring any query string) instead of the default
|
|
175
|
+
* substring match. Use this to clear one resource without wiping everything
|
|
176
|
+
* nested under it — e.g. `invalidateCache('/collection/abc', { exact: true })`
|
|
177
|
+
* drops only that entry, not `/collection/abc/settings|widgets|products|proofs`.
|
|
178
|
+
*/
|
|
179
|
+
exact?: boolean;
|
|
180
|
+
}
|
|
171
181
|
/**
|
|
172
182
|
* Manually invalidate entries in the SDK's GET cache.
|
|
173
183
|
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
184
|
+
* Note: the GET cache is **in-memory, per page load** (with an optional L2
|
|
185
|
+
* IndexedDB layer when persistence is enabled) — it does not persist across
|
|
186
|
+
* reloads unless you opt into persistence, so it rarely needs disabling "for
|
|
187
|
+
* correctness".
|
|
188
|
+
*
|
|
189
|
+
* @param urlPattern - Substring match by default (every entry whose key
|
|
190
|
+
* *contains* this string is removed). With `{ exact: true }`, matches the path
|
|
191
|
+
* precisely. Omit to wipe the entire cache.
|
|
192
|
+
* @param options - See {@link InvalidateCacheOptions}.
|
|
177
193
|
*
|
|
178
194
|
* @example
|
|
179
195
|
* ```ts
|
|
180
|
-
* invalidateCache()
|
|
181
|
-
* invalidateCache('/collection/abc123')
|
|
182
|
-
* invalidateCache('/
|
|
183
|
-
* invalidateCache('/products/')
|
|
196
|
+
* invalidateCache() // clear everything
|
|
197
|
+
* invalidateCache('/collection/abc123') // that collection AND everything under it
|
|
198
|
+
* invalidateCache('/collection/abc123', { exact: true }) // ONLY that collection entry
|
|
199
|
+
* invalidateCache('/products/') // all canonical plural product responses
|
|
184
200
|
* ```
|
|
185
201
|
*/
|
|
186
|
-
export declare function invalidateCache(urlPattern?: string): void;
|
|
202
|
+
export declare function invalidateCache(urlPattern?: string, options?: InvalidateCacheOptions): void;
|
|
187
203
|
/**
|
|
188
204
|
* Upload a FormData payload via proxy with progress events using chunked postMessage.
|
|
189
205
|
* Parent is expected to implement the counterpart protocol.
|
package/dist/http.js
CHANGED
|
@@ -25,8 +25,8 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
|
|
|
25
25
|
function reject(value) { resume("throw", value); }
|
|
26
26
|
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
27
27
|
};
|
|
28
|
-
import { SmartlinksApiError, SmartlinksOfflineError } from "./types/error";
|
|
29
|
-
import { idbGet, idbSet, idbClear } from './persistentCache';
|
|
28
|
+
import { SmartlinksApiError, SmartlinksOfflineError } from "./types/error.js";
|
|
29
|
+
import { idbGet, idbSet, idbClear } from './persistentCache.js';
|
|
30
30
|
let baseURL = null;
|
|
31
31
|
let apiKey = undefined;
|
|
32
32
|
let bearerToken = undefined;
|
|
@@ -424,7 +424,7 @@ function normalizeErrorResponse(responseBody, statusCode) {
|
|
|
424
424
|
* @property {string} [options.bearerToken] - (Optional) Bearer token for AUTHORIZATION header
|
|
425
425
|
* @property {boolean} [options.proxyMode] - (Optional) Tells the API that it is running in an iframe via parent proxy
|
|
426
426
|
*/
|
|
427
|
-
import { iframe } from './iframe';
|
|
427
|
+
import { iframe } from './iframe.js';
|
|
428
428
|
export function initializeApi(options) {
|
|
429
429
|
var _a;
|
|
430
430
|
// Normalize baseURL by removing trailing slashes.
|
|
@@ -660,29 +660,47 @@ export function configureSdkCache(options) {
|
|
|
660
660
|
/**
|
|
661
661
|
* Manually invalidate entries in the SDK's GET cache.
|
|
662
662
|
*
|
|
663
|
-
*
|
|
664
|
-
*
|
|
665
|
-
*
|
|
663
|
+
* Note: the GET cache is **in-memory, per page load** (with an optional L2
|
|
664
|
+
* IndexedDB layer when persistence is enabled) — it does not persist across
|
|
665
|
+
* reloads unless you opt into persistence, so it rarely needs disabling "for
|
|
666
|
+
* correctness".
|
|
667
|
+
*
|
|
668
|
+
* @param urlPattern - Substring match by default (every entry whose key
|
|
669
|
+
* *contains* this string is removed). With `{ exact: true }`, matches the path
|
|
670
|
+
* precisely. Omit to wipe the entire cache.
|
|
671
|
+
* @param options - See {@link InvalidateCacheOptions}.
|
|
666
672
|
*
|
|
667
673
|
* @example
|
|
668
674
|
* ```ts
|
|
669
|
-
* invalidateCache()
|
|
670
|
-
* invalidateCache('/collection/abc123')
|
|
671
|
-
* invalidateCache('/
|
|
672
|
-
* invalidateCache('/products/')
|
|
675
|
+
* invalidateCache() // clear everything
|
|
676
|
+
* invalidateCache('/collection/abc123') // that collection AND everything under it
|
|
677
|
+
* invalidateCache('/collection/abc123', { exact: true }) // ONLY that collection entry
|
|
678
|
+
* invalidateCache('/products/') // all canonical plural product responses
|
|
673
679
|
* ```
|
|
674
680
|
*/
|
|
675
|
-
export function invalidateCache(urlPattern) {
|
|
681
|
+
export function invalidateCache(urlPattern, options) {
|
|
676
682
|
if (!urlPattern) {
|
|
677
683
|
clearHttpCache('invalidateCache(all)');
|
|
678
684
|
if (cachePersistence !== 'none')
|
|
679
685
|
idbClear().catch(() => { });
|
|
680
686
|
return;
|
|
681
687
|
}
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
688
|
+
if (options === null || options === void 0 ? void 0 : options.exact) {
|
|
689
|
+
const exactKey = buildCacheKey(urlPattern);
|
|
690
|
+
for (const key of httpCache.keys()) {
|
|
691
|
+
// Compare the path portion (drop query) so exact clears query variants of
|
|
692
|
+
// the same path but never sub-resources beneath it.
|
|
693
|
+
if (key.split('?')[0] === exactKey)
|
|
694
|
+
httpCache.delete(key);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
else {
|
|
698
|
+
for (const key of httpCache.keys()) {
|
|
699
|
+
if (key.includes(urlPattern))
|
|
700
|
+
httpCache.delete(key);
|
|
701
|
+
}
|
|
685
702
|
}
|
|
703
|
+
// L2 (IndexedDB) sweep remains substring-based; the exact win is the in-memory L1.
|
|
686
704
|
if (cachePersistence !== 'none')
|
|
687
705
|
idbClear(urlPattern).catch(() => { });
|
|
688
706
|
}
|
package/dist/iframe.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { IframeResponder, isAdminFromRoles, buildIframeSrc, } from './iframeResponder';
|
|
2
|
-
export type { IframeResponderOptions, CachedData, CollectionApp, RouteChangeMessage, SmartlinksIframeMessage, ProxyRequest, CustomProxyRequest, UploadStartMessage, UploadChunkMessage, UploadEndMessage, } from './types/iframeResponder';
|
|
1
|
+
export { IframeResponder, isAdminFromRoles, buildIframeSrc, } from './iframeResponder.js';
|
|
2
|
+
export type { IframeResponderOptions, CachedData, CollectionApp, RouteChangeMessage, SmartlinksIframeMessage, ProxyRequest, CustomProxyRequest, UploadStartMessage, UploadChunkMessage, UploadEndMessage, } from './types/iframeResponder.js';
|
|
3
3
|
export declare namespace iframe {
|
|
4
4
|
interface IframeResizeOptions {
|
|
5
5
|
/** Minimum ms between height postMessages (default 100). */
|
package/dist/iframe.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// These helpers are optional and safe in non-browser / Node environments.
|
|
4
4
|
// They build on the existing proxyMode infrastructure but can also be used standalone.
|
|
5
5
|
// Re-export IframeResponder for parent-side iframe communication
|
|
6
|
-
export { IframeResponder, isAdminFromRoles, buildIframeSrc, } from './iframeResponder';
|
|
6
|
+
export { IframeResponder, isAdminFromRoles, buildIframeSrc, } from './iframeResponder.js';
|
|
7
7
|
export var iframe;
|
|
8
8
|
(function (iframe) {
|
|
9
9
|
let autoResizeTimer;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IframeResponderOptions, CachedData } from './types/iframeResponder';
|
|
1
|
+
import type { IframeResponderOptions, CachedData } from './types/iframeResponder.js';
|
|
2
2
|
/**
|
|
3
3
|
* Parent-side iframe responder for SmartLinks microapp embedding.
|
|
4
4
|
*
|
|
@@ -30,6 +30,12 @@ export declare class IframeResponder {
|
|
|
30
30
|
private iframe;
|
|
31
31
|
private options;
|
|
32
32
|
private cache;
|
|
33
|
+
/**
|
|
34
|
+
* Timestamp of the last anonymous (`401`) `/account` result, so a burst of
|
|
35
|
+
* "am I logged in?" checks on one page load doesn't re-hit the API 3–4 times.
|
|
36
|
+
* Only used while `cache.user` is unset; cleared the moment a login lands.
|
|
37
|
+
*/
|
|
38
|
+
private lastAnonAccountAt;
|
|
33
39
|
private uploads;
|
|
34
40
|
private activeStreams;
|
|
35
41
|
private isInitialLoad;
|
package/dist/iframeResponder.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// =============================================================================
|
|
2
2
|
// IframeResponder - Parent-side iframe communication handler
|
|
3
3
|
// =============================================================================
|
|
4
|
-
import * as cache from './cache';
|
|
5
|
-
import { collection } from './api/collection';
|
|
6
|
-
import { getBaseURL } from './http';
|
|
4
|
+
import * as cache from './cache.js';
|
|
5
|
+
import { collection } from './api/collection.js';
|
|
6
|
+
import { getBaseURL, hasAuthCredentials } from './http.js';
|
|
7
7
|
/**
|
|
8
8
|
* Parent-side iframe responder for SmartLinks microapp embedding.
|
|
9
9
|
*
|
|
@@ -34,6 +34,12 @@ import { getBaseURL } from './http';
|
|
|
34
34
|
export class IframeResponder {
|
|
35
35
|
constructor(options) {
|
|
36
36
|
this.iframe = null;
|
|
37
|
+
/**
|
|
38
|
+
* Timestamp of the last anonymous (`401`) `/account` result, so a burst of
|
|
39
|
+
* "am I logged in?" checks on one page load doesn't re-hit the API 3–4 times.
|
|
40
|
+
* Only used while `cache.user` is unset; cleared the moment a login lands.
|
|
41
|
+
*/
|
|
42
|
+
this.lastAnonAccountAt = 0;
|
|
37
43
|
this.uploads = new Map();
|
|
38
44
|
this.activeStreams = new Map();
|
|
39
45
|
this.isInitialLoad = true;
|
|
@@ -346,8 +352,10 @@ export class IframeResponder {
|
|
|
346
352
|
// TODO: Validate token using SDK auth utilities when available
|
|
347
353
|
// await auth.verifyToken(token);
|
|
348
354
|
await this.options.onAuthLogin(token, user, accountData);
|
|
349
|
-
// Update cache with new user
|
|
355
|
+
// Update cache with new user; drop any stale "anonymous" account marker
|
|
356
|
+
// so the next check reflects the fresh login immediately.
|
|
350
357
|
this.cache.user = user;
|
|
358
|
+
this.lastAnonAccountAt = 0;
|
|
351
359
|
this.sendResponse(event, {
|
|
352
360
|
type: 'smartlinks:authkit:login-acknowledged',
|
|
353
361
|
messageId,
|
|
@@ -414,6 +422,35 @@ export class IframeResponder {
|
|
|
414
422
|
return;
|
|
415
423
|
}
|
|
416
424
|
}
|
|
425
|
+
// "Am I logged in?" (GET /account) with no logged-in user cached. The positive
|
|
426
|
+
// path above already served logged-in users (cache.user set).
|
|
427
|
+
if (proxyData.method === 'GET' && path.includes('/account') && !this.cache.user) {
|
|
428
|
+
const notAuthenticated = () => {
|
|
429
|
+
response.statusCode = 401;
|
|
430
|
+
response.error = 'Not authenticated';
|
|
431
|
+
response.errorBody = { account: null, errorCode: 'NOT_AUTHENTICATED' };
|
|
432
|
+
this.sendResponse(event, response);
|
|
433
|
+
};
|
|
434
|
+
// Pre-emptive gate: will this request carry ANY credential the server could
|
|
435
|
+
// validate? The portal authenticates by bearer token (not cookie), and the
|
|
436
|
+
// proxy fetch forwards no cookie, so if neither the parent SDK nor the
|
|
437
|
+
// forwarded headers carry a token, the call is provably pointless — answer
|
|
438
|
+
// "not authenticated" locally, zero network calls.
|
|
439
|
+
const headers = (proxyData.headers || {});
|
|
440
|
+
const hasHeaderAuth = Object.keys(headers).some((k) => k.toLowerCase() === 'authorization' && !!headers[k]);
|
|
441
|
+
if (!hasAuthCredentials() && !hasHeaderAuth) {
|
|
442
|
+
notAuthenticated();
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
// A credential IS present but no user is cached (e.g. an expired token):
|
|
446
|
+
// the first check goes to the network, then its 401 is remembered briefly
|
|
447
|
+
// so repeat checks in the same page load don't re-hit the API.
|
|
448
|
+
const ANON_ACCOUNT_TTL_MS = 30000;
|
|
449
|
+
if (this.lastAnonAccountAt && Date.now() - this.lastAnonAccountAt < ANON_ACCOUNT_TTL_MS) {
|
|
450
|
+
notAuthenticated();
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
417
454
|
// Forward to actual API using SDK's configured baseURL
|
|
418
455
|
const baseUrl = getBaseURL();
|
|
419
456
|
if (!baseUrl) {
|
|
@@ -434,6 +471,10 @@ export class IframeResponder {
|
|
|
434
471
|
response.error = (responseData === null || responseData === void 0 ? void 0 : responseData.message) || (responseData === null || responseData === void 0 ? void 0 : responseData.errorText) || `Request failed with status ${fetchResponse.status}`;
|
|
435
472
|
response.statusCode = fetchResponse.status;
|
|
436
473
|
response.errorBody = responseData;
|
|
474
|
+
// Remember an anonymous /account result so repeat checks skip the network.
|
|
475
|
+
if (fetchResponse.status === 401 && path.includes('/account') && !this.cache.user) {
|
|
476
|
+
this.lastAnonAccountAt = Date.now();
|
|
477
|
+
}
|
|
437
478
|
}
|
|
438
479
|
else {
|
|
439
480
|
response.data = responseData;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,29 +1,32 @@
|
|
|
1
|
-
export { initializeApi, isInitialized, hasAuthCredentials, configureSdkCache, invalidateCache, getHttpCacheDiagnostics, resetHttpCacheDiagnostics, request, post, put, patch, del, sendCustomProxyMessage, getApiHeaders, getBaseURL, isProxyEnabled, setBearerToken, getBearerToken, setGrantToken, getGrantToken } from "./http";
|
|
2
|
-
export * from "./api";
|
|
3
|
-
export * from "./types";
|
|
4
|
-
export { iframe } from "./iframe";
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export type {
|
|
11
|
-
export type {
|
|
12
|
-
export type {
|
|
13
|
-
export type {
|
|
14
|
-
export type {
|
|
15
|
-
export type {
|
|
16
|
-
export type {
|
|
17
|
-
export type {
|
|
18
|
-
export type {
|
|
19
|
-
export type {
|
|
20
|
-
export type {
|
|
21
|
-
export type {
|
|
22
|
-
export type {
|
|
23
|
-
export type {
|
|
1
|
+
export { initializeApi, isInitialized, hasAuthCredentials, configureSdkCache, invalidateCache, getHttpCacheDiagnostics, resetHttpCacheDiagnostics, request, post, put, patch, del, sendCustomProxyMessage, getApiHeaders, getBaseURL, isProxyEnabled, setBearerToken, getBearerToken, setGrantToken, getGrantToken } from "./http.js";
|
|
2
|
+
export * from "./api/index.js";
|
|
3
|
+
export * from "./types/index.js";
|
|
4
|
+
export { iframe } from "./iframe.js";
|
|
5
|
+
export type { InvalidateCacheOptions } from "./http.js";
|
|
6
|
+
export * as cache from './cache.js';
|
|
7
|
+
export { IframeResponder, isAdminFromRoles, buildIframeSrc, } from './iframeResponder.js';
|
|
8
|
+
export * as utils from './utils/index.js';
|
|
9
|
+
export { SHARED_DEPENDENCY_CONTRACT_VERSION, SHARED_DEPENDENCIES, SHARED_DEPENDENCY_SPECIFIERS, importMapPathFor, getHostSharedDependencies, } from './shared-dependencies.js';
|
|
10
|
+
export type { SharedDependency, HostSharedDependencies } from './shared-dependencies.js';
|
|
11
|
+
export type { PortalPathParams, Gs1DigitalLinkParams, ConditionParams, ConditionDebugOptions, ConditionDebugLogger, ConditionSet, Condition, UserInfo, ProductInfo, ProofInfo, CollectionInfo, } from './utils/index.js';
|
|
12
|
+
export type { LoginResponse, VerifyTokenResponse, AccountInfoResponse, AuthLocation, } from "./api/auth.js";
|
|
13
|
+
export type { UserAccountRegistrationRequest, } from "./types/auth.js";
|
|
14
|
+
export type { CommunicationEvent, CommsQueryByUser, CommsRecipientIdsQuery, CommsRecipientsWithoutActionQuery, CommsRecipientsWithActionQuery, RecipientId, RecipientWithOutcome, LogCommunicationEventBody, LogBulkCommunicationEventsBody, AppendResult, AppendBulkResult, CommsSettings, TopicConfig, CommsSettingsGetResponse, CommsSettingsPatchBody, CommsPublicTopicsResponse, UnsubscribeQuery, UnsubscribeResponse, CommsConsentUpsertRequest, CommsPreferencesUpsertRequest, CommsSubscribeRequest, CommsSubscribeResponse, CommsSubscriptionCheckQuery, CommsSubscriptionCheckResponse, CommsListMethodsQuery, CommsListMethodsResponse, RegisterEmailMethodRequest, RegisterSmsMethodRequest, RegisterMethodResponse, SubscriptionsResolveRequest, SubscriptionsResolveResponse, } from "./types/comms.js";
|
|
15
|
+
export type { BatchResponse, BatchCreateRequest, BatchUpdateRequest, } from "./types/batch.js";
|
|
16
|
+
export type { Lot, LotStatus, LotSelector, LotPayload, LotCreateInput, LotUpdateInput, ListLotsParams, ListLotsResponse, LotMemberDiff, ResolveLotResponse, LotProductSummary, ListLotProductsResponse, LotResolutionResult, } from "./types/lots.js";
|
|
17
|
+
export type { VariantResponse, VariantCreateRequest, VariantUpdateRequest, } from "./types/variant.js";
|
|
18
|
+
export type { BroadcastSendRequest } from "./types/broadcasts.js";
|
|
19
|
+
export type { AppConfigOptions } from "./api/appConfiguration.js";
|
|
20
|
+
export type { AdditionalGtin, ISODateString, JsonPrimitive, JsonValue, ProductCreateRequest, ProductClaimCreateInput, ProductClaimCreateRequestBody, ProductClaimLookupInput, ProductFacetMap, ProductFacetValue, ProductImageUrlInput, ProductKey, ProductQueryRequest, ProductQueryResponse, ProductUpdateRequest, Product, ProductWriteInput, PublicProduct, } from "./types/product.js";
|
|
21
|
+
export type { TranslationLookupMode, TranslationContentType, TranslationQuality, TranslationItemStatus, TranslationContextValue, TranslationContext, TranslationLookupRequestBase, TranslationLookupSingleRequest, TranslationLookupBatchRequest, TranslationLookupRequest, TranslationLookupItem, TranslationLookupResponse, ResolvedTranslationItem, ResolvedTranslationResponse, TranslationHashOptions, TranslationResolveOptions, TranslationRecord, TranslationListParams, TranslationListResponse, TranslationUpdateRequest, } from "./types/translations.js";
|
|
22
|
+
export type { FacetBucket, FacetDefinition, FacetDefinitionWriteInput, FacetGetParams, FacetListParams, FacetListResponse, FacetNamespaceListResponse, FacetQueryRequest, FacetQueryResponse, FacetValue, FacetValueDefinition, FacetValueGetParams, FacetValueListParams, FacetValueListResponse, FacetValueResponse, FacetValueWriteInput, PublicFacetListParams, } from "./types/facets.js";
|
|
23
|
+
export type { Collection, CollectionResponse, CollectionCreateRequest, CollectionUpdateRequest, DomainTarget, HubAvailabilityResponse, } from "./types/collection.js";
|
|
24
|
+
export type { Proof, ProofResponse, ProofWrite, ProofCreateRequest, ProofUpdateRequest, ProofClaimRequest, ProofGrant, GrantScope, GrantAudience, CreateGrantOptions, RedeemGrantOptions, RedeemGrantResult, ProofTransfer, ProofTransferType, ProofTransferState, TransferProofOptions, TransferProofResult, } from "./types/proof.js";
|
|
25
|
+
export type { QrShortCodeLookupResponse, } from "./types/qr.js";
|
|
26
|
+
export type { ReverseTagLookupParams, ReverseTagLookupResponse, } from "./types/tags.js";
|
|
24
27
|
export type { AdminMobileCapability, ActionableCapability, AdminMobileHostId, AdminMobileEvent, AdminMobileEventCallback, AdminMobileEventSubscriber, ScannerEventSubscriber, // @deprecated — use AdminMobileEventCallback
|
|
25
28
|
AdminMobileHostContext, AdminMobileComponentManifest, AdminMobileBundleManifest, MobileAdminComponentManifest, // @deprecated — use AdminMobileComponentManifest
|
|
26
|
-
MobileAdminBundleManifest, } from './mobile-admin/types';
|
|
27
|
-
export { HostCapabilityUnavailableError, HostPermissionDeniedError, HostTimeoutError, } from './mobile-admin/errors';
|
|
28
|
-
export type { NativeCapability, NativeFacade, ShareFacade, ClipboardFacade, HapticImpactStyle, HapticNotificationStyle, HapticsFacade, NetworkStatus, NetworkFacade, DeviceInfo, DeviceFacade, StorageFacade, QrScanOptions, QrFacade, AuthFacade, NfcReadResult, NfcFacade, RfidScanOptions, RfidFacade, EventsFacade, WebSourceMode, WebSourceConfig, WebSourceFacade, } from './native/types';
|
|
29
|
-
export type { AuthKitUser, UserProfile, ProfileUpdateData, UpdateProfileResponse, SuccessResponse, AuthLoginResponse, AppleLoginOptions, AuthKitErrorCode, RefreshResponse, LogoutResponse, RefreshErrorCode, MagicLinkSendResponse, MagicLinkVerifyResponse, PhoneSendCodeResponse, PhoneVerifyResponse, PasswordResetRequestResponse, VerifyResetTokenResponse, PasswordResetCompleteResponse, EmailVerificationActionResponse, EmailVerifyTokenResponse, VerifyStatus, WhatsAppReplyCta, WhatsAppReplyOptions, WhatsAppContactData, SendWhatsAppRequest, SendWhatsAppResponse, ExchangeWhatsAppSessionResponse, VerifyWhatsAppResponse, WhatsAppStatusResponse, SendSmsVerifyRequest, SendSmsVerifyResponse, VerifySmsResponse, UpsertContactRequest, UpsertContactResponse, AuthKitBrandingConfig, AuthKitConfig, AuthKitConfigInput, AuthKitSecurityConfig, AuthKitPasswordPolicy, AuthKitSessionPolicy, AuthKitLockoutPolicy, PasswordPolicyErrorCode, LoginSecurityErrorCode, } from './types/authKit';
|
|
29
|
+
MobileAdminBundleManifest, } from './mobile-admin/types.js';
|
|
30
|
+
export { HostCapabilityUnavailableError, HostPermissionDeniedError, HostTimeoutError, } from './mobile-admin/errors.js';
|
|
31
|
+
export type { NativeCapability, NativeFacade, ShareFacade, ClipboardFacade, HapticImpactStyle, HapticNotificationStyle, HapticsFacade, NetworkStatus, NetworkFacade, DeviceInfo, DeviceFacade, StorageFacade, QrScanOptions, QrFacade, AuthFacade, NfcReadResult, NfcFacade, RfidScanOptions, RfidFacade, EventsFacade, WebSourceMode, WebSourceConfig, WebSourceFacade, } from './native/types.js';
|
|
32
|
+
export type { AuthKitUser, UserProfile, ProfileUpdateData, UpdateProfileResponse, SuccessResponse, AuthLoginResponse, AppleLoginOptions, AuthKitErrorCode, RefreshResponse, LogoutResponse, RefreshErrorCode, MagicLinkSendResponse, MagicLinkVerifyResponse, PhoneSendCodeResponse, PhoneVerifyResponse, PasswordResetRequestResponse, VerifyResetTokenResponse, PasswordResetCompleteResponse, EmailVerificationActionResponse, EmailVerifyTokenResponse, VerifyStatus, WhatsAppReplyCta, WhatsAppReplyOptions, WhatsAppContactData, SendWhatsAppRequest, SendWhatsAppResponse, ExchangeWhatsAppSessionResponse, VerifyWhatsAppResponse, WhatsAppStatusResponse, SendSmsVerifyRequest, SendSmsVerifyResponse, VerifySmsResponse, UpsertContactRequest, UpsertContactResponse, AuthKitBrandingConfig, AuthKitConfig, AuthKitConfigInput, AuthKitSecurityConfig, AuthKitPasswordPolicy, AuthKitSessionPolicy, AuthKitLockoutPolicy, PasswordPolicyErrorCode, LoginSecurityErrorCode, } from './types/authKit.js';
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
// Top-level entrypoint of the npm package. Re-export initializeApi + all namespaces.
|
|
3
|
-
export { initializeApi, isInitialized, hasAuthCredentials, configureSdkCache, invalidateCache, getHttpCacheDiagnostics, resetHttpCacheDiagnostics, request, post, put, patch, del, sendCustomProxyMessage, getApiHeaders, getBaseURL, isProxyEnabled, setBearerToken, getBearerToken, setGrantToken, getGrantToken } from "./http";
|
|
4
|
-
export * from "./api";
|
|
5
|
-
export * from "./types";
|
|
3
|
+
export { initializeApi, isInitialized, hasAuthCredentials, configureSdkCache, invalidateCache, getHttpCacheDiagnostics, resetHttpCacheDiagnostics, request, post, put, patch, del, sendCustomProxyMessage, getApiHeaders, getBaseURL, isProxyEnabled, setBearerToken, getBearerToken, setGrantToken, getGrantToken } from "./http.js";
|
|
4
|
+
export * from "./api/index.js";
|
|
5
|
+
export * from "./types/index.js";
|
|
6
6
|
// Iframe namespace
|
|
7
|
-
export { iframe } from "./iframe";
|
|
8
|
-
import * as cache_1 from './cache';
|
|
7
|
+
export { iframe } from "./iframe.js";
|
|
8
|
+
import * as cache_1 from './cache.js';
|
|
9
9
|
export { cache_1 as cache };
|
|
10
10
|
// IframeResponder (also exported via iframe namespace)
|
|
11
|
-
export { IframeResponder, isAdminFromRoles, buildIframeSrc, } from './iframeResponder';
|
|
12
|
-
import * as utils_1 from './utils';
|
|
11
|
+
export { IframeResponder, isAdminFromRoles, buildIframeSrc, } from './iframeResponder.js';
|
|
12
|
+
import * as utils_1 from './utils/index.js';
|
|
13
13
|
export { utils_1 as utils };
|
|
14
|
-
|
|
14
|
+
// Shared dependency contract (host↔app) — one source of truth for externalized deps
|
|
15
|
+
export { SHARED_DEPENDENCY_CONTRACT_VERSION, SHARED_DEPENDENCIES, SHARED_DEPENDENCY_SPECIFIERS, importMapPathFor, getHostSharedDependencies, } from './shared-dependencies.js';
|
|
16
|
+
export { HostCapabilityUnavailableError, HostPermissionDeniedError, HostTimeoutError, } from './mobile-admin/errors.js';
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* All three classes call `Object.setPrototypeOf(this, new.target.prototype)` so
|
|
6
6
|
* `instanceof` works correctly when transpiled to ES5.
|
|
7
7
|
*/
|
|
8
|
-
import type { ActionableCapability, AdminMobileHostId } from './types';
|
|
8
|
+
import type { ActionableCapability, AdminMobileHostId } from './types.js';
|
|
9
9
|
/**
|
|
10
10
|
* Thrown when a container requests a hardware action that the current host
|
|
11
11
|
* does not support (e.g. calling `requestNfcTap` on a `'pwa'` host).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NativeFacade } from '../native/types';
|
|
1
|
+
import type { NativeFacade } from '../native/types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Hardware/software capability tokens a mobile admin host may advertise.
|
|
4
4
|
* Passed to `AdminMobileHostContext.capabilities` and to
|
|
@@ -79,7 +79,7 @@ export interface AdminMobileHostContext {
|
|
|
79
79
|
* calls — never `import * as SL from '@proveanything/smartlinks'` inside a
|
|
80
80
|
* container, as that would create a second SDK instance.
|
|
81
81
|
*/
|
|
82
|
-
SL: typeof import('../index');
|
|
82
|
+
SL: typeof import('../index.js');
|
|
83
83
|
/** Capabilities advertised by this host instance. */
|
|
84
84
|
capabilities: AdminMobileCapability[];
|
|
85
85
|
/**
|
package/dist/openapi.yaml
CHANGED
|
@@ -17471,6 +17471,18 @@ components:
|
|
|
17471
17471
|
type: string
|
|
17472
17472
|
appId:
|
|
17473
17473
|
type: string
|
|
17474
|
+
moduleFormat:
|
|
17475
|
+
type: string
|
|
17476
|
+
enum:
|
|
17477
|
+
- umd
|
|
17478
|
+
- esm
|
|
17479
|
+
- dual
|
|
17480
|
+
sharedDependencies:
|
|
17481
|
+
type: string
|
|
17482
|
+
globals:
|
|
17483
|
+
type: object
|
|
17484
|
+
additionalProperties:
|
|
17485
|
+
type: string
|
|
17474
17486
|
seo:
|
|
17475
17487
|
type: object
|
|
17476
17488
|
additionalProperties: true
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Current contract revision. Bumped when the entry list or host versions change. */
|
|
2
|
+
export declare const SHARED_DEPENDENCY_CONTRACT_VERSION: "v5";
|
|
3
|
+
export interface SharedDependency {
|
|
4
|
+
/** Bare import specifier the app writes, e.g. `react-dom/client`. */
|
|
5
|
+
specifier: string;
|
|
6
|
+
/** Window global the host exposes for the UMD (legacy) resolution path. */
|
|
7
|
+
globalName: string;
|
|
8
|
+
/** Minimum version whose API the host guarantees — build against `>=` this, `<=` host. */
|
|
9
|
+
minVersion: string;
|
|
10
|
+
/** Portal-served ESM shim path this specifier maps to in the import map. */
|
|
11
|
+
importMapPath: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Canonical import-map path for a specifier: drop the leading `@` scope marker and
|
|
15
|
+
* turn every `/` into `-`.
|
|
16
|
+
* 'react-dom/client' -> '/sl-shared/v5/react-dom-client.js'
|
|
17
|
+
* '@radix-ui/react-slot' -> '/sl-shared/v5/radix-ui-react-slot.js'
|
|
18
|
+
* Hosts MUST serve shims at these paths so the map the SDK advertises resolves.
|
|
19
|
+
*/
|
|
20
|
+
export declare function importMapPathFor(specifier: string, version?: string): string;
|
|
21
|
+
/** The full shared-dependency contract for {@link SHARED_DEPENDENCY_CONTRACT_VERSION}. */
|
|
22
|
+
export declare const SHARED_DEPENDENCIES: readonly SharedDependency[];
|
|
23
|
+
/** Just the bare specifiers — handy for a bundler `external` list. */
|
|
24
|
+
export declare const SHARED_DEPENDENCY_SPECIFIERS: readonly string[];
|
|
25
|
+
/** What a host advertises at runtime so apps can detect the live contract. */
|
|
26
|
+
export interface HostSharedDependencies {
|
|
27
|
+
version: string;
|
|
28
|
+
specifiers: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read the shared-dependency contract the current host advertises at runtime
|
|
32
|
+
* (via `window.__SMARTLINKS_SHARED__`). Returns `null` when there is no host
|
|
33
|
+
* marker — e.g. an older portal, or the bundle running outside a portal — so an
|
|
34
|
+
* app can degrade gracefully or fail with an actionable message instead of a
|
|
35
|
+
* bare-specifier resolution crash.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getHostSharedDependencies(): HostSharedDependencies | null;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// src/shared-dependencies.ts
|
|
2
|
+
// -----------------------------------------------------------------------------
|
|
3
|
+
// The host↔app SHARED DEPENDENCY CONTRACT — the single source of truth for which
|
|
4
|
+
// libraries the R5 portal (host) provides as singletons, so apps externalize them
|
|
5
|
+
// instead of bundling their own copy.
|
|
6
|
+
//
|
|
7
|
+
// The host publishes these to modern (ESM) apps via a versioned import map, and to
|
|
8
|
+
// legacy (UMD) apps via window globals. Both hosts and app authors should read THIS
|
|
9
|
+
// list rather than hard-coding their own — a mismatch is what causes duplicate-React
|
|
10
|
+
// crashes and silent blank containers.
|
|
11
|
+
//
|
|
12
|
+
// See docs/host-dependency-contract.md.
|
|
13
|
+
/** Current contract revision. Bumped when the entry list or host versions change. */
|
|
14
|
+
export const SHARED_DEPENDENCY_CONTRACT_VERSION = 'v5';
|
|
15
|
+
/**
|
|
16
|
+
* Canonical import-map path for a specifier: drop the leading `@` scope marker and
|
|
17
|
+
* turn every `/` into `-`.
|
|
18
|
+
* 'react-dom/client' -> '/sl-shared/v5/react-dom-client.js'
|
|
19
|
+
* '@radix-ui/react-slot' -> '/sl-shared/v5/radix-ui-react-slot.js'
|
|
20
|
+
* Hosts MUST serve shims at these paths so the map the SDK advertises resolves.
|
|
21
|
+
*/
|
|
22
|
+
export function importMapPathFor(specifier, version = SHARED_DEPENDENCY_CONTRACT_VERSION) {
|
|
23
|
+
const slug = specifier.replace(/^@/, '').replace(/\//g, '-');
|
|
24
|
+
return `/sl-shared/${version}/${slug}.js`;
|
|
25
|
+
}
|
|
26
|
+
// The 25-entry v5 contract: the historical 23 plus `react-dom/client` and
|
|
27
|
+
// `react/jsx-dev-runtime`. minVersion follows the R5 host baseline (React 19,
|
|
28
|
+
// Router 7.18.4 security floor, LiquidJS 10.27+, current Radix majors).
|
|
29
|
+
const CONTRACT = [
|
|
30
|
+
{ specifier: 'react', globalName: 'React', minVersion: '19.0.0' },
|
|
31
|
+
{ specifier: 'react-dom', globalName: 'ReactDOM', minVersion: '19.0.0' },
|
|
32
|
+
{ specifier: 'react-dom/client', globalName: 'ReactDOMClient', minVersion: '19.0.0' },
|
|
33
|
+
{ specifier: 'react/jsx-runtime', globalName: 'jsxRuntime', minVersion: '19.0.0' },
|
|
34
|
+
{ specifier: 'react/jsx-dev-runtime', globalName: 'jsxDevRuntime', minVersion: '19.0.0' },
|
|
35
|
+
{ specifier: '@proveanything/smartlinks', globalName: 'SL', minVersion: '2.0.0' },
|
|
36
|
+
{ specifier: '@proveanything/smartlinks-auth-ui', globalName: 'SmartlinksAuthUI', minVersion: '2.0.0' },
|
|
37
|
+
{ specifier: 'react-router-dom', globalName: 'ReactRouterDOM', minVersion: '7.18.4' },
|
|
38
|
+
{ specifier: '@tanstack/react-query', globalName: 'ReactQuery', minVersion: '5.0.0' },
|
|
39
|
+
{ specifier: 'lucide-react', globalName: 'LucideReact', minVersion: '1.0.0' },
|
|
40
|
+
{ specifier: 'date-fns', globalName: 'dateFns', minVersion: '4.0.0' },
|
|
41
|
+
{ specifier: 'liquidjs', globalName: 'LiquidJS', minVersion: '10.27.0' },
|
|
42
|
+
{ specifier: 'class-variance-authority', globalName: 'CVA', minVersion: '0.7.0' },
|
|
43
|
+
{ specifier: '@radix-ui/react-slot', globalName: 'RadixSlot', minVersion: '1.2.0' },
|
|
44
|
+
{ specifier: '@radix-ui/react-dialog', globalName: 'RadixDialog', minVersion: '1.1.0' },
|
|
45
|
+
{ specifier: '@radix-ui/react-popover', globalName: 'RadixPopover', minVersion: '1.1.0' },
|
|
46
|
+
{ specifier: '@radix-ui/react-tooltip', globalName: 'RadixTooltip', minVersion: '1.2.0' },
|
|
47
|
+
{ specifier: '@radix-ui/react-tabs', globalName: 'RadixTabs', minVersion: '1.1.0' },
|
|
48
|
+
{ specifier: '@radix-ui/react-accordion', globalName: 'RadixAccordion', minVersion: '1.2.0' },
|
|
49
|
+
{ specifier: '@radix-ui/react-select', globalName: 'RadixSelect', minVersion: '2.3.0' },
|
|
50
|
+
{ specifier: '@radix-ui/react-scroll-area', globalName: 'RadixScrollArea', minVersion: '1.2.0' },
|
|
51
|
+
{ specifier: '@radix-ui/react-label', globalName: 'RadixLabel', minVersion: '2.1.0' },
|
|
52
|
+
{ specifier: '@radix-ui/react-toast', globalName: 'RadixToast', minVersion: '1.2.0' },
|
|
53
|
+
{ specifier: '@radix-ui/react-progress', globalName: 'RadixProgress', minVersion: '1.1.0' },
|
|
54
|
+
{ specifier: '@radix-ui/react-avatar', globalName: 'RadixAvatar', minVersion: '1.1.0' },
|
|
55
|
+
];
|
|
56
|
+
/** The full shared-dependency contract for {@link SHARED_DEPENDENCY_CONTRACT_VERSION}. */
|
|
57
|
+
export const SHARED_DEPENDENCIES = CONTRACT.map((d) => (Object.assign(Object.assign({}, d), { importMapPath: importMapPathFor(d.specifier) })));
|
|
58
|
+
/** Just the bare specifiers — handy for a bundler `external` list. */
|
|
59
|
+
export const SHARED_DEPENDENCY_SPECIFIERS = SHARED_DEPENDENCIES.map((d) => d.specifier);
|
|
60
|
+
/**
|
|
61
|
+
* Read the shared-dependency contract the current host advertises at runtime
|
|
62
|
+
* (via `window.__SMARTLINKS_SHARED__`). Returns `null` when there is no host
|
|
63
|
+
* marker — e.g. an older portal, or the bundle running outside a portal — so an
|
|
64
|
+
* app can degrade gracefully or fail with an actionable message instead of a
|
|
65
|
+
* bare-specifier resolution crash.
|
|
66
|
+
*/
|
|
67
|
+
export function getHostSharedDependencies() {
|
|
68
|
+
const g = globalThis;
|
|
69
|
+
const marker = g.__SMARTLINKS_SHARED__;
|
|
70
|
+
if (!marker || typeof marker !== 'object')
|
|
71
|
+
return null;
|
|
72
|
+
const version = typeof marker.version === 'string' ? marker.version : null;
|
|
73
|
+
const specifiers = Array.isArray(marker.specifiers)
|
|
74
|
+
? marker.specifiers.filter((s) => typeof s === 'string')
|
|
75
|
+
: null;
|
|
76
|
+
if (!version || !specifiers)
|
|
77
|
+
return null;
|
|
78
|
+
return { version, specifiers };
|
|
79
|
+
}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ResolvedTranslationItem, TranslationContext, TranslationHashOptions } from './types/translations';
|
|
1
|
+
import type { ResolvedTranslationItem, TranslationContext, TranslationHashOptions } from './types/translations.js';
|
|
2
2
|
interface LocalTranslationCacheEntry {
|
|
3
3
|
collectionId: string;
|
|
4
4
|
sourceLanguage: string;
|
|
@@ -405,6 +405,29 @@ export interface AppManifest {
|
|
|
405
405
|
version: string;
|
|
406
406
|
platformRevision?: string;
|
|
407
407
|
appId: string;
|
|
408
|
+
/**
|
|
409
|
+
* How this app's bundles are packaged, so the host knows how to load them:
|
|
410
|
+
* - `"umd"` (default when absent) — host loads the UMD bundle (`files.js.umd`)
|
|
411
|
+
* via the CommonJS `require` shim, resolving shared deps from window globals.
|
|
412
|
+
* Every existing app keeps working with no change.
|
|
413
|
+
* - `"dual"` — host prefers the ESM bundle (`files.js.esm`) when it has an import
|
|
414
|
+
* map for the declared `sharedDependencies` contract; falls back to UMD otherwise.
|
|
415
|
+
* - `"esm"` — host loads ESM natively; if it has no matching import map it fails
|
|
416
|
+
* with an actionable error rather than a bare-specifier resolution crash.
|
|
417
|
+
*/
|
|
418
|
+
moduleFormat?: 'umd' | 'esm' | 'dual';
|
|
419
|
+
/**
|
|
420
|
+
* Shared-dependency contract version this bundle was built against, e.g. `"v5"`
|
|
421
|
+
* (see `SHARED_DEPENDENCY_CONTRACT_VERSION`). The host uses it to select a
|
|
422
|
+
* compatible import map for the ESM load path.
|
|
423
|
+
*/
|
|
424
|
+
sharedDependencies?: string;
|
|
425
|
+
/**
|
|
426
|
+
* Per-app namespaced UMD globals (R4.7+), e.g. `{ widgets: "MyAppWidgets" }`.
|
|
427
|
+
* UMD-only: ESM bundles expose their exports through the module namespace and
|
|
428
|
+
* don't need this. Absent → legacy bundle (colliding `window.SmartLinks{Surface}`).
|
|
429
|
+
*/
|
|
430
|
+
globals?: Record<string, string>;
|
|
408
431
|
/**
|
|
409
432
|
* SEO configuration for this app.
|
|
410
433
|
* `priority` controls which app's singular fields (title, description, ogImage) win
|
package/dist/types/comms.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { IdField } from './common';
|
|
2
|
-
import type { BroadcastChannel } from './broadcasts';
|
|
1
|
+
import type { IdField } from './common.js';
|
|
2
|
+
import type { BroadcastChannel } from './broadcasts.js';
|
|
3
3
|
/**
|
|
4
4
|
* Target subject for notifications (product, collection, etc.)
|
|
5
5
|
*/
|
|
@@ -93,7 +93,7 @@ export interface AppendBulkResult {
|
|
|
93
93
|
success: true;
|
|
94
94
|
count: number;
|
|
95
95
|
}
|
|
96
|
-
export type Recipient = import('./contact').Contact;
|
|
96
|
+
export type Recipient = import('./contact.js').Contact;
|
|
97
97
|
export interface RecipientsPage {
|
|
98
98
|
items: Recipient[];
|
|
99
99
|
total: number;
|
|
@@ -181,7 +181,7 @@ export interface UnsubscribeResponse {
|
|
|
181
181
|
};
|
|
182
182
|
}
|
|
183
183
|
export type ConsentChannels = Partial<Record<BroadcastChannel, boolean>>;
|
|
184
|
-
type SubjectType = import('./contact').SubjectType;
|
|
184
|
+
type SubjectType = import('./contact.js').SubjectType;
|
|
185
185
|
export interface CommsConsentUpsertRequest {
|
|
186
186
|
contactId: string;
|
|
187
187
|
channels?: ConsentChannels;
|
|
@@ -229,7 +229,7 @@ export interface CommsListMethodsQuery {
|
|
|
229
229
|
}
|
|
230
230
|
export interface CommsListMethodsResponse {
|
|
231
231
|
ok: true;
|
|
232
|
-
methods: import('./contact').CommMethod[];
|
|
232
|
+
methods: import('./contact.js').CommMethod[];
|
|
233
233
|
}
|
|
234
234
|
export interface RegisterEmailMethodRequest {
|
|
235
235
|
contactId?: string;
|