| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import path from 'node:path'
- import fs from 'node:fs'
- /**
- * @param {import('jscodeshift').FileInfo} file
- * @param {import('jscodeshift').API} api
- */
- module.exports = function transformer(file, api) {
- const j = api.jscodeshift
- const root = j(file.source)
- let hasChanges = false
- const considerExtensionReplacement = nodePath => {
- const source = nodePath.value.source
- if (
- !source ||
- typeof source.value !== 'string' ||
- !source.value.endsWith('.js')
- ) {
- return
- }
- const importPath = source.value
- const currentDirectory = path.dirname(file.path)
- const jsPath = path.resolve(currentDirectory, importPath)
- if (fs.existsSync(jsPath)) {
- return
- }
- const mjsImportPath = importPath.replace(/\.js$/, '.mjs')
- const mjsPath = path.resolve(currentDirectory, mjsImportPath)
- if (fs.existsSync(mjsPath)) {
- j(nodePath).get('source').replace(j.literal(mjsImportPath))
- hasChanges = true
- }
- }
- const declarationTypes = [
- j.ImportDeclaration,
- j.ExportNamedDeclaration,
- j.ExportAllDeclaration,
- ]
- declarationTypes.forEach(type => {
- root
- .find(type, { source: s => s !== null })
- .forEach(considerExtensionReplacement)
- })
- return hasChanges ? root.toSource({ quote: 'single' }) : null
- }
|