From 58ee26b90c3bac5197d2c2fd4a5e885854d682bd Mon Sep 17 00:00:00 2001 From: Cezar Augusto Date: Mon, 16 Sep 2024 04:31:07 -0300 Subject: [PATCH 1/4] Extend extension.config.js to handle browsers and commands --- .../content/ContentApp.tsx | 8 +++- .../extension.config.js | 43 ++++++++++------- .../content-extension-config/images/logo.svg | 9 ---- .../content-extension-config/images/react.png | Bin 0 -> 76583 bytes .../content-extension-config/package.json | 1 - .../commands/commands-lib/config-types.ts | 8 ++++ .../commands-lib/get-extension-config.ts | 44 +++++++++++++++++- programs/develop/plugin-browsers/index.ts | 14 ++++-- .../run-chromium/browser-config.ts | 2 +- .../run-chromium/create-profile.ts | 26 +++++------ .../plugin-browsers/run-chromium/index.ts | 1 + .../run-firefox/firefox/browser-config.ts | 19 +++----- .../run-firefox/firefox/create-profile.ts | 30 ++++++++---- .../plugin-browsers/run-firefox/index.ts | 19 +++++--- programs/develop/webpack/dev-server.ts | 7 ++- programs/develop/webpack/lib/messages.ts | 2 +- 16 files changed, 153 insertions(+), 80 deletions(-) delete mode 100644 examples/content-extension-config/images/logo.svg create mode 100644 examples/content-extension-config/images/react.png diff --git a/examples/content-extension-config/content/ContentApp.tsx b/examples/content-extension-config/content/ContentApp.tsx index 0fb6dc1a..245ca43e 100644 --- a/examples/content-extension-config/content/ContentApp.tsx +++ b/examples/content-extension-config/content/ContentApp.tsx @@ -1,5 +1,5 @@ import React from 'react' -import ReactLogo from '../images/logo.svg' +import reactLogo from '../images/react.png' import tailwindBg from '../images/tailwind_bg.png' import typescriptLogo from '../images/typescript.png' import tailwindLogo from '../images/tailwind.png' @@ -38,7 +38,11 @@ export default function ContentApp() {
- + React logo
+
TypeScript logo { - config.module.rules.push( - { - test: /\.svg$/i, - type: 'asset', - // *.svg?url - resourceQuery: /url/ - }, - { - test: /\.svg$/i, - issuer: /\.[jt]sx?$/, - // exclude react component if *.svg?url - resourceQuery: {not: [/url/]}, - use: ['@svgr/webpack'] - } - ) - - return config + browsers: { + chrome: { + startingUrl: 'https://extension.js.org' + }, + firefox: { + startingUrl: 'about:debugging#/runtime/this-firefox' + } + }, + commands: { + dev: { + browser: 'firefox', + polyfill: true + }, + start: { + browser: 'firefox', + polyfill: true + }, + preview: { + browser: 'firefox', + polyfill: true + }, + build: { + browser: 'firefox', + polyfill: true + } } } diff --git a/examples/content-extension-config/images/logo.svg b/examples/content-extension-config/images/logo.svg deleted file mode 100644 index ea77a618..00000000 --- a/examples/content-extension-config/images/logo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - React Logo - - - - - - - diff --git a/examples/content-extension-config/images/react.png b/examples/content-extension-config/images/react.png new file mode 100644 index 0000000000000000000000000000000000000000..9080fddd75c66f404c371a3286d85d50411a917a GIT binary patch literal 76583 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 literal 0 HcmV?d00001 diff --git a/examples/content-extension-config/package.json b/examples/content-extension-config/package.json index 2d68c29a..29f0235b 100644 --- a/examples/content-extension-config/package.json +++ b/examples/content-extension-config/package.json @@ -15,7 +15,6 @@ "url": "https://cezaraugusto.com" }, "dependencies": { - "@svgr/webpack": "^8.1.0", "react": "^18.1.0", "react-dom": "^18.1.0", "tailwindcss": "^3.4.1" diff --git a/programs/develop/commands/commands-lib/config-types.ts b/programs/develop/commands/commands-lib/config-types.ts index 41b53771..fd616335 100644 --- a/programs/develop/commands/commands-lib/config-types.ts +++ b/programs/develop/commands/commands-lib/config-types.ts @@ -1,5 +1,13 @@ import {Configuration} from 'webpack' +import {DevOptions} from '../dev' +import {StartOptions} from '../start' +import {PreviewOptions} from '../preview' +import {BuildOptions} from '../build' export interface FileConfig { + dev: DevOptions + start: StartOptions + preview: PreviewOptions + build: BuildOptions config: (config: Configuration) => Configuration } diff --git a/programs/develop/commands/commands-lib/get-extension-config.ts b/programs/develop/commands/commands-lib/get-extension-config.ts index 168aaff7..d28a26c4 100644 --- a/programs/develop/commands/commands-lib/get-extension-config.ts +++ b/programs/develop/commands/commands-lib/get-extension-config.ts @@ -2,6 +2,7 @@ import fs from 'fs' import path from 'path' import {Configuration} from 'webpack' import {FileConfig} from './config-types' +import {DevOptions} from '../../commands/dev' import * as messages from './messages' export function loadExtensionConfig(projectPath: string) { @@ -21,10 +22,51 @@ export function loadExtensionConfig(projectPath: string) { return (config: Configuration) => config } +export function loadCommandConfig( + projectPath: string, + command: 'dev' | 'build' | 'start' | 'preview' +) { + const userConfigPath = path.join(projectPath, 'extension.config.js') + + if (fs.existsSync(userConfigPath)) { + if (isUsingExtensionConfig(projectPath)) { + const userConfig: any = require(userConfigPath) + if (userConfig && userConfig != null) { + return userConfig![command] + } + } + } + + return {} +} + +export function loadBrowserConfig( + projectPath: string, + browser: DevOptions['browser'] +) { + const userConfigPath = path.join(projectPath, 'extension.config.js') + + if (fs.existsSync(userConfigPath)) { + if (isUsingExtensionConfig(projectPath)) { + const userConfig: any = require(userConfigPath) + if (userConfig && userConfig != null) { + return userConfig.browsers![browser] + } + } + } + + return {} +} + +let userMessageDelivered = false + export function isUsingExtensionConfig(projectPath: string) { const configPath = path.join(projectPath, 'extension.config.js') if (fs.existsSync(configPath)) { - console.log(messages.isUsingExtensionConfig('extension.config.js')) + if (!userMessageDelivered) { + console.log(messages.isUsingExtensionConfig('extension.config.js')) + userMessageDelivered = true + } return true } else { return false diff --git a/programs/develop/plugin-browsers/index.ts b/programs/develop/plugin-browsers/index.ts index 22182b7d..e4572799 100644 --- a/programs/develop/plugin-browsers/index.ts +++ b/programs/develop/plugin-browsers/index.ts @@ -5,6 +5,7 @@ import {type PluginInterface} from './browsers-types' import {RunChromiumPlugin} from './run-chromium' import {RunFirefoxPlugin} from './run-firefox' import {DevOptions} from '../commands/dev' +import {loadBrowserConfig} from '../commands/commands-lib/get-extension-config' /** * BrowsersPlugin works by finding the binary for the browser specified in the @@ -84,27 +85,32 @@ export class BrowsersPlugin { this.browser, this.userDataDir || this.profile ), + startingUrl: this.startingUrl, chromiumBinary: this.chromiumBinary, geckoBinary: this.geckoBinary } - console.log('browser', this.browser) + const browserConfig = { + ...config, + ...loadBrowserConfig(compiler.context, this.browser) + } + switch (this.browser) { case 'chrome': case 'edge': case 'chromium-based': { - new RunChromiumPlugin(config).apply(compiler) + new RunChromiumPlugin(browserConfig).apply(compiler) break } case 'firefox': case 'gecko-based': - new RunFirefoxPlugin(config).apply(compiler) + new RunFirefoxPlugin(browserConfig).apply(compiler) break default: { new RunChromiumPlugin({ - ...config, + ...browserConfig, browser: 'chrome' }).apply(compiler) break diff --git a/programs/develop/plugin-browsers/run-chromium/browser-config.ts b/programs/develop/plugin-browsers/run-chromium/browser-config.ts index 666ebf9e..2b3b5ab7 100644 --- a/programs/develop/plugin-browsers/run-chromium/browser-config.ts +++ b/programs/develop/plugin-browsers/run-chromium/browser-config.ts @@ -9,7 +9,7 @@ export function browserConfig(configOptions: PluginInterface) { const userProfilePath = createProfile( configOptions.browser, configOptions.profile, - false + configOptions.preferences ) // Flags set by default: diff --git a/programs/develop/plugin-browsers/run-chromium/create-profile.ts b/programs/develop/plugin-browsers/run-chromium/create-profile.ts index 82377023..c6ee18ee 100644 --- a/programs/develop/plugin-browsers/run-chromium/create-profile.ts +++ b/programs/develop/plugin-browsers/run-chromium/create-profile.ts @@ -10,8 +10,8 @@ import {DevOptions} from '../../commands/dev' export function createProfile( browser: DevOptions['browser'], - profilePath?: string, - silent?: boolean + profilePath: string | undefined, + configPreferences: DevOptions['preferences'] ) { if (profilePath && fs.existsSync(profilePath)) { return profilePath @@ -24,22 +24,20 @@ export function createProfile( const preferences = browser === 'chrome' ? chromeMasterPreferences : edgeMasterPreferences - const userProfile = JSON.stringify(preferences) + const userProfile = JSON.stringify({...preferences, ...configPreferences}) - if (!silent) { - addProgressBar(messages.creatingUserProfile(browser), () => { - const profilePath = path.resolve(__dirname, `run-${browser}-profile`) - const preferences = path.join(profilePath, 'Default') + addProgressBar(messages.creatingUserProfile(browser), () => { + const profilePath = path.resolve(__dirname, `run-${browser}-profile`) + const preferences = path.join(profilePath, 'Default') - // Ensure directory exists - fs.mkdirSync(preferences, {recursive: true}) + // Ensure directory exists + fs.mkdirSync(preferences, {recursive: true}) - const preferencesPath = path.join(preferences, 'Preferences') + const preferencesPath = path.join(preferences, 'Preferences') - // Actually write the user preferences - fs.writeFileSync(preferencesPath, userProfile, 'utf8') - }) - } + // Actually write the user preferences + fs.writeFileSync(preferencesPath, userProfile, 'utf8') + }) return path.resolve(__dirname, `run-${browser}-profile`) } diff --git a/programs/develop/plugin-browsers/run-chromium/index.ts b/programs/develop/plugin-browsers/run-chromium/index.ts index a6e4bea8..5fd8216e 100644 --- a/programs/develop/plugin-browsers/run-chromium/index.ts +++ b/programs/develop/plugin-browsers/run-chromium/index.ts @@ -67,6 +67,7 @@ export class RunChromiumPlugin { } const chromiumConfig = browserConfig(this) + console.log('asdlasdlasdaldjsalds', this.startingUrl) const launchArgs = this.startingUrl ? [this.startingUrl, ...chromiumConfig] : [...chromiumConfig] diff --git a/programs/develop/plugin-browsers/run-firefox/firefox/browser-config.ts b/programs/develop/plugin-browsers/run-firefox/firefox/browser-config.ts index 36910fff..f13c5ea2 100644 --- a/programs/develop/plugin-browsers/run-firefox/firefox/browser-config.ts +++ b/programs/develop/plugin-browsers/run-firefox/firefox/browser-config.ts @@ -1,29 +1,24 @@ import {Compiler} from 'webpack' import {createUserDataDir} from './create-profile' -import {type PluginInterface} from '../../browsers-types' +import {type DevOptions} from '../../../commands/dev' export async function browserConfig( compiler: Compiler, - configOptions: PluginInterface + configOptions: DevOptions ) { const { browser, startingUrl, preferences, userDataDir, - browserConsole = false, browserFlags = [] } = configOptions - const profile = createUserDataDir(browser, userDataDir, preferences) + const userProfilePath = createUserDataDir(browser, userDataDir, preferences) const binaryArgs: string[] = [] if (startingUrl) { - binaryArgs.push(`--url "${startingUrl}"`) - } - - if (browserConsole) { - binaryArgs.push('--jsconsole') + binaryArgs.push(`--url=${startingUrl}`) } if (browserFlags) { @@ -35,9 +30,9 @@ export async function browserConfig( : 9222 return [ - `--binary-args "${browserFlags.join(' ')}"`, - `--profile "${profile.path()}"`, - `--listen ${port}`, + `--binary-args="${binaryArgs.join(' ')}"`, + `--profile="${userProfilePath.path()}"`, + `--listen=${port}`, '--verbose' ].join(' ') } diff --git a/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts b/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts index 1882d839..624737f3 100644 --- a/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts +++ b/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts @@ -5,16 +5,24 @@ import {getPreferences} from './master-preferences' import * as messages from '../../browsers-lib/messages' import {addProgressBar} from '../../browsers-lib/add-progress-bar' import {DevOptions} from '../../../commands/dev' +import {loadBrowserConfig} from '../../../commands/commands-lib/get-extension-config' function configureProfile( profile: FirefoxProfile, customPreferences: Record ) { - const preferences: Record = getPreferences(customPreferences) - const preferenceKeys = Object.keys(preferences) + const firefoxMasterPreferences: Record = { + ...loadBrowserConfig(path.resolve(__dirname, 'run-firefox'), 'firefox'), + ...getPreferences(customPreferences) + } + + const preferenceKeys = Object.keys(firefoxMasterPreferences) preferenceKeys.forEach((preference) => { - profile.setPreference(preference, preferences[preference] as string) + profile.setPreference( + preference, + firefoxMasterPreferences[preference] as string + ) }) const customPreferenceKeys = Object.keys(customPreferences) @@ -36,7 +44,7 @@ function createProfile( ) { const profile = new FirefoxProfile({destinationDirectory}) const profileConfigured = configureProfile(profile, customPreferences) - + console.log({profileConfigured}) return profileConfigured } @@ -64,18 +72,22 @@ function getProfile( export function createUserDataDir( browser: DevOptions['browser'], dataDirPath: string | undefined, - preferences?: Record, - silent?: boolean + configPreferences: DevOptions['preferences'] ) { let profile: FirefoxProfile const dataDir = dataDirPath || path.resolve(__dirname, 'run-firefox-data-dir') + const firefoxMasterPreferences: Record = getPreferences( + configPreferences || {} + ) + + const preferences = firefoxMasterPreferences + + const userPreferences = JSON.stringify({...preferences, ...configPreferences}) if (fs.existsSync(dataDir)) { profile = getProfile(browser, dataDir, preferences || {}) } else { - if (!silent) { - addProgressBar(messages.creatingUserProfile(browser), () => {}) - } + addProgressBar(messages.creatingUserProfile(browser), () => {}) fs.mkdirSync(dataDir, {recursive: true}) profile = createProfile(dataDir, preferences || {}) diff --git a/programs/develop/plugin-browsers/run-firefox/index.ts b/programs/develop/plugin-browsers/run-firefox/index.ts index 7bed62e5..6e4a5037 100644 --- a/programs/develop/plugin-browsers/run-firefox/index.ts +++ b/programs/develop/plugin-browsers/run-firefox/index.ts @@ -71,15 +71,12 @@ export class RunFirefoxPlugin { } } - private async launchFirefox( - compiler: Compiler, - browser: DevOptions['browser'] - ) { + private async launchFirefox(compiler: Compiler, options: DevOptions) { const fxRunnerCmd = await this.getFxRunnerCommand() let browserBinaryLocation: string - switch (browser) { + switch (options.browser) { case 'gecko-based': browserBinaryLocation = path.normalize(this.geckoBinary!) break @@ -101,7 +98,7 @@ export class RunFirefoxPlugin { process.exit(1) } - const firefoxConfig = await browserConfig(compiler, this) + const firefoxConfig = await browserConfig(compiler, options) const cmd = `${firefoxLaunchPath} ${firefoxConfig}` child = exec(cmd, (error, _stdout, stderr) => { @@ -161,7 +158,15 @@ export class RunFirefoxPlugin { ) }, 2000) - await this.launchFirefox(compiler, this.browser) + await this.launchFirefox(compiler, { + browser: this.browser, + browserFlags: this.browserFlags, + userDataDir: this.userDataDir, + profile: this.profile, + preferences: this.preferences, + startingUrl: this.startingUrl, + mode: compilation.compilation.options.mode + }) firefoxDidLaunch = true done() diff --git a/programs/develop/webpack/dev-server.ts b/programs/develop/webpack/dev-server.ts index b0e01ca3..0c57a563 100644 --- a/programs/develop/webpack/dev-server.ts +++ b/programs/develop/webpack/dev-server.ts @@ -12,7 +12,10 @@ import {merge} from 'webpack-merge' import webpackConfig from './webpack-config' import type {DevOptions} from '../commands/dev' import * as utils from './lib/utils' -import {loadExtensionConfig} from '../commands/commands-lib/get-extension-config' +import { + loadCommandConfig, + loadExtensionConfig +} from '../commands/commands-lib/get-extension-config' function closeAll(devServer: WebpackDevServer) { devServer @@ -29,8 +32,10 @@ export async function devServer( projectPath: string, {...devOptions}: DevOptions ) { + const commandConfig = loadCommandConfig(projectPath, 'dev') const baseConfig = webpackConfig(projectPath, { ...devOptions, + ...commandConfig, mode: 'development' }) const userExtensionConfig = loadExtensionConfig(projectPath) diff --git a/programs/develop/webpack/lib/messages.ts b/programs/develop/webpack/lib/messages.ts index 10d69ea5..be4b21bd 100644 --- a/programs/develop/webpack/lib/messages.ts +++ b/programs/develop/webpack/lib/messages.ts @@ -30,7 +30,7 @@ function getLoggingPrefix(feature: string, type: PrefixType): string { const arrow = type === 'info' ? cyan('►►►') : brightGreen('►►►') - return `${arrow} ${feature}` + return `${arrow} ${cyan(feature)}` } export function capitalizedBrowserName(browser: DevOptions['browser']) { From 1719c4fbe01dd000eeed2fb0764c2311e9f69381 Mon Sep 17 00:00:00 2001 From: Cezar Augusto Date: Mon, 16 Sep 2024 04:43:41 -0300 Subject: [PATCH 2/4] Update lockfile --- pnpm-lock.yaml | 172 ++++++++----------------------------------------- 1 file changed, 27 insertions(+), 145 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43c6c108..bbf4c8a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: version: 3.3.3 ts-jest: specifier: ^29.1.2 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3) ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3) @@ -101,7 +101,7 @@ importers: version: 7.25.2 babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.25.2)(webpack@5.92.1(@swc/core@1.7.26)) + version: 9.1.3(@babel/core@7.25.2)(webpack@5.92.1(@swc/core@1.7.26)(esbuild@0.23.1)) babel-preset-modern-browser-extension: specifier: ^0.7.0 version: 0.7.0(@babel/core@7.25.2) @@ -186,9 +186,6 @@ importers: examples/content-extension-config: dependencies: - '@svgr/webpack': - specifier: ^8.1.0 - version: 8.1.0(typescript@5.3.3) react: specifier: ^18.1.0 version: 18.3.1 @@ -350,7 +347,7 @@ importers: devDependencies: node-polyfill-webpack-plugin: specifier: ^4.0.0 - version: 4.0.0(webpack@5.92.1(@swc/core@1.7.26)) + version: 4.0.0(webpack@5.92.1(@swc/core@1.7.26)(esbuild@0.23.1)) typescript: specifier: 5.3.3 version: 5.3.3 @@ -547,13 +544,13 @@ importers: version: 7.5.8 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + version: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) mock-fs: specifier: ^5.2.0 version: 5.2.0 ts-jest: specifier: ^29.1.2 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)))(typescript@5.3.3) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3) tsconfig: specifier: '*' version: 7.0.0 @@ -596,10 +593,10 @@ importers: version: 15.9.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + version: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) ts-jest: specifier: ^29.1.2 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)))(typescript@5.3.3) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3) tsconfig: specifier: '*' version: 7.0.0 @@ -814,10 +811,10 @@ importers: version: 8.5.12 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + version: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) ts-jest: specifier: ^29.1.2 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)))(typescript@5.3.3) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3) tsup: specifier: ^8.0.1 version: 8.2.4(@swc/core@1.7.26)(jiti@1.21.6)(postcss@8.4.47)(typescript@5.3.3)(yaml@2.5.1) @@ -8144,41 +8141,6 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.16.5 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 @@ -9356,14 +9318,6 @@ snapshots: find-cache-dir: 4.0.0 schema-utils: 4.2.0 webpack: 5.92.1(@swc/core@1.7.26)(esbuild@0.23.1) - optional: true - - babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.92.1(@swc/core@1.7.26)): - dependencies: - '@babel/core': 7.25.2 - find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.92.1(@swc/core@1.7.26) babel-plugin-istanbul@6.1.1: dependencies: @@ -9823,13 +9777,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)): + create-jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -10988,16 +10942,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)): + jest-cli@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + create-jest: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -11038,38 +10992,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.16.5 - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)): + jest-config@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -11095,7 +11018,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.5.5 - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -11333,12 +11256,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)): + jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + jest-cli: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -11653,7 +11576,7 @@ snapshots: node-int64@0.4.0: {} - node-polyfill-webpack-plugin@4.0.0(webpack@5.92.1(@swc/core@1.7.26)): + node-polyfill-webpack-plugin@4.0.0(webpack@5.92.1(@swc/core@1.7.26)(esbuild@0.23.1)): dependencies: assert: 2.1.0 browserify-zlib: 0.2.0 @@ -11679,7 +11602,7 @@ snapshots: url: 0.11.4 util: 0.12.5 vm-browserify: 1.1.2 - webpack: 5.92.1(@swc/core@1.7.26) + webpack: 5.92.1(@swc/core@1.7.26)(esbuild@0.23.1) node-releases@2.0.18: {} @@ -13022,17 +12945,6 @@ snapshots: '@swc/core': 1.7.26 esbuild: 0.23.1 - terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(webpack@5.92.1(@swc/core@1.7.26)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.32.0 - webpack: 5.92.1(@swc/core@1.7.26) - optionalDependencies: - '@swc/core': 1.7.26 - terser@5.32.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -13107,12 +13019,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)))(typescript@5.3.3): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@22.5.5)(typescript@5.3.3)) + jest: 29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -13127,12 +13039,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.25.2) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)))(typescript@5.3.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.16.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) + jest: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -13145,6 +13057,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) + esbuild: 0.23.1 ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.16.5)(typescript@5.3.3): dependencies: @@ -13466,37 +13379,6 @@ snapshots: dependencies: webpack: 5.92.1(@swc/core@1.7.26)(esbuild@0.23.1) - webpack@5.92.1(@swc/core@1.7.26): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.23.3 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(webpack@5.92.1(@swc/core@1.7.26)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - webpack@5.92.1(@swc/core@1.7.26)(esbuild@0.23.1): dependencies: '@types/eslint-scope': 3.7.7 From a11c98ea5610386dbb79e52edad89a8b0e42dc44 Mon Sep 17 00:00:00 2001 From: Cezar Augusto Date: Mon, 16 Sep 2024 17:17:06 -0300 Subject: [PATCH 3/4] Update template's extension.config.js --- .env.example | 3 ++ examples/config-babel/extension.config.js | 2 +- .../extension.config.js | 45 +++++++++++-------- .../content-main-world/extension.config.js | 2 +- .../content-react-svgr/extension.config.js | 2 +- examples/new-crypto/extension.config.js | 2 +- .../develop/webpack/plugin-extension/index.ts | 2 +- programs/develop/webpack/webpack-config.ts | 2 +- 8 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..31ff0cfe --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +EXTENSION_ENV= +EXPERIMENTAL_ERRORS_PLUGIN= +EXPERIMENTAL_EXTENSION_RESOLVER_PLUGIN= diff --git a/examples/config-babel/extension.config.js b/examples/config-babel/extension.config.js index 3e57e763..df6ea986 100644 --- a/examples/config-babel/extension.config.js +++ b/examples/config-babel/extension.config.js @@ -1,4 +1,4 @@ -/** @type {import('extension-develop').FileConfig} */ +/** @type {import('extension').FileConfig} */ module.exports = { config: (config) => { config.module.rules.push( diff --git a/examples/content-extension-config/extension.config.js b/examples/content-extension-config/extension.config.js index 94b90508..441be9fd 100644 --- a/examples/content-extension-config/extension.config.js +++ b/examples/content-extension-config/extension.config.js @@ -1,29 +1,36 @@ -/** @type {import('extension-develop').FileConfig} */ +/** @type {import('extension').FileConfig} */ module.exports = { browsers: { chrome: { + // noOpen?: boolean + // userDataDir?: string + // profile?: string + // preferences?: Record + // browserFlags?: string[] + // startingUrl?: string + // chromiumBinary?: string startingUrl: 'https://extension.js.org' }, firefox: { + // noOpen?: boolean + // userDataDir?: string + // profile?: string + // preferences?: Record + // browserFlags?: string[] + // startingUrl?: string + // geckoBinary?: string startingUrl: 'about:debugging#/runtime/this-firefox' } }, - commands: { - dev: { - browser: 'firefox', - polyfill: true - }, - start: { - browser: 'firefox', - polyfill: true - }, - preview: { - browser: 'firefox', - polyfill: true - }, - build: { - browser: 'firefox', - polyfill: true - } - } + development: { + // TBD + // browser: DevOptions['browser'] + // port?: number + // browser: 'firefox', // can be an array + // zipFilename?: string + // zip?: boolean + // zipSource?: boolean + // polyfill?: boolean + }, + deployment: {} } diff --git a/examples/content-main-world/extension.config.js b/examples/content-main-world/extension.config.js index 6784b612..f495a447 100644 --- a/examples/content-main-world/extension.config.js +++ b/examples/content-main-world/extension.config.js @@ -1,4 +1,4 @@ -/** @type {import('extension-develop').FileConfig} */ +/** @type {import('extension').FileConfig} */ module.exports = { config: (config) => { config.output.publicPath = diff --git a/examples/content-react-svgr/extension.config.js b/examples/content-react-svgr/extension.config.js index 9c2bf69f..e7d61e2b 100644 --- a/examples/content-react-svgr/extension.config.js +++ b/examples/content-react-svgr/extension.config.js @@ -1,4 +1,4 @@ -/** @type {import('extension-develop').FileConfig} */ +/** @type {import('extension').FileConfig} */ module.exports = { config: (config) => { config.module.rules.push( diff --git a/examples/new-crypto/extension.config.js b/examples/new-crypto/extension.config.js index 701d253b..31eaea22 100644 --- a/examples/new-crypto/extension.config.js +++ b/examples/new-crypto/extension.config.js @@ -1,6 +1,6 @@ const NodePolyfillPlugin = require('node-polyfill-webpack-plugin') -/** @type {import('extension-develop').FileConfig} */ +/** @type {import('extension').FileConfig} */ module.exports = { config: (config) => { config.plugins = [ diff --git a/programs/develop/webpack/plugin-extension/index.ts b/programs/develop/webpack/plugin-extension/index.ts index 338d12a7..fc625e04 100644 --- a/programs/develop/webpack/plugin-extension/index.ts +++ b/programs/develop/webpack/plugin-extension/index.ts @@ -45,7 +45,7 @@ export class ExtensionPlugin { const manifestFieldsData = getManifestFieldsData({manifestPath}) const specialFoldersData = getSpecialFoldersData({manifestPath}) - process.env.EXTENSION_ENV === 'development' && + process.env.EXPERIMENTAL_EXTENSION_RESOLVER_PLUGIN && new ResolvePlugin({ manifestPath, includeList: { diff --git a/programs/develop/webpack/webpack-config.ts b/programs/develop/webpack/webpack-config.ts index 57b97bdc..163a789e 100644 --- a/programs/develop/webpack/webpack-config.ts +++ b/programs/develop/webpack/webpack-config.ts @@ -102,7 +102,7 @@ export default function webpackConfig( new JsFrameworksPlugin({ manifestPath }), - process.env.EXTENSION_ENV === 'development' && + process.env.EXPERIMENTAL_ERRORS_PLUGIN && new ErrorsPlugin({ manifestPath, browser From 49a5039dcc616811ccab942bde047363b3733b98 Mon Sep 17 00:00:00 2001 From: Cezar Augusto Date: Mon, 16 Sep 2024 19:31:26 -0300 Subject: [PATCH 4/4] Properly expose FileConfig --- programs/cli/cli.ts | 7 +++++-- .../plugin-browsers/run-firefox/firefox/create-profile.ts | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/programs/cli/cli.ts b/programs/cli/cli.ts index ab99ec96..4762dc5c 100755 --- a/programs/cli/cli.ts +++ b/programs/cli/cli.ts @@ -15,14 +15,17 @@ import { extensionStart, type StartOptions, extensionBuild, - type BuildOptions - // extensionPreview + type BuildOptions, + // extensionPreview, + type FileConfig } from 'extension-develop' import * as messages from './cli-lib/messages' import type {BrowsersSupported} from './types' import checkUpdates from './check-updates' import packageJson from './package.json' +export {type FileConfig} + // Before all, check for updates. checkUpdates(packageJson) diff --git a/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts b/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts index 624737f3..9b0b72ab 100644 --- a/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts +++ b/programs/develop/plugin-browsers/run-firefox/firefox/create-profile.ts @@ -82,15 +82,15 @@ export function createUserDataDir( const preferences = firefoxMasterPreferences - const userPreferences = JSON.stringify({...preferences, ...configPreferences}) + const userPreferences = {...preferences, ...configPreferences} if (fs.existsSync(dataDir)) { - profile = getProfile(browser, dataDir, preferences || {}) + profile = getProfile(browser, dataDir, userPreferences) } else { addProgressBar(messages.creatingUserProfile(browser), () => {}) fs.mkdirSync(dataDir, {recursive: true}) - profile = createProfile(dataDir, preferences || {}) + profile = createProfile(dataDir, userPreferences) } return profile