UNPKG

@sanity/migrate

Version:

Tooling for running data migrations on Sanity.io projects

172 lines 8.38 kB
import { type MultipleMutationResult, type Mutation as RawMutation } from '@sanity/client'; import { type Path, type SanityDocument } from '@sanity/types'; import { type JsonArray, type JsonObject, type JsonValue } from './json.js'; import { type Mutation, type NodePatch, type Operation, type Transaction } from './mutations/index.js'; import { type RestrictedClient } from './runner/utils/createContextClient.js'; export type * from './json.js'; export type AsyncIterableMigration = (documents: () => AsyncIterableIterator<SanityDocument>, context: MigrationContext) => AsyncGenerator<(Mutation | Transaction)[] | Mutation | Transaction>; /** * @public * * Main interface for a content migration definition * {@link https://www.sanity.io/docs/schema-and-content-migrations#af2be129ccd6} */ export interface Migration<Def extends MigrateDefinition = MigrateDefinition> { /** * An object of named helper functions corresponding to the primary schema type of the content you want to migrate. * You can also run these functions as async and return the migration instructions as promises if you need to fetch data from elsewhere. * If you want more control, `migrate` can also be an async iterable function that yields mutations or transactions. * {@link NodeMigration} * {@link AsyncIterableMigration} * */ migrate: Def; /** * A reader-friendly description of what the content migration does */ title: string; /** * An array of document types to run the content migration on. If you don’t define this, the migration type will target all document types. * Note: This reflects the document types your migration will be based on, not necessarily the documents you will modify. */ documentTypes?: string[]; /** * A simple GROQ-filter (doesn’t support joins) for documents you want to run the content migration on. * Note: instead of adding `_type == 'yourType'` to the filter, it's better to add its `_type` to `documentTypes`. * Note: `documentTypes` and `filter` are combined with AND. This means a document will only be included in the * migration if its `_type` matches any of the provided `documentTypes` AND it also matches the `filter` (if provided). */ filter?: string; } /** * @public * * Migration context. This will be passed to both async iterable migrations and node migration helper functions */ export interface MigrationContext { client: RestrictedClient; dryRun: boolean; filtered: { getDocument<T extends SanityDocument>(id: string): Promise<T | undefined>; getDocuments<T extends SanityDocument>(ids: string[]): Promise<T[]>; }; } /** * @public * * Interface for `Migration['migrate']`. Either a NodeMigration or an AsyncIterableMigration * {@link NodeMigration} * {@link AsyncIterableMigration} */ export type MigrateDefinition = AsyncIterableMigration | NodeMigration; /** * Migration progress, only used internally (for now) * @internal * @hidden */ export type MigrationProgress = { completedTransactions: MultipleMutationResult[]; currentTransactions: (Mutation | Transaction)[]; documents: number; done?: boolean; mutations: number; pending: number; queuedBatches: number; }; /** * API configuration for the migration runner * @internal * @hidden */ export interface APIConfig { apiVersion: 'vX' | `v${number}-${number}-${number}`; dataset: string; projectId: string; token: string; apiHost?: string; } /** * API configuration for exports * @internal * @hidden */ export interface ExportAPIConfig extends APIConfig { documentTypes?: string[]; } /** * @public * * Possible return values from a migration helper that runs on a document as a whole * Currently, this is only applies to {@link NodeMigration.document} */ export type DocumentMigrationReturnValue = Mutation | Mutation[] | NodePatch | NodePatch[] | RawMutation | RawMutation[]; /** * @public * * Possible return values from a migration helper that runs on nodes within a document */ export type NodeMigrationReturnValue = DocumentMigrationReturnValue | Operation | Operation[]; /** * @public * * Node migration helper functions. As the migration is processing a document, it will visit each node in the document, depth-first, call the appropriate helper function for the node type and collect any mutations returned from it. */ export interface NodeMigration { /** * Helper function that will be called for each array in each document included in the migration * @param object - The object value currently being visited * @param path - The path to the node within the document. See {@link Path} * @param context - The {@link MigrationContext} instance */ array?: <Node extends JsonArray>(node: Node, path: Path, context: MigrationContext) => NodeMigrationReturnValue | Promise<NodeMigrationReturnValue | void> | void; /** * Helper function that will be called for each boolean value in each document included in the migration * @param string - The string value currently being visited * @param path - The path to the node within the document. See {@link Path} * @param context - The {@link MigrationContext} instance */ boolean?: <Node extends boolean>(node: Node, path: Path, context: MigrationContext) => NodeMigrationReturnValue | Promise<NodeMigrationReturnValue | void> | void; /** * Helper function for migrating a document as a whole * @param doc - The document currently being processed * @param context - The {@link MigrationContext} instance */ document?: <Doc extends SanityDocument>(doc: Doc, context: MigrationContext) => DocumentMigrationReturnValue | Promise<DocumentMigrationReturnValue | Transaction> | Transaction | void; /** * Helper function that will be called for each node in each document included in the migration * @param node - The node currently being visited * @param path - The path to the node within the document. See {@link Path} * @param context - The {@link MigrationContext} instance */ node?: <Node extends JsonValue>(node: Node, path: Path, context: MigrationContext) => NodeMigrationReturnValue | Promise<NodeMigrationReturnValue | void> | void; /** * Helper function that will be called for each `null` value in each document included in the migration * @param string - The string value currently being visited * @param path - The path to the node within the document. See {@link Path} * @param context - The {@link MigrationContext} instance */ null?: <Node extends null>(node: Node, path: Path, context: MigrationContext) => NodeMigrationReturnValue | Promise<NodeMigrationReturnValue | void> | void; /** * Helper function that will be called for each number in each document included in the migration * @param string - The string value currently being visited * @param path - The path to the node within the document. See {@link Path} * @param context - The {@link MigrationContext} instance */ number?: <Node extends number>(node: Node, path: Path, context: MigrationContext) => NodeMigrationReturnValue | Promise<NodeMigrationReturnValue | void> | void; /** * Helper function that will be called for each object in each document included in the migration * @param object - The object value currently being visited * @param path - The path to the node within the document. See {@link Path} * @param context - The {@link MigrationContext} instance */ object?: <Node extends JsonObject>(node: Node, path: Path, context: MigrationContext) => NodeMigrationReturnValue | Promise<NodeMigrationReturnValue | void> | void; /** * Helper function that will be called for each string in each document included in the migration * @param string - The string value currently being visited * @param path - The path to the node within the document. See {@link Path} * @param context - The {@link MigrationContext} instance */ string?: <Node extends string>(node: Node, path: Path, context: MigrationContext) => NodeMigrationReturnValue | Promise<NodeMigrationReturnValue | void> | void; } export { type Path } from '@sanity/types'; //# sourceMappingURL=types.d.ts.map