From c3d4a4c1c2f9e08c5e6be46ed0061c5f58dc5a6c Mon Sep 17 00:00:00 2001 From: Avi Vahl Date: Tue, 10 Dec 2024 17:41:02 +0200 Subject: [PATCH] feat!: fully native esm - all packages are now "type": "module" - replaced commonjs calls with their esm counterparts - ensure all dynamic imports now use pathToFileURL to properly work on win32 - removed now-unneeded helper that bypassed typescript transpilation to get to the "real" import() - changed default output format to esm --- engine.config.js | 6 ++-- examples/cross-iframe/package.json | 1 + examples/file-server/package.json | 5 ++-- .../file-server/src/test/file-server.it.ts | 2 +- .../file-server/src/test/file-server.unit.ts | 6 ++-- examples/multi-env/package.json | 5 ++-- .../multi-env/src/test/file-server.unit.ts | 2 +- examples/node-only/package.json | 3 +- examples/playground/package.json | 5 ++-- examples/react/package.json | 5 ++-- examples/react/src/test/react.it.ts | 2 +- examples/react/src/test/react.persist.it.ts | 2 +- examples/reloaded-iframe/package.json | 5 ++-- guides/babel.config.js | 2 +- guides/docs/getting-started/index.md | 20 ++++--------- package.json | 5 ++-- packages/core/package.json | 1 + packages/core/src/com/communication-errors.ts | 4 +-- packages/core/src/com/communication.ts | 2 +- packages/core/src/com/helpers.ts | 2 +- packages/core/src/helpers/web.ts | 2 +- .../src/polyfills/report-error-polyfill.ts | 2 +- packages/engine-cli/package.json | 1 + packages/engine-cli/src/analyze-command.ts | 6 ++-- packages/engine-cli/src/create-entrypoints.ts | 8 ++--- ...create-environments-build-configuration.ts | 18 +++++------ packages/engine-cli/src/engine-app-manager.ts | 8 ++--- packages/engine-cli/src/engine-build.ts | 28 ++++++++--------- packages/engine-cli/src/entrypoint-files.ts | 2 +- .../src/entrypoint/create-entrypoint.ts | 2 +- .../src/entrypoint/create-node-entrypoint.ts | 2 +- .../src/entrypoint/create-web-entrypoint.ts | 2 +- .../feature-generator/feature-generator.ts | 2 +- .../find-features/load-features-from-paths.ts | 3 +- packages/engine-cli/src/import-fresh.ts | 7 +++-- packages/engine-cli/src/index.ts | 30 +++++++++---------- .../engine-cli/src/launch-dashboard-server.ts | 14 ++++----- packages/engine-cli/src/load-config-file.ts | 3 +- .../engine-cli/src/node-config-manager.ts | 4 ++- .../src/resolve-build-configurations.ts | 8 ++--- packages/engine-cli/src/resolve-exec-argv.ts | 9 ++++-- packages/engine-cli/src/run-environment.ts | 3 +- .../engine-cli/src/run-local-mode-manager.ts | 2 +- .../src/top-level-config-plugin-esbuild.ts | 3 +- packages/runtime-node/package.json | 1 + packages/runtime-node/src/dynamic-import.ts | 5 ---- packages/runtime-node/src/import-modules.ts | 5 ++-- packages/runtime-node/src/index.ts | 1 - .../runtime-node/src/load-top-level-config.ts | 14 +++++++-- packages/runtime-node/src/metadata-files.ts | 2 +- packages/runtime-node/src/metrics-utils.ts | 4 +-- packages/runtime-node/src/node-env-manager.ts | 20 ++++++------- packages/runtime-node/src/node-environment.ts | 13 ++++---- .../src/worker-thread-initializer.ts | 4 +-- .../src/worker-thread-initializer2.ts | 4 +-- packages/runtime-node/test/node-com.unit.ts | 4 +-- packages/test-kit/package.json | 1 + packages/test-kit/src/with-feature.ts | 2 +- .../test-kit/test/run-environment.unit.ts | 6 ++-- test-fixtures/3rd-party/package.json | 3 +- .../application-external/package.json | 3 +- .../base-web-application/package.json | 3 +- test-fixtures/contextual/package.json | 3 +- test-fixtures/default-args-echo/package.json | 3 +- test-fixtures/disconnecting-env/package.json | 3 +- test-fixtures/engine-config/package.json | 3 +- .../engine-env-dependency/package.json | 3 +- .../engine-feature-roots/package.json | 3 +- .../engine-multi-feature/package.json | 3 +- test-fixtures/engine-run-options/package.json | 3 +- .../engine-single-feature/package.json | 3 +- test-fixtures/multi-node/package.json | 3 +- test-fixtures/multi-socket-node/package.json | 3 +- test-fixtures/node-env/package.json | 3 +- .../static-application-external/package.json | 3 +- .../package.json | 3 +- .../static-base-web-application/package.json | 3 +- test-fixtures/using-config/package.json | 3 +- test-fixtures/with-iframe/package.json | 3 +- test-fixtures/worker-thread/package.json | 1 + test-fixtures/workspace/package.json | 5 ++-- .../workspace/packages/a/package.json | 3 +- .../workspace/packages/b/package.json | 3 +- tsconfig.base.json | 4 +-- 84 files changed, 225 insertions(+), 191 deletions(-) delete mode 100644 packages/runtime-node/src/dynamic-import.ts diff --git a/engine.config.js b/engine.config.js index a413c1103..7333ba562 100644 --- a/engine.config.js +++ b/engine.config.js @@ -1,7 +1,5 @@ -/** - * @type {import('@wixc3/engine-cli').EngineConfig} - */ -module.exports = { +/** @type {import('@wixc3/engine-cli').EngineConfig} */ +export default { featureDiscoveryRoot: 'dist', buildPlugins: ({ webConfig, nodeConfig }) => { nodeConfig.packages = 'external'; diff --git a/examples/cross-iframe/package.json b/examples/cross-iframe/package.json index a4543eb80..c196e8ea2 100644 --- a/examples/cross-iframe/package.json +++ b/examples/cross-iframe/package.json @@ -2,6 +2,7 @@ "name": "@fixture/cross-iframe", "version": "48.0.0", "private": true, + "type": "module", "scripts": { "start": "engine --dev", "test": "npm run test:it", diff --git a/examples/file-server/package.json b/examples/file-server/package.json index 73d565197..0521d62f5 100644 --- a/examples/file-server/package.json +++ b/examples/file-server/package.json @@ -1,6 +1,8 @@ { "name": "@example/file-server", "version": "48.0.0", + "private": true, + "type": "module", "scripts": { "start": "engine --dev", "test": "npm run test:it && npm run test:unit", @@ -10,6 +12,5 @@ "dependencies": { "@file-services/node": "^9.4.1" }, - "license": "UNLICENSED", - "private": true + "license": "UNLICENSED" } diff --git a/examples/file-server/src/test/file-server.it.ts b/examples/file-server/src/test/file-server.it.ts index ecb348092..e97101618 100644 --- a/examples/file-server/src/test/file-server.it.ts +++ b/examples/file-server/src/test/file-server.it.ts @@ -12,7 +12,7 @@ describe('File Server Feature', function () { featureName: 'file-server/example', configName: 'file-server/run', runOptions: { - projectPath: path.dirname(__dirname), + projectPath: path.dirname(import.meta.dirname), }, config: [ fileServerFeature.configure({ diff --git a/examples/file-server/src/test/file-server.unit.ts b/examples/file-server/src/test/file-server.unit.ts index 18e618b20..e12af255d 100644 --- a/examples/file-server/src/test/file-server.unit.ts +++ b/examples/file-server/src/test/file-server.unit.ts @@ -12,12 +12,12 @@ describe('file-server Processing env test', () => { featureName: 'file-server', env: server, runtimeOptions: { - projectPath: __dirname, + projectPath: import.meta.dirname, }, feature: Feature, }); - const remoteFile = remoteFiles.readFile(path.basename(__filename)); - expect(remoteFile).to.eq(fs.readFileSync(__filename, 'utf8')); + const remoteFile = remoteFiles.readFile(path.basename(import.meta.filename)); + expect(remoteFile).to.eq(fs.readFileSync(import.meta.filename, 'utf8')); }); }); diff --git a/examples/multi-env/package.json b/examples/multi-env/package.json index c7e1d42a5..25c64b26c 100644 --- a/examples/multi-env/package.json +++ b/examples/multi-env/package.json @@ -1,12 +1,13 @@ { "name": "@example/multi-env", "version": "48.0.0", + "private": true, + "type": "module", "scripts": { "start": "engine --dev", "test": "npm run test:it && npm run test:unit", "test:it": "mocha \"dist/test/**/*.it.js\"", "test:unit": "mocha \"dist/test/**/*.unit.js\"" }, - "license": "UNLICENSED", - "private": true + "license": "UNLICENSED" } diff --git a/examples/multi-env/src/test/file-server.unit.ts b/examples/multi-env/src/test/file-server.unit.ts index a075f0f64..9e3607ea5 100644 --- a/examples/multi-env/src/test/file-server.unit.ts +++ b/examples/multi-env/src/test/file-server.unit.ts @@ -8,7 +8,7 @@ describe('multi-env Processing env test', () => { featureName: 'multi-env/test-node', env: processingEnv, runtimeOptions: { - projectPath: __dirname, + projectPath: import.meta.dirname, }, feature: Feature, }); diff --git a/examples/node-only/package.json b/examples/node-only/package.json index d7e44c4ca..d9e83b168 100644 --- a/examples/node-only/package.json +++ b/examples/node-only/package.json @@ -1,9 +1,10 @@ { "name": "@example/node-only", "version": "48.0.0", + "private": true, + "type": "module", "main": "index.js", "license": "MIT", - "private": true, "scripts": { "start": "engine --dev" } diff --git a/examples/playground/package.json b/examples/playground/package.json index 928a05298..c60a5d3e2 100644 --- a/examples/playground/package.json +++ b/examples/playground/package.json @@ -1,9 +1,10 @@ { "name": "@example/playground", "version": "48.0.0", + "private": true, + "type": "module", "scripts": { "start": "engine --dev" }, - "license": "UNLICENSED", - "private": true + "license": "UNLICENSED" } diff --git a/examples/react/package.json b/examples/react/package.json index bbd402fd8..d829f90a2 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -1,12 +1,13 @@ { "name": "@examples/react", "version": "48.0.0", + "private": true, + "type": "module", "main": "index.js", "scripts": { "start": "engine --dev -f react/someplugin", "test": "npm run test:it", "test:it": "mocha \"dist/test/**/*.it.js\"" }, - "license": "UNLICENSED", - "private": true + "license": "UNLICENSED" } diff --git a/examples/react/src/test/react.it.ts b/examples/react/src/test/react.it.ts index a1d9c169f..00960068c 100644 --- a/examples/react/src/test/react.it.ts +++ b/examples/react/src/test/react.it.ts @@ -7,7 +7,7 @@ describe('React Feature', function () { const { getLoadedFeature } = withFeature({ featureName: 'react/someplugin', runOptions: { - projectPath: join(__dirname, '..'), + projectPath: join(import.meta.dirname, '..'), }, }); diff --git a/examples/react/src/test/react.persist.it.ts b/examples/react/src/test/react.persist.it.ts index b86af81a9..5c53ec47f 100644 --- a/examples/react/src/test/react.persist.it.ts +++ b/examples/react/src/test/react.persist.it.ts @@ -12,7 +12,7 @@ describe('react/someplugin persistent checks', function () { const { getLoadedFeature } = withFeature({ featureName: 'react/someplugin', runOptions: { - projectPath: path.join(__dirname, '..'), + projectPath: path.join(import.meta.dirname, '..'), }, persist: true, }); diff --git a/examples/reloaded-iframe/package.json b/examples/reloaded-iframe/package.json index edf301699..c83bdd333 100644 --- a/examples/reloaded-iframe/package.json +++ b/examples/reloaded-iframe/package.json @@ -1,10 +1,11 @@ { "name": "@example/reloaded-iframe", "version": "48.0.0", + "private": true, + "type": "module", "scripts": { "start": "engine --dev", "test": "npm run test:it", "test:it": "mocha \"dist/test/**/*.it.js\"" - }, - "private": true + } } diff --git a/guides/babel.config.js b/guides/babel.config.js index 0adade1fb..2b831db4c 100644 --- a/guides/babel.config.js +++ b/guides/babel.config.js @@ -1,3 +1,3 @@ -module.exports = { +export default { presets: [require.resolve('@docusaurus/core/lib/babel/preset')], }; diff --git a/guides/docs/getting-started/index.md b/guides/docs/getting-started/index.md index 5b955bd22..23369326b 100644 --- a/guides/docs/getting-started/index.md +++ b/guides/docs/getting-started/index.md @@ -18,20 +18,20 @@ mkdir hello-engine && cd hello-engine && git init && npm init -y Let's make a node application, in typescript. ```bash -npm install --saveDev typescript stylable +npm install typescript -D ``` In your blank typescript repo: 1. install engine-core package `npm i @wixc3/engine-core` -2. install dev-dependencies `npm i -D typescript webpack html-webpack-plugin react stylable` -3. install engineer as a dev dependency `npm i -D @wixc3/engineer` -4. if this is a typescript project, in the root of the project create an `engine.config.js` file, and inside we should +2. install engine-cli as a dev dependency `npm i -D @wixc3/engine-cli` +3. if this is a typescript project, in the root of the project create an `engine.config.js` file, and inside we should add one of the following: ```ts -module.exports = { +/** @type {import('@wixc3/engine-cli').EngineConfig} */ +export default { // the folder where the transpiled js files will be located featureDiscoveryRoot: 'dist', }; @@ -82,16 +82,6 @@ export default new Feature({ }); ``` -create `webpack.config.js` file and add: - -```js -const { StylableWebpackPlugin } = require('@stylable/webpack-plugin'); - -module.exports = { - plugins: [new StylableWebpackPlugin()], -}; -``` - We create the feature file, in which we declare what is the feature's API and its Id. We also create a new environment - `my-env`. diff --git a/package.json b/package.json index 47f836358..844fbb84c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,7 @@ { "name": "engine", + "private": true, + "type": "module", "workspaces": [ "examples/*", "packages/*", @@ -62,6 +64,5 @@ "typescript": "~5.7.2", "typescript-eslint": "^8.18.0" }, - "license": "MIT", - "private": true + "license": "MIT" } diff --git a/packages/core/package.json b/packages/core/package.json index c4247fec9..79bf1e186 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,7 @@ { "name": "@wixc3/engine-core", "version": "48.0.0", + "type": "module", "main": "dist/index.js", "exports": { ".": "./dist/index.js", diff --git a/packages/core/src/com/communication-errors.ts b/packages/core/src/com/communication-errors.ts index b04546543..18386e8d7 100644 --- a/packages/core/src/com/communication-errors.ts +++ b/packages/core/src/com/communication-errors.ts @@ -1,5 +1,5 @@ -import type { Message } from './message-types'; -import { redactArguments } from './helpers'; +import type { Message } from './message-types.js'; +import { redactArguments } from './helpers.js'; export class EngineCommunicationError extends Error { constructor( diff --git a/packages/core/src/com/communication.ts b/packages/core/src/com/communication.ts index d5508dc05..cd5867030 100644 --- a/packages/core/src/com/communication.ts +++ b/packages/core/src/com/communication.ts @@ -55,7 +55,7 @@ import { EnvironmentDisconnectedError, UnConfiguredMethodError, UnknownCallbackIdError, -} from './communication-errors'; +} from './communication-errors.js'; export interface ConfigEnvironmentRecord extends EnvironmentRecord { registerMessageHandler?: boolean; diff --git a/packages/core/src/com/helpers.ts b/packages/core/src/com/helpers.ts index 4fd346078..dcf17287a 100644 --- a/packages/core/src/com/helpers.ts +++ b/packages/core/src/com/helpers.ts @@ -1,7 +1,7 @@ // we cannot mix types of "dom" and "webworker". tsc fails building. declare let WorkerGlobalScope: new () => Worker; -import { Message } from './message-types'; +import { Message } from './message-types.js'; export function isWorkerContext(target: unknown): target is Worker { return ( diff --git a/packages/core/src/helpers/web.ts b/packages/core/src/helpers/web.ts index 0f912dbca..7be639f58 100644 --- a/packages/core/src/helpers/web.ts +++ b/packages/core/src/helpers/web.ts @@ -1,4 +1,4 @@ -import { IRunOptions } from '../types'; +import type { IRunOptions } from '../types.js'; export function injectScript(win: Window, rootComId: string, scriptUrl: string) { return new Promise((res, rej) => { diff --git a/packages/core/src/polyfills/report-error-polyfill.ts b/packages/core/src/polyfills/report-error-polyfill.ts index e2c42d255..e911d4085 100644 --- a/packages/core/src/polyfills/report-error-polyfill.ts +++ b/packages/core/src/polyfills/report-error-polyfill.ts @@ -1,4 +1,4 @@ -import { reportError } from '../com'; +import { reportError } from '../com/index.js'; /** * This polyfill is not essential for the engine itself. But applications built diff --git a/packages/engine-cli/package.json b/packages/engine-cli/package.json index 7eeb86adf..532900439 100644 --- a/packages/engine-cli/package.json +++ b/packages/engine-cli/package.json @@ -1,6 +1,7 @@ { "name": "@wixc3/engine-cli", "version": "48.0.0", + "type": "module", "bin": { "engine": "./bin/engine.mjs" }, diff --git a/packages/engine-cli/src/analyze-command.ts b/packages/engine-cli/src/analyze-command.ts index 6701e2f61..82a07f695 100644 --- a/packages/engine-cli/src/analyze-command.ts +++ b/packages/engine-cli/src/analyze-command.ts @@ -1,6 +1,6 @@ import { nodeFs as fs } from '@file-services/node'; -import type { EngineConfig } from './types'; -import { analyzeFeatures } from './find-features/analyze-features'; +import type { EngineConfig } from './types.js'; +import { analyzeFeatures } from './find-features/analyze-features.js'; export async function analyzeCommand({ engineConfig, @@ -14,7 +14,7 @@ export async function analyzeCommand({ const { extensions, buildConditions, featureDiscoveryRoot } = engineConfig; const { features } = await analyzeFeatures(fs, rootDir, featureDiscoveryRoot, feature, extensions, buildConditions); - const htmlTemplate = fs.readFileSync(fs.join(__dirname, 'dashboard/feature-walker.html'), 'utf8'); + const htmlTemplate = fs.readFileSync(fs.join(import.meta.dirname, 'dashboard/feature-walker.html'), 'utf8'); const replaceString = 'globalThis.EMBEDDED_DATA = new Map();'; if (!htmlTemplate.includes(replaceString)) { throw new Error(`Cannot find "${replaceString}" in the feature-walker.html template`); diff --git a/packages/engine-cli/src/create-entrypoints.ts b/packages/engine-cli/src/create-entrypoints.ts index 45601963c..eecb5aa04 100644 --- a/packages/engine-cli/src/create-entrypoints.ts +++ b/packages/engine-cli/src/create-entrypoints.ts @@ -5,10 +5,10 @@ import { IConfigDefinition, } from '@wixc3/engine-runtime-node'; import { SetMultiMap } from '@wixc3/patterns'; -import type { IFeatureDefinition } from './types'; -import type { getResolvedEnvironments } from './environments'; -import { createNodeEntrypoint, createNodeEnvironmentManagerEntrypoint } from './entrypoint/create-node-entrypoint'; -import { createMainEntrypoint } from './entrypoint/create-web-entrypoint'; +import type { IFeatureDefinition } from './types.js'; +import type { getResolvedEnvironments } from './environments.js'; +import { createNodeEntrypoint, createNodeEnvironmentManagerEntrypoint } from './entrypoint/create-node-entrypoint.js'; +import { createMainEntrypoint } from './entrypoint/create-web-entrypoint.js'; export interface CreateEntryPointOptions { dev: boolean; diff --git a/packages/engine-cli/src/create-environments-build-configuration.ts b/packages/engine-cli/src/create-environments-build-configuration.ts index 40cd773ed..88aafb54e 100644 --- a/packages/engine-cli/src/create-environments-build-configuration.ts +++ b/packages/engine-cli/src/create-environments-build-configuration.ts @@ -1,10 +1,10 @@ -import { BuildOptions, Plugin } from 'esbuild'; -import { topLevelConfigPlugin } from './top-level-config-plugin-esbuild'; import { join } from 'node:path'; -import { htmlPlugin } from './esbuild-html-plugin'; -import { dynamicEntryPlugin } from './esbuild-dynamic-entry-plugin'; -import { EntryPoints, EntryPointsPaths } from './create-entrypoints'; -import type { OverrideConfigHook } from './types'; +import { BuildOptions, Plugin } from 'esbuild'; +import { topLevelConfigPlugin } from './top-level-config-plugin-esbuild.js'; +import { htmlPlugin } from './esbuild-html-plugin.js'; +import { dynamicEntryPlugin } from './esbuild-dynamic-entry-plugin.js'; +import { EntryPoints, EntryPointsPaths } from './create-entrypoints.js'; +import type { OverrideConfigHook } from './types.js'; export interface CreateBuildConfigOptions { dev: boolean; @@ -46,11 +46,7 @@ export function createBuildConfiguration(options: CreateBuildConfigOptions) { const commonConfig = { target: 'es2020', bundle: true, - /* - using iife here because esm makes debugging very slow to pickup variables in scope. - if one want to change this to esm, make sure that some bundle splitting is happening. - */ - format: 'iife', + format: 'esm', publicPath, metafile: true, sourcemap: true, diff --git a/packages/engine-cli/src/engine-app-manager.ts b/packages/engine-cli/src/engine-app-manager.ts index f956b9b15..abefb6d51 100644 --- a/packages/engine-cli/src/engine-app-manager.ts +++ b/packages/engine-cli/src/engine-app-manager.ts @@ -1,6 +1,6 @@ -import { loadEngineConfig, runEngine } from './engine-build'; -import { resolveRuntimeOptions } from './resolve-runtime-options'; -import { runLocalNodeManager } from './run-local-mode-manager'; +import { loadEngineConfig, runEngine } from './engine-build.js'; +import { resolveRuntimeOptions } from './resolve-runtime-options.js'; +import { runLocalNodeManager } from './run-local-mode-manager.js'; import isCI from 'is-ci'; import type { IExecutableApplication, IFeatureTarget } from './types.js'; import { join } from 'path'; @@ -9,7 +9,7 @@ import { type FeatureEnvironmentMapping, readMetadataFiles, } from '@wixc3/engine-runtime-node'; -import { checkWatchSignal } from './watch-signal'; +import { checkWatchSignal } from './watch-signal.js'; export const OUTPUT_PATH = process.env.ENGINE_OUTPUT_PATH || join(process.cwd(), 'dist-engine'); diff --git a/packages/engine-cli/src/engine-build.ts b/packages/engine-cli/src/engine-build.ts index 6246abb08..1fae18596 100644 --- a/packages/engine-cli/src/engine-build.ts +++ b/packages/engine-cli/src/engine-build.ts @@ -1,3 +1,4 @@ +import { parseArgs } from 'node:util'; import { nodeFs as fs } from '@file-services/node'; import { ConfigurationEnvironmentMapping, @@ -7,19 +8,18 @@ import { writeMetaFiles, } from '@wixc3/engine-runtime-node'; import esbuild from 'esbuild'; -import { createBuildEndPluginHook } from './esbuild-build-end-plugin'; -import { loadConfigFile } from './load-config-file'; -import { parseArgs } from 'node:util'; -import { writeWatchSignal } from './watch-signal'; -import { resolveBuildEntryPoints } from './resolve-build-configurations'; -import { ConfigLoadingMode, launchDashboardServer } from './launch-dashboard-server'; -import { createBuildConfiguration } from './create-environments-build-configuration'; -import { readEntryPoints, writeEntryPoints } from './entrypoint-files'; -import { EntryPoints, EntryPointsPaths } from './create-entrypoints'; -import { resolveRuntimeOptions } from './resolve-runtime-options'; -import type { EngineConfig } from './types'; -import { analyzeFeatures } from './find-features/analyze-features'; -import { ENGINE_CONFIG_FILE_NAME } from './find-features/build-constants'; +import { createBuildEndPluginHook } from './esbuild-build-end-plugin.js'; +import { loadConfigFile } from './load-config-file.js'; +import { writeWatchSignal } from './watch-signal.js'; +import { resolveBuildEntryPoints } from './resolve-build-configurations.js'; +import { ConfigLoadingMode, launchDashboardServer } from './launch-dashboard-server.js'; +import { createBuildConfiguration } from './create-environments-build-configuration.js'; +import { readEntryPoints, writeEntryPoints } from './entrypoint-files.js'; +import { EntryPoints, EntryPointsPaths } from './create-entrypoints.js'; +import { resolveRuntimeOptions } from './resolve-runtime-options.js'; +import type { EngineConfig } from './types.js'; +import { analyzeFeatures } from './find-features/analyze-features.js'; +import { ENGINE_CONFIG_FILE_NAME } from './find-features/build-constants.js'; export interface RunEngineOptions { verbose?: boolean; @@ -87,7 +87,7 @@ export async function runEngine({ outputPath = fs.resolve(rootDir, outputPath); const jsOutExtension = '.js' as '.js' | '.mjs'; - const nodeFormat = jsOutExtension === '.mjs' ? 'esm' : 'cjs'; + const nodeFormat = 'esm' as 'esm' | 'cjs'; const { buildPlugins = [], diff --git a/packages/engine-cli/src/entrypoint-files.ts b/packages/engine-cli/src/entrypoint-files.ts index bb7cb8df9..f3cbeac96 100644 --- a/packages/engine-cli/src/entrypoint-files.ts +++ b/packages/engine-cli/src/entrypoint-files.ts @@ -1,6 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; -import { EntryPointsPaths, EntryPoints } from './create-entrypoints'; +import { EntryPointsPaths, EntryPoints } from './create-entrypoints.js'; export function writeEntryPoints(dir: string, { nodeEntryPoints, webEntryPoints }: EntryPoints): EntryPointsPaths { const outDirWeb = path.join(dir, 'entrypoints', 'web'); diff --git a/packages/engine-cli/src/entrypoint/create-entrypoint.ts b/packages/engine-cli/src/entrypoint/create-entrypoint.ts index 3add183e2..9a73501aa 100644 --- a/packages/engine-cli/src/entrypoint/create-entrypoint.ts +++ b/packages/engine-cli/src/entrypoint/create-entrypoint.ts @@ -6,7 +6,7 @@ import type { } from '@wixc3/engine-runtime-node'; import type { SetMultiMap } from '@wixc3/patterns'; import { relative } from 'node:path'; -import type { IFeatureDefinition } from '../types'; +import type { IFeatureDefinition } from '../types.js'; const { stringify } = JSON; diff --git a/packages/engine-cli/src/entrypoint/create-node-entrypoint.ts b/packages/engine-cli/src/entrypoint/create-node-entrypoint.ts index 8b9c2d423..d56e2db0e 100644 --- a/packages/engine-cli/src/entrypoint/create-node-entrypoint.ts +++ b/packages/engine-cli/src/entrypoint/create-node-entrypoint.ts @@ -1,6 +1,6 @@ import { Environment } from '@wixc3/engine-core'; import { ConfigurationEnvironmentMapping, FeatureEnvironmentMapping } from '@wixc3/engine-runtime-node'; -import { ICreateEntrypointsOptions, createConfigLoaders, createFeatureLoadersSourceCode } from './create-entrypoint'; +import { ICreateEntrypointsOptions, createConfigLoaders, createFeatureLoadersSourceCode } from './create-entrypoint.js'; const { stringify } = JSON; diff --git a/packages/engine-cli/src/entrypoint/create-web-entrypoint.ts b/packages/engine-cli/src/entrypoint/create-web-entrypoint.ts index 0ff41f9b6..8adf8dd64 100644 --- a/packages/engine-cli/src/entrypoint/create-web-entrypoint.ts +++ b/packages/engine-cli/src/entrypoint/create-web-entrypoint.ts @@ -1,5 +1,5 @@ import { Environment } from '@wixc3/engine-core'; -import { ICreateEntrypointsOptions, createConfigLoaders, createFeatureLoadersSourceCode } from './create-entrypoint'; +import { ICreateEntrypointsOptions, createConfigLoaders, createFeatureLoadersSourceCode } from './create-entrypoint.js'; const { stringify } = JSON; diff --git a/packages/engine-cli/src/feature-generator/feature-generator.ts b/packages/engine-cli/src/feature-generator/feature-generator.ts index 8ea4e2617..f7a15d296 100644 --- a/packages/engine-cli/src/feature-generator/feature-generator.ts +++ b/packages/engine-cli/src/feature-generator/feature-generator.ts @@ -25,7 +25,7 @@ export function generateFeature({ }) { const featuresDir = pathToFeaturesDirectory(fs, rootDir, featuresPath); - const defaultTemplatesPath = fs.join(__dirname, 'templates'); + const defaultTemplatesPath = fs.join(import.meta.dirname, 'templates'); const templatesDirPath = templatesPath ? fs.join(rootDir, templatesPath) : defaultTemplatesPath; const templatesDir = readDirectoryContentsSync(fs, templatesDirPath); diff --git a/packages/engine-cli/src/find-features/load-features-from-paths.ts b/packages/engine-cli/src/find-features/load-features-from-paths.ts index be79bc5bb..fc3d59d0e 100644 --- a/packages/engine-cli/src/find-features/load-features-from-paths.ts +++ b/packages/engine-cli/src/find-features/load-features-from-paths.ts @@ -1,3 +1,4 @@ +import { pathToFileURL } from 'node:url'; import type { IFileSystemSync } from '@file-services/types'; import { concat, getValue, isPlainObject, map } from '@wixc3/common'; import type { FeatureClass } from '@wixc3/engine-core'; @@ -119,7 +120,7 @@ function setEnvPath( } async function analyzeFeature(filePath: string, featurePackage: IPackageDescriptor): Promise { - const moduleExports = await import(filePath); + const moduleExports = await import(pathToFileURL(filePath).href); const module = analyzeFeatureModule(filePath, moduleExports); const scopedName = scopeToPackage(featurePackage.simplifiedName, module.name); return { diff --git a/packages/engine-cli/src/import-fresh.ts b/packages/engine-cli/src/import-fresh.ts index 9c0c1a033..0beb51f10 100644 --- a/packages/engine-cli/src/import-fresh.ts +++ b/packages/engine-cli/src/import-fresh.ts @@ -1,4 +1,5 @@ import { once } from 'node:events'; +import { pathToFileURL } from 'node:url'; import { Worker, isMainThread, parentPort, workerData } from 'node:worker_threads'; /** @@ -13,7 +14,7 @@ import { Worker, isMainThread, parentPort, workerData } from 'node:worker_thread export async function importFresh(filePath: string[], exportSymbolName?: string): Promise; export async function importFresh(filePath: string, exportSymbolName?: string): Promise; export async function importFresh(filePath: string | string[], exportSymbolName = 'default'): Promise { - const worker = new Worker(__filename, { + const worker = new Worker(import.meta.url, { workerData: { filePath, exportSymbolName } satisfies ImportFreshWorkerData, // doesn't seem to inherit two levels deep (Worker from Worker) execArgv: [...process.execArgv], @@ -28,7 +29,7 @@ if (!isMainThread && isImportWorkerData(workerData)) { if (Array.isArray(filePath)) { const imported: Promise[] = []; for (const path of filePath) { - imported.push(import(path)); + imported.push(import(pathToFileURL(path).href)); } Promise.all(imported) .then((moduleExports) => { @@ -42,7 +43,7 @@ if (!isMainThread && isImportWorkerData(workerData)) { throw e; }); } else { - import(filePath) + import(pathToFileURL(filePath).href) .then((moduleExports) => parentPort?.postMessage(moduleExports[exportSymbolName])) .catch((e) => { throw e; diff --git a/packages/engine-cli/src/index.ts b/packages/engine-cli/src/index.ts index 73af2c374..4bd845ec0 100644 --- a/packages/engine-cli/src/index.ts +++ b/packages/engine-cli/src/index.ts @@ -1,15 +1,15 @@ -export { ManagedRunEngine, OUTPUT_PATH } from './engine-app-manager'; -export { loadEngineConfig, runEngine, type RunEngineOptions } from './engine-build'; -export { analyzeFeatures } from './find-features/analyze-features'; -export * from './find-features/build-constants'; -export { ENGINE_CONFIG_FILE_NAME } from './find-features/build-constants'; -export { loadFeatureDirectory } from './find-features/load-feature-directory'; -export * from './find-features/merge'; -export { extractModuleRequests } from './find-features/resolve-module-graph'; -export { NodeConfigManager } from './node-config-manager'; -export { resolveRuntimeOptions, type RunNodeManagerOptions } from './resolve-runtime-options'; -export { RunningFeatureOptions, getRunningFeature } from './run-environment'; -export { runLocalNodeManager } from './run-local-mode-manager'; -export * from './types'; -export type { IExecutableApplication, RunningFeature } from './types'; -export { checkWatchSignal } from './watch-signal'; +export { ManagedRunEngine, OUTPUT_PATH } from './engine-app-manager.js'; +export { loadEngineConfig, runEngine, type RunEngineOptions } from './engine-build.js'; +export { analyzeFeatures } from './find-features/analyze-features.js'; +export * from './find-features/build-constants.js'; +export { ENGINE_CONFIG_FILE_NAME } from './find-features/build-constants.js'; +export { loadFeatureDirectory } from './find-features/load-feature-directory.js'; +export * from './find-features/merge.js'; +export { extractModuleRequests } from './find-features/resolve-module-graph.js'; +export { NodeConfigManager } from './node-config-manager.js'; +export { resolveRuntimeOptions, type RunNodeManagerOptions } from './resolve-runtime-options.js'; +export { RunningFeatureOptions, getRunningFeature } from './run-environment.js'; +export { runLocalNodeManager } from './run-local-mode-manager.js'; +export * from './types.js'; +export type { IExecutableApplication, RunningFeature } from './types.js'; +export { checkWatchSignal } from './watch-signal.js'; diff --git a/packages/engine-cli/src/launch-dashboard-server.ts b/packages/engine-cli/src/launch-dashboard-server.ts index b4b724849..ee40a5686 100644 --- a/packages/engine-cli/src/launch-dashboard-server.ts +++ b/packages/engine-cli/src/launch-dashboard-server.ts @@ -1,11 +1,11 @@ +import { join } from 'node:path'; import { nodeFs as fs } from '@file-services/node'; import { ConfigurationEnvironmentMapping, FeatureEnvironmentMapping } from '@wixc3/engine-runtime-node'; import express from 'express'; -import { LaunchOptions, RouteMiddleware, launchServer } from './start-dev-server'; -import { join } from 'node:path'; -import { runLocalNodeManager } from './run-local-mode-manager'; -import { NodeConfigManager } from './node-config-manager'; -import type { StaticConfig } from './types'; +import { LaunchOptions, RouteMiddleware, launchServer } from './start-dev-server.js'; +import { runLocalNodeManager } from './run-local-mode-manager.js'; +import { NodeConfigManager } from './node-config-manager.js'; +import type { StaticConfig } from './types.js'; export type ConfigLoadingMode = 'fresh' | 'watch' | 'require'; @@ -58,7 +58,7 @@ export async function launchDashboardServer( }, { path: '/dashboard', - handlers: express.static(join(__dirname, 'dashboard')), + handlers: express.static(join(import.meta.dirname, 'dashboard')), }, { path: '/api/engine/metadata', @@ -218,7 +218,7 @@ function blockDuringBuild(waitForBuildReady: ((cb: () => void) => boolean) | und res.end(''); }); if (building) { - engineImage ??= fs.readFileSync(join(__dirname, 'dashboard', 'engine.jpeg'), 'base64'); + engineImage ??= fs.readFileSync(join(import.meta.dirname, 'dashboard', 'engine.jpeg'), 'base64'); res.write(` diff --git a/packages/engine-cli/src/load-config-file.ts b/packages/engine-cli/src/load-config-file.ts index 511331cbd..bc99c309d 100644 --- a/packages/engine-cli/src/load-config-file.ts +++ b/packages/engine-cli/src/load-config-file.ts @@ -1,9 +1,8 @@ import { pathToFileURL } from 'node:url'; -import { dynamicImport } from '@wixc3/engine-runtime-node'; export async function loadConfigFile(filePath: string): Promise { try { - const configModuleValue = (await dynamicImport(pathToFileURL(filePath))).default; + const configModuleValue = (await import(pathToFileURL(filePath).href)).default; const config = (configModuleValue as { default: unknown }).default ?? configModuleValue; if (!config || typeof config !== 'object') { throw new Error(`config file: ${filePath} must export an object`); diff --git a/packages/engine-cli/src/node-config-manager.ts b/packages/engine-cli/src/node-config-manager.ts index 39060508d..8080e481d 100644 --- a/packages/engine-cli/src/node-config-manager.ts +++ b/packages/engine-cli/src/node-config-manager.ts @@ -2,7 +2,8 @@ import crypto from 'node:crypto'; import esbuild from 'esbuild'; import { join } from 'node:path'; import { deferred } from 'promise-assist'; -import { importFresh } from './import-fresh'; +import { importFresh } from './import-fresh.js'; +import { createRequire } from 'node:module'; type BuildStats = { error: unknown; @@ -130,6 +131,7 @@ export class NodeConfigManager { try { const text = outputFiles[0]!.text; const module = { exports: { default: undefined as any } }; + const require = createRequire(import.meta.url); // eslint-disable-next-line @typescript-eslint/no-implied-eval new Function('module', 'exports', 'require', '__dirname', '__filename', text)( module, diff --git a/packages/engine-cli/src/resolve-build-configurations.ts b/packages/engine-cli/src/resolve-build-configurations.ts index be844937d..8329c9bd4 100644 --- a/packages/engine-cli/src/resolve-build-configurations.ts +++ b/packages/engine-cli/src/resolve-build-configurations.ts @@ -1,9 +1,9 @@ import { IConfigDefinition, createFeatureEnvironmentsMapping } from '@wixc3/engine-runtime-node'; import { SetMultiMap } from '@wixc3/patterns'; -import { createEntryPoints } from './create-entrypoints'; -import type { IFeatureDefinition } from './types'; -import { createAllValidConfigurationsEnvironmentMapping } from './configuration-mapping'; -import { getResolvedEnvironments } from './environments'; +import { createEntryPoints } from './create-entrypoints.js'; +import type { IFeatureDefinition } from './types.js'; +import { createAllValidConfigurationsEnvironmentMapping } from './configuration-mapping.js'; +import { getResolvedEnvironments } from './environments.js'; export function resolveBuildEntryPoints({ features, diff --git a/packages/engine-cli/src/resolve-exec-argv.ts b/packages/engine-cli/src/resolve-exec-argv.ts index eb8d9fdf7..e29648305 100644 --- a/packages/engine-cli/src/resolve-exec-argv.ts +++ b/packages/engine-cli/src/resolve-exec-argv.ts @@ -1,10 +1,13 @@ +import { pathToFileURL } from 'node:url'; import { nodeFs as fs } from '@file-services/node'; -import type { EngineConfig } from './types'; -import { ENGINE_CONFIG_FILE_NAME } from './find-features/build-constants'; +import type { EngineConfig } from './types.js'; +import { ENGINE_CONFIG_FILE_NAME } from './find-features/build-constants.js'; export async function resolveExecArgv(basePath: string) { const engineConfig = await fs.promises.findClosestFile(basePath, ENGINE_CONFIG_FILE_NAME); - const { default: config } = (engineConfig ? await import(engineConfig) : {}) as { default?: EngineConfig }; + const { default: config } = (engineConfig ? await import(pathToFileURL(engineConfig).href) : {}) as { + default?: EngineConfig; + }; const execArgv = [...process.execArgv]; if (config?.require) { diff --git a/packages/engine-cli/src/run-environment.ts b/packages/engine-cli/src/run-environment.ts index ab821ac1f..0c5e3e64e 100644 --- a/packages/engine-cli/src/run-environment.ts +++ b/packages/engine-cli/src/run-environment.ts @@ -1,3 +1,4 @@ +import { pathToFileURL } from 'node:url'; import { nodeFs as fs } from '@file-services/node'; import { BaseHost, @@ -216,7 +217,7 @@ export async function getRunningFeature { try { - return ((await import(filePath)) as { default: unknown }).default; + return ((await import(pathToFileURL(filePath).href)) as { default: unknown }).default; } catch (ex) { throw new Error(`failed importing file: ${filePath}`, { cause: ex }); } diff --git a/packages/engine-cli/src/run-local-mode-manager.ts b/packages/engine-cli/src/run-local-mode-manager.ts index 87ee4e3a5..37fd39f2c 100644 --- a/packages/engine-cli/src/run-local-mode-manager.ts +++ b/packages/engine-cli/src/run-local-mode-manager.ts @@ -6,7 +6,7 @@ import { } from '@wixc3/engine-runtime-node'; import { join } from 'node:path'; import { pathToFileURL } from 'node:url'; -import { NodeConfigManager } from './node-config-manager'; +import { NodeConfigManager } from './node-config-manager.js'; export async function runLocalNodeManager( featureEnvironmentsMapping: FeatureEnvironmentMapping, diff --git a/packages/engine-cli/src/top-level-config-plugin-esbuild.ts b/packages/engine-cli/src/top-level-config-plugin-esbuild.ts index 8a8c3f7a5..dad7c71af 100644 --- a/packages/engine-cli/src/top-level-config-plugin-esbuild.ts +++ b/packages/engine-cli/src/top-level-config-plugin-esbuild.ts @@ -1,6 +1,7 @@ import { BuildOptions, Plugin } from 'esbuild'; import fs from 'node:fs'; import { dirname, resolve } from 'node:path'; +import { pathToFileURL } from 'node:url'; export function topLevelConfigPlugin({ emit = true }: { emit?: boolean }) { const plugin: Plugin = { @@ -73,7 +74,7 @@ async function emitConfigFile( } const rootContext = initialOptions.absWorkingDir || process.cwd(); - const imported = await import(resourcePath); + const imported = await import(pathToFileURL(resourcePath).href); const content = JSON.stringify(imported.default ?? imported); const configFileName = envName ? `${fileName!}.${envName}` : fileName; const configPath = `configs/${configFileName!}.json`; diff --git a/packages/runtime-node/package.json b/packages/runtime-node/package.json index d6600ca30..cd842b7ab 100644 --- a/packages/runtime-node/package.json +++ b/packages/runtime-node/package.json @@ -1,6 +1,7 @@ { "name": "@wixc3/engine-runtime-node", "version": "48.0.0", + "type": "module", "main": "dist/index.js", "exports": { ".": "./dist/index.js", diff --git a/packages/runtime-node/src/dynamic-import.ts b/packages/runtime-node/src/dynamic-import.ts deleted file mode 100644 index 255c3231b..000000000 --- a/packages/runtime-node/src/dynamic-import.ts +++ /dev/null @@ -1,5 +0,0 @@ -// until we move to native esm, we need to use this hack to get dynamic imports to work -// eslint-disable-next-line @typescript-eslint/no-implied-eval -export const dynamicImport = new Function('modulePath', 'return import(modulePath);') as ( - modulePath: string | URL, -) => Promise<{ default: unknown }>; diff --git a/packages/runtime-node/src/import-modules.ts b/packages/runtime-node/src/import-modules.ts index b17d8c565..a5f16769d 100644 --- a/packages/runtime-node/src/import-modules.ts +++ b/packages/runtime-node/src/import-modules.ts @@ -1,5 +1,5 @@ +import { createRequire } from 'node:module'; import { pathToFileURL } from 'node:url'; -import { dynamicImport } from './dynamic-import'; /** * Dynamically imports required modules using the specified base path. @@ -8,9 +8,10 @@ import { dynamicImport } from './dynamic-import'; * @throws An error if any of the required modules fail to import. */ export async function importModules(basePath: string, requiredModules: string[]): Promise { + const require = createRequire(import.meta.url); for (const requiredModule of requiredModules) { try { - await dynamicImport(pathToFileURL(require.resolve(requiredModule, { paths: [basePath] }))); + await import(pathToFileURL(require.resolve(requiredModule, { paths: [basePath] })).href); } catch (ex) { throw new Error(`failed importing: ${requiredModule}`, { cause: ex }); } diff --git a/packages/runtime-node/src/index.ts b/packages/runtime-node/src/index.ts index 438aa57b4..c5f74ce72 100644 --- a/packages/runtime-node/src/index.ts +++ b/packages/runtime-node/src/index.ts @@ -4,7 +4,6 @@ export * from './core-node/ipc-host.js'; export * from './core-node/local-env-inititializer.js'; export * from './core-node/parent-port-host.js'; export * from './core-node/ws-node-host.js'; -export * from './dynamic-import.js'; export * from './environments.js'; export * from './import-modules.js'; export * from './ipc-environment.js'; diff --git a/packages/runtime-node/src/load-top-level-config.ts b/packages/runtime-node/src/load-top-level-config.ts index a462dcfce..83784a49c 100644 --- a/packages/runtime-node/src/load-top-level-config.ts +++ b/packages/runtime-node/src/load-top-level-config.ts @@ -1,6 +1,7 @@ import type { SetMultiMap } from '@wixc3/patterns'; import type { TopLevelConfig } from '@wixc3/engine-core'; -import type { IConfigDefinition } from './types'; +import type { IConfigDefinition } from './types.js'; +import { pathToFileURL } from 'node:url'; export async function loadTopLevelConfigs( configName: string | undefined, @@ -24,11 +25,18 @@ export async function loadTopLevelConfigs( if (envName) { if (!definition.envName || definition.envName === envName) { config.push( - ...((await import(definition.filePath)) as { default: TopLevelConfig }).default, + ...( + (await import(pathToFileURL(definition.filePath).href)) as { + default: TopLevelConfig; + } + ).default, ); } } else { - config.push(...((await import(definition.filePath)) as { default: TopLevelConfig }).default); + config.push( + ...((await import(pathToFileURL(definition.filePath).href)) as { default: TopLevelConfig }) + .default, + ); } } catch (e) { throw new Error(`failed importing: ${definition.filePath}`, { cause: e }); diff --git a/packages/runtime-node/src/metadata-files.ts b/packages/runtime-node/src/metadata-files.ts index cff654aa4..bcdc817cf 100644 --- a/packages/runtime-node/src/metadata-files.ts +++ b/packages/runtime-node/src/metadata-files.ts @@ -4,7 +4,7 @@ import type { ConfigurationEnvironmentMapping, FeatureEnvironmentMapping, createFeatureEnvironmentsMapping, -} from './node-env-manager'; +} from './node-env-manager.js'; export function readMetadataFiles(dir: string) { try { diff --git a/packages/runtime-node/src/metrics-utils.ts b/packages/runtime-node/src/metrics-utils.ts index 606b9c456..fc9d55c0c 100644 --- a/packages/runtime-node/src/metrics-utils.ts +++ b/packages/runtime-node/src/metrics-utils.ts @@ -1,7 +1,7 @@ -import type { PerformanceMetrics } from './types'; +import type { PerformanceMetrics } from './types.js'; import type { ChildProcess } from 'node:child_process'; import { Worker } from '@wixc3/isomorphic-worker/worker'; -import { isValidRpcResponse, rpcCall, getNextMessageId, bindRpcListener } from './micro-rpc'; +import { isValidRpcResponse, rpcCall, getNextMessageId, bindRpcListener } from './micro-rpc.js'; export function bindMetricsListener( customFetcher: () => Promise | PerformanceMetrics = localPerformanceFetcher, diff --git a/packages/runtime-node/src/node-env-manager.ts b/packages/runtime-node/src/node-env-manager.ts index 2c4b6b562..dfb63e33c 100644 --- a/packages/runtime-node/src/node-env-manager.ts +++ b/packages/runtime-node/src/node-env-manager.ts @@ -7,15 +7,15 @@ import { parseInjectRuntimeConfigConfig, } from '@wixc3/engine-core'; import { IDisposable, SetMultiMap } from '@wixc3/patterns'; -import { fileURLToPath } from 'node:url'; +import { fileURLToPath, pathToFileURL } from 'node:url'; import { parseArgs } from 'node:util'; -import { WsServerHost } from './core-node/ws-node-host'; -import { resolveEnvironments } from './environments'; -import { ILaunchHttpServerOptions, launchEngineHttpServer } from './launch-http-server'; -import type { IStaticFeatureDefinition, PerformanceMetrics } from './types'; -import { runWorker } from './worker-thread-initializer2'; -import { getMetricsFromWorker, bindMetricsListener } from './metrics-utils'; -import { rpcCall } from './micro-rpc'; +import { WsServerHost } from './core-node/ws-node-host.js'; +import { resolveEnvironments } from './environments.js'; +import { ILaunchHttpServerOptions, launchEngineHttpServer } from './launch-http-server.js'; +import type { IStaticFeatureDefinition, PerformanceMetrics } from './types.js'; +import { runWorker } from './worker-thread-initializer2.js'; +import { getMetricsFromWorker, bindMetricsListener } from './metrics-utils.js'; +import { rpcCall } from './micro-rpc.js'; export type ConfigFilePath = string; @@ -210,7 +210,7 @@ export class NodeEnvManager implements IDisposable { async function requireModules(modulePaths: string[]) { const loadedModules: unknown[] = []; for (const modulePath of modulePaths) { - const importedModule = await import(modulePath); + const importedModule = await import(pathToFileURL(modulePath).href); loadedModules.push(importedModule.default ?? importedModule); } return loadedModules; @@ -252,7 +252,7 @@ function connectWorkerToHost(envName: string, worker: ReturnType { - rej(new Error(`failed initializing environment ${envName} with error message: ${JSON.stringify(e.data)}`)); + rej(new Error(`failed initializing environment ${envName}`, { cause: e.data })); }; worker.addEventListener('message', handleWorkerMessage); diff --git a/packages/runtime-node/src/node-environment.ts b/packages/runtime-node/src/node-environment.ts index 850df1356..593216feb 100644 --- a/packages/runtime-node/src/node-environment.ts +++ b/packages/runtime-node/src/node-environment.ts @@ -1,3 +1,4 @@ +import { pathToFileURL } from 'node:url'; import { COM, FeatureLoadersRegistry, @@ -82,7 +83,9 @@ export function createFeatureLoaders( const contextPreloadFilePath = preloadFilePaths[`${env.env}/${childEnvName}`]; if (contextPreloadFilePath) { - const preloadedContextModule = (await import(contextPreloadFilePath)) as IPreloadModule; + const preloadedContextModule = (await import( + pathToFileURL(contextPreloadFilePath).href + )) as IPreloadModule; if (preloadedContextModule.init) { initFunctions.push(preloadedContextModule.init); } @@ -90,7 +93,7 @@ export function createFeatureLoaders( } const preloadFilePath = preloadFilePaths[env.env]; if (preloadFilePath) { - const preloadedModule = (await import(preloadFilePath)) as IPreloadModule; + const preloadedModule = (await import(pathToFileURL(preloadFilePath).href)) as IPreloadModule; if (preloadedModule.init) { initFunctions.push(preloadedModule.init); } @@ -101,16 +104,16 @@ export function createFeatureLoaders( if (childEnvName && currentContext[env.env] === childEnvName) { const contextFilePath = contextFilePaths[`${env.env}/${childEnvName}`]; if (contextFilePath) { - await import(contextFilePath); + await import(pathToFileURL(contextFilePath).href); } } for (const { env: envName } of new Set([env, ...env.dependencies])) { const envFilePath = envFilePaths[envName]; if (envFilePath) { - await import(envFilePath); + await import(pathToFileURL(envFilePath).href); } } - return ((await import(filePath)) as { default: FeatureClass }).default; + return ((await import(pathToFileURL(filePath).href)) as { default: FeatureClass }).default; }, depFeatures: dependencies, resolvedContexts, diff --git a/packages/runtime-node/src/worker-thread-initializer.ts b/packages/runtime-node/src/worker-thread-initializer.ts index 5f698c009..14dd7b56a 100644 --- a/packages/runtime-node/src/worker-thread-initializer.ts +++ b/packages/runtime-node/src/worker-thread-initializer.ts @@ -17,8 +17,6 @@ export type WorkerThreadInitializerOptions = InitializerOptions & { }; }; -const workerThreadEntryPath = require.resolve('./worker-thread-entry'); - export function workerThreadInitializer({ communication, env, @@ -41,7 +39,7 @@ export function workerThreadInitializer({ const { requiredModules, basePath, config, featureName, features, runtimeOptions } = await metadataProvider.getMetadata(); - const worker = new Worker(workerThreadEntryPath, { + const worker = new Worker(new URL('./worker-thread-entry.js', import.meta.url), { workerData: { name: instanceId, }, diff --git a/packages/runtime-node/src/worker-thread-initializer2.ts b/packages/runtime-node/src/worker-thread-initializer2.ts index dc1f66297..1ed2ccece 100644 --- a/packages/runtime-node/src/worker-thread-initializer2.ts +++ b/packages/runtime-node/src/worker-thread-initializer2.ts @@ -2,8 +2,8 @@ import { IRunOptions, InitializerOptions, UniversalWorkerHost } from '@wixc3/eng import { Worker } from '@wixc3/isomorphic-worker/worker'; import { type UniversalWorkerOptions } from '@wixc3/isomorphic-worker/types'; import { createDisposables } from '@wixc3/patterns'; -import { PerformanceMetrics } from './types'; -import { getMetricsFromWorker } from './metrics-utils'; +import { PerformanceMetrics } from './types.js'; +import { getMetricsFromWorker } from './metrics-utils.js'; export interface WorkerThreadInitializer2 { id: string; diff --git a/packages/runtime-node/test/node-com.unit.ts b/packages/runtime-node/test/node-com.unit.ts index ba269fb48..594a1c3ef 100644 --- a/packages/runtime-node/test/node-com.unit.ts +++ b/packages/runtime-node/test/node-com.unit.ts @@ -295,7 +295,7 @@ describe('IPC communication', () => { it('communication with forked process', async () => { const mainHost = new BaseHost(); const communication = new Communication(mainHost, 'main'); - const forked = fork(require.resolve('./process-entry')); + const forked = fork(new URL('./process-entry.js', import.meta.url)); disposables.add('kill process', () => forked.kill()); const host = new IPCHost(forked); communication.registerEnv('process', host); @@ -313,7 +313,7 @@ describe('IPC communication', () => { it('handles forked process closing', async () => { const mainHost = new BaseHost(); const communication = new Communication(mainHost, 'main'); - const forked = fork(require.resolve('./process-entry')); + const forked = fork(new URL('./process-entry.js', import.meta.url)); const host = new IPCHost(forked); communication.registerEnv('process', host); communication.registerMessageHandler(host); diff --git a/packages/test-kit/package.json b/packages/test-kit/package.json index d3343ff16..4c546b8e2 100644 --- a/packages/test-kit/package.json +++ b/packages/test-kit/package.json @@ -1,6 +1,7 @@ { "name": "@wixc3/engine-test-kit", "version": "48.0.0", + "type": "module", "main": "dist/index.js", "exports": { ".": "./dist/index.js", diff --git a/packages/test-kit/src/with-feature.ts b/packages/test-kit/src/with-feature.ts index 4763b4887..ac0ca780c 100644 --- a/packages/test-kit/src/with-feature.ts +++ b/packages/test-kit/src/with-feature.ts @@ -9,7 +9,7 @@ import { reporters } from 'mocha'; import { hookPageConsole } from './hook-page-console.js'; import { normalizeTestName } from './normalize-test-name.js'; import { validateBrowser } from './supported-browsers.js'; -import { ensureTracePath } from './utils/'; +import { ensureTracePath } from './utils/index.js'; import { type ChildProcess, spawn, spawnSync, type SpawnSyncOptions } from 'node:child_process'; import { createTempDirectorySync } from 'create-temp-directory'; import { linkNodeModules } from './link-test-dir.js'; diff --git a/packages/test-kit/test/run-environment.unit.ts b/packages/test-kit/test/run-environment.unit.ts index 03d30e206..36af7149e 100644 --- a/packages/test-kit/test/run-environment.unit.ts +++ b/packages/test-kit/test/run-environment.unit.ts @@ -1,12 +1,14 @@ import workerThreadFeature, { serverEnv } from '@fixture/worker-thread/dist/worker-thread.feature.js'; import { getRunningFeature } from '@wixc3/engine-test-kit'; import { expect } from 'chai'; +import { createRequire } from 'node:module'; import path from 'node:path'; -const featurePath = path.dirname(require.resolve('@fixture/worker-thread/package.json')); - describe('runs environment', () => { it('runs environment with workerthread support', async () => { + const require = createRequire(import.meta.url); + const featurePath = path.dirname(require.resolve('@fixture/worker-thread/package.json')); + const { runningApi } = await getRunningFeature({ env: serverEnv, feature: workerThreadFeature, diff --git a/test-fixtures/3rd-party/package.json b/test-fixtures/3rd-party/package.json index 250e50118..32c9182d3 100644 --- a/test-fixtures/3rd-party/package.json +++ b/test-fixtures/3rd-party/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/3rd-party", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/application-external/package.json b/test-fixtures/application-external/package.json index da4a5b4e9..ec0d8e802 100644 --- a/test-fixtures/application-external/package.json +++ b/test-fixtures/application-external/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/application-external-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/base-web-application/package.json b/test-fixtures/base-web-application/package.json index 03667e98f..5c0780d27 100644 --- a/test-fixtures/base-web-application/package.json +++ b/test-fixtures/base-web-application/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/base-web-application-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/contextual/package.json b/test-fixtures/contextual/package.json index 471cbad3d..fc8f61247 100644 --- a/test-fixtures/contextual/package.json +++ b/test-fixtures/contextual/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/contextual-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/default-args-echo/package.json b/test-fixtures/default-args-echo/package.json index e31df067a..8376398ca 100644 --- a/test-fixtures/default-args-echo/package.json +++ b/test-fixtures/default-args-echo/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-default-args-echo", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/disconnecting-env/package.json b/test-fixtures/disconnecting-env/package.json index dda374425..05967f7e8 100644 --- a/test-fixtures/disconnecting-env/package.json +++ b/test-fixtures/disconnecting-env/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/disconnecting-env", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/engine-config/package.json b/test-fixtures/engine-config/package.json index 6b392ca77..c2c252426 100644 --- a/test-fixtures/engine-config/package.json +++ b/test-fixtures/engine-config/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-config-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/engine-env-dependency/package.json b/test-fixtures/engine-env-dependency/package.json index 808f74357..76e2b455a 100644 --- a/test-fixtures/engine-env-dependency/package.json +++ b/test-fixtures/engine-env-dependency/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-env-dependency", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/engine-feature-roots/package.json b/test-fixtures/engine-feature-roots/package.json index b00396017..5f4d5e9a0 100644 --- a/test-fixtures/engine-feature-roots/package.json +++ b/test-fixtures/engine-feature-roots/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-feature-roots", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/engine-multi-feature/package.json b/test-fixtures/engine-multi-feature/package.json index efcdee760..cc41def84 100644 --- a/test-fixtures/engine-multi-feature/package.json +++ b/test-fixtures/engine-multi-feature/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-multi-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/engine-run-options/package.json b/test-fixtures/engine-run-options/package.json index 62bc4b697..e42935a62 100644 --- a/test-fixtures/engine-run-options/package.json +++ b/test-fixtures/engine-run-options/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-run-options", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/engine-single-feature/package.json b/test-fixtures/engine-single-feature/package.json index e711a7dd2..7b8e87758 100644 --- a/test-fixtures/engine-single-feature/package.json +++ b/test-fixtures/engine-single-feature/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-single-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/multi-node/package.json b/test-fixtures/multi-node/package.json index e1d31f88c..35bb0ed9d 100644 --- a/test-fixtures/multi-node/package.json +++ b/test-fixtures/multi-node/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-multi-node", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/multi-socket-node/package.json b/test-fixtures/multi-socket-node/package.json index 4b057f860..df92bac30 100644 --- a/test-fixtures/multi-socket-node/package.json +++ b/test-fixtures/multi-socket-node/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-multi-socket-node", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/node-env/package.json b/test-fixtures/node-env/package.json index a2926babc..637fddbd3 100644 --- a/test-fixtures/node-env/package.json +++ b/test-fixtures/node-env/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/engine-node", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/static-application-external/package.json b/test-fixtures/static-application-external/package.json index 84526cf7d..9b03b07ce 100644 --- a/test-fixtures/static-application-external/package.json +++ b/test-fixtures/static-application-external/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/static-application-external-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/static-base-web-application-config-loader/package.json b/test-fixtures/static-base-web-application-config-loader/package.json index 0f3fda1c0..d54cc553d 100644 --- a/test-fixtures/static-base-web-application-config-loader/package.json +++ b/test-fixtures/static-base-web-application-config-loader/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/static-base-web-application-config-loader", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/static-base-web-application/package.json b/test-fixtures/static-base-web-application/package.json index de3aa44c3..46d06264f 100644 --- a/test-fixtures/static-base-web-application/package.json +++ b/test-fixtures/static-base-web-application/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/static-base-web-application-feature", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/using-config/package.json b/test-fixtures/using-config/package.json index 5d03c4077..2bd766d07 100644 --- a/test-fixtures/using-config/package.json +++ b/test-fixtures/using-config/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/configs", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/with-iframe/package.json b/test-fixtures/with-iframe/package.json index e2f102e78..a7356735c 100644 --- a/test-fixtures/with-iframe/package.json +++ b/test-fixtures/with-iframe/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/with-iframe", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/worker-thread/package.json b/test-fixtures/worker-thread/package.json index d09800071..e8cf33c4f 100644 --- a/test-fixtures/worker-thread/package.json +++ b/test-fixtures/worker-thread/package.json @@ -2,6 +2,7 @@ "name": "@fixture/worker-thread", "version": "48.0.0", "private": true, + "type": "module", "dependencies": { "@wixc3/engine-core": "^48.0.0", "@wixc3/engine-runtime-node": "^48.0.0" diff --git a/test-fixtures/workspace/package.json b/test-fixtures/workspace/package.json index 57aea098d..2e06a4524 100644 --- a/test-fixtures/workspace/package.json +++ b/test-fixtures/workspace/package.json @@ -1,8 +1,9 @@ { "name": "@fixture/workspace", "version": "48.0.0", + "private": true, + "type": "module", "workspaces": [ "packages/*" - ], - "private": true + ] } diff --git a/test-fixtures/workspace/packages/a/package.json b/test-fixtures/workspace/packages/a/package.json index 2c554d05a..3fc891248 100644 --- a/test-fixtures/workspace/packages/a/package.json +++ b/test-fixtures/workspace/packages/a/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/a-in-workspace", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/test-fixtures/workspace/packages/b/package.json b/test-fixtures/workspace/packages/b/package.json index 1c0a61236..13e0b0c32 100644 --- a/test-fixtures/workspace/packages/b/package.json +++ b/test-fixtures/workspace/packages/b/package.json @@ -1,5 +1,6 @@ { "name": "@fixture/b-in-workspace", "version": "48.0.0", - "private": true + "private": true, + "type": "module" } diff --git a/tsconfig.base.json b/tsconfig.base.json index ba64e12cc..fba20dde2 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -25,9 +25,9 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ + "module": "node16", /* Specify what module code is generated. */ // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "moduleResolution": "node16", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */