@next/codemod 15.0.0-rc.0 → 15.0.0

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 (33) hide show
  1. package/bin/next-codemod.js +55 -3
  2. package/bin/shared.js +7 -0
  3. package/bin/transform.js +124 -0
  4. package/bin/upgrade.js +473 -0
  5. package/lib/cra-to-next/global-css-transform.js +5 -5
  6. package/lib/cra-to-next/index-to-component.js +5 -5
  7. package/lib/handle-package.js +110 -0
  8. package/lib/install.js +2 -3
  9. package/lib/parser.js +28 -0
  10. package/lib/run-jscodeshift.js +18 -2
  11. package/lib/utils.js +115 -0
  12. package/package.json +15 -7
  13. package/transforms/add-missing-react-import.js +4 -3
  14. package/transforms/app-dir-runtime-config-experimental-edge.js +34 -0
  15. package/transforms/built-in-next-font.js +4 -3
  16. package/transforms/cra-to-next.js +238 -236
  17. package/transforms/lib/async-request-api/index.js +16 -0
  18. package/transforms/lib/async-request-api/next-async-dynamic-api.js +284 -0
  19. package/transforms/lib/async-request-api/next-async-dynamic-prop.js +713 -0
  20. package/transforms/lib/async-request-api/utils.js +473 -0
  21. package/transforms/metadata-to-viewport-export.js +4 -3
  22. package/transforms/name-default-component.js +6 -6
  23. package/transforms/new-link.js +9 -7
  24. package/transforms/next-async-request-api.js +9 -0
  25. package/transforms/next-dynamic-access-named-export.js +66 -0
  26. package/transforms/next-image-experimental.js +12 -15
  27. package/transforms/next-image-to-legacy-image.js +8 -9
  28. package/transforms/next-og-import.js +4 -3
  29. package/transforms/next-request-geo-ip.js +339 -0
  30. package/transforms/url-to-withrouter.js +1 -1
  31. package/transforms/withamp-to-config.js +1 -1
  32. package/bin/cli.js +0 -216
  33. package/lib/uninstall-package.js +0 -32
@@ -4,14 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.globalCssContext = void 0;
7
+ exports.default = transformer;
7
8
  const path_1 = __importDefault(require("path"));
9
+ const parser_1 = require("../parser");
8
10
  exports.globalCssContext = {
9
11
  cssImports: new Set(),
10
12
  reactSvgImports: new Set(),
11
13
  };
12
14
  const globalStylesRegex = /(?<!\.module)\.(css|scss|sass)$/i;
