Skip to content

Commit dcbdc38

Browse files
committed
New: Integrate plugin for environment variable replacement in build process
1 parent a383003 commit dcbdc38

File tree

12 files changed

+125
-0
lines changed

12 files changed

+125
-0
lines changed

packages/techor/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"dependencies": {
6969
"@rollup/plugin-commonjs": "^28.0.2",
7070
"@rollup/plugin-node-resolve": "^16.0.0",
71+
"@rollup/plugin-replace": "^6.0.2",
7172
"@swc/core": "^1.10.1",
7273
"@techor/extend": "workspace:^",
7374
"@techor/fs": "workspace:^",

packages/techor/src/commands/build.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import getWideExternal from '../utils/get-wide-external'
1717
import { BuildCommonOptions, Config, default as defaultConfig } from '../config'
1818
import yargsParser, { Options as YargsParserOptions } from 'yargs-parser'
1919
import loadConfig from '../load-config'
20+
import replace from '@rollup/plugin-replace'
2021

2122
// core plugins
2223
import esmShim from '../plugins/esm-shim'
@@ -97,6 +98,8 @@ export default async function build() {
9798
extendedBuild.minify = true
9899
}
99100
if (fileBasenameSplits.includes('global') || fileBasenameSplits.includes('iife')) extendedBuild.output.format = 'iife'
101+
extendedBuild.env = fileBasenameSplits.includes('development') ? 'development' : 'production'
102+
100103
for (const [eachInput, eachBuildOptions] of buildMap) {
101104
for (const eachOutputOptions of eachBuildOptions.outputOptionsList) {
102105
if (normalize(eachOutputOptions.output.file) === normalize(extendedBuild.output.file)) {
@@ -147,6 +150,10 @@ export default async function build() {
147150
}
148151
(buildOptions.input.plugins as RollupInputPluginOption[]).unshift(
149152
...[
153+
replace({
154+
preventAssignment: true,
155+
'process.env.NODE_ENV': JSON.stringify(extendedBuild.env)
156+
}),
150157
swc(extendedSWCOptions),
151158
config.build.commonjs && commonjs(config.build.commonjs),
152159
config.build.nodeResolve && nodeResolve(config.build.nodeResolve),
@@ -208,6 +215,8 @@ export default async function build() {
208215
case 'import':
209216
handleExports(eachUnknowExports, 'esm')
210217
break
218+
default:
219+
handleExports(eachUnknowExports, eachFormat)
211220
}
212221
}
213222
}

packages/techor/src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export interface BuildCommonOptions {
8282
external?: string[]
8383
tsconfig?: string
8484
formats?: RollupOutputOptions['format'][]
85+
env?: 'development' | 'production'
8586
}
8687

8788
export interface BuildOptions extends BuildCommonOptions {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "@test/env",
3+
"version": "1.0.0",
4+
"private": true,
5+
"files": [
6+
"dist"
7+
],
8+
"browser": "./dist/global.min.js",
9+
"exports": {
10+
".": {
11+
"import": {
12+
"development": "./dist/index.development.mjs",
13+
"default": "./dist/index.mjs"
14+
},
15+
"require": {
16+
"development": "./dist/index.development.cjs",
17+
"default": "./dist/index.cjs"
18+
}
19+
}
20+
}
21+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './index'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './index'
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import startDebug from './start-debug'
2+
3+
if (process.env.NODE_ENV === 'development') {
4+
startDebug()
5+
}
6+
7+
console.log('hello world')
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function startDebug() {
2+
console.log('start debug')
3+
}

packages/techor/tests/env/test.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { execSync } from 'node:child_process'
2+
import { readFileSync } from 'node:fs'
3+
import { join } from 'node:path'
4+
import dedent from 'ts-dedent'
5+
6+
beforeAll(() => {
7+
execSync('tsx ../../src/bin build', { cwd: __dirname })
8+
})
9+
10+
test('production', () => {
11+
expect(readFileSync(join(__dirname, './dist/index.cjs'), 'utf-8')).toBe(dedent`
12+
'use strict';
13+
14+
console.log('hello world');
15+
16+
`)
17+
expect(readFileSync(join(__dirname, './dist/index.mjs'), 'utf-8')).toBe(`console.log('hello world');\n`)
18+
expect(readFileSync(join(__dirname, './dist/global.min.js'), 'utf-8')).toBe(`console.log("hello world");\n`)
19+
})
20+
21+
test('development', () => {
22+
expect(readFileSync(join(__dirname, './dist/index.development.cjs'), 'utf-8')).toBe(dedent`
23+
'use strict';
24+
25+
function startDebug() {
26+
console.log('start debug');
27+
}
28+
29+
{
30+
startDebug();
31+
}
32+
console.log('hello world');
33+
34+
`)
35+
expect(readFileSync(join(__dirname, './dist/index.development.mjs'), 'utf-8')).toBe(dedent`
36+
function startDebug() {
37+
console.log('start debug');
38+
}
39+
40+
{
41+
startDebug();
42+
}
43+
console.log('hello world');
44+
45+
`)
46+
})
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"extends": "../../../../tsconfig.json",
3+
"compilerOptions": {
4+
"baseUrl": ".",
5+
"outDir": "dist",
6+
},
7+
"include": [
8+
"src/**/*"
9+
],
10+
"exclude": [
11+
"src/**/*.test.ts"
12+
]
13+
}

0 commit comments

Comments
 (0)