From 09bb3a4af08899eb2660bdd8f83230d4e9d0a1fc Mon Sep 17 00:00:00 2001 From: Ming <527990618@163.com> Date: Fri, 20 Sep 2024 15:00:24 +0800 Subject: [PATCH] feat(deploy): support server plugin options for deploy --- .changeset/mighty-candles-retire.md | 6 ++++++ .../src/plugins/deploy/platforms/netlify.ts | 19 +++++++++++-------- .../src/plugins/deploy/platforms/node.ts | 19 +++++++++++-------- .../src/plugins/deploy/platforms/vercel.ts | 19 +++++++++++-------- .../app-tools/src/plugins/deploy/utils.ts | 18 +++++++++++++----- 5 files changed, 52 insertions(+), 29 deletions(-) create mode 100644 .changeset/mighty-candles-retire.md diff --git a/.changeset/mighty-candles-retire.md b/.changeset/mighty-candles-retire.md new file mode 100644 index 000000000000..3d5041fd6357 --- /dev/null +++ b/.changeset/mighty-candles-retire.md @@ -0,0 +1,6 @@ +--- +'@modern-js/app-tools': patch +--- + +feat(deploy): support server plugin options for deploy +feat(deploy): 支持生产环境消费 server 插件配置 diff --git a/packages/solutions/app-tools/src/plugins/deploy/platforms/netlify.ts b/packages/solutions/app-tools/src/plugins/deploy/platforms/netlify.ts index 209d6974ca4a..c2b339bdb51e 100644 --- a/packages/solutions/app-tools/src/plugins/deploy/platforms/netlify.ts +++ b/packages/solutions/app-tools/src/plugins/deploy/platforms/netlify.ts @@ -6,7 +6,12 @@ import { } from '@modern-js/utils'; import { isMainEntry } from '../../../utils/routes'; import { handleDependencies } from '../dependencies'; -import { genPluginImportsCode, serverAppContenxtTemplate } from '../utils'; +import { + type PluginItem, + genPluginImportsCode, + getPluginsCode, + serverAppContenxtTemplate, +} from '../utils'; import type { CreatePreset } from './platform'; async function cleanDistDirectory(dir: string) { @@ -39,8 +44,10 @@ export const createNetlifyPreset: CreatePreset = ( const isEsmProject = moduleType === 'module'; - // TODO: support serverPlugin apply options. - const plugins = serverPlugins.map(plugin => plugin.name); + const plugins: PluginItem[] = serverPlugins.map(plugin => [ + plugin.name, + plugin.options, + ]); const netlifyOutput = path.join(appDirectory, '.netlify'); const funcsDirectory = path.join(netlifyOutput, 'functions'); @@ -118,11 +125,7 @@ export const createNetlifyPreset: CreatePreset = ( serverConfigFile: DEFAULT_SERVER_CONFIG, }; - const pluginsCode = `[${plugins - .map((plugin, index) => { - return `plugin_${index}()`; - }) - .join(',')}]`; + const pluginsCode = getPluginsCode(plugins); let handlerCode = ( await fse.readFile(path.join(__dirname, './netlify-handler.js')) diff --git a/packages/solutions/app-tools/src/plugins/deploy/platforms/node.ts b/packages/solutions/app-tools/src/plugins/deploy/platforms/node.ts index 7c8018bdd893..a953b0a2dc2d 100644 --- a/packages/solutions/app-tools/src/plugins/deploy/platforms/node.ts +++ b/packages/solutions/app-tools/src/plugins/deploy/platforms/node.ts @@ -6,15 +6,22 @@ import { fs as fse, } from '@modern-js/utils'; import { handleDependencies } from '../dependencies'; -import { genPluginImportsCode, serverAppContenxtTemplate } from '../utils'; +import { + type PluginItem, + genPluginImportsCode, + getPluginsCode, + serverAppContenxtTemplate, +} from '../utils'; import type { CreatePreset } from './platform'; export const createNodePreset: CreatePreset = (appContext, config) => { const { appDirectory, distDirectory, serverPlugins, moduleType } = appContext; const isEsmProject = moduleType === 'module'; - // TODO: support serverPlugin apply options. - const plugins = serverPlugins.map(plugin => plugin.name); + const plugins: PluginItem[] = serverPlugins.map(plugin => [ + plugin.name, + plugin.options, + ]); const outputDirectory = path.join(appDirectory, '.output'); const staticDirectory = path.join(outputDirectory, 'static'); @@ -47,11 +54,7 @@ export const createNodePreset: CreatePreset = (appContext, config) => { serverConfigFile: DEFAULT_SERVER_CONFIG, }; - const pluginsCode = `[${plugins - .map((plugin, index) => { - return `plugin_${index}()`; - }) - .join(',')}]`; + const pluginsCode = getPluginsCode(plugins); let entryCode = ( await fse.readFile(path.join(__dirname, './node-entry.js')) diff --git a/packages/solutions/app-tools/src/plugins/deploy/platforms/vercel.ts b/packages/solutions/app-tools/src/plugins/deploy/platforms/vercel.ts index cf1cfc9734dd..99b8d5fad433 100644 --- a/packages/solutions/app-tools/src/plugins/deploy/platforms/vercel.ts +++ b/packages/solutions/app-tools/src/plugins/deploy/platforms/vercel.ts @@ -6,7 +6,12 @@ import { } from '@modern-js/utils'; import { isMainEntry } from '../../../utils/routes'; import { handleDependencies } from '../dependencies'; -import { genPluginImportsCode, serverAppContenxtTemplate } from '../utils'; +import { + type PluginItem, + genPluginImportsCode, + getPluginsCode, + serverAppContenxtTemplate, +} from '../utils'; import type { CreatePreset } from './platform'; export const createVercelPreset: CreatePreset = ( @@ -23,8 +28,10 @@ export const createVercelPreset: CreatePreset = ( } = appContext; const isEsmProject = moduleType === 'module'; - // TODO: support serverPlugin apply options. - const plugins = serverPlugins.map(plugin => plugin.name); + const plugins: PluginItem[] = serverPlugins.map(plugin => [ + plugin.name, + plugin.options, + ]); const vercelOutput = path.join(appDirectory, '.vercel'); const outputDirectory = path.join(vercelOutput, 'output'); @@ -125,11 +132,7 @@ export const createVercelPreset: CreatePreset = ( serverConfigFile: DEFAULT_SERVER_CONFIG, }; - const pluginsCode = `[${plugins - .map((plugin, index) => { - return `plugin_${index}()`; - }) - .join(',')}]`; + const pluginsCode = getPluginsCode(plugins || []); const serverAppContext = serverAppContenxtTemplate(appContext); diff --git a/packages/solutions/app-tools/src/plugins/deploy/utils.ts b/packages/solutions/app-tools/src/plugins/deploy/utils.ts index 154b653b3a69..e98075c9ede7 100644 --- a/packages/solutions/app-tools/src/plugins/deploy/utils.ts +++ b/packages/solutions/app-tools/src/plugins/deploy/utils.ts @@ -35,20 +35,28 @@ export const serverAppContenxtTemplate = (appContext: IAppContext) => { }; }; -export const getPluginsCode = (plugins: string[]) => - `[${plugins.map((_, index) => `plugin_${index}()`).join(',')}]`; +export type PluginItem = [string, Record | undefined]; -export const genPluginImportsCode = (plugins: string[]) => { +export const genPluginImportsCode = (plugins: PluginItem[]) => { return plugins .map( - (plugin, index) => ` - let plugin_${index} = require('${plugin}') + ([name, options], index) => ` + let plugin_${index} = require('${name}') plugin_${index} = plugin_${index}.default || plugin_${index} `, ) .join(';\n'); }; +export const getPluginsCode = (plugins: PluginItem[]) => { + return `[${plugins + .map( + ([, options], index) => + `plugin_${index}(${options ? JSON.stringify(options) : ''})`, + ) + .join(',')}]`; +}; + export const getProjectUsage = ( appDirectory: string, distDirectory: string,