@limitless-angular/sanity
Version:
A powerful Angular library for Sanity.io integration, featuring Portable Text rendering and optimized image loading.
1 lines • 40 kB
Source Map (JSON)
{"version":3,"file":"limitless-angular-sanity-preview-kit.mjs","sources":["../../../../packages/sanity/preview-kit/src/tokens.ts","../../../../packages/sanity/preview-kit/src/revalidate.service.ts","../../../../packages/sanity/preview-kit/src/live-preview.service.ts","../../../../packages/sanity/preview-kit/src/live-query-provider.component.ts","../../../../packages/sanity/preview-kit/src/create-live-data.ts","../../../../packages/sanity/preview-kit/src/limitless-angular-sanity-preview-kit.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const LIVE_PREVIEW_REFRESH_INTERVAL = new InjectionToken<number>(\n 'LIVE_PREVIEW_REFRESH_INTERVAL',\n);\n","import { inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { isEqual } from 'lodash-es';\nimport {\n BehaviorSubject,\n Observable,\n combineLatest,\n fromEvent,\n timer,\n Subject,\n} from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\n\nexport type RevalidateState = 'hit' | 'stale' | 'refresh' | 'inflight';\n\n@Injectable()\nexport class RevalidateService {\n private isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private revalidateState$ = new BehaviorSubject<RevalidateState>('hit');\n private online$ = new BehaviorSubject(false);\n private visibilityState$!: Observable<DocumentVisibilityState>;\n private readonly shouldPause$!: Observable<boolean>;\n private refreshInterval$ = new Subject<number>();\n\n constructor() {\n if (this.isBrowser) {\n this.setupOnlineListener();\n this.visibilityState$ = this.createVisibilityState$();\n this.shouldPause$ = this.createShouldPause$();\n this.setupStateManagement();\n }\n }\n\n private setupOnlineListener() {\n this.online$.next(navigator.onLine);\n fromEvent(window, 'online')\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.online$.next(true));\n\n fromEvent(window, 'offline')\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.online$.next(false));\n }\n\n private createVisibilityState$(): Observable<DocumentVisibilityState> {\n return new Observable<DocumentVisibilityState>((observer) => {\n const onVisibilityChange = () => observer.next(document.visibilityState);\n document.addEventListener('visibilitychange', onVisibilityChange);\n onVisibilityChange(); // Initial value\n return () =>\n document.removeEventListener('visibilitychange', onVisibilityChange);\n }).pipe(shareReplay(1));\n }\n\n private createShouldPause$(): Observable<boolean> {\n return combineLatest([this.online$, this.visibilityState$]).pipe(\n map(\n ([online, visibilityState]) => !online || visibilityState === 'hidden',\n ),\n shareReplay(1),\n );\n }\n\n private setupStateManagement() {\n // Handle window focus\n fromEvent(window, 'focus')\n .pipe(\n filter(() => this.revalidateState$.value === 'hit'),\n takeUntilDestroyed(),\n )\n .subscribe(() => this.revalidateState$.next('stale'));\n\n // Handle refresh interval\n this.refreshInterval$\n .pipe(\n // If interval is nullish then we don't want to refresh.\n // Inflight means it's already refreshing and we pause the countdown.\n // It's only necessary to start the countdown if the cache isn't already stale\n filter(\n (interval) => !!interval && this.revalidateState$.value === 'hit',\n ),\n switchMap((interval) => timer(0, interval)),\n takeUntilDestroyed(),\n )\n .subscribe(() => this.revalidateState$.next('stale'));\n\n // Revalidate on changes to shouldPause\n combineLatest([this.shouldPause$, this.revalidateState$])\n .pipe(\n distinctUntilChanged<[boolean, RevalidateState]>(isEqual),\n takeUntilDestroyed(),\n )\n .subscribe(([shouldPause, state]) => {\n // Mark as stale pre-emptively if we're offline or the document isn't visible\n if (shouldPause && state === 'hit') {\n this.revalidateState$.next('stale');\n }\n\n // If not paused we can mark stale as ready for refresh\n if (!shouldPause && state === 'stale') {\n this.revalidateState$.next('refresh');\n }\n });\n }\n\n setupRevalidate(refreshInterval: number): void {\n this.refreshInterval$.next(refreshInterval);\n }\n\n startRefresh(): () => void {\n this.revalidateState$.next('inflight');\n return () => this.revalidateState$.next('hit');\n }\n\n getRevalidateState(): Observable<RevalidateState> {\n return this.revalidateState$.asObservable().pipe(distinctUntilChanged());\n }\n}\n","import { Injectable, inject, PLATFORM_ID, DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n from,\n mergeMap,\n Observable,\n of,\n takeWhile,\n} from 'rxjs';\nimport {\n catchError,\n distinctUntilChanged,\n filter,\n finalize,\n map,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport { LRUCache } from 'lru-cache';\nimport { applyPatch } from 'mendoza';\nimport { vercelStegaSplit } from '@vercel/stega';\nimport { applySourceDocuments } from '@sanity/client/csm';\nimport { LIVE_PREVIEW_REFRESH_INTERVAL } from './tokens';\nimport { QueryCacheKey, type EnhancedQuerySnapshot } from './types';\nimport {\n ContentSourceMap,\n QueryParams,\n SanityDocument,\n MutationEvent,\n InitializedClientConfig,\n type SanityClient,\n} from '@sanity/client';\nimport { RevalidateService } from './revalidate.service';\n// eslint-disable-next-line @nx/enforce-module-boundaries\nimport { UseDocumentsInUseService } from '@limitless-angular/sanity/preview-kit-compat';\nimport { SANITY_CLIENT_FACTORY } from '@limitless-angular/sanity/shared';\n\nconst DEFAULT_TAG = 'sanity.preview-kit';\n\nfunction getTurboCacheKey(\n projectId: string,\n dataset: string,\n _id: string,\n): `${string}-${string}-${string}` {\n return `${projectId}-${dataset}-${_id}`;\n}\n\n/** @internal */\nfunction getQueryCacheKey(query: string, params: QueryParams): QueryCacheKey {\n return `${query}-${JSON.stringify(params)}`;\n}\n\n/**\n * Return params that are stable with deep equal as long as the key order is the same\n *\n * Based on https://github.com/sanity-io/visual-editing/blob/main/packages/visual-editing-helpers/src/hooks/useQueryParams.ts\n * @internal\n */\nfunction getStableQueryParams(\n params?: undefined | null | QueryParams,\n): QueryParams {\n return JSON.parse(JSON.stringify(params ?? {}));\n}\n\n@Injectable()\nexport class LivePreviewService {\n private client!: SanityClient;\n private clientFactory = inject(SANITY_CLIENT_FACTORY);\n private destroyRef = inject(DestroyRef);\n private isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private refreshInterval = inject(LIVE_PREVIEW_REFRESH_INTERVAL);\n private revalidateService = inject(RevalidateService);\n private useDocumentsInUse = inject(UseDocumentsInUseService);\n\n private config!: Required<InitializedClientConfig>;\n private snapshots = new Map<\n QueryCacheKey,\n BehaviorSubject<EnhancedQuerySnapshot<unknown>>\n >();\n private documentsCache!: LRUCache<string, SanityDocument>;\n private docsInUse = new Map<string, ContentSourceMap['documents'][number]>();\n private lastMutatedDocumentId$ = new BehaviorSubject<string | null>(null);\n private turboIds$ = new BehaviorSubject<string[]>([]);\n #isInitialized = false;\n private warnedAboutCrossDatasetReference = false;\n\n get isInitialized(): boolean {\n return this.#isInitialized;\n }\n\n initialize(token: string): void {\n if (this.#isInitialized) {\n console.warn('LiveStoreService is already initialized');\n return;\n }\n\n const client = this.clientFactory({ token });\n const { requestTagPrefix, resultSourceMap } = client.config();\n\n this.client = client.withConfig({\n requestTagPrefix: requestTagPrefix ?? DEFAULT_TAG,\n resultSourceMap:\n resultSourceMap === 'withKeyArraySelector'\n ? 'withKeyArraySelector'\n : true,\n // Set the recommended defaults, this is a convenience to make it easier to share a client config from a server component to the client component\n ...(token && {\n token,\n useCdn: false,\n perspective: 'previewDrafts',\n ignoreBrowserTokenWarning: true,\n }),\n });\n this.config = this.client.config() as Required<InitializedClientConfig>;\n\n this.documentsCache = new LRUCache<string, SanityDocument>({ max: 500 });\n\n if (this.isBrowser) {\n this.useDocumentsInUse.initialize(this.config);\n this.setupTurboUpdates();\n this.loadMissingDocuments();\n this.revalidateService.setupRevalidate(this.refreshInterval);\n this.setupSourceMapUpdates();\n this.updateActiveDocumentIds();\n this.syncWithPresentationToolIfPresent();\n }\n\n this.#isInitialized = true;\n }\n\n private checkInitialization(): void {\n if (!this.#isInitialized) {\n throw new Error(\n 'LiveStoreService is not initialized. Call initialize(token) first.',\n );\n }\n }\n\n private turboIdsFromSourceMap(resultSourceMap: ContentSourceMap) {\n const nextTurboIds = new Set<string>();\n this.docsInUse.clear();\n if (resultSourceMap?.documents?.length) {\n for (const document of resultSourceMap.documents) {\n nextTurboIds.add(document._id);\n this.docsInUse.set(document._id, document);\n }\n }\n\n const prevTurboIds = this.turboIds$.getValue();\n const mergedTurboIds = Array.from(\n new Set([...prevTurboIds, ...nextTurboIds]),\n );\n if (\n JSON.stringify(mergedTurboIds.sort()) !==\n JSON.stringify(prevTurboIds.sort())\n ) {\n this.turboIds$.next(mergedTurboIds);\n }\n }\n\n private turboChargeResultIfSourceMap(\n result: unknown,\n resultSourceMap?: ContentSourceMap,\n ): unknown {\n if (!resultSourceMap) {\n return result;\n }\n\n return applySourceDocuments(\n result,\n resultSourceMap,\n (sourceDocument) => {\n if (sourceDocument._projectId) {\n // @TODO Handle cross dataset references\n if (!this.warnedAboutCrossDatasetReference) {\n console.warn(\n 'Cross dataset references are not supported yet, ignoring source document',\n sourceDocument,\n );\n this.warnedAboutCrossDatasetReference = true;\n }\n return undefined;\n }\n return this.documentsCache.get(\n getTurboCacheKey(\n this.config.projectId,\n this.config.dataset,\n sourceDocument._id,\n ),\n );\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (changedValue: any, { previousValue }) => {\n if (\n typeof changedValue === 'string' &&\n typeof previousValue === 'string'\n ) {\n const { encoded } = vercelStegaSplit(previousValue);\n const { cleaned } = vercelStegaSplit(changedValue);\n return `${encoded}${cleaned}`;\n }\n return changedValue;\n },\n 'previewDrafts',\n );\n }\n\n listenLiveQuery<QueryResult>(\n initialData: QueryResult,\n query: string,\n queryParams?: QueryParams,\n ): Observable<QueryResult> {\n if (!this.isBrowser) {\n return of(initialData);\n }\n\n this.checkInitialization();\n\n const params = getStableQueryParams(queryParams);\n const key = getQueryCacheKey(query, params);\n let snapshot = this.snapshots.get(key) as\n | BehaviorSubject<EnhancedQuerySnapshot<QueryResult>>\n | undefined;\n\n if (!snapshot) {\n snapshot = new BehaviorSubject<EnhancedQuerySnapshot<QueryResult>>({\n result: initialData ?? (null as unknown as QueryResult),\n resultSourceMap: {} as ContentSourceMap,\n query,\n params,\n });\n this.snapshots.set(\n key,\n snapshot as BehaviorSubject<EnhancedQuerySnapshot<unknown>>,\n );\n }\n\n if (!snapshot.observed) {\n this.handleRevalidation(snapshot);\n }\n\n return snapshot.pipe(\n map((snapshot) => snapshot.result),\n distinctUntilChanged(),\n );\n }\n\n private handleRevalidation<QueryResult>(\n snapshot: BehaviorSubject<EnhancedQuerySnapshot<QueryResult>>,\n ) {\n const { query, params } = snapshot.getValue();\n this.revalidateService\n .getRevalidateState()\n .pipe(\n map((state) => state === 'refresh' || state === 'inflight'),\n distinctUntilChanged(),\n filter(Boolean),\n switchMap(() => this.fetchQuery(query, params)),\n takeWhile(() => snapshot.observed),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private fetchQuery(query: string, params: QueryParams): Observable<void> {\n const onFinally = this.revalidateService.startRefresh();\n const controller = new AbortController();\n return from(\n this.client.fetch(query, params, {\n signal: controller.signal,\n filterResponse: false,\n }),\n ).pipe(\n tap(({ result, resultSourceMap }) => {\n this.updateSnapshot(query, params, result, resultSourceMap);\n if (resultSourceMap) {\n this.turboIdsFromSourceMap(resultSourceMap);\n }\n }),\n catchError((error) => {\n if (error.name !== 'AbortError') {\n // Here you might want to implement error handling\n console.error(error);\n }\n return EMPTY;\n }),\n finalize(onFinally),\n map(() => undefined),\n );\n }\n\n private updateSnapshot(\n query: string,\n params: QueryParams,\n result: unknown,\n resultSourceMap?: ContentSourceMap,\n ): void {\n const key = getQueryCacheKey(query, params);\n const snapshot = this.snapshots.get(key);\n if (snapshot) {\n snapshot.next({\n ...snapshot.getValue(),\n result: this.turboChargeResultIfSourceMap(result, resultSourceMap),\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n resultSourceMap: resultSourceMap!,\n });\n }\n }\n\n private setupTurboUpdates() {\n this.client\n .listen(\n '*',\n {},\n {\n events: ['mutation'],\n effectFormat: 'mendoza',\n includePreviousRevision: false,\n includeResult: false,\n tag: 'turbo',\n },\n )\n .pipe(\n filter(\n (update): update is MutationEvent =>\n update.type === 'mutation' &&\n (update.effects?.apply?.length ?? 0) > 0,\n ),\n tap((update) => {\n const key = getTurboCacheKey(\n this.config.projectId,\n this.config.dataset,\n update.documentId,\n );\n const cachedDocument = this.documentsCache.peek(key);\n if (cachedDocument) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const patchDoc = { ...cachedDocument } as any;\n delete patchDoc._rev;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const patchedDocument = applyPatch(patchDoc, update.effects!.apply);\n this.documentsCache.set(key, patchedDocument);\n }\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((update) => {\n this.lastMutatedDocumentId$.next(update.documentId);\n });\n }\n\n private setupSourceMapUpdates(): void {\n combineLatest([this.lastMutatedDocumentId$, this.turboIds$])\n .pipe(\n filter(\n ([lastMutatedDocumentId, turboIds]) =>\n !!lastMutatedDocumentId && turboIds.includes(lastMutatedDocumentId),\n ),\n switchMap(() => this.updateAllSnapshots()),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n this.lastMutatedDocumentId$.next(null);\n });\n }\n\n private updateActiveDocumentIds(): void {\n this.turboIds$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((turboIds) => {\n const nextTurboIds = new Set<string>();\n this.docsInUse.clear();\n for (const snapshot of this.snapshots.values()) {\n if (snapshot.observed) {\n const { resultSourceMap } = snapshot.getValue();\n if (resultSourceMap?.documents?.length) {\n for (const document of resultSourceMap.documents) {\n nextTurboIds.add(document._id);\n this.docsInUse.set(document._id, document);\n }\n }\n }\n }\n\n const nextTurboIdsSnapshot = [...nextTurboIds].sort();\n if (JSON.stringify(turboIds) !== JSON.stringify(nextTurboIdsSnapshot)) {\n this.turboIds$.next(nextTurboIdsSnapshot);\n }\n });\n }\n\n private syncWithPresentationToolIfPresent(): void {\n this.turboIds$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.useDocumentsInUse.updateDocumentsInUse(this.docsInUse);\n });\n }\n\n private updateAllSnapshots(): Observable<void> {\n for (const [, snapshot] of this.snapshots.entries()) {\n const currentSnapshot = snapshot.getValue();\n if (currentSnapshot.resultSourceMap?.documents?.length) {\n const updatedResult = this.turboChargeResultIfSourceMap(\n currentSnapshot.result,\n currentSnapshot.resultSourceMap,\n );\n snapshot.next({\n ...currentSnapshot,\n result: updatedResult,\n });\n }\n }\n\n return EMPTY;\n }\n\n private loadMissingDocuments() {\n const { projectId, dataset } = this.config;\n const documentsCache = this.documentsCache;\n const batch$ = new BehaviorSubject<string[][]>([]);\n combineLatest([batch$, this.turboIds$])\n .pipe(\n map(([batch, turboIds]) => {\n const batchSet = new Set(batch.flat());\n const nextBatch = new Set<string>();\n for (const turboId of turboIds) {\n if (\n !batchSet.has(turboId) &&\n !documentsCache.has(getTurboCacheKey(projectId, dataset, turboId))\n ) {\n nextBatch.add(turboId);\n }\n }\n\n return [...nextBatch].slice(0, 100);\n }),\n filter((nextBatchSlice) => !!nextBatchSlice.length),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((nextBatchSlice) => {\n const prevBatch = batch$.getValue();\n batch$.next([...prevBatch.slice(-100), nextBatchSlice]);\n });\n\n batch$\n .pipe(\n switchMap((batches) => from(batches)),\n mergeMap((ids) => {\n const missingIds = ids.filter(\n (id) =>\n !documentsCache.has(getTurboCacheKey(projectId, dataset, id)),\n );\n if (missingIds.length === 0) {\n return EMPTY;\n }\n\n return from(this.client.getDocuments(missingIds)).pipe(\n tap((documents) => {\n for (const doc of documents) {\n if (doc && doc._id) {\n documentsCache.set(\n getTurboCacheKey(projectId, dataset, doc._id),\n doc,\n );\n }\n }\n }),\n catchError((error) => {\n console.error('Error loading documents:', error);\n return EMPTY;\n }),\n );\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n} from '@angular/core';\n// eslint-disable-next-line @nx/enforce-module-boundaries\nimport { UseDocumentsInUseService } from '@limitless-angular/sanity/preview-kit-compat';\n\nimport { LivePreviewService } from './live-preview.service';\nimport { RevalidateService } from './revalidate.service';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'live-query-provider',\n template: `<ng-content />`,\n providers: [LivePreviewService, RevalidateService, UseDocumentsInUseService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LiveQueryProviderComponent {\n token = input.required<string>();\n\n private livePreviewService = inject(LivePreviewService);\n\n constructor() {\n // Initialization for Angular v18\n afterNextRender(() => {\n if (!this.livePreviewService.isInitialized) {\n this.livePreviewService.initialize(this.token());\n }\n });\n\n // Initialization for Angular v19\n effect(() => {\n if (!this.livePreviewService.isInitialized) {\n this.livePreviewService.initialize(this.token());\n }\n });\n }\n}\n","import {\n computed,\n effect,\n inject,\n signal,\n type Signal,\n untracked,\n} from '@angular/core';\n\nimport { combineLatest, type Observable, startWith } from 'rxjs';\nimport { LivePreviewService } from './live-preview.service';\n\ntype QueryConfig = { query: string; params?: Record<string, unknown> };\n\ntype QueriesConfig<T> = { [K in keyof T]?: QueryConfig };\n\n// Single query overload\nexport function createLiveData<T>(\n initialData: () => T,\n queries: () => QueryConfig,\n): Signal<T>;\n\n// Multiple queries overload\nexport function createLiveData<\n T extends Record<string, unknown>,\n K extends keyof T,\n>(initialData: () => T, queries: () => QueriesConfig<T>): Signal<Pick<T, K>>;\n\n// Implementation\nexport function createLiveData<T>(\n initialData: () => T,\n queries: () => QueryConfig | QueriesConfig<T>,\n): Signal<T> {\n const livePreviewService = inject(LivePreviewService);\n\n return computedAsync(() => {\n const queryConfig = queries();\n const initial = untracked(initialData);\n\n // Handle single query configuration\n if ('query' in queryConfig) {\n return livePreviewService\n .listenLiveQuery(initial, queryConfig.query, queryConfig.params)\n .pipe(startWith(initial));\n }\n\n // Handle multiple queries configuration\n const observables = Object.entries(\n queryConfig as QueriesConfig<Record<string, unknown>>,\n ).reduce(\n (acc, [key, config]) => {\n acc[key as keyof T] = livePreviewService.listenLiveQuery(\n initial[key as keyof T],\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n config!.query,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n config!.params,\n );\n return acc;\n },\n {} as { [K in keyof T]: Observable<T[K]> },\n );\n\n return combineLatest(observables).pipe(startWith(initial));\n }, initialData) as Signal<T>;\n}\n\nfunction computedAsync<T>(\n computation: () => Observable<T>,\n initialValue: () => T,\n): Signal<T | undefined> {\n const value = signal<T | undefined>(undefined);\n const error = signal<unknown | undefined>(undefined);\n\n effect(\n (onCleanup) => {\n const subscription = computation().subscribe({\n next: (v) => value.set(v),\n error: (e) => error.set(e),\n });\n\n onCleanup(() => subscription.unsubscribe());\n },\n { allowSignalWrites: true },\n );\n\n return computed(() => {\n if (error()) {\n throw error();\n }\n\n return value() ?? untracked(initialValue);\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}