@payloadcms/codemod 4.0.0-internal.cd47d20 → 4.0.0-internal.ce66a41

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.
Files changed (58) hide show
  1. package/README.md +3 -1
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.help.d.ts +4 -0
  4. package/dist/cli.help.d.ts.map +1 -0
  5. package/dist/cli.help.js +29 -0
  6. package/dist/cli.help.js.map +1 -0
  7. package/dist/cli.js +8 -0
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cli.parseFlags.d.ts +1 -0
  10. package/dist/cli.parseFlags.d.ts.map +1 -1
  11. package/dist/cli.parseFlags.js +6 -0
  12. package/dist/cli.parseFlags.js.map +1 -1
  13. package/dist/registry.js +2 -2
  14. package/dist/registry.js.map +1 -1
  15. package/dist/runbook/v4.mdx +134 -21
  16. package/dist/transforms/migrate-field-component-types/index.d.ts.map +1 -1
  17. package/dist/transforms/migrate-field-component-types/index.js +4 -0
  18. package/dist/transforms/migrate-field-component-types/index.js.map +1 -1
  19. package/dist/transforms/migrate-sharp-to-transformer/basic.input.js +28 -0
  20. package/dist/transforms/migrate-sharp-to-transformer/basic.input.js.map +1 -0
  21. package/dist/transforms/migrate-sharp-to-transformer/basic.output.js +39 -0
  22. package/dist/transforms/migrate-sharp-to-transformer/basic.output.js.map +1 -0
  23. package/dist/transforms/migrate-sharp-to-transformer/existing-transformers.input.js +27 -0
  24. package/dist/transforms/migrate-sharp-to-transformer/existing-transformers.input.js.map +1 -0
  25. package/dist/transforms/migrate-sharp-to-transformer/existing-transformers.output.js +33 -0
  26. package/dist/transforms/migrate-sharp-to-transformer/existing-transformers.output.js.map +1 -0
  27. package/dist/transforms/migrate-sharp-to-transformer/index.d.ts +3 -0
  28. package/dist/transforms/migrate-sharp-to-transformer/index.d.ts.map +1 -0
  29. package/dist/transforms/migrate-sharp-to-transformer/index.js +430 -0
  30. package/dist/transforms/migrate-sharp-to-transformer/index.js.map +1 -0
  31. package/dist/transforms/migrate-sharp-to-transformer/no-match.input.js +11 -0
  32. package/dist/transforms/migrate-sharp-to-transformer/no-match.input.js.map +1 -0
  33. package/dist/transforms/migrate-sharp-to-transformer/no-match.output.js +11 -0
  34. package/dist/transforms/migrate-sharp-to-transformer/no-match.output.js.map +1 -0
  35. package/dist/transforms/remove-storage-always-insert-fields/index.d.ts.map +1 -1
  36. package/dist/transforms/remove-storage-always-insert-fields/index.js +4 -0
  37. package/dist/transforms/remove-storage-always-insert-fields/index.js.map +1 -1
  38. package/dist/transforms/rename-experimental-table-feature/index.d.ts.map +1 -1
  39. package/dist/transforms/rename-experimental-table-feature/index.js +7 -1
  40. package/dist/transforms/rename-experimental-table-feature/index.js.map +1 -1
  41. package/dist/upgrade/rewritePackageJson.d.ts.map +1 -1
  42. package/dist/upgrade/rewritePackageJson.js +52 -11
  43. package/dist/upgrade/rewritePackageJson.js.map +1 -1
  44. package/dist/utils/project.d.ts +7 -1
  45. package/dist/utils/project.d.ts.map +1 -1
  46. package/dist/utils/project.js +20 -7
  47. package/dist/utils/project.js.map +1 -1
  48. package/package.json +2 -2
  49. package/dist/transforms/remove-strict-draft-types/basic.input.js +0 -28
  50. package/dist/transforms/remove-strict-draft-types/basic.input.js.map +0 -1
  51. package/dist/transforms/remove-strict-draft-types/basic.output.js +0 -24
  52. package/dist/transforms/remove-strict-draft-types/basic.output.js.map +0 -1
  53. package/dist/transforms/remove-strict-draft-types/index.d.ts +0 -3
  54. package/dist/transforms/remove-strict-draft-types/index.d.ts.map +0 -1
  55. package/dist/transforms/remove-strict-draft-types/index.js +0 -44
  56. package/dist/transforms/remove-strict-draft-types/index.js.map +0 -1
  57. package/dist/transforms/remove-strict-draft-types/no-match.input.js +0 -11
  58. package/dist/transforms/remove-strict-draft-types/no-match.input.js.map +0 -1
package/README.md CHANGED
@@ -18,6 +18,7 @@ With no arguments, runs every registered transform against the current directory
18
18
  - `--list`: print registered transforms.
19
19
  - `--dry`: analyze only; write nothing.
20
20
  - `--print`: print transformed sources to stdout instead of writing.
21
+ - `-h`, `--help`: print usage for all commands and exit. Works on any command, e.g. `upgrade run --help`.
21
22
 
22
23
  ## `upgrade` command
23
24
 
