Skip to content

Commit

Permalink
feat: add unloader framework
Browse files Browse the repository at this point in the history
  • Loading branch information
sxzz committed Feb 11, 2025
1 parent de0ea62 commit ca8a2b0
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 1 deletion.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
"simple-git-hooks": "^2.11.1",
"tsdown": "^0.5.7",
"typescript": "~5.7.3",
"unloader": "^0.2.2",
"unplugin": "workspace:*",
"vite": "^6.0.11",
"vitest": "^3.0.5",
Expand Down
30 changes: 30 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/define.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { getFarmPlugin } from './farm'
import { getRolldownPlugin } from './rolldown'
import { getRollupPlugin } from './rollup'
import { getRspackPlugin } from './rspack'
import { getUnloaderPlugin } from './unloader'
import { getVitePlugin } from './vite'
import { getWebpackPlugin } from './webpack'

Expand Down Expand Up @@ -33,6 +34,9 @@ export function createUnplugin<UserOptions, Nested extends boolean = boolean>(
get farm() {
return getFarmPlugin(factory)
},
get unloader() {
return getUnloaderPlugin(factory)
},
get raw() {
return factory
},
Expand Down Expand Up @@ -81,3 +85,9 @@ export function createFarmPlugin<UserOptions, Nested extends boolean = boolean>(
): UnpluginInstance<UserOptions>['farm'] {
return getFarmPlugin(factory)
}

export function createUnloaderPlugin<UserOptions, Nested extends boolean = boolean>(
factory: UnpluginFactory<UserOptions, Nested>,
): UnpluginInstance<UserOptions>['unloader'] {
return getUnloaderPlugin(factory)
}
6 changes: 5 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { Compilation as RspackCompilation, Compiler as RspackCompiler, Load
import type { BuildOptions, Plugin as EsbuildPlugin, Loader, PluginBuild } from 'esbuild'
import type { Plugin as RolldownPlugin } from 'rolldown'
import type { AstNode, EmittedAsset, PluginContextMeta as RollupContextMeta, Plugin as RollupPlugin, SourceMapInput } from 'rollup'
import type { Plugin as UnloaderPlugin } from 'unloader'
import type { Plugin as VitePlugin } from 'vite'
import type { Compilation as WebpackCompilation, Compiler as WebpackCompiler, LoaderContext as WebpackLoaderContext, WebpackPluginInstance } from 'webpack'
import type VirtualModulesPlugin from 'webpack-virtual-modules'
Expand All @@ -13,6 +14,7 @@ export type {
RollupPlugin,
RspackCompiler,
RspackPluginInstance,
UnloaderPlugin,
VitePlugin,
WebpackCompiler,
WebpackPluginInstance,
Expand Down Expand Up @@ -90,6 +92,7 @@ export interface UnpluginOptions {
webpack?: (compiler: WebpackCompiler) => void
rspack?: (compiler: RspackCompiler) => void
vite?: Partial<VitePlugin>
unloader?: Partial<UnloaderPlugin>
rolldown?: Partial<RolldownPlugin>
esbuild?: {
// using regexp in esbuild improves performance
Expand Down Expand Up @@ -124,12 +127,13 @@ export interface UnpluginInstance<UserOptions, Nested extends boolean = boolean>
webpack: UnpluginFactoryOutput<UserOptions, WebpackPluginInstance>
rspack: UnpluginFactoryOutput<UserOptions, RspackPluginInstance>
esbuild: UnpluginFactoryOutput<UserOptions, EsbuildPlugin>
unloader: UnpluginFactoryOutput<UserOptions, Nested extends true ? Array<UnloaderPlugin> : UnloaderPlugin>
farm: UnpluginFactoryOutput<UserOptions, FarmPlugin>
raw: UnpluginFactory<UserOptions, Nested>
}

export type UnpluginContextMeta = Partial<RollupContextMeta> & ({
framework: 'rollup' | 'vite' | 'rolldown' | 'farm'
framework: 'rollup' | 'vite' | 'rolldown' | 'farm' | 'unloader'
} | {
framework: 'webpack'
webpack: { compiler: WebpackCompiler }
Expand Down
24 changes: 24 additions & 0 deletions src/unloader/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import type { UnloaderPlugin, UnpluginContextMeta, UnpluginFactory, UnpluginInstance } from '../types'
import { toRollupPlugin } from '../rollup'
import { toArray } from '../utils/general'

export function getUnloaderPlugin<UserOptions = Record<string, never>, Nested extends boolean = boolean>(
factory: UnpluginFactory<UserOptions, Nested>,
) {
return ((userOptions?: UserOptions) => {
const meta: UnpluginContextMeta = {
framework: 'unloader',
}
const rawPlugins = toArray(factory(userOptions!, meta))

const plugins = rawPlugins.map((rawPlugin) => {
const plugin = toRollupPlugin(rawPlugin, false) as UnloaderPlugin
if (rawPlugin.unloader)
Object.assign(plugin, rawPlugin.unloader)

return plugin
})

return plugins.length === 1 ? plugins[0] : plugins
}) as UnpluginInstance<UserOptions, Nested>['unloader']
}

0 comments on commit ca8a2b0

Please sign in to comment.