@payloadcms/codemod 4.0.0-internal.44ac9c8 → 4.0.0-internal.4c2ee12
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.
- package/README.md +3 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.help.d.ts +4 -0
- package/dist/cli.help.d.ts.map +1 -0
- package/dist/cli.help.js +29 -0
- package/dist/cli.help.js.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/cli.parseFlags.d.ts +1 -0
- package/dist/cli.parseFlags.d.ts.map +1 -1
- package/dist/cli.parseFlags.js +6 -0
- package/dist/cli.parseFlags.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -0
- package/dist/registry.js.map +1 -1
- package/dist/runbook/payload-v4-upgrade.md +2 -2
- package/dist/runbook/v4.mdx +284 -10
- package/dist/transforms/migrate-admin-context-properties/basic.input.js +32 -0
- package/dist/transforms/migrate-admin-context-properties/basic.input.js.map +1 -0
- package/dist/transforms/migrate-admin-context-properties/basic.output.js +30 -0
- package/dist/transforms/migrate-admin-context-properties/basic.output.js.map +1 -0
- package/dist/transforms/migrate-admin-context-properties/index.d.ts +3 -0
- package/dist/transforms/migrate-admin-context-properties/index.d.ts.map +1 -0
- package/dist/transforms/migrate-admin-context-properties/index.js +302 -0
- package/dist/transforms/migrate-admin-context-properties/index.js.map +1 -0
- package/dist/transforms/migrate-admin-context-properties/no-match.input.js +30 -0
- package/dist/transforms/migrate-admin-context-properties/no-match.input.js.map +1 -0
- package/dist/transforms/migrate-admin-context-properties/no-match.output.js +30 -0
- package/dist/transforms/migrate-admin-context-properties/no-match.output.js.map +1 -0
- package/dist/transforms/migrate-field-component-types/index.d.ts.map +1 -1
- package/dist/transforms/migrate-field-component-types/index.js +4 -0
- package/dist/transforms/migrate-field-component-types/index.js.map +1 -1
- package/dist/transforms/migrate-sharp-to-transformer/basic.output.js +1 -1
- package/dist/transforms/migrate-sharp-to-transformer/basic.output.js.map +1 -1
- package/dist/transforms/migrate-sharp-to-transformer/existing-transformers.output.js +1 -1
- package/dist/transforms/migrate-sharp-to-transformer/existing-transformers.output.js.map +1 -1
- package/dist/transforms/migrate-sharp-to-transformer/index.d.ts.map +1 -1
- package/dist/transforms/migrate-sharp-to-transformer/index.js +232 -82
- package/dist/transforms/migrate-sharp-to-transformer/index.js.map +1 -1
- package/dist/transforms/remove-storage-always-insert-fields/index.d.ts.map +1 -1
- package/dist/transforms/remove-storage-always-insert-fields/index.js +4 -0
- package/dist/transforms/remove-storage-always-insert-fields/index.js.map +1 -1
- package/dist/transforms/rename-diff-value-props/basic.input.js +38 -0
- package/dist/transforms/rename-diff-value-props/basic.input.js.map +1 -0
- package/dist/transforms/rename-diff-value-props/basic.output.js +38 -0
- package/dist/transforms/rename-diff-value-props/basic.output.js.map +1 -0
- package/dist/transforms/rename-diff-value-props/index.d.ts +3 -0
- package/dist/transforms/rename-diff-value-props/index.d.ts.map +1 -0
- package/dist/transforms/rename-diff-value-props/index.js +328 -0
- package/dist/transforms/rename-diff-value-props/index.js.map +1 -0
- package/dist/transforms/rename-diff-value-props/no-match.input.js +8 -0
- package/dist/transforms/rename-diff-value-props/no-match.input.js.map +1 -0
- package/dist/transforms/rename-experimental-table-feature/index.d.ts.map +1 -1
- package/dist/transforms/rename-experimental-table-feature/index.js +7 -1
- package/dist/transforms/rename-experimental-table-feature/index.js.map +1 -1
- package/dist/upgrade/rewritePackageJson.d.ts.map +1 -1
- package/dist/upgrade/rewritePackageJson.js +52 -11
- package/dist/upgrade/rewritePackageJson.js.map +1 -1
- package/dist/utils/project.d.ts +7 -1
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +20 -7
- package/dist/utils/project.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { Node, SyntaxKind } from 'ts-morph';
|
|
2
|
+
/** Removed `AdminContext` properties mapped to where each value lives now. */ const ADMIN_CONTEXT_PATHS = new Map([
|
|
3
|
+
[
|
|
4
|
+
'headers',
|
|
5
|
+
[
|
|
6
|
+
'req',
|
|
7
|
+
'headers'
|
|
8
|
+
]
|
|
9
|
+
],
|
|
10
|
+
[
|
|
11
|
+
'languageCode',
|
|
12
|
+
[
|
|
13
|
+
'req',
|
|
14
|
+
'i18n',
|
|
15
|
+
'language'
|
|
16
|
+
]
|
|
17
|
+
]
|
|
18
|
+
]);
|
|
19
|
+
const PARTIAL_ADMIN_CONTEXT_PATHS = new Map([
|
|
20
|
+
[
|
|
21
|
+
'languageCode',
|
|
22
|
+
[
|
|
23
|
+
'i18n',
|
|
24
|
+
'language'
|
|
25
|
+
]
|
|
26
|
+
]
|
|
27
|
+
]);
|
|
28
|
+
// Pre-rename names are accepted so this transform also works without `migrate-payload-request-creation`.
|
|
29
|
+
const IMPORTS = {
|
|
30
|
+
'@payloadcms/ui/layouts/Root/getRootLayoutData': {
|
|
31
|
+
getRootLayoutData: {
|
|
32
|
+
kind: 'getRootLayoutData',
|
|
33
|
+
paths: ADMIN_CONTEXT_PATHS
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
payload: {
|
|
37
|
+
AdminContext: {
|
|
38
|
+
kind: 'context',
|
|
39
|
+
paths: ADMIN_CONTEXT_PATHS
|
|
40
|
+
},
|
|
41
|
+
InitReqResult: {
|
|
42
|
+
kind: 'context',
|
|
43
|
+
paths: ADMIN_CONTEXT_PATHS
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
'payload/internal': {
|
|
47
|
+
initAdminContext: {
|
|
48
|
+
kind: 'initAdminContext',
|
|
49
|
+
paths: ADMIN_CONTEXT_PATHS
|
|
50
|
+
},
|
|
51
|
+
initReq: {
|
|
52
|
+
kind: 'initAdminContext',
|
|
53
|
+
paths: ADMIN_CONTEXT_PATHS
|
|
54
|
+
},
|
|
55
|
+
InitReqPartialResult: {
|
|
56
|
+
kind: 'context',
|
|
57
|
+
paths: PARTIAL_ADMIN_CONTEXT_PATHS
|
|
58
|
+
},
|
|
59
|
+
PartialAdminContext: {
|
|
60
|
+
kind: 'context',
|
|
61
|
+
paths: PARTIAL_ADMIN_CONTEXT_PATHS
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
export const migrateAdminContextProperties = {
|
|
66
|
+
name: 'migrate-admin-context-properties',
|
|
67
|
+
apply: ({ project })=>{
|
|
68
|
+
const filesChanged = [];
|
|
69
|
+
const notes = [];
|
|
70
|
+
for (const file of project.getSourceFiles()){
|
|
71
|
+
const imports = file.getImportDeclarations().flatMap((declaration)=>{
|
|
72
|
+
const source = declaration.getModuleSpecifierValue();
|
|
73
|
+
if (!Object.hasOwn(IMPORTS, source)) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
return declaration.getNamedImports().flatMap((spec)=>{
|
|
77
|
+
const name = spec.getAliasNode() ?? spec.getNameNode();
|
|
78
|
+
return Object.hasOwn(IMPORTS[source], spec.getName()) && Node.isIdentifier(name) ? [
|
|
79
|
+
{
|
|
80
|
+
...IMPORTS[source][spec.getName()],
|
|
81
|
+
name
|
|
82
|
+
}
|
|
83
|
+
] : [];
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
if (imports.length === 0) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const original = file.getFullText();
|
|
90
|
+
// `getRootLayoutData` reads both values from `req` now. Removing these arguments first lets
|
|
91
|
+
// the destructures below drop bindings that only fed this call.
|
|
92
|
+
for (const { name, kind } of imports){
|
|
93
|
+
if (kind !== 'getRootLayoutData') {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
for (const reference of getReferences({
|
|
97
|
+
name,
|
|
98
|
+
file
|
|
99
|
+
})){
|
|
100
|
+
const call = reference.getParent();
|
|
101
|
+
const [argument] = Node.isCallExpression(call) && call.getExpression() === reference ? call.getArguments() : [];
|
|
102
|
+
if (!Node.isObjectLiteralExpression(argument)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
for (const property of argument.getProperties()){
|
|
106
|
+
if ((Node.isPropertyAssignment(property) || Node.isShorthandPropertyAssignment(property)) && ADMIN_CONTEXT_PATHS.has(property.getName())) {
|
|
107
|
+
property.remove();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const state = {
|
|
113
|
+
edits: new Map(),
|
|
114
|
+
file,
|
|
115
|
+
notes,
|
|
116
|
+
rewritten: new Set()
|
|
117
|
+
};
|
|
118
|
+
for (const { name, kind, paths } of imports){
|
|
119
|
+
for (const reference of kind === 'getRootLayoutData' ? [] : getReferences({
|
|
120
|
+
name,
|
|
121
|
+
file
|
|
122
|
+
})){
|
|
123
|
+
const parent = reference.getParent();
|
|
124
|
+
if (kind === 'initAdminContext') {
|
|
125
|
+
if (!Node.isCallExpression(parent) || parent.getExpression() !== reference) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
let expression = parent;
|
|
129
|
+
while(Node.isAwaitExpression(expression.getParent()) || Node.isParenthesizedExpression(expression.getParent())){
|
|
130
|
+
expression = expression.getParentOrThrow();
|
|
131
|
+
}
|
|
132
|
+
collectExpression({
|
|
133
|
+
allowAlias: true,
|
|
134
|
+
expression,
|
|
135
|
+
paths,
|
|
136
|
+
state
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!Node.isTypeReference(parent) || parent.getTypeName() !== reference) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const owner = parent.getParent();
|
|
144
|
+
if ((Node.isParameterDeclaration(owner) || Node.isVariableDeclaration(owner)) && owner.getTypeNode() === parent) {
|
|
145
|
+
collectBinding({
|
|
146
|
+
binding: owner.getNameNode(),
|
|
147
|
+
paths,
|
|
148
|
+
state
|
|
149
|
+
});
|
|
150
|
+
} else if (Node.isIndexedAccessTypeNode(owner) && owner.getObjectTypeNode() === parent) {
|
|
151
|
+
const index = owner.getIndexTypeNode();
|
|
152
|
+
const literal = Node.isLiteralTypeNode(index) ? index.getLiteral() : undefined;
|
|
153
|
+
const property = Node.isStringLiteral(literal) ? literal.getLiteralValue() : undefined;
|
|
154
|
+
const path = property === undefined ? undefined : paths.get(property);
|
|
155
|
+
if (path) {
|
|
156
|
+
state.edits.set(owner, `${parent.getText()}${path.map((key)=>`['${key}']`).join('')}`);
|
|
157
|
+
state.rewritten.add(property);
|
|
158
|
+
}
|
|
159
|
+
} else if (Node.isTypeReference(owner) && owner.getTypeName().getText() === 'Pick' && owner.getTypeArguments()[0] === parent) {
|
|
160
|
+
const keys = owner.getTypeArguments()[1];
|
|
161
|
+
const members = Node.isUnionTypeNode(keys) ? keys.getTypeNodes() : keys ? [
|
|
162
|
+
keys
|
|
163
|
+
] : [];
|
|
164
|
+
const remaining = members.filter((member)=>{
|
|
165
|
+
const literal = Node.isLiteralTypeNode(member) ? member.getLiteral() : undefined;
|
|
166
|
+
return !(Node.isStringLiteral(literal) && paths.has(literal.getLiteralValue()));
|
|
167
|
+
});
|
|
168
|
+
if (remaining.length === members.length) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (remaining.length === 0) {
|
|
172
|
+
notes.push(`${file.getFilePath()}:${owner.getStartLineNumber()}: \`${owner.getText()}\` only picks properties removed in v4; migrate manually.`);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
state.edits.set(keys, remaining.map((member)=>member.getText()).join(' | '));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Apply from the end of the file so earlier edits don't shift later nodes.
|
|
180
|
+
for (const [node, text] of [
|
|
181
|
+
...state.edits
|
|
182
|
+
].sort(([a], [b])=>b.getStart() - a.getStart())){
|
|
183
|
+
node.replaceWithText(text);
|
|
184
|
+
}
|
|
185
|
+
if (state.rewritten.has('languageCode')) {
|
|
186
|
+
notes.push(`${file.getFilePath()}: \`languageCode\` reads now use \`i18n.language\`, which is typed as \`string\` instead of \`AcceptedLanguages\`. Cast where the narrower type is required.`);
|
|
187
|
+
}
|
|
188
|
+
if (file.getFullText() !== original) {
|
|
189
|
+
filesChanged.push(file.getFilePath());
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
filesChanged,
|
|
194
|
+
...notes.length > 0 ? {
|
|
195
|
+
notes
|
|
196
|
+
} : {}
|
|
197
|
+
};
|
|
198
|
+
},
|
|
199
|
+
description: 'Rewrites reads of `headers` and `languageCode`, removed from `AdminContext` in v4, to `req.headers` and `req.i18n.language`. Covers `initAdminContext()` results, bindings typed as `AdminContext` or `PartialAdminContext`, and `Pick`/indexed access types, and drops both arguments from `getRootLayoutData()` calls.'
|
|
200
|
+
};
|
|
201
|
+
/** Same-file identifiers bound to the same symbol as `name`. */ function getReferences({ name, file }) {
|
|
202
|
+
const symbol = name.getSymbol()?.compilerSymbol;
|
|
203
|
+
if (!symbol) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
return file.getDescendantsOfKind(SyntaxKind.Identifier).filter((identifier)=>identifier !== name && identifier.getText() === name.getText() && identifier.getSymbol()?.compilerSymbol === symbol);
|
|
207
|
+
}
|
|
208
|
+
/** Handles a variable or parameter name that holds an admin context. */ function collectBinding({ binding, paths, state }) {
|
|
209
|
+
if (Node.isObjectBindingPattern(binding)) {
|
|
210
|
+
collectPattern({
|
|
211
|
+
paths,
|
|
212
|
+
pattern: binding,
|
|
213
|
+
state
|
|
214
|
+
});
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (!Node.isIdentifier(binding)) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
for (const reference of binding.findReferencesAsNodes()){
|
|
221
|
+
if (reference !== binding && reference.getSourceFile() === state.file) {
|
|
222
|
+
collectExpression({
|
|
223
|
+
allowAlias: false,
|
|
224
|
+
expression: reference,
|
|
225
|
+
paths,
|
|
226
|
+
state
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/** Handles an expression that evaluates to an admin context. */ function collectExpression({ allowAlias, expression, paths, state }) {
|
|
232
|
+
const parent = expression.getParent();
|
|
233
|
+
if (Node.isPropertyAccessExpression(parent) && parent.getExpression() === expression) {
|
|
234
|
+
const path = paths.get(parent.getName());
|
|
235
|
+
if (path) {
|
|
236
|
+
state.edits.set(parent, `${expression.getText()}${parent.hasQuestionDotToken() ? '?.' : '.'}${path.join('.')}`);
|
|
237
|
+
state.rewritten.add(parent.getName());
|
|
238
|
+
}
|
|
239
|
+
} else if (Node.isElementAccessExpression(parent) && parent.getExpression() === expression) {
|
|
240
|
+
const argument = parent.getArgumentExpression();
|
|
241
|
+
const path = Node.isStringLiteral(argument) ? paths.get(argument.getLiteralValue()) : undefined;
|
|
242
|
+
if (path) {
|
|
243
|
+
state.notes.push(`${state.file.getFilePath()}:${parent.getStartLineNumber()}: \`${parent.getText()}\` reads a property removed in v4; migrate manually to \`${expression.getText()}.${path.join('.')}\`.`);
|
|
244
|
+
}
|
|
245
|
+
} else if (Node.isVariableDeclaration(parent) && parent.getInitializer() === expression) {
|
|
246
|
+
const name = parent.getNameNode();
|
|
247
|
+
if (Node.isObjectBindingPattern(name) || allowAlias) {
|
|
248
|
+
collectBinding({
|
|
249
|
+
binding: name,
|
|
250
|
+
paths,
|
|
251
|
+
state
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Moves removed properties out of a destructure into nested patterns, e.g.
|
|
258
|
+
* `{ headers, user }` becomes `{ req: { headers }, user }`. Bindings that are never read are dropped.
|
|
259
|
+
*/ function collectPattern({ paths, pattern, state }) {
|
|
260
|
+
const kept = [];
|
|
261
|
+
const moved = new Map();
|
|
262
|
+
let insertIndex = -1;
|
|
263
|
+
for (const element of pattern.getElements()){
|
|
264
|
+
const propertyNameNode = element.getPropertyNameNode();
|
|
265
|
+
const nameNode = element.getNameNode();
|
|
266
|
+
const property = !propertyNameNode ? nameNode.getText() : Node.isIdentifier(propertyNameNode) ? propertyNameNode.getText() : Node.isStringLiteral(propertyNameNode) ? propertyNameNode.getLiteralValue() : undefined;
|
|
267
|
+
const path = element.getDotDotDotToken() || property === undefined ? undefined : paths.get(property);
|
|
268
|
+
if (!path) {
|
|
269
|
+
kept.push(element.getText());
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (insertIndex === -1) {
|
|
273
|
+
insertIndex = kept.length;
|
|
274
|
+
}
|
|
275
|
+
if (Node.isIdentifier(nameNode) && nameNode.findReferencesAsNodes().every((reference)=>reference === nameNode)) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
let level = moved;
|
|
279
|
+
for (const key of path.slice(0, -1)){
|
|
280
|
+
const next = level.get(key);
|
|
281
|
+
const child = next instanceof Map ? next : new Map();
|
|
282
|
+
level.set(key, child);
|
|
283
|
+
level = child;
|
|
284
|
+
}
|
|
285
|
+
const leaf = path.at(-1);
|
|
286
|
+
const initializer = element.getInitializer();
|
|
287
|
+
level.set(leaf, `${leaf === nameNode.getText() ? leaf : `${leaf}: ${nameNode.getText()}`}${initializer ? ` = ${initializer.getText()}` : ''}`);
|
|
288
|
+
state.rewritten.add(property);
|
|
289
|
+
}
|
|
290
|
+
if (insertIndex === -1) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
kept.splice(insertIndex, 0, ...renderTree(moved));
|
|
294
|
+
state.edits.set(pattern, `{ ${kept.join(', ')} }`);
|
|
295
|
+
}
|
|
296
|
+
function renderTree(tree) {
|
|
297
|
+
return [
|
|
298
|
+
...tree
|
|
299
|
+
].map(([key, value])=>typeof value === 'string' ? value : `${key}: { ${renderTree(value).join(', ')} }`);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/transforms/migrate-admin-context-properties/index.ts"],"sourcesContent":["import type { Identifier, ObjectBindingPattern, SourceFile } from 'ts-morph'\n\nimport { Node, SyntaxKind } from 'ts-morph'\n\nimport type { Transform } from '../../types.js'\n\ntype Paths = Map<string, readonly string[]>\n\n/** Removed `AdminContext` properties mapped to where each value lives now. */\nconst ADMIN_CONTEXT_PATHS: Paths = new Map([\n ['headers', ['req', 'headers']],\n ['languageCode', ['req', 'i18n', 'language']],\n])\n\nconst PARTIAL_ADMIN_CONTEXT_PATHS: Paths = new Map([['languageCode', ['i18n', 'language']]])\n\ntype ImportKind = 'context' | 'getRootLayoutData' | 'initAdminContext'\n\n// Pre-rename names are accepted so this transform also works without `migrate-payload-request-creation`.\nconst IMPORTS: Record<string, Record<string, { kind: ImportKind; paths: Paths }>> = {\n '@payloadcms/ui/layouts/Root/getRootLayoutData': {\n getRootLayoutData: { kind: 'getRootLayoutData', paths: ADMIN_CONTEXT_PATHS },\n },\n payload: {\n AdminContext: { kind: 'context', paths: ADMIN_CONTEXT_PATHS },\n InitReqResult: { kind: 'context', paths: ADMIN_CONTEXT_PATHS },\n },\n 'payload/internal': {\n initAdminContext: { kind: 'initAdminContext', paths: ADMIN_CONTEXT_PATHS },\n initReq: { kind: 'initAdminContext', paths: ADMIN_CONTEXT_PATHS },\n InitReqPartialResult: { kind: 'context', paths: PARTIAL_ADMIN_CONTEXT_PATHS },\n PartialAdminContext: { kind: 'context', paths: PARTIAL_ADMIN_CONTEXT_PATHS },\n },\n}\n\ntype State = {\n /** Replacement text keyed by node, so a node reached twice is only rewritten once. */\n edits: Map<Node, string>\n file: SourceFile\n notes: string[]\n /** Removed properties whose reads were rewritten. */\n rewritten: Set<string>\n}\n\nexport const migrateAdminContextProperties: Transform = {\n name: 'migrate-admin-context-properties',\n apply: ({ project }) => {\n const filesChanged: string[] = []\n const notes: string[] = []\n\n for (const file of project.getSourceFiles()) {\n const imports = file.getImportDeclarations().flatMap((declaration) => {\n const source = declaration.getModuleSpecifierValue()\n\n if (!Object.hasOwn(IMPORTS, source)) {\n return []\n }\n\n return declaration.getNamedImports().flatMap((spec) => {\n const name = spec.getAliasNode() ?? spec.getNameNode()\n\n return Object.hasOwn(IMPORTS[source]!, spec.getName()) && Node.isIdentifier(name)\n ? [{ ...IMPORTS[source]![spec.getName()]!, name }]\n : []\n })\n })\n\n if (imports.length === 0) {\n continue\n }\n\n const original = file.getFullText()\n\n // `getRootLayoutData` reads both values from `req` now. Removing these arguments first lets\n // the destructures below drop bindings that only fed this call.\n for (const { name, kind } of imports) {\n if (kind !== 'getRootLayoutData') {\n continue\n }\n\n for (const reference of getReferences({ name, file })) {\n const call = reference.getParent()\n const [argument] =\n Node.isCallExpression(call) && call.getExpression() === reference\n ? call.getArguments()\n : []\n\n if (!Node.isObjectLiteralExpression(argument)) {\n continue\n }\n\n for (const property of argument.getProperties()) {\n if (\n (Node.isPropertyAssignment(property) ||\n Node.isShorthandPropertyAssignment(property)) &&\n ADMIN_CONTEXT_PATHS.has(property.getName())\n ) {\n property.remove()\n }\n }\n }\n }\n\n const state: State = { edits: new Map(), file, notes, rewritten: new Set() }\n\n for (const { name, kind, paths } of imports) {\n for (const reference of kind === 'getRootLayoutData' ? [] : getReferences({ name, file })) {\n const parent = reference.getParent()\n\n if (kind === 'initAdminContext') {\n if (!Node.isCallExpression(parent) || parent.getExpression() !== reference) {\n continue\n }\n\n let expression: Node = parent\n\n while (\n Node.isAwaitExpression(expression.getParent()) ||\n Node.isParenthesizedExpression(expression.getParent())\n ) {\n expression = expression.getParentOrThrow()\n }\n\n collectExpression({ allowAlias: true, expression, paths, state })\n continue\n }\n\n if (!Node.isTypeReference(parent) || parent.getTypeName() !== reference) {\n continue\n }\n\n const owner = parent.getParent()\n\n if (\n (Node.isParameterDeclaration(owner) || Node.isVariableDeclaration(owner)) &&\n owner.getTypeNode() === parent\n ) {\n collectBinding({ binding: owner.getNameNode(), paths, state })\n } else if (Node.isIndexedAccessTypeNode(owner) && owner.getObjectTypeNode() === parent) {\n const index = owner.getIndexTypeNode()\n const literal = Node.isLiteralTypeNode(index) ? index.getLiteral() : undefined\n const property = Node.isStringLiteral(literal) ? literal.getLiteralValue() : undefined\n const path = property === undefined ? undefined : paths.get(property)\n\n if (path) {\n state.edits.set(\n owner,\n `${parent.getText()}${path.map((key) => `['${key}']`).join('')}`,\n )\n state.rewritten.add(property!)\n }\n } else if (\n Node.isTypeReference(owner) &&\n owner.getTypeName().getText() === 'Pick' &&\n owner.getTypeArguments()[0] === parent\n ) {\n const keys = owner.getTypeArguments()[1]\n const members = Node.isUnionTypeNode(keys) ? keys.getTypeNodes() : keys ? [keys] : []\n const remaining = members.filter((member) => {\n const literal = Node.isLiteralTypeNode(member) ? member.getLiteral() : undefined\n return !(Node.isStringLiteral(literal) && paths.has(literal.getLiteralValue()))\n })\n\n if (remaining.length === members.length) {\n continue\n }\n\n if (remaining.length === 0) {\n notes.push(\n `${file.getFilePath()}:${owner.getStartLineNumber()}: \\`${owner.getText()}\\` only picks properties removed in v4; migrate manually.`,\n )\n continue\n }\n\n state.edits.set(keys!, remaining.map((member) => member.getText()).join(' | '))\n }\n }\n }\n\n // Apply from the end of the file so earlier edits don't shift later nodes.\n for (const [node, text] of [...state.edits].sort(([a], [b]) => b.getStart() - a.getStart())) {\n node.replaceWithText(text)\n }\n\n if (state.rewritten.has('languageCode')) {\n notes.push(\n `${file.getFilePath()}: \\`languageCode\\` reads now use \\`i18n.language\\`, which is typed as \\`string\\` instead of \\`AcceptedLanguages\\`. Cast where the narrower type is required.`,\n )\n }\n\n if (file.getFullText() !== original) {\n filesChanged.push(file.getFilePath())\n }\n }\n\n return {\n filesChanged,\n ...(notes.length > 0 ? { notes } : {}),\n }\n },\n description:\n 'Rewrites reads of `headers` and `languageCode`, removed from `AdminContext` in v4, to `req.headers` and `req.i18n.language`. Covers `initAdminContext()` results, bindings typed as `AdminContext` or `PartialAdminContext`, and `Pick`/indexed access types, and drops both arguments from `getRootLayoutData()` calls.',\n}\n\n/** Same-file identifiers bound to the same symbol as `name`. */\nfunction getReferences({ name, file }: { file: SourceFile; name: Identifier }): Identifier[] {\n const symbol = name.getSymbol()?.compilerSymbol\n\n if (!symbol) {\n return []\n }\n\n return file\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .filter(\n (identifier) =>\n identifier !== name &&\n identifier.getText() === name.getText() &&\n identifier.getSymbol()?.compilerSymbol === symbol,\n )\n}\n\n/** Handles a variable or parameter name that holds an admin context. */\nfunction collectBinding({\n binding,\n paths,\n state,\n}: {\n binding: Node\n paths: Paths\n state: State\n}): void {\n if (Node.isObjectBindingPattern(binding)) {\n collectPattern({ paths, pattern: binding, state })\n return\n }\n\n if (!Node.isIdentifier(binding)) {\n return\n }\n\n for (const reference of binding.findReferencesAsNodes()) {\n if (reference !== binding && reference.getSourceFile() === state.file) {\n collectExpression({ allowAlias: false, expression: reference, paths, state })\n }\n }\n}\n\n/** Handles an expression that evaluates to an admin context. */\nfunction collectExpression({\n allowAlias,\n expression,\n paths,\n state,\n}: {\n /** Whether to follow `const context = <expression>` to the uses of `context`. */\n allowAlias: boolean\n expression: Node\n paths: Paths\n state: State\n}): void {\n const parent = expression.getParent()\n\n if (Node.isPropertyAccessExpression(parent) && parent.getExpression() === expression) {\n const path = paths.get(parent.getName())\n\n if (path) {\n state.edits.set(\n parent,\n `${expression.getText()}${parent.hasQuestionDotToken() ? '?.' : '.'}${path.join('.')}`,\n )\n state.rewritten.add(parent.getName())\n }\n } else if (Node.isElementAccessExpression(parent) && parent.getExpression() === expression) {\n const argument = parent.getArgumentExpression()\n const path = Node.isStringLiteral(argument) ? paths.get(argument.getLiteralValue()) : undefined\n\n if (path) {\n state.notes.push(\n `${state.file.getFilePath()}:${parent.getStartLineNumber()}: \\`${parent.getText()}\\` reads a property removed in v4; migrate manually to \\`${expression.getText()}.${path.join('.')}\\`.`,\n )\n }\n } else if (Node.isVariableDeclaration(parent) && parent.getInitializer() === expression) {\n const name = parent.getNameNode()\n\n if (Node.isObjectBindingPattern(name) || allowAlias) {\n collectBinding({ binding: name, paths, state })\n }\n }\n}\n\ntype Tree = Map<string, string | Tree>\n\n/**\n * Moves removed properties out of a destructure into nested patterns, e.g.\n * `{ headers, user }` becomes `{ req: { headers }, user }`. Bindings that are never read are dropped.\n */\nfunction collectPattern({\n paths,\n pattern,\n state,\n}: {\n paths: Paths\n pattern: ObjectBindingPattern\n state: State\n}): void {\n const kept: string[] = []\n const moved: Tree = new Map()\n let insertIndex = -1\n\n for (const element of pattern.getElements()) {\n const propertyNameNode = element.getPropertyNameNode()\n const nameNode = element.getNameNode()\n const property = !propertyNameNode\n ? nameNode.getText()\n : Node.isIdentifier(propertyNameNode)\n ? propertyNameNode.getText()\n : Node.isStringLiteral(propertyNameNode)\n ? propertyNameNode.getLiteralValue()\n : undefined\n const path =\n element.getDotDotDotToken() || property === undefined ? undefined : paths.get(property)\n\n if (!path) {\n kept.push(element.getText())\n continue\n }\n\n if (insertIndex === -1) {\n insertIndex = kept.length\n }\n\n if (\n Node.isIdentifier(nameNode) &&\n nameNode.findReferencesAsNodes().every((reference) => reference === nameNode)\n ) {\n continue\n }\n\n let level = moved\n\n for (const key of path.slice(0, -1)) {\n const next = level.get(key)\n const child = next instanceof Map ? next : new Map<string, string | Tree>()\n level.set(key, child)\n level = child\n }\n\n const leaf = path.at(-1)!\n const initializer = element.getInitializer()\n\n level.set(\n leaf,\n `${leaf === nameNode.getText() ? leaf : `${leaf}: ${nameNode.getText()}`}${initializer ? ` = ${initializer.getText()}` : ''}`,\n )\n state.rewritten.add(property!)\n }\n\n if (insertIndex === -1) {\n return\n }\n\n kept.splice(insertIndex, 0, ...renderTree(moved))\n state.edits.set(pattern, `{ ${kept.join(', ')} }`)\n}\n\nfunction renderTree(tree: Tree): string[] {\n return [...tree].map(([key, value]) =>\n typeof value === 'string' ? value : `${key}: { ${renderTree(value).join(', ')} }`,\n )\n}\n"],"names":["Node","SyntaxKind","ADMIN_CONTEXT_PATHS","Map","PARTIAL_ADMIN_CONTEXT_PATHS","IMPORTS","getRootLayoutData","kind","paths","payload","AdminContext","InitReqResult","initAdminContext","initReq","InitReqPartialResult","PartialAdminContext","migrateAdminContextProperties","name","apply","project","filesChanged","notes","file","getSourceFiles","imports","getImportDeclarations","flatMap","declaration","source","getModuleSpecifierValue","Object","hasOwn","getNamedImports","spec","getAliasNode","getNameNode","getName","isIdentifier","length","original","getFullText","reference","getReferences","call","getParent","argument","isCallExpression","getExpression","getArguments","isObjectLiteralExpression","property","getProperties","isPropertyAssignment","isShorthandPropertyAssignment","has","remove","state","edits","rewritten","Set","parent","expression","isAwaitExpression","isParenthesizedExpression","getParentOrThrow","collectExpression","allowAlias","isTypeReference","getTypeName","owner","isParameterDeclaration","isVariableDeclaration","getTypeNode","collectBinding","binding","isIndexedAccessTypeNode","getObjectTypeNode","index","getIndexTypeNode","literal","isLiteralTypeNode","getLiteral","undefined","isStringLiteral","getLiteralValue","path","get","set","getText","map","key","join","add","getTypeArguments","keys","members","isUnionTypeNode","getTypeNodes","remaining","filter","member","push","getFilePath","getStartLineNumber","node","text","sort","a","b","getStart","replaceWithText","description","symbol","getSymbol","compilerSymbol","getDescendantsOfKind","Identifier","identifier","isObjectBindingPattern","collectPattern","pattern","findReferencesAsNodes","getSourceFile","isPropertyAccessExpression","hasQuestionDotToken","isElementAccessExpression","getArgumentExpression","getInitializer","kept","moved","insertIndex","element","getElements","propertyNameNode","getPropertyNameNode","nameNode","getDotDotDotToken","every","level","slice","next","child","leaf","at","initializer","splice","renderTree","tree","value"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { initAdminContext } from 'payload/internal';
|
|
2
|
+
export async function getRequestInfo(request) {
|
|
3
|
+
const { headers } = request;
|
|
4
|
+
const response = await fetch(request.url, {
|
|
5
|
+
headers
|
|
6
|
+
});
|
|
7
|
+
return {
|
|
8
|
+
headers: response.headers,
|
|
9
|
+
status: response.status
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export async function getContext(args) {
|
|
13
|
+
const { cookies, req } = await initAdminContext(args);
|
|
14
|
+
return {
|
|
15
|
+
cookies,
|
|
16
|
+
userAgent: req.headers.get('user-agent')
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function getLanguage(languageCode, context) {
|
|
20
|
+
const initAdminContext = (value)=>value;
|
|
21
|
+
return {
|
|
22
|
+
context,
|
|
23
|
+
headers: initAdminContext({
|
|
24
|
+
headers: new Headers()
|
|
25
|
+
}).headers,
|
|
26
|
+
languageCode
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=no-match.input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/transforms/migrate-admin-context-properties/no-match.input.ts"],"sourcesContent":["import type { AdminContext } from 'payload'\n\nimport { initAdminContext } from 'payload/internal'\n\ntype Context = Pick<AdminContext, 'cookies' | 'req'>\n\nexport async function getRequestInfo(request: Request) {\n const { headers } = request\n const response = await fetch(request.url, { headers })\n\n return { headers: response.headers, status: response.status }\n}\n\nexport async function getContext(args: Parameters<typeof initAdminContext>[0]) {\n const { cookies, req } = await initAdminContext(args)\n\n return { cookies, userAgent: req.headers.get('user-agent') }\n}\n\nexport function getLanguage(languageCode: string, context: Context) {\n const initAdminContext = (value: { headers: Headers }) => value\n\n return { context, headers: initAdminContext({ headers: new Headers() }).headers, languageCode }\n}\n"],"names":["initAdminContext","getRequestInfo","request","headers","response","fetch","url","status","getContext","args","cookies","req","userAgent","get","getLanguage","languageCode","context","value","Headers"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,mBAAkB;AAInD,OAAO,eAAeC,eAAeC,OAAgB;IACnD,MAAM,EAAEC,OAAO,EAAE,GAAGD;IACpB,MAAME,WAAW,MAAMC,MAAMH,QAAQI,GAAG,EAAE;QAAEH;IAAQ;IAEpD,OAAO;QAAEA,SAASC,SAASD,OAAO;QAAEI,QAAQH,SAASG,MAAM;IAAC;AAC9D;AAEA,OAAO,eAAeC,WAAWC,IAA4C;IAC3E,MAAM,EAAEC,OAAO,EAAEC,GAAG,EAAE,GAAG,MAAMX,iBAAiBS;IAEhD,OAAO;QAAEC;QAASE,WAAWD,IAAIR,OAAO,CAACU,GAAG,CAAC;IAAc;AAC7D;AAEA,OAAO,SAASC,YAAYC,YAAoB,EAAEC,OAAgB;IAChE,MAAMhB,mBAAmB,CAACiB,QAAgCA;IAE1D,OAAO;QAAED;QAASb,SAASH,iBAAiB;YAAEG,SAAS,IAAIe;QAAU,GAAGf,OAAO;QAAEY;IAAa;AAChG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { initAdminContext } from 'payload/internal';
|
|
2
|
+
export async function getRequestInfo(request) {
|
|
3
|
+
const { headers } = request;
|
|
4
|
+
const response = await fetch(request.url, {
|
|
5
|
+
headers
|
|
6
|
+
});
|
|
7
|
+
return {
|
|
8
|
+
headers: response.headers,
|
|
9
|
+
status: response.status
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export async function getContext(args) {
|
|
13
|
+
const { cookies, req } = await initAdminContext(args);
|
|
14
|
+
return {
|
|
15
|
+
cookies,
|
|
16
|
+
userAgent: req.headers.get('user-agent')
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function getLanguage(languageCode, context) {
|
|
20
|
+
const initAdminContext = (value)=>value;
|
|
21
|
+
return {
|
|
22
|
+
context,
|
|
23
|
+
headers: initAdminContext({
|
|
24
|
+
headers: new Headers()
|
|
25
|
+
}).headers,
|
|
26
|
+
languageCode
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=no-match.output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/transforms/migrate-admin-context-properties/no-match.output.ts"],"sourcesContent":["import type { AdminContext } from 'payload'\n\nimport { initAdminContext } from 'payload/internal'\n\ntype Context = Pick<AdminContext, 'cookies' | 'req'>\n\nexport async function getRequestInfo(request: Request) {\n const { headers } = request\n const response = await fetch(request.url, { headers })\n\n return { headers: response.headers, status: response.status }\n}\n\nexport async function getContext(args: Parameters<typeof initAdminContext>[0]) {\n const { cookies, req } = await initAdminContext(args)\n\n return { cookies, userAgent: req.headers.get('user-agent') }\n}\n\nexport function getLanguage(languageCode: string, context: Context) {\n const initAdminContext = (value: { headers: Headers }) => value\n\n return { context, headers: initAdminContext({ headers: new Headers() }).headers, languageCode }\n}\n"],"names":["initAdminContext","getRequestInfo","request","headers","response","fetch","url","status","getContext","args","cookies","req","userAgent","get","getLanguage","languageCode","context","value","Headers"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,mBAAkB;AAInD,OAAO,eAAeC,eAAeC,OAAgB;IACnD,MAAM,EAAEC,OAAO,EAAE,GAAGD;IACpB,MAAME,WAAW,MAAMC,MAAMH,QAAQI,GAAG,EAAE;QAAEH;IAAQ;IAEpD,OAAO;QAAEA,SAASC,SAASD,OAAO;QAAEI,QAAQH,SAASG,MAAM;IAAC;AAC9D;AAEA,OAAO,eAAeC,WAAWC,IAA4C;IAC3E,MAAM,EAAEC,OAAO,EAAEC,GAAG,EAAE,GAAG,MAAMX,iBAAiBS;IAEhD,OAAO;QAAEC;QAASE,WAAWD,IAAIR,OAAO,CAACU,GAAG,CAAC;IAAc;AAC7D;AAEA,OAAO,SAASC,YAAYC,YAAoB,EAAEC,OAAgB;IAChE,MAAMhB,mBAAmB,CAACiB,QAAgCA;IAE1D,OAAO;QAAED;QAASb,SAASH,iBAAiB;YAAEG,SAAS,IAAIe;QAAU,GAAGf,OAAO;QAAEY;IAAa;AAChG"}
|
|
@@ -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,
|
|
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();
|