@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,129 @@
|
|
|
1
|
+
import { createLogger } from "./createGroqSearchFilter.js";
|
|
2
|
+
import { defineEvent } from "@sanity/telemetry";
|
|
3
|
+
function isLocalUrl(win) {
|
|
4
|
+
const url = win.location?.href;
|
|
5
|
+
return url ? url.startsWith("http://localhost") || url.startsWith("https://localhost") || url.startsWith("http://127.0.0.1") || url.startsWith("https://127.0.0.1") : !1;
|
|
6
|
+
}
|
|
7
|
+
function isDevMode() {
|
|
8
|
+
return typeof process < "u" && process.env?.NODE_ENV === "production" ? !1 : typeof window < "u" ? isLocalUrl(window) : typeof process < "u" && process.env?.NODE_ENV === "development";
|
|
9
|
+
}
|
|
10
|
+
const SDKDevSessionStarted = defineEvent({
|
|
11
|
+
name: "SDK Dev Session Started",
|
|
12
|
+
version: 1,
|
|
13
|
+
description: "SDK instance created in development mode"
|
|
14
|
+
}), SDKHookMounted = defineEvent({
|
|
15
|
+
name: "SDK Hook Mounted",
|
|
16
|
+
version: 1,
|
|
17
|
+
description: "An SDK hook was mounted for the first time in this session"
|
|
18
|
+
}), SDKDevSessionEnded = defineEvent({
|
|
19
|
+
name: "SDK Dev Session Ended",
|
|
20
|
+
version: 1,
|
|
21
|
+
description: "SDK instance disposed in development mode"
|
|
22
|
+
}), SDKDevError = defineEvent({
|
|
23
|
+
name: "SDK Dev Error",
|
|
24
|
+
version: 1,
|
|
25
|
+
description: "Runtime error caught during SDK development"
|
|
26
|
+
}), DEFAULT_TELEMETRY_API_VERSION = "2024-11-12", logger = createLogger("telemetry"), telemetryManagers = /* @__PURE__ */ new WeakMap(), pendingHooks = /* @__PURE__ */ new WeakMap(), initInFlight = /* @__PURE__ */ new WeakSet();
|
|
27
|
+
function initTelemetry(instance, projectId) {
|
|
28
|
+
if (!isDevMode()) {
|
|
29
|
+
logger.trace("initTelemetry skipped: not dev mode", { internal: !0 });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!projectId) {
|
|
33
|
+
logger.trace("initTelemetry skipped: no projectId", { internal: !0 });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
telemetryManagers.has(instance) || initInFlight.has(instance) || (initInFlight.add(instance), logger.debug("initializing telemetry", { projectId }), Promise.all([
|
|
37
|
+
import("./telemetryManager.js"),
|
|
38
|
+
import("./createGroqSearchFilter.js").then(function(n) {
|
|
39
|
+
return n.clientStore;
|
|
40
|
+
}),
|
|
41
|
+
import("./createGroqSearchFilter.js").then(function(n) {
|
|
42
|
+
return n.authStore$1;
|
|
43
|
+
})
|
|
44
|
+
]).then(async ([{ createTelemetryManager }, { getClient }, { getTokenState }]) => {
|
|
45
|
+
if (instance.isDisposed()) {
|
|
46
|
+
initInFlight.delete(instance), logger.debug("telemetry skipped: instance disposed before imports resolved");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const token = getTokenState(instance).getCurrent();
|
|
50
|
+
if (logger.trace("auth token check", { tokenPresent: !!token, internal: !0 }), !token && (logger.debug("waiting for auth token"), !await new Promise((resolve) => {
|
|
51
|
+
if (instance.isDisposed()) return resolve(!1);
|
|
52
|
+
const cleanup = { unsubscribe: () => {
|
|
53
|
+
} }, unsub = instance.onDispose(() => {
|
|
54
|
+
cleanup.unsubscribe(), resolve(!1);
|
|
55
|
+
}), sub = getTokenState(instance).observable.subscribe((t) => {
|
|
56
|
+
t && (logger.debug("auth token received"), sub.unsubscribe(), unsub(), resolve(!0));
|
|
57
|
+
});
|
|
58
|
+
cleanup.unsubscribe = () => sub.unsubscribe();
|
|
59
|
+
}) || instance.isDisposed())) {
|
|
60
|
+
initInFlight.delete(instance), logger.debug("telemetry skipped: no token resolved or instance disposed");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const manager = createTelemetryManager({
|
|
64
|
+
sessionId: instance.instanceId,
|
|
65
|
+
getClient: () => getClient(instance, { apiVersion: DEFAULT_TELEMETRY_API_VERSION }),
|
|
66
|
+
projectId
|
|
67
|
+
}), consented = await manager.checkConsent();
|
|
68
|
+
if (logger.debug("consent check complete", { consented }), !consented || instance.isDisposed()) {
|
|
69
|
+
initInFlight.delete(instance), manager.dispose();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
initInFlight.delete(instance), telemetryManagers.set(instance, manager);
|
|
73
|
+
const buffered = pendingHooks.get(instance);
|
|
74
|
+
if (buffered) {
|
|
75
|
+
logger.debug("flushing buffered hooks", { hooks: Array.from(buffered) });
|
|
76
|
+
for (const hookName of buffered)
|
|
77
|
+
manager.logHookFirstUsed(hookName);
|
|
78
|
+
pendingHooks.delete(instance);
|
|
79
|
+
}
|
|
80
|
+
const config = instance.config, perspective = typeof config.perspective == "string" ? config.perspective : "published", authMethod = config.auth?.token ? "token" : config.studio?.auth?.token ? "studio" : "default";
|
|
81
|
+
logger.info("telemetry session started", { projectId, perspective, authMethod }), manager.logSessionStarted({
|
|
82
|
+
projectId,
|
|
83
|
+
perspective,
|
|
84
|
+
authMethod
|
|
85
|
+
}), instance.onDispose(() => {
|
|
86
|
+
manager.endSession(), telemetryManagers.delete(instance), logger.debug("telemetry session ended");
|
|
87
|
+
});
|
|
88
|
+
}).catch((err) => {
|
|
89
|
+
initInFlight.delete(instance), logger.warn("telemetry init failed", { error: err });
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
function getTelemetryManager(instance) {
|
|
93
|
+
return telemetryManagers.get(instance);
|
|
94
|
+
}
|
|
95
|
+
function trackHookMounted(instance, hookName) {
|
|
96
|
+
if (!isDevMode()) return;
|
|
97
|
+
const manager = findManager(instance);
|
|
98
|
+
if (manager) {
|
|
99
|
+
logger.trace("hook mounted (logged)", { hookName, internal: !0 }), manager.logHookFirstUsed(hookName);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const root = getRootInstance(instance);
|
|
103
|
+
let hooks = pendingHooks.get(root);
|
|
104
|
+
hooks || (hooks = /* @__PURE__ */ new Set(), pendingHooks.set(root, hooks)), hooks.has(hookName) || logger.trace("hook mounted (buffered)", { hookName, internal: !0 }), hooks.add(hookName);
|
|
105
|
+
}
|
|
106
|
+
function findManager(instance) {
|
|
107
|
+
let current = instance;
|
|
108
|
+
for (; current; ) {
|
|
109
|
+
const manager = telemetryManagers.get(current);
|
|
110
|
+
if (manager) return manager;
|
|
111
|
+
current = typeof current.getParent == "function" ? current.getParent() : void 0;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function getRootInstance(instance) {
|
|
115
|
+
let current = instance;
|
|
116
|
+
for (; typeof current.getParent == "function" && current.getParent(); )
|
|
117
|
+
current = current.getParent();
|
|
118
|
+
return current;
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
SDKDevError,
|
|
122
|
+
SDKDevSessionEnded,
|
|
123
|
+
SDKDevSessionStarted,
|
|
124
|
+
SDKHookMounted,
|
|
125
|
+
getTelemetryManager,
|
|
126
|
+
initTelemetry,
|
|
127
|
+
trackHookMounted
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=_internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_internal.js","sources":["../../src/telemetry/devMode.ts","../../src/telemetry/__telemetry__/sdk.telemetry.ts","../../src/telemetry/initTelemetry.ts"],"sourcesContent":["/**\n * Checks whether the current URL points to a local development server.\n *\n * @param win - The window object to check\n * @returns True if running on localhost or 127.0.0.1\n * @internal\n */\nfunction isLocalUrl(win: Window): boolean {\n const url = win.location?.href\n if (!url) return false\n return (\n url.startsWith('http://localhost') ||\n url.startsWith('https://localhost') ||\n url.startsWith('http://127.0.0.1') ||\n url.startsWith('https://127.0.0.1')\n )\n}\n\n/**\n * Determines whether the SDK should enable dev-mode telemetry.\n *\n * Combines a browser URL check (localhost/127.0.0.1) with a Node.js\n * environment variable check (`NODE_ENV === 'development'`). Returns\n * false in production environments so bundlers can tree-shake the\n * telemetry code path entirely.\n *\n * @returns True if the SDK is running in a development environment\n * @internal\n */\nexport function isDevMode(): boolean {\n if (typeof process !== 'undefined' && process.env?.['NODE_ENV'] === 'production') {\n return false\n }\n\n if (typeof window !== 'undefined') {\n return isLocalUrl(window)\n }\n\n return typeof process !== 'undefined' && process.env?.['NODE_ENV'] === 'development'\n}\n","import {defineEvent} from '@sanity/telemetry'\n\n/** @internal */\nexport const SDKDevSessionStarted = defineEvent<{\n version: string\n projectId: string\n perspective: string\n authMethod: string\n}>({\n name: 'SDK Dev Session Started',\n version: 1,\n description: 'SDK instance created in development mode',\n})\n\n/** @internal */\nexport const SDKHookMounted = defineEvent<{\n hookName: string\n}>({\n name: 'SDK Hook Mounted',\n version: 1,\n description: 'An SDK hook was mounted for the first time in this session',\n})\n\n/** @internal */\nexport const SDKDevSessionEnded = defineEvent<{\n durationSeconds: number\n hooksUsed: string[]\n}>({\n name: 'SDK Dev Session Ended',\n version: 1,\n description: 'SDK instance disposed in development mode',\n})\n\n/** @internal */\nexport const SDKDevError = defineEvent<{\n errorType: string\n hookName: string\n}>({\n name: 'SDK Dev Error',\n version: 1,\n description: 'Runtime error caught during SDK development',\n})\n","import {type SanityInstance} from '../store/createSanityInstance'\nimport {createLogger} from '../utils/logger'\nimport {isDevMode} from './devMode'\nimport {type TelemetryManager} from './telemetryManager'\n\nconst DEFAULT_TELEMETRY_API_VERSION = '2024-11-12'\n\nconst logger = createLogger('telemetry')\n\n/**\n * Per-instance map of active telemetry managers. Allows the React\n * package (and other consumers) to look up the manager for a given\n * instance and log hook usage / errors without importing the full\n * telemetry module themselves.\n *\n * @internal\n */\nconst telemetryManagers = new WeakMap<SanityInstance, TelemetryManager>()\nconst pendingHooks = new WeakMap<SanityInstance, Set<string>>()\nconst initInFlight = new WeakSet<SanityInstance>()\n\n/**\n * Initializes dev-mode telemetry for a SDK instance if the environment\n * qualifies. Both `telemetryManager` and `clientStore` are dynamically\n * imported to avoid circular dependencies and to keep telemetry code\n * out of production bundles via code splitting.\n *\n * The `projectId` must be passed explicitly because the resource\n * configuration is typically set by the React layer after the\n * instance has already been created.\n *\n * @internal\n */\nexport function initTelemetry(instance: SanityInstance, projectId: string): void {\n if (!isDevMode()) {\n logger.trace('initTelemetry skipped: not dev mode', {internal: true})\n return\n }\n if (!projectId) {\n logger.trace('initTelemetry skipped: no projectId', {internal: true})\n return\n }\n if (telemetryManagers.has(instance) || initInFlight.has(instance)) {\n return\n }\n initInFlight.add(instance)\n\n logger.debug('initializing telemetry', {projectId})\n\n Promise.all([\n import('./telemetryManager'),\n import('../client/clientStore'),\n import('../auth/authStore'),\n ])\n .then(async ([{createTelemetryManager}, {getClient}, {getTokenState}]) => {\n if (instance.isDisposed()) {\n initInFlight.delete(instance)\n logger.debug('telemetry skipped: instance disposed before imports resolved')\n return\n }\n\n // Wait for the auth store to resolve a token. The client needs a\n // Bearer token for the consent check and batch POSTs. If the token\n // is already available (e.g. static token config), this resolves\n // immediately. For OAuth/localStorage discovery it waits for the\n // first emission. For unauthenticated apps the promise never\n // resolves, which is fine since telemetry requires auth anyway.\n const token = getTokenState(instance).getCurrent()\n logger.trace('auth token check', {tokenPresent: !!token, internal: true})\n\n if (!token) {\n logger.debug('waiting for auth token')\n const hasToken = await new Promise<boolean>((resolve) => {\n if (instance.isDisposed()) return resolve(false)\n const cleanup = {unsubscribe: () => {}}\n const unsub = instance.onDispose(() => {\n cleanup.unsubscribe()\n resolve(false)\n })\n const sub = getTokenState(instance).observable.subscribe((t) => {\n if (t) {\n logger.debug('auth token received')\n sub.unsubscribe()\n unsub()\n resolve(true)\n }\n })\n cleanup.unsubscribe = () => sub.unsubscribe()\n })\n if (!hasToken || instance.isDisposed()) {\n initInFlight.delete(instance)\n logger.debug('telemetry skipped: no token resolved or instance disposed')\n return\n }\n }\n\n const manager = createTelemetryManager({\n sessionId: instance.instanceId,\n getClient: () => getClient(instance, {apiVersion: DEFAULT_TELEMETRY_API_VERSION}),\n projectId,\n })\n\n const consented = await manager.checkConsent()\n logger.debug('consent check complete', {consented})\n if (!consented || instance.isDisposed()) {\n initInFlight.delete(instance)\n manager.dispose()\n return\n }\n\n initInFlight.delete(instance)\n telemetryManagers.set(instance, manager)\n\n const buffered = pendingHooks.get(instance)\n if (buffered) {\n logger.debug('flushing buffered hooks', {hooks: Array.from(buffered)})\n for (const hookName of buffered) {\n manager.logHookFirstUsed(hookName)\n }\n pendingHooks.delete(instance)\n }\n\n const config = instance.config\n const perspective = typeof config.perspective === 'string' ? config.perspective : 'published'\n const authMethod = config.auth?.token\n ? 'token'\n : config.studio?.auth?.token\n ? 'studio'\n : 'default'\n\n logger.info('telemetry session started', {projectId, perspective, authMethod})\n manager.logSessionStarted({\n projectId,\n perspective,\n authMethod,\n })\n\n instance.onDispose(() => {\n manager.endSession()\n telemetryManagers.delete(instance)\n logger.debug('telemetry session ended')\n })\n })\n .catch((err) => {\n initInFlight.delete(instance)\n logger.warn('telemetry init failed', {error: err})\n })\n}\n\n/**\n * Retrieves the telemetry manager for an instance, if one exists.\n * Returns undefined when telemetry is disabled or not yet initialized.\n *\n * @internal\n */\nexport function getTelemetryManager(instance: SanityInstance): TelemetryManager | undefined {\n return telemetryManagers.get(instance)\n}\n\n/**\n * Record a hook name for an instance. If the telemetry manager is\n * already initialized the event is logged immediately. Otherwise\n * the name is buffered and flushed when init completes.\n *\n * @internal\n */\nexport function trackHookMounted(instance: SanityInstance, hookName: string): void {\n if (!isDevMode()) return\n\n const manager = findManager(instance)\n if (manager) {\n logger.trace('hook mounted (logged)', {hookName, internal: true})\n manager.logHookFirstUsed(hookName)\n return\n }\n\n const root = getRootInstance(instance)\n let hooks = pendingHooks.get(root)\n if (!hooks) {\n hooks = new Set()\n pendingHooks.set(root, hooks)\n }\n if (!hooks.has(hookName)) {\n logger.trace('hook mounted (buffered)', {hookName, internal: true})\n }\n hooks.add(hookName)\n}\n\nfunction findManager(instance: SanityInstance): TelemetryManager | undefined {\n let current: SanityInstance | undefined = instance\n while (current) {\n const manager = telemetryManagers.get(current)\n if (manager) return manager\n current = typeof current.getParent === 'function' ? current.getParent() : undefined\n }\n return undefined\n}\n\nfunction getRootInstance(instance: SanityInstance): SanityInstance {\n let current = instance\n while (typeof current.getParent === 'function' && current.getParent()) {\n current = current.getParent()!\n }\n return current\n}\n"],"names":[],"mappings":"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"}
|