taye/interact.js

View on GitHub
scripts/babel/relative-imports.js

Summary

Maintainability
A
3 hrs
Test Coverage
const path = require('path')

const resolveSync = require('resolve').sync

const { getModuleDirectories, shouldIgnoreImport, getRelativeToRoot } = require('../utils')

module.exports = function transformImportsToRelative() {
  const fixImportSource = ({ node: { source } }, { opts, filename }) => {
    if (!source || (opts.ignore && opts.ignore(filename))) return

    const { moduleDirectory = getModuleDirectories() } = opts

    if (shouldIgnoreImport(source.value, filename, moduleDirectory)) return

    const { extension = '.js' } = opts

    const basedir = path.dirname(getRelativeToRoot(filename, moduleDirectory).result)
    let resolvedImport = ''

    for (const root of moduleDirectory) {
      try {
        resolvedImport = resolveSync(source.value, {
          extensions: ['.ts', '.tsx'],
          basedir: path.join(root, basedir),
          moduleDirectory,
        })
        break
      } catch {}
    }

    if (!resolvedImport) {
      throw new Error(`Couldn't find module "${source.value}" from "${filename}"`)
    }

    const relativeImport = path.relative(basedir, getRelativeToRoot(resolvedImport, moduleDirectory).result)

    const importWithDir = /^[./\\]/.test(relativeImport) ? relativeImport : `${path.sep}${relativeImport}`

    source.value = importWithDir.replace(/^\//, `.${path.sep}`).replace(/\.tsx?$/, extension)
  }

  return {
    name: '@interactjs/_dev:relative-imports',
    visitor: {
      ImportDeclaration: fixImportSource,
      ExportNamedDeclaration: fixImportSource,
      ExportAllDeclaration: fixImportSource,
    },
  }
}