diff --git a/.changeset/late-squids-juggle.md b/.changeset/late-squids-juggle.md new file mode 100644 index 000000000..7006ffb3e --- /dev/null +++ b/.changeset/late-squids-juggle.md @@ -0,0 +1,5 @@ +--- +"@callstack/repack": major +--- + +Deprecate `getPublicPath` utility. The `getPublicPath` function is now a no-op marked as deprecated, while public path configuration is handled automatically under the hood. diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index bb0423a9c..81f0bc25c 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -43,7 +43,6 @@ export default (env) => { path: path.join(context, 'build/generated', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'tester-app', }, optimization: { diff --git a/apps/tester-app/webpack.config.mjs b/apps/tester-app/webpack.config.mjs index f56ffba22..1dde17f56 100644 --- a/apps/tester-app/webpack.config.mjs +++ b/apps/tester-app/webpack.config.mjs @@ -49,7 +49,6 @@ export default (env) => { path: path.join(dirname, 'build/generated', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'tester-app', }, optimization: { diff --git a/apps/tester-federation-v2/configs/rspack.host-app.mjs b/apps/tester-federation-v2/configs/rspack.host-app.mjs index a129686ed..526f56e68 100644 --- a/apps/tester-federation-v2/configs/rspack.host-app.mjs +++ b/apps/tester-federation-v2/configs/rspack.host-app.mjs @@ -36,7 +36,6 @@ export default (env) => { path: path.join(dirname, 'build', 'host-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MF2Tester-HostApp', }, optimization: { diff --git a/apps/tester-federation-v2/configs/rspack.mini-app.mjs b/apps/tester-federation-v2/configs/rspack.mini-app.mjs index f3a0a1bb7..4928619f8 100644 --- a/apps/tester-federation-v2/configs/rspack.mini-app.mjs +++ b/apps/tester-federation-v2/configs/rspack.mini-app.mjs @@ -33,7 +33,6 @@ export default (env) => { path: path.join(dirname, 'build', 'mini-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MF2Tester-MiniApp', }, optimization: { @@ -98,7 +97,6 @@ export default (env) => { './MiniAppNavigator': './src/mini/navigation/MainNavigator', }, dts: false, - getPublicPath: `return "http://localhost:8082/${platform}/"`, shared: { react: { singleton: true, diff --git a/apps/tester-federation-v2/configs/webpack.host-app.mjs b/apps/tester-federation-v2/configs/webpack.host-app.mjs index fafafdcb8..55fcec767 100644 --- a/apps/tester-federation-v2/configs/webpack.host-app.mjs +++ b/apps/tester-federation-v2/configs/webpack.host-app.mjs @@ -38,7 +38,6 @@ export default (env) => { path: path.join(dirname, 'build', 'host-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MF2Tester-HostApp', }, optimization: { diff --git a/apps/tester-federation-v2/configs/webpack.mini-app.mjs b/apps/tester-federation-v2/configs/webpack.mini-app.mjs index 4270d3ac2..7a300a6bc 100644 --- a/apps/tester-federation-v2/configs/webpack.mini-app.mjs +++ b/apps/tester-federation-v2/configs/webpack.mini-app.mjs @@ -35,7 +35,6 @@ export default (env) => { path: path.join(dirname, 'build', 'mini-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MF2Tester-MiniApp', }, optimization: { @@ -79,7 +78,6 @@ export default (env) => { './MiniAppNavigator': './src/mini/navigation/MainNavigator', }, dts: false, - getPublicPath: `return "http://localhost:8082/${platform}/"`, shared: { react: { singleton: true, diff --git a/apps/tester-federation/configs/rspack.host-app.mjs b/apps/tester-federation/configs/rspack.host-app.mjs index b7744c594..1274429ed 100644 --- a/apps/tester-federation/configs/rspack.host-app.mjs +++ b/apps/tester-federation/configs/rspack.host-app.mjs @@ -38,7 +38,6 @@ export default (env) => { path: path.join(dirname, 'build', 'host-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MFTester-HostApp', }, optimization: { diff --git a/apps/tester-federation/configs/rspack.mini-app.mjs b/apps/tester-federation/configs/rspack.mini-app.mjs index 6d1cd0497..c4174eeba 100644 --- a/apps/tester-federation/configs/rspack.mini-app.mjs +++ b/apps/tester-federation/configs/rspack.mini-app.mjs @@ -35,7 +35,6 @@ export default (env) => { path: path.join(dirname, 'build', 'mini-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MFTester-MiniApp', }, optimization: { diff --git a/apps/tester-federation/configs/webpack.host-app.mjs b/apps/tester-federation/configs/webpack.host-app.mjs index 8cdfa0401..82a31bf1d 100644 --- a/apps/tester-federation/configs/webpack.host-app.mjs +++ b/apps/tester-federation/configs/webpack.host-app.mjs @@ -38,7 +38,6 @@ export default (env) => { path: path.join(dirname, 'build', 'host-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MFTester-HostApp', }, optimization: { diff --git a/apps/tester-federation/configs/webpack.mini-app.mjs b/apps/tester-federation/configs/webpack.mini-app.mjs index 3d51ee1c6..ab4b3a36a 100644 --- a/apps/tester-federation/configs/webpack.mini-app.mjs +++ b/apps/tester-federation/configs/webpack.mini-app.mjs @@ -35,7 +35,6 @@ export default (env) => { path: path.join(dirname, 'build', 'mini-app', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), uniqueName: 'MFTester-MiniApp', }, optimization: { diff --git a/packages/repack/src/commands/common/config/getRepackConfig.ts b/packages/repack/src/commands/common/config/getRepackConfig.ts new file mode 100644 index 000000000..340e68117 --- /dev/null +++ b/packages/repack/src/commands/common/config/getRepackConfig.ts @@ -0,0 +1,7 @@ +export function getRepackConfig() { + return { + output: { + publicPath: 'noop:///', + }, + }; +} diff --git a/packages/repack/src/commands/common/config/makeCompilerConfig.ts b/packages/repack/src/commands/common/config/makeCompilerConfig.ts index a836cb4a7..d3f3d9668 100644 --- a/packages/repack/src/commands/common/config/makeCompilerConfig.ts +++ b/packages/repack/src/commands/common/config/makeCompilerConfig.ts @@ -8,6 +8,7 @@ import { getCliOverrides } from './getCliOverrides.js'; import { getCommandConfig } from './getCommandConfig.js'; import { getConfigFilePath } from './getConfigFilePath.js'; import { getEnvOptions } from './getEnvOptions.js'; +import { getRepackConfig } from './getRepackConfig.js'; import { loadProjectConfig } from './loadProjectConfig.js'; import { normalizeConfig } from './normalizeConfig.js'; @@ -40,6 +41,9 @@ export async function makeCompilerConfig( // get defaults for use with specific commands const commandConfig = getCommandConfig(command); + // get defaults that will be applied on top of built-in ones (Rspack/webpack) + const repackConfig = getRepackConfig(); + // load the project config const rawConfig = await loadProjectConfig(configPath); @@ -52,7 +56,7 @@ export async function makeCompilerConfig( // merge in reverse order to create final configs const configs = normalizedConfigs.map((config) => - merge([commandConfig, config, cliConfigOverrides]) + merge([repackConfig, commandConfig, config, cliConfigOverrides]) ); return configs as C[]; diff --git a/packages/repack/src/commands/common/config/normalizeConfig.ts b/packages/repack/src/commands/common/config/normalizeConfig.ts index ec81ae17e..1c403b467 100644 --- a/packages/repack/src/commands/common/config/normalizeConfig.ts +++ b/packages/repack/src/commands/common/config/normalizeConfig.ts @@ -17,6 +17,11 @@ export async function normalizeConfig( /* normalize compiler name to be equal to platform */ configObject.name = env.platform; + /* unset public path if it's using the deprecated `getPublicPath` function */ + if (configObject.output?.publicPath === 'DEPRECATED_GET_PUBLIC_PATH') { + configObject.output.publicPath = undefined; + } + /* return the normalized config object */ return configObject; } diff --git a/packages/repack/src/commands/types.ts b/packages/repack/src/commands/types.ts index 906b663e5..c6af3d17d 100644 --- a/packages/repack/src/commands/types.ts +++ b/packages/repack/src/commands/types.ts @@ -64,7 +64,8 @@ type ConfigKeys = | 'mode' | 'devServer' | 'entry' - | 'optimization'; + | 'optimization' + | 'output'; export type ConfigurationObject = Partial>; diff --git a/packages/repack/src/plugins/DevelopmentPlugin.ts b/packages/repack/src/plugins/DevelopmentPlugin.ts index cb14e10db..e65bd2418 100644 --- a/packages/repack/src/plugins/DevelopmentPlugin.ts +++ b/packages/repack/src/plugins/DevelopmentPlugin.ts @@ -88,17 +88,25 @@ export class DevelopmentPlugin implements RspackPluginInstance { const [majorVersion, minorVersion, patchVersion] = reactNativePackageJson.version.split('-')[0].split('.'); + const host = this.config.devServer.host || 'localhost'; + const port = this.config.devServer.port; + const protocol = this.config.devServer.https ? 'https' : 'http'; + const platform = this.config.platform; + new compiler.webpack.DefinePlugin({ __PLATFORM__: JSON.stringify(this.config.platform), - __PUBLIC_PROTOCOL__: this.config.devServer.https ? '"https"' : '"http"', - __PUBLIC_HOST__: JSON.stringify(this.config.devServer.host), - __PUBLIC_PORT__: Number(this.config.devServer.port), + __PUBLIC_PROTOCOL__: JSON.stringify(protocol), + __PUBLIC_HOST__: JSON.stringify(host), + __PUBLIC_PORT__: Number(port), __REACT_NATIVE_MAJOR_VERSION__: Number(majorVersion), __REACT_NATIVE_MINOR_VERSION__: Number(minorVersion), __REACT_NATIVE_PATCH_VERSION__: Number(patchVersion), }).apply(compiler); - // Enforce output filenames in development mode + // set public path for development with dev server + compiler.options.output.publicPath = `${protocol}://${host}:${port}/${platform}/`; + + // enforce output filenames in development mode compiler.options.output.filename = (pathData) => pathData.chunk?.name === 'main' ? 'index.bundle' : '[name].bundle'; compiler.options.output.chunkFilename = '[name].chunk.bundle'; diff --git a/packages/repack/src/utils/getPublicPath.ts b/packages/repack/src/utils/getPublicPath.ts index ee784e1ca..54254cbc1 100644 --- a/packages/repack/src/utils/getPublicPath.ts +++ b/packages/repack/src/utils/getPublicPath.ts @@ -1,46 +1,13 @@ -import type { DevServerOptions } from '../types.js'; - -/** {@link getPublicPath} options. */ -export interface GetPublicPathOptions { - /** Target application platform. */ - platform: string; - - /** Development server configuration options. */ - devServer?: DevServerOptions; -} - /** - * Get Webpack's public path. - * - * @param options Options object. - * @returns Value for Webpack's `output.publicPath` option. - * - * @category Webpack util - * - * @example Usage in Webpack config: - * ```ts - * import * as Repack from '@callstack/repack'; - * - * export default (env) => { - * const { - * platform, - * devServer = undefined, - * } = env; + * @deprecated Since Re.Pack v5.0.0. * - * return { - * output: { - * publicPath: Repack.getPublicPath({ platform, devServer }), - * }, - * }; - * }; - * ``` + * You can safely remove this function call - + * the public path configuration is now automatically handled by Re.Pack with the same behavior. */ -export function getPublicPath(options?: GetPublicPathOptions) { - if (options?.devServer) { - const { port, host, https } = options.devServer; - return `${https ? 'https' : 'http'}://${host || 'localhost'}:${port}/${ - options.platform - }/`; - } - return 'noop:///'; +export function getPublicPath() { + console.warn( + '[NOTICE] `getPublicPath` is deprecated since Re.Pack v5.0.0.\n' + + 'You can safely remove this function call - the public path configuration is now automatically handled by Re.Pack with the same behavior.' + ); + return 'DEPRECATED_GET_PUBLIC_PATH'; } diff --git a/templates_v5/rspack.config.cjs b/templates_v5/rspack.config.cjs index 0b49b5e69..c51a76408 100644 --- a/templates_v5/rspack.config.cjs +++ b/templates_v5/rspack.config.cjs @@ -74,7 +74,6 @@ module.exports = (env) => { path: path.join(__dirname, 'build/generated', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), }, /** Configures optimization of the built bundle. */ optimization: { diff --git a/templates_v5/rspack.config.mjs b/templates_v5/rspack.config.mjs index d1cd0844d..9a65f66dd 100644 --- a/templates_v5/rspack.config.mjs +++ b/templates_v5/rspack.config.mjs @@ -78,7 +78,6 @@ export default (env) => { path: path.join(dirname, 'build/generated', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), }, /** Configures optimization of the built bundle. */ optimization: { diff --git a/templates_v5/webpack.config.cjs b/templates_v5/webpack.config.cjs index d1d075c5f..e7f662303 100644 --- a/templates_v5/webpack.config.cjs +++ b/templates_v5/webpack.config.cjs @@ -90,7 +90,6 @@ module.exports = (env) => { path: path.join(__dirname, 'build/generated', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), }, /** * Configures optimization of the built bundle. diff --git a/templates_v5/webpack.config.mjs b/templates_v5/webpack.config.mjs index 58eced5ae..a541b18c2 100644 --- a/templates_v5/webpack.config.mjs +++ b/templates_v5/webpack.config.mjs @@ -89,7 +89,6 @@ export default (env) => { path: path.join(dirname, 'build/generated', platform), filename: 'index.bundle', chunkFilename: '[name].chunk.bundle', - publicPath: Repack.getPublicPath({ platform, devServer }), }, /** * Configures optimization of the built bundle. diff --git a/website/src/5.x/api/utils/_meta.json b/website/src/5.x/api/utils/_meta.json index 6549e8564..772e478c7 100644 --- a/website/src/5.x/api/utils/_meta.json +++ b/website/src/5.x/api/utils/_meta.json @@ -3,6 +3,5 @@ "get-asset-extension-regexp", "get-dirname", "get-module-paths", - "get-public-path", "get-resolve-options" ] diff --git a/website/src/5.x/api/utils/get-public-path.md b/website/src/5.x/api/utils/get-public-path.md deleted file mode 100644 index 12f8aa398..000000000 --- a/website/src/5.x/api/utils/get-public-path.md +++ /dev/null @@ -1,42 +0,0 @@ -# getPublicPath - -Get Rspack/webpack public path value based on the provided configuration. Returns a URL for development server or a noop URL for production builds. - -## Parameters - -```ts -type GetPublicPath = (options?: { - platform: string; - devServer?: DevServerOptions; -}) => string; -``` - -### options.platform - -- Type: `string` -- Required: `true` - -Target application platform. - -### options.devServer - -- Type: `DevServerOptions` -- Required: `false` - -Development server configuration options. - -## Example - -```js title=rspack.config.cjs -const Repack = require("@callstack/repack"); - -module.exports = (env) => { - const { platform, devServer = undefined } = env; - - return { - output: { - publicPath: Repack.getPublicPath({ platform, devServer }), - }, - }; -}; -```