mirror of
https://github.com/nuxt/nuxt.git
synced 2024-12-02 10:27:15 +00:00
111 lines
2.6 KiB
JavaScript
111 lines
2.6 KiB
JavaScript
import path from 'path'
|
|
import consola from 'consola'
|
|
import { escapeRegExp } from 'lodash'
|
|
|
|
export const startsWithAlias = aliasArray => str => aliasArray.some(c => str.startsWith(c))
|
|
|
|
export const startsWithSrcAlias = startsWithAlias(['@', '~'])
|
|
|
|
export const startsWithRootAlias = startsWithAlias(['@@', '~~'])
|
|
|
|
export const isWindows = process.platform.startsWith('win')
|
|
|
|
export const wp = function wp (p = '') {
|
|
if (isWindows) {
|
|
return p.replace(/\\/g, '\\\\')
|
|
}
|
|
return p
|
|
}
|
|
|
|
// Kept for backward compat (modules may use it from template context)
|
|
export const wChunk = function wChunk (p = '') {
|
|
return p
|
|
}
|
|
|
|
const reqSep = /\//g
|
|
const sysSep = escapeRegExp(path.sep)
|
|
const normalize = string => string.replace(reqSep, sysSep)
|
|
|
|
export const r = function r (...args) {
|
|
const lastArg = args[args.length - 1]
|
|
|
|
if (startsWithSrcAlias(lastArg)) {
|
|
return wp(lastArg)
|
|
}
|
|
|
|
return wp(path.resolve(...args.map(normalize)))
|
|
}
|
|
|
|
export const relativeTo = function relativeTo (...args) {
|
|
const dir = args.shift()
|
|
|
|
// Keep webpack inline loader intact
|
|
if (args[0].includes('!')) {
|
|
const loaders = args.shift().split('!')
|
|
|
|
return loaders.concat(relativeTo(dir, loaders.pop(), ...args)).join('!')
|
|
}
|
|
|
|
// Resolve path
|
|
const resolvedPath = r(...args)
|
|
|
|
// Check if path is an alias
|
|
if (startsWithSrcAlias(resolvedPath)) {
|
|
return resolvedPath
|
|
}
|
|
|
|
// Make correct relative path
|
|
let rp = path.relative(dir, resolvedPath)
|
|
if (rp[0] !== '.') {
|
|
rp = '.' + path.sep + rp
|
|
}
|
|
|
|
return wp(rp)
|
|
}
|
|
|
|
export function defineAlias (src, target, prop, opts = {}) {
|
|
const { bind = true, warn = false } = opts
|
|
|
|
if (Array.isArray(prop)) {
|
|
for (const p of prop) {
|
|
defineAlias(src, target, p, opts)
|
|
}
|
|
return
|
|
}
|
|
|
|
let targetVal = target[prop]
|
|
if (bind && typeof targetVal === 'function') {
|
|
targetVal = targetVal.bind(target)
|
|
}
|
|
|
|
let warned = false
|
|
|
|
Object.defineProperty(src, prop, {
|
|
get: () => {
|
|
if (warn && !warned) {
|
|
warned = true
|
|
consola.warn({
|
|
message: `'${prop}' is deprecated'`,
|
|
// eslint-disable-next-line unicorn/error-message
|
|
additional: new Error().stack.split('\n').splice(2).join('\n')
|
|
})
|
|
}
|
|
return targetVal
|
|
}
|
|
})
|
|
}
|
|
|
|
const isIndex = s => /(.*)\/index\.[^/]+$/.test(s)
|
|
|
|
export function isIndexFileAndFolder (pluginFiles) {
|
|
// Return early in case the matching file count exceeds 2 (index.js + folder)
|
|
if (pluginFiles.length !== 2) {
|
|
return false
|
|
}
|
|
return pluginFiles.some(isIndex)
|
|
}
|
|
|
|
export const getMainModule = () => {
|
|
return (require && require.main) || (module && module.main) || module
|
|
}
|