| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- const path = require('path')
- const BASE_PATH = 'frontend/js/'
- function getRelativePath(importPath, filePath) {
- // Ignore existing relative paths
- if (importPath.startsWith('.')) {
- return importPath
- }
- // Ignore npm deps (should be absolute)
- if (
- importPath.startsWith('crypto-js') ||
- importPath.startsWith('moment') ||
- importPath.startsWith('algoliasearch') ||
- importPath.startsWith('qrcode')
- ) {
- return importPath
- }
- // Ignore aliased paths (handled specially by webpack)
- if (
- importPath.startsWith('libs/') ||
- importPath.startsWith('ace/') ||
- importPath.startsWith('fineuploader')
- ) {
- return importPath
- }
- const relativePath = path.relative(filePath, `${BASE_PATH}/${importPath}/`)
- // Strip leading dots if importing at same level, because path.relative
- // likes to use ../my-file.js instead of ./my-file.js
- if (/^\.{2}\/\w/.test(relativePath)) {
- return relativePath.substring(1)
- } else {
- return relativePath.substring(3)
- }
- }
- export default function(file, api) {
- const j = api.jscodeshift
- const filePath = file.path
- return j(file.source)
- .find(j.CallExpression, {
- callee: { name: 'define' }
- })
- .replaceWith(node => {
- const defineArgs = node.get('arguments', 0)
- const deps = defineArgs.get('elements')
- // Ignore files with no deps
- if (!deps.value) {
- return node.value
- }
- const elems = deps.map(e => {
- return j.literal(getRelativePath(e.node.value, filePath))
- })
- const newDeps = j.arrayExpression(elems)
- const callee = node.get('callee').value
- const cb = node.get('arguments', 1).value
- return j.callExpression(callee, [newDeps, cb])
- })
- .toSource()
- }
|