@sanity/sdk 3.0.0-rc.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/_exports/_internal.d.ts +71 -3
- package/dist/_exports/_internal.d.ts.map +1 -1
- package/dist/_exports/_internal.js +332 -24
- package/dist/_exports/_internal.js.map +1 -1
- package/dist/_exports/agent.d.ts +65 -0
- package/dist/_exports/agent.d.ts.map +1 -0
- package/dist/_exports/agent.js +71 -0
- package/dist/_exports/agent.js.map +1 -0
- package/dist/_exports/comlink.d.ts +118 -0
- package/dist/_exports/comlink.d.ts.map +1 -0
- package/dist/_exports/comlink.js +69 -0
- package/dist/_exports/comlink.js.map +1 -0
- package/dist/authStore-C0o1NOxW.d.ts +3165 -0
- package/dist/authStore-C0o1NOxW.d.ts.map +1 -0
- package/dist/authStore-CtE9bLHW.js +754 -0
- package/dist/authStore-CtE9bLHW.js.map +1 -0
- package/dist/clientStore-BtE2-q2i.js +90 -0
- package/dist/clientStore-BtE2-q2i.js.map +1 -0
- package/dist/createSanityInstance-DUI1bGIg.d.ts +278 -0
- package/dist/createSanityInstance-DUI1bGIg.d.ts.map +1 -0
- package/dist/createStateSourceAction-BOKtqFNm.js +300 -0
- package/dist/createStateSourceAction-BOKtqFNm.js.map +1 -0
- package/dist/getEnv-D5RGkQLu.js +8 -0
- package/dist/getEnv-D5RGkQLu.js.map +1 -0
- package/dist/getNodeState-CR3__B2D.js +67 -0
- package/dist/getNodeState-CR3__B2D.js.map +1 -0
- package/dist/index.d.ts +3 -2335
- package/dist/index.js +4048 -3878
- package/dist/index.js.map +1 -1
- package/dist/logger-DAtJb5RQ.js +173 -0
- package/dist/logger-DAtJb5RQ.js.map +1 -0
- package/dist/object-CxXlSVg7.js +83 -0
- package/dist/object-CxXlSVg7.js.map +1 -0
- package/dist/queryStore-C7yMHPUI.js +1346 -0
- package/dist/queryStore-C7yMHPUI.js.map +1 -0
- package/dist/rolldown-runtime-vyAXikos.js +9 -0
- package/dist/setCleanupTimeout-BiM6q1KF.js +31 -0
- package/dist/setCleanupTimeout-BiM6q1KF.js.map +1 -0
- package/dist/telemetryManager-UIEiMtC0.js +127 -0
- package/dist/telemetryManager-UIEiMtC0.js.map +1 -0
- package/dist/version-D8RP_Q59.js +9 -0
- package/dist/version-D8RP_Q59.js.map +1 -0
- package/package.json +11 -17
- package/src/_exports/_internal.ts +1 -0
- package/src/_exports/agent.ts +19 -0
- package/src/_exports/comlink.ts +16 -0
- package/src/_exports/index.ts +45 -90
- package/src/applications/applications.test-d.ts +5 -0
- package/src/applications/applications.ts +5 -2
- package/src/auth/authMode.test.ts +0 -25
- package/src/auth/authMode.ts +3 -6
- package/src/auth/authStore.test.ts +1 -1
- package/src/auth/authStore.ts +0 -1
- package/src/comments/addonDatasetStore.test.ts +215 -0
- package/src/comments/addonDatasetStore.ts +249 -0
- package/src/comments/buildCommentThreads.test.ts +83 -0
- package/src/comments/buildCommentThreads.ts +54 -0
- package/src/comments/commentActions.test.ts +540 -0
- package/src/comments/commentActions.ts +555 -0
- package/src/comments/commentFieldPath.test.ts +40 -0
- package/src/comments/commentFieldPath.ts +44 -0
- package/src/comments/commentsConstants.ts +80 -0
- package/src/comments/commentsStore.test.ts +419 -0
- package/src/comments/commentsStore.ts +483 -0
- package/src/comments/normalizeComment.test.ts +116 -0
- package/src/comments/normalizeComment.ts +45 -0
- package/src/comments/observeComments.test.ts +193 -0
- package/src/comments/observeComments.ts +113 -0
- package/src/comments/reducers.test.ts +277 -0
- package/src/comments/reducers.ts +316 -0
- package/src/comments/types.ts +249 -0
- package/src/comments/weakenReferences.test.ts +47 -0
- package/src/comments/weakenReferences.ts +29 -0
- package/src/config/sanityConfig.ts +3 -75
- package/src/datasets/datasets.test.ts +44 -9
- package/src/datasets/datasets.ts +24 -23
- package/src/document/applyDocumentActions.test.ts +8 -12
- package/src/document/documentConstants.ts +17 -0
- package/src/document/documentStore.test.ts +173 -19
- package/src/document/documentStore.ts +36 -5
- package/src/document/patchOperations.test.ts +27 -0
- package/src/document/patchOperations.ts +10 -1
- package/src/document/permissions.test.ts +3 -1
- package/src/document/reducers.test.ts +357 -0
- package/src/document/reducers.ts +125 -27
- package/src/document/util.test.ts +46 -0
- package/src/document/util.ts +37 -1
- package/src/favorites/favorites.test.ts +64 -24
- package/src/favorites/favorites.ts +73 -22
- package/src/installations/installations.test-d.ts +5 -0
- package/src/installations/installations.ts +4 -0
- package/src/presence/bifurTransport.test.ts +155 -3
- package/src/presence/bifurTransport.ts +79 -12
- package/src/presence/paths.test.ts +70 -0
- package/src/presence/paths.ts +41 -0
- package/src/presence/presenceStore.test.ts +822 -2
- package/src/presence/presenceStore.ts +518 -102
- package/src/presence/types.ts +175 -3
- package/src/preview/types.ts +0 -25
- package/src/projection/projectionStore.test.ts +0 -8
- package/src/projection/types.ts +0 -8
- package/src/query/queryStore.ts +7 -6
- package/src/store/createActionBinder.test.ts +51 -29
- package/src/store/createActionBinder.ts +16 -62
- package/src/store/createSanityInstance.test.ts +0 -68
- package/src/store/createSanityInstance.ts +0 -63
- package/src/store/createStateSourceAction.ts +1 -1
- package/src/store/fetcherStore.test.ts +23 -1
- package/src/store/fetcherStore.ts +3 -3
- package/src/users/reducers.test.ts +0 -3
- package/dist/_chunks-dts/createGroqSearchFilter.d.ts +0 -1147
- package/dist/_chunks-dts/createGroqSearchFilter.d.ts.map +0 -1
- package/dist/_chunks-es/_internal.js +0 -134
- package/dist/_chunks-es/_internal.js.map +0 -1
- package/dist/_chunks-es/createGroqSearchFilter.js +0 -1864
- package/dist/_chunks-es/createGroqSearchFilter.js.map +0 -1
- package/dist/_chunks-es/telemetryManager.js +0 -93
- package/dist/_chunks-es/telemetryManager.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/src/applications/userApplications.test.ts +0 -126
- package/src/applications/userApplications.ts +0 -261
- package/src/preview/getPreviewState.test.ts +0 -137
- package/src/preview/getPreviewState.ts +0 -69
- package/src/preview/resolvePreview.test.ts +0 -64
- package/src/preview/resolvePreview.ts +0 -43
- package/src/utils/createFetcherStore.test.ts +0 -171
- package/src/utils/createFetcherStore.ts +0 -284
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import "@sanity/client";
|
|
2
|
-
import { createBatchedStore } from "@sanity/telemetry";
|
|
3
|
-
import { CORE_SDK_VERSION, createLogger } from "./createGroqSearchFilter.js";
|
|
4
|
-
import { SDKSessionEnded, SDKError, SDKHookMounted, SDKSessionStarted } from "./_internal.js";
|
|
5
|
-
const FLUSH_INTERVAL_MS = 3e4, CONSENT_TAG = "telemetry-consent.sdk", BATCH_TAG = "telemetry.batch", log = createLogger("telemetry");
|
|
6
|
-
function createTelemetryManager(options) {
|
|
7
|
-
const { sessionId, getClient, projectId, environment } = options, startedAt = Date.now(), emittedHooks = /* @__PURE__ */ new Set();
|
|
8
|
-
let cachedConsent = null;
|
|
9
|
-
const resolveConsent = async () => {
|
|
10
|
-
if (cachedConsent) return cachedConsent;
|
|
11
|
-
try {
|
|
12
|
-
cachedConsent = await getClient().request({
|
|
13
|
-
uri: "/intake/telemetry-status",
|
|
14
|
-
tag: CONSENT_TAG
|
|
15
|
-
});
|
|
16
|
-
} catch {
|
|
17
|
-
cachedConsent = { status: "undetermined" };
|
|
18
|
-
}
|
|
19
|
-
return cachedConsent;
|
|
20
|
-
}, enrichBatch = (batch) => batch.map((event) => {
|
|
21
|
-
const existing = "context" in event ? event.context : void 0;
|
|
22
|
-
return {
|
|
23
|
-
...event,
|
|
24
|
-
context: {
|
|
25
|
-
...existing,
|
|
26
|
-
version: CORE_SDK_VERSION,
|
|
27
|
-
environment,
|
|
28
|
-
origin: typeof window < "u" ? window.location.origin : "node"
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
}), store = createBatchedStore(
|
|
32
|
-
sessionId,
|
|
33
|
-
{
|
|
34
|
-
flushInterval: FLUSH_INTERVAL_MS,
|
|
35
|
-
resolveConsent,
|
|
36
|
-
sendEvents: async (batch) => {
|
|
37
|
-
const client = getClient();
|
|
38
|
-
return log.debug("sending event batch", { batchSize: batch.length, environment }), client.request({
|
|
39
|
-
uri: "/intake/batch",
|
|
40
|
-
method: "POST",
|
|
41
|
-
body: { projectId, batch: enrichBatch(batch) },
|
|
42
|
-
tag: BATCH_TAG
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
), logger = store.logger;
|
|
47
|
-
return {
|
|
48
|
-
async checkConsent() {
|
|
49
|
-
const { status } = await resolveConsent();
|
|
50
|
-
return status === "granted";
|
|
51
|
-
},
|
|
52
|
-
logSessionStarted(data) {
|
|
53
|
-
log.debug("event: SDK Session Started", {
|
|
54
|
-
projectId: data.projectId,
|
|
55
|
-
perspective: data.perspective,
|
|
56
|
-
authMethod: data.authMethod,
|
|
57
|
-
version: CORE_SDK_VERSION,
|
|
58
|
-
environment
|
|
59
|
-
}), logger.log(SDKSessionStarted, {
|
|
60
|
-
version: CORE_SDK_VERSION,
|
|
61
|
-
...data
|
|
62
|
-
});
|
|
63
|
-
},
|
|
64
|
-
logHookFirstUsed(hookName) {
|
|
65
|
-
emittedHooks.has(hookName) || (emittedHooks.add(hookName), log.debug("event: SDK Hook Mounted", { hookName }), logger.log(SDKHookMounted, { hookName }));
|
|
66
|
-
},
|
|
67
|
-
logError(errorType, hookName) {
|
|
68
|
-
log.debug("event: SDK Error", { errorType, hookName }), logger.log(SDKError, { errorType, hookName });
|
|
69
|
-
},
|
|
70
|
-
endSession() {
|
|
71
|
-
const durationSeconds = Math.round((Date.now() - startedAt) / 1e3);
|
|
72
|
-
log.debug("event: SDK Session Ended", {
|
|
73
|
-
durationSeconds,
|
|
74
|
-
hooksUsed: [...emittedHooks],
|
|
75
|
-
environment
|
|
76
|
-
}), logger.log(SDKSessionEnded, {
|
|
77
|
-
durationSeconds,
|
|
78
|
-
hooksUsed: [...emittedHooks]
|
|
79
|
-
}), store.flush().catch(() => {
|
|
80
|
-
}), store.end();
|
|
81
|
-
},
|
|
82
|
-
dispose() {
|
|
83
|
-
store.end();
|
|
84
|
-
},
|
|
85
|
-
get hooksUsed() {
|
|
86
|
-
return emittedHooks;
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
export {
|
|
91
|
-
createTelemetryManager
|
|
92
|
-
};
|
|
93
|
-
//# sourceMappingURL=telemetryManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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 {type TelemetryEnvironment} from './environment'\nimport {SDKError, SDKHookMounted, SDKSessionEnded, SDKSessionStarted} from './events'\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 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 * The `environment` is captured at construction time and recorded in\n * the event context so downstream pipelines can distinguish dev and\n * production sessions.\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 Session Started\" event */\n logSessionStarted(data: {projectId: string; perspective: string; authMethod: string}): void\n\n /** Log a \"SDK Hook Mounted\" event (deduplicated per hook name) */\n logHookFirstUsed(hookName: string): void\n\n /** Log a \"SDK Error\" event */\n logError(errorType: string, hookName: string): void\n\n /** Log a \"SDK 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 environment: TelemetryEnvironment\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, environment} = 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 // Trace events (`trace.start` / `trace.log` / `trace.error` /\n // `trace.complete`) arrive with their own caller-provided `context`.\n // Log / userProperties events don't. Narrow via `in` so `event`\n // stays typed as `TelemetryEvent`, then merge so we don't drop the\n // trace context. SDK-owned fields below win on conflict.\n const existing =\n 'context' in event ? (event.context as Record<string, unknown> | undefined) : undefined\n return {\n ...event,\n context: {\n ...existing,\n version: CORE_SDK_VERSION,\n environment,\n origin: typeof window !== 'undefined' ? window.location.origin : 'node',\n },\n }\n })\n\n const sendEvents = async (batch: TelemetryEvent[]): Promise<unknown> => {\n const client = getClient()\n log.debug('sending event batch', {batchSize: batch.length, environment})\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 Session Started', {\n projectId: data.projectId,\n perspective: data.perspective,\n authMethod: data.authMethod,\n version: CORE_SDK_VERSION,\n environment,\n })\n logger.log(SDKSessionStarted, {\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 logError(errorType: string, hookName: string) {\n log.debug('event: SDK Error', {errorType, hookName})\n logger.log(SDKError, {errorType, hookName})\n },\n\n endSession() {\n const durationSeconds = Math.round((Date.now() - startedAt) / 1000)\n log.debug('event: SDK Session Ended', {\n durationSeconds,\n hooksUsed: [...emittedHooks],\n environment,\n })\n logger.log(SDKSessionEnded, {\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":";;;;AAeA,MAAM,oBAAoB,KACpB,cAAc,yBACd,YAAY,mBAEZ,MAAM,aAAa,WAAW;AAyD7B,SAAS,uBAAuB,SAAoD;AACzF,QAAM,EAAC,WAAW,WAAW,WAAW,YAAA,IAAe,SACjD,YAAY,KAAK,IAAA,GACjB,mCAAmB,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,UAAU;AAMnB,UAAM,WACJ,aAAa,QAAS,MAAM,UAAkD;AAChF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,QACA,QAAQ,OAAO,SAAW,MAAc,OAAO,SAAS,SAAS;AAAA,MAAA;AAAA,IACnE;AAAA,EAEJ,CAAC,GAaG,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,QAAQ,YAAA,CAAY,GAChE,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,8BAA8B;AAAA,QACtC,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,SAAS;AAAA,QACT;AAAA,MAAA,CACD,GACD,OAAO,IAAI,mBAAmB;AAAA,QAC5B,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,SAAS,WAAmB,UAAkB;AAC5C,UAAI,MAAM,oBAAoB,EAAC,WAAW,SAAA,CAAS,GACnD,OAAO,IAAI,UAAU,EAAC,WAAW,UAAS;AAAA,IAC5C;AAAA,IAEA,aAAa;AACX,YAAM,kBAAkB,KAAK,OAAO,KAAK,IAAA,IAAQ,aAAa,GAAI;AAClE,UAAI,MAAM,4BAA4B;AAAA,QACpC;AAAA,QACA,WAAW,CAAC,GAAG,YAAY;AAAA,QAC3B;AAAA,MAAA,CACD,GACD,OAAO,IAAI,iBAAiB;AAAA,QAC1B;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;"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/access/checkPermissions.ts","../src/agent/agentActions.ts","../src/utils/includeShape.ts","../src/applications/applications.ts","../src/applications/userApplications.ts","../src/project/organizationVerification.ts","../src/auth/getOrganizationVerificationState.ts","../src/auth/handleAuthCallback.ts","../src/auth/logout.ts","../src/client/clientStore.ts","../src/comlink/types.ts","../src/comlink/controller/comlinkControllerStore.ts","../src/comlink/node/comlinkNodeStore.ts","../src/comlink/node/getNodeState.ts","../src/config/handles.ts","../src/utils/logger.ts","../src/config/loggingConfig.ts","../src/datasets/datasets.ts","../src/document/actions.ts","../src/document/patchOperations.ts","../src/document/processMutations.ts","../src/document/permissions.ts","../src/document/sharedListener.ts","../src/document/documentStore.ts","../src/document/reducers.ts","../src/document/events.ts","../src/document/applyDocumentActions.ts","../src/document/processActions/releaseUtil.ts","../src/favorites/favorites.ts","../src/installations/installations.ts","../src/organization/organization.ts","../src/organizations/organizations.ts","../src/presence/types.ts","../src/presence/presenceStore.ts","../src/preview/getPreviewState.ts","../src/preview/resolvePreview.ts","../src/project/project.ts","../src/projection/getProjectionState.ts","../src/projection/resolveProjection.ts","../src/projects/projects.ts","../src/releases/releasesStore.ts","../src/releases/getPerspectiveState.ts","../src/users/usersStore.ts","../src/utils/createFetcherStore.ts","../src/utils/getCorsErrorProjectId.ts","../src/utils/isImportError.ts","../src/version.ts","../src/_exports/index.ts"],"mappings":";;;;;;;;;;;;;;;;KAaY;;;;;;;;;;;cAkBC,kBAAgB,SAAA,cAAA,oBAAA,oBAAA,wBAAA;;KCrBjB,uBAAuB,WACjC;;KAIU,wBAAwB,WAClC;;KAIU,wBAAwB,WAClC;;KAIU,qBAAqB,WAAW;;KAGhC,oBAAoB,WAAW;;KAG/B,sBAAsB,QAChC,WAAW;;KAID,uBAAuB,QACjC,WAAW;;KAID,uBAAuB,QACjC,WAAW;;KAID,oBAAoB,QAAQ,WAAW;;KAGvC,mBAAmB,QAAQ,WAAW;;;;;;;;iBASlC,cACd,UAAU,gBACV,SAAS,sBACT,WAAW,mBACV;;;;;;;;iBAaa,eACd,UAAU,gBACV,SAAS,uBACT,WAAW,mBACV;;;;;;;;iBAaa,eACd,UAAU,gBACV,SAAS,uBACT,WAAW,mBACV;;;;;;;;iBAaa,YACd,UAAU,gBACV,SAAS,oBACT,WAAW,mBACV,WAAW;;;;;;;;iBAaE,WACd,UAAU,gBACV,SAAS,mBACT,WAAW,mBACV,WAAW;;;;;;;;;;;;;;;;;KClHF,SAAS,oBAAoB,YAAY,KAAK,kBAAkB,KAAK,UAC/E,cACS,aACP,QAAQ,UACP,cAAc,aACb;;;;;;;;KAUM,YAAY,0BAA0B,uBAAuB,YAAY;;;;;;;;;;KCZzE;;;;;;;UAcK;EACf;EACA;EACA;EACA;EACA;;EAEA;EACA;IAAW;IAAgB;;;;;;;;;;UAUZ;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;;;;;;;;UASe;EACf;EACA;EACA;;;;;;;;UASe;EACf;;EAEA;;;;;;;;;;;KAYU,sBAAsB,gBAAgB;EAChD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACE,SAAS,kCAAkC;EAAU,YAAY;KACnE,SAAS,kCAAkC;EAAU,aAAa;KAClE,SAAS,8BAA8B;EAAU,QAAQ;;;;;;;;;UAS1C;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAIG;KAIA,uBAAuB,gBAAgB,sBAAsB,SAChE,qCAEA;EACC;IAAS,QAAQ;;KAElB,SAAS,yCAAyC;EAAU;IAAS;;;KAIlE,2BAA2B,gBAAgB,uBAAuB,6BACrE;EAEG,mBAAmB,sBAAsB;IAC1C,YAAY,SAAS;EAClB,kBAAkB,sBAAsB;;;;;;;;;;;KAYnC,YAAY,gBAAgB,8BAA8B,kBACpE,uBAAuB,WACvB,2BAA2B;;;;;;;UAQZ,oBAAoB,gBAAgB,qBAAqB;EACxE;;EAEA;EACA,UAAU;;EAEV;;EAEA;;;;;;;;UASe,qBAAqB,gBAAgB;EACpD;EACA,MAAM,YAAY;;;;;;;;;cAeP,cAAY,SAAA,SAAA,oBAAA,sBAAA,qBAAA;;;;;;;;;cA2CZ,sBAAW,uBAAA;YACuB;;;;;;;;UAyB9B;EACf;;;;;;;;;KAUU,wBAAwB;;;;;;;;KASxB;EAA0B;IAAyB,QAC7D,KAAK;;;;;;;;cAUM,oBAAiB,gCAAA,gBAAA,OAAA,2BAAA,QAAA,eAAA;;;;;;UA0Bb;EACf;;;;;;;;;cAUW,oBAAiB,gCAAA,gBAAA,OAAA,2BAAA,QAAA,eAAA;;;;;;;;;UCtUb;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;UAUe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAkB;EAClB;EACA,QAAQ;EACR;;;;;;;;UASe;EACf;;;;;;;;;cAUW,kBAAgB,SAAA,SAAA,0BAAA;;;;;;;;;;cA+BhB,iBAAe,SAAA,4BAAA;;;;;;;UAqBX;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA,kBAAkB;;EAElB;;;;;;;;;;UAWe,mCAAmC;;EAElD;;EAEA;EACA;EACA;;EAEA;;;;;;;;;cAUW,wBAAqB,gCAAA,gBAAA,OAAA,+BAAA,QAAA,eAAA;;;;;;;;UA0BjB,mCAAmC;EAClD;;;;;;;;;cAUW,wBAAqB,gCAAA,gBAAA,OAAA,+BAAA,QAAA,eAAA;;;;;;UA0BjB;EACf;;;;;;;;;cAUW,wBAAqB,gCAAA,gBAAA,OAAA,+BAAA,QAAA,eAAA;;;;;UC9OjB;EACf;;;;;;;;iBCWc,qCACd,UAAU,gBACV,uBACC,WAAW;;;;cCHD,oBAAkB,iBAAA,iBAAA,oCAAA;;;;cCPlB,QAAM,iBAAN,oBAAM;KCSd;;;;;UA4CY;EACf;EACA,YAAW,kBAAkB;EAC7B;;;;;;;;;;;;;;;;;;UAmBe,sBAAsB,KAAK,cAAc;;;;;;EAMxD;;;;EAIA;;;;;EAMA,WAAW;;;;;;;;;;;;;cAwDA,WAAS,iBAAA,mBAAA,SAAA,gBAAA;;;;;;;;;;cA2FT,gBAAc,iBAAA,mBAAA,SAAA,sCAAA,YAAA;;;;;KCjPf,eAAe;;;;;KAMf,gBAAgB;;;;;KAMhB;EACV;EACA;;;;;;KAOU;EACV;EACA;IAAU;IAAsB;;;;;;;UCfjB;EACf,SAAS,gBAAgB,cAAc;EAEvC,SAAS;EAET;;;;;;UAOe;EACf,YAAY;EACZ;EACA,UAAU,YAAY;;;;;;cAyBX,mBAAiB,iBAAA;;;;;;cAUjB,oBAAkB,iBAAA,yBAAA,SAAA,eAAA,0CAAA,mCAAA;;;;;;cAUlB,uBAAqB,iBAAA,yBAAA,uBAAA;;;;;cASrB,gBAAc,iBAAA,yBAAA;;;;;UCvEV;EACf,MAAM,KAAK,eAAe;EAE1B,SAAS;EAET,QAAQ;EACR;;;;;;UAOe;EACf,OAAO,YAAY;EAEnB,eAAe,YAAY;;;;;;cAuBhB,aAAW,iBAAA,mBAAA;;;;;;;cAQX,iBAAe,iBAAA,mBAAA,SAAA,YAAA,+BAAA,mCAAA;;;;UCvCX;EACf,MAAM,KAAK,eAAe;EAC1B,QAAQ;;;;;;;;;cAaG,cAAY,iBAAA,mBAAA,qCAAA,YAAA;;;;;;;;iBCrBT,qBACd,uCACA,kCACA,oCAEA,QAAQ,eAAe,eAAe,UAAU,cAC/C,eAAe,eAAe,UAAU;;;;;;;;iBAW3B,yBACd,uCACA,kCACA,oCAEA,QAAQ,mBAAmB,eAAe,UAAU,cACnD,mBAAmB,eAAe,UAAU;;;;;;;;iBAW/B,oBAAoB,oCAClC,QAAQ,cAAc,cACrB,cAAc;;;;;;;;iBAWD,oBACd,kCACA,oCACA,QAAQ,cAAc,UAAU,cAAc,cAAc,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KC7B5D;;;;;;;;;;KAWA;;;;;UAMK;;;;;EAKf,QAAQ;;;;;;;;;EAUR;;;;;;EAOA;;;;;EAMA,UAAU;;;;;EAMV;;;;;EAMA;;;;;;;UAQe;EACf,QAAQ,iBAAiB,UAAU;EACnC,OAAO,iBAAiB,UAAU;EAClC,OAAO,iBAAiB,UAAU;EAClC,QAAQ,iBAAiB,UAAU;EACnC,QAAQ,iBAAiB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;UAyBpB;;;;;;;GAOd;;EAED,QAAQ;;EAER;;EAEA;;EAEA,kBAAkB;;;;;;UAOH;;EAEf;;EAEA;;EAEA;;;;;;UAOe;WACN;EACT,QAAQ,iBAAiB,UAAU;EACnC,OAAO,iBAAiB,UAAU;EAClC,OAAO,iBAAiB,UAAU;EAClC,QAAQ,iBAAiB,UAAU;EACnC,QAAQ,iBAAiB,UAAU;;EAEnC,iBAAiB,OAAO;;EAExB,QAAQ,SAAS,eAAe;;EAEhC,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBClEZ,iBAAiB,QAAQ;;cClF5B,kBAAgB,uCAAA,mBAAA,UAAA,6DAAA,oBAAA,UAAA,0DAAA,qCAAA;;cAGhB,iBAAe,uCAAA,mBAAA,UAAA,6DAAA,oBAAA,UAAA,oCAAA,iCAAA;;;;;;UCNX,qBACf,uCACA,kCACA,4CACQ,mBAAmB,eAAe,UAAU;EACpD;;;;;;EAMA,eAAe,QACb,KACE,iBAAe,kBAAkB,cAAc;;;;;;;UAWpC,qBACf,uCACA,kCACA,4CACQ,eAAe,eAAe,UAAU;EAChD;;;;;;;UAQe,mBACf,uCACA,kCACA,4CACQ,eAAe,eAAe,UAAU;EAChD;EACA,UAAU;;;;;;;;;;;;;;;EAeV;;;;;;;UAQe,sBACf,uCACA,kCACA,4CACQ,eAAe,eAAe,UAAU;EAChD;;;;;;;UAQe,wBACf,uCACA,kCACA,4CACQ,eAAe,eAAe,UAAU;EAChD;;;;;;;UAQe,sBACf,uCACA,kCACA,4CACQ,eAAe,eAAe,UAAU;EAChD;;;;;;KAOU,eACV,uCACA,kCACA,sCAEE,qBAAqB,eAAe,UAAU,cAC9C,qBAAqB,eAAe,UAAU,cAC9C,mBAAmB,eAAe,UAAU,cAC5C,sBAAsB,eAAe,UAAU,cAC/C,wBAAwB,eAAe,UAAU,cACjD,sBAAsB,eAAe,UAAU;;;;;;KAOvC,OACV,uCACA,kCACA,sCACE,eAAe,eAAe,UAAU,cAAc;;;;;;;;iBAS1C,eACd,uCACA,kCACA,oCAEA,KAAK,mBAAmB,eAAe,UAAU,aACjD,eAAe,QACb,KACE,iBAAe,kBAAkB,cAAc,wEAIlD,qBAAqB,eAAe,UAAU;;;;;;;iBAoBjC,eACd,uCACA,kCACA,oCAEA,KAAK,eAAe,eAAe,UAAU,cAC5C,qBAAqB,eAAe,UAAU;;;;;UAwBhC;;;;;EAKf;;;;;;;;;;;;iBAac,aACd,uCACA,kCACA,oCAEA,KAAK,eAAe,eAAe,UAAU,aAC7C,mBAAmB,eACnB,UAAU,sBACT,mBAAmB,eAAe,UAAU;;;;;;;;;;iBAU/B,aACd,uCACA,kCACA,oCAEA,KAAK,eAAe,eAAe,UAAU,aAC7C,UAAU,kBAAkB,mBAC5B,UAAU,sBACT,mBAAmB,eAAe,UAAU;;;;;;;iBAgD/B,gBACd,uCACA,kCACA,oCAEA,KAAK,eAAe,eAAe,UAAU,cAC5C,sBAAsB,eAAe,UAAU;;;;;;;iBAelC,kBACd,uCACA,kCACA,oCAEA,KAAK,eAAe,eAAe,UAAU,cAC5C,wBAAwB,eAAe,UAAU;;;;;;;iBAepC,gBACd,uCACA,kCACA,oCAEA,KAAK,eAAe,eAAe,UAAU,cAC5C,sBAAsB,eAAe,UAAU;;;;;;UAcjC,4BAA4B;EAC3C;EACA,UAAU;;;;;;UAOK,0BAA0B;EACzC;EACA,OAAO;;;;;;UAOQ,6BAA6B;EAC5C;;;;;;;UAQe,8BAA8B;EAC7C;EACA;;;;;;;UAQe,gCAAgC;EAC/C;;;;;;;;UASe,6BAA6B;EAC5C;;;;;;UAOe,+BAA+B;EAC9C;;;;;;;UAQe,4BAA4B;EAC3C;;;;;;;KAQU,gBACR,sBACA,oBACA,uBACA,wBACA,0BACA,uBACA,yBACA;;iBAGY,cACd,QAAQ,eACR,WAAU,gCACT;;iBAKa,YAAY,QAAQ,eAAe,OAAO,kBAAkB;;iBAK5D,eAAe,QAAQ,gBAAgB;;iBAKvC,gBAAgB,QAAQ,eAAe,oBAAoB;;iBAK3D,kBAAkB,QAAQ,gBAAgB;;iBAK1C,eAAe,QAAQ,gBAAgB;;iBAKvC,iBAAiB,QAAQ,gBAAgB;;iBAKzC,cAAc,QAAQ,gBAAgB;;;;;;;;;;;;;;;;;KCtajD,UAAU,wBAAwB,uBAAuB,cAAc,UACvE,SAAS,UAAU,SACpB,yBAEG;;;;;;;KAQF,QAAQ,QAAQ,8CAA8C,mBAC/D,SACA,8BAA8B,gBAAgB,SAE5C,QACE,8CAEI,oBAAoB,SAClB,OAAO,SAEP,uBACE,+BAA+B,cAC7B;EAGV,6CAA6C;;;;;;KASzC,UAAU,WAAW,wBAAwB,QAAQ,WAAW,UAAU;;;;;;;KCxF1E,YAAY,kBAAkB,mBAAiB,uBACxD,yBAAyB;KCXhB;;UAoIK;EACf;EACA;EACA;;;KAIU;EAEN;EACA;EACA,SAAS;;EAEV;EAAe;EAAqB;;UCzIxB;EACf,QAAQ,WAAW,YAAY;EAC/B;;UC8De;EACf,mBAAkB,yBAAyB;EAC3C,QAAQ;EACR,SAAS;EACT,WAAW;EACX,SAAS,OAAO,OAAO;;;;EAIvB;EACA;EACA,gBAAgB;EAChB,gBAAgB,uBAAuB,WAAW;EAClD,QAAQ,QAAQ;;UAGD;EACf;;;;;EAKA,SAAS;;;;;EAKT,QAAQ;;;;EAIR;;;;;EAKA;;;;;;;;;;;;EAYA,yBAAwB,4BAA4B;;;;;;;;EAQpD;;;;;;UAmCe,gBACf,8CACA,uCACA,kCACA,4CACQ,eAAe,eAAe,UAAU;EAChD,OAAO;;;iBAIO,iBACd,uCACA,kCACA,oCAEA,UAAU,gBACV,SAAS,2BAA2B,eAAe,UAAU,cAC5D,YAAY,iBAAe,kBAAkB,cAAc;;iBAG9C,iBACd,+BACA,uCACA,kCACA,oCAEA,UAAU,gBACV,SAAS,gBAAgB,OAAO,eAAe,UAAU,cACxD,YACD,UAAU,iBAAe,kBAAkB,cAAc,aAAa;;iBAIxD,iBAAiB,OAC/B,UAAU,gBACV,SAAS,sCACR,YAAY;;iBA+CC,gBACd,uCACA,kCACA,oCAEA,UAAU,gBACV,WAAW,eAAe,eAAe,UAAU,cAClD,QAAQ,iBAAe,kBAAkB,cAAc;;iBAE1C,gBAAgB,cAAc,kBAC5C,UAAU,gBACV,WAAW,yCACV,QAAQ;;cAoBE,uBAAqB,iBAAA,qBAAA,KAAA,yCAAA;KA+B7B;EACH,WAAW;EACX,SAAS;;;cAIE,qBAAmB,iBAAA,qBAAA,0BAAA,YAAA;;cAenB,oBAAkB,iBAAA,qBAAA,SAAA,0BAAA,QAAA;;cAUlB,yBAEwD,iBAFjC,qBAAA;aAEH;iBAAiC,GAAG;;KChUhE;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGG;EACH;EACA;;UAGQ;EACR;EACA;EACA;EACA;EACA;;KAGU;EACP,YAAY;EAAqB;EAAqB,YAAY;;EAClE,YAAY;EAAsB;EAAmB;;EACrD,YAAY;EAAwB;EAAiB;;EACrD,YAAY;EAAqB;EAAqB;;EACtD,YAAY;EAAmB;EAAiB;EAAqB,OAAO;;EAC3E,YAAY;EAAsB;EAAiB;IAAuB;EAE1E,YAAY;EACZ;EACA,WAAW;;EAEZ,YAAY;EAA0B;EAAmB,OAAO;;EAChE,YAAY;EAA6B;;EACzC,YAAY;EAA8B;EAAmB;;EAC7D,YAAY;EAAgC;;EAC5C,YAAY;EAA6B;;EACzC,YAAY;EAA+B;;EAC3C,YAAY;EAA4B;;;;;;;UAO5B;;;;EAIf;;;;;;EAMA,SAAS;;;;;EAKT;;;;;;;;;;;;;;;UAgBe,2BAA2B;;;;EAI1C,SAAS;;;;EAKT,UAAU;;;;;;;EAQV,MAAM;;;;EAKN,iBAAgB;;;;EAKhB;;;;;;EAOA,iBAAiB;;;;;;EAOjB,mBAAmB;;;;;;;;UASJ,4BAA4B;EAC3C;EACA;;UAGe;EACf;EACA;EACA;EACA;;;KC7KU,sCACR,QAAQ,WAAW,2BACnB;;KAGQ,gBACR,mBACA,2BACA,2BACA,2BACA,sBACA,uBACA,uBACA,yBACA,2BACA,yBACA;;;;;;UAOa;EACf;EACA;EACA;EACA;EACA;;;;;;UAMe;EACf;EACA,UAAU;EACV,QAAQ;;;;;;UAMO;EACf;EACA;EACA;EACA,UAAU;;;;;;UAMK;EACf;EACA;EACA;EACA;EACA;;;;;;UAMe;EACf;EACA;EACA,UAAU;;;;;;UAMK;EACf;EACA;EACA,UAAU;;;;;;UAMK;EACf;EACA;EACA,UAAU;;;;;;UAMK;EACf;EACA;EACA,UAAU;;;;;;UAMK;EACf;EACA;EACA,UAAU;;;;;;UAMK;EACf;EACA;EACA,UAAU;;;;;;;;;;;;;;;;UAiBK;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA,SAAS;;EAET;;;UCvIe,cAAc,kBAAkB,mBAAiB;EAChE;EACA,WAAW,YAAY;EACvB,UAAU,YAAY;EACtB;KAAgB;;EAChB;EACA;EACA;EACA,iBAAiB,QAAQ;;;UAIV;;;;;EAKf,SAAS;;;;EAKT,WAAW;;;;EAKX;;;;EAIA;;;iBAIc,qBACd,uCACA,kCACA,oCAEA,UAAU,gBACV,SAAS,8BACR,QAAQ,cAAc,iBAAe,kBAAkB,cAAc;;iBAExD,qBACd,UAAU,gBACV,SAAS,8BACR,QAAQ;;;;;;iBCjDK,qBAAqB;;;;UCIpB;EACf;;;;;UAMQ,gCAAgC;EACxC;EACA,cAAc,yBAAyB,wBAAwB;EAC/D;;;;;;;;;cAiEW,mBAAiB,uCAAA,mBAAA,0BAAA,0BAAA,gDAAA,YAAA;;;;;;;;cASjB,uBAAqB,uCAAA,mBAAA,0BAAA,0BAAA,0BAAA,QAAA;;;;;;;;KCpFtB;;;;;;;UAQK;EACf;EACA;EACA;;;;;;;;;UAUe;EACf;EACA;EACA;EACA;EACA;;EAEA;EACA;IAAW;IAAgB;;;;;;;;;;UAUZ;EACf;EACA;EACA;EACA;EACA;EACA;;;;;;;;;UAUe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA;;;;;;;;;;;;KAaQ,aAAa,gBAAgB,+BAA+B,mBACtE,SACE,qCAEA;EACC,cAAc;KAEjB,SAAS,+BAA+B;EAAU,QAAQ;KAC1D,SAAS,mCAAmC;EAAU,YAAY;;;;;;;;UAQnD,qBAAqB,gBAAgB,sBAAsB;EAC1E;EACA,UAAU;;EAEV;;EAEA;;;;;;;;UASe,sBAAsB,gBAAgB;EACrD;EACA,MAAM,aAAa;;;;;;;;;cAeR,eAAa,SAAA,SAAA,qBAAA,uBAAA,sBAAA;;;;;;;;;cAyCb,uBAAY,wBAAA;YACuB;;;UC9K/B;EACf;EACA;EACA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF,OAAO;IACL;IACA;IACA;;;;;;;UAQa;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;UAIe,oBACf,wCACA;EAEA,iBAAiB;EACjB,kBAAkB;EAClB;;;;;;;KAQU,aACV,wCACA,2CACE,oCAIe;EACZ,UAAU;IACX;EACG,SAAS;gCAEC;EACZ;IACD;EACG;;;;;;;;;;cAsCI,cAAY,SAAA,UAAA,oDAAA;;;;;;KCrGb,cACV,wCACA,4CACG,KACH,sJAaiB;EACZ,UAAU;IACX;EACG,SAAS;gCAEC;EACZ;IACD;EACG;;;UAIQ,qBACf,wCACA,iDACQ,KAAK,oBAAoB,gBAAgB;;;;;EAKjD;;;;;;;;cA8BW,eAAa,SAAA,UAAA,qDAAA;;UChFT;EACf;EACA;EACA;EACA;;;UAIe;EACf,MAAM;EACN,WAAW;EACX;;;KAUU,iBAAiB,gBAAgB,aAAa;;UAGzC;EACf;EACA;EACA;;;UAIe;EACf;EACA;EACA;EACA;EACA,WAAW;;;UAII;EACf;EACA;EACA;EACA;;;iBCuLc,YACd,UAAU,gBACV;EAAU,WAAW;IACpB,YAAY;;;;;KC9NH,yBAAyB;;;;;iBAMrB,gBAAgB,wBAC9B,UAAU,gBACV,SAAS,yBACR,YAAY,aAAa;;;;;iBAKZ,gBACd,UAAU,gBACV,SAAS,yBACR,YAAY,aAAa;;;;;KCpBhB,wBAAwB;;;;;iBAMd,eACpB,UAAU,gBACV,SAAS,wBACR,QAAQ,aAAa;;UCRP;EACf;EACA;EACA;;;UAIe;EACf;EACA;EACA;EACA;EACA;EACA,OAAO;;;UAIQ;EACf;EACA;EACA;EACA;EACA;;;;;;UAOe;EACf;EACA;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;;;;;;;KAQU,QACV,uCACA,0CACE,+BAIe;EACZ,UAAU;IACX;EACG,SAAS;gCAEC;EACZ;IACD;EACG;;;UAIQ,eACf,uCACA,gDACQ;EACR,iBAAiB;EACjB,kBAAkB;;;;;;;;;;cAsCP,SAAO,SAAA,UAAA,+CAAA;UCvGH,kBACf,qCACA,uCACA,kCACA,4CACQ,eAAe,eAAe,UAAU;EAChD,YAAY;;;;;iBAME,mBACd,qCACA,uCACA,kCACA,oCAEA,UAAU,gBACV,SAAS,kBAAkB,aAAa,eAAe,UAAU,cAChE,YACC,uBACE,uBAAuB,aAAa,kBAAkB,cAAc;;;;iBAQ1D,mBAAmB,sBACjC,UAAU,gBACV,SAAS,oBACR,YAAY,uBAAuB;;;;iBAKtB,mBACd,UAAU,gBACV,SAAS,oBACR,YAAY,uBAAuB;;iBClDtB,kBACd,qCACA,uCACA,kCACA,oCAEA,UAAU,gBACV,SAAS,kBAAkB,aAAa,eAAe,UAAU,cAChE,QACD,uBACE,uBAAuB,aAAa,kBAAkB,cAAc;;iBAKxD,kBAAkB,sBAChC,UAAU,gBACV,SAAS,oBACR,QAAQ,uBAAuB;;UCjBjB,gBACf,wCACA;EAEA;EACA,iBAAiB;EACjB,kBAAkB;EAClB;;;;;;;;cAgCW,UAAQ,SAAA,UAAA,gDAAA;;;;;;KC/BT;UAUK;EACf,iBAAiB;EACjB,cAAc;EACd;;;;;;cAiCW,yBACX,UAAU,gBACV;EAAW,WAAW;MACrB,YAAY;;;;;cAsBF,sBACX,UAAU,gBACV;EAAW,WAAW;MACrB,YAAY;cC9CT,8BA3B2E,YA2B/C,qBAAA,KAAA;;;aA3B+C;;KAsD5E,UAAU,uBAAuB,6BAA6B,KAAK;KACnE,iBAAiB,UAAU,kBAAkB;KAC7C,2BAA2B,iBAC9B,oBACA,gBACA,kBAAkB;;;;;;;;;;;;;cAoBP,qBAAqB;;;;;;;;;;;;;;cC6LrB,gCAAa,kBAAA,UAAA,oDAAA;;;;;;;;;;;;;;;;;;;;cAoDb,cAAY,iBAAA,kBAAA,sBAAA;;;;;;;;;;;;;;;;;cAqDZ,eAAa,iBAAA,kBAAA,UAAA,8BAAA;;;;;;;;cA+Bb,cAAY,iBAAA,kBAAA,iBAAA,WAAA;;;;cAaZ,aAAW,iBAAA,kBAAA,qBAAA,QAAA;UChYd,WAAW,2BAA2B;EAC9C,QAAQ;EACR,UAAU;EACV;EACA,OAAO;EACP;EACA;EACA;;;;;;UAOe,kBAAkB,2BAA2B;EAC5D,kBAAiB,4BAA4B,WAAW,SAAS;EACjE;;;;;;UAOe,aAAa,2BAA2B;EACvD,UAAU,iBACR,kBAAkB,SAAS,QAC3B,SACA,YAAY;EAEd,cAAc,iBAAiB,kBAAkB,SAAS,QAAQ,SAAS,QAAQ;;;;;;;;iBC1ErE,sBAAsB,OAAO;;;;;;;;;;;;;;;;;;;;;;iBCa7B,cAAc;;;;;cCdjB;;;;KCFD,gBAAgB"}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import {type SanityClient} from '@sanity/client'
|
|
2
|
-
import {of} from 'rxjs'
|
|
3
|
-
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'
|
|
4
|
-
|
|
5
|
-
import {getClientState} from '../client/clientStore'
|
|
6
|
-
import {createSanityInstance, type SanityInstance} from '../store/createSanityInstance'
|
|
7
|
-
import {type StateSource} from '../store/createStateSourceAction'
|
|
8
|
-
import {
|
|
9
|
-
createUserApplication,
|
|
10
|
-
deleteUserApplication,
|
|
11
|
-
updateUserApplication,
|
|
12
|
-
userApplication,
|
|
13
|
-
userApplications,
|
|
14
|
-
} from './userApplications'
|
|
15
|
-
|
|
16
|
-
vi.mock('../client/clientStore')
|
|
17
|
-
|
|
18
|
-
describe('userApplications', () => {
|
|
19
|
-
let instance: SanityInstance
|
|
20
|
-
const request = vi.fn()
|
|
21
|
-
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
instance = createSanityInstance({projectId: 'p', dataset: 'd'})
|
|
24
|
-
request.mockReset()
|
|
25
|
-
vi.mocked(getClientState).mockReturnValue({
|
|
26
|
-
observable: of({observable: {request}} as unknown as SanityClient),
|
|
27
|
-
} as StateSource<SanityClient>)
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
afterEach(() => {
|
|
31
|
-
instance.dispose()
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
it('lists user applications for an organization on the global client', async () => {
|
|
35
|
-
const apps = [{id: 'ua1'}, {id: 'ua2'}]
|
|
36
|
-
request.mockReturnValue(of(apps))
|
|
37
|
-
|
|
38
|
-
const result = await userApplications.resolveState(instance, {organizationId: 'org1'})
|
|
39
|
-
|
|
40
|
-
expect(result).toEqual(apps)
|
|
41
|
-
expect(getClientState).toHaveBeenCalledWith(instance, {
|
|
42
|
-
apiVersion: 'v2024-08-01',
|
|
43
|
-
scope: 'global',
|
|
44
|
-
})
|
|
45
|
-
expect(request).toHaveBeenCalledWith({
|
|
46
|
-
uri: '/user-applications',
|
|
47
|
-
query: {organizationId: 'org1'},
|
|
48
|
-
tag: 'user-applications.list',
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('fetches a single user application by id', async () => {
|
|
53
|
-
const app = {id: 'ua1', appHost: 'my-studio'}
|
|
54
|
-
request.mockReturnValue(of(app))
|
|
55
|
-
|
|
56
|
-
const result = await userApplication.resolveState(instance, 'ua1')
|
|
57
|
-
|
|
58
|
-
expect(result).toEqual(app)
|
|
59
|
-
expect(request).toHaveBeenCalledWith({
|
|
60
|
-
uri: '/user-applications/ua1',
|
|
61
|
-
tag: 'user-applications.get',
|
|
62
|
-
})
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('creates a user application, sending query params and body, and refetches the list', async () => {
|
|
66
|
-
request.mockImplementation((opts) => {
|
|
67
|
-
const {method} = opts as {method?: string}
|
|
68
|
-
return method === 'POST' ? of({id: 'ua-new', title: 'New'}) : of([{id: 'ua-new'}])
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
const source = userApplications.getState(instance, {organizationId: 'org1'})
|
|
72
|
-
const unsubscribe = source.subscribe()
|
|
73
|
-
await vi.waitFor(() => expect(source.getCurrent().status).toBe('success'))
|
|
74
|
-
|
|
75
|
-
const {data, invalidated} = await createUserApplication(instance, {
|
|
76
|
-
organizationId: 'org1',
|
|
77
|
-
appType: 'studio',
|
|
78
|
-
urlType: 'internal',
|
|
79
|
-
appHost: 'my-studio',
|
|
80
|
-
title: 'New',
|
|
81
|
-
})
|
|
82
|
-
await invalidated
|
|
83
|
-
|
|
84
|
-
expect(data).toEqual({id: 'ua-new', title: 'New'})
|
|
85
|
-
expect(request).toHaveBeenCalledWith({
|
|
86
|
-
uri: '/user-applications',
|
|
87
|
-
method: 'POST',
|
|
88
|
-
query: {organizationId: 'org1', appType: 'studio'},
|
|
89
|
-
body: {urlType: 'internal', appHost: 'my-studio', title: 'New'},
|
|
90
|
-
tag: 'user-applications.create',
|
|
91
|
-
})
|
|
92
|
-
// initial list GET + POST + list refetch after invalidation
|
|
93
|
-
expect(request).toHaveBeenCalledTimes(3)
|
|
94
|
-
unsubscribe()
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
it('updates a user application via PATCH', async () => {
|
|
98
|
-
request.mockReturnValue(of({id: 'ua1', title: 'Renamed'}))
|
|
99
|
-
|
|
100
|
-
const {data} = await updateUserApplication(instance, {
|
|
101
|
-
userApplicationId: 'ua1',
|
|
102
|
-
title: 'Renamed',
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
expect(data).toEqual({id: 'ua1', title: 'Renamed'})
|
|
106
|
-
expect(request).toHaveBeenCalledWith({
|
|
107
|
-
uri: '/user-applications/ua1',
|
|
108
|
-
method: 'PATCH',
|
|
109
|
-
body: {title: 'Renamed'},
|
|
110
|
-
tag: 'user-applications.update',
|
|
111
|
-
})
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
it('deletes a user application via DELETE with no body', async () => {
|
|
115
|
-
request.mockReturnValue(of({deleted: true}))
|
|
116
|
-
|
|
117
|
-
const {data} = await deleteUserApplication(instance, {userApplicationId: 'ua1'})
|
|
118
|
-
|
|
119
|
-
expect(data).toEqual({deleted: true})
|
|
120
|
-
expect(request).toHaveBeenCalledWith({
|
|
121
|
-
uri: '/user-applications/ua1',
|
|
122
|
-
method: 'DELETE',
|
|
123
|
-
tag: 'user-applications.delete',
|
|
124
|
-
})
|
|
125
|
-
})
|
|
126
|
-
})
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import {switchMap} from 'rxjs'
|
|
2
|
-
|
|
3
|
-
import {getClientState} from '../client/clientStore'
|
|
4
|
-
import {defineFetcher, defineMutation} from '../store/fetcherStore'
|
|
5
|
-
import {buildQuery} from '../utils/buildQuery'
|
|
6
|
-
import {type ApplicationVisibility, type DeletedResult} from './applications'
|
|
7
|
-
|
|
8
|
-
// The version the CLI pins for this API family; verify against the deployed
|
|
9
|
-
// API before promoting these stores past @internal.
|
|
10
|
-
const API_VERSION = 'v2024-08-01'
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* A deployment of a user application, embedded when `activeDeployment` is
|
|
14
|
-
* included on the User Applications API. Distinct from the org Applications
|
|
15
|
-
* API's {@link ApplicationDeployment} summary.
|
|
16
|
-
*
|
|
17
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
18
|
-
* @public
|
|
19
|
-
*/
|
|
20
|
-
export interface UserApplicationDeployment {
|
|
21
|
-
id: string
|
|
22
|
-
version: string | null
|
|
23
|
-
isActiveDeployment: boolean
|
|
24
|
-
userApplicationId: string
|
|
25
|
-
isAutoUpdating: boolean | null
|
|
26
|
-
size: number | null
|
|
27
|
-
deployedAt: string
|
|
28
|
-
deployedBy: string | null
|
|
29
|
-
createdAt: string
|
|
30
|
-
updatedAt: string
|
|
31
|
-
manifest: unknown
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* A user application (deployed studio or custom app) as returned by
|
|
36
|
-
* `/user-applications`.
|
|
37
|
-
*
|
|
38
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
39
|
-
* @public
|
|
40
|
-
*/
|
|
41
|
-
export interface UserApplication {
|
|
42
|
-
id: string
|
|
43
|
-
projectId: string | null
|
|
44
|
-
organizationId: string | null
|
|
45
|
-
title: string | null
|
|
46
|
-
type: string
|
|
47
|
-
urlType: string
|
|
48
|
-
appHost: string
|
|
49
|
-
dashboardStatus: string
|
|
50
|
-
createdAt: string
|
|
51
|
-
updatedAt: string
|
|
52
|
-
autoUpdatingVersion: string | null
|
|
53
|
-
activeDeployment: UserApplicationDeployment | null
|
|
54
|
-
manifestData: unknown
|
|
55
|
-
config: Record<string, unknown> | null
|
|
56
|
-
manifest: unknown
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Options for listing an organization's user applications.
|
|
61
|
-
*
|
|
62
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
63
|
-
* @public
|
|
64
|
-
*/
|
|
65
|
-
export interface UserApplicationsOptions {
|
|
66
|
-
organizationId: string
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Fetcher for an organization's user applications (`GET /user-applications`),
|
|
71
|
-
* on the shared fetcher cache.
|
|
72
|
-
*
|
|
73
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
74
|
-
* @internal
|
|
75
|
-
*/
|
|
76
|
-
export const userApplications = defineFetcher<
|
|
77
|
-
[options: UserApplicationsOptions],
|
|
78
|
-
UserApplication[]
|
|
79
|
-
>({
|
|
80
|
-
name: 'userApplications',
|
|
81
|
-
getKey: (_instance, options) => options.organizationId,
|
|
82
|
-
fetch: (instance) => (options) =>
|
|
83
|
-
getClientState(instance, {apiVersion: API_VERSION, scope: 'global'}).observable.pipe(
|
|
84
|
-
switchMap((client) =>
|
|
85
|
-
client.observable.request<UserApplication[]>({
|
|
86
|
-
uri: '/user-applications',
|
|
87
|
-
query: buildQuery({organizationId: options.organizationId}),
|
|
88
|
-
tag: 'user-applications.list',
|
|
89
|
-
}),
|
|
90
|
-
),
|
|
91
|
-
),
|
|
92
|
-
tags: (data) => [
|
|
93
|
-
{type: 'user-application', id: 'LIST'},
|
|
94
|
-
...data.map((app) => ({type: 'user-application', id: app.id})),
|
|
95
|
-
],
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Fetcher for a single user application (`GET /user-applications/:id`), on the
|
|
100
|
-
* shared fetcher cache. No pre-seeding from {@link userApplications}: its list
|
|
101
|
-
* keys include the organization, which this fetcher's params can't
|
|
102
|
-
* reconstruct.
|
|
103
|
-
*
|
|
104
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
105
|
-
* @internal
|
|
106
|
-
*/
|
|
107
|
-
export const userApplication = defineFetcher<[userApplicationId: string], UserApplication>({
|
|
108
|
-
name: 'userApplication',
|
|
109
|
-
getKey: (_instance, userApplicationId) => userApplicationId,
|
|
110
|
-
fetch: (instance) => (userApplicationId) =>
|
|
111
|
-
getClientState(instance, {apiVersion: API_VERSION, scope: 'global'}).observable.pipe(
|
|
112
|
-
switchMap((client) =>
|
|
113
|
-
client.observable.request<UserApplication>({
|
|
114
|
-
uri: `/user-applications/${userApplicationId}`,
|
|
115
|
-
tag: 'user-applications.get',
|
|
116
|
-
}),
|
|
117
|
-
),
|
|
118
|
-
),
|
|
119
|
-
tags: (data) => [{type: 'user-application', id: data.id}],
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Fields you can set when creating or updating a user application.
|
|
124
|
-
*
|
|
125
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
126
|
-
* @internal
|
|
127
|
-
*/
|
|
128
|
-
export interface UserApplicationWriteFields {
|
|
129
|
-
/** Human-friendly display name; `null` clears it */
|
|
130
|
-
title?: string | null
|
|
131
|
-
/** `internal` for Sanity-hosted studios, `external` for externally hosted */
|
|
132
|
-
urlType?: 'internal' | 'external'
|
|
133
|
-
/** Studio subdomain (internal) or full `https` URL (external) */
|
|
134
|
-
appHost?: string
|
|
135
|
-
/** Internal apps only: make this the default app for the deployment */
|
|
136
|
-
isDefaultForDeployment?: boolean
|
|
137
|
-
/** Dashboard visibility */
|
|
138
|
-
dashboardStatus?: ApplicationVisibility
|
|
139
|
-
/** Auto-update channel or a pinned semver */
|
|
140
|
-
autoUpdatingVersion?: string | null
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Input for {@link createUserApplication}: the writable fields, with `urlType`
|
|
145
|
-
* and `appHost` required. `organizationId` and `appType` are sent as query
|
|
146
|
-
* parameters; the rest form the request body.
|
|
147
|
-
*
|
|
148
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
149
|
-
* @internal
|
|
150
|
-
*/
|
|
151
|
-
export interface CreateUserApplicationInput extends UserApplicationWriteFields {
|
|
152
|
-
/** Query param: owning organization */
|
|
153
|
-
organizationId?: string
|
|
154
|
-
/** Query param: `studio` or `coreApp` */
|
|
155
|
-
appType?: 'studio' | 'coreApp'
|
|
156
|
-
urlType: 'internal' | 'external'
|
|
157
|
-
appHost: string
|
|
158
|
-
/** Create does not accept a `null` title */
|
|
159
|
-
title?: string
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Mutation to create a user application (`POST /user-applications`). Invalidates
|
|
164
|
-
* the list so it reconverges to include the new entry.
|
|
165
|
-
*
|
|
166
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
167
|
-
* @internal
|
|
168
|
-
*/
|
|
169
|
-
export const createUserApplication = defineMutation<CreateUserApplicationInput, UserApplication>({
|
|
170
|
-
name: 'createUserApplication',
|
|
171
|
-
mutationFn:
|
|
172
|
-
(instance) =>
|
|
173
|
-
({organizationId, appType, ...body}) =>
|
|
174
|
-
getClientState(instance, {apiVersion: API_VERSION, scope: 'global'}).observable.pipe(
|
|
175
|
-
switchMap((client) =>
|
|
176
|
-
client.observable.request<UserApplication>({
|
|
177
|
-
uri: '/user-applications',
|
|
178
|
-
method: 'POST',
|
|
179
|
-
query: buildQuery({organizationId, appType}),
|
|
180
|
-
body,
|
|
181
|
-
tag: 'user-applications.create',
|
|
182
|
-
}),
|
|
183
|
-
),
|
|
184
|
-
),
|
|
185
|
-
invalidates: [{type: 'user-application', id: 'LIST'}],
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Input for {@link updateUserApplication}: the writable fields (all optional),
|
|
190
|
-
* keyed by id.
|
|
191
|
-
*
|
|
192
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
193
|
-
* @internal
|
|
194
|
-
*/
|
|
195
|
-
export interface UpdateUserApplicationInput extends UserApplicationWriteFields {
|
|
196
|
-
userApplicationId: string
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Mutation to update a user application (`PATCH /user-applications/:id`).
|
|
201
|
-
* Invalidates the updated entry and the list.
|
|
202
|
-
*
|
|
203
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
204
|
-
* @internal
|
|
205
|
-
*/
|
|
206
|
-
export const updateUserApplication = defineMutation<UpdateUserApplicationInput, UserApplication>({
|
|
207
|
-
name: 'updateUserApplication',
|
|
208
|
-
mutationFn:
|
|
209
|
-
(instance) =>
|
|
210
|
-
({userApplicationId, ...body}) =>
|
|
211
|
-
getClientState(instance, {apiVersion: API_VERSION, scope: 'global'}).observable.pipe(
|
|
212
|
-
switchMap((client) =>
|
|
213
|
-
client.observable.request<UserApplication>({
|
|
214
|
-
uri: `/user-applications/${userApplicationId}`,
|
|
215
|
-
method: 'PATCH',
|
|
216
|
-
body,
|
|
217
|
-
tag: 'user-applications.update',
|
|
218
|
-
}),
|
|
219
|
-
),
|
|
220
|
-
),
|
|
221
|
-
invalidates: (_result, {userApplicationId}) => [
|
|
222
|
-
{type: 'user-application', id: 'LIST'},
|
|
223
|
-
{type: 'user-application', id: userApplicationId},
|
|
224
|
-
],
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Input for {@link deleteUserApplication}.
|
|
229
|
-
*
|
|
230
|
-
* @internal
|
|
231
|
-
*/
|
|
232
|
-
export interface DeleteUserApplicationInput {
|
|
233
|
-
userApplicationId: string
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Mutation to delete a user application (`DELETE /user-applications/:id`).
|
|
238
|
-
* Invalidates the deleted entry and the list.
|
|
239
|
-
*
|
|
240
|
-
* @see https://www.sanity.io/docs/http-reference/applications-api
|
|
241
|
-
* @internal
|
|
242
|
-
*/
|
|
243
|
-
export const deleteUserApplication = defineMutation<DeleteUserApplicationInput, DeletedResult>({
|
|
244
|
-
name: 'deleteUserApplication',
|
|
245
|
-
mutationFn:
|
|
246
|
-
(instance) =>
|
|
247
|
-
({userApplicationId}) =>
|
|
248
|
-
getClientState(instance, {apiVersion: API_VERSION, scope: 'global'}).observable.pipe(
|
|
249
|
-
switchMap((client) =>
|
|
250
|
-
client.observable.request<DeletedResult>({
|
|
251
|
-
uri: `/user-applications/${userApplicationId}`,
|
|
252
|
-
method: 'DELETE',
|
|
253
|
-
tag: 'user-applications.delete',
|
|
254
|
-
}),
|
|
255
|
-
),
|
|
256
|
-
),
|
|
257
|
-
invalidates: (_result, {userApplicationId}) => [
|
|
258
|
-
{type: 'user-application', id: 'LIST'},
|
|
259
|
-
{type: 'user-application', id: userApplicationId},
|
|
260
|
-
],
|
|
261
|
-
})
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import {of} from 'rxjs'
|
|
2
|
-
import {beforeEach, describe, expect, it, vi} from 'vitest'
|
|
3
|
-
|
|
4
|
-
import {getProjectionState} from '../projection/getProjectionState'
|
|
5
|
-
import {type ProjectionValuePending} from '../projection/types'
|
|
6
|
-
import {createSanityInstance} from '../store/createSanityInstance'
|
|
7
|
-
import {type StateSource} from '../store/createStateSourceAction'
|
|
8
|
-
import {getPreviewState} from './getPreviewState'
|
|
9
|
-
import {type PreviewQueryResult} from './types'
|
|
10
|
-
|
|
11
|
-
vi.mock('../projection/getProjectionState')
|
|
12
|
-
|
|
13
|
-
describe('getPreviewState', () => {
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
vi.clearAllMocks()
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('transforms projection result to preview format', () => {
|
|
19
|
-
const mockProjectionResult: PreviewQueryResult = {
|
|
20
|
-
_id: 'doc1',
|
|
21
|
-
_type: 'article',
|
|
22
|
-
_updatedAt: '2024-01-01',
|
|
23
|
-
titleCandidates: {title: 'Test Title'},
|
|
24
|
-
subtitleCandidates: {description: 'Test Description'},
|
|
25
|
-
media: null,
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const mockProjectionState = {
|
|
29
|
-
getCurrent: vi.fn().mockReturnValue({
|
|
30
|
-
data: mockProjectionResult,
|
|
31
|
-
isPending: false,
|
|
32
|
-
} as ProjectionValuePending<PreviewQueryResult>),
|
|
33
|
-
subscribe: vi.fn(),
|
|
34
|
-
observable: of({
|
|
35
|
-
data: mockProjectionResult,
|
|
36
|
-
isPending: false,
|
|
37
|
-
} as ProjectionValuePending<PreviewQueryResult>),
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
vi.mocked(getProjectionState).mockReturnValue(
|
|
41
|
-
mockProjectionState as unknown as StateSource<
|
|
42
|
-
ProjectionValuePending<Record<string, unknown>> | undefined
|
|
43
|
-
>,
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
const instance = createSanityInstance({
|
|
47
|
-
projectId: 'test-project',
|
|
48
|
-
dataset: 'test-dataset',
|
|
49
|
-
})
|
|
50
|
-
const previewState = getPreviewState(instance, {
|
|
51
|
-
documentId: 'doc1',
|
|
52
|
-
documentType: 'article',
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
const result = previewState.getCurrent()
|
|
56
|
-
|
|
57
|
-
expect(result.data).toEqual({
|
|
58
|
-
title: 'Test Title',
|
|
59
|
-
subtitle: 'Test Description',
|
|
60
|
-
media: null,
|
|
61
|
-
})
|
|
62
|
-
expect(result.isPending).toBe(false)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('returns null data when projection result is null', () => {
|
|
66
|
-
const mockProjectionState = {
|
|
67
|
-
getCurrent: vi.fn().mockReturnValue({
|
|
68
|
-
data: null,
|
|
69
|
-
isPending: true,
|
|
70
|
-
}),
|
|
71
|
-
subscribe: vi.fn(),
|
|
72
|
-
observable: of({data: null, isPending: true}),
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
vi.mocked(getProjectionState).mockReturnValue(mockProjectionState)
|
|
76
|
-
|
|
77
|
-
const instance = createSanityInstance({
|
|
78
|
-
projectId: 'test-project',
|
|
79
|
-
dataset: 'test-dataset',
|
|
80
|
-
})
|
|
81
|
-
const previewState = getPreviewState(instance, {
|
|
82
|
-
documentId: 'doc1',
|
|
83
|
-
documentType: 'article',
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
const result = previewState.getCurrent()
|
|
87
|
-
|
|
88
|
-
expect(result.data).toBeNull()
|
|
89
|
-
expect(result.isPending).toBe(true)
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('uses fallback title when no title candidates exist', () => {
|
|
93
|
-
const mockProjectionResult: PreviewQueryResult = {
|
|
94
|
-
_id: 'doc1',
|
|
95
|
-
_type: 'article',
|
|
96
|
-
_updatedAt: '2024-01-01',
|
|
97
|
-
titleCandidates: {},
|
|
98
|
-
subtitleCandidates: {},
|
|
99
|
-
media: null,
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const mockProjectionState = {
|
|
103
|
-
getCurrent: vi.fn().mockReturnValue({
|
|
104
|
-
data: mockProjectionResult,
|
|
105
|
-
isPending: false,
|
|
106
|
-
} as ProjectionValuePending<PreviewQueryResult>),
|
|
107
|
-
subscribe: vi.fn(),
|
|
108
|
-
observable: of({
|
|
109
|
-
data: mockProjectionResult,
|
|
110
|
-
isPending: false,
|
|
111
|
-
} as ProjectionValuePending<PreviewQueryResult>),
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
vi.mocked(getProjectionState).mockReturnValue(
|
|
115
|
-
mockProjectionState as unknown as StateSource<
|
|
116
|
-
ProjectionValuePending<Record<string, unknown>> | undefined
|
|
117
|
-
>,
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
const instance = createSanityInstance({
|
|
121
|
-
projectId: 'test-project',
|
|
122
|
-
dataset: 'test-dataset',
|
|
123
|
-
})
|
|
124
|
-
const previewState = getPreviewState(instance, {
|
|
125
|
-
documentId: 'doc1',
|
|
126
|
-
documentType: 'article',
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
const result = previewState.getCurrent()
|
|
130
|
-
|
|
131
|
-
expect(result.data).toEqual({
|
|
132
|
-
title: 'article: doc1',
|
|
133
|
-
subtitle: undefined,
|
|
134
|
-
media: null,
|
|
135
|
-
})
|
|
136
|
-
})
|
|
137
|
-
})
|