13
- function transformer(file, api, options) {
14
- const j = api.jscodeshift.withParser('tsx');
15
+ function transformer(file, _api, options) {
16
+ const j = (0, parser_1.createParserFromPath)(file.path);
15
17
  const root = j(file.source);
16
18
  let hasModifications = false;
17
19
  root
@@ -37,8 +39,7 @@ function transformer(file, api, options) {
37
39
  }
38
40
  else if (value.endsWith('.svg')) {
39
41
  const isComponentImport = path.node.specifiers.some((specifier) => {
40
- var _a;
41
- return ((_a = specifier.imported) === null || _a === void 0 ? void 0 : _a.name) === 'ReactComponent';
42
+ return specifier.imported?.name === 'ReactComponent';
42
43
  });
43
44
  if (isComponentImport) {
44
45
  exports.globalCssContext.reactSvgImports.add(file.path);
@@ -52,5 +53,4 @@ function transformer(file, api, options) {
52
53
  ? root.toSource(options)
53
54
  : null;
54
55
  }
55
- exports.default = transformer;
56
56
  //# sourceMappingURL=global-css-transform.js.map
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.indexContext = void 0;
4
+ exports.default = transformer;
5
+ const parser_1 = require("../parser");
4
6
  exports.indexContext = {
5
7
  multipleRenderRoots: false,
6
8
  nestedRender: false,
7
9
  };
8
- function transformer(file, api, options) {
9
- const j = api.jscodeshift.withParser('tsx');
10
+ function transformer(file, _api, options) {
11
+ const j = (0, parser_1.createParserFromPath)(file.path);
10
12
  const root = j(file.source);
11
13
  let hasModifications = false;
12
14
  let foundReactRender = 0;
@@ -28,7 +30,6 @@ function transformer(file, api, options) {
28
30
  root
29
31
  .find(j.CallExpression)
30
32
  .filter((path) => {
31
- var _a, _b;
32
33
  const { node } = path;
33
34
  let found = false;
34
35
  if (defaultReactDomImport &&
@@ -43,7 +44,7 @@ function transformer(file, api, options) {
43
44
  if (found) {
44
45
  foundReactRender++;
45
46
  hasModifications = true;
46
- if (!Array.isArray((_b = (_a = path.parentPath) === null || _a === void 0 ? void 0 : _a.parentPath) === null || _b === void 0 ? void 0 : _b.value)) {
47
+ if (!Array.isArray(path.parentPath?.parentPath?.value)) {
47
48
  exports.indexContext.nestedRender = true;
48
49
  return false;
49
50
  }
@@ -73,5 +74,4 @@ function transformer(file, api, options) {
73
74
  // }).remove()
74
75
  return hasModifications ? root.toSource(options) : null;
75
76
  }
76
- exports.default = transformer;
77
77
  //# sourceMappingURL=index-to-component.js.map
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPkgManager = getPkgManager;
7
+ exports.uninstallPackage = uninstallPackage;
8
+ exports.installPackages = installPackages;
9
+ exports.runInstallation = runInstallation;
10
+ exports.addPackageDependency = addPackageDependency;
11
+ const find_up_1 = __importDefault(require("find-up"));
12
+ const execa_1 = __importDefault(require("execa"));
13
+ const node_path_1 = require("node:path");
14
+ function getPkgManager(baseDir) {
15
+ try {
16
+ const lockFile = find_up_1.default.sync(['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb'], { cwd: baseDir });
17
+ if (lockFile) {
18
+ switch ((0, node_path_1.basename)(lockFile)) {
19
+ case 'package-lock.json':
20
+ return 'npm';
21
+ case 'yarn.lock':
22
+ return 'yarn';
23
+ case 'pnpm-lock.yaml':
24
+ return 'pnpm';
25
+ case 'bun.lockb':
26
+ return 'bun';
27
+ default:
28
+ return 'npm';
29
+ }
30
+ }
31
+ }
32
+ catch {
33
+ return 'npm';
34
+ }
35
+ }
36
+ function uninstallPackage(packageToUninstall, pkgManager) {
37
+ pkgManager ??= getPkgManager(process.cwd());
38
+ if (!pkgManager)
39
+ throw new Error('Failed to find package manager');
40
+ let command = 'uninstall';
41
+ if (pkgManager === 'yarn') {
42
+ command = 'remove';
43
+ }
44
+ try {
45
+ execa_1.default.sync(pkgManager, [command, packageToUninstall], {
46
+ stdio: 'inherit',
47
+ shell: true,
48
+ });
49
+ }
50
+ catch (error) {
51
+ throw new Error(`Failed to uninstall "${packageToUninstall}". Please uninstall it manually.`, { cause: error });
52
+ }
53
+ }
54
+ const ADD_CMD_FLAG = {
55
+ npm: 'install',
56
+ yarn: 'add',
57
+ pnpm: 'add',
58
+ bun: 'add',
59
+ };
60
+ const DEV_DEP_FLAG = {
61
+ npm: '--save-dev',
62
+ yarn: '--dev',
63
+ pnpm: '--save-dev',
64
+ bun: '--dev',
65
+ };
66
+ function installPackages(packageToInstall, options = {}) {
67
+ if (packageToInstall.length === 0)
68
+ return;
69
+ const { packageManager = getPkgManager(process.cwd()), silent = false, dev = false, } = options;
70
+ if (!packageManager)
71
+ throw new Error('Failed to find package manager');
72
+ const addCmd = ADD_CMD_FLAG[packageManager];
73
+ const devDepFlag = dev ? DEV_DEP_FLAG[packageManager] : undefined;
74
+ const installFlags = [addCmd];
75
+ if (devDepFlag) {
76
+ installFlags.push(devDepFlag);
77
+ }
78
+ try {
79
+ execa_1.default.sync(packageManager, [...installFlags, ...packageToInstall], {
80
+ // Keeping stderr since it'll likely be relevant later when it fails.
81
+ stdio: silent ? ['ignore', 'ignore', 'inherit'] : 'inherit',
82
+ shell: true,
83
+ });
84
+ }
85
+ catch (error) {
86
+ throw new Error(`Failed to install "${packageToInstall}". Please install it manually.`, { cause: error });
87
+ }
88
+ }
89
+ function runInstallation(packageManager) {
90
+ try {
91
+ execa_1.default.sync(packageManager, ['install'], {
92
+ stdio: 'inherit',
93
+ shell: true,
94
+ });
95
+ }
96
+ catch (error) {
97
+ throw new Error('Failed to install dependencies', { cause: error });
98
+ }
99
+ }
100
+ function addPackageDependency(packageJson, name, version, dev) {
101
+ if (dev) {
102
+ packageJson.devDependencies = packageJson.devDependencies || {};
103
+ }
104
+ else {
105
+ packageJson.dependencies = packageJson.dependencies || {};
106
+ }
107
+ const deps = dev ? packageJson.devDependencies : packageJson.dependencies;
108
+ deps[name] = version;
109
+ }
110
+ //# sourceMappingURL=handle-package.js.map
package/lib/install.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.install = void 0;
6
+ exports.install = install;
7
7
  /* eslint-disable import/no-extraneous-dependencies */
8
8
  const picocolors_1 = require("picocolors");
9
9
  const cross_spawn_1 = __importDefault(require("cross-spawn"));
@@ -84,7 +84,7 @@ function install(root, dependencies, { useYarn, isOnline, devDependencies }) {
84
84
  */
85
85
  const child = (0, cross_spawn_1.default)(command, args, {
86
86
  stdio: 'inherit',
87
- env: Object.assign(Object.assign({}, process.env), { ADBLOCK: '1', DISABLE_OPENCOLLECTIVE: '1' }),
87
+ env: { ...process.env, ADBLOCK: '1', DISABLE_OPENCOLLECTIVE: '1' },
88
88
  });
89
89
  child.on('close', (code) => {
90
90
  if (code !== 0) {
@@ -95,5 +95,4 @@ function install(root, dependencies, { useYarn, isOnline, devDependencies }) {
95
95
  });
96
96
  });
97
97
  }
98
- exports.install = install;
99
98
  //# sourceMappingURL=install.js.map
package/lib/parser.js ADDED
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createParserFromPath = createParserFromPath;
7
+ const jscodeshift_1 = __importDefault(require("jscodeshift"));
8
+ const babylon_1 = __importDefault(require("jscodeshift/parser/babylon"));
9
+ const tsOptions_1 = __importDefault(require("jscodeshift/parser/tsOptions"));
10
+ const dtsOptions = {
11
+ ...tsOptions_1.default,
12
+ plugins: [
13
+ ...tsOptions_1.default.plugins.filter((plugin) => plugin !== 'typescript'),
14
+ ['typescript', { dts: true }],
15
+ ],
16
+ };
17
+ function createParserFromPath(filePath) {
18
+ const isDeclarationFile = /\.d\.(m|c)?ts$/.test(filePath);
19
+ if (isDeclarationFile) {
20
+ return jscodeshift_1.default.withParser((0, babylon_1.default)(dtsOptions));
21
+ }
22
+ // jsx is allowed in .js files, feed them into the tsx parser.
23
+ // tsx parser :.js, .jsx, .tsx
24
+ // ts parser: .ts, .mts, .cts
25
+ const isTsFile = /\.(m|c)?.ts$/.test(filePath);
26
+ return isTsFile ? jscodeshift_1.default.withParser('ts') : jscodeshift_1.default.withParser('tsx');
27
+ }
28
+ //# sourceMappingURL=parser.js.map
@@ -3,12 +3,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = runJscodeshift;
6
7
  // @ts-ignore internal module
7
8
  const Runner_1 = __importDefault(require("jscodeshift/src/Runner"));
8
9
  function runJscodeshift(transformerPath, flags, files) {
9
10
  // we run jscodeshift in the same process to be able to
10
11
  // share state between the main CRA transform and sub-transforms
11
- return Runner_1.default.run(transformerPath, files, Object.assign({ ignorePattern: ['**/node_modules/**', '**/.next/**', '**/build/**'], extensions: 'tsx,ts,jsx,js', parser: 'tsx', verbose: 2, runInBand: true }, flags));
12
+ return Runner_1.default.run(transformerPath, files, {
13
+ ignorePattern: [
14
+ '**/node_modules/**',
15
+ '**/.next/**',
16
+ '**/build/**',
17
+ // test files
18
+ '**/*.test.*',
19
+ '**/*.spec.*',
20
+ '**/__tests__/**',
21
+ '**/__mocks__/**',
22
+ ],
23
+ extensions: 'tsx,ts,jsx,js',
24
+ parser: 'tsx',
25
+ verbose: 2,
26
+ runInBand: true,
27
+ ...flags,
28
+ });
12
29
  }
13
- exports.default = runJscodeshift;
14
30
  //# sourceMappingURL=run-jscodeshift.js.map
package/lib/utils.js ADDED
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TRANSFORMER_INQUIRER_CHOICES = void 0;
7
+ exports.checkGitStatus = checkGitStatus;
8
+ exports.onCancel = onCancel;
9
+ const picocolors_1 = require("picocolors");
10
+ const is_git_clean_1 = __importDefault(require("is-git-clean"));
11
+ function checkGitStatus(force) {
12
+ let clean = false;
13
+ let errorMessage = 'Unable to determine if git directory is clean';
14
+ try {
15
+ clean = is_git_clean_1.default.sync(process.cwd());
16
+ errorMessage = 'Git directory is not clean';
17
+ }
18
+ catch (err) {
19
+ if (err && err.stderr && err.stderr.includes('Not a git repository')) {
20
+ clean = true;
21
+ }
22
+ }
23
+ if (!clean) {
24
+ if (force) {
25
+ console.log(`WARNING: ${errorMessage}. Forcibly continuing.`);
26
+ }
27
+ else {
28
+ console.log('Thank you for using @next/codemod!');
29
+ console.log((0, picocolors_1.yellow)('\nBut before we continue, please stash or commit your git changes.'));
30
+ console.log('\nYou may use the --force flag to override this safety check.');
31
+ process.exit(1);
32
+ }
33
+ }
34
+ }
35
+ function onCancel() {
36
+ process.exit(1);
37
+ }
38
+ exports.TRANSFORMER_INQUIRER_CHOICES = [
39
+ {
40
+ title: 'Transform the deprecated automatically injected url property on top level pages to using withRouter',
41
+ value: 'url-to-withrouter',
42
+ version: '6.0.0',
43
+ },
44
+ {
45
+ title: 'Transforms the withAmp HOC into Next.js 9 page configuration',
46
+ value: 'withamp-to-config',
47
+ version: '8.0.0',
48
+ },
49
+ {
50
+ title: 'Transforms anonymous components into named components to make sure they work with Fast Refresh',
51
+ value: 'name-default-component',
52
+ version: '9.0.0',
53
+ },
54
+ {
55
+ title: 'Transforms files that do not import `React` to include the import in order for the new React JSX transform',
56
+ value: 'add-missing-react-import',
57
+ version: '10.0.0',
58
+ },
59
+ {
60
+ title: 'Automatically migrates a Create React App project to Next.js (experimental)',
61
+ value: 'cra-to-next',
62
+ version: '11.0.0',
63
+ },
64
+ {
65
+ title: 'Ensures your <Link> usage is backwards compatible',
66
+ value: 'new-link',
67
+ version: '13.0.0',
68
+ },
69
+ {
70
+ title: 'Dangerously migrates from `next/legacy/image` to the new `next/image` by adding inline styles and removing unused props (experimental)',
71
+ value: 'next-image-experimental',
72
+ version: '13.0.0',
73
+ },
74
+ {
75
+ title: 'Safely migrate Next.js 10, 11, 12 applications importing `next/image` to the renamed `next/legacy/image` import in Next.js 13',
76
+ value: 'next-image-to-legacy-image',
77
+ version: '13.0.0',
78
+ },
79
+ {
80
+ title: 'Uninstall `@next/font` and transform imports to `next/font`',
81
+ value: 'built-in-next-font',
82
+ version: '13.2.0',
83
+ },
84
+ {
85
+ title: 'Migrates certain viewport related metadata from the `metadata` export to a new `viewport` export',
86
+ value: 'metadata-to-viewport-export',
87
+ version: '14.0.0',
88
+ },
89
+ {
90
+ title: 'Transforms imports from `next/server` to `next/og` for usage of Dynamic OG Image Generation',
91
+ value: 'next-og-import',
92
+ version: '14.0.0',
93
+ },
94
+ {
95
+ title: 'Transform `next/dynamic` imports accessing named exports to return an object with a `default` property',
96
+ value: 'next-dynamic-access-named-export',
97
+ version: '15.0.0-canary.44',
98
+ },
99
+ {
100
+ title: 'Install `@vercel/functions` to replace `geo` and `ip` properties on `NextRequest`',
101
+ value: 'next-request-geo-ip',
102
+ version: '15.0.0-canary.153',
103
+ },
104
+ {
105
+ title: 'Transforms usage of Next.js async Request APIs',
106
+ value: 'next-async-request-api',
107
+ version: '15.0.0-canary.171',
108
+ },
109
+ {
110
+ title: 'Transform App Router Route Segment Config `runtime` value from `experimental-edge` to `edge`',
111
+ value: 'app-dir-runtime-config-experimental-edge',
112
+ version: '15.0.0-canary.179',
113
+ },
114
+ ];
115
+ //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next/codemod",
3
- "version": "15.0.0-rc.0",
3
+ "version": "15.0.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,16 +9,19 @@
9
9
  },
10
10
  "dependencies": {
11
11
  "cheerio": "1.0.0-rc.9",
12
+ "commander": "12.1.0",
12
13
  "execa": "4.0.3",
14
+ "find-up": "4.1.0",
13
15
  "globby": "11.0.1",
14
- "inquirer": "7.3.3",
15
16
  "is-git-clean": "1.1.0",
16
- "jscodeshift": "0.13.1",
17
- "meow": "7.0.1",
18
- "picocolors": "1.0.0"
17
+ "jscodeshift": "17.0.0",
18
+ "picocolors": "1.0.0",
19
+ "prompts": "2.4.2",
20
+ "semver": "7.6.3"
19
21
  },
20
22
  "files": [
21
23
  "transforms/*.js",
24
+ "transforms/lib/**/*.js",
22
25
  "bin/*.js",
23
26
  "lib/**/*.js",
24
27
  "lib/cra-to-next/gitignore"
@@ -27,10 +30,15 @@
27
30
  "build": "pnpm tsc -d -p tsconfig.json",
28
31
  "prepublishOnly": "cd ../../ && turbo run build",
29
32
  "dev": "pnpm tsc -d -w -p tsconfig.json",
30
- "test": "jest"
33
+ "test": "jest",
34
+ "test:upgrade-fixture": "./scripts/test-upgrade-fixture.sh"
31
35
  },
32
36
  "bin": "./bin/next-codemod.js",
33
37
  "devDependencies": {
34
- "@types/jscodeshift": "0.11.0"
38
+ "@types/find-up": "4.0.0",
39
+ "@types/jscodeshift": "0.11.0",
40
+ "@types/prompts": "2.4.2",
41
+ "@types/semver": "7.3.1",
42
+ "typescript": "5.5.3"
35
43
  }
36
44
  }
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = transformer;
4
+ const parser_1 = require("../lib/parser");
3
5
  function addReactImport(j, root) {
4
6
  // We create an import specifier, this is the value of an import, eg:
5
7
  // import React from 'react'
@@ -33,8 +35,8 @@ function addReactImport(j, root) {
33
35
  node.value.body.unshift(ReactImport);
34
36
  });
35
37
  }
36
- function transformer(file, api, options) {
37
- const j = api.jscodeshift.withParser('tsx');
38
+ function transformer(file, _api, options) {
39
+ const j = (0, parser_1.createParserFromPath)(file.path);
38
40
  const root = j(file.source);
39
41
  const hasReactImport = (r) => {
40
42
  return (r.find(j.ImportDefaultSpecifier, {
@@ -60,5 +62,4 @@ function transformer(file, api, options) {
60
62
  }
61
63
  return root.toSource(options);
62
64
  }
63
- exports.default = transformer;
64
65
  //# sourceMappingURL=add-missing-react-import.js.map
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = transformer;
4
+ const parser_1 = require("../lib/parser");
5
+ function transformer(file, _api) {
6
+ if (process.env.NODE_ENV !== 'test' &&
7
+ !/[/\\]app[/\\].*?(page|layout|route)\.[^/\\]+$/.test(file.path)) {
8
+ return file.source;
9
+ }
10
+ const j = (0, parser_1.createParserFromPath)(file.path);
11
+ const root = j(file.source);
12
+ const runtimeExport = root.find(j.ExportNamedDeclaration, {
13
+ declaration: {
14
+ type: 'VariableDeclaration',
15
+ declarations: [
16
+ {
17
+ id: { name: 'runtime' },
18
+ },
19
+ ],
20
+ },
21
+ });
22
+ if (runtimeExport.size() !== 1) {
23
+ return file.source;
24
+ }
25
+ const runtimeValue = runtimeExport.find(j.StringLiteral, {
26
+ value: 'experimental-edge',
27
+ });
28
+ if (runtimeValue.size() !== 1) {
29
+ return file.source;
30
+ }
31
+ runtimeValue.replaceWith(j.stringLiteral('edge'));
32
+ return root.toSource();
33
+ }
34
+ //# sourceMappingURL=app-dir-runtime-config-experimental-edge.js.map
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- function transformer(file, api, options) {
4
- const j = api.jscodeshift.withParser('tsx');
3
+ exports.default = transformer;
4
+ const parser_1 = require("../lib/parser");
5
+ function transformer(file, _api, options) {
6
+ const j = (0, parser_1.createParserFromPath)(file.path);
5
7
  const root = j(file.source);
6
8
  let hasChanges = false;
7
9
  // Before: import { ... } from '@next/font'
@@ -36,5 +38,4 @@ function transformer(file, api, options) {
36
38
  });
37
39
  return hasChanges ? root.toSource(options) : file.source;
38
40
  }
39
- exports.default = transformer;
40
41
  //# sourceMappingURL=built-in-next-font.js.map