Skip to content

Commit

Permalink
feat: improve env support
Browse files Browse the repository at this point in the history
  • Loading branch information
pi0 committed Nov 21, 2020
1 parent 5534856 commit b60a52a
Show file tree
Hide file tree
Showing 12 changed files with 72 additions and 70 deletions.
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ const { alias, inject } = env(nodeless, {

- [node](./src/presets/node.ts)
- [nodeless](./src/presets/nodeless.ts)
- [vue2](./src/presets/vue2.ts)
- [vue3](./src/presets/vue3.ts)

## polyfills

Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"repository": "nuxt-contrib/un",
"license": "MIT",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"files": [
"dist",
"runtime"
Expand Down
37 changes: 30 additions & 7 deletions src/env.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,46 @@
import type { Preset, Environment } from './types'
import { resolveRuntime } from './utils'

export function env (...presets: Preset[]) {
const options: Environment = {
export function env (...presets: Preset[]): Environment {
const _env: Environment = {
alias: {},
inject: {},
polyfill: []
polyfill: [],
external: []
}

for (const preset of presets) {
// Alias
if (preset.alias) {
Object.assign(options.alias, preset.alias)
for (const from in preset.alias) {
_env.alias[from] = resolveRuntime(preset.alias[from])
}
}

// Inject
if (preset.inject) {
Object.assign(options.inject, preset.inject)
for (const global in preset.inject) {
if (Array.isArray(preset.inject[global])) {
const [id, ...path] = preset.inject[global]
_env.inject[global] = [resolveRuntime(id), ...path]
} else {
_env.inject[global] = resolveRuntime(preset.inject[global] as string)
}
}
}

// Polyfill
if (preset.polyfill) {
options.polyfill.push(...preset.polyfill)
_env.polyfill.push(
...(preset.polyfill.map(p => resolveRuntime(p)).filter(Boolean) as string[])
)
}

// External
if (preset.external) {
_env.external.push(...preset.external)
}
}

return options
return _env
}
2 changes: 0 additions & 2 deletions src/presets/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
export { default as node } from './node'
export { default as nodeless } from './nodeless'
export { default as vue2 } from './vue2'
export { default as vue3 } from './vue3'
11 changes: 7 additions & 4 deletions src/presets/node.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { r } from '../utils'

import { NodeBuiltinModules } from '../utils'
import type { Preset } from '../types'

export default {
alias: {
'node-fetch': require.resolve('node-fetch/lib/index.js')
'node-fetch': 'node-fetch/lib/index.js'
},

inject: {
Expand All @@ -15,6 +14,10 @@ export default {
},

polyfill: [
r('polyfill/fetch.node')
'un/polyfill/fetch.node'
],

external: [
...NodeBuiltinModules
]
} as Preset
30 changes: 15 additions & 15 deletions src/presets/nodeless.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
import { r, NodeBuiltinModules, mockAll } from '../utils'
import { NodeBuiltinModules, resolveAll } from '../utils'
import type { Preset } from '../types'

export default {
alias: {
...mockAll(NodeBuiltinModules),
...resolveAll(NodeBuiltinModules, 'un/mock/proxy'),

// Custom
http: r('node/http'),
process: r('polyfill/process'),
_process: require.resolve('process/browser.js'),
http: 'un/node/http',
process: 'un/polyfill/process',
_process: 'process/browser.js',

// Browserify
buffer: require.resolve('buffer/index.js'),
util: require.resolve('util/util.js'),
events: require.resolve('events/events.js'),
inherits: require.resolve('inherits/inherits_browser.js'),
buffer: 'buffer/index.js',
util: 'util/util.js',
events: 'events/events.js',
inherits: 'inherits/inherits_browser.js',

// npm
etag: r('mock/noop'),
'mime-db': r('npm/mime-db'),
mime: r('npm/mime'),
_mime: require.resolve('mime/lite.js')
etag: 'un/mock/noop',
'mime-db': 'un/npm/mime-db',
mime: 'un/npm/mime',
_mime: 'mime/lite.js'
},

inject: {
process: r('polyfill/process'),
process: 'un/polyfill/process',
Buffer: ['buffer', 'Buffer']
},

polyfill: [
r('polyfill/process')
'un/polyfill/process'
]
} as Preset
15 changes: 0 additions & 15 deletions src/presets/vue2.ts

This file was deleted.

13 changes: 0 additions & 13 deletions src/presets/vue3.ts

This file was deleted.

7 changes: 2 additions & 5 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ export interface Environment {
alias: { [key: string]: string }
inject: { [key: string]: string | string[] }
polyfill: string[]
external: string[]
}

export interface Preset {
alias?: { [key: string]: string }
inject?: { [key: string]: string | string[] }
polyfill?: string[]
}
export interface Preset extends Partial<Environment> {}
21 changes: 16 additions & 5 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Module } from 'module'
import { resolve, join } from 'upath'
import { resolve } from 'upath'

export const RUNTIME_DIR = resolve(__dirname, '../runtime')

Expand All @@ -9,10 +9,21 @@ export function mapArrToVal (val: any, arr: any[]) {
return arr.reduce((p, c) => ({ ...p, [c]: val }), {})
}

export function r (id: string) {
return require.resolve(join(RUNTIME_DIR, id))
export function tryResolve (id: string) : string | undefined {
try {
return require.resolve(id)
} catch (e) {
//
}
}

export function mockAll (packages: string[]) {
return mapArrToVal(r('mock/proxy'), packages)
export function resolveRuntime (id: string) {
if (id.startsWith('un/')) {
id = RUNTIME_DIR + id.substr(2)
}
return tryResolve(id) || id
}

export function resolveAll (packages: string[], id: string) {
return mapArrToVal(resolveRuntime(id), packages)
}
1 change: 0 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
"esModuleInterop": true,
"strict": true,
"declaration": true,
"outDir": "lib",
"types": [
"node"
]
Expand Down
2 changes: 1 addition & 1 deletion tsconfig.runtime.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "runtime",
"module": "CommonJS",
"module": "CommonJS"
},
"include": [
"src.runtime/**/*.ts"
Expand Down

0 comments on commit b60a52a

Please sign in to comment.