@@ -81,7 +82,6 @@ The tool loads your project via [ts-morph](https://ts-morph.com/), using your `t
81
82
 
82
83
  ## Transforms
83
84
 
84
- - `remove-strict-draft-types`: removes `typescript.strictDraftTypes` from inline config objects regardless of its value. Strict draft types are always enabled in v4. Preserves other TypeScript options; indirect or spread settings must be updated manually.
85
85
  - `migrate-list-view-select-api`: Removes `admin.enableListViewSelectAPI` from Collection Configs. The List View's Select API is the default in v4.
86
86
  - `migrate-disabled-fields`: migrates `field.admin.disableListColumn`, `disableListFilter`, `disableGroupBy`, `disableBulkEdit` and their equivalents on `imageSize.admin` into the consolidated `disabled` object form.
87
87
  - `globals-components-edit`: Globals: rename `admin.components.elements` to `admin.components.edit` and hoist `Description` to top-level `admin.components.Description` to match Collection conventions.
@@ -92,6 +92,7 @@ The tool loads your project via [ts-morph](https://ts-morph.com/), using your `t
92
92
  - `migrate-aliased-exports`: rewrites imports of types and utilities that used to be re-exported from `@payloadcms/ui` and `@payloadcms/next/utilities` to their canonical sources in `payload` / `payload/shared`.
93
93
  - `migrate-payload-request-creation`: renames named request-helper and admin-context imports from `payload` and `payload/internal`. Calls migrate only with a plain identifier payload and either `{}` or an initialized local `const` options identifier whose type exposes all seven old option properties (or is `any`). The generated argument captures payload first and forwards only `context`, `depth`, `fallbackLocale`, `locale`, `req`, `urlSuffix`, and `user` through getters, preserving inherited getters, read order, and async rejection behavior. Existing `CreateLocalReqOptions` named imports from `payload` become options-only usages of `Omit<CreatePayloadRequestArgs, 'payload'>`; relative/private imports of that internal type require manual migration. Unsupported shapes, type usages, and collisions leave the affected binding unchanged with notes.
94
94
  - `migrate-document-title-context`: migrates `title` and `setDocumentTitle` destructured from `useDocumentInfo()` to `useDocumentTitle()`. They were removed from `DocumentInfoContext` in v4 and now live on `DocumentTitleContext`.
95
+ - `migrate-sharp-to-transformer`: moves a top-level `sharp` dependency and per-collection Sharp-specific `upload` options (`resizeOptions`, `imageSizes`, `formatOptions`, `trimOptions`, `constructorOptions`, `withMetadata`, `crop`, `focalPoint`) into `sharpTransformer({ collections })`, registered under `upload.transformers`. Appends to an existing `transformers` array instead of overwriting it, and no-ops if a `sharpTransformer` call is already present. **Limitations:** only inline `buildConfig({...})` object literals and inline collection/`upload` object literals are migrated; a dynamic `collections` array, an externally-defined collection, or a non-inline `upload` object are left untouched with a note for manual review. A collection's `upload` object built from a spread (e.g. `upload: { ...sharedUploadConfig }`) is noted for manual review, since Sharp-specific fields hidden inside the spread aren't visible to the transform and are left un-migrated. Surfaces a note reminding you to install `@payloadcms/transformer-sharp` (`pnpm add @payloadcms/transformer-sharp`). The transform preserves AST structure but does not re-format output. Run `prettier --write` (or your project's formatter) after applying.
95
96
  - `migrate-storage-adapters-to-config`: moves storage adapter factory calls (`s3Storage`, `gcsStorage`, `azureStorage`, `r2Storage`, `vercelBlobStorage`) from `plugins` to the new top-level `storage` array. Removes `plugins` if it becomes empty after the move. **Limitations:** aliased imports (e.g. `import { s3Storage as myS3 }`) are not detected; rename any aliases to the canonical factory name before running, or migrate those calls manually. The transform preserves AST structure but does not re-format output. Run `prettier --write` (or your project's formatter) after applying.
96
97
  - `rename-storage-adapters-to-storage`: renames the top-level `storageAdapters` config property to `storage`. Skips any object that already has a `storage` property. Run this if you previously ran `migrate-storage-adapters-to-config` and need to update the property name.
97
98
  - `migrate-azure-chunk-large-files`: removes the `chunkLargeFiles` option from `azureStorage` `clientUploads` config. Chunked client uploads are the default in v4, so the flag no longer exists; `clientUploads: { chunkLargeFiles: true }` collapses to `clientUploads: true`. Surfaces a note when `chunkLargeFiles: false` was removed, since v4 can no longer disable chunking (and its broader CORS requirements apply).
@@ -100,6 +101,7 @@ The tool loads your project via [ts-morph](https://ts-morph.com/), using your `t
100
101
  - `migrate-db-types-subpath`: rewrites imports from the removed `/types` subpath exports of `@payloadcms/drizzle`, `@payloadcms/db-postgres`, `@payloadcms/db-sqlite`, `@payloadcms/db-vercel-postgres`, and `@payloadcms/db-d1-sqlite` to their main entry points. Also handles re-export declarations and `declare module` augmentations.
101
102
  - `migrate-next-subpath-exports`: rewrites imports, re-exports, and string-literal component paths from the removed `@payloadcms/next/client`, `@payloadcms/next/rsc`, and `@payloadcms/next/templates` subpaths to their canonical `@payloadcms/ui` or `@payloadcms/ui/rsc` sources. After running, regenerate the import map with `payload generate:importmap`.
102
103
  - `migrate-next-generate-viewport-export`: adds a `generateViewport` export to app router layout files that already use Payload's shared Next.js layout, preserving Next.js viewport behavior without touching custom viewport implementations.
104
+ - `migrate-lexical-is-html-element`: rewrites imports of the removed `isHTMLElement` utility from `@payloadcms/richtext-lexical` (and `/client`) to its canonical source, `lexical`, splitting it out of mixed imports and merging into an existing `lexical` import when present. Surfaces a note reminding you that `lexical` is now a required dependency (`pnpm add lexical`).
103
105
  - `migrate-after-operation-read`: rewrites `operation === 'read'` checks inside collection `afterOperation` hooks to handle the `find` and `findByID` operations (the deprecated `'read'` value was removed). Handles `===`/`!==`/`==`/`!=` against a destructured (or aliased) or property-accessed `operation` argument. Leaves `beforeOperation` (which still uses `'read'`) untouched, and surfaces notes for non-inline hooks and `switch` statements that need manual review.
104
106
  - `migrate-versions-default`: adds `versions: false` to every `CollectionConfig` or `GlobalConfig` object that does not already have a `versions` property. Preserves the previous opt-in behaviour now that `versions` defaults to `true` for both collections and globals. Detects the three common annotation forms: `: CollectionConfig`, `satisfies GlobalConfig`, and `as CollectionConfig`.
105
107
  - `migrate-authorship-default`: adds `authorship: false` to every `CollectionConfig` or `GlobalConfig` object that does not already have an `authorship` property. Preserves the previous behaviour now that authorship tracking (`createdBy` / `updatedBy`) is enabled by default for both collections and globals. Detects the three common annotation forms: `: CollectionConfig`, `satisfies GlobalConfig`, and `as CollectionConfig`.
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAmBA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFhF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAoBA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FhF"}
@@ -0,0 +1,4 @@
1
+ export declare function renderHelp({ command }: {
2
+ command: string;
3
+ }): string;
4
+ //# sourceMappingURL=cli.help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.help.d.ts","sourceRoot":"","sources":["../src/cli.help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA0BnE"}
@@ -0,0 +1,29 @@
1
+ export function renderHelp({ command }) {
2
+ return `Usage:
3
+ ${command} [path] [options]
4
+ ${command} upgrade [run | prompt] [options]
5
+
6
+ Commands:
7
+ (none) Run transforms only against [path] (default: cwd)
8
+ upgrade Pick how to run the full v3 -> v4 upgrade
9
+ upgrade run Bump Payload deps, install, then run transforms in cwd
10
+ upgrade prompt Print the upgrade orchestration prompt
11
+
12
+ Transform options:
13
+ --transform <name> Run a single transform by name
14
+ --list Print registered transforms
15
+ --dry, --dry-run Analyze only; write nothing
16
+ --print Print transformed sources to stdout instead of writing
17
+
18
+ Upgrade options:
19
+ --agent <name> Coding agent to hand off to (claude, codex); skips the picker
20
+ --tag <dist-tag> Dist-tag to resolve Payload versions from
21
+ --dry, --dry-run Preview changes; write and install nothing
22
+ --force Skip the dirty-git-tree warning
23
+
24
+ General options:
25
+ -h, --help Show this help
26
+ `;
27
+ }
28
+
29
+ //# sourceMappingURL=cli.help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.help.ts"],"sourcesContent":["export function renderHelp({ command }: { command: string }): string {\n return `Usage:\n ${command} [path] [options]\n ${command} upgrade [run | prompt] [options]\n\nCommands:\n (none) Run transforms only against [path] (default: cwd)\n upgrade Pick how to run the full v3 -> v4 upgrade\n upgrade run Bump Payload deps, install, then run transforms in cwd\n upgrade prompt Print the upgrade orchestration prompt\n\nTransform options:\n --transform <name> Run a single transform by name\n --list Print registered transforms\n --dry, --dry-run Analyze only; write nothing\n --print Print transformed sources to stdout instead of writing\n\nUpgrade options:\n --agent <name> Coding agent to hand off to (claude, codex); skips the picker\n --tag <dist-tag> Dist-tag to resolve Payload versions from\n --dry, --dry-run Preview changes; write and install nothing\n --force Skip the dirty-git-tree warning\n\nGeneral options:\n -h, --help Show this help\n`\n}\n"],"names":["renderHelp","command"],"mappings":"AAAA,OAAO,SAASA,WAAW,EAAEC,OAAO,EAAuB;IACzD,OAAO,CAAC;EACR,EAAEA,QAAQ;EACV,EAAEA,QAAQ;;;;;;;;;;;;;;;;;;;;;;AAsBZ,CAAC;AACD"}
package/dist/cli.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable no-console */ import { writeFileSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
+ import { renderHelp } from './cli.help.js';
3
4
  import { parseFlags } from './cli.parseFlags.js';
4
5
  import { transforms as registry } from './registry.js';
5
6
  import { runTransforms } from './runner.js';
@@ -11,6 +12,13 @@ import { loadPackageJsons, serializePackageJson } from './utils/packageJson.js';
11
12
  import { loadProject } from './utils/project.js';
12
13
  export async function main(argv = process.argv.slice(2)) {
13
14
  const flags = parseFlags(argv);
15
+ // Checked first so `--help` on any command prints usage instead of running it.
16
+ if (flags.help) {
17
+ console.log(renderHelp({
18
+ command: resolveSelfCommand()
19
+ }));
20
+ return;
21
+ }
14
22
  if (flags.command === 'upgrade') {
15
23
  if (flags.upgrade === 'prompt') {
16
24
  console.log(renderUpgradePrompt({
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import type { Project } from 'ts-morph'\n\n/* eslint-disable no-console */\nimport { writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport type { TransformRunResult } from './runner.js'\nimport type { Transform } from './types.js'\n\nimport { parseFlags } from './cli.parseFlags.js'\nimport { transforms as registry } from './registry.js'\nimport { runTransforms } from './runner.js'\nimport { runDispatch } from './upgrade/dispatch.js'\nimport { runUpgrade } from './upgrade/index.js'\nimport { renderUpgradePrompt } from './upgrade/prompt.js'\nimport { resolveSelfCommand } from './upgrade/selfCommand.js'\nimport { loadPackageJsons, serializePackageJson } from './utils/packageJson.js'\nimport { loadProject } from './utils/project.js'\n\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const flags = parseFlags(argv)\n\n if (flags.command === 'upgrade') {\n if (flags.upgrade === 'prompt') {\n console.log(renderUpgradePrompt({ command: resolveSelfCommand() }))\n return\n }\n\n if (flags.upgrade === 'run') {\n const { failed } = await runUpgrade({\n flags: { dry: flags.dry, force: flags.force, tag: flags.tag },\n path: flags.path,\n })\n if (failed) {\n process.exitCode = 1\n }\n return\n }\n\n const { failed } = await runDispatch({\n agentFlag: flags.agent,\n path: flags.path,\n upgradeFlags: { dry: flags.dry, force: flags.force, tag: flags.tag },\n })\n if (failed) {\n process.exitCode = 1\n }\n return\n }\n\n if (flags.list) {\n printList()\n return\n }\n\n const selected = selectTransforms(registry, flags.transform)\n if (selected.length === 0) {\n console.error(`No transforms matched${flags.transform ? ` \"${flags.transform}\"` : ''}.`)\n process.exitCode = 1\n return\n }\n\n const project = loadProject(resolve(flags.path))\n const snapshot = snapshotProject(project)\n\n const packageJsons = loadPackageJsons(resolve(flags.path))\n\n const { failed, results } = await runTransforms({\n // Shares the same `data` reference, so transform mutations are visible\n // below for change detection (do not clone here).\n packageJsons: packageJsons.map(({ data, path }) => ({ data, path })),\n project,\n transforms: selected,\n })\n\n const changed = project\n .getSourceFiles()\n .filter((file) => snapshot.get(file.getFilePath()) !== file.getFullText())\n\n const changedPackageJsons = packageJsons.filter(\n (pkg) => serializePackageJson(pkg.data, pkg.originalText) !== pkg.originalText,\n )\n\n if (flags.print) {\n if (changed.length === 0 && changedPackageJsons.length === 0) {\n console.log('(no files changed)')\n } else {\n for (const file of changed) {\n console.log(`// ${file.getFilePath()}`)\n console.log(file.getFullText())\n }\n for (const pkg of changedPackageJsons) {\n console.log(`// ${pkg.path}`)\n console.log(serializePackageJson(pkg.data, pkg.originalText))\n }\n }\n } else if (!flags.dry) {\n await Promise.all(changed.map((file) => file.save()))\n for (const pkg of changedPackageJsons) {\n writeFileSync(pkg.path, serializePackageJson(pkg.data, pkg.originalText))\n }\n }\n\n printSummary(results)\n\n if (failed) {\n process.exitCode = 1\n }\n}\n\nfunction selectTransforms(available: Transform[], name: string | undefined): Transform[] {\n if (!name) {\n return available\n }\n return available.filter((t) => t.name === name)\n}\n\nfunction printList(): void {\n if (registry.length === 0) {\n console.log('No transforms registered.')\n return\n }\n for (const t of registry) {\n console.log(`${t.name} ${t.description}`)\n }\n}\n\nfunction snapshotProject(project: Project): Map<string, string> {\n return new Map(project.getSourceFiles().map((file) => [file.getFilePath(), file.getFullText()]))\n}\n\nfunction printSummary(results: TransformRunResult[]): void {\n console.log('')\n console.log('Codemod summary:')\n for (const r of results) {\n if (r.error) {\n console.log(` [FAIL] ${r.name} — ${r.error.message}`)\n continue\n }\n console.log(` [ok] ${r.name} — ${r.filesChanged.length} file(s) changed`)\n for (const note of r.notes ?? []) {\n console.log(` note: ${note}`)\n }\n }\n}\n"],"names":["writeFileSync","resolve","parseFlags","transforms","registry","runTransforms","runDispatch","runUpgrade","renderUpgradePrompt","resolveSelfCommand","loadPackageJsons","serializePackageJson","loadProject","main","argv","process","slice","flags","command","upgrade","console","log","failed","dry","force","tag","path","exitCode","agentFlag","agent","upgradeFlags","list","printList","selected","selectTransforms","transform","length","error","project","snapshot","snapshotProject","packageJsons","results","map","data","changed","getSourceFiles","filter","file","get","getFilePath","getFullText","changedPackageJsons","pkg","originalText","print","Promise","all","save","printSummary","available","name","t","description","Map","r","message","filesChanged","note","notes"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import type { Project } from 'ts-morph'\n\n/* eslint-disable no-console */\nimport { writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport type { TransformRunResult } from './runner.js'\nimport type { Transform } from './types.js'\n\nimport { renderHelp } from './cli.help.js'\nimport { parseFlags } from './cli.parseFlags.js'\nimport { transforms as registry } from './registry.js'\nimport { runTransforms } from './runner.js'\nimport { runDispatch } from './upgrade/dispatch.js'\nimport { runUpgrade } from './upgrade/index.js'\nimport { renderUpgradePrompt } from './upgrade/prompt.js'\nimport { resolveSelfCommand } from './upgrade/selfCommand.js'\nimport { loadPackageJsons, serializePackageJson } from './utils/packageJson.js'\nimport { loadProject } from './utils/project.js'\n\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const flags = parseFlags(argv)\n\n // Checked first so `--help` on any command prints usage instead of running it.\n if (flags.help) {\n console.log(renderHelp({ command: resolveSelfCommand() }))\n return\n }\n\n if (flags.command === 'upgrade') {\n if (flags.upgrade === 'prompt') {\n console.log(renderUpgradePrompt({ command: resolveSelfCommand() }))\n return\n }\n\n if (flags.upgrade === 'run') {\n const { failed } = await runUpgrade({\n flags: { dry: flags.dry, force: flags.force, tag: flags.tag },\n path: flags.path,\n })\n if (failed) {\n process.exitCode = 1\n }\n return\n }\n\n const { failed } = await runDispatch({\n agentFlag: flags.agent,\n path: flags.path,\n upgradeFlags: { dry: flags.dry, force: flags.force, tag: flags.tag },\n })\n if (failed) {\n process.exitCode = 1\n }\n return\n }\n\n if (flags.list) {\n printList()\n return\n }\n\n const selected = selectTransforms(registry, flags.transform)\n if (selected.length === 0) {\n console.error(`No transforms matched${flags.transform ? ` \"${flags.transform}\"` : ''}.`)\n process.exitCode = 1\n return\n }\n\n const project = loadProject(resolve(flags.path))\n const snapshot = snapshotProject(project)\n\n const packageJsons = loadPackageJsons(resolve(flags.path))\n\n const { failed, results } = await runTransforms({\n // Shares the same `data` reference, so transform mutations are visible\n // below for change detection (do not clone here).\n packageJsons: packageJsons.map(({ data, path }) => ({ data, path })),\n project,\n transforms: selected,\n })\n\n const changed = project\n .getSourceFiles()\n .filter((file) => snapshot.get(file.getFilePath()) !== file.getFullText())\n\n const changedPackageJsons = packageJsons.filter(\n (pkg) => serializePackageJson(pkg.data, pkg.originalText) !== pkg.originalText,\n )\n\n if (flags.print) {\n if (changed.length === 0 && changedPackageJsons.length === 0) {\n console.log('(no files changed)')\n } else {\n for (const file of changed) {\n console.log(`// ${file.getFilePath()}`)\n console.log(file.getFullText())\n }\n for (const pkg of changedPackageJsons) {\n console.log(`// ${pkg.path}`)\n console.log(serializePackageJson(pkg.data, pkg.originalText))\n }\n }\n } else if (!flags.dry) {\n await Promise.all(changed.map((file) => file.save()))\n for (const pkg of changedPackageJsons) {\n writeFileSync(pkg.path, serializePackageJson(pkg.data, pkg.originalText))\n }\n }\n\n printSummary(results)\n\n if (failed) {\n process.exitCode = 1\n }\n}\n\nfunction selectTransforms(available: Transform[], name: string | undefined): Transform[] {\n if (!name) {\n return available\n }\n return available.filter((t) => t.name === name)\n}\n\nfunction printList(): void {\n if (registry.length === 0) {\n console.log('No transforms registered.')\n return\n }\n for (const t of registry) {\n console.log(`${t.name} ${t.description}`)\n }\n}\n\nfunction snapshotProject(project: Project): Map<string, string> {\n return new Map(project.getSourceFiles().map((file) => [file.getFilePath(), file.getFullText()]))\n}\n\nfunction printSummary(results: TransformRunResult[]): void {\n console.log('')\n console.log('Codemod summary:')\n for (const r of results) {\n if (r.error) {\n console.log(` [FAIL] ${r.name} — ${r.error.message}`)\n continue\n }\n console.log(` [ok] ${r.name} — ${r.filesChanged.length} file(s) changed`)\n for (const note of r.notes ?? []) {\n console.log(` note: ${note}`)\n }\n }\n}\n"],"names":["writeFileSync","resolve","renderHelp","parseFlags","transforms","registry","runTransforms","runDispatch","runUpgrade","renderUpgradePrompt","resolveSelfCommand","loadPackageJsons","serializePackageJson","loadProject","main","argv","process","slice","flags","help","console","log","command","upgrade","failed","dry","force","tag","path","exitCode","agentFlag","agent","upgradeFlags","list","printList","selected","selectTransforms","transform","length","error","project","snapshot","snapshotProject","packageJsons","results","map","data","changed","getSourceFiles","filter","file","get","getFilePath","getFullText","changedPackageJsons","pkg","originalText","print","Promise","all","save","printSummary","available","name","t","description","Map","r","message","filesChanged","note","notes"],"mappings":"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"}
@@ -12,6 +12,7 @@ export type CliFlags = {
12
12
  command?: CliCommand;
13
13
  dry: boolean;
14
14
  force: boolean;
15
+ help: boolean;
15
16
  list: boolean;
16
17
  path: string;
17
18
  print: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"cli.parseFlags.d.ts","sourceRoot":"","sources":["../src/cli.parseFlags.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,SAAS,CAAA;AAElC;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAA;AAE7D,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,iBAAiB,CAAA;CAC5B,CAAA;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAmCnD"}
1
+ {"version":3,"file":"cli.parseFlags.d.ts","sourceRoot":"","sources":["../src/cli.parseFlags.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,SAAS,CAAA;AAElC;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAA;AAE7D,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,iBAAiB,CAAA;CAC5B,CAAA;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAqCnD"}
@@ -19,6 +19,11 @@ export function parseFlags(argv) {
19
19
  type: 'boolean',
20
20
  default: false
21
21
  },
22
+ help: {
23
+ type: 'boolean',
24
+ default: false,
25
+ short: 'h'
26
+ },
22
27
  list: {
23
28
  type: 'boolean',
24
29
  default: false
@@ -46,6 +51,7 @@ export function parseFlags(argv) {
46
51
  command,
47
52
  dry: Boolean(values.dry) || Boolean(values['dry-run']),
48
53
  force: Boolean(values.force),
54
+ help: Boolean(values.help),
49
55
  list: Boolean(values.list),
50
56
  path,
51
57
  print: Boolean(values.print),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.parseFlags.ts"],"sourcesContent":["import { parseArgs } from 'node:util'\n\nexport type CliCommand = 'upgrade'\n\n/**\n * The three `upgrade` verbs:\n * - `dispatch` (bare `upgrade`): interactive picker to hand the orchestration\n * prompt to a coding agent, or print it.\n * - `run` (`upgrade run`): the deterministic mechanical slice.\n * - `prompt` (`upgrade prompt`): print the orchestration prompt to stdout.\n */\nexport type UpgradeSubcommand = 'dispatch' | 'prompt' | 'run'\n\nexport type CliFlags = {\n agent?: string\n command?: CliCommand\n dry: boolean\n force: boolean\n list: boolean\n path: string\n print: boolean\n tag?: string\n transform?: string\n upgrade?: UpgradeSubcommand\n}\n\nexport function parseFlags(argv: string[]): CliFlags {\n const { positionals, values } = parseArgs({\n allowPositionals: true,\n args: argv,\n options: {\n agent: { type: 'string' },\n dry: { type: 'boolean', default: false },\n 'dry-run': { type: 'boolean', default: false },\n force: { type: 'boolean', default: false },\n list: { type: 'boolean', default: false },\n print: { type: 'boolean', default: false },\n tag: { type: 'string' },\n transform: { type: 'string' },\n },\n })\n\n const isUpgrade = positionals[0] === 'upgrade'\n const command = isUpgrade ? 'upgrade' : undefined\n const upgrade = isUpgrade ? resolveUpgradeVerb(positionals[1]) : undefined\n // The upgrade command always operates on the current directory; only the bare\n // transform command takes a positional path.\n const path = isUpgrade ? process.cwd() : (positionals[0] ?? process.cwd())\n\n return {\n agent: values.agent,\n command,\n dry: Boolean(values.dry) || Boolean(values['dry-run']),\n force: Boolean(values.force),\n list: Boolean(values.list),\n path,\n print: Boolean(values.print),\n tag: values.tag,\n transform: values.transform,\n upgrade,\n }\n}\n\nfunction resolveUpgradeVerb(verb: string | undefined): UpgradeSubcommand {\n if (verb === 'prompt' || verb === 'run') {\n return verb\n }\n return 'dispatch'\n}\n"],"names":["parseArgs","parseFlags","argv","positionals","values","allowPositionals","args","options","agent","type","dry","default","force","list","print","tag","transform","isUpgrade","command","undefined","upgrade","resolveUpgradeVerb","path","process","cwd","Boolean","verb"],"mappings":"AAAA,SAASA,SAAS,QAAQ,YAAW;AA0BrC,OAAO,SAASC,WAAWC,IAAc;IACvC,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAE,GAAGJ,UAAU;QACxCK,kBAAkB;QAClBC,MAAMJ;QACNK,SAAS;YACPC,OAAO;gBAAEC,MAAM;YAAS;YACxBC,KAAK;gBAAED,MAAM;gBAAWE,SAAS;YAAM;YACvC,WAAW;gBAAEF,MAAM;gBAAWE,SAAS;YAAM;YAC7CC,OAAO;gBAAEH,MAAM;gBAAWE,SAAS;YAAM;YACzCE,MAAM;gBAAEJ,MAAM;gBAAWE,SAAS;YAAM;YACxCG,OAAO;gBAAEL,MAAM;gBAAWE,SAAS;YAAM;YACzCI,KAAK;gBAAEN,MAAM;YAAS;YACtBO,WAAW;gBAAEP,MAAM;YAAS;QAC9B;IACF;IAEA,MAAMQ,YAAYd,WAAW,CAAC,EAAE,KAAK;IACrC,MAAMe,UAAUD,YAAY,YAAYE;IACxC,MAAMC,UAAUH,YAAYI,mBAAmBlB,WAAW,CAAC,EAAE,IAAIgB;IACjE,8EAA8E;IAC9E,6CAA6C;IAC7C,MAAMG,OAAOL,YAAYM,QAAQC,GAAG,KAAMrB,WAAW,CAAC,EAAE,IAAIoB,QAAQC,GAAG;IAEvE,OAAO;QACLhB,OAAOJ,OAAOI,KAAK;QACnBU;QACAR,KAAKe,QAAQrB,OAAOM,GAAG,KAAKe,QAAQrB,MAAM,CAAC,UAAU;QACrDQ,OAAOa,QAAQrB,OAAOQ,KAAK;QAC3BC,MAAMY,QAAQrB,OAAOS,IAAI;QACzBS;QACAR,OAAOW,QAAQrB,OAAOU,KAAK;QAC3BC,KAAKX,OAAOW,GAAG;QACfC,WAAWZ,OAAOY,SAAS;QAC3BI;IACF;AACF;AAEA,SAASC,mBAAmBK,IAAwB;IAClD,IAAIA,SAAS,YAAYA,SAAS,OAAO;QACvC,OAAOA;IACT;IACA,OAAO;AACT"}
1
+ {"version":3,"sources":["../src/cli.parseFlags.ts"],"sourcesContent":["import { parseArgs } from 'node:util'\n\nexport type CliCommand = 'upgrade'\n\n/**\n * The three `upgrade` verbs:\n * - `dispatch` (bare `upgrade`): interactive picker to hand the orchestration\n * prompt to a coding agent, or print it.\n * - `run` (`upgrade run`): the deterministic mechanical slice.\n * - `prompt` (`upgrade prompt`): print the orchestration prompt to stdout.\n */\nexport type UpgradeSubcommand = 'dispatch' | 'prompt' | 'run'\n\nexport type CliFlags = {\n agent?: string\n command?: CliCommand\n dry: boolean\n force: boolean\n help: boolean\n list: boolean\n path: string\n print: boolean\n tag?: string\n transform?: string\n upgrade?: UpgradeSubcommand\n}\n\nexport function parseFlags(argv: string[]): CliFlags {\n const { positionals, values } = parseArgs({\n allowPositionals: true,\n args: argv,\n options: {\n agent: { type: 'string' },\n dry: { type: 'boolean', default: false },\n 'dry-run': { type: 'boolean', default: false },\n force: { type: 'boolean', default: false },\n help: { type: 'boolean', default: false, short: 'h' },\n list: { type: 'boolean', default: false },\n print: { type: 'boolean', default: false },\n tag: { type: 'string' },\n transform: { type: 'string' },\n },\n })\n\n const isUpgrade = positionals[0] === 'upgrade'\n const command = isUpgrade ? 'upgrade' : undefined\n const upgrade = isUpgrade ? resolveUpgradeVerb(positionals[1]) : undefined\n // The upgrade command always operates on the current directory; only the bare\n // transform command takes a positional path.\n const path = isUpgrade ? process.cwd() : (positionals[0] ?? process.cwd())\n\n return {\n agent: values.agent,\n command,\n dry: Boolean(values.dry) || Boolean(values['dry-run']),\n force: Boolean(values.force),\n help: Boolean(values.help),\n list: Boolean(values.list),\n path,\n print: Boolean(values.print),\n tag: values.tag,\n transform: values.transform,\n upgrade,\n }\n}\n\nfunction resolveUpgradeVerb(verb: string | undefined): UpgradeSubcommand {\n if (verb === 'prompt' || verb === 'run') {\n return verb\n }\n return 'dispatch'\n}\n"],"names":["parseArgs","parseFlags","argv","positionals","values","allowPositionals","args","options","agent","type","dry","default","force","help","short","list","print","tag","transform","isUpgrade","command","undefined","upgrade","resolveUpgradeVerb","path","process","cwd","Boolean","verb"],"mappings":"AAAA,SAASA,SAAS,QAAQ,YAAW;AA2BrC,OAAO,SAASC,WAAWC,IAAc;IACvC,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAE,GAAGJ,UAAU;QACxCK,kBAAkB;QAClBC,MAAMJ;QACNK,SAAS;YACPC,OAAO;gBAAEC,MAAM;YAAS;YACxBC,KAAK;gBAAED,MAAM;gBAAWE,SAAS;YAAM;YACvC,WAAW;gBAAEF,MAAM;gBAAWE,SAAS;YAAM;YAC7CC,OAAO;gBAAEH,MAAM;gBAAWE,SAAS;YAAM;YACzCE,MAAM;gBAAEJ,MAAM;gBAAWE,SAAS;gBAAOG,OAAO;YAAI;YACpDC,MAAM;gBAAEN,MAAM;gBAAWE,SAAS;YAAM;YACxCK,OAAO;gBAAEP,MAAM;gBAAWE,SAAS;YAAM;YACzCM,KAAK;gBAAER,MAAM;YAAS;YACtBS,WAAW;gBAAET,MAAM;YAAS;QAC9B;IACF;IAEA,MAAMU,YAAYhB,WAAW,CAAC,EAAE,KAAK;IACrC,MAAMiB,UAAUD,YAAY,YAAYE;IACxC,MAAMC,UAAUH,YAAYI,mBAAmBpB,WAAW,CAAC,EAAE,IAAIkB;IACjE,8EAA8E;IAC9E,6CAA6C;IAC7C,MAAMG,OAAOL,YAAYM,QAAQC,GAAG,KAAMvB,WAAW,CAAC,EAAE,IAAIsB,QAAQC,GAAG;IAEvE,OAAO;QACLlB,OAAOJ,OAAOI,KAAK;QACnBY;QACAV,KAAKiB,QAAQvB,OAAOM,GAAG,KAAKiB,QAAQvB,MAAM,CAAC,UAAU;QACrDQ,OAAOe,QAAQvB,OAAOQ,KAAK;QAC3BC,MAAMc,QAAQvB,OAAOS,IAAI;QACzBE,MAAMY,QAAQvB,OAAOW,IAAI;QACzBS;QACAR,OAAOW,QAAQvB,OAAOY,KAAK;QAC3BC,KAAKb,OAAOa,GAAG;QACfC,WAAWd,OAAOc,SAAS;QAC3BI;IACF;AACF;AAEA,SAASC,mBAAmBK,IAAwB;IAClD,IAAIA,SAAS,YAAYA,SAAS,OAAO;QACvC,OAAOA;IACT;IACA,OAAO;AACT"}
package/dist/registry.js CHANGED
@@ -18,6 +18,7 @@ import { migrateListViewSelectAPI } from './transforms/migrate-list-view-select-
18
18
  import { migrateNextGenerateViewportExport } from './transforms/migrate-next-generate-viewport-export/index.js';
19
19
  import { migrateNextSubpathExports } from './transforms/migrate-next-subpath-exports/index.js';
20
20
  import { migratePayloadRequestCreation } from './transforms/migrate-payload-request-creation/index.js';
21
+ import { migrateSharpToTransformer } from './transforms/migrate-sharp-to-transformer/index.js';
21
22
  import { migrateSlugField } from './transforms/migrate-slug-field/index.js';
22
23
  import { migrateStorageAdaptersToConfig } from './transforms/migrate-storage-adapters-to-config/index.js';
23
24
  import { migrateVersionsDefault } from './transforms/migrate-versions-default/index.js';
@@ -26,7 +27,6 @@ import { removeGroupByTrue } from './transforms/remove-group-by-true/index.js';
26
27
  import { removeLocalizeStatusConfig } from './transforms/remove-localize-status-config/index.js';
27
28
  import { removePublishSpecificLocale } from './transforms/remove-publish-specific-locale/index.js';
28
29
  import { removeStorageAlwaysInsertFields } from './transforms/remove-storage-always-insert-fields/index.js';
29
- import { removeStrictDraftTypes } from './transforms/remove-strict-draft-types/index.js';
30
30
  import { removeVersionsTrue } from './transforms/remove-versions-true/index.js';
31
31
  import { renameExperimentalTableFeature } from './transforms/rename-experimental-table-feature/index.js';
32
32
  import { renameStorageAdaptersToStorage } from './transforms/rename-storage-adapters-to-storage/index.js';
@@ -46,6 +46,7 @@ export const transforms = [
46
46
  migrateBlockReferencesToBlocks,
47
47
  migrateBuildScript,
48
48
  migrateDocumentTitleContext,
49
+ migrateSharpToTransformer,
49
50
  migrateStorageAdaptersToConfig,
50
51
  migrateAzureChunkLargeFiles,
51
52
  renameStorageAdaptersToStorage,
@@ -62,7 +63,6 @@ export const transforms = [
62
63
  removeVersionsTrue,
63
64
  removePublishSpecificLocale,
64
65
  removeStorageAlwaysInsertFields,
65
- removeStrictDraftTypes,
66
66
  renameTypescriptSchemaToJsonSchema,
67
67
  renameExperimentalTableFeature
68
68
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry.ts"],"sourcesContent":["import type { Transform } from './types.js'\n\nimport { addOverrideAccessTrue } from './transforms/add-override-access-true/index.js'\nimport { exampleNoop } from './transforms/example-noop/index.js'\nimport { globalsComponentsEdit } from './transforms/globals-components-edit/index.js'\nimport { migrateAfterOperationRead } from './transforms/migrate-after-operation-read/index.js'\nimport { migrateAliasedExports } from './transforms/migrate-aliased-exports/index.js'\nimport { migrateAuthorshipDefault } from './transforms/migrate-authorship-default/index.js'\nimport { migrateAzureChunkLargeFiles } from './transforms/migrate-azure-chunk-large-files/index.js'\nimport { migrateBlockReferencesToBlocks } from './transforms/migrate-block-references-to-blocks/index.js'\nimport { migrateBuildScript } from './transforms/migrate-build-script/index.js'\nimport { migrateDbTypesSubpath } from './transforms/migrate-db-types-subpath/index.js'\nimport { migrateDisabledFields } from './transforms/migrate-disabled-fields/index.js'\nimport { migrateDocumentTitleContext } from './transforms/migrate-document-title-context/index.js'\nimport { migrateFieldComponentTypes } from './transforms/migrate-field-component-types/index.js'\nimport { migrateForceSelect } from './transforms/migrate-force-select/index.js'\nimport { migrateHideAPIURL } from './transforms/migrate-hide-api-url/index.js'\nimport { migrateImportExportHooks } from './transforms/migrate-import-export-hooks/index.js'\nimport { migrateListViewSelectAPI } from './transforms/migrate-list-view-select-api/index.js'\nimport { migrateNextGenerateViewportExport } from './transforms/migrate-next-generate-viewport-export/index.js'\nimport { migrateNextSubpathExports } from './transforms/migrate-next-subpath-exports/index.js'\nimport { migratePayloadRequestCreation } from './transforms/migrate-payload-request-creation/index.js'\nimport { migrateSlugField } from './transforms/migrate-slug-field/index.js'\nimport { migrateStorageAdaptersToConfig } from './transforms/migrate-storage-adapters-to-config/index.js'\nimport { migrateVersionsDefault } from './transforms/migrate-versions-default/index.js'\nimport { removeDefaultLocalePublishOption } from './transforms/remove-default-locale-publish-option/index.js'\nimport { removeGroupByTrue } from './transforms/remove-group-by-true/index.js'\nimport { removeLocalizeStatusConfig } from './transforms/remove-localize-status-config/index.js'\nimport { removePublishSpecificLocale } from './transforms/remove-publish-specific-locale/index.js'\nimport { removeStorageAlwaysInsertFields } from './transforms/remove-storage-always-insert-fields/index.js'\nimport { removeStrictDraftTypes } from './transforms/remove-strict-draft-types/index.js'\nimport { removeVersionsTrue } from './transforms/remove-versions-true/index.js'\nimport { renameExperimentalTableFeature } from './transforms/rename-experimental-table-feature/index.js'\nimport { renameStorageAdaptersToStorage } from './transforms/rename-storage-adapters-to-storage/index.js'\nimport { renameTypescriptSchemaToJsonSchema } from './transforms/rename-typescript-schema-to-json-schema/index.js'\n\nexport const transforms: Transform[] = [\n exampleNoop,\n addOverrideAccessTrue,\n migrateAfterOperationRead,\n migrateHideAPIURL,\n globalsComponentsEdit,\n migrateListViewSelectAPI,\n migrateDisabledFields,\n migrateForceSelect,\n migrateFieldComponentTypes,\n migrateAliasedExports,\n migratePayloadRequestCreation,\n migrateBlockReferencesToBlocks,\n migrateBuildScript,\n migrateDocumentTitleContext,\n migrateStorageAdaptersToConfig,\n migrateAzureChunkLargeFiles,\n renameStorageAdaptersToStorage,\n migrateImportExportHooks,\n migrateDbTypesSubpath,\n migrateNextGenerateViewportExport,\n migrateNextSubpathExports,\n migrateSlugField,\n migrateVersionsDefault,\n migrateAuthorshipDefault,\n removeDefaultLocalePublishOption,\n removeGroupByTrue,\n removeLocalizeStatusConfig,\n removeVersionsTrue,\n removePublishSpecificLocale,\n removeStorageAlwaysInsertFields,\n removeStrictDraftTypes,\n renameTypescriptSchemaToJsonSchema,\n renameExperimentalTableFeature,\n]\n"],"names":["addOverrideAccessTrue","exampleNoop","globalsComponentsEdit","migrateAfterOperationRead","migrateAliasedExports","migrateAuthorshipDefault","migrateAzureChunkLargeFiles","migrateBlockReferencesToBlocks","migrateBuildScript","migrateDbTypesSubpath","migrateDisabledFields","migrateDocumentTitleContext","migrateFieldComponentTypes","migrateForceSelect","migrateHideAPIURL","migrateImportExportHooks","migrateListViewSelectAPI","migrateNextGenerateViewportExport","migrateNextSubpathExports","migratePayloadRequestCreation","migrateSlugField","migrateStorageAdaptersToConfig","migrateVersionsDefault","removeDefaultLocalePublishOption","removeGroupByTrue","removeLocalizeStatusConfig","removePublishSpecificLocale","removeStorageAlwaysInsertFields","removeStrictDraftTypes","removeVersionsTrue","renameExperimentalTableFeature","renameStorageAdaptersToStorage","renameTypescriptSchemaToJsonSchema","transforms"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,iDAAgD;AACtF,SAASC,WAAW,QAAQ,qCAAoC;AAChE,SAASC,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,yBAAyB,QAAQ,qDAAoD;AAC9F,SAASC,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,wBAAwB,QAAQ,mDAAkD;AAC3F,SAASC,2BAA2B,QAAQ,wDAAuD;AACnG,SAASC,8BAA8B,QAAQ,2DAA0D;AACzG,SAASC,kBAAkB,QAAQ,6CAA4C;AAC/E,SAASC,qBAAqB,QAAQ,iDAAgD;AACtF,SAASC,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,2BAA2B,QAAQ,uDAAsD;AAClG,SAASC,0BAA0B,QAAQ,sDAAqD;AAChG,SAASC,kBAAkB,QAAQ,6CAA4C;AAC/E,SAASC,iBAAiB,QAAQ,6CAA4C;AAC9E,SAASC,wBAAwB,QAAQ,oDAAmD;AAC5F,SAASC,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,iCAAiC,QAAQ,8DAA6D;AAC/G,SAASC,yBAAyB,QAAQ,qDAAoD;AAC9F,SAASC,6BAA6B,QAAQ,yDAAwD;AACtG,SAASC,gBAAgB,QAAQ,2CAA0C;AAC3E,SAASC,8BAA8B,QAAQ,2DAA0D;AACzG,SAASC,sBAAsB,QAAQ,iDAAgD;AACvF,SAASC,gCAAgC,QAAQ,6DAA4D;AAC7G,SAASC,iBAAiB,QAAQ,6CAA4C;AAC9E,SAASC,0BAA0B,QAAQ,sDAAqD;AAChG,SAASC,2BAA2B,QAAQ,uDAAsD;AAClG,SAASC,+BAA+B,QAAQ,4DAA2D;AAC3G,SAASC,sBAAsB,QAAQ,kDAAiD;AACxF,SAASC,kBAAkB,QAAQ,6CAA4C;AAC/E,SAASC,8BAA8B,QAAQ,0DAAyD;AACxG,SAASC,8BAA8B,QAAQ,2DAA0D;AACzG,SAASC,kCAAkC,QAAQ,gEAA+D;AAElH,OAAO,MAAMC,aAA0B;IACrChC;IACAD;IACAG;IACAW;IACAZ;IACAc;IACAN;IACAG;IACAD;IACAR;IACAe;IACAZ;IACAC;IACAG;IACAU;IACAf;IACAyB;IACAhB;IACAN;IACAQ;IACAC;IACAE;IACAE;IACAjB;IACAkB;IACAC;IACAC;IACAI;IACAH;IACAC;IACAC;IACAI;IACAF;CACD,CAAA"}
1
+ {"version":3,"sources":["../src/registry.ts"],"sourcesContent":["import type { Transform } from './types.js'\n\nimport { addOverrideAccessTrue } from './transforms/add-override-access-true/index.js'\nimport { exampleNoop } from './transforms/example-noop/index.js'\nimport { globalsComponentsEdit } from './transforms/globals-components-edit/index.js'\nimport { migrateAfterOperationRead } from './transforms/migrate-after-operation-read/index.js'\nimport { migrateAliasedExports } from './transforms/migrate-aliased-exports/index.js'\nimport { migrateAuthorshipDefault } from './transforms/migrate-authorship-default/index.js'\nimport { migrateAzureChunkLargeFiles } from './transforms/migrate-azure-chunk-large-files/index.js'\nimport { migrateBlockReferencesToBlocks } from './transforms/migrate-block-references-to-blocks/index.js'\nimport { migrateBuildScript } from './transforms/migrate-build-script/index.js'\nimport { migrateDbTypesSubpath } from './transforms/migrate-db-types-subpath/index.js'\nimport { migrateDisabledFields } from './transforms/migrate-disabled-fields/index.js'\nimport { migrateDocumentTitleContext } from './transforms/migrate-document-title-context/index.js'\nimport { migrateFieldComponentTypes } from './transforms/migrate-field-component-types/index.js'\nimport { migrateForceSelect } from './transforms/migrate-force-select/index.js'\nimport { migrateHideAPIURL } from './transforms/migrate-hide-api-url/index.js'\nimport { migrateImportExportHooks } from './transforms/migrate-import-export-hooks/index.js'\nimport { migrateListViewSelectAPI } from './transforms/migrate-list-view-select-api/index.js'\nimport { migrateNextGenerateViewportExport } from './transforms/migrate-next-generate-viewport-export/index.js'\nimport { migrateNextSubpathExports } from './transforms/migrate-next-subpath-exports/index.js'\nimport { migratePayloadRequestCreation } from './transforms/migrate-payload-request-creation/index.js'\nimport { migrateSharpToTransformer } from './transforms/migrate-sharp-to-transformer/index.js'\nimport { migrateSlugField } from './transforms/migrate-slug-field/index.js'\nimport { migrateStorageAdaptersToConfig } from './transforms/migrate-storage-adapters-to-config/index.js'\nimport { migrateVersionsDefault } from './transforms/migrate-versions-default/index.js'\nimport { removeDefaultLocalePublishOption } from './transforms/remove-default-locale-publish-option/index.js'\nimport { removeGroupByTrue } from './transforms/remove-group-by-true/index.js'\nimport { removeLocalizeStatusConfig } from './transforms/remove-localize-status-config/index.js'\nimport { removePublishSpecificLocale } from './transforms/remove-publish-specific-locale/index.js'\nimport { removeStorageAlwaysInsertFields } from './transforms/remove-storage-always-insert-fields/index.js'\nimport { removeVersionsTrue } from './transforms/remove-versions-true/index.js'\nimport { renameExperimentalTableFeature } from './transforms/rename-experimental-table-feature/index.js'\nimport { renameStorageAdaptersToStorage } from './transforms/rename-storage-adapters-to-storage/index.js'\nimport { renameTypescriptSchemaToJsonSchema } from './transforms/rename-typescript-schema-to-json-schema/index.js'\n\nexport const transforms: Transform[] = [\n exampleNoop,\n addOverrideAccessTrue,\n migrateAfterOperationRead,\n migrateHideAPIURL,\n globalsComponentsEdit,\n migrateListViewSelectAPI,\n migrateDisabledFields,\n migrateForceSelect,\n migrateFieldComponentTypes,\n migrateAliasedExports,\n migratePayloadRequestCreation,\n migrateBlockReferencesToBlocks,\n migrateBuildScript,\n migrateDocumentTitleContext,\n migrateSharpToTransformer,\n migrateStorageAdaptersToConfig,\n migrateAzureChunkLargeFiles,\n renameStorageAdaptersToStorage,\n migrateImportExportHooks,\n migrateDbTypesSubpath,\n migrateNextGenerateViewportExport,\n migrateNextSubpathExports,\n migrateSlugField,\n migrateVersionsDefault,\n migrateAuthorshipDefault,\n removeDefaultLocalePublishOption,\n removeGroupByTrue,\n removeLocalizeStatusConfig,\n removeVersionsTrue,\n removePublishSpecificLocale,\n removeStorageAlwaysInsertFields,\n renameTypescriptSchemaToJsonSchema,\n renameExperimentalTableFeature,\n]\n"],"names":["addOverrideAccessTrue","exampleNoop","globalsComponentsEdit","migrateAfterOperationRead","migrateAliasedExports","migrateAuthorshipDefault","migrateAzureChunkLargeFiles","migrateBlockReferencesToBlocks","migrateBuildScript","migrateDbTypesSubpath","migrateDisabledFields","migrateDocumentTitleContext","migrateFieldComponentTypes","migrateForceSelect","migrateHideAPIURL","migrateImportExportHooks","migrateListViewSelectAPI","migrateNextGenerateViewportExport","migrateNextSubpathExports","migratePayloadRequestCreation","migrateSharpToTransformer","migrateSlugField","migrateStorageAdaptersToConfig","migrateVersionsDefault","removeDefaultLocalePublishOption","removeGroupByTrue","removeLocalizeStatusConfig","removePublishSpecificLocale","removeStorageAlwaysInsertFields","removeVersionsTrue","renameExperimentalTableFeature","renameStorageAdaptersToStorage","renameTypescriptSchemaToJsonSchema","transforms"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,iDAAgD;AACtF,SAASC,WAAW,QAAQ,qCAAoC;AAChE,SAASC,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,yBAAyB,QAAQ,qDAAoD;AAC9F,SAASC,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,wBAAwB,QAAQ,mDAAkD;AAC3F,SAASC,2BAA2B,QAAQ,wDAAuD;AACnG,SAASC,8BAA8B,QAAQ,2DAA0D;AACzG,SAASC,kBAAkB,QAAQ,6CAA4C;AAC/E,SAASC,qBAAqB,QAAQ,iDAAgD;AACtF,SAASC,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,2BAA2B,QAAQ,uDAAsD;AAClG,SAASC,0BAA0B,QAAQ,sDAAqD;AAChG,SAASC,kBAAkB,QAAQ,6CAA4C;AAC/E,SAASC,iBAAiB,QAAQ,6CAA4C;AAC9E,SAASC,wBAAwB,QAAQ,oDAAmD;AAC5F,SAASC,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,iCAAiC,QAAQ,8DAA6D;AAC/G,SAASC,yBAAyB,QAAQ,qDAAoD;AAC9F,SAASC,6BAA6B,QAAQ,yDAAwD;AACtG,SAASC,yBAAyB,QAAQ,qDAAoD;AAC9F,SAASC,gBAAgB,QAAQ,2CAA0C;AAC3E,SAASC,8BAA8B,QAAQ,2DAA0D;AACzG,SAASC,sBAAsB,QAAQ,iDAAgD;AACvF,SAASC,gCAAgC,QAAQ,6DAA4D;AAC7G,SAASC,iBAAiB,QAAQ,6CAA4C;AAC9E,SAASC,0BAA0B,QAAQ,sDAAqD;AAChG,SAASC,2BAA2B,QAAQ,uDAAsD;AAClG,SAASC,+BAA+B,QAAQ,4DAA2D;AAC3G,SAASC,kBAAkB,QAAQ,6CAA4C;AAC/E,SAASC,8BAA8B,QAAQ,0DAAyD;AACxG,SAASC,8BAA8B,QAAQ,2DAA0D;AACzG,SAASC,kCAAkC,QAAQ,gEAA+D;AAElH,OAAO,MAAMC,aAA0B;IACrChC;IACAD;IACAG;IACAW;IACAZ;IACAc;IACAN;IACAG;IACAD;IACAR;IACAe;IACAZ;IACAC;IACAG;IACAS;IACAE;IACAhB;IACAyB;IACAhB;IACAN;IACAQ;IACAC;IACAG;IACAE;IACAlB;IACAmB;IACAC;IACAC;IACAG;IACAF;IACAC;IACAI;IACAF;CACD,CAAA"}
@@ -22,24 +22,6 @@ The codemod is idempotent and safe to run on a partially-migrated project.
22
22
 
23
23
  ## Breaking Changes
24
24
 
25
- ### Strict draft types are always enabled
26
-
27
- The `typescript.strictDraftTypes` option has been removed. Remove it from your config and regenerate your types with `payload generate:types`. The `remove-strict-draft-types` transform in `@payloadcms/codemod` removes the option from inline config objects automatically.
28
-
29
- Local API draft reads (`find`, `findByID`, and `findGlobal` with `draft: true`) now type required fields as optional because drafts can skip validation. Check that a field is present before using it:
30
-
31
- ```ts
32
- const post = await payload.findByID({ collection: 'posts', id, draft: true })
33
-
34
- if (post.title !== undefined) {
35
- post.title.toUpperCase()
36
- }
37
- ```
38
-
39
- With generated types, the `draft` option is rejected on collections and globals without drafts enabled, including `draft: false`. Remove the option from those calls. Creating a draft still allows incomplete data; creating a published document (with `draft: false` or without the option) requires all required fields.
40
-
41
- These changes affect TypeScript types only. Runtime behavior is unchanged.
42
-
43
25
  ### Payload request creation is consolidated
44
26
 
45
27
  Payload request creation now uses `createPayloadRequest` for local contexts and `createPayloadRequestFromWebRequest` to convert a Web `Request`. Admin context setup is exposed as `initAdminContext`.
@@ -1105,9 +1087,9 @@ The deprecated `isHTMLElement` utility has been removed from `@payloadcms/richte
1105
1087
 
1106
1088
  `lexical`'s built-in `isHTMLElement` is the canonical implementation and narrows against the node's owning-document `HTMLElement`, so it is also safe across iframes and other realms.
1107
1089
 
1108
- ### Lexical: vendored `@lexical/markdown` fork removed and lexical upgraded to `0.50.0`
1090
+ ### Lexical: vendored `@lexical/markdown` fork removed and lexical upgraded to `0.52.0`
1109
1091
 
1110
- `@payloadcms/richtext-lexical` no longer ships a vendored copy of `@lexical/markdown`. The package is now a direct dependency, every `@lexical/*` package was upgraded from `0.41.0` to `0.50.0`, and `@payloadcms/richtext-lexical/lexical/markdown` is a pure passthrough of `@lexical/markdown`.
1092
+ `@payloadcms/richtext-lexical` no longer ships a vendored copy of `@lexical/markdown`. The package is now a direct dependency, every `@lexical/*` package was upgraded from `0.41.0` to `0.52.0`, and `@payloadcms/richtext-lexical/lexical/markdown` is a pure passthrough of `@lexical/markdown`.
1111
1093
 
1112
1094
  Most projects use markdown through the editor or through `convertMarkdownToLexical` / `convertLexicalToMarkdown` and need no changes. You are only affected if you import from `@payloadcms/richtext-lexical/lexical/markdown` directly.
1113
1095
 
@@ -1131,7 +1113,16 @@ If you keep calling `$convertFromMarkdownString` directly, pass `editorConfig.fe
1131
1113
 
1132
1114
  **Whitespace-only markdown table cells now import as an empty paragraph** instead of a text node of padding spaces. This comes from the lexical upgrade, not Payload's own code. No action is required unless you assert on those padding spaces in stored content.
1133
1115
 
1134
- If you import lexical APIs directly through `@payloadcms/richtext-lexical/lexical/*`, also review the [lexical breaking changes](https://github.com/facebook/lexical/releases) between `0.41.0` and `0.50.0`. None of them require action for typical Payload usage.
1116
+ If you import lexical APIs directly through `@payloadcms/richtext-lexical/lexical/*`, also review the [lexical breaking changes](https://github.com/facebook/lexical/releases) between `0.41.0` and `0.52.0`. None of them require action for typical Payload usage.
1117
+
1118
+ If your app imports Lexical types or adds custom features, check these changes from `0.50.0`. They also apply to imports through `@payloadcms/richtext-lexical/lexical` and its subpaths:
1119
+
1120
+ - Lexical packages are ESM only. Use ESM imports; CommonJS `require()` needs Node.js 20.19 or later.
1121
+ - `SELECTION_CHANGE_COMMAND` now runs before DOM reconciliation. Defer DOM lookups and floating UI positioning with `$onUpdate(() => editor.read('latest', callback))`, or use an update listener for work that should run after every commit.
1122
+ - Call `node.getLatest().exportJSON()` when serializing a node reference retained across an update. Payload continues to write the full JSON format; compact export is not enabled.
1123
+ - `SerializedEditorState<T>`, `SerializedElementNode<T>`, and `SerializedRootNode<T>` no longer accept a type argument. Remove `<T>` if you only need the base node type. For a document with your own node types, use Payload's `TypedEditorState<T>` instead. Without a type argument, Lexical's `children` are still typed as `SerializedLexicalNode[]`.
1124
+ - `ReturnType<Node['exportJSON']>` can now infer partial JSON, making fields such as `version` and `url` optional. If your code expects the full format, use the node's explicit serialized type, such as `SerializedLinkNode`. A normal `node.exportJSON()` call still returns the full format.
1125
+ - `LexicalNode.getCommonAncestor` was removed. Use `$getCommonAncestor(a, b)?.commonAncestor ?? null`; pass the parents of non-element nodes if you need the old method's behavior.
1135
1126
 
1136
1127
  ### Lexical: `EXPERIMENTAL_TableFeature` renamed to `TableFeature`
1137
1128
 
@@ -1823,6 +1814,126 @@ azureStorage({
1823
1814
 
1824
1815
  Run `npx @payloadcms/codemod --transform migrate-azure-chunk-large-files` to remove the flag automatically (it collapses `clientUploads: { chunkLargeFiles: true }` to `clientUploads: true` and keeps any other `clientUploads` options).
1825
1816
 
1817
+ ### Sharp moved out of core into `@payloadcms/transformer-sharp`
1818
+
1819
+ Image resizing is no longer built into `payload` itself. It now ships as an official [file transformer](../upload/transformers), `@payloadcms/transformer-sharp`, that you register under `upload.transformers`.
1820
+
1821
+ This affects four things:
1822
+
1823
+ 1. The top-level `sharp` config property has been removed. Passing a Sharp instance now happens through `sharpTransformer({ sharp })` instead.
1824
+ 2. Per-collection Sharp options — `constructorOptions`, `formatOptions`, `resizeOptions`, `trimOptions`, and `withMetadata` — have been removed from `CollectionConfig['upload']`. They're now authored through `sharpTransformer({ collections })`.
1825
+ - `imageSizes` has also been removed from `CollectionConfig['upload']`. Image sizes are now declared as `variants` on `sharpTransformer({ collections: { <slug>: { variants } } })`. The entries themselves (`name`, `width`, `height`, `generateImageName`, and so on) are unchanged. A collection that still sets `upload.imageSizes` fails the build.
1826
+ 3. `sharp` is no longer a dependency of `payload` at all (previously a `devDependency`, not a runtime `dependency`). Install `@payloadcms/transformer-sharp` explicitly.
1827
+ 4. The Sharp-specific types `SharpDependency`, `ImageUploadFormatOptions`, `ImageUploadTrimOptions`, and `SharpImageSizeOptions` are no longer exported from `payload`. Import `SharpDependency` from `@payloadcms/transformer-sharp`. For the option types, use `SharpCollectionConfig['formatOptions']`, `SharpCollectionConfig['trimOptions']`, and `NonNullable<SharpCollectionConfig['variants']>[number]` from the same package.
1828
+
1829
+ ```sh
1830
+ pnpm add @payloadcms/transformer-sharp
1831
+ ```
1832
+
1833
+ ```diff
1834
+ + import { sharpTransformer } from '@payloadcms/transformer-sharp'
1835
+ import { buildConfig } from 'payload'
1836
+
1837
+ export default buildConfig({
1838
+ collections: [
1839
+ {
1840
+ slug: 'media',
1841
+ upload: {
1842
+ - resizeOptions: { width: 2048, height: 2048 },
1843
+ - imageSizes: [{ name: 'thumbnail', width: 400, height: 300 }],
1844
+ },
1845
+ },
1846
+ ],
1847
+ - sharp,
1848
+ upload: {
1849
+ + transformers: [
1850
+ + sharpTransformer({
1851
+ + sharp,
1852
+ + collections: {
1853
+ + media: {
1854
+ + resizeOptions: { width: 2048, height: 2048 },
1855
+ + variants: [{ name: 'thumbnail', width: 400, height: 300 }],
1856
+ + },
1857
+ + },
1858
+ + }),
1859
+ + ],
1860
+ },
1861
+ })
1862
+ ```
1863
+
1864
+ Run `npx @payloadcms/codemod --transform migrate-sharp-to-transformer` to migrate automatically. The codemod moves a top-level `sharp` dependency and inline collection Sharp options — including `crop` and `focalPoint` — into `sharpTransformer({ collections })` (writing `imageSizes` as `variants`), appends to an existing `upload.transformers` array if you already have one, and leaves anything it can't safely rewrite in place with a note — for example, a `collections` array built by a function call, or a collection defined outside the `buildConfig` call. Review those manually. For a config that already registers `sharpTransformer`, it only renames `imageSizes` to `variants` inside the existing `sharpTransformer` call and flags a leftover top-level `sharp` property; it doesn't move any remaining collection options.
1865
+
1866
+ Your `variants`, `crop`, and `focalPoint` are readable at `collection.upload.variants`/`.crop`/`.focalPoint` on the **sanitized** config (for example `req.payload.collections.media.config.upload.variants`). Code that read the sanitized `upload.imageSizes` in 3.x must read `upload.variants` instead. `sharpTransformer` writes a projection of what you configure back onto the sanitized collection at startup, so the Admin Panel and the rest of core see the same configuration. For a collection configured on `sharpTransformer`, a `crop` or `focalPoint` set on the transformer replaces the collection's own value; one left unset there keeps the collection's. Neither `imageSizes` nor `variants` can be set on the collection at all.
1867
+
1868
+ If you inject a custom Sharp build or version, pass it the same way:
1869
+
1870
+ ```diff
1871
+ - buildConfig({ sharp: myCustomSharp })
1872
+ + sharpTransformer({ sharp: myCustomSharp })
1873
+ ```
1874
+
1875
+ `sharpTransformer` can also resize images at request time (`/api/media/file/photo.png?width=400`). This is new in Payload 4 and **disabled by default**, so a migrated config keeps serving only the original file and your pre-generated `variants`. The codemod doesn't enable it. To opt in, pass `dynamic: true` or `dynamic: { collections: ['media'] }` — see [Dynamic (request-time) resizing](../upload/transformers#dynamic-request-time-resizing), and [Securing dynamic resizing](../upload/transformers#securing-dynamic-resizing) before enabling it on a publicly readable collection.
1876
+
1877
+ #### The stored `sizes` field on upload documents is renamed to `variants`
1878
+
1879
+ The group field that holds each generated image size on an upload document is now `variants` instead of `sizes`. Every place that reads or queries it changes:
1880
+
1881
+ ```diff
1882
+ - doc.sizes?.thumbnail?.url
1883
+ + doc.variants?.thumbnail?.url
1884
+
1885
+ - where: { 'sizes.thumbnail.filename': { equals: 'photo-400x300.png' } }
1886
+ + where: { 'variants.thumbnail.filename': { equals: 'photo-400x300.png' } }
1887
+
1888
+ - select: { sizes: { thumbnail: true } }
1889
+ + select: { variants: { thumbnail: true } }
1890
+ ```
1891
+
1892
+ GraphQL queries select `variants { thumbnail { url } }` instead of `sizes { thumbnail { url } }`, and regenerated types expose `variants?: { ... }` (and `variants?: T | { ... }` on the `*Select` types) in place of `sizes`. Update any frontend code that reads `media.sizes`, including values you pass to helpers such as `getBestFitFromSizes({ sizes: doc.variants })`.
1893
+
1894
+ Existing documents must be migrated. Create the predefined migration for your database adapter and run it:
1895
+
1896
+ <Banner type="warning">
1897
+ Payload 4 uses `variants` as the top-level field for generated upload
1898
+ variants. If an upload collection already defines a custom field named
1899
+ `variants`, rename that field before you run the predefined migration. Choose
1900
+ a new name, update your config, and write a custom migration that moves the
1901
+ existing custom data from `variants` to the new field. Then run the predefined
1902
+ `sizes-to-variants` migration. If legacy `sizes` data or columns and custom
1903
+ `variants` data or columns are both present, the predefined migration stops
1904
+ before it changes data or indexes. It cannot choose a new name or merge this
1905
+ custom data for you.
1906
+ </Banner>
1907
+
1908
+ ```sh
1909
+ # MongoDB
1910
+ payload migrate:create --file @payloadcms/db-mongodb/sizes-to-variants
1911
+ # Postgres
1912
+ payload migrate:create --file @payloadcms/db-postgres/sizes-to-variants
1913
+ # Vercel Postgres
1914
+ payload migrate:create --file @payloadcms/db-vercel-postgres/sizes-to-variants
1915
+ # SQLite
1916
+ payload migrate:create --file @payloadcms/db-sqlite/sizes-to-variants
1917
+ # Cloudflare D1
1918
+ payload migrate:create --file @payloadcms/db-d1-sqlite/sizes-to-variants
1919
+
1920
+ payload migrate
1921
+ ```
1922
+
1923
+ **Postgres and SQLite (including Vercel Postgres and D1):** the columns are renamed in place from `sizes_<name>_<property>` to `variants_<name>_<property>`, on each upload collection's table and its versions table, along with their indexes. Use the predefined migration above **instead of** a plain `payload migrate:create` for this change. A generated migration would drop the `sizes_*` columns and add new `variants_*` columns, losing the stored image size data. The predefined migration also writes the schema snapshot, so the next generated migration starts from the renamed columns.
1924
+
1925
+ On MongoDB the migration renames `sizes` (and `version.sizes` on versions) with `$rename` and re-creates the indexes on those fields under the new path. Run the migration before the upgraded app writes to upload documents.
1926
+
1927
+ #### The file endpoint changes once any transformer is registered
1928
+
1929
+ Registering any transformer under `upload.transformers` — including `sharpTransformer()` with dynamic resizing off — routes every file request through the transformer-aware handler:
1930
+
1931
+ - A file must belong to an upload document to be served. A file that exists in storage without a matching document now returns `404`.
1932
+ - For files whose MIME type a transformer declares (every image, with `sharpTransformer()`), `access.read` can run twice per request: once with `req.fileTransform` set to `true` to decide a possible transform, and once without it for an ordinary read. Keep `access.read` cheap, and use `req.fileTransform` to restrict transformed reads — see [Access control](../upload/transformers#access-control).
1933
+ - Responses produced by a transformer always carry Payload's CORS headers, which `modifyResponseHeaders` can't override.
1934
+
1935
+ To link to a file from your own code, including with transformer query parameters, use the new `generatePayloadFileURL` helper (exported from `payload` and `payload/shared`). It always builds the access-controlled Payload file endpoint, so links never bypass `access.read` by pointing straight at storage.
1936
+
1826
1937
  ### Storage adapters always insert the `prefix` field now — `alwaysInsertFields` removed
1827
1938
 
1828
1939
  The `alwaysInsertFields` option (on `cloudStoragePlugin` and every `storage-*` adapter: `-s3`, `-azure`, `-gcs`, `-r2`, `-vercel-blob`) has been removed. The behavior it used to opt into — always inserting the hidden `prefix` field into the collection schema — is now unconditional, so the schema stays consistent whether or not a collection configures a `prefix` and whether or not the plugin is `enabled`.
@@ -2092,6 +2203,8 @@ By default, MCP items require an authenticated user. Built-in collection and glo
2092
2203
 
2093
2204
  **Dependencies.** The plugin now builds on `@modelcontextprotocol/server` instead of `@modelcontextprotocol/sdk` + `mcp-handler`. It no longer depends on Zod directly; its built-in tools use the Zod Mini export from `payload`. If your custom tools use regular Zod, install Zod v4 in your project and import it directly.
2094
2205
 
2206
+ **HTTP requests have a size limit.** `POST /api/mcp` now answers request bodies over 4 MiB with `413`. Base64 file uploads count toward this limit. Raise it with `mcp.maxRequestBodySize`.
2207
+
2095
2208
  ### `@payloadcms/ui/scss` export removed and legacy `--theme-*` tokens retired
2096
2209
 
2097
2210
  The Admin UI styles were migrated from SCSS to plain CSS. The `@payloadcms/ui/scss` package export and its SCSS source files have been removed, and the legacy `--theme-*` CSS variables were retired in favor of semantic `--color-*` tokens and the raw `--ramp-*` color palette.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transforms/migrate-field-component-types/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAiG/C,eAAO,MAAM,0BAA0B,EAAE,SAkKxC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transforms/migrate-field-component-types/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAiG/C,eAAO,MAAM,0BAA0B,EAAE,SAwKxC,CAAA"}
@@ -197,6 +197,10 @@ export const migrateFieldComponentTypes = {
197
197
  continue;
198
198
  }
199
199
  const binding = specifier.getAliasNode() ?? specifier.getNameNode();
200
+ // Always an Identifier in valid code: a string-literal import name requires an alias.
201
+ if (!Node.isIdentifier(binding)) {
202
+ continue;
203
+ }
200
204
  const references = binding.findReferencesAsNodes().filter((node)=>node !== binding && node.getSourceFile() === file);
201
205
  const unsupportedReference = references.find((reference)=>{
202
206
  const parent = reference.getParent();