@sanity/sdk 2.8.0 → 2.10.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/dist/_chunks-dts/utils.d.ts +2450 -0
- package/dist/_chunks-es/_internal.js +129 -0
- package/dist/_chunks-es/_internal.js.map +1 -0
- package/dist/_chunks-es/createGroqSearchFilter.js +1537 -0
- package/dist/_chunks-es/createGroqSearchFilter.js.map +1 -0
- package/dist/_chunks-es/telemetryManager.js +87 -0
- package/dist/_chunks-es/telemetryManager.js.map +1 -0
- package/dist/_chunks-es/version.js +7 -0
- package/dist/_chunks-es/version.js.map +1 -0
- package/dist/_exports/_internal.d.ts +64 -0
- package/dist/_exports/_internal.js +20 -0
- package/dist/_exports/_internal.js.map +1 -0
- package/dist/index.d.ts +2 -2343
- package/dist/index.js +465 -1813
- package/dist/index.js.map +1 -1
- package/package.json +17 -12
- package/src/_exports/_internal.ts +14 -0
- package/src/_exports/index.ts +18 -1
- package/src/auth/authStore.test.ts +150 -1
- package/src/auth/authStore.ts +11 -11
- package/src/auth/dashboardAuth.ts +2 -2
- package/src/auth/handleAuthCallback.ts +9 -3
- package/src/auth/logout.test.ts +1 -1
- package/src/auth/logout.ts +1 -1
- package/src/auth/refreshStampedToken.test.ts +118 -1
- package/src/auth/refreshStampedToken.ts +3 -2
- package/src/auth/standaloneAuth.ts +9 -3
- package/src/auth/studioAuth.ts +34 -7
- package/src/auth/studioModeAuth.ts +2 -1
- package/src/auth/subscribeToStateAndFetchCurrentUser.test.ts +10 -2
- package/src/auth/subscribeToStateAndFetchCurrentUser.ts +5 -1
- package/src/auth/subscribeToStorageEventsAndSetToken.ts +2 -2
- package/src/auth/utils.ts +33 -0
- package/src/client/clientStore.test.ts +44 -30
- package/src/client/clientStore.ts +49 -48
- package/src/comlink/controller/actions/getOrCreateChannel.ts +2 -2
- package/src/comlink/node/actions/getOrCreateNode.ts +2 -2
- package/src/comlink/node/getNodeState.ts +2 -1
- package/src/config/sanityConfig.ts +78 -12
- package/src/document/actions.ts +18 -11
- package/src/document/applyDocumentActions.test.ts +7 -6
- package/src/document/applyDocumentActions.ts +10 -4
- package/src/document/documentStore.test.ts +542 -188
- package/src/document/documentStore.ts +142 -76
- package/src/document/events.ts +7 -2
- package/src/document/permissions.test.ts +18 -16
- package/src/document/permissions.ts +35 -11
- package/src/document/processActions.test.ts +359 -32
- package/src/document/processActions.ts +106 -78
- package/src/document/reducers.test.ts +117 -29
- package/src/document/reducers.ts +47 -40
- package/src/document/sharedListener.ts +16 -6
- package/src/document/util.ts +14 -0
- package/src/favorites/favorites.test.ts +9 -2
- package/src/presence/bifurTransport.test.ts +46 -6
- package/src/presence/bifurTransport.ts +19 -2
- package/src/presence/presenceStore.test.ts +96 -0
- package/src/presence/presenceStore.ts +96 -24
- package/src/preview/getPreviewState.test.ts +115 -98
- package/src/preview/getPreviewState.ts +38 -60
- package/src/preview/previewProjectionUtils.test.ts +179 -0
- package/src/preview/previewProjectionUtils.ts +93 -0
- package/src/preview/resolvePreview.test.ts +42 -25
- package/src/preview/resolvePreview.ts +33 -10
- package/src/preview/{previewStore.ts → types.ts} +8 -17
- package/src/projection/getProjectionState.test.ts +16 -16
- package/src/projection/getProjectionState.ts +6 -5
- package/src/projection/projectionQuery.ts +2 -3
- package/src/projection/projectionStore.test.ts +2 -2
- package/src/projection/resolveProjection.ts +2 -2
- package/src/projection/subscribeToStateAndFetchBatches.test.ts +1 -1
- package/src/projection/subscribeToStateAndFetchBatches.ts +12 -11
- package/src/projection/types.ts +1 -1
- package/src/query/queryStore.test.ts +12 -12
- package/src/query/queryStore.ts +12 -11
- package/src/query/reducers.ts +3 -3
- package/src/releases/getPerspectiveState.ts +7 -6
- package/src/releases/releasesStore.test.ts +20 -5
- package/src/releases/releasesStore.ts +20 -8
- package/src/store/createActionBinder.test.ts +31 -31
- package/src/store/createActionBinder.ts +43 -38
- package/src/store/createSanityInstance.ts +2 -3
- package/src/store/createStateSourceAction.test.ts +62 -0
- package/src/store/createStateSourceAction.ts +34 -39
- package/src/telemetry/__telemetry__/sdk.telemetry.ts +42 -0
- package/src/telemetry/devMode.test.ts +52 -0
- package/src/telemetry/devMode.ts +40 -0
- package/src/telemetry/initTelemetry.test.ts +225 -0
- package/src/telemetry/initTelemetry.ts +205 -0
- package/src/telemetry/telemetryManager.test.ts +263 -0
- package/src/telemetry/telemetryManager.ts +187 -0
- package/src/users/reducers.ts +3 -4
- package/src/users/usersStore.test.ts +1 -0
- package/src/users/usersStore.ts +5 -1
- package/src/utils/createFetcherStore.test.ts +6 -4
- package/src/utils/createFetcherStore.ts +8 -5
- package/src/utils/getStagingApiHost.test.ts +21 -0
- package/src/utils/getStagingApiHost.ts +14 -0
- package/src/utils/ids.test.ts +1 -29
- package/src/utils/ids.ts +0 -10
- package/src/utils/isImportError.test.ts +72 -0
- package/src/utils/isImportError.ts +34 -0
- package/src/utils/object.test.ts +95 -0
- package/src/utils/object.ts +142 -0
- package/src/utils/setCleanupTimeout.ts +24 -0
- package/src/preview/previewQuery.test.ts +0 -236
- package/src/preview/previewQuery.ts +0 -153
- package/src/preview/previewStore.test.ts +0 -36
- package/src/preview/subscribeToStateAndFetchBatches.test.ts +0 -221
- package/src/preview/subscribeToStateAndFetchBatches.ts +0 -112
- package/src/preview/util.ts +0 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetryManager.js","sources":["../../src/telemetry/telemetryManager.ts"],"sourcesContent":["import {type SanityClient} from '@sanity/client'\nimport {\n type ConsentStatus,\n createBatchedStore,\n type SessionId,\n type TelemetryEvent,\n type TelemetryLogger,\n type TelemetryStore,\n} from '@sanity/telemetry'\n\nimport {createLogger} from '../utils/logger'\nimport {CORE_SDK_VERSION} from '../version'\nimport {\n SDKDevError,\n SDKDevSessionEnded,\n SDKDevSessionStarted,\n SDKHookMounted,\n} from './__telemetry__/sdk.telemetry'\n\nconst FLUSH_INTERVAL_MS = 30_000\nconst CONSENT_TAG = 'telemetry-consent.sdk'\nconst BATCH_TAG = 'telemetry.batch'\n\nconst log = createLogger('telemetry')\n\n/**\n * Manages dev-mode telemetry for a single SDK instance.\n *\n * Wraps `@sanity/telemetry`'s batched store with SDK-specific concerns:\n * consent caching, session lifecycle events, and hook usage tracking.\n *\n * @internal\n */\nexport interface TelemetryManager {\n /**\n * Eagerly resolve and cache the user's consent status.\n * Returns true only when the user has explicitly opted in (`granted`).\n * Call this before logging any events to avoid buffering events that\n * will be dropped on the first flush.\n */\n checkConsent(): Promise<boolean>\n\n /** Log a \"SDK Dev Session Started\" event */\n logSessionStarted(data: {projectId: string; perspective: string; authMethod: string}): void\n\n /** Log a \"SDK Hook First Used\" event (deduplicated per hook name) */\n logHookFirstUsed(hookName: string): void\n\n /** Log a \"SDK Dev Error\" event */\n logDevError(errorType: string, hookName: string): void\n\n /** Log a \"SDK Dev Session Ended\" event and tear down the store */\n endSession(): void\n\n /** Tear down the store without logging a session-end event */\n dispose(): void\n\n /** The set of hook names used during this session */\n readonly hooksUsed: ReadonlySet<string>\n}\n\ninterface TelemetryManagerOptions {\n sessionId: string\n getClient: () => SanityClient\n projectId: string\n}\n\n/**\n * Creates a telemetry manager for a single SDK instance session.\n *\n * The manager initializes a `createBatchedStore` from `@sanity/telemetry`,\n * caches the consent check for the lifetime of the session, and provides\n * typed methods for each SDK telemetry event.\n *\n * @internal\n */\nexport function createTelemetryManager(options: TelemetryManagerOptions): TelemetryManager {\n const {sessionId, getClient, projectId} = options\n const startedAt = Date.now()\n const emittedHooks = new Set<string>()\n\n let cachedConsent: {status: ConsentStatus} | null = null\n\n const resolveConsent = async (): Promise<{status: ConsentStatus}> => {\n if (cachedConsent) return cachedConsent\n try {\n const client = getClient()\n const result = await client.request<{status: ConsentStatus}>({\n uri: '/intake/telemetry-status',\n tag: CONSENT_TAG,\n })\n cachedConsent = result\n } catch {\n cachedConsent = {status: 'undetermined'}\n }\n return cachedConsent\n }\n\n const enrichBatch = (batch: TelemetryEvent[]) =>\n batch.map((event) => ({\n ...event,\n context: {\n version: CORE_SDK_VERSION,\n environment: 'development' as const,\n origin: typeof window !== 'undefined' ? window.location.origin : 'node',\n },\n }))\n\n const sendEvents = async (batch: TelemetryEvent[]): Promise<unknown> => {\n const client = getClient()\n log.debug('sending event batch', {batchSize: batch.length})\n return client.request({\n uri: '/intake/batch',\n method: 'POST',\n body: {projectId, batch: enrichBatch(batch)},\n tag: BATCH_TAG,\n })\n }\n\n const store: TelemetryStore<Record<string, unknown>> = createBatchedStore(\n sessionId as SessionId,\n {\n flushInterval: FLUSH_INTERVAL_MS,\n resolveConsent,\n sendEvents,\n },\n )\n\n const logger: TelemetryLogger<Record<string, unknown>> = store.logger\n\n return {\n async checkConsent() {\n const {status} = await resolveConsent()\n return status === 'granted'\n },\n\n logSessionStarted(data) {\n log.debug('event: SDK Dev Session Started', {\n projectId: data.projectId,\n perspective: data.perspective,\n authMethod: data.authMethod,\n version: CORE_SDK_VERSION,\n })\n logger.log(SDKDevSessionStarted, {\n version: CORE_SDK_VERSION,\n ...data,\n })\n },\n\n logHookFirstUsed(hookName: string) {\n if (emittedHooks.has(hookName)) return\n emittedHooks.add(hookName)\n log.debug('event: SDK Hook Mounted', {hookName})\n logger.log(SDKHookMounted, {hookName})\n },\n\n logDevError(errorType: string, hookName: string) {\n log.debug('event: SDK Dev Error', {errorType, hookName})\n logger.log(SDKDevError, {errorType, hookName})\n },\n\n endSession() {\n const durationSeconds = Math.round((Date.now() - startedAt) / 1000)\n log.debug('event: SDK Dev Session Ended', {\n durationSeconds,\n hooksUsed: [...emittedHooks],\n })\n logger.log(SDKDevSessionEnded, {\n durationSeconds,\n hooksUsed: [...emittedHooks],\n })\n\n store.flush().catch(() => {\n // Best-effort flush on dispose; swallow errors\n })\n store.end()\n },\n\n dispose() {\n store.end()\n },\n\n get hooksUsed(): ReadonlySet<string> {\n return emittedHooks\n },\n }\n}\n"],"names":[],"mappings":";;;;AAmBA,MAAM,oBAAoB,KACpB,cAAc,yBACd,YAAY,mBAEZ,MAAM,aAAa,WAAW;AAqD7B,SAAS,uBAAuB,SAAoD;AACzF,QAAM,EAAC,WAAW,WAAW,UAAA,IAAa,SACpC,YAAY,KAAK,IAAA,GACjB,eAAe,oBAAI,IAAA;AAEzB,MAAI,gBAAgD;AAEpD,QAAM,iBAAiB,YAA8C;AACnE,QAAI,cAAe,QAAO;AAC1B,QAAI;AAMF,sBAJe,MADA,UAAA,EACa,QAAiC;AAAA,QAC3D,KAAK;AAAA,QACL,KAAK;AAAA,MAAA,CACN;AAAA,IAEH,QAAQ;AACN,sBAAgB,EAAC,QAAQ,eAAA;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,GAEM,cAAc,CAAC,UACnB,MAAM,IAAI,CAAC,WAAW;AAAA,IACpB,GAAG;AAAA,IACH,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,MACb,QAAQ,OAAO,SAAW,MAAc,OAAO,SAAS,SAAS;AAAA,IAAA;AAAA,EACnE,EACA,GAaE,QAAiD;AAAA,IACrD;AAAA,IACA;AAAA,MACE,eAAe;AAAA,MACf;AAAA,MACA,YAhBe,OAAO,UAA8C;AACtE,cAAM,SAAS,UAAA;AACf,eAAA,IAAI,MAAM,uBAAuB,EAAC,WAAW,MAAM,OAAA,CAAO,GACnD,OAAO,QAAQ;AAAA,UACpB,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,MAAM,EAAC,WAAW,OAAO,YAAY,KAAK,EAAA;AAAA,UAC1C,KAAK;AAAA,QAAA,CACN;AAAA,MACH;AAAA,IAAA;AAAA,EAQE,GAGI,SAAmD,MAAM;AAE/D,SAAO;AAAA,IACL,MAAM,eAAe;AACnB,YAAM,EAAC,WAAU,MAAM,eAAA;AACvB,aAAO,WAAW;AAAA,IACpB;AAAA,IAEA,kBAAkB,MAAM;AACtB,UAAI,MAAM,kCAAkC;AAAA,QAC1C,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,SAAS;AAAA,MAAA,CACV,GACD,OAAO,IAAI,sBAAsB;AAAA,QAC/B,SAAS;AAAA,QACT,GAAG;AAAA,MAAA,CACJ;AAAA,IACH;AAAA,IAEA,iBAAiB,UAAkB;AAC7B,mBAAa,IAAI,QAAQ,MAC7B,aAAa,IAAI,QAAQ,GACzB,IAAI,MAAM,2BAA2B,EAAC,SAAA,CAAS,GAC/C,OAAO,IAAI,gBAAgB,EAAC,UAAS;AAAA,IACvC;AAAA,IAEA,YAAY,WAAmB,UAAkB;AAC/C,UAAI,MAAM,wBAAwB,EAAC,WAAW,SAAA,CAAS,GACvD,OAAO,IAAI,aAAa,EAAC,WAAW,UAAS;AAAA,IAC/C;AAAA,IAEA,aAAa;AACX,YAAM,kBAAkB,KAAK,OAAO,KAAK,IAAA,IAAQ,aAAa,GAAI;AAClE,UAAI,MAAM,gCAAgC;AAAA,QACxC;AAAA,QACA,WAAW,CAAC,GAAG,YAAY;AAAA,MAAA,CAC5B,GACD,OAAO,IAAI,oBAAoB;AAAA,QAC7B;AAAA,QACA,WAAW,CAAC,GAAG,YAAY;AAAA,MAAA,CAC5B,GAED,MAAM,MAAA,EAAQ,MAAM,MAAM;AAAA,MAE1B,CAAC,GACD,MAAM,IAAA;AAAA,IACR;AAAA,IAEA,UAAU;AACR,YAAM,IAAA;AAAA,IACR;AAAA,IAEA,IAAI,YAAiC;AACnC,aAAO;AAAA,IACT;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../../src/version.ts"],"sourcesContent":["import {version} from '../package.json'\nimport {getEnv} from './utils/getEnv'\n\n/**\n * This version is provided by pkg-utils at build time\n * @internal\n */\nexport const CORE_SDK_VERSION = getEnv('PKG_VERSION') || `${version}-development`\n"],"names":[],"mappings":";;AAOO,MAAM,mBAAmB,OAAO,aAAa,KAAK,GAAG,OAAO;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { F as createGroqSearchFilter, Sr as isStudioConfig, U as getUsersKey, W as parseUsersKey, Y as getQueryKey, Z as parseQueryKey, a as isProjectUserNotFoundClientError, br as SanityInstance, ct as PREVIEW_PROJECTION, i as getClientErrorApiType, n as getClientErrorApiBody, r as getClientErrorApiDescription, st as transformProjectionToPreview, t as ApiErrorBody } from "../_chunks-dts/utils.js";
|
|
2
|
+
import { SanityClient } from "@sanity/client";
|
|
3
|
+
/**
|
|
4
|
+
* Manages dev-mode telemetry for a single SDK instance.
|
|
5
|
+
*
|
|
6
|
+
* Wraps `@sanity/telemetry`'s batched store with SDK-specific concerns:
|
|
7
|
+
* consent caching, session lifecycle events, and hook usage tracking.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
interface TelemetryManager {
|
|
12
|
+
/**
|
|
13
|
+
* Eagerly resolve and cache the user's consent status.
|
|
14
|
+
* Returns true only when the user has explicitly opted in (`granted`).
|
|
15
|
+
* Call this before logging any events to avoid buffering events that
|
|
16
|
+
* will be dropped on the first flush.
|
|
17
|
+
*/
|
|
18
|
+
checkConsent(): Promise<boolean>;
|
|
19
|
+
/** Log a "SDK Dev Session Started" event */
|
|
20
|
+
logSessionStarted(data: {
|
|
21
|
+
projectId: string;
|
|
22
|
+
perspective: string;
|
|
23
|
+
authMethod: string;
|
|
24
|
+
}): void;
|
|
25
|
+
/** Log a "SDK Hook First Used" event (deduplicated per hook name) */
|
|
26
|
+
logHookFirstUsed(hookName: string): void;
|
|
27
|
+
/** Log a "SDK Dev Error" event */
|
|
28
|
+
logDevError(errorType: string, hookName: string): void;
|
|
29
|
+
/** Log a "SDK Dev Session Ended" event and tear down the store */
|
|
30
|
+
endSession(): void;
|
|
31
|
+
/** Tear down the store without logging a session-end event */
|
|
32
|
+
dispose(): void;
|
|
33
|
+
/** The set of hook names used during this session */
|
|
34
|
+
readonly hooksUsed: ReadonlySet<string>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initializes dev-mode telemetry for a SDK instance if the environment
|
|
38
|
+
* qualifies. Both `telemetryManager` and `clientStore` are dynamically
|
|
39
|
+
* imported to avoid circular dependencies and to keep telemetry code
|
|
40
|
+
* out of production bundles via code splitting.
|
|
41
|
+
*
|
|
42
|
+
* The `projectId` must be passed explicitly because the resource
|
|
43
|
+
* configuration is typically set by the React layer after the
|
|
44
|
+
* instance has already been created.
|
|
45
|
+
*
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
declare function initTelemetry(instance: SanityInstance, projectId: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Retrieves the telemetry manager for an instance, if one exists.
|
|
51
|
+
* Returns undefined when telemetry is disabled or not yet initialized.
|
|
52
|
+
*
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
declare function getTelemetryManager(instance: SanityInstance): TelemetryManager | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Record a hook name for an instance. If the telemetry manager is
|
|
58
|
+
* already initialized the event is logged immediately. Otherwise
|
|
59
|
+
* the name is buffered and flushed when init completes.
|
|
60
|
+
*
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
declare function trackHookMounted(instance: SanityInstance, hookName: string): void;
|
|
64
|
+
export { type ApiErrorBody, PREVIEW_PROJECTION, createGroqSearchFilter, getClientErrorApiBody, getClientErrorApiDescription, getClientErrorApiType, getQueryKey, getTelemetryManager, getUsersKey, initTelemetry, isProjectUserNotFoundClientError, isStudioConfig, parseQueryKey, parseUsersKey, trackHookMounted, transformProjectionToPreview };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PREVIEW_PROJECTION, createGroqSearchFilter, getClientErrorApiBody, getClientErrorApiDescription, getClientErrorApiType, getQueryKey, getUsersKey, isProjectUserNotFoundClientError, isStudioConfig, parseQueryKey, parseUsersKey, transformProjectionToPreview } from "../_chunks-es/createGroqSearchFilter.js";
|
|
2
|
+
import { getTelemetryManager, initTelemetry, trackHookMounted } from "../_chunks-es/_internal.js";
|
|
3
|
+
export {
|
|
4
|
+
PREVIEW_PROJECTION,
|
|
5
|
+
createGroqSearchFilter,
|
|
6
|
+
getClientErrorApiBody,
|
|
7
|
+
getClientErrorApiDescription,
|
|
8
|
+
getClientErrorApiType,
|
|
9
|
+
getQueryKey,
|
|
10
|
+
getTelemetryManager,
|
|
11
|
+
getUsersKey,
|
|
12
|
+
initTelemetry,
|
|
13
|
+
isProjectUserNotFoundClientError,
|
|
14
|
+
isStudioConfig,
|
|
15
|
+
parseQueryKey,
|
|
16
|
+
parseUsersKey,
|
|
17
|
+
trackHookMounted,
|
|
18
|
+
transformProjectionToPreview
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=_internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_internal.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|