datocms-plugin-schema-import-export
v0.1.20
Published
Export one or multiple models/block models as JSON files for reimport into another DatoCMS project.
Keywords
Readme
DatoCMS Schema Import/Export Plugin
Powerful, safe schema migration for DatoCMS. Export models/blocks and plugins as JSON, then import them into another project with guided conflict resolution.
What it does
- Builds dependency-aware exports: collects selected models, blocks, fieldsets, fields, and any referenced plugins while trimming validators that point to out-of-scope item types.
- Keeps exports portable: rewrites field appearances to rely only on bundled or built-in editors and downloads a prettified
export.jsonwhen each task completes. - Imports additively: compares the bundle against the target project, walks you through reuse/rename/skip decisions, and creates new entities without mutating existing ones unless you opt in.
- Restores editors safely: reinstalls plugin editors/addons when present, falling back to core editors so fields always remain valid in the destination project.
- Handles long tasks gracefully: surfaces cancellable overlays with stall notices, honors rate-limit throttling, and stops at the next safe checkpoint if you cancel mid-flight.
- Loads shared recipes: accepts
recipe_urlquery parameters to pull an export from a URL so collaborators can hand off ready-to-import snapshots.
Where To Find It
- Configuration > Export: start a new export, select multiple models/blocks, or export the entire current environment.
- Configuration > Import: upload an export file (or paste a recipe URL) and import safely into the current environment.
- From a model/block: in Schema, open a model/block, click the three dots beside the model/block name, and pick “Export as JSON…”—the plugin opens the Export page preloaded with that entity so you can jump straight to the graph.
Installation
- In DatoCMS, open your project, go to Plugins, search for “Schema Import/Export”, then install. The plugin only requests
currentUserAccessToken.
Export
Start from a model/block
- Open Schema, select a model/block.
- Click the three dots beside the model/block name and choose “Export as JSON…”.
- The Export page opens with that entity locked in the selection; inspect the graph/list, run “Select all dependencies” to pull in linked models/blocks/plugins, and undo it with “Unselect dependencies” if you change your mind.
- Start the export when ready; the long-task overlay shows progress/cancel options, and the prettified
export.jsondownloads automatically once the task completes.
Start a new export (Schema > Export)
- The landing panel lets you either pick specific starting models/blocks or go straight to “Export entire schema”.
- Use the multi-select to seed the graph; the graph animates selections for small/medium schemas, while large schemas (>60 nodes) fall back to the list view with search, metrics (counts, components, cycles), and “Why included?” explanations.
- “Select all dependencies” adds related models/blocks/plugins in bulk and logs a notice showing how many were added; “Unselect dependencies” removes the auto-added ones.
- Plugin dependencies come from installed plugin lookups; if the CMA call fails you’ll see a warning so you know selections may be incomplete.
Export the entire schema (one click)
- Confirm the dialog to queue up every model, block, and plugin in the current environment.
- The overlay reports progress, handles cancellable requests, and falls back gracefully if the CMA throttles; the final file downloads as
export.json.
After export
- You get a success notice (or cancellation/error messaging) plus the downloaded file; the selection stays in place so you can tweak it and run another export without leaving the page.
Import
Start an import (Schema > Import)
- Drag and drop an exported JSON file or use the “Select a JSON export file…” button; invalid JSON triggers an alert so you can retry.
- To hydrate directly from a shared recipe, append
?recipe_url=https://…(optionalrecipe_title=…)—the plugin fetches it and switches to import mode automatically.
Resolve conflicts safely
- The plugin builds a conflict summary in the background with progress feedback; you can refresh it if the schema changes while you wait.
- For models/blocks: choose “Reuse existing” or “Rename” with inline validation for name/API key (preset suggestions are provided for fast renames).
- For plugins: choose “Reuse existing” or “Skip”.
- Use “Show only unresolved conflicts” to focus the list; entities marked “reuse” drop out of the graph/list so you stay focused on what will be created.
- The import graph mirrors the export graph for smaller selections and switches to the list view with metrics/search once the node count crosses the same 60-node threshold.
Run the import
- Imports are additive: new models/blocks/fields/fieldsets/plugins are created with fresh IDs, and existing assets are touched only when you explicitly reuse them.
- Field validators and appearances are remapped to the target project; missing plugin editors fall back to safe defaults and localized defaults expand to every locale in the target environment.
- The progress overlay includes a cancel affordance with the required warning dialog; if you cancel, the task stops at the next safe checkpoint.
After import
- Successful runs raise a notice and clear the loaded export; cancellations leave the file in place so you can try again, and failures keep the conflict form available for fixes.
Notes & Limits
- Plugin detection: editor/addon plugins used by fields are included when “Select all dependencies” is used. If the installed plugin list cannot be fetched you’ll see a one-time banner (per session) so you know detection may be incomplete.
- Graph threshold: when the graph would exceed ~60 nodes the UI switches to the large-selection layout with search, metrics (counts/components/cycles), and “Why included?” reasoning instead of rendering an unreadable canvas.
- Rate limiting & throttling: long operations show a stall notice if progress pauses, and
ProjectSchemathrottles CMA calls by default (override with something likelocalStorage.setItem('schemaThrottleMax', '8'); valid values are 1–15 for local debugging). - Appearance portability: if an editor plugin is not selected, that field falls back to a valid built‑in editor; addons are included only if selected or already installed.
- Debug logging: run
localStorage.setItem('schemaDebug', '1')in the iframe console to enable detaileddebugLogoutput.
Development Notes
- Entry points:
src/main.tsxregisters plugin pages, schema dropdown shortcuts, and preserves environment-prefixed routing when navigating between Import/Export.src/entrypoints/Configusesctx.navigateToso config links jump directly to Schema, Import, or Export without reloading the iframe.
- Shared hooks:
useProjectSchemamemoizes the CMA client, caches item types/plugins/fields, and honors theschemaThrottleMaxlocalStorage override.useLongTasktracks cancellable progress state shared by exports, imports, and conflict analysis.useExportSelectionhydrates item types once and keeps the selection stable when the import page toggles between modes.useExportGraphassembles the React Flow graph/list data and streams progress updates for the preparation overlay.useExportAllHandleranduseSchemaExportTaskwrapbuildExportDoc, download handling, progress overlays, and cancellation.useConflictsBuilderdrives conflict analysis withuseLongTask;useRecipeLoaderwatchesrecipe_urlquery params for shared exports.
- Shared UI:
TaskOverlayStack+TaskProgressOverlayrender cancellable overlays withProgressOverlaystall detection.GraphCanvasand the Schema Overview components keep the export/import visualizations consistent, with large graph warnings gating heavy renders.
- Schema utilities:
ProjectSchemaprovides cached lookups plus concurrency-limitedgetItemTypeFieldsAndFieldsetscalls.buildExportDoctrims validators/appearances so exports stay self-contained;buildImportDoc+importSchemaorchestrate plugin installs, item type creation, field migrations, and reorder passes.
- Local development:
npm run devstarts Vite,npm run buildrunstsc -bfollowed byvite build,npm run analyzebuilds with bundle analysis, andnpm run formatruns Biome in--writemode.
Export File Format
- Version 2 (current):
{ version: '2', rootItemTypeId, entities: […] }— preserves the explicit root model/block used to seed the export, to re-generate the export graph deterministically. - Version 1 (legacy):
{ version: '1', entities: […] }— still supported for import; the root is inferred from references. - Field validators referencing models outside the selection are trimmed, and appearances are rewritten to include only allowed plugin editors/addons so the export remains self-contained.
Safety
- Imports are additive and non‑destructive. The plugin never overwrites existing models/blocks or plugins. When conflicts are detected, you explicitly pick “Reuse existing” or “Rename”.
Troubleshooting
- “Why did the graph disappear?” Large selections now show a warning instead of auto-rendering; click “Render it anyway” to view the full graph.
- “Fields lost their editor?” If you don’t include a custom editor plugin in the export/import, the plugin selects a safe, built‑in editor so the field remains valid in the target project.
- “Plugin dependencies were skipped?” Check for the banner warning about incomplete plugin detection and rerun “Select all dependencies” after reopening the page once the CMA call succeeds.
- “Cancel didn’t stop immediately?” The import/export pipeline stops at the next safe checkpoint; keep the overlay open until it confirms cancellation.
