vite-plugin-resolve
Advanced tools
Comparing version 1.0.1 to 1.2.0
{ | ||
"name": "vite-plugin-resolve", | ||
"version": "1.0.1", | ||
"version": "1.2.0", | ||
"description": "Custom resolve code for vite", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
# vite-plugin-resolve | ||
[![npm package](https://nodei.co/npm/vite-plugin-resolve.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/vite-plugin-resolve) | ||
<br/> | ||
[![NPM version](https://img.shields.io/npm/v/vite-plugin-resolve.svg?style=flat)](https://npmjs.org/package/vite-plugin-resolve) | ||
@@ -22,6 +23,8 @@ [![NPM Downloads](https://img.shields.io/npm/dm/vite-plugin-resolve.svg?style=flat)](https://npmjs.org/package/vite-plugin-resolve) | ||
viteResolve({ | ||
// use string in web | ||
// use code string | ||
vue: `const vue = window.Vue; export default vue;`, | ||
// use nested module and function to return code string | ||
'@scope/name': () => `const Lib = window.LibraryName; export default Lib;`, | ||
// use function to return string in electron | ||
electron: () => `const electron = require('electron'); export default electron;`, | ||
'electron-store': () => `const Store = require('electron-store'); export default Store;`, | ||
}) | ||
@@ -31,1 +34,19 @@ ] | ||
``` | ||
## How to work | ||
1. Resolve-module will be generated code into `node_modules/.vite-plugin-resolve/xxxx.js` | ||
2. Append an resolve-module into alias | ||
```js | ||
{ | ||
resolve: { | ||
alias: [ | ||
{ | ||
find: 'vue', | ||
replacement: 'User/work-directory/node_modules/.vite-plugin-resolve/vue.js', | ||
}, | ||
], | ||
}, | ||
} | ||
``` |
123
src/index.js
@@ -0,5 +1,11 @@ | ||
const fs = require('fs'); | ||
const path = require('path'); | ||
/** | ||
* Custo m resolve code for vite | ||
* @type {(external: Record<string, string | () => string>) => import('vite').Plugin} | ||
* @typedef {{(dict: Record<string, string | () => string>) => import('vite').Plugin}} ViteResolve | ||
*/ | ||
/** | ||
* Custom resolve code for vite | ||
* @type {ViteResolve} | ||
* @example | ||
@@ -9,6 +15,8 @@ * export default defineConfig({ | ||
* viteResolve({ | ||
* // use string | ||
* // use code string | ||
* vue: `const vue = window.Vue; export default vue;`, | ||
* // use function to return string | ||
* vuex: () => `const vuex = window.Vuex; export default Vuex;`, | ||
* // use nested module and function to return code string | ||
* '@scope/name': () => `const Lib = window.LibraryName; export default Lib;`, | ||
* // use function to return string in electron | ||
* 'electron-store': () => `const Store = require('electron-store'); export default Store;`, | ||
* }) | ||
@@ -18,19 +26,102 @@ * ] | ||
*/ | ||
function viteResolve(external = {}) { | ||
module.exports = function (dict = {}) { | ||
let root = process.cwd(); | ||
const resolvePluginDirectory = '.vite-plugin-resolve'; | ||
return { | ||
name: 'vite-plugin-resolve', | ||
enforce: 'pre', | ||
resolveId(id) { | ||
if (external[id]) { | ||
return id | ||
config(config) { | ||
// init root path | ||
if (config.root && path.isAbsolute(config.root)) { | ||
// TODO: config.root is relative path | ||
root = config.root; | ||
} | ||
// step-1 | ||
generateReolveFile( | ||
root, | ||
resolvePluginDirectory, | ||
dict | ||
); | ||
// step-2 | ||
rewriteAlias( | ||
config, | ||
root, | ||
resolvePluginDirectory, | ||
dict | ||
); | ||
}, | ||
load(id) { | ||
if (external[id]) { | ||
return typeof external[id] === 'function' ? external[id]() : external[id] | ||
} | ||
}, | ||
} | ||
} | ||
module.exports = viteResolve | ||
function generateReolveFile( | ||
root, | ||
directory, | ||
resolveDict | ||
) { | ||
const dir = path.join(node_modules(root), directory); | ||
// ensure .vite-plugin-resolve directory existed | ||
fs.existsSync(dir) || fs.mkdirSync(dir); | ||
// generate external module file | ||
for (const [module, strOrFn] of Object.entries(resolveDict)) { | ||
const moduleId = path.join(dir, module + '.js'); | ||
if (!fs.existsSync(moduleId)) { | ||
// for '@scope/name' module | ||
ensureDir(path.parse(moduleId).dir); | ||
const moduleContent = typeof strOrFn === 'function' ? strOrFn() : strOrFn; | ||
fs.writeFileSync(moduleId, moduleContent); | ||
} | ||
} | ||
} | ||
function rewriteAlias( | ||
config, | ||
root, | ||
directory, | ||
resolveDict | ||
) { | ||
if (!config.resolve) { | ||
config.resolve = {}; | ||
} | ||
let alias = config.resolve.alias || {}; | ||
if (!Array.isArray(alias)) { | ||
alias = Object.entries(alias).map(([k, v]) => ({ find: k, replacement: v })); | ||
} | ||
Object.keys(resolveDict).forEach(k => { | ||
// redirect resolve module to `node_modules/.vite-plugin-resolve` directory | ||
alias.push({ find: k, replacement: path.join(node_modules(root), directory, k) }); | ||
}); | ||
config.resolve.alias = alias; | ||
} | ||
function node_modules(root, count = 0) { | ||
if (node_modules.p) { | ||
return node_modules.p; | ||
} | ||
const p = path.join(root, 'node_modules'); | ||
if (fs.existsSync(p)) { | ||
return node_modules.p = p; | ||
} | ||
if (count >= 19) { | ||
throw new Error('Can not found node_modules directory.'); | ||
} | ||
return node_modules(path.join(root, '..'), count + 1); | ||
} | ||
function ensureDir(dir) { | ||
try { | ||
fs.statSync(dir).isDirectory(); | ||
} catch (error) { | ||
fs.mkdirSync(dir, { recursive: true }); | ||
} | ||
return dir; | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
4889
108
51
2