UNPKG

@sanity/visual-editing

Version:

[![npm stat](https://img.shields.io/npm/dm/@sanity/visual-editing.svg?style=flat-square)](https://npm-stat.com/charts.html?package=@sanity/visual-editing) [![npm version](https://img.shields.io/npm/v/@sanity/visual-editing.svg?style=flat-square)](https://

1 lines 10.9 kB
{"version":3,"file":"index.cjs","sources":["../../src/optimistic/state/documentMutator.ts","../../src/optimistic/state/datasetMutator.ts"],"sourcesContent":["import type {SanityClient} from '@sanity/client'\nimport {SanityEncoder, type Transaction} from '@sanity/mutate'\nimport {\n documentMutatorMachine,\n type DocumentMutatorMachineParentEvent,\n} from '@sanity/mutate/_unstable_machine'\nimport {enqueueActions, fromPromise} from 'xstate'\nimport type {VisualEditingNode} from '../../types'\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport const createDocumentMutator = (comlink: VisualEditingNode) => {\n const fetchSnapshot = fromPromise(\n async ({input, signal}: {input: {id: string; client: SanityClient}; signal: AbortSignal}) => {\n const {id} = input\n const {snapshot} = await comlink.fetch(\n 'visual-editing/fetch-snapshot',\n {documentId: id},\n {\n signal,\n },\n )\n return snapshot\n },\n )\n\n const submitMutations = fromPromise(\n async ({input}: {input: {client: SanityClient; transactions: Transaction[]}}) => {\n const {transactions} = input\n for (const transaction of transactions) {\n const data = SanityEncoder.encodeTransaction(transaction)\n return comlink.post('visual-editing/mutate', data)\n }\n },\n )\n\n return documentMutatorMachine.provide({\n actions: {\n 'send sync event to parent': enqueueActions(({enqueue}) => {\n // Original action provided by the `documentMutatorMachine`\n enqueue.sendParent(\n ({context}) =>\n ({\n type: 'sync',\n id: context.id,\n document: context.remote!,\n }) satisfies DocumentMutatorMachineParentEvent,\n )\n // Additional action so that we can determine when the snapshot is ready\n enqueue.emit(({context}) => ({type: 'ready', snapshot: context.local}))\n }),\n },\n actors: {\n 'fetch remote snapshot': fetchSnapshot,\n 'submit mutations as transactions': submitMutations,\n },\n })\n}\n","/**\n * The logic here is intended to live inside a preview iframe, and listen to events from the parent frame.\n * It also supports running in a \"detached\" mode, where it has to setup authenticated EventSource conenctions and perform data fetching itself.\n */\n\nimport {type SanityClient} from '@sanity/client'\nimport {\n createSharedListener,\n documentMutatorMachine,\n type DocumentMutatorMachineInput,\n type DocumentMutatorMachineParentEvent,\n} from '@sanity/mutate/_unstable_machine'\nimport {assertEvent, assign, emit, setup, stopChild, type ActorRefFrom} from 'xstate'\nimport type {VisualEditingNode} from '../../types'\nimport {createDocumentMutator} from './documentMutator'\n\nexport interface DatasetMutatorMachineInput extends Omit<DocumentMutatorMachineInput, 'id'> {\n client: SanityClient\n /** A shared listener can be provided, if not it'll be created using `client.listen()` */\n sharedListener?: ReturnType<typeof createSharedListener>\n}\n\nexport const datasetMutatorMachine = setup({\n types: {} as {\n context: {\n client: SanityClient\n /** A shared listener can be provided, if not it'll be created using `client.listen()` */\n sharedListener?: ReturnType<typeof createSharedListener>\n documents: Record<string, ActorRefFrom<ReturnType<typeof createDocumentMutator>>>\n }\n events:\n | {type: 'observe'; documentId: string}\n | {type: 'unobserve'; documentId: string}\n | {type: 'add document actor'; documentId: string}\n | {type: 'stop document actor'; documentId: string}\n | DocumentMutatorMachineParentEvent\n input: DatasetMutatorMachineInput\n emitted: DocumentMutatorMachineParentEvent\n },\n actions: {\n 'emit sync event': emit(({event}) => {\n assertEvent(event, 'sync')\n return event\n }),\n 'emit mutation event': emit(({event}) => {\n assertEvent(event, 'mutation')\n return event\n }),\n 'emit rebased event': emit(({event}) => {\n assertEvent(event, ['rebased.local', 'rebased.remote'])\n return event\n }),\n 'emit pristine event': emit(({event}) => {\n assertEvent(event, ['pristine'])\n return event\n }),\n 'add document actor': assign({\n documents: ({context, event, spawn}) => {\n assertEvent(event, 'observe')\n const id = event.documentId\n // Adding the same documentId multiple times is a no-op\n if (context.documents[id]) return context.documents\n return {\n ...context.documents,\n [id]: spawn('documentMutatorMachine', {\n input: {\n id,\n client: context.client,\n sharedListener: context.sharedListener || createSharedListener(context.client),\n },\n id,\n }),\n }\n },\n }),\n 'stop remote snapshot': stopChild(({context, event}) => {\n assertEvent(event, 'unobserve')\n return context.documents[event.documentId]!\n }),\n 'remove remote snapshot from context': assign({\n documents: ({context, event}) => {\n assertEvent(event, 'unobserve')\n // Removing a non-existing documentId is a no-op\n if (!context.documents[event.documentId]) return context.documents\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {[event.documentId]: _, ...documents} = context.documents\n return documents\n },\n }),\n },\n actors: {\n documentMutatorMachine,\n },\n}).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QBsD2BjAhsgIhgrgLZgB2ALgMTICWsZpA2gAwC6ioADqrNWdaiXYgAHogC0ADgBMAOgkA2ACyKArBICcTdfKXSANCACeiFQHYZpgMxWV800yYqp6gIyn5AXw8G0WXAWJyCnwSGjpGViEuHj4BIVEEKUt5OSlFU1smFwkFW0sDY0T1GRUXRXkXKVN7HSYJJkUvHwxsPHQiUjIZDgAnWj4SMApCfDJMemY2JBBo3n5BaYSXeVlbKRUsiXdFSxcXfKNERSqZTbr1zVMJNyaQX1aAzpkIah6yQwp0VEJCXkmo7hzOKLRDLFwyFxaSzXKTOKQudSKCQFRDOczqCSWJjwjbHCQqRFebwgEioCBwIT3fztQJkAExebxcQuFEIZaWGRIrF7dSXKTyFSNYlUtodcjdPp0aiDelAhagBLpVmWAmc46mNwSZTyLQuFS3EWPcUvN6FTiA2LykSoq6c6wbCqVUzparKioyRFVfkq1zqNSWIkeIA */\n id: 'dataset-mutator',\n context: ({input}) => ({\n documents: {},\n client: input.client,\n sharedListener: input.sharedListener,\n }),\n\n on: {\n 'sync': {actions: ['emit sync event']},\n 'mutation': {actions: ['emit mutation event']},\n 'rebased.*': {actions: ['emit rebased event']},\n 'pristine': {actions: ['emit pristine event']},\n 'observe': {\n actions: ['add document actor'],\n },\n 'unobserve': {\n actions: ['stop remote snapshot', 'remove remote snapshot from context'],\n },\n },\n\n initial: 'pristine',\n\n states: {\n pristine: {},\n },\n})\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport const createDatasetMutator = (comlink: VisualEditingNode) => {\n return datasetMutatorMachine.provide({\n actors: {\n documentMutatorMachine: createDocumentMutator(comlink),\n },\n })\n}\n"],"names":["createDocumentMutator","comlink","fetchSnapshot","fromPromise","input","signal","id","snapshot","fetch","documentId","submitMutations","transactions","transaction","data","SanityEncoder","encodeTransaction","post","documentMutatorMachine","provide","actions","enqueueActions","enqueue","sendParent","context","type","document","remote","emit","local","actors","datasetMutatorMachine","setup","types","event","assertEvent","assign","documents","spawn","client","sharedListener","createSharedListener","stopChild","_","createMachine","on","initial","states","pristine","createDatasetMutator"],"mappings":"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"}