overleaf/services/web/transform.js
Timothée Alby dea9730503 Merge pull request #2694 from overleaf/ta-jl-otp
Two Factor Authentication for Staff

GitOrigin-RevId: 7028e93cb4a4cd88c138a52b0528817056b930d9
2020-04-08 03:14:35 +00:00

66 lines
1.7 KiB
JavaScript

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()
}