Skip to content

Commit 79ed288

Browse files
committed
fix(env-dir): propagate deploy env-dir into runtime entry
Co-Authored-By: Aiden
1 parent 3b8737c commit 79ed288

File tree

7 files changed

+48
-2
lines changed

7 files changed

+48
-2
lines changed

packages/solutions/app-tools/src/plugins/deploy/index.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { createNodePreset } from './platforms/node';
1111
import { createVercelPreset } from './platforms/vercel';
1212
import type { PluginAPI } from './types';
1313
import { getProjectUsage } from './utils';
14+
1415
type DeployPresetCreators = {
1516
node: typeof createNodePreset;
1617
vercel: typeof createVercelPreset;
@@ -32,6 +33,7 @@ async function getDeployPreset(
3233
modernConfig: AppToolsNormalizedConfig,
3334
deployTarget: DeployTarget,
3435
api: PluginAPI,
36+
envDir?: string,
3537
) {
3638
const { appDirectory, distDirectory, metaName } = appContext;
3739
const { useSSR, useAPI, useWebServer } = getProjectUsage(
@@ -49,13 +51,24 @@ async function getDeployPreset(
4951
);
5052
}
5153

52-
return createPreset({ appContext, modernConfig, needModernServer, api });
54+
return createPreset({
55+
appContext,
56+
modernConfig,
57+
needModernServer,
58+
api,
59+
envDir,
60+
});
5361
}
5462

5563
export default (): CliPlugin<AppTools> => ({
5664
name: '@modern-js/plugin-deploy',
5765
setup: api => {
5866
const deployTarget = process.env.MODERNJS_DEPLOY || provider || 'node';
67+
let deployEnvDir: string | undefined;
68+
69+
api.onBeforeDeploy(options => {
70+
deployEnvDir = options?.envDir;
71+
});
5972

6073
api.deploy(async () => {
6174
const appContext = api.getAppContext();
@@ -69,6 +82,7 @@ export default (): CliPlugin<AppTools> => ({
6982
modernConfig,
7083
deployTarget as DeployTarget,
7184
api,
85+
deployEnvDir,
7286
);
7387

7488
deployPreset?.prepare && (await deployPreset?.prepare());

packages/solutions/app-tools/src/plugins/deploy/platforms/netlify.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ async function cleanDistDirectory(dir: string) {
2424
export const createNetlifyPreset: CreatePreset = ({
2525
appContext,
2626
modernConfig,
27+
envDir,
2728
needModernServer,
2829
}) => {
2930
const { appDirectory, distDirectory, entrypoints, moduleType } = appContext;
@@ -102,6 +103,7 @@ export const createNetlifyPreset: CreatePreset = ({
102103
template,
103104
appContext,
104105
config: modernConfig,
106+
envDir,
105107
isESM: isEsmProject,
106108
});
107109

packages/solutions/app-tools/src/plugins/deploy/platforms/node.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export const createNodePreset: CreatePreset = ({
1313
appContext,
1414
modernConfig,
1515
api,
16+
envDir,
1617
}) => {
1718
const { appDirectory, distDirectory, moduleType } = appContext;
1819
const isEsmProject = moduleType === 'module';
@@ -36,6 +37,7 @@ export const createNodePreset: CreatePreset = ({
3637
template,
3738
appContext,
3839
config: modernConfig,
40+
envDir,
3941
isESM: isEsmProject,
4042
});
4143

packages/solutions/app-tools/src/plugins/deploy/platforms/platform.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ interface CreatePresetParams {
66
appContext: AppToolsContext;
77
modernConfig: AppToolsNormalizedConfig;
88
api: PluginAPI;
9+
envDir?: string;
910
needModernServer?: boolean;
1011
}
1112

packages/solutions/app-tools/src/plugins/deploy/platforms/vercel.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type { CreatePreset } from './platform';
99
export const createVercelPreset: CreatePreset = ({
1010
appContext,
1111
modernConfig,
12+
envDir,
1213
needModernServer,
1314
}) => {
1415
const { appDirectory, distDirectory, entrypoints, moduleType } = appContext;
@@ -110,6 +111,7 @@ export const createVercelPreset: CreatePreset = ({
110111
template,
111112
appContext,
112113
config: modernConfig,
114+
envDir,
113115
isESM: isEsmProject,
114116
});
115117

packages/solutions/app-tools/src/plugins/deploy/utils/generator.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,18 @@ export interface GenerateHandlerOptions {
6464
template: string;
6565
appContext: AppToolsContext;
6666
config: AppToolsNormalizedConfig;
67+
envDir?: string;
6768
serverConfig?: Partial<ProdServerOptions>;
6869
genAppContextTemplate?: typeof serverAppContextTemplate;
6970
genPluginImports?: typeof genPluginImportsCode;
7071
isESM?: boolean;
7172
}
73+
7274
export const generateHandler = async ({
7375
template,
7476
appContext,
7577
config,
78+
envDir,
7679
serverConfig: modifyServerConfig,
7780
genAppContextTemplate = serverAppContextTemplate,
7881
genPluginImports = genPluginImportsCode,
@@ -104,6 +107,7 @@ export const generateHandler = async ({
104107
const pluginImportCode = genPluginImports(plugins || [], Boolean(isESM));
105108
const dynamicProdOptions = {
106109
config: serverConfig,
110+
envDir,
107111
};
108112

109113
const serverConfigPath = getServerConfigPath(meta);

tests/integration/env-dir/tests/index.test.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { existsSync, rmSync } from 'fs';
1+
import { existsSync, readFileSync, rmSync } from 'fs';
22
import path from 'path';
33
import puppeteer, { type Browser, type Page } from 'puppeteer';
44
import {
@@ -151,12 +151,33 @@ describe('test env-dir deploy', () => {
151151
stderr: true,
152152
env: {
153153
NODE_ENV: 'production',
154+
MODERNJS_DEPLOY: 'node',
154155
},
155156
});
156157

157158
expect(deployRes.code).toBe(0);
158159
expect(existsSync(envDirEnvPath)).toBe(true);
159160
});
161+
162+
test('should inject env-dir into deployed output runtime options', async () => {
163+
const deployRes = await runModernCommand(['deploy', '--env-dir', './env'], {
164+
cwd: appDir,
165+
stdout: true,
166+
stderr: true,
167+
env: {
168+
NODE_ENV: 'production',
169+
MODERNJS_DEPLOY: 'node',
170+
},
171+
});
172+
173+
expect(deployRes.code).toBe(0);
174+
175+
const entryCode = readFileSync(
176+
path.join(appDir, '.output', 'index.js'),
177+
'utf-8',
178+
);
179+
expect(entryCode.includes('"envDir":"./env"')).toBe(true);
180+
});
160181
});
161182

162183
describe('test env-dir option precedence', () => {

0 commit comments

Comments
 (0)