- Notifications
You must be signed in to change notification settings - Fork70
Unified utils for auto importing APIs in modules.
License
unjs/unimport
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Unified utils for auto importing APIs in modules, used innuxt andunplugin-auto-import
- Auto import register APIs for Vite, Webpack or esbuild powered byunplugin
- TypeScript declaration file generation
- Auto import for custom APIs defined under specific directories
- Auto import for Vue template
# npmnpm install unimport# yarnyarn add unimport# pnpmpnpm install unimport
Powered byunplugin,unimport
provides a plugin interface for bundlers.
// vite.config.js / rollup.config.jsimportUnimportfrom'unimport/unplugin'exportdefault{plugins:[Unimport.vite({/* plugin options */})]}
// webpack.config.jsimportUnimportfrom'unimport/unplugin'module.exports={plugins:[Unimport.webpack({/* plugin options */})]}
// ESMimport{createUnimport}from'unimport'// CommonJSconst{ createUnimport}=require('unimport')
const{ injectImports}=createUnimport({imports:[{name:'fooBar',from:'test-id'}]})// { code: "import { fooBar } from 'test-id';console.log(fooBar())"}console.log(injectImports('console.log(fooBar())'))
imports:[{name:'ref',from:'vue'},{name:'useState',as:'useSignal',from:'react'},]
Will be injected as:
import{useStateasuseSignal}from'react'import{ref}from'vue'
imports:[{name:'default',as:'_',from:'lodash'}]
Will be injected as:
import_from'lodash'
imports:[{name:'*',as:'_',from:'lodash'}]
Will be injected as:
import*as_from'lodash'
This is a special case for libraries authored withTypeScript'sexport =
syntax. You don't need it the most of the time.
imports:[{name:'=',as:'browser',from:'webextension-polyfill'}]
Will be injected as:
importbrowserfrom'webextension-polyfill'
And the type declaration will be added as:
constbrowser:typeofimport('webextension-polyfill')
Presets are provided as a shorthand for declaring imports from the same package:
presets:[{from:'vue',imports:['ref','reactive',// ...]}]
Will be equivalent as:
imports:[{name:'ref',from:'vue'},{name:'reactive',from:'vue'},// ...]
unimport
also provides some builtin presets for common libraries:
presets:['vue','pinia','vue-i18n',// ...]
You can check outsrc/presets
for all the options available or refer to the type declaration.
Sinceunimport
v0.7.0, we also support auto scanning the examples from a local installed package, for example:
presets:[{package:'h3',ignore:['isStream',/^[A-Z]/,/^[a-z]*$/,r=>r.length>8]}]
This will be expanded into:
imports:[{from:'h3',name:'appendHeader',},{from:'h3',name:'appendHeaders',},{from:'h3',name:'appendResponseHeader',},// ...]
Theignore
option is used to filter out the exports, it can be a string, regex or a function that returns a boolean.
By default, the result is strongly cached by the version of the package. You can disable this by settingcache: false
.
Unimport.vite({dts:true// or a path to generated file})
Unimport.vite({dirs:['./composables/*',]})
Scan for modules under./composables
and auto-import the named exports.
Unimport.vite({dirs:['./composables/**/*',{glob:'./composables/nested/**/*',types:false// disable scan the type declarations}]})
Named exports for modules under./composables/**/*
will be registered for auto imports, and filter out the types in./composables/nested/**/*
.
You can also provide custom options for directory scan, for example:
Unimport.vite({dirsScanOptions:{filePatterns:['*.ts'],// optional, default `['*.{ts,js,mjs,cjs,mts,cts}']`, glob patterns for matching filesfileFilter:file=>file.endsWith('.ts'),// optional, default `() => true`, filter filestypes:true,// optional, default `true`, enable/disable scan the type declarationscwd:process.cwd(),// optional, default `process.cwd()`, custom cwd for directory scan},dirs:['./composables/**/*',{glob:'./composables/nested/**/*',types:false}]})
You can opt-out auto-import for specific modules by adding a comment:
//@unimport-disable
It can be customized by settingcommentsDisable
:
Unimport.vite({commentsDisable:['@unimport-disable','@custom-imports-disable',]})
By default,unimport
uses RegExp to detect unimport entries. In some cases, RegExp might not be able to detect all the entries (false positive & false negative).
We introduced a new AST-based parser powered byacorn, providing a more accurate result. The limitation is when using Acorn, it assumes all input code are valid and vanilla JavaScript code.
Unimport.vite({parser:'acorn'})
In Vue's template, the usage of API is in a different context than plain modules. Thus some custom transformations are required. To enable it, setaddons.vueTemplate
totrue
:
Unimport.vite({addons:{vueTemplate:true}})
When auto-import a ref, inline operations won't be auto-unwrapped.
exportconstcounter=ref(0)
<template><!-- this is ok --><div>{{ counter }}</div><!-- counter here is a ref, this won't work, volar will throw --><div>{{ counter + 1 }}</div><!-- use this instead --><div>{{ counter.value + 1 }}</div></template>
We recommend usingVolar for type checking, which will help you to identify the misusage.
In Vue's template, the usage of directives is in a different context than plain modules. Thus some custom transformations are required. To enable it, setaddons.vueDirectives
totrue
:
Unimport.vite({addons:{vueDirectives:true}})
When including directives in your presets, you should:
- provide the corresponding imports with
meta.vueDirective
set totrue
, otherwise,unimport
will not be able to detect your directives. - use named exports for your directives, or use default export and use
as
in the Import. - set
dtsDisabled
totrue
if you provide a type declaration for your directives.
importtype{InlinePreset}from'unimport'import{defineUnimportPreset}from'unimport'exportconstcomposables=defineUnimportPreset({from:'my-unimport-library/composables',/* imports and other options */})exportconstdirectives=defineUnimportPreset({from:'my-unimport-library/directives',// disable dts generation globallydtsEnabled:false,// you can declare the vue directive globallymeta:{vueDirective:true},imports:[{name:'ClickOutside',// disable dts generation per importdtsEnabled:false,// you can declare the vue directive per importmeta:{vueDirective:true}},{name:'default',// you should declare `as` for default exportsas:'Focus'}]})
If you add a directory scan for your local directives in the project, you need to:
- provide
isDirective
in thevueDirectives
:unimport
will use it to detect them (will never be called for imports withmeta.vueDirective
set totrue
). - use always named exports for your directives.
Unimport.vite({dirs:['./directives/**'],addons:{vueDirectives:{isDirective:(normalizedImportFrom,_importEntry)=>{returnnormalizedImportFrom.includes('/directives/')}}}})
- Clone this repository
- EnableCorepack using
corepack enable
(usenpm i -g corepack
for Node.js < 16.10) - Install dependencies using
pnpm install
- Run interactive tests using
pnpm dev
Made with 💛
Published underMIT License.
About
Unified utils for auto importing APIs in modules.