diff --git a/.eslintrc.js b/.eslintrc.js index 15341a5273..e42437abd1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -41,5 +41,23 @@ module.exports = { 'import/no-extraneous-dependencies': 'off', }, }, + { + files: ['packages/**/*.js'], + rules: { + 'import/no-commonjs': 'error', + }, + }, + { + files: [ + 'packages/metro/src/integration_tests/**/*.js', + 'packages/metro-runtime/**/*.js', + '**/__tests__/**/*.js', + '**/__mocks__/**/*.js', + '**/__fixtures__/**/*.js', + ], + rules: { + 'import/no-commonjs': 'off', + }, + }, ], }; diff --git a/packages/buck-worker-tool/src/CommandFailedError.js b/packages/buck-worker-tool/src/CommandFailedError.js index 221a66f1c5..fa40aca5b8 100644 --- a/packages/buck-worker-tool/src/CommandFailedError.js +++ b/packages/buck-worker-tool/src/CommandFailedError.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - /** * Thrown to indicate the command failed and already output relevant error * information on the console. */ -class CommandFailedError extends Error { +export default class CommandFailedError extends Error { constructor() { super( 'The Buck worker-tool command failed. Diagnostics should have ' + @@ -23,5 +21,3 @@ class CommandFailedError extends Error { ); } } - -module.exports = CommandFailedError; diff --git a/packages/buck-worker-tool/src/profiling.js b/packages/buck-worker-tool/src/profiling.js index 0b1d6b1e81..3903bc0b0e 100644 --- a/packages/buck-worker-tool/src/profiling.js +++ b/packages/buck-worker-tool/src/profiling.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const fs = require('fs'); +import fs from 'fs'; let currentInspectorSession; let isProfiling = false; @@ -20,13 +18,14 @@ function getInspectorSession() { if (currentInspectorSession) { return currentInspectorSession; } + // eslint-disable-next-line import/no-commonjs const inspector = require('inspector'); currentInspectorSession = new inspector.Session(); currentInspectorSession.connect(); return currentInspectorSession; } -async function startProfiling() { +export async function startProfiling() { if (isProfiling) { return; } @@ -37,7 +36,7 @@ async function startProfiling() { isProfiling = true; } -async function stopProfilingAndWrite(workerName: ?string) { +export async function stopProfilingAndWrite(workerName: ?string) { if (!isProfiling) { return; } @@ -56,8 +55,3 @@ async function stopProfilingAndWrite(workerName: ?string) { ); isProfiling = false; } - -module.exports = { - stopProfilingAndWrite, - startProfiling, -}; diff --git a/packages/buck-worker-tool/src/third-party/JSONStream.js b/packages/buck-worker-tool/src/third-party/JSONStream.js index 3081dfa472..8c4ba97e7f 100644 --- a/packages/buck-worker-tool/src/third-party/JSONStream.js +++ b/packages/buck-worker-tool/src/third-party/JSONStream.js @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable import/no-commonjs */ + /** * Copyright (c) 2011 Dominic Tarr. * Based on the JSONStream package: https://github.com/dominictarr/JSONStream diff --git a/packages/buck-worker-tool/src/worker-tool.js b/packages/buck-worker-tool/src/worker-tool.js index 369020f184..f39b0a1a75 100644 --- a/packages/buck-worker-tool/src/worker-tool.js +++ b/packages/buck-worker-tool/src/worker-tool.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {Writable} from 'stream'; -const {startProfiling, stopProfilingAndWrite} = require('./profiling'); -const JSONStream = require('./third-party/JSONStream'); -const {Console} = require('console'); -const duplexer = require('duplexer'); -const fs = require('fs'); -const invariant = require('invariant'); +import {startProfiling, stopProfilingAndWrite} from './profiling'; +import JSONStream from './third-party/JSONStream'; +import {Console} from 'console'; +import duplexer from 'duplexer'; +import fs from 'fs'; +import invariant from 'invariant'; export type Command = ( argv: Array, @@ -294,4 +292,4 @@ const success = (id: number) => ({ exit_code: 0 as const, }); -module.exports = {buckWorker}; +export {buckWorker}; diff --git a/packages/metro-babel-register/src/babel-register.js b/packages/metro-babel-register/src/babel-register.js index 661f17c5c5..3a79ac88ae 100644 --- a/packages/metro-babel-register/src/babel-register.js +++ b/packages/metro-babel-register/src/babel-register.js @@ -9,6 +9,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; /*:: diff --git a/packages/metro-babel-register/src/plugins/babel-plugin-metro-replace-ts-require-assignment.js b/packages/metro-babel-register/src/plugins/babel-plugin-metro-replace-ts-require-assignment.js index 03823be755..89ef7a67ab 100644 --- a/packages/metro-babel-register/src/plugins/babel-plugin-metro-replace-ts-require-assignment.js +++ b/packages/metro-babel-register/src/plugins/babel-plugin-metro-replace-ts-require-assignment.js @@ -8,6 +8,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; // Replace `import thing = require('thing')` with `const thing = require('thing')` which allows us to keep CJS semantics diff --git a/packages/metro-babel-transformer/src/index.js b/packages/metro-babel-transformer/src/index.js index 47e7afad11..7cbe2d1813 100644 --- a/packages/metro-babel-transformer/src/index.js +++ b/packages/metro-babel-transformer/src/index.js @@ -9,12 +9,10 @@ * @oncall react_native */ -'use strict'; - import type {BabelCoreOptions, BabelFileMetadata} from '@babel/core'; -const {parseSync, transformFromAstSync} = require('@babel/core'); -const nullthrows = require('nullthrows'); +import {parseSync, transformFromAstSync} from '@babel/core'; +import nullthrows from 'nullthrows'; export type CustomTransformOptions = { [string]: mixed, @@ -81,7 +79,12 @@ export type BabelTransformer = $ReadOnly<{ getCacheKey?: () => string, }>; -function transform({filename, options, plugins, src}: BabelTransformerArgs) { +function transform({ + filename, + options, + plugins, + src, +}: BabelTransformerArgs): ReturnType { const OLD_BABEL_ENV = process.env.BABEL_ENV; process.env.BABEL_ENV = options.dev ? 'development' @@ -105,8 +108,8 @@ function transform({filename, options, plugins, src}: BabelTransformerArgs) { // You get this behavior by default when using Babel's `transform` method directly. cloneInputAst: false, }; - const sourceAst: BabelNodeFile = options.hermesParser - ? // $FlowFixMe[incompatible-exact] + const sourceAst = options.hermesParser + ? // eslint-disable-next-line import/no-commonjs require('hermes-parser').parse(src, { babel: true, sourceType: babelConfig.sourceType, @@ -114,6 +117,7 @@ function transform({filename, options, plugins, src}: BabelTransformerArgs) { : parseSync(src, babelConfig); const transformResult = transformFromAstSync( + // $FlowFixMe[incompatible-call] BabelFile vs BabelNodeFile sourceAst, src, babelConfig, @@ -130,6 +134,9 @@ function transform({filename, options, plugins, src}: BabelTransformerArgs) { } } -module.exports = ({ - transform, -}: BabelTransformer); +// Type check exports +/*:: +({transform}) as BabelTransformer; +*/ + +export {transform}; diff --git a/packages/metro-cache-key/src/index.js b/packages/metro-cache-key/src/index.js index 62c56be0a4..e6329e74b5 100644 --- a/packages/metro-cache-key/src/index.js +++ b/packages/metro-cache-key/src/index.js @@ -9,12 +9,10 @@ * @oncall react_native */ -'use strict'; +import crypto from 'crypto'; +import fs from 'fs'; -const crypto = require('crypto'); -const fs = require('fs'); - -function getCacheKey(files: Array): string { +export function getCacheKey(files: Array): string { return files .reduce( (hash, file) => hash.update('\0', 'utf8').update(fs.readFileSync(file)), @@ -22,5 +20,3 @@ function getCacheKey(files: Array): string { ) .digest('hex'); } - -module.exports = {getCacheKey}; diff --git a/packages/metro-cache/src/Cache.js b/packages/metro-cache/src/Cache.js index 58c8d8dae6..bb15396116 100644 --- a/packages/metro-cache/src/Cache.js +++ b/packages/metro-cache/src/Cache.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {CacheStore} from 'metro-cache'; -const {Logger} = require('metro-core'); +import {Logger} from 'metro-core'; /** * Main cache class. Receives an array of cache instances, and sequentially @@ -22,7 +20,7 @@ const {Logger} = require('metro-core'); * * All get/set operations are logged via Metro's logger. */ -class Cache { +export default class Cache { _stores: $ReadOnlyArray>; _hits: WeakMap>; @@ -138,5 +136,3 @@ class Cache { return this._stores.length === 0; } } - -module.exports = Cache; diff --git a/packages/metro-cache/src/__tests__/Cache-test.js b/packages/metro-cache/src/__tests__/Cache-test.js index 438d54445b..8be9dcfd74 100644 --- a/packages/metro-cache/src/__tests__/Cache-test.js +++ b/packages/metro-cache/src/__tests__/Cache-test.js @@ -29,7 +29,7 @@ describe('Cache', () => { beforeEach(() => { Logger = require('metro-core').Logger; - Cache = require('../Cache'); + Cache = require('../Cache').default; Logger.on('log', item => { log.push({ diff --git a/packages/metro-cache/src/__tests__/stableHash-test.js b/packages/metro-cache/src/__tests__/stableHash-test.js index dee3c46bd9..0ddb3d07c8 100644 --- a/packages/metro-cache/src/__tests__/stableHash-test.js +++ b/packages/metro-cache/src/__tests__/stableHash-test.js @@ -8,9 +8,7 @@ * @oncall react_native */ -'use strict'; - -const stableHash = require('../stableHash'); +import stableHash from '../stableHash'; describe('stableHash', () => { test('ensures that the hash implementation supports switched order properties', () => { diff --git a/packages/metro-cache/src/index.js b/packages/metro-cache/src/index.js index 7fe8c51f86..60226929d7 100644 --- a/packages/metro-cache/src/index.js +++ b/packages/metro-cache/src/index.js @@ -9,23 +9,22 @@ * @oncall react_native */ -'use strict'; - -const Cache = require('./Cache'); -const stableHash = require('./stableHash'); -const AutoCleanFileStore = require('./stores/AutoCleanFileStore'); -const FileStore = require('./stores/FileStore'); -const HttpGetStore = require('./stores/HttpGetStore'); -const HttpStore = require('./stores/HttpStore'); +import Cache from './Cache'; +import stableHash from './stableHash'; +import AutoCleanFileStore from './stores/AutoCleanFileStore'; +import FileStore from './stores/FileStore'; +import HttpGetStore from './stores/HttpGetStore'; +import HttpStore from './stores/HttpStore'; export type {Options as FileOptions} from './stores/FileStore'; export type {Options as HttpOptions} from './stores/HttpStore'; export type {CacheStore} from './types'; -module.exports.AutoCleanFileStore = AutoCleanFileStore; -module.exports.Cache = Cache; -module.exports.FileStore = FileStore; -module.exports.HttpGetStore = HttpGetStore; -module.exports.HttpStore = HttpStore; - -module.exports.stableHash = stableHash; +export { + AutoCleanFileStore, + Cache, + FileStore, + HttpGetStore, + HttpStore, + stableHash, +}; diff --git a/packages/metro-cache/src/stableHash.js b/packages/metro-cache/src/stableHash.js index 5f181b7ac6..eb1b353459 100644 --- a/packages/metro-cache/src/stableHash.js +++ b/packages/metro-cache/src/stableHash.js @@ -9,12 +9,10 @@ * @oncall react_native */ -'use strict'; +import crypto from 'crypto'; +import canonicalize from 'metro-core/private/canonicalize'; -const crypto = require('crypto'); -const canonicalize = require('metro-core/private/canonicalize'); - -function stableHash(value: mixed): Buffer { +export default function stableHash(value: mixed): Buffer { return ( crypto .createHash('md5') @@ -25,5 +23,3 @@ function stableHash(value: mixed): Buffer { .digest('buffer') ); } - -module.exports = stableHash; diff --git a/packages/metro-cache/src/stores/AutoCleanFileStore.js b/packages/metro-cache/src/stores/AutoCleanFileStore.js index 27978fa46a..effde7df9b 100644 --- a/packages/metro-cache/src/stores/AutoCleanFileStore.js +++ b/packages/metro-cache/src/stores/AutoCleanFileStore.js @@ -8,13 +8,11 @@ * @flow */ -'use strict'; - import type {Options} from './FileStore'; -const FileStore = require('./FileStore'); -const fs = require('fs'); -const path = require('path'); +import FileStore from './FileStore'; +import fs from 'fs'; +import path from 'path'; type CleanOptions = { ...Options, @@ -59,7 +57,7 @@ function get(property: ?T, defaultValue: T): T { /** * A FileStore that cleans itself up in a given interval */ -class AutoCleanFileStore extends FileStore { +export default class AutoCleanFileStore extends FileStore { _intervalMs: number; _cleanupThresholdMs: number; _root: string; @@ -103,5 +101,3 @@ class AutoCleanFileStore extends FileStore { this._scheduleCleanup(); } } - -module.exports = AutoCleanFileStore; diff --git a/packages/metro-cache/src/stores/FileStore.js b/packages/metro-cache/src/stores/FileStore.js index a0639f27bb..fc37b558da 100644 --- a/packages/metro-cache/src/stores/FileStore.js +++ b/packages/metro-cache/src/stores/FileStore.js @@ -8,10 +8,8 @@ * @flow */ -'use strict'; - -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; const NULL_BYTE = 0x00; const NULL_BYTE_BUFFER = Buffer.from([NULL_BYTE]); @@ -20,7 +18,7 @@ export type Options = { root: string, }; -class FileStore { +export default class FileStore { _root: string; constructor(options: Options) { @@ -90,5 +88,3 @@ class FileStore { } } } - -module.exports = FileStore; diff --git a/packages/metro-cache/src/stores/HttpError.js b/packages/metro-cache/src/stores/HttpError.js index d19114711f..4baf14a5d0 100644 --- a/packages/metro-cache/src/stores/HttpError.js +++ b/packages/metro-cache/src/stores/HttpError.js @@ -8,9 +8,7 @@ * @flow strict */ -'use strict'; - -class HttpError extends Error { +export default class HttpError extends Error { code: number; constructor(message: string, code: number) { @@ -19,5 +17,3 @@ class HttpError extends Error { this.code = code; } } - -module.exports = HttpError; diff --git a/packages/metro-cache/src/stores/HttpGetStore.js b/packages/metro-cache/src/stores/HttpGetStore.js index 9dc163651a..7608b7801a 100644 --- a/packages/metro-cache/src/stores/HttpGetStore.js +++ b/packages/metro-cache/src/stores/HttpGetStore.js @@ -8,16 +8,14 @@ * @flow strict-local */ -'use strict'; - import type HttpError from './HttpError'; import type NetworkError from './NetworkError'; import type {HttpOptions} from 'metro-cache'; -const HttpStore = require('./HttpStore'); -const {Logger} = require('metro-core'); +import HttpStore from './HttpStore'; +import {Logger} from 'metro-core'; -class HttpGetStore extends HttpStore { +export default class HttpGetStore extends HttpStore { _warned: boolean; constructor(options: HttpOptions) { @@ -66,5 +64,3 @@ class HttpGetStore extends HttpStore { } } } - -module.exports = HttpGetStore; diff --git a/packages/metro-cache/src/stores/HttpStore.js b/packages/metro-cache/src/stores/HttpStore.js index 73020852c4..3269d25780 100644 --- a/packages/metro-cache/src/stores/HttpStore.js +++ b/packages/metro-cache/src/stores/HttpStore.js @@ -8,17 +8,15 @@ * @flow */ -'use strict'; - import type {HttpsProxyAgentOptions} from 'https-proxy-agent'; -const HttpError = require('./HttpError'); -const NetworkError = require('./NetworkError'); -const {backOff} = require('exponential-backoff'); -const http = require('http'); -const https = require('https'); -const {HttpsProxyAgent} = require('https-proxy-agent'); -const zlib = require('zlib'); +import HttpError from './HttpError'; +import NetworkError from './NetworkError'; +import {backOff} from 'exponential-backoff'; +import http from 'http'; +import https from 'https'; +import {HttpsProxyAgent} from 'https-proxy-agent'; +import zlib from 'zlib'; export type Options = | EndpointOptions // Uses the same options for both reads and writes @@ -76,7 +74,7 @@ const ZLIB_OPTIONS = { const NULL_BYTE = 0x00; const NULL_BYTE_BUFFER = Buffer.from([NULL_BYTE]); -class HttpStore { +export default class HttpStore { static HttpError: typeof HttpError = HttpError; static NetworkError: typeof NetworkError = NetworkError; @@ -407,5 +405,3 @@ class HttpStore { }); } } - -module.exports = HttpStore; diff --git a/packages/metro-cache/src/stores/NetworkError.js b/packages/metro-cache/src/stores/NetworkError.js index 850a7bda98..b3ec18cc16 100644 --- a/packages/metro-cache/src/stores/NetworkError.js +++ b/packages/metro-cache/src/stores/NetworkError.js @@ -8,9 +8,7 @@ * @flow strict */ -'use strict'; - -class NetworkError extends Error { +export default class NetworkError extends Error { code: string; constructor(message: string, code: string) { @@ -19,5 +17,3 @@ class NetworkError extends Error { this.code = code; } } - -module.exports = NetworkError; diff --git a/packages/metro-cache/src/stores/__tests__/AutoCleanFileStore-test.js b/packages/metro-cache/src/stores/__tests__/AutoCleanFileStore-test.js index c2b962f076..af314226b8 100644 --- a/packages/metro-cache/src/stores/__tests__/AutoCleanFileStore-test.js +++ b/packages/metro-cache/src/stores/__tests__/AutoCleanFileStore-test.js @@ -21,7 +21,7 @@ describe('AutoCleanFileStore', () => { .resetAllMocks() .mock('fs', () => new (require('metro-memory-fs'))()); - AutoCleanFileStore = require('../AutoCleanFileStore'); + AutoCleanFileStore = require('../AutoCleanFileStore').default; fs = require('fs'); jest.spyOn(fs, 'unlinkSync'); }); diff --git a/packages/metro-cache/src/stores/__tests__/FileStore-test.js b/packages/metro-cache/src/stores/__tests__/FileStore-test.js index 0f9cdd4ca9..027e7d3eb4 100644 --- a/packages/metro-cache/src/stores/__tests__/FileStore-test.js +++ b/packages/metro-cache/src/stores/__tests__/FileStore-test.js @@ -22,7 +22,7 @@ describe('FileStore', () => { .resetAllMocks() .mock('fs', () => new (require('metro-memory-fs'))()); - FileStore = require('../FileStore'); + FileStore = require('../FileStore').default; fs = require('fs'); jest.spyOn(fs, 'unlinkSync'); }); diff --git a/packages/metro-cache/src/stores/__tests__/HttpGetStore-test.js b/packages/metro-cache/src/stores/__tests__/HttpGetStore-test.js index a98d97789a..6729996999 100644 --- a/packages/metro-cache/src/stores/__tests__/HttpGetStore-test.js +++ b/packages/metro-cache/src/stores/__tests__/HttpGetStore-test.js @@ -1,3 +1,10 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + 'use strict'; const {PassThrough} = require('stream'); @@ -35,7 +42,7 @@ describe('HttpGetStore', () => { httpPassThrough = new PassThrough(); require('http').request.mockReturnValue(httpPassThrough); - HttpGetStore = require('../HttpGetStore'); + HttpGetStore = require('../HttpGetStore').default; warningMessages = []; diff --git a/packages/metro-cache/src/stores/__tests__/HttpStore-test.js b/packages/metro-cache/src/stores/__tests__/HttpStore-test.js index 2d972e5954..e8496ab2b9 100644 --- a/packages/metro-cache/src/stores/__tests__/HttpStore-test.js +++ b/packages/metro-cache/src/stores/__tests__/HttpStore-test.js @@ -67,7 +67,7 @@ describe('HttpStore', () => { require('http').request.mockReturnValue(httpPassThrough); require('https').request.mockReturnValue(httpPassThrough); - HttpStore = require('../HttpStore'); + HttpStore = require('../HttpStore').default; }); test('works with HTTP and HTTPS', () => { diff --git a/packages/metro-cache/src/types.js b/packages/metro-cache/src/types.js index f4f3a27bff..f903231a83 100644 --- a/packages/metro-cache/src/types.js +++ b/packages/metro-cache/src/types.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - export interface CacheStore { name?: string; get(key: Buffer): ?T | Promise; diff --git a/packages/metro-config/src/__tests__/loadConfig-test.js b/packages/metro-config/src/__tests__/loadConfig-test.js index 99525c6c85..f039f3982f 100644 --- a/packages/metro-config/src/__tests__/loadConfig-test.js +++ b/packages/metro-config/src/__tests__/loadConfig-test.js @@ -9,11 +9,11 @@ * @oncall react_native */ -'use strict'; +// eslint-disable-next-line lint/sort-imports +import getDefaultConfig from '../defaults'; jest.mock('cosmiconfig'); -const getDefaultConfig = require('../defaults'); const {loadConfig} = require('../loadConfig'); const cosmiconfig = require('cosmiconfig'); const path = require('path'); diff --git a/packages/metro-config/src/defaults/__tests__/exclusionList-test.js b/packages/metro-config/src/defaults/__tests__/exclusionList-test.js index d3e36bea3a..824387fe89 100644 --- a/packages/metro-config/src/defaults/__tests__/exclusionList-test.js +++ b/packages/metro-config/src/defaults/__tests__/exclusionList-test.js @@ -9,9 +9,8 @@ * @oncall react_native */ -'use strict'; +import exclusionList from '../exclusionList'; -const exclusionList = require('../exclusionList'); const path = require('path'); describe('exclusionList', () => { diff --git a/packages/metro-config/src/defaults/defaults.js b/packages/metro-config/src/defaults/defaults.js index ab2a058153..43976cf8dd 100644 --- a/packages/metro-config/src/defaults/defaults.js +++ b/packages/metro-config/src/defaults/defaults.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {PerfLogger, RootPerfLogger} from '../types'; -const defaultCreateModuleIdFactory = require('metro/private/lib/createModuleIdFactory'); +export {default as defaultCreateModuleIdFactory} from 'metro/private/lib/createModuleIdFactory'; -exports.assetExts = [ +export const assetExts = [ // Image formats 'bmp', 'gif', @@ -52,23 +50,21 @@ exports.assetExts = [ 'zip', ]; -exports.assetResolutions = ['1', '1.5', '2', '3', '4']; +export const assetResolutions = ['1', '1.5', '2', '3', '4']; -exports.sourceExts = ['js', 'jsx', 'json', 'ts', 'tsx']; +export const sourceExts = ['js', 'jsx', 'json', 'ts', 'tsx']; -exports.additionalExts = ['cjs', 'mjs']; +export const additionalExts = ['cjs', 'mjs']; -exports.moduleSystem = (require.resolve( +export const moduleSystem = (require.resolve( 'metro-runtime/src/polyfills/require.js', ): string); -exports.platforms = ['ios', 'android', 'windows', 'web']; - -exports.DEFAULT_METRO_MINIFIER_PATH = 'metro-minify-terser'; +export const platforms = ['ios', 'android', 'windows', 'web']; -exports.defaultCreateModuleIdFactory = defaultCreateModuleIdFactory; +export const DEFAULT_METRO_MINIFIER_PATH = 'metro-minify-terser'; -exports.noopPerfLoggerFactory = (): RootPerfLogger => { +export const noopPerfLoggerFactory = (): RootPerfLogger => { class Logger { start() {} end() {} diff --git a/packages/metro-config/src/defaults/exclusionList.js b/packages/metro-config/src/defaults/exclusionList.js index 6728f673bb..303bcef5e8 100644 --- a/packages/metro-config/src/defaults/exclusionList.js +++ b/packages/metro-config/src/defaults/exclusionList.js @@ -8,9 +8,7 @@ * @oncall react_native */ -'use strict'; - -var path = require('path'); +import path from 'path'; var list = [/\/__tests__\/.*/]; @@ -36,12 +34,10 @@ function escapeRegExp(pattern) { } } -function exclusionList(additionalExclusions) { +export default function exclusionList(additionalExclusions) { return new RegExp( '(' + (additionalExclusions || []).concat(list).map(escapeRegExp).join('|') + ')$', ); } - -module.exports = exclusionList; diff --git a/packages/metro-config/src/defaults/index.js b/packages/metro-config/src/defaults/index.js index da707a75ee..0a590cc031 100644 --- a/packages/metro-config/src/defaults/index.js +++ b/packages/metro-config/src/defaults/index.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {ConfigT} from '../types'; -const { +import { DEFAULT_METRO_MINIFIER_PATH, additionalExts, assetExts, @@ -22,14 +20,14 @@ const { noopPerfLoggerFactory, platforms, sourceExts, -} = require('./defaults'); -const exclusionList = require('./exclusionList'); -const {FileStore} = require('metro-cache'); -const {Terminal} = require('metro-core'); -const getMaxWorkers = require('metro/private/lib/getMaxWorkers'); -const TerminalReporter = require('metro/private/lib/TerminalReporter'); -const os = require('os'); -const path = require('path'); +} from './defaults'; +import exclusionList from './exclusionList'; +import {FileStore} from 'metro-cache'; +import {Terminal} from 'metro-core'; +import getMaxWorkers from 'metro/private/lib/getMaxWorkers'; +import TerminalReporter from 'metro/private/lib/TerminalReporter'; +import os from 'os'; +import path from 'path'; const getDefaultValues = (projectRoot: ?string): ConfigT => ({ resolver: { @@ -182,4 +180,4 @@ async function getDefaultConfig(rootPath: ?string): Promise { } getDefaultConfig.getDefaultValues = getDefaultValues; -module.exports = getDefaultConfig; +export default getDefaultConfig; diff --git a/packages/metro-config/src/defaults/validConfig.js b/packages/metro-config/src/defaults/validConfig.js index 037cb0c22d..60b3dcc673 100644 --- a/packages/metro-config/src/defaults/validConfig.js +++ b/packages/metro-config/src/defaults/validConfig.js @@ -9,10 +9,12 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; module.exports = (async () => { - const defaultConfig = await require('./index')('/path/to/project'); + const defaultConfig = await require('./index').default('/path/to/project'); const validConfig = { ...defaultConfig, resolver: { diff --git a/packages/metro-config/src/index.js b/packages/metro-config/src/index.js index 47a8753481..ad754a8d16 100644 --- a/packages/metro-config/src/index.js +++ b/packages/metro-config/src/index.js @@ -9,6 +9,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; /*:: diff --git a/packages/metro-config/src/loadConfig.js b/packages/metro-config/src/loadConfig.js index 3f54a1dc40..f5ed2cff8b 100644 --- a/packages/metro-config/src/loadConfig.js +++ b/packages/metro-config/src/loadConfig.js @@ -9,18 +9,16 @@ * @oncall react_native */ -'use strict'; - import type {ConfigT, InputConfigT, YargArguments} from './types'; -const getDefaultConfig = require('./defaults'); -const validConfig = require('./defaults/validConfig'); -const cosmiconfig = require('cosmiconfig'); -const fs = require('fs'); -const {validate} = require('jest-validate'); -const MetroCache = require('metro-cache'); -const path = require('path'); -const {dirname, join} = require('path'); +import getDefaultConfig from './defaults'; +import validConfig from './defaults/validConfig'; +import cosmiconfig from 'cosmiconfig'; +import fs from 'fs'; +import {validate} from 'jest-validate'; +import * as MetroCache from 'metro-cache'; +import path from 'path'; +import {dirname, join} from 'path'; type CosmiConfigResult = { filepath: string, @@ -321,8 +319,4 @@ async function loadConfig( }); } -module.exports = { - loadConfig, - resolveConfig, - mergeConfig, -}; +export {loadConfig, resolveConfig, mergeConfig}; diff --git a/packages/metro-config/src/types.js b/packages/metro-config/src/types.js index 41923924b0..ee41068870 100644 --- a/packages/metro-config/src/types.js +++ b/packages/metro-config/src/types.js @@ -8,12 +8,10 @@ * @flow strict-local */ -'use strict'; - import type {IntermediateStackFrame} from '../../metro/src/Server/symbolicate'; import type {HandleFunction, Server} from 'connect'; import type {CacheStore} from 'metro-cache'; -import typeof MetroCache from 'metro-cache'; +import typeof * as MetroCache from 'metro-cache'; import type {CacheManagerFactory} from 'metro-file-map'; import type {CustomResolver} from 'metro-resolver'; import type {JsTransformerConfig} from 'metro-transform-worker'; diff --git a/packages/metro-config/types/defaults/index.d.ts b/packages/metro-config/types/defaults/index.d.ts index 0b85f1964a..73ff82dcce 100644 --- a/packages/metro-config/types/defaults/index.d.ts +++ b/packages/metro-config/types/defaults/index.d.ts @@ -8,7 +8,7 @@ * @oncall react_native */ -import type {ConfigT} from '../configTypes'; +import type {ConfigT} from '../types'; export default interface getDefaultConfig { (rootPath: string | null): Promise; diff --git a/packages/metro-core/src/Logger.js b/packages/metro-core/src/Logger.js index d43ac17a07..eba5b38c7e 100644 --- a/packages/metro-core/src/Logger.js +++ b/packages/metro-core/src/Logger.js @@ -9,13 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {BundleOptions} from 'metro/private/shared/types'; +import EventEmitter from 'events'; +import os from 'os'; + +// eslint-disable-next-line import/no-commonjs const VERSION = require('../package.json').version; -const {EventEmitter} = require('events'); -const os = require('os'); export type ActionLogEntryData = { action_name: string, @@ -113,10 +113,4 @@ function log(logEntry: LogEntry): LogEntry { return logEntry; } -module.exports = { - on, - createEntry, - createActionStartEntry, - createActionEndEntry, - log, -}; +export {on, createEntry, createActionStartEntry, createActionEndEntry, log}; diff --git a/packages/metro-core/src/Terminal.js b/packages/metro-core/src/Terminal.js index 2339a8f425..f1b1b74049 100644 --- a/packages/metro-core/src/Terminal.js +++ b/packages/metro-core/src/Terminal.js @@ -9,12 +9,10 @@ * @oncall react_native */ -'use strict'; - -const throttle = require('lodash.throttle'); -const readline = require('readline'); -const tty = require('tty'); -const util = require('util'); +import throttle from 'lodash.throttle'; +import readline from 'readline'; +import tty from 'tty'; +import util from 'util'; const {promisify} = util; @@ -90,7 +88,7 @@ function getTTYStream(stream: UnderlyingStream): ?tty.WriteStream { * "error" printers, as it is not meant for formatting/reporting. It has the * single responsibility of handling status messages. */ -class Terminal { +export default class Terminal { _logLines: Array; _nextStatusStr: string; _statusStr: string; @@ -247,5 +245,3 @@ class Terminal { this._nextStatusStr = ''; } } - -module.exports = Terminal; diff --git a/packages/metro-core/src/__tests__/Terminal-test.js b/packages/metro-core/src/__tests__/Terminal-test.js index 1fe91d7eb1..9ae4684835 100644 --- a/packages/metro-core/src/__tests__/Terminal-test.js +++ b/packages/metro-core/src/__tests__/Terminal-test.js @@ -49,7 +49,7 @@ describe.each([false, true])( }); function prepare({isTTY, ttyPrint}) { - const Terminal = require('../Terminal'); + const Terminal = require('../Terminal').default; const lines = 10; const columns = 10; const stream = Object.create( diff --git a/packages/metro-core/src/__tests__/canonicalize-test.js b/packages/metro-core/src/__tests__/canonicalize-test.js index e4b6f5eb71..30e266ee79 100644 --- a/packages/metro-core/src/__tests__/canonicalize-test.js +++ b/packages/metro-core/src/__tests__/canonicalize-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const canonicalize = require('../canonicalize'); +import canonicalize from '../canonicalize'; describe('canonicalize', () => { test('has the same output for two objects with the same key/value pairs', () => { diff --git a/packages/metro-core/src/canonicalize.js b/packages/metro-core/src/canonicalize.js index af71ec9ebc..a346919ac7 100644 --- a/packages/metro-core/src/canonicalize.js +++ b/packages/metro-core/src/canonicalize.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -function canonicalize(key: string, value: mixed): mixed { +export default function canonicalize(key: string, value: mixed): mixed { if ( // eslint-disable-next-line lint/strictly-null value === null || @@ -31,5 +29,3 @@ function canonicalize(key: string, value: mixed): mixed { return object; } - -module.exports = canonicalize; diff --git a/packages/metro-core/src/errors.js b/packages/metro-core/src/errors.js index 40db740daa..f552410593 100644 --- a/packages/metro-core/src/errors.js +++ b/packages/metro-core/src/errors.js @@ -9,12 +9,7 @@ * @oncall react_native */ -'use strict'; +import AmbiguousModuleResolutionError from './errors/AmbiguousModuleResolutionError'; +import PackageResolutionError from './errors/PackageResolutionError'; -const AmbiguousModuleResolutionError = require('./errors/AmbiguousModuleResolutionError'); -const PackageResolutionError = require('./errors/PackageResolutionError'); - -module.exports = { - AmbiguousModuleResolutionError, - PackageResolutionError, -}; +export {AmbiguousModuleResolutionError, PackageResolutionError}; diff --git a/packages/metro-core/src/errors/AmbiguousModuleResolutionError.js b/packages/metro-core/src/errors/AmbiguousModuleResolutionError.js index 4a9d4a37ae..6e0531521a 100644 --- a/packages/metro-core/src/errors/AmbiguousModuleResolutionError.js +++ b/packages/metro-core/src/errors/AmbiguousModuleResolutionError.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {DuplicateHasteCandidatesError} from 'metro-file-map'; -class AmbiguousModuleResolutionError extends Error { +export default class AmbiguousModuleResolutionError extends Error { fromModulePath: string; hasteError: DuplicateHasteCandidatesError; @@ -29,5 +27,3 @@ class AmbiguousModuleResolutionError extends Error { this.hasteError = hasteError; } } - -module.exports = AmbiguousModuleResolutionError; diff --git a/packages/metro-core/src/errors/PackageResolutionError.js b/packages/metro-core/src/errors/PackageResolutionError.js index 41bf798d3f..94acbf29cb 100644 --- a/packages/metro-core/src/errors/PackageResolutionError.js +++ b/packages/metro-core/src/errors/PackageResolutionError.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {InvalidPackageError} from 'metro-resolver'; -const {formatFileCandidates} = require('metro-resolver'); +import {formatFileCandidates} from 'metro-resolver'; -class PackageResolutionError extends Error { +export default class PackageResolutionError extends Error { originModulePath: string; packageError: InvalidPackageError; targetModuleName: string; @@ -40,5 +38,3 @@ class PackageResolutionError extends Error { Object.assign(this, opts); } } - -module.exports = PackageResolutionError; diff --git a/packages/metro-core/src/index.js b/packages/metro-core/src/index.js index 45cdd92559..cb6c4d6632 100644 --- a/packages/metro-core/src/index.js +++ b/packages/metro-core/src/index.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; +import AmbiguousModuleResolutionError from './errors/AmbiguousModuleResolutionError'; +import PackageResolutionError from './errors/PackageResolutionError'; +import * as Logger from './Logger'; +import Terminal from './Terminal'; -const AmbiguousModuleResolutionError = require('./errors/AmbiguousModuleResolutionError'); -const PackageResolutionError = require('./errors/PackageResolutionError'); -const Logger = require('./Logger'); -const Terminal = require('./Terminal'); - -module.exports = { +export { AmbiguousModuleResolutionError, Logger, PackageResolutionError, diff --git a/packages/metro-file-map/src/Watcher.js b/packages/metro-file-map/src/Watcher.js index 0c14a03095..1e9b3459bd 100644 --- a/packages/metro-file-map/src/Watcher.js +++ b/packages/metro-file-map/src/Watcher.js @@ -32,6 +32,7 @@ import nullthrows from 'nullthrows'; import * as path from 'path'; import {performance} from 'perf_hooks'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:Watcher'); const MAX_WAIT_TIME = 240000; diff --git a/packages/metro-file-map/src/__tests__/haste_impl.js b/packages/metro-file-map/src/__tests__/haste_impl.js index 12e57dcc66..f2593b033a 100644 --- a/packages/metro-file-map/src/__tests__/haste_impl.js +++ b/packages/metro-file-map/src/__tests__/haste_impl.js @@ -8,6 +8,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; const path = require('path'); diff --git a/packages/metro-file-map/src/__tests__/index-test.js b/packages/metro-file-map/src/__tests__/index-test.js index 4d6be6239b..16c62190a0 100644 --- a/packages/metro-file-map/src/__tests__/index-test.js +++ b/packages/metro-file-map/src/__tests__/index-test.js @@ -54,9 +54,10 @@ jest.mock('jest-worker', () => ({ }), })); -jest.mock('../crawlers/node'); -jest.mock('../crawlers/watchman', () => - jest.fn(options => { +jest.mock('../crawlers/node', () => ({__esModule: true, default: jest.fn()})); +jest.mock('../crawlers/watchman', () => ({ + __esModule: true, + default: jest.fn(options => { const path = require('path'); const { @@ -110,7 +111,7 @@ jest.mock('../crawlers/watchman', () => clocks: mockClocks, }); }), -); +})); class MockWatcher extends AbstractWatcher { constructor(root: string, opts: WatcherBackendOptions) { @@ -575,7 +576,7 @@ describe('FileMap', () => { ])( 'uses watchman: %s, symlinks enabled: %s', async (useWatchman, enableSymlinks) => { - const node = require('../crawlers/node'); + const node = require('../crawlers/node').default; // $FlowFixMe[prop-missing] // $FlowFixMe[missing-local-annot] @@ -1412,7 +1413,7 @@ describe('FileMap', () => { }); test('ignores files that do not exist', async () => { - const watchman = require('../crawlers/watchman'); + const watchman = require('../crawlers/watchman').default; // $FlowFixMe[prop-missing] const mockImpl: typeof watchman = watchman.getMockImplementation(); // Wrap the watchman mock and add an invalid file to the file list. @@ -1521,8 +1522,8 @@ describe('FileMap', () => { }); test('tries to crawl using node as a fallback', async () => { - const watchman = require('../crawlers/watchman'); - const node = require('../crawlers/node'); + const watchman = require('../crawlers/watchman').default; + const node = require('../crawlers/node').default; // $FlowFixMe[prop-missing] watchman.mockImplementation(() => { @@ -1563,8 +1564,8 @@ describe('FileMap', () => { }); test('tries to crawl using node as a fallback when promise fails once', async () => { - const watchman = require('../crawlers/watchman'); - const node = require('../crawlers/node'); + const watchman = require('../crawlers/watchman').default; + const node = require('../crawlers/node').default; // $FlowFixMe[prop-missing] watchman.mockImplementation(() => @@ -1603,8 +1604,8 @@ describe('FileMap', () => { test('stops crawling when both crawlers fail', async () => { expect.assertions(1); - const watchman = require('../crawlers/watchman'); - const node = require('../crawlers/node'); + const watchman = require('../crawlers/watchman').default; + const node = require('../crawlers/node').default; // $FlowFixMe[prop-missing] watchman.mockImplementation(() => diff --git a/packages/metro-file-map/src/cache/DiskCacheManager.js b/packages/metro-file-map/src/cache/DiskCacheManager.js index 6451175a03..eff4645587 100644 --- a/packages/metro-file-map/src/cache/DiskCacheManager.js +++ b/packages/metro-file-map/src/cache/DiskCacheManager.js @@ -24,6 +24,7 @@ import path from 'path'; import {Timeout, clearTimeout, setTimeout} from 'timers'; import {deserialize, serialize} from 'v8'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:FileMapCache'); type AutoSaveOptions = $ReadOnly<{ diff --git a/packages/metro-file-map/src/constants.js b/packages/metro-file-map/src/constants.js index 9fa2000ef0..f2c11f4488 100644 --- a/packages/metro-file-map/src/constants.js +++ b/packages/metro-file-map/src/constants.js @@ -8,6 +8,8 @@ * @noformat - Flow comment syntax */ +/* eslint-disable import/no-commonjs */ + /* * This file exports a set of constants that are used for Jest's haste map * serialization. On very large repositories, the haste map cache becomes very diff --git a/packages/metro-file-map/src/crawlers/__tests__/node-test.js b/packages/metro-file-map/src/crawlers/__tests__/node-test.js index 07f8ca6ac4..1bc720543b 100644 --- a/packages/metro-file-map/src/crawlers/__tests__/node-test.js +++ b/packages/metro-file-map/src/crawlers/__tests__/node-test.js @@ -146,7 +146,7 @@ describe('node crawler', () => { test('crawls for files based on patterns', async () => { childProcess = require('child_process'); - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; mockResponse = [ '/project/fruits/pear.js', @@ -195,7 +195,7 @@ describe('node crawler', () => { }); test('updates only changed files', async () => { - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; // In this test sample, strawberry is changed and tomato is unchanged const tomato = [33, 42, 1, '', null, 0, '']; @@ -223,7 +223,7 @@ describe('node crawler', () => { }); test('returns removed files', async () => { - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; // In this test sample, previouslyExisted was present before and will not be // when crawling this directory. @@ -255,7 +255,7 @@ describe('node crawler', () => { mockSpawnExit = 1; childProcess = require('child_process'); - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; const {changedFiles, removedFiles} = await nodeCrawl({ previousState: {fileSystem: emptyFS}, @@ -284,7 +284,7 @@ describe('node crawler', () => { childProcess.spawn.mockImplementationOnce(() => { throw new Error(); }); - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; const {changedFiles, removedFiles} = await nodeCrawl({ console: global.console, @@ -306,7 +306,7 @@ describe('node crawler', () => { test('uses node fs APIs if "forceNodeFilesystemAPI" is set to true, regardless of platform', async () => { childProcess = require('child_process'); - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; const {changedFiles, removedFiles} = await nodeCrawl({ console: global.console, @@ -329,7 +329,7 @@ describe('node crawler', () => { }); test('completes with empty roots', async () => { - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; const {changedFiles, removedFiles} = await nodeCrawl({ console: global.console, @@ -346,7 +346,7 @@ describe('node crawler', () => { }); test('completes with fs.readdir throwing an error', async () => { - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; const mockConsole = { ...global.console, @@ -371,7 +371,7 @@ describe('node crawler', () => { }); test('uses the withFileTypes option with readdir', async () => { - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; const fs = require('graceful-fs'); const {changedFiles, removedFiles} = await nodeCrawl({ @@ -398,7 +398,7 @@ describe('node crawler', () => { }); test('aborts the crawl on pre-aborted signal', async () => { - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; const err = new Error('aborted for test'); await expect( nodeCrawl({ @@ -430,7 +430,7 @@ describe('node crawler', () => { }, }; - nodeCrawl = require('../node'); + nodeCrawl = require('../node').default; await expect( nodeCrawl({ console: global.console, diff --git a/packages/metro-file-map/src/crawlers/__tests__/watchman-test.js b/packages/metro-file-map/src/crawlers/__tests__/watchman-test.js index 2c8b5faed8..2d971458cd 100644 --- a/packages/metro-file-map/src/crawlers/__tests__/watchman-test.js +++ b/packages/metro-file-map/src/crawlers/__tests__/watchman-test.js @@ -76,7 +76,7 @@ const createMap = obj => new Map(Object.keys(obj).map(key => [key, obj[key]])); describe('watchman watch', () => { beforeEach(() => { - watchmanCrawl = require('../watchman'); + watchmanCrawl = require('../watchman').default; watchman = require('fb-watchman'); diff --git a/packages/metro-file-map/src/crawlers/node/index.js b/packages/metro-file-map/src/crawlers/node/index.js index 31ecf1c5ed..a21fb02b1e 100644 --- a/packages/metro-file-map/src/crawlers/node/index.js +++ b/packages/metro-file-map/src/crawlers/node/index.js @@ -24,6 +24,7 @@ import * as fs from 'graceful-fs'; import {platform} from 'os'; import * as path from 'path'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:NodeCrawler'); type Callback = (result: FileData) => void; @@ -171,7 +172,7 @@ function findNative( }); } -module.exports = async function nodeCrawl(options: CrawlerOptions): Promise<{ +export default async function nodeCrawl(options: CrawlerOptions): Promise<{ removedFiles: Set, changedFiles: FileData, }> { @@ -235,4 +236,4 @@ module.exports = async function nodeCrawl(options: CrawlerOptions): Promise<{ ); } }); -}; +} diff --git a/packages/metro-file-map/src/crawlers/watchman/index.js b/packages/metro-file-map/src/crawlers/watchman/index.js index 858f6f97f0..319c2a4a3e 100644 --- a/packages/metro-file-map/src/crawlers/watchman/index.js +++ b/packages/metro-file-map/src/crawlers/watchman/index.js @@ -24,12 +24,11 @@ import normalizePathSeparatorsToPosix from '../../lib/normalizePathSeparatorsToP import normalizePathSeparatorsToSystem from '../../lib/normalizePathSeparatorsToSystem'; import {RootPathUtils} from '../../lib/RootPathUtils'; import {planQuery} from './planQuery'; +import watchman from 'fb-watchman'; import invariant from 'invariant'; import * as path from 'path'; import {performance} from 'perf_hooks'; -const watchman = require('fb-watchman'); - type WatchmanRoots = Map< string, // Posix-separated absolute path $ReadOnly<{directoryFilters: Array, watcher: string}>, @@ -47,7 +46,7 @@ function makeWatchmanError(error: Error): Error { return error; } -module.exports = async function watchmanCrawl({ +export default async function watchmanCrawl({ abortSignal, computeSha1, extensions, @@ -367,4 +366,4 @@ module.exports = async function watchmanCrawl({ removedFiles, clocks: newClocks, }; -}; +} diff --git a/packages/metro-file-map/src/flow-types.js b/packages/metro-file-map/src/flow-types.js index 7123edd571..228b43de79 100644 --- a/packages/metro-file-map/src/flow-types.js +++ b/packages/metro-file-map/src/flow-types.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {PerfLogger, PerfLoggerFactory, RootPerfLogger} from 'metro-config'; export type {PerfLoggerFactory, PerfLogger}; diff --git a/packages/metro-file-map/src/index.js b/packages/metro-file-map/src/index.js index 7aa335ad5c..0dbaebaf34 100644 --- a/packages/metro-file-map/src/index.js +++ b/packages/metro-file-map/src/index.js @@ -57,6 +57,7 @@ import nullthrows from 'nullthrows'; import * as path from 'path'; import {performance} from 'perf_hooks'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:FileMap'); export type { diff --git a/packages/metro-file-map/src/lib/FileProcessor.js b/packages/metro-file-map/src/lib/FileProcessor.js index d1e0994e8a..d22d4e9cd5 100644 --- a/packages/metro-file-map/src/lib/FileProcessor.js +++ b/packages/metro-file-map/src/lib/FileProcessor.js @@ -22,6 +22,7 @@ import {Worker} from '../worker'; import {Worker as JestWorker} from 'jest-worker'; import {sep} from 'path'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:FileMap'); type ProcessFileRequest = $ReadOnly<{ diff --git a/packages/metro-file-map/src/lib/dependencyExtractor.js b/packages/metro-file-map/src/lib/dependencyExtractor.js index 53395e5d10..4791cf21f8 100644 --- a/packages/metro-file-map/src/lib/dependencyExtractor.js +++ b/packages/metro-file-map/src/lib/dependencyExtractor.js @@ -8,6 +8,9 @@ * @flow strict */ +// Required by worker, must be commonjs +/* eslint-disable import/no-commonjs */ + 'use strict'; const NOT_A_DOT = '(? = new Map(); +_dirRegistry: { [directory: string]: {[file: string]: true, __proto__: null}, @@ -384,7 +384,7 @@ module.exports = class FallbackWatcher extends AbstractWatcher { getPauseReason(): ?string { return null; } -}; +} /** * Determine if a given FS error can be ignored */ diff --git a/packages/metro-file-map/src/watchers/NativeWatcher.js b/packages/metro-file-map/src/watchers/NativeWatcher.js index f7ffdded96..4717093648 100644 --- a/packages/metro-file-map/src/watchers/NativeWatcher.js +++ b/packages/metro-file-map/src/watchers/NativeWatcher.js @@ -16,6 +16,7 @@ import {promises as fsPromises, watch} from 'fs'; import {platform} from 'os'; import * as path from 'path'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:NativeWatcher'); const TOUCH_EVENT = 'touch'; diff --git a/packages/metro-file-map/src/watchers/RecrawlWarning.js b/packages/metro-file-map/src/watchers/RecrawlWarning.js index 4feba11875..168d696129 100644 --- a/packages/metro-file-map/src/watchers/RecrawlWarning.js +++ b/packages/metro-file-map/src/watchers/RecrawlWarning.js @@ -14,8 +14,6 @@ * https://github.com/amasad/sane/blob/64ff3a870c42e84f744086884bf55a4f9c22d376/src/utils/recrawl-warning-dedupe.js */ -'use strict'; - export default class RecrawlWarning { static RECRAWL_WARNINGS: Array = []; static REGEXP: RegExp = diff --git a/packages/metro-file-map/src/watchers/WatchmanWatcher.js b/packages/metro-file-map/src/watchers/WatchmanWatcher.js index 2af21236c4..4b042b987b 100644 --- a/packages/metro-file-map/src/watchers/WatchmanWatcher.js +++ b/packages/metro-file-map/src/watchers/WatchmanWatcher.js @@ -29,6 +29,7 @@ import {createHash} from 'crypto'; import watchman from 'fb-watchman'; import invariant from 'invariant'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:WatchmanWatcher'); const DELETE_EVENT = common.DELETE_EVENT; diff --git a/packages/metro-file-map/src/watchers/common.js b/packages/metro-file-map/src/watchers/common.js index bbf12a9f0a..4ce1070221 100644 --- a/packages/metro-file-map/src/watchers/common.js +++ b/packages/metro-file-map/src/watchers/common.js @@ -14,14 +14,12 @@ * https://github.com/amasad/sane/blob/64ff3a870c42e84f744086884bf55a4f9c22d376/src/common.js */ -'use strict'; - import type {ChangeEventMetadata} from '../flow-types'; import type {Stats} from 'fs'; // $FlowFixMe[untyped-import] - Write libdefs for `micromatch` -const micromatch = require('micromatch'); -const path = require('path'); +import micromatch from 'micromatch'; +import path from 'path'; /** * Constants diff --git a/packages/metro-file-map/src/worker.js b/packages/metro-file-map/src/worker.js index ce43fbab28..5c135dd397 100644 --- a/packages/metro-file-map/src/worker.js +++ b/packages/metro-file-map/src/worker.js @@ -8,6 +8,8 @@ * @format */ +/* eslint-disable import/no-commonjs */ + /*:: import type { DependencyExtractor, diff --git a/packages/metro-file-map/src/workerExclusionList.js b/packages/metro-file-map/src/workerExclusionList.js index 050a44a39b..b136787ff8 100644 --- a/packages/metro-file-map/src/workerExclusionList.js +++ b/packages/metro-file-map/src/workerExclusionList.js @@ -8,6 +8,9 @@ * @flow strict */ +// Imported directly in CJS workers - must be CommonJS +/* eslint-disable import/no-commonjs */ + // This list is compiled after the MDN list of the most common MIME types (see // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/ // Complete_list_of_MIME_types). diff --git a/packages/metro-minify-terser/src/index.js b/packages/metro-minify-terser/src/index.js index 0080f3c840..499994e457 100644 --- a/packages/metro-minify-terser/src/index.js +++ b/packages/metro-minify-terser/src/index.js @@ -9,8 +9,8 @@ * @oncall react_native */ -'use strict'; - -const minifier = require('./minifier'); +import minifier from './minifier'; +// CommonJS export for backwards compatibility +// eslint-disable-next-line import/no-commonjs module.exports = minifier; diff --git a/packages/metro-minify-terser/src/minifier.js b/packages/metro-minify-terser/src/minifier.js index e81e4c017d..4a876358ef 100644 --- a/packages/metro-minify-terser/src/minifier.js +++ b/packages/metro-minify-terser/src/minifier.js @@ -9,14 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {BasicSourceMap} from 'metro-source-map'; import type {MinifierOptions, MinifierResult} from 'metro-transform-worker'; -const terser = require('terser'); +import terser from 'terser'; -async function minifier(options: MinifierOptions): Promise { +export default async function minifier( + options: MinifierOptions, +): Promise { const result = await minify(options); if (!options.map || result.map == null) { @@ -68,5 +68,3 @@ async function minify({ map: result.map, }; } - -module.exports = minifier; diff --git a/packages/metro-resolver/src/__tests__/assets-test.js b/packages/metro-resolver/src/__tests__/assets-test.js index 6b9ff340ee..e8c37d9402 100644 --- a/packages/metro-resolver/src/__tests__/assets-test.js +++ b/packages/metro-resolver/src/__tests__/assets-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -import Resolver from '../index'; +import * as Resolver from '../index'; import {createResolutionContext} from './utils'; import path from 'path'; diff --git a/packages/metro-resolver/src/__tests__/browser-spec-test.js b/packages/metro-resolver/src/__tests__/browser-spec-test.js index 20a4bc3377..c3122002ee 100644 --- a/packages/metro-resolver/src/__tests__/browser-spec-test.js +++ b/packages/metro-resolver/src/__tests__/browser-spec-test.js @@ -9,7 +9,7 @@ * @oncall react_native */ -import Resolver from '../index'; +import * as Resolver from '../index'; import {createPackageAccessors, createResolutionContext} from './utils'; describe('browser field spec', () => { diff --git a/packages/metro-resolver/src/__tests__/package-exports-test.js b/packages/metro-resolver/src/__tests__/package-exports-test.js index d9fb67b30e..a3df8b864f 100644 --- a/packages/metro-resolver/src/__tests__/package-exports-test.js +++ b/packages/metro-resolver/src/__tests__/package-exports-test.js @@ -9,7 +9,7 @@ * @oncall react_native */ -import Resolver from '../index'; +import * as Resolver from '../index'; import {createPackageAccessors, createResolutionContext} from './utils'; import path from 'path'; diff --git a/packages/metro-resolver/src/__tests__/package-imports-test.js b/packages/metro-resolver/src/__tests__/package-imports-test.js index 44c34fd50a..e0befee1de 100644 --- a/packages/metro-resolver/src/__tests__/package-imports-test.js +++ b/packages/metro-resolver/src/__tests__/package-imports-test.js @@ -9,7 +9,7 @@ * @oncall react_native */ -import Resolver from '../index'; +import * as Resolver from '../index'; import { createPackageAccessors, createResolutionContext, diff --git a/packages/metro-resolver/src/__tests__/platform-extensions-test.js b/packages/metro-resolver/src/__tests__/platform-extensions-test.js index d3d2ee219d..72d17862df 100644 --- a/packages/metro-resolver/src/__tests__/platform-extensions-test.js +++ b/packages/metro-resolver/src/__tests__/platform-extensions-test.js @@ -12,7 +12,7 @@ import type {ResolutionContext} from '../index'; import FailedToResolvePathError from '../errors/FailedToResolvePathError'; -import Resolver from '../index'; +import * as Resolver from '../index'; import {createResolutionContext} from './utils'; const fileMap = { diff --git a/packages/metro-resolver/src/__tests__/symlinks-test.js b/packages/metro-resolver/src/__tests__/symlinks-test.js index 362ff39504..2f5f9b6361 100644 --- a/packages/metro-resolver/src/__tests__/symlinks-test.js +++ b/packages/metro-resolver/src/__tests__/symlinks-test.js @@ -9,15 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {ResolutionContext} from '../index'; +import FailedToResolvePathError from '../errors/FailedToResolvePathError'; +import * as Resolver from '../index'; import {createResolutionContext} from './utils'; -const FailedToResolvePathError = require('../errors/FailedToResolvePathError'); -const Resolver = require('../index'); - const fileMap = { '/root/project/foo.js': '', '/root/project/baz/index.js': '', diff --git a/packages/metro-resolver/src/createDefaultContext.js b/packages/metro-resolver/src/createDefaultContext.js index 69a732800b..583eb60603 100644 --- a/packages/metro-resolver/src/createDefaultContext.js +++ b/packages/metro-resolver/src/createDefaultContext.js @@ -24,7 +24,7 @@ type PartialContext = $ReadOnly<{ * As context values can be overridden by callers, this occurs externally to * `resolve.js`. */ -function createDefaultContext( +export default function createDefaultContext( context: PartialContext, dependency: TransformResultDependency, ): ResolutionContext { @@ -35,5 +35,3 @@ function createDefaultContext( ...context, }; } - -module.exports = createDefaultContext; diff --git a/packages/metro-resolver/src/errors/FailedToResolveNameError.js b/packages/metro-resolver/src/errors/FailedToResolveNameError.js index ec08c3055b..fa98c4e9cd 100644 --- a/packages/metro-resolver/src/errors/FailedToResolveNameError.js +++ b/packages/metro-resolver/src/errors/FailedToResolveNameError.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -class FailedToResolveNameError extends Error { +export default class FailedToResolveNameError extends Error { dirPaths: $ReadOnlyArray; extraPaths: $ReadOnlyArray; @@ -31,5 +29,3 @@ class FailedToResolveNameError extends Error { this.extraPaths = extraPaths; } } - -module.exports = FailedToResolveNameError; diff --git a/packages/metro-resolver/src/errors/FailedToResolvePathError.js b/packages/metro-resolver/src/errors/FailedToResolvePathError.js index b726c4e943..df57c950f3 100644 --- a/packages/metro-resolver/src/errors/FailedToResolvePathError.js +++ b/packages/metro-resolver/src/errors/FailedToResolvePathError.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {FileAndDirCandidates} from '../types'; -const formatFileCandidates = require('./formatFileCandidates'); +import formatFileCandidates from './formatFileCandidates'; -class FailedToResolvePathError extends Error { +export default class FailedToResolvePathError extends Error { candidates: FileAndDirCandidates; constructor(candidates: FileAndDirCandidates) { @@ -29,5 +27,3 @@ class FailedToResolvePathError extends Error { this.candidates = candidates; } } - -module.exports = FailedToResolvePathError; diff --git a/packages/metro-resolver/src/errors/FailedToResolveUnsupportedError.js b/packages/metro-resolver/src/errors/FailedToResolveUnsupportedError.js index bfb268f644..c12f6b096e 100644 --- a/packages/metro-resolver/src/errors/FailedToResolveUnsupportedError.js +++ b/packages/metro-resolver/src/errors/FailedToResolveUnsupportedError.js @@ -9,12 +9,8 @@ * @oncall react_native */ -'use strict'; - -class FailedToResolveUnsupportedError extends Error { +export default class FailedToResolveUnsupportedError extends Error { constructor(message: string) { super(message); } } - -module.exports = FailedToResolveUnsupportedError; diff --git a/packages/metro-resolver/src/errors/InvalidPackageError.js b/packages/metro-resolver/src/errors/InvalidPackageError.js index f1e993d729..96281a7182 100644 --- a/packages/metro-resolver/src/errors/InvalidPackageError.js +++ b/packages/metro-resolver/src/errors/InvalidPackageError.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {FileCandidates} from '../types'; -const formatFileCandidates = require('./formatFileCandidates'); +import formatFileCandidates from './formatFileCandidates'; -class InvalidPackageError extends Error { +export default class InvalidPackageError extends Error { /** * The file candidates we tried to find to resolve the `main` field of the * package. Ex. `/js/foo/beep(.js|.json)?` if `main` is specifying `./beep` @@ -55,5 +53,3 @@ class InvalidPackageError extends Error { Object.assign(this, opts); } } - -module.exports = InvalidPackageError; diff --git a/packages/metro-resolver/src/errors/formatFileCandidates.js b/packages/metro-resolver/src/errors/formatFileCandidates.js index f4ecfcf80a..d64c149bba 100644 --- a/packages/metro-resolver/src/errors/formatFileCandidates.js +++ b/packages/metro-resolver/src/errors/formatFileCandidates.js @@ -9,11 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {FileCandidates} from '../types'; -function formatFileCandidates(candidates: FileCandidates): string { +export default function formatFileCandidates( + candidates: FileCandidates, +): string { if (candidates.type === 'asset') { return candidates.name; } @@ -23,5 +23,3 @@ function formatFileCandidates(candidates: FileCandidates): string { } return formatted; } - -module.exports = formatFileCandidates; diff --git a/packages/metro-resolver/src/index.js b/packages/metro-resolver/src/index.js index 0ab3406c12..f17cbbf4fa 100644 --- a/packages/metro-resolver/src/index.js +++ b/packages/metro-resolver/src/index.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - export type { AssetFileResolution, CustomResolutionContext, @@ -27,13 +25,18 @@ export type { Result, } from './types'; -const Resolver = { - FailedToResolveNameError: require('./errors/FailedToResolveNameError'), - FailedToResolvePathError: require('./errors/FailedToResolvePathError'), - FailedToResolveUnsupportedError: require('./errors/FailedToResolveUnsupportedError'), - formatFileCandidates: require('./errors/formatFileCandidates'), - InvalidPackageError: require('./errors/InvalidPackageError'), - resolve: require('./resolve'), -}; +import FailedToResolveNameError from './errors/FailedToResolveNameError'; +import FailedToResolvePathError from './errors/FailedToResolvePathError'; +import FailedToResolveUnsupportedError from './errors/FailedToResolveUnsupportedError'; +import formatFileCandidates from './errors/formatFileCandidates'; +import InvalidPackageError from './errors/InvalidPackageError'; +import resolve from './resolve'; -module.exports = Resolver; +export { + FailedToResolveNameError, + FailedToResolvePathError, + FailedToResolveUnsupportedError, + formatFileCandidates, + InvalidPackageError, + resolve, +}; diff --git a/packages/metro-resolver/src/resolve.js b/packages/metro-resolver/src/resolve.js index 7a865db3e4..be669c3a81 100644 --- a/packages/metro-resolver/src/resolve.js +++ b/packages/metro-resolver/src/resolve.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type { FileAndDirCandidates, FileCandidates, @@ -42,7 +40,7 @@ type ParsedBareSpecifier = $ReadOnly<{ posixSubpath: string, }>; -function resolve( +export default function resolve( context: ResolutionContext, moduleName: string, platform: string | null, @@ -654,5 +652,3 @@ function failedFor( ): Result { return {type: 'failed', candidates}; } - -module.exports = resolve; diff --git a/packages/metro-resolver/src/types.js b/packages/metro-resolver/src/types.js index 1ec995a627..6467580682 100644 --- a/packages/metro-resolver/src/types.js +++ b/packages/metro-resolver/src/types.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {TransformResultDependency} from 'metro/private/DeltaBundler/types'; export type Result<+TResolution, +TCandidates> = diff --git a/packages/metro-runtime/src/modules/types.js b/packages/metro-runtime/src/modules/types.js index 91e961e16d..13a2891370 100644 --- a/packages/metro-runtime/src/modules/types.js +++ b/packages/metro-runtime/src/modules/types.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - export type ModuleMap = $ReadOnlyArray<[number, string]>; export type Bundle = { diff --git a/packages/metro-source-map/src/B64Builder.js b/packages/metro-source-map/src/B64Builder.js index 0ab5ea8172..72e6f93406 100644 --- a/packages/metro-source-map/src/B64Builder.js +++ b/packages/metro-source-map/src/B64Builder.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const encode = require('./encode'); +import encode from './encode'; const MAX_SEGMENT_LENGTH = 7; const ONE_MEG = 1024 * 1024; @@ -30,7 +28,7 @@ const SEMICOLON = 0x3b; * For details about source map terminology and specification, check * https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit */ -class B64Builder { +export default class B64Builder { buffer: Buffer; pos: number; hasSegment: boolean; @@ -104,5 +102,3 @@ class B64Builder { buffer.copy(this.buffer); } } - -module.exports = B64Builder; diff --git a/packages/metro-source-map/src/BundleBuilder.js b/packages/metro-source-map/src/BundleBuilder.js index 58fc649537..ad1d38570b 100644 --- a/packages/metro-source-map/src/BundleBuilder.js +++ b/packages/metro-source-map/src/BundleBuilder.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {IndexMap, IndexMapSection, MixedSourceMap} from './source-map'; const EMPTY_MAP = { @@ -34,7 +32,7 @@ const EMPTY_MAP = { * const code = builder.getCode(); * const map = builder.getMap(); */ -class BundleBuilder { +export class BundleBuilder { _file: string; _sections: Array; _line: number; @@ -114,7 +112,7 @@ function measureString(str: string): { return {lineBreaks, lastLineColumns}; } -function createIndexMap( +export function createIndexMap( file: string, sections: Array, ): IndexMap { @@ -124,5 +122,3 @@ function createIndexMap( sections, }; } - -module.exports = {BundleBuilder, createIndexMap}; diff --git a/packages/metro-source-map/src/Consumer/AbstractConsumer.js b/packages/metro-source-map/src/Consumer/AbstractConsumer.js index bb75938d10..13ecaf5f02 100644 --- a/packages/metro-source-map/src/Consumer/AbstractConsumer.js +++ b/packages/metro-source-map/src/Consumer/AbstractConsumer.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type { GeneratedPositionLookup, IConsumer, @@ -19,11 +17,11 @@ import type { SourcePosition, } from './types'; -const {GENERATED_ORDER, iterationOrderToString} = require('./constants'); -const invariant = require('invariant'); +import {GENERATED_ORDER, iterationOrderToString} from './constants'; +import invariant from 'invariant'; // Implementation details shared between MappingsConsumer and SectionsConsumer -class AbstractConsumer implements IConsumer { +export default class AbstractConsumer implements IConsumer { _sourceMap: {+file?: string, ...}; constructor(sourceMap: {+file?: string, ...}) { @@ -63,5 +61,3 @@ class AbstractConsumer implements IConsumer { invariant(false, 'Not implemented'); } } - -module.exports = AbstractConsumer; diff --git a/packages/metro-source-map/src/Consumer/DelegatingConsumer.js b/packages/metro-source-map/src/Consumer/DelegatingConsumer.js index d2528ba823..b8500edb71 100644 --- a/packages/metro-source-map/src/Consumer/DelegatingConsumer.js +++ b/packages/metro-source-map/src/Consumer/DelegatingConsumer.js @@ -9,7 +9,6 @@ * @oncall react_native */ -'use strict'; import type {MixedSourceMap} from '../source-map'; import type {LookupBias} from './constants.js'; import type { @@ -20,20 +19,20 @@ import type { SourcePosition, } from './types'; -const { +import { GENERATED_ORDER, GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, ORIGINAL_ORDER, -} = require('./constants'); -const createConsumer = require('./createConsumer'); +} from './constants'; +import createConsumer from './createConsumer'; /** * A source map consumer that supports both "basic" and "indexed" source maps. * Uses `MappingsConsumer` and `SectionsConsumer` under the hood (via * `createConsumer`). */ -class DelegatingConsumer implements IConsumer { +export default class DelegatingConsumer implements IConsumer { static +GENERATED_ORDER: IterationOrder = GENERATED_ORDER; static +ORIGINAL_ORDER: IterationOrder = ORIGINAL_ORDER; static +GREATEST_LOWER_BOUND: LookupBias = GREATEST_LOWER_BOUND; @@ -74,5 +73,3 @@ class DelegatingConsumer implements IConsumer { return this._rootConsumer.sourceContentFor(source, nullOnMissing); } } - -module.exports = DelegatingConsumer; diff --git a/packages/metro-source-map/src/Consumer/MappingsConsumer.js b/packages/metro-source-map/src/Consumer/MappingsConsumer.js index c20c2ec012..9768ebb625 100644 --- a/packages/metro-source-map/src/Consumer/MappingsConsumer.js +++ b/packages/metro-source-map/src/Consumer/MappingsConsumer.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {BasicSourceMap} from '../source-map'; import type { GeneratedPositionLookup, @@ -20,25 +18,28 @@ import type { } from './types'; import type {Number0} from 'ob1'; -const AbstractConsumer = require('./AbstractConsumer'); -const { +import AbstractConsumer from './AbstractConsumer'; +import { EMPTY_POSITION, FIRST_COLUMN, FIRST_LINE, GREATEST_LOWER_BOUND, lookupBiasToString, -} = require('./constants'); -const normalizeSourcePath = require('./normalizeSourcePath'); -const {greatestLowerBound} = require('./search'); -const invariant = require('invariant'); -const {add, add0, get0, inc, sub} = require('ob1'); -const {decode: decodeVlq} = require('vlq'); +} from './constants'; +import normalizeSourcePath from './normalizeSourcePath'; +import {greatestLowerBound} from './search'; +import invariant from 'invariant'; +import {add, add0, get0, inc, sub} from 'ob1'; +import {decode as decodeVlq} from 'vlq'; /** * A source map consumer that supports "basic" source maps (that have a * `mappings` field and no sections). */ -class MappingsConsumer extends AbstractConsumer implements IConsumer { +export default class MappingsConsumer + extends AbstractConsumer + implements IConsumer +{ _sourceMap: BasicSourceMap; _decodedMappings: ?$ReadOnlyArray; _normalizedSources: ?$ReadOnlyArray; @@ -216,5 +217,3 @@ class MappingsConsumer extends AbstractConsumer implements IConsumer { return sourcesContent[get0(idx)] ?? null; } } - -module.exports = MappingsConsumer; diff --git a/packages/metro-source-map/src/Consumer/SectionsConsumer.js b/packages/metro-source-map/src/Consumer/SectionsConsumer.js index 9c64a5b114..c9faa2dee5 100644 --- a/packages/metro-source-map/src/Consumer/SectionsConsumer.js +++ b/packages/metro-source-map/src/Consumer/SectionsConsumer.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {IndexMap} from '../source-map'; import type { GeneratedOffset, @@ -20,18 +18,21 @@ import type { SourcePosition, } from './types'; -const AbstractConsumer = require('./AbstractConsumer'); -const {EMPTY_POSITION, FIRST_COLUMN, FIRST_LINE} = require('./constants'); -const createConsumer = require('./createConsumer'); -const {subtractOffsetFromPosition} = require('./positionMath'); -const {greatestLowerBound} = require('./search'); -const {add, add0, get0, get1, sub, sub1} = require('ob1'); +import AbstractConsumer from './AbstractConsumer'; +import {EMPTY_POSITION, FIRST_COLUMN, FIRST_LINE} from './constants'; +import createConsumer from './createConsumer'; +import {subtractOffsetFromPosition} from './positionMath'; +import {greatestLowerBound} from './search'; +import {add, add0, get0, get1, sub, sub1} from 'ob1'; /** * A source map consumer that supports "indexed" source maps (that have a * `sections` field and no top-level mappings). */ -class SectionsConsumer extends AbstractConsumer implements IConsumer { +export default class SectionsConsumer + extends AbstractConsumer + implements IConsumer +{ _consumers: $ReadOnlyArray<[GeneratedOffset, IConsumer]>; constructor(sourceMap: IndexMap) { @@ -121,5 +122,3 @@ class SectionsConsumer extends AbstractConsumer implements IConsumer { return null; } } - -module.exports = SectionsConsumer; diff --git a/packages/metro-source-map/src/Consumer/constants.js b/packages/metro-source-map/src/Consumer/constants.js index d7638e2b37..57277a730c 100644 --- a/packages/metro-source-map/src/Consumer/constants.js +++ b/packages/metro-source-map/src/Consumer/constants.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {Number0, Number1} from 'ob1'; -const {add0, add1} = require('ob1'); +import {add0, add1} from 'ob1'; const FIRST_COLUMN: Number0 = add0(0); const FIRST_LINE: Number1 = add1(0); @@ -41,7 +39,7 @@ function lookupBiasToString(x: LookupBias): string { return x; } -module.exports = { +export { FIRST_COLUMN, FIRST_LINE, GENERATED_ORDER, diff --git a/packages/metro-source-map/src/Consumer/createConsumer.js b/packages/metro-source-map/src/Consumer/createConsumer.js index f1859b3270..62f15f4805 100644 --- a/packages/metro-source-map/src/Consumer/createConsumer.js +++ b/packages/metro-source-map/src/Consumer/createConsumer.js @@ -9,20 +9,18 @@ * @oncall react_native */ -'use strict'; - import type {MixedSourceMap} from '../source-map'; import type {IConsumer} from './types'; -const invariant = require('invariant'); +import MappingsConsumer from './MappingsConsumer'; +import SectionsConsumer from './SectionsConsumer'; +import invariant from 'invariant'; -function createConsumer(sourceMap: MixedSourceMap): IConsumer { +export default function createConsumer(sourceMap: MixedSourceMap): IConsumer { invariant( (sourceMap.version: mixed) === '3' || sourceMap.version === 3, `Unrecognized source map format version: ${sourceMap.version}`, ); - const MappingsConsumer = require('./MappingsConsumer'); - const SectionsConsumer = require('./SectionsConsumer'); // eslint-disable-next-line lint/strictly-null if (sourceMap.mappings === undefined) { @@ -30,5 +28,3 @@ function createConsumer(sourceMap: MixedSourceMap): IConsumer { } return new MappingsConsumer(sourceMap); } - -module.exports = createConsumer; diff --git a/packages/metro-source-map/src/Consumer/index.js b/packages/metro-source-map/src/Consumer/index.js index a5c248a5da..cf3192b65d 100644 --- a/packages/metro-source-map/src/Consumer/index.js +++ b/packages/metro-source-map/src/Consumer/index.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - // Implements an API-compatible subset of source-map's `SourceMapConsumer`. -const DelegatingConsumer = require('./DelegatingConsumer'); +import DelegatingConsumer from './DelegatingConsumer'; -module.exports = DelegatingConsumer; +export default DelegatingConsumer; diff --git a/packages/metro-source-map/src/Consumer/normalizeSourcePath.js b/packages/metro-source-map/src/Consumer/normalizeSourcePath.js index 0f205aa5ca..e3b17262cd 100644 --- a/packages/metro-source-map/src/Consumer/normalizeSourcePath.js +++ b/packages/metro-source-map/src/Consumer/normalizeSourcePath.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - // flowlint-next-line untyped-import:off -const util = require('source-map/lib/util'); +import util from 'source-map/lib/util'; // Extracted from source-map@0.5.6's SourceMapConsumer -function normalizeSourcePath( +export default function normalizeSourcePath( sourceInput: string, map: {+sourceRoot?: ?string, ...}, ): string { @@ -38,5 +36,3 @@ function normalizeSourcePath( return source; } - -module.exports = normalizeSourcePath; diff --git a/packages/metro-source-map/src/Consumer/positionMath.js b/packages/metro-source-map/src/Consumer/positionMath.js index 653d1c4dee..51dfe19f68 100644 --- a/packages/metro-source-map/src/Consumer/positionMath.js +++ b/packages/metro-source-map/src/Consumer/positionMath.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {GeneratedOffset} from './types'; import type {Number0, Number1} from 'ob1'; -const {add, add0, add1, neg} = require('ob1'); +import {add, add0, add1, neg} from 'ob1'; -function shiftPositionByOffset< +export function shiftPositionByOffset< T: { +line: ?Number1, +column: ?Number0, @@ -30,7 +28,7 @@ function shiftPositionByOffset< }; } -function subtractOffsetFromPosition< +export function subtractOffsetFromPosition< T: { +line: ?Number1, +column: ?Number0, @@ -48,5 +46,3 @@ function subtractOffsetFromPosition< columns: add0(0), }); } - -module.exports = {shiftPositionByOffset, subtractOffsetFromPosition}; diff --git a/packages/metro-source-map/src/Consumer/search.js b/packages/metro-source-map/src/Consumer/search.js index 3d29348d36..28e6af7c9d 100644 --- a/packages/metro-source-map/src/Consumer/search.js +++ b/packages/metro-source-map/src/Consumer/search.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -function greatestLowerBound( +export function greatestLowerBound( elements: $ReadOnlyArray, target: U, comparator: (U, T) => number, @@ -33,5 +31,3 @@ function greatestLowerBound( } return first ? first - 1 : null; } - -module.exports = {greatestLowerBound}; diff --git a/packages/metro-source-map/src/Consumer/types.js b/packages/metro-source-map/src/Consumer/types.js index 171ae6ccb6..549f567c14 100644 --- a/packages/metro-source-map/src/Consumer/types.js +++ b/packages/metro-source-map/src/Consumer/types.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {IterationOrder, LookupBias} from './constants'; import type {Number0, Number1} from 'ob1'; diff --git a/packages/metro-source-map/src/Generator.js b/packages/metro-source-map/src/Generator.js index d6fc48f3c8..58fee4eef7 100644 --- a/packages/metro-source-map/src/Generator.js +++ b/packages/metro-source-map/src/Generator.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type { BasicSourceMap, FBSourceFunctionMap, FBSourceMetadata, } from './source-map'; -const B64Builder = require('./B64Builder'); +import B64Builder from './B64Builder'; type FileFlags = $ReadOnly<{ addToIgnoreList?: boolean, @@ -34,7 +32,7 @@ type FileFlags = $ReadOnly<{ * * Mappings have to be passed in the order appearance in the generated source. */ -class Generator { +export default class Generator { builder: B64Builder; last: { generatedColumn: number, @@ -291,5 +289,3 @@ class IndexedSet { return Array.from(this.map.keys()); } } - -module.exports = Generator; diff --git a/packages/metro-source-map/src/__tests__/B64Builder-test.js b/packages/metro-source-map/src/__tests__/B64Builder-test.js index 8ecabd9869..57a93d7709 100644 --- a/packages/metro-source-map/src/__tests__/B64Builder-test.js +++ b/packages/metro-source-map/src/__tests__/B64Builder-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const B64Builder = require('../B64Builder'); +import B64Builder from '../B64Builder'; let builder; beforeEach(() => { diff --git a/packages/metro-source-map/src/__tests__/Consumer-test.js b/packages/metro-source-map/src/__tests__/Consumer-test.js index 93d163e4cc..b2ab99e8f7 100644 --- a/packages/metro-source-map/src/__tests__/Consumer-test.js +++ b/packages/metro-source-map/src/__tests__/Consumer-test.js @@ -13,8 +13,8 @@ import type {MixedSourceMap} from '../source-map'; -const Consumer = require('../Consumer'); -const {add0, add1} = require('ob1'); +import Consumer from '../Consumer'; +import {add0, add1} from 'ob1'; const {objectContaining} = expect; diff --git a/packages/metro-source-map/src/__tests__/Generator-test.js b/packages/metro-source-map/src/__tests__/Generator-test.js index 5f853b9788..73fb990c80 100644 --- a/packages/metro-source-map/src/__tests__/Generator-test.js +++ b/packages/metro-source-map/src/__tests__/Generator-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const Generator = require('../Generator'); +import Generator from '../Generator'; const {objectContaining} = expect; diff --git a/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js b/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js index ffcc468746..f8bfe8d134 100644 --- a/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js +++ b/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js @@ -9,14 +9,14 @@ * @oncall react_native */ -'use strict'; import type {BasicSourceMap, IndexMap, MixedSourceMap} from '../source-map'; -const composeSourceMaps = require('../composeSourceMaps'); -const Consumer = require('../Consumer'); +import composeSourceMaps from '../composeSourceMaps'; +import Consumer from '../Consumer'; +import {add0, add1} from 'ob1'; + const fs = require('fs'); const invariant = require('invariant'); -const {add0, add1} = require('ob1'); const path = require('path'); const terser = require('terser'); diff --git a/packages/metro-source-map/src/__tests__/source-map-test.js b/packages/metro-source-map/src/__tests__/source-map-test.js index 59dc83afce..664163966c 100644 --- a/packages/metro-source-map/src/__tests__/source-map-test.js +++ b/packages/metro-source-map/src/__tests__/source-map-test.js @@ -9,14 +9,8 @@ * @oncall react_native */ -'use strict'; - -const Generator = require('../Generator'); -const { - fromRawMappings, - toBabelSegments, - toSegmentTuple, -} = require('../source-map'); +import Generator from '../Generator'; +import {fromRawMappings, toBabelSegments, toSegmentTuple} from '../source-map'; describe('flattening mappings / compacting', () => { test('flattens simple mappings', () => { diff --git a/packages/metro-source-map/src/composeSourceMaps.js b/packages/metro-source-map/src/composeSourceMaps.js index 84935f4492..6a481db8df 100644 --- a/packages/metro-source-map/src/composeSourceMaps.js +++ b/packages/metro-source-map/src/composeSourceMaps.js @@ -9,25 +9,27 @@ * @oncall react_native */ -'use strict'; - import type {SourcePosition} from './Consumer/types'; import type {IConsumer, MixedSourceMap} from './source-map'; import type {Number0, Number1} from 'ob1'; -const Consumer = require('./Consumer'); -const {SourceMapGenerator} = require('source-map'); +import Consumer from './Consumer'; +import {SourceMapGenerator} from 'source-map'; // TODO(t67648443): Bypass the `sort-requires` rule for this file because of a dependency cycle. Consumer; // Originally based on https://github.com/jakobwesthoff/source-map-merger -function composeSourceMaps( +export default function composeSourceMaps( maps: $ReadOnlyArray, ): MixedSourceMap { // NOTE: require() here to break dependency cycle - const SourceMetadataMapConsumer = require('metro-symbolicate/private/SourceMetadataMapConsumer'); - const GoogleIgnoreListConsumer = require('metro-symbolicate/private/GoogleIgnoreListConsumer'); + const SourceMetadataMapConsumer = + // eslint-disable-next-line import/no-commonjs + require('metro-symbolicate/private/SourceMetadataMapConsumer').default; + const GoogleIgnoreListConsumer = + // eslint-disable-next-line import/no-commonjs + require('metro-symbolicate/private/GoogleIgnoreListConsumer').default; if (maps.length < 1) { throw new Error('composeSourceMaps: Expected at least one map'); } @@ -134,5 +136,3 @@ function findOriginalPosition( // $FlowFixMe[incompatible-return] `Number0`, `Number1` is incompatible with number return original; } - -module.exports = composeSourceMaps; diff --git a/packages/metro-source-map/src/encode.js b/packages/metro-source-map/src/encode.js index 9720b7400a..3b0f415e54 100644 --- a/packages/metro-source-map/src/encode.js +++ b/packages/metro-source-map/src/encode.js @@ -49,8 +49,6 @@ /* eslint-disable no-bitwise */ -'use strict'; - // A map of values to characters for the b64 encoding const CHAR_MAP = [ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, @@ -119,4 +117,4 @@ function encode(value: number, buffer: Buffer, position: number): number { return position; } -module.exports = encode; +export default encode; diff --git a/packages/metro-source-map/src/generateFunctionMap.js b/packages/metro-source-map/src/generateFunctionMap.js index ba40550e1c..97ba5036cb 100644 --- a/packages/metro-source-map/src/generateFunctionMap.js +++ b/packages/metro-source-map/src/generateFunctionMap.js @@ -9,16 +9,16 @@ * @oncall react_native */ -'use strict'; - import type {FBSourceFunctionMap} from './source-map'; import type {PluginObj} from '@babel/core'; import type {NodePath} from '@babel/traverse'; import type {Node} from '@babel/types'; import type {MetroBabelFileMetadata} from 'metro-babel-transformer'; +import B64Builder from './B64Builder'; // $FlowFixMe[cannot-resolve-module] - resolves to @babel/traverse import traverseForGenerateFunctionMap from '@babel/traverse--for-generate-function-map'; +import * as t from '@babel/types'; import { isAssignmentExpression, isClassBody, @@ -42,12 +42,9 @@ import { isTypeCastExpression, isVariableDeclarator, } from '@babel/types'; - -const B64Builder = require('./B64Builder'); -const t = require('@babel/types'); -const invariant = require('invariant'); -const nullthrows = require('nullthrows'); -const fsPath = require('path'); +import invariant from 'invariant'; +import nullthrows from 'nullthrows'; +import fsPath from 'path'; type Position = { line: number, @@ -590,7 +587,7 @@ function positionGreater(x: Position, y: Position) { return x.line > y.line || (x.line === y.line && x.column > y.column); } -module.exports = { +export { functionMapBabelPlugin, generateFunctionMap, generateFunctionMappingsArray, diff --git a/packages/metro-source-map/src/source-map.js b/packages/metro-source-map/src/source-map.js index 2f547b8668..6b669dedb1 100644 --- a/packages/metro-source-map/src/source-map.js +++ b/packages/metro-source-map/src/source-map.js @@ -9,23 +9,21 @@ * @oncall react_native */ -'use strict'; - import type {IConsumer} from './Consumer/types'; import type {BabelSourceMapSegment} from '@babel/generator'; -const {BundleBuilder, createIndexMap} = require('./BundleBuilder'); -const composeSourceMaps = require('./composeSourceMaps'); -const Consumer = require('./Consumer'); +import {BundleBuilder, createIndexMap} from './BundleBuilder'; +import composeSourceMaps from './composeSourceMaps'; +import Consumer from './Consumer'; // We need to export this for `metro-symbolicate` -const normalizeSourcePath = require('./Consumer/normalizeSourcePath'); -const { +import normalizeSourcePath from './Consumer/normalizeSourcePath'; +import { functionMapBabelPlugin, generateFunctionMap, -} = require('./generateFunctionMap'); -const Generator = require('./Generator'); +} from './generateFunctionMap'; +import Generator from './Generator'; // $FlowFixMe[untyped-import] - source-map -const SourceMap = require('source-map'); +import SourceMap from 'source-map'; export type {IConsumer}; @@ -332,7 +330,7 @@ const newline = /\r\n?|\n|\u2028|\u2029/g; const countLines = (string: string): number => (string.match(newline) || []).length + 1; -module.exports = { +export { BundleBuilder, composeSourceMaps, Consumer, diff --git a/packages/metro-symbolicate/src/ChromeHeapSnapshot.js b/packages/metro-symbolicate/src/ChromeHeapSnapshot.js index 7ce1029a09..5d1723f640 100644 --- a/packages/metro-symbolicate/src/ChromeHeapSnapshot.js +++ b/packages/metro-symbolicate/src/ChromeHeapSnapshot.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const invariant = require('invariant'); +import invariant from 'invariant'; type RawBuffer = Array; @@ -49,7 +47,7 @@ const CHILDREN_FIELD_TYPE = '__CHILDREN__'; // Care is taken to adhere to the self-describing heap snapshot schema, but // we make some additional assumptions based on what Chrome hardcodes (where // the format leaves us no other choice). -class ChromeHeapSnapshotProcessor { +export class ChromeHeapSnapshotProcessor { // The raw snapshot data provided to this processor. Mutable. +_snapshotData: ChromeHeapSnapshot; @@ -613,5 +611,3 @@ class ChromeHeapSnapshotRecordIterator return this; } } - -module.exports = {ChromeHeapSnapshotProcessor}; diff --git a/packages/metro-symbolicate/src/GoogleIgnoreListConsumer.js b/packages/metro-symbolicate/src/GoogleIgnoreListConsumer.js index 9133b91483..2ec1794e91 100644 --- a/packages/metro-symbolicate/src/GoogleIgnoreListConsumer.js +++ b/packages/metro-symbolicate/src/GoogleIgnoreListConsumer.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {BasicSourceMap, IndexMap, MixedSourceMap} from 'metro-source-map'; -const {normalizeSourcePath} = require('metro-source-map'); +import {normalizeSourcePath} from 'metro-source-map'; type SourceNameNormalizer = (string, {+sourceRoot?: ?string, ...}) => string; @@ -31,7 +29,7 @@ type SourceNameNormalizer = (string, {+sourceRoot?: ?string, ...}) => string; * * new GoogleIgnoreListConsumer(map, source => source) // Don't normalize */ -class GoogleIgnoreListConsumer { +export default class GoogleIgnoreListConsumer { constructor( map: MixedSourceMap, normalizeSourceFn: SourceNameNormalizer = normalizeSourcePath, @@ -130,5 +128,3 @@ class GoogleIgnoreListConsumer { } } } - -module.exports = GoogleIgnoreListConsumer; diff --git a/packages/metro-symbolicate/src/SourceMetadataMapConsumer.js b/packages/metro-symbolicate/src/SourceMetadataMapConsumer.js index b9ee3f6ba7..883b36289c 100644 --- a/packages/metro-symbolicate/src/SourceMetadataMapConsumer.js +++ b/packages/metro-symbolicate/src/SourceMetadataMapConsumer.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type { BasicSourceMap, FBSourceFunctionMap, @@ -20,8 +18,8 @@ import type { MixedSourceMap, } from 'metro-source-map'; -const {normalizeSourcePath} = require('metro-source-map'); -const vlq = require('vlq'); +import {normalizeSourcePath} from 'metro-source-map'; +import * as vlq from 'vlq'; const METADATA_FIELD_FUNCTIONS = 0; @@ -53,7 +51,7 @@ type MetadataMap = {[source: string]: ?FBSourceMetadata, ...}; * * new SourceMetadataMapConsumer(map, source => source) // Don't normalize */ -class SourceMetadataMapConsumer { +export default class SourceMetadataMapConsumer { constructor( map: MixedSourceMap, normalizeSourceFn: SourceNameNormalizer = normalizeSourcePath, @@ -230,5 +228,3 @@ function comparePositions(a: Position, b: Position): number { } return a.line - b.line; } - -module.exports = SourceMetadataMapConsumer; diff --git a/packages/metro-symbolicate/src/Symbolication.js b/packages/metro-symbolicate/src/Symbolication.js index 7829295f6f..18ab0d1f37 100644 --- a/packages/metro-symbolicate/src/Symbolication.js +++ b/packages/metro-symbolicate/src/Symbolication.js @@ -12,17 +12,16 @@ import type {ChromeHeapSnapshot} from './ChromeHeapSnapshot'; import type {HermesFunctionOffsets, MixedSourceMap} from 'metro-source-map'; +import {ChromeHeapSnapshotProcessor} from './ChromeHeapSnapshot'; +import GoogleIgnoreListConsumer from './GoogleIgnoreListConsumer'; +import SourceMetadataMapConsumer from './SourceMetadataMapConsumer'; +import fs from 'fs'; +import invariant from 'invariant'; +import nullthrows from 'nullthrows'; +import path from 'path'; // flowlint-next-line untyped-type-import:off import {typeof SourceMapConsumer} from 'source-map'; -const {ChromeHeapSnapshotProcessor} = require('./ChromeHeapSnapshot'); -const GoogleIgnoreListConsumer = require('./GoogleIgnoreListConsumer'); -const SourceMetadataMapConsumer = require('./SourceMetadataMapConsumer'); -const fs = require('fs'); -const invariant = require('invariant'); -const nullthrows = require('nullthrows'); -const path = require('path'); - type SingleMapModuleIds = { segmentId: number, localId: ?number, @@ -915,11 +914,11 @@ function symbolicateChromeTrace( return context.symbolicateChromeTrace(traceFile, {stdout, stderr}); } -module.exports = { +export { createContext, unstable_createDirectoryContext, getOriginalPositionFor, - parseFileName: parseSingleMapFileName, + parseSingleMapFileName as parseFileName, symbolicate, symbolicateProfilerMap, symbolicateAttribution, diff --git a/packages/metro-symbolicate/src/__tests__/ChromeHeapSnapshotProcessor-test.js b/packages/metro-symbolicate/src/__tests__/ChromeHeapSnapshotProcessor-test.js index ff060f180f..e89bf2e509 100644 --- a/packages/metro-symbolicate/src/__tests__/ChromeHeapSnapshotProcessor-test.js +++ b/packages/metro-symbolicate/src/__tests__/ChromeHeapSnapshotProcessor-test.js @@ -13,7 +13,7 @@ import type {ChromeHeapSnapshot} from '../ChromeHeapSnapshot'; -const {ChromeHeapSnapshotProcessor} = require('../ChromeHeapSnapshot'); +import {ChromeHeapSnapshotProcessor} from '../ChromeHeapSnapshot'; const SNAPSHOT_COMMON = { snapshot: { diff --git a/packages/metro-symbolicate/src/__tests__/GoogleIgnoreListConsumer-test.js b/packages/metro-symbolicate/src/__tests__/GoogleIgnoreListConsumer-test.js index 67f3ee230d..d9621a1145 100644 --- a/packages/metro-symbolicate/src/__tests__/GoogleIgnoreListConsumer-test.js +++ b/packages/metro-symbolicate/src/__tests__/GoogleIgnoreListConsumer-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const GoogleIgnoreListConsumer = require('../GoogleIgnoreListConsumer.js'); +import GoogleIgnoreListConsumer from '../GoogleIgnoreListConsumer'; describe('GoogleIgnoreListConsumer', () => { test('discards indices beyond the range of the sources array', () => { diff --git a/packages/metro-symbolicate/src/__tests__/SourceMetadataMapConsumer-test.js b/packages/metro-symbolicate/src/__tests__/SourceMetadataMapConsumer-test.js index 06409be035..257539a8f2 100644 --- a/packages/metro-symbolicate/src/__tests__/SourceMetadataMapConsumer-test.js +++ b/packages/metro-symbolicate/src/__tests__/SourceMetadataMapConsumer-test.js @@ -10,7 +10,7 @@ 'use strict'; -const SourceMetadataMapConsumer = require('../SourceMetadataMapConsumer.js'); +import SourceMetadataMapConsumer from '../SourceMetadataMapConsumer'; describe('SourceMetadataMapConsumer', () => { test('ignores metadata beyond the range of the sources array', () => { diff --git a/packages/metro-symbolicate/src/__tests__/symbolicate-heap-snapshot-test.js b/packages/metro-symbolicate/src/__tests__/symbolicate-heap-snapshot-test.js index c9435fafd4..0b7a850a00 100644 --- a/packages/metro-symbolicate/src/__tests__/symbolicate-heap-snapshot-test.js +++ b/packages/metro-symbolicate/src/__tests__/symbolicate-heap-snapshot-test.js @@ -9,10 +9,9 @@ * @oncall react_native */ -'use strict'; +import symbolicate from '../symbolicate'; const {ChromeHeapSnapshotProcessor} = require('../ChromeHeapSnapshot'); -const symbolicate = require('../symbolicate'); const fs = require('fs'); const path = require('path'); const {PassThrough} = require('stream'); diff --git a/packages/metro-symbolicate/src/__tests__/symbolicate-test.js b/packages/metro-symbolicate/src/__tests__/symbolicate-test.js index 43521a4ae5..6512b4e731 100644 --- a/packages/metro-symbolicate/src/__tests__/symbolicate-test.js +++ b/packages/metro-symbolicate/src/__tests__/symbolicate-test.js @@ -9,9 +9,8 @@ * @oncall react_native */ -'use strict'; +import symbolicate from '../symbolicate'; -const symbolicate = require('../symbolicate'); const fs = require('fs'); const os = require('os'); const path = require('path'); diff --git a/packages/metro-symbolicate/src/index.js b/packages/metro-symbolicate/src/index.js index c6ca100843..0035852661 100755 --- a/packages/metro-symbolicate/src/index.js +++ b/packages/metro-symbolicate/src/index.js @@ -10,7 +10,7 @@ * @oncall react_native */ -'use strict'; +import symbolicate from './symbolicate'; // $FlowFixMe[unused-promise] -require('./symbolicate.js')().then(code => process.exit(code)); +symbolicate().then(code => process.exit(code)); diff --git a/packages/metro-symbolicate/src/symbolicate.js b/packages/metro-symbolicate/src/symbolicate.js index f99764e2c5..6792d1c4af 100644 --- a/packages/metro-symbolicate/src/symbolicate.js +++ b/packages/metro-symbolicate/src/symbolicate.js @@ -17,13 +17,11 @@ // In our third form, we symbolicate using a module ID, a line number, and // optionally a column. -'use strict'; - -const Symbolication = require('./Symbolication.js'); -const fs = require('fs'); -// flowlint-next-line untyped-import:off -const SourceMapConsumer = require('source-map').SourceMapConsumer; -const {Transform} = require('stream'); +import * as Symbolication from './Symbolication'; +import fs from 'fs'; +// $FlowFixMe[untyped-import] source-map +import {SourceMapConsumer} from 'source-map'; +import {Transform} from 'stream'; function printHelp() { const usages = [ @@ -47,7 +45,7 @@ function printHelp() { console.error(usages.join('\n')); } -async function main( +export default async function main( argvInput: Array = process.argv.slice(2), { stdin, @@ -259,5 +257,3 @@ function waitForStream(stream: $FlowFixMe) { stream.on('finish', resolve); }); } - -module.exports = main; diff --git a/packages/metro-transform-plugins/src/__tests__/addParamsToDefineCall-test.js b/packages/metro-transform-plugins/src/__tests__/addParamsToDefineCall-test.js index 7525b941b4..d5f0ad9d6f 100644 --- a/packages/metro-transform-plugins/src/__tests__/addParamsToDefineCall-test.js +++ b/packages/metro-transform-plugins/src/__tests__/addParamsToDefineCall-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const addParamsToDefineCall = require('../addParamsToDefineCall'); +import addParamsToDefineCall from '../addParamsToDefineCall'; describe('addParamsToDefineCall', () => { const input = '__d(function() {}); // SourceMapUrl=something'; diff --git a/packages/metro-transform-plugins/src/__tests__/import-export-plugin-test.js b/packages/metro-transform-plugins/src/__tests__/import-export-plugin-test.js index bb1da3c56b..7af590b6f3 100644 --- a/packages/metro-transform-plugins/src/__tests__/import-export-plugin-test.js +++ b/packages/metro-transform-plugins/src/__tests__/import-export-plugin-test.js @@ -9,15 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {Dependency} from 'metro/private/ModuleGraph/worker/collectDependencies'; +import collectDependencies from 'metro/private/ModuleGraph/worker/collectDependencies'; + const {compare, transformToAst} = require('../__mocks__/test-helpers'); const importExportPlugin = require('../import-export-plugin'); // $FlowFixMe[untyped-import] @babel/code-frame const {codeFrameColumns} = require('@babel/code-frame'); -const collectDependencies = require('metro/private/ModuleGraph/worker/collectDependencies'); const opts = { importAll: '_$$_IMPORT_ALL', diff --git a/packages/metro-transform-plugins/src/__tests__/inline-requires-plugin-test.js b/packages/metro-transform-plugins/src/__tests__/inline-requires-plugin-test.js index be6b7c014a..d4771e0283 100644 --- a/packages/metro-transform-plugins/src/__tests__/inline-requires-plugin-test.js +++ b/packages/metro-transform-plugins/src/__tests__/inline-requires-plugin-test.js @@ -14,11 +14,11 @@ import type {PluginOptions, State} from '../inline-requires-plugin'; import type {Plugins} from '@babel/core'; import type {PluginTesterOptions} from 'babel-plugin-tester'; -const inlineRequiresPlugin = require('../inline-requires-plugin'); -const validateOutputAst = require('./validateOutputAst'); -const babel = require('@babel/core'); -const pluginTester = require('babel-plugin-tester'); -const nullthrows = require('nullthrows'); +import inlineRequiresPlugin from '../inline-requires-plugin'; +import validateOutputAst from './validateOutputAst'; +import * as babel from '@babel/core'; +import pluginTester from 'babel-plugin-tester'; +import nullthrows from 'nullthrows'; type TestCases = PluginTesterOptions['tests']; diff --git a/packages/metro-transform-plugins/src/__tests__/normalizePseudoGlobals-test.js b/packages/metro-transform-plugins/src/__tests__/normalizePseudoGlobals-test.js index 90bbd860e3..4fb995a166 100644 --- a/packages/metro-transform-plugins/src/__tests__/normalizePseudoGlobals-test.js +++ b/packages/metro-transform-plugins/src/__tests__/normalizePseudoGlobals-test.js @@ -9,11 +9,10 @@ * @oncall react_native */ -'use strict'; - import type {Options} from '../normalizePseudoGlobals'; -const normalizePseudoglobals = require('../normalizePseudoGlobals'); +import normalizePseudoglobals from '../normalizePseudoGlobals'; + const {transformFromAstSync, transformSync} = require('@babel/core'); const nullthrows = require('nullthrows'); diff --git a/packages/metro-transform-plugins/src/addParamsToDefineCall.js b/packages/metro-transform-plugins/src/addParamsToDefineCall.js index 4f6b396762..edbea1677a 100644 --- a/packages/metro-transform-plugins/src/addParamsToDefineCall.js +++ b/packages/metro-transform-plugins/src/addParamsToDefineCall.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - /** * Simple way of adding additional parameters to the end of the define calls. * * This is used to add extra information to the generaic compiled modules (like * the dependencyMap object or the list of inverse dependencies). */ -function addParamsToDefineCall( +export default function addParamsToDefineCall( code: string, ...paramsToAdd: Array ): string { @@ -30,5 +28,3 @@ function addParamsToDefineCall( return code.slice(0, index) + ',' + params.join(',') + code.slice(index); } - -module.exports = addParamsToDefineCall; diff --git a/packages/metro-transform-plugins/src/constant-folding-plugin.js b/packages/metro-transform-plugins/src/constant-folding-plugin.js index 4a6b5679be..fe49f0cea8 100644 --- a/packages/metro-transform-plugins/src/constant-folding-plugin.js +++ b/packages/metro-transform-plugins/src/constant-folding-plugin.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {PluginObj} from '@babel/core'; import type {NodePath, VisitNode, Visitor} from '@babel/traverse'; import typeof Traverse from '@babel/traverse'; @@ -20,7 +18,7 @@ import typeof * as Types from '@babel/types'; type State = {stripped: boolean}; -function constantFoldingPlugin(context: { +export default function constantFoldingPlugin(context: { types: Types, traverse: Traverse, ... @@ -221,5 +219,3 @@ function constantFoldingPlugin(context: { return {visitor}; } - -module.exports = constantFoldingPlugin; diff --git a/packages/metro-transform-plugins/src/import-export-plugin.js b/packages/metro-transform-plugins/src/import-export-plugin.js index 33d3c44123..635bb8392b 100644 --- a/packages/metro-transform-plugins/src/import-export-plugin.js +++ b/packages/metro-transform-plugins/src/import-export-plugin.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {PluginObj} from '@babel/core'; import type {NodePath} from '@babel/traverse'; import type { @@ -24,8 +22,8 @@ import type { // eslint-disable-next-line import/no-extraneous-dependencies import typeof * as Types from '@babel/types'; -const template = require('@babel/template').default; -const nullthrows = require('nullthrows'); +import template from '@babel/template'; +import nullthrows from 'nullthrows'; export type Options = $ReadOnly<{ importDefault: string, @@ -151,7 +149,12 @@ function withLocation( return node; } -function importExportPlugin({types: t}: {types: Types, ...}): PluginObj { +export default function importExportPlugin({ + types: t, +}: { + types: Types, + ... +}): PluginObj { const {isDeclaration, isVariableDeclaration} = t; return { @@ -586,5 +589,3 @@ function importExportPlugin({types: t}: {types: Types, ...}): PluginObj { }, }; } - -module.exports = importExportPlugin; diff --git a/packages/metro-transform-plugins/src/index.js b/packages/metro-transform-plugins/src/index.js index 53cccd88a3..5c81425462 100644 --- a/packages/metro-transform-plugins/src/index.js +++ b/packages/metro-transform-plugins/src/index.js @@ -9,6 +9,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; import typeof ConstantFoldingPlugin from './constant-folding-plugin'; @@ -34,27 +36,27 @@ type TransformPlugins = { module.exports = ({ // $FlowFixMe[unsafe-getters-setters] get addParamsToDefineCall() { - return require('./addParamsToDefineCall'); + return require('./addParamsToDefineCall').default; }, // $FlowFixMe[unsafe-getters-setters] get constantFoldingPlugin() { - return require('./constant-folding-plugin'); + return require('./constant-folding-plugin').default; }, // $FlowFixMe[unsafe-getters-setters] get importExportPlugin() { - return require('./import-export-plugin'); + return require('./import-export-plugin').default; }, // $FlowFixMe[unsafe-getters-setters] get inlinePlugin() { - return require('./inline-plugin'); + return require('./inline-plugin').default; }, // $FlowFixMe[unsafe-getters-setters] get inlineRequiresPlugin() { - return require('./inline-requires-plugin'); + return require('./inline-requires-plugin').default; }, // $FlowFixMe[unsafe-getters-setters] get normalizePseudoGlobals() { - return require('./normalizePseudoGlobals'); + return require('./normalizePseudoGlobals').default; }, getTransformPluginCacheKeyFiles: () => [ require.resolve(__filename), diff --git a/packages/metro-transform-plugins/src/inline-plugin.js b/packages/metro-transform-plugins/src/inline-plugin.js index 48603b46c2..1410778e2d 100644 --- a/packages/metro-transform-plugins/src/inline-plugin.js +++ b/packages/metro-transform-plugins/src/inline-plugin.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {PluginObj} from '@babel/core'; import type {Binding, NodePath, Scope} from '@babel/traverse'; import type { @@ -23,7 +21,7 @@ import type { // eslint-disable-next-line import/no-extraneous-dependencies import typeof * as Types from '@babel/types'; -const createInlinePlatformChecks = require('./utils/createInlinePlatformChecks'); +import createInlinePlatformChecks from './utils/createInlinePlatformChecks'; export type Options = $ReadOnly<{ dev: boolean, @@ -41,7 +39,7 @@ const processId = {name: 'process'}; const dev = {name: '__DEV__'}; -function inlinePlugin( +export default function inlinePlugin( {types: t}: {types: Types}, options: Options, ): PluginObj { @@ -177,5 +175,3 @@ function inlinePlugin( }, }; } - -module.exports = inlinePlugin; diff --git a/packages/metro-transform-plugins/src/inline-requires-plugin.js b/packages/metro-transform-plugins/src/inline-requires-plugin.js index cba26fd35d..508425e547 100644 --- a/packages/metro-transform-plugins/src/inline-requires-plugin.js +++ b/packages/metro-transform-plugins/src/inline-requires-plugin.js @@ -8,8 +8,6 @@ * @flow strict */ -'use strict'; - import type {PluginObj} from '@babel/core'; import typeof * as Babel from '@babel/core'; import type {NodePath, Scope} from '@babel/traverse'; @@ -59,7 +57,7 @@ export type State = { * Is also successfully inlined into: * g(require('foo').Baz); */ -module.exports = ({types: t, traverse}: Babel): PluginObj => ({ +export default ({types: t, traverse}: Babel): PluginObj => ({ name: 'inline-requires', visitor: { Program: { diff --git a/packages/metro-transform-plugins/src/normalizePseudoGlobals.js b/packages/metro-transform-plugins/src/normalizePseudoGlobals.js index b37262ec51..333f4cace2 100644 --- a/packages/metro-transform-plugins/src/normalizePseudoGlobals.js +++ b/packages/metro-transform-plugins/src/normalizePseudoGlobals.js @@ -9,19 +9,17 @@ * @oncall react_native */ -'use strict'; - import type {NodePath, Scope} from '@babel/traverse'; import type {Program} from '@babel/types'; -const traverse = require('@babel/traverse').default; -const nullthrows = require('nullthrows'); +import traverse from '@babel/traverse'; +import nullthrows from 'nullthrows'; export type Options = { reservedNames: $ReadOnlyArray, }; -function normalizePseudoglobals( +export default function normalizePseudoglobals( ast: BabelNode, options?: Options, ): $ReadOnlyArray { @@ -126,5 +124,3 @@ function rename(fullName: string, shortName: string, scope: Scope): string { return unusedName; } - -module.exports = normalizePseudoglobals; diff --git a/packages/metro-transform-plugins/src/utils/createInlinePlatformChecks.js b/packages/metro-transform-plugins/src/utils/createInlinePlatformChecks.js index ccedf1eb62..933aec166d 100644 --- a/packages/metro-transform-plugins/src/utils/createInlinePlatformChecks.js +++ b/packages/metro-transform-plugins/src/utils/createInlinePlatformChecks.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {Scope} from '@babel/traverse'; import type {CallExpression, MemberExpression} from '@babel/types'; // Type only import. No runtime dependency @@ -32,7 +30,7 @@ type PlatformChecks = { ) => boolean, }; -function createInlinePlatformChecks( +export default function createInlinePlatformChecks( t: Types, requireName: string = 'require', ): PlatformChecks { @@ -184,5 +182,3 @@ function createInlinePlatformChecks( isPlatformSelectNode, }; } - -module.exports = createInlinePlatformChecks; diff --git a/packages/metro-transform-worker/src/__tests__/index-test.js b/packages/metro-transform-worker/src/__tests__/index-test.js index 0b5e97038c..b9a540c65e 100644 --- a/packages/metro-transform-worker/src/__tests__/index-test.js +++ b/packages/metro-transform-worker/src/__tests__/index-test.js @@ -29,7 +29,7 @@ jest .mock('metro-minify-terser'); import type {JsTransformerConfig, JsTransformOptions} from '../index'; -import typeof TransformerType from '../index'; +import typeof * as TransformerType from '../index'; import typeof FSType from 'fs'; const {Buffer} = require('buffer'); diff --git a/packages/metro-transform-worker/src/index.js b/packages/metro-transform-worker/src/index.js index 48eb40ca54..615eacc16c 100644 --- a/packages/metro-transform-worker/src/index.js +++ b/packages/metro-transform-worker/src/index.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {PluginEntry, Plugins} from '@babel/core'; import type { BabelTransformer, @@ -35,31 +33,32 @@ import type { DynamicRequiresBehavior, } from 'metro/private/ModuleGraph/worker/collectDependencies'; -const getMinifier = require('./utils/getMinifier'); -const {transformFromAstSync} = require('@babel/core'); -const generate = require('@babel/generator').default; -const babylon = require('@babel/parser'); -const types = require('@babel/types'); -const {stableHash} = require('metro-cache'); -const {getCacheKey} = require('metro-cache-key'); -const { +import * as assetTransformer from './utils/assetTransformer'; +import getMinifier from './utils/getMinifier'; +import {transformFromAstSync} from '@babel/core'; +import generate from '@babel/generator'; +import * as babylon from '@babel/parser'; +import * as types from '@babel/types'; +import {stableHash} from 'metro-cache'; +import {getCacheKey as metroGetCacheKey} from 'metro-cache-key'; +import { fromRawMappings, functionMapBabelPlugin, toBabelSegments, toSegmentTuple, -} = require('metro-source-map'); -const metroTransformPlugins = require('metro-transform-plugins'); -const collectDependencies = require('metro/private/ModuleGraph/worker/collectDependencies'); -const { - InvalidRequireCallError: InternalInvalidRequireCallError, -} = require('metro/private/ModuleGraph/worker/collectDependencies'); -const generateImportNames = require('metro/private/ModuleGraph/worker/generateImportNames'); -const { +} from 'metro-source-map'; +import metroTransformPlugins from 'metro-transform-plugins'; +import collectDependencies from 'metro/private/ModuleGraph/worker/collectDependencies'; +import generateImportNames from 'metro/private/ModuleGraph/worker/generateImportNames'; +import { importLocationsPlugin, locToKey, -} = require('metro/private/ModuleGraph/worker/importLocationsPlugin'); -const JsFileWrapping = require('metro/private/ModuleGraph/worker/JsFileWrapping'); -const nullthrows = require('nullthrows'); +} from 'metro/private/ModuleGraph/worker/importLocationsPlugin'; +import * as JsFileWrapping from 'metro/private/ModuleGraph/worker/JsFileWrapping'; +import nullthrows from 'nullthrows'; + +const InternalInvalidRequireCallError = + collectDependencies.InvalidRequireCallError; type MinifierConfig = $ReadOnly<{[string]: mixed, ...}>; @@ -517,7 +516,6 @@ async function transformAsset( file: AssetFile, context: TransformationContext, ): Promise { - const assetTransformer = require('./utils/assetTransformer'); const {assetRegistryPath, assetPlugins} = context.config; const result = await assetTransformer.transform( @@ -653,98 +651,96 @@ function getBabelTransformArgs( }; } -module.exports = { - transform: async ( - config: JsTransformerConfig, - projectRoot: string, - filename: string, - data: Buffer, - options: JsTransformOptions, - ): Promise => { - const context: TransformationContext = { - config, - projectRoot, - options, - }; - const sourceCode = data.toString('utf8'); - - const reservedStrings = []; - if ( - options.customTransformOptions?.unstable_staticHermesOptimizedRequire == - true - ) { - reservedStrings.push('_$$_METRO_MODULE_ID'); - } - if (config.unstable_dependencyMapReservedName != null) { - reservedStrings.push(config.unstable_dependencyMapReservedName); - } - for (const reservedString of reservedStrings) { - const position = sourceCode.indexOf(reservedString); - if (position > -1) { - throw new SyntaxError( - 'Source code contains the reserved string `' + - reservedString + - '` at character offset ' + - position, - ); - } - } - - if (filename.endsWith('.json')) { - const jsonFile: JSONFile = { - filename, - inputFileSize: data.length, - code: sourceCode, - type: options.type, - }; +export const transform = async ( + config: JsTransformerConfig, + projectRoot: string, + filename: string, + data: Buffer, + options: JsTransformOptions, +): Promise => { + const context: TransformationContext = { + config, + projectRoot, + options, + }; + const sourceCode = data.toString('utf8'); - return await transformJSON(jsonFile, context); + const reservedStrings = []; + if ( + options.customTransformOptions?.unstable_staticHermesOptimizedRequire == + true + ) { + reservedStrings.push('_$$_METRO_MODULE_ID'); + } + if (config.unstable_dependencyMapReservedName != null) { + reservedStrings.push(config.unstable_dependencyMapReservedName); + } + for (const reservedString of reservedStrings) { + const position = sourceCode.indexOf(reservedString); + if (position > -1) { + throw new SyntaxError( + 'Source code contains the reserved string `' + + reservedString + + '` at character offset ' + + position, + ); } + } - if (options.type === 'asset') { - const file: AssetFile = { - filename, - inputFileSize: data.length, - code: sourceCode, - type: options.type, - }; + if (filename.endsWith('.json')) { + const jsonFile: JSONFile = { + filename, + inputFileSize: data.length, + code: sourceCode, + type: options.type, + }; - return await transformAsset(file, context); - } + return await transformJSON(jsonFile, context); + } - const file: JSFile = { + if (options.type === 'asset') { + const file: AssetFile = { filename, inputFileSize: data.length, code: sourceCode, - type: options.type === 'script' ? 'js/script' : 'js/module', - functionMap: null, + type: options.type, }; - return await transformJSWithBabel(file, context); - }, - - getCacheKey: (config: JsTransformerConfig): string => { - const {babelTransformerPath, minifierPath, ...remainingConfig} = config; - - const filesKey = getCacheKey([ - __filename, - require.resolve(babelTransformerPath), - require.resolve(minifierPath), - require.resolve('./utils/getMinifier'), - require.resolve('./utils/assetTransformer'), - require.resolve('metro/private/ModuleGraph/worker/generateImportNames'), - require.resolve('metro/private/ModuleGraph/worker/JsFileWrapping'), - ...metroTransformPlugins.getTransformPluginCacheKeyFiles(), - ]); + return await transformAsset(file, context); + } + + const file: JSFile = { + filename, + inputFileSize: data.length, + code: sourceCode, + type: options.type === 'script' ? 'js/script' : 'js/module', + functionMap: null, + }; + + return await transformJSWithBabel(file, context); +}; + +export const getCacheKey = (config: JsTransformerConfig): string => { + const {babelTransformerPath, minifierPath, ...remainingConfig} = config; + + const filesKey = metroGetCacheKey([ + __filename, + require.resolve(babelTransformerPath), + require.resolve(minifierPath), + require.resolve('./utils/getMinifier'), + require.resolve('./utils/assetTransformer'), + require.resolve('metro/private/ModuleGraph/worker/generateImportNames'), + require.resolve('metro/private/ModuleGraph/worker/JsFileWrapping'), + ...metroTransformPlugins.getTransformPluginCacheKeyFiles(), + ]); - // $FlowFixMe[unsupported-syntax] - const babelTransformer = require(babelTransformerPath); - return [ - filesKey, - stableHash(remainingConfig).toString('hex'), - babelTransformer.getCacheKey ? babelTransformer.getCacheKey() : '', - ].join('$'); - }, + // $FlowFixMe[unsupported-syntax] + const babelTransformer = require(babelTransformerPath); + return [ + filesKey, + stableHash(remainingConfig).toString('hex'), + babelTransformer.getCacheKey ? babelTransformer.getCacheKey() : '', + ].join('$'); }; function countLinesAndTerminateMap( diff --git a/packages/metro-transform-worker/src/utils/assetTransformer.js b/packages/metro-transform-worker/src/utils/assetTransformer.js index 5d0d8386b4..9312a518d3 100644 --- a/packages/metro-transform-worker/src/utils/assetTransformer.js +++ b/packages/metro-transform-worker/src/utils/assetTransformer.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {File} from '@babel/types'; import type {BabelTransformerArgs} from 'metro-babel-transformer'; -const {getAssetData} = require('metro/private/Assets'); -const {generateAssetCodeFileAst} = require('metro/private/Bundler/util'); -const path = require('path'); +import {getAssetData} from 'metro/private/Assets'; +import {generateAssetCodeFileAst} from 'metro/private/Bundler/util'; +import path from 'path'; -async function transform( +export async function transform( {filename, options, src}: BabelTransformerArgs, assetRegistryPath: string, assetDataPlugins: $ReadOnlyArray, @@ -44,7 +42,3 @@ async function transform( ast: generateAssetCodeFileAst(assetRegistryPath, data), }; } - -module.exports = { - transform, -}; diff --git a/packages/metro-transform-worker/src/utils/getMinifier.js b/packages/metro-transform-worker/src/utils/getMinifier.js index 0ab856bc56..61fb8915b1 100644 --- a/packages/metro-transform-worker/src/utils/getMinifier.js +++ b/packages/metro-transform-worker/src/utils/getMinifier.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {Minifier} from '../index.js'; -function getMinifier(minifierPath: string): Minifier { +export default function getMinifier(minifierPath: string): Minifier { // Note: minifierPath should be an absolute path OR a module name here! // The options allow relative paths but they HAVE to be normalized at // any entry point that accepts them... @@ -29,5 +27,3 @@ function getMinifier(minifierPath: string): Minifier { ); } } - -module.exports = getMinifier; diff --git a/packages/metro/src/Assets.js b/packages/metro/src/Assets.js index bef30fd5c4..a2b21c2bdf 100644 --- a/packages/metro/src/Assets.js +++ b/packages/metro/src/Assets.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {AssetPath} from './node-haste/lib/AssetPaths'; -const AssetPaths = require('./node-haste/lib/AssetPaths'); -const crypto = require('crypto'); -const fs = require('fs'); -const getImageSize = require('image-size'); -const path = require('path'); +import * as AssetPaths from './node-haste/lib/AssetPaths'; +import crypto from 'crypto'; +import fs from 'fs'; +import getImageSize from 'image-size'; +import path from 'path'; export type AssetInfo = { +files: Array, @@ -53,7 +51,7 @@ export type AssetDataFiltered = { // Test extension against all types supported by image-size module. // If it's not one of these, we won't treat it as an image. -function isAssetTypeAnImage(type: string): boolean { +export function isAssetTypeAnImage(type: string): boolean { return ( [ 'png', @@ -70,7 +68,7 @@ function isAssetTypeAnImage(type: string): boolean { ); } -function getAssetSize( +export function getAssetSize( type: string, content: Buffer, filePath: string, @@ -198,7 +196,7 @@ async function getAbsoluteAssetInfo( return {files, hash: hasher.digest('hex'), name, scales, type}; } -async function getAssetData( +export async function getAssetData( assetPath: string, localPath: string, assetDataPlugins: $ReadOnlyArray, @@ -259,7 +257,7 @@ async function applyAssetDataPlugins( /** * Returns all the associated files (for different resolutions) of an asset. **/ -async function getAssetFiles( +export async function getAssetFiles( assetPath: string, platform: ?string = null, ): Promise> { @@ -279,7 +277,7 @@ async function getAssetFiles( * 3. Then try to pick platform-specific asset records * 4. Then pick the closest resolution (rounding up) to the requested one */ -async function getAsset( +export async function getAsset( relativePath: string, projectRoot: string, watchFolders: $ReadOnlyArray, @@ -328,11 +326,3 @@ function pathBelongsToRoots( return false; } - -module.exports = { - getAsset, - getAssetSize, - getAssetData, - getAssetFiles, - isAssetTypeAnImage, -}; diff --git a/packages/metro/src/Bundler.js b/packages/metro/src/Bundler.js index ee387749f8..b70ef7cd64 100644 --- a/packages/metro/src/Bundler.js +++ b/packages/metro/src/Bundler.js @@ -9,22 +9,20 @@ * @oncall react_native */ -'use strict'; - import type {TransformResultWithSource} from './DeltaBundler'; import type {TransformOptions} from './DeltaBundler/Worker'; import type EventEmitter from 'events'; import type {ConfigT} from 'metro-config'; -const Transformer = require('./DeltaBundler/Transformer'); -const DependencyGraph = require('./node-haste/DependencyGraph'); +import Transformer from './DeltaBundler/Transformer'; +import DependencyGraph from './node-haste/DependencyGraph'; export type BundlerOptions = $ReadOnly<{ hasReducedPerformance?: boolean, watch?: boolean, }>; -class Bundler { +export default class Bundler { _depGraph: DependencyGraph; _initializedPromise: Promise; _transformer: Transformer; @@ -90,5 +88,3 @@ class Bundler { await this._initializedPromise; } } - -module.exports = Bundler; diff --git a/packages/metro/src/Bundler/util.js b/packages/metro/src/Bundler/util.js index d7a70b2e9e..7883f871d0 100644 --- a/packages/metro/src/Bundler/util.js +++ b/packages/metro/src/Bundler/util.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {AssetDataFiltered, AssetDataWithoutFiles} from '../Assets'; import type {ModuleTransportLike} from '../shared/types'; import type {File} from '@babel/types'; -const babylon = require('@babel/parser'); -const template = require('@babel/template').default; -const babelTypes = require('@babel/types'); +import * as babylon from '@babel/parser'; +import template from '@babel/template'; +import * as babelTypes from '@babel/types'; type SubTree = ( moduleTransport: T, @@ -26,7 +24,7 @@ type SubTree = ( const assetPropertyBlockList = new Set(['files', 'fileSystemLocation', 'path']); -function generateAssetCodeFileAst( +export function generateAssetCodeFileAst( assetRegistryPath: string, assetDescriptor: AssetDataWithoutFiles, ): File { @@ -68,7 +66,7 @@ function filterObject( return copied; } -function createRamBundleGroups( +export function createRamBundleGroups( ramGroups: $ReadOnlyArray, groupableModules: $ReadOnlyArray, subtree: SubTree, @@ -146,8 +144,3 @@ class ArrayMap extends Map> { return array; } } - -module.exports = { - createRamBundleGroups, - generateAssetCodeFileAst, -}; diff --git a/packages/metro/src/DeltaBundler.js b/packages/metro/src/DeltaBundler.js index 5c8b723977..cec7500757 100644 --- a/packages/metro/src/DeltaBundler.js +++ b/packages/metro/src/DeltaBundler.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type { DeltaResult, Graph, @@ -21,7 +19,7 @@ import type { } from './DeltaBundler/types'; import type EventEmitter from 'events'; -const DeltaCalculator = require('./DeltaBundler/DeltaCalculator'); +import DeltaCalculator from './DeltaBundler/DeltaCalculator'; export type { DeltaResult, @@ -42,7 +40,7 @@ export type { * concurrent clients requesting their own deltas. This is done through the * `clientId` param (which maps a client to a specific delta transformer). */ -class DeltaBundler { +export default class DeltaBundler { _changeEventSource: EventEmitter; _deltaCalculators: Map, DeltaCalculator> = new Map(); @@ -140,5 +138,3 @@ class DeltaBundler { this._deltaCalculators.delete(graph); } } - -module.exports = DeltaBundler; diff --git a/packages/metro/src/DeltaBundler/DeltaCalculator.js b/packages/metro/src/DeltaBundler/DeltaCalculator.js index 2afa231ef0..f7a6551231 100644 --- a/packages/metro/src/DeltaBundler/DeltaCalculator.js +++ b/packages/metro/src/DeltaBundler/DeltaCalculator.js @@ -9,17 +9,16 @@ * @oncall react_native */ -'use strict'; - import type {DeltaResult, Options} from './types'; import type {RootPerfLogger} from 'metro-config'; import type {ChangeEvent} from 'metro-file-map'; import {Graph} from './Graph'; +import EventEmitter from 'events'; import path from 'path'; +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:DeltaCalculator'); -const {EventEmitter} = require('events'); /** * This class is in charge of calculating the delta of changed modules that @@ -27,7 +26,7 @@ const {EventEmitter} = require('events'); * traverse the files that have been changed between calls and avoid having to * traverse the whole dependency tree for trivial small changes. */ -class DeltaCalculator extends EventEmitter { +export default class DeltaCalculator extends EventEmitter { _changeEventSource: EventEmitter; _options: Options; @@ -324,5 +323,3 @@ class DeltaCalculator extends EventEmitter { }; } } - -module.exports = DeltaCalculator; diff --git a/packages/metro/src/DeltaBundler/Graph.js b/packages/metro/src/DeltaBundler/Graph.js index cee5307173..c28a31c91a 100644 --- a/packages/metro/src/DeltaBundler/Graph.js +++ b/packages/metro/src/DeltaBundler/Graph.js @@ -47,9 +47,8 @@ import {fileMatchesContext} from '../lib/contextModule'; import CountingSet from '../lib/CountingSet'; import {isResolvedDependency} from '../lib/isResolvedDependency'; import {buildSubgraph} from './buildSubgraph'; - -const invariant = require('invariant'); -const nullthrows = require('nullthrows'); +import invariant from 'invariant'; +import nullthrows from 'nullthrows'; // TODO: Convert to a Flow enum type NodeColor = diff --git a/packages/metro/src/DeltaBundler/Serializers/__tests__/baseJSBundle-test.js b/packages/metro/src/DeltaBundler/Serializers/__tests__/baseJSBundle-test.js index 8692551378..c9dbd8ca0e 100644 --- a/packages/metro/src/DeltaBundler/Serializers/__tests__/baseJSBundle-test.js +++ b/packages/metro/src/DeltaBundler/Serializers/__tests__/baseJSBundle-test.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {Module, TransformInputOptions} from '../../types'; import CountingSet from '../../../lib/CountingSet'; +import createModuleIdFactory from '../../../lib/createModuleIdFactory'; +import baseJSBundle from '../baseJSBundle'; -const createModuleIdFactory = require('../../../lib/createModuleIdFactory'); -const baseJSBundle = require('../baseJSBundle'); const path = require('path'); const {objectContaining} = expect; diff --git a/packages/metro/src/DeltaBundler/Serializers/__tests__/getAllFiles-test.js b/packages/metro/src/DeltaBundler/Serializers/__tests__/getAllFiles-test.js index 33ef463b4f..1c1989a6e0 100644 --- a/packages/metro/src/DeltaBundler/Serializers/__tests__/getAllFiles-test.js +++ b/packages/metro/src/DeltaBundler/Serializers/__tests__/getAllFiles-test.js @@ -8,12 +8,10 @@ * @oncall react_native */ -'use strict'; - jest.mock('../../../Assets'); -const {getAssetFiles} = require('../../../Assets'); -const getAllFiles = require('../getAllFiles'); +import {getAssetFiles} from '../../../Assets'; +import getAllFiles from '../getAllFiles'; describe('getOrderedDependencyPaths', () => { beforeEach(() => { diff --git a/packages/metro/src/DeltaBundler/Serializers/__tests__/getAssets-test.js b/packages/metro/src/DeltaBundler/Serializers/__tests__/getAssets-test.js index f27ccd0b59..c13c148b66 100644 --- a/packages/metro/src/DeltaBundler/Serializers/__tests__/getAssets-test.js +++ b/packages/metro/src/DeltaBundler/Serializers/__tests__/getAssets-test.js @@ -8,12 +8,10 @@ * @oncall react_native */ -'use strict'; - jest.mock('../../../Assets'); -const {getAssetData} = require('../../../Assets'); -const getAssets = require('../getAssets'); +import {getAssetData} from '../../../Assets'; +import getAssets from '../getAssets'; beforeEach(() => { getAssetData.mockImplementation(async (path, localPath) => ({ diff --git a/packages/metro/src/DeltaBundler/Serializers/__tests__/getRamBundleInfo-test.js b/packages/metro/src/DeltaBundler/Serializers/__tests__/getRamBundleInfo-test.js index 9cc2104342..1710a651c6 100644 --- a/packages/metro/src/DeltaBundler/Serializers/__tests__/getRamBundleInfo-test.js +++ b/packages/metro/src/DeltaBundler/Serializers/__tests__/getRamBundleInfo-test.js @@ -9,14 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {Module, TransformInputOptions} from '../../types'; import type {JsOutput} from 'metro-transform-worker'; import CountingSet from '../../../lib/CountingSet'; - -const getRamBundleInfo = require('../getRamBundleInfo'); +import getRamBundleInfo from '../getRamBundleInfo'; function createModule( name: string, diff --git a/packages/metro/src/DeltaBundler/Serializers/baseJSBundle.js b/packages/metro/src/DeltaBundler/Serializers/baseJSBundle.js index a194380286..6dc3cd3ee2 100644 --- a/packages/metro/src/DeltaBundler/Serializers/baseJSBundle.js +++ b/packages/metro/src/DeltaBundler/Serializers/baseJSBundle.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type { MixedOutput, Module, @@ -19,10 +17,10 @@ import type { } from '../types'; import type {Bundle} from 'metro-runtime/src/modules/types'; -const getAppendScripts = require('../../lib/getAppendScripts'); -const processModules = require('./helpers/processModules'); +import getAppendScripts from '../../lib/getAppendScripts'; +import processModules from './helpers/processModules'; -function baseJSBundle( +export default function baseJSBundle( entryPoint: string, preModules: $ReadOnlyArray>, graph: ReadOnlyGraph<>, @@ -83,5 +81,3 @@ function baseJSBundle( ).map(([module, code]) => [options.createModuleId(module.path), code]), }; } - -module.exports = baseJSBundle; diff --git a/packages/metro/src/DeltaBundler/Serializers/getAllFiles.js b/packages/metro/src/DeltaBundler/Serializers/getAllFiles.js index ea6f0b5cc6..cf6ef087ad 100644 --- a/packages/metro/src/DeltaBundler/Serializers/getAllFiles.js +++ b/packages/metro/src/DeltaBundler/Serializers/getAllFiles.js @@ -9,19 +9,17 @@ * @oncall react_native */ -'use strict'; - import type {Module, ReadOnlyGraph} from '../types'; -const {getAssetFiles} = require('../../Assets'); -const {getJsOutput, isJsModule} = require('./helpers/js'); +import {getAssetFiles} from '../../Assets'; +import {getJsOutput, isJsModule} from './helpers/js'; type Options = { platform: ?string, +processModuleFilter: (module: Module<>) => boolean, }; -async function getAllFiles( +export default async function getAllFiles( pre: $ReadOnlyArray>, graph: ReadOnlyGraph<>, options: Options, @@ -58,5 +56,3 @@ async function getAllFiles( return output; } - -module.exports = getAllFiles; diff --git a/packages/metro/src/DeltaBundler/Serializers/getAssets.js b/packages/metro/src/DeltaBundler/Serializers/getAssets.js index 6fff55042e..ef33b1b9bd 100644 --- a/packages/metro/src/DeltaBundler/Serializers/getAssets.js +++ b/packages/metro/src/DeltaBundler/Serializers/getAssets.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {AssetData} from '../../Assets'; import type {Module, ReadOnlyDependencies} from '../types'; -const {getAssetData} = require('../../Assets'); -const {getJsOutput, isJsModule} = require('./helpers/js'); -const path = require('path'); +import {getAssetData} from '../../Assets'; +import {getJsOutput, isJsModule} from './helpers/js'; +import path from 'path'; type Options = { +processModuleFilter: (module: Module<>) => boolean, @@ -26,7 +24,7 @@ type Options = { publicPath: string, }; -async function getAssets( +export default async function getAssets( dependencies: ReadOnlyDependencies<>, options: Options, ): Promise<$ReadOnlyArray> { @@ -54,5 +52,3 @@ async function getAssets( return await Promise.all(promises); } - -module.exports = getAssets; diff --git a/packages/metro/src/DeltaBundler/Serializers/getExplodedSourceMap.js b/packages/metro/src/DeltaBundler/Serializers/getExplodedSourceMap.js index e106ac3fa3..f92e3759fb 100644 --- a/packages/metro/src/DeltaBundler/Serializers/getExplodedSourceMap.js +++ b/packages/metro/src/DeltaBundler/Serializers/getExplodedSourceMap.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {Module} from '../types'; import type { FBSourceFunctionMap, MetroSourceMapSegmentTuple, } from 'metro-source-map'; -const {getJsOutput, isJsModule} = require('./helpers/js'); +import {getJsOutput, isJsModule} from './helpers/js'; export type ExplodedSourceMap = $ReadOnlyArray<{ +map: Array, @@ -26,7 +24,7 @@ export type ExplodedSourceMap = $ReadOnlyArray<{ +path: string, }>; -function getExplodedSourceMap( +export function getExplodedSourceMap( modules: $ReadOnlyArray>, options: { +processModuleFilter: (module: Module<>) => boolean, @@ -47,7 +45,3 @@ function getExplodedSourceMap( } return result; } - -module.exports = { - getExplodedSourceMap, -}; diff --git a/packages/metro/src/DeltaBundler/Serializers/getRamBundleInfo.js b/packages/metro/src/DeltaBundler/Serializers/getRamBundleInfo.js index a36ae9366b..bf49e4aca5 100644 --- a/packages/metro/src/DeltaBundler/Serializers/getRamBundleInfo.js +++ b/packages/metro/src/DeltaBundler/Serializers/getRamBundleInfo.js @@ -9,20 +9,18 @@ * @oncall react_native */ -'use strict'; - import type {ModuleTransportLike, RamModuleTransport} from '../../shared/types'; import type {Module, ReadOnlyGraph, SerializerOptions} from '../types'; import type {SourceMapGeneratorOptions} from './sourceMapGenerator'; import type {GetTransformOptions} from 'metro-config'; -const {createRamBundleGroups} = require('../../Bundler/util'); -const getAppendScripts = require('../../lib/getAppendScripts'); -const getTransitiveDependencies = require('./helpers/getTransitiveDependencies'); -const {isJsModule, wrapModule} = require('./helpers/js'); -const {sourceMapObject} = require('./sourceMapObject'); -const nullthrows = require('nullthrows'); -const path = require('path'); +import {createRamBundleGroups} from '../../Bundler/util'; +import getAppendScripts from '../../lib/getAppendScripts'; +import getTransitiveDependencies from './helpers/getTransitiveDependencies'; +import {isJsModule, wrapModule} from './helpers/js'; +import {sourceMapObject} from './sourceMapObject'; +import nullthrows from 'nullthrows'; +import path from 'path'; type Options = $ReadOnly<{ ...SerializerOptions, @@ -38,7 +36,7 @@ export type RamBundleInfo = { groups: Map>, }; -async function getRamBundleInfo( +export default async function getRamBundleInfo( entryPoint: string, pre: $ReadOnlyArray>, graph: ReadOnlyGraph<>, @@ -171,5 +169,3 @@ async function _getRamOptions( ramGroups: ramGroups || [], }; } - -module.exports = getRamBundleInfo; diff --git a/packages/metro/src/DeltaBundler/Serializers/helpers/__tests__/getTransitiveDependencies-test.js b/packages/metro/src/DeltaBundler/Serializers/helpers/__tests__/getTransitiveDependencies-test.js index 9e04725960..36a58620ee 100644 --- a/packages/metro/src/DeltaBundler/Serializers/helpers/__tests__/getTransitiveDependencies-test.js +++ b/packages/metro/src/DeltaBundler/Serializers/helpers/__tests__/getTransitiveDependencies-test.js @@ -10,7 +10,7 @@ 'use strict'; -const getTransitiveDependencies = require('../getTransitiveDependencies'); +import getTransitiveDependencies from '../getTransitiveDependencies'; function createModule(name, dependencies, type = 'module') { return [ diff --git a/packages/metro/src/DeltaBundler/Serializers/helpers/getInlineSourceMappingURL.js b/packages/metro/src/DeltaBundler/Serializers/helpers/getInlineSourceMappingURL.js index 411c252e7c..b79f293d31 100644 --- a/packages/metro/src/DeltaBundler/Serializers/helpers/getInlineSourceMappingURL.js +++ b/packages/metro/src/DeltaBundler/Serializers/helpers/getInlineSourceMappingURL.js @@ -9,11 +9,7 @@ * @oncall react_native */ -'use strict'; - -function getInlineSourceMappingURL(sourceMap: string): string { +export default function getInlineSourceMappingURL(sourceMap: string): string { const base64 = Buffer.from(sourceMap).toString('base64'); return `data:application/json;charset=utf-8;base64,${base64}`; } - -module.exports = getInlineSourceMappingURL; diff --git a/packages/metro/src/DeltaBundler/Serializers/helpers/getSourceMapInfo.js b/packages/metro/src/DeltaBundler/Serializers/helpers/getSourceMapInfo.js index cfee382f42..54069121d2 100644 --- a/packages/metro/src/DeltaBundler/Serializers/helpers/getSourceMapInfo.js +++ b/packages/metro/src/DeltaBundler/Serializers/helpers/getSourceMapInfo.js @@ -9,17 +9,15 @@ * @oncall react_native */ -'use strict'; - import type {Module} from '../../types'; import type { FBSourceFunctionMap, MetroSourceMapSegmentTuple, } from 'metro-source-map'; -const {getJsOutput} = require('./js'); +import {getJsOutput} from './js'; -function getSourceMapInfo( +export default function getSourceMapInfo( module: Module<>, options: { +excludeSource: boolean, @@ -50,5 +48,3 @@ function getModuleSource(module: Module<>): string { return module.getSource().toString(); } - -module.exports = getSourceMapInfo; diff --git a/packages/metro/src/DeltaBundler/Serializers/helpers/getTransitiveDependencies.js b/packages/metro/src/DeltaBundler/Serializers/helpers/getTransitiveDependencies.js index a3d756a1e8..dcea05ddfa 100644 --- a/packages/metro/src/DeltaBundler/Serializers/helpers/getTransitiveDependencies.js +++ b/packages/metro/src/DeltaBundler/Serializers/helpers/getTransitiveDependencies.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {ReadOnlyGraph} from '../../types'; import {isResolvedDependency} from '../../../lib/isResolvedDependency'; -function getTransitiveDependencies( +export default function getTransitiveDependencies( path: string, graph: ReadOnlyGraph, ): Set { @@ -53,5 +51,3 @@ function _getDeps( return deps; } - -module.exports = getTransitiveDependencies; diff --git a/packages/metro/src/DeltaBundler/Serializers/helpers/js.js b/packages/metro/src/DeltaBundler/Serializers/helpers/js.js index 83a6654adb..c2b564e814 100644 --- a/packages/metro/src/DeltaBundler/Serializers/helpers/js.js +++ b/packages/metro/src/DeltaBundler/Serializers/helpers/js.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {MixedOutput, Module} from '../../types'; import type {JsOutput} from 'metro-transform-worker'; -const {isResolvedDependency} = require('../../../lib/isResolvedDependency'); -const invariant = require('invariant'); -const jscSafeUrl = require('jsc-safe-url'); -const {addParamsToDefineCall} = require('metro-transform-plugins'); -const path = require('path'); +import {isResolvedDependency} from '../../../lib/isResolvedDependency'; +import invariant from 'invariant'; +import * as jscSafeUrl from 'jsc-safe-url'; +import {addParamsToDefineCall} from 'metro-transform-plugins'; +import path from 'path'; export type Options = $ReadOnly<{ createModuleId: string => number | string, @@ -30,7 +28,7 @@ export type Options = $ReadOnly<{ ... }>; -function wrapModule(module: Module<>, options: Options): string { +export function wrapModule(module: Module<>, options: Options): string { const output = getJsOutput(module); if (output.type.startsWith('js/script')) { @@ -41,7 +39,10 @@ function wrapModule(module: Module<>, options: Options): string { return addParamsToDefineCall(output.data.code, ...params); } -function getModuleParams(module: Module<>, options: Options): Array { +export function getModuleParams( + module: Module<>, + options: Options, +): Array { const moduleId = options.createModuleId(module.path); const paths: {[moduleID: number | string]: mixed} = {}; @@ -110,7 +111,7 @@ function getModuleParams(module: Module<>, options: Options): Array { return params; } -function getJsOutput( +export function getJsOutput( module: $ReadOnly<{ output: $ReadOnlyArray, path?: string, @@ -138,17 +139,10 @@ function getJsOutput( return jsOutput; } -function isJsModule(module: Module<>): boolean { +export function isJsModule(module: Module<>): boolean { return module.output.filter(isJsOutput).length > 0; } function isJsOutput(output: MixedOutput): boolean { return output.type.startsWith('js/'); } - -module.exports = { - getJsOutput, - getModuleParams, - isJsModule, - wrapModule, -}; diff --git a/packages/metro/src/DeltaBundler/Serializers/helpers/processModules.js b/packages/metro/src/DeltaBundler/Serializers/helpers/processModules.js index ce4e19966b..2abab37b73 100644 --- a/packages/metro/src/DeltaBundler/Serializers/helpers/processModules.js +++ b/packages/metro/src/DeltaBundler/Serializers/helpers/processModules.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {Module} from '../../types'; -const {isJsModule, wrapModule} = require('./js'); +import {isJsModule, wrapModule} from './js'; -function processModules( +export default function processModules( modules: $ReadOnlyArray>, { filter = () => true, @@ -50,5 +48,3 @@ function processModules( }), ]); } - -module.exports = processModules; diff --git a/packages/metro/src/DeltaBundler/Serializers/hmrJSBundle.js b/packages/metro/src/DeltaBundler/Serializers/hmrJSBundle.js index 90bbd18490..b5db0ebf91 100644 --- a/packages/metro/src/DeltaBundler/Serializers/hmrJSBundle.js +++ b/packages/metro/src/DeltaBundler/Serializers/hmrJSBundle.js @@ -9,17 +9,15 @@ * @oncall react_native */ -'use strict'; - import type {EntryPointURL} from '../../HmrServer'; import type {DeltaResult, Module, ReadOnlyGraph} from '../types'; import type {HmrModule} from 'metro-runtime/src/modules/types'; -const {isJsModule, wrapModule} = require('./helpers/js'); -const jscSafeUrl = require('jsc-safe-url'); -const {addParamsToDefineCall} = require('metro-transform-plugins'); -const path = require('path'); -const url = require('url'); +import {isJsModule, wrapModule} from './helpers/js'; +import * as jscSafeUrl from 'jsc-safe-url'; +import {addParamsToDefineCall} from 'metro-transform-plugins'; +import path from 'path'; +import url from 'url'; type Options = $ReadOnly<{ clientUrl: EntryPointURL, @@ -131,7 +129,7 @@ function getInverseDependencies( return inverseDependencies; } -function hmrJSBundle( +export default function hmrJSBundle( delta: DeltaResult<>, graph: ReadOnlyGraph<>, options: Options, @@ -148,5 +146,3 @@ function hmrJSBundle( ), }; } - -module.exports = hmrJSBundle; diff --git a/packages/metro/src/DeltaBundler/Serializers/sourceMapGenerator.js b/packages/metro/src/DeltaBundler/Serializers/sourceMapGenerator.js index bfdf811988..f1c40c4ec3 100644 --- a/packages/metro/src/DeltaBundler/Serializers/sourceMapGenerator.js +++ b/packages/metro/src/DeltaBundler/Serializers/sourceMapGenerator.js @@ -9,16 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {Module} from '../types'; -const getSourceMapInfo = require('./helpers/getSourceMapInfo'); -const {isJsModule} = require('./helpers/js'); -const { - fromRawMappings, - fromRawMappingsNonBlocking, -} = require('metro-source-map'); +import getSourceMapInfo from './helpers/getSourceMapInfo'; +import {isJsModule} from './helpers/js'; +import {fromRawMappings, fromRawMappingsNonBlocking} from 'metro-source-map'; export type SourceMapGeneratorOptions = $ReadOnly<{ excludeSource: boolean, @@ -113,7 +108,4 @@ async function sourceMapGeneratorNonBlocking( return fromRawMappingsNonBlocking(sourceMapInfos); } -module.exports = { - sourceMapGenerator, - sourceMapGeneratorNonBlocking, -}; +export {sourceMapGenerator, sourceMapGeneratorNonBlocking}; diff --git a/packages/metro/src/DeltaBundler/Serializers/sourceMapObject.js b/packages/metro/src/DeltaBundler/Serializers/sourceMapObject.js index 3be66657d4..822ef30d02 100644 --- a/packages/metro/src/DeltaBundler/Serializers/sourceMapObject.js +++ b/packages/metro/src/DeltaBundler/Serializers/sourceMapObject.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {Module} from '../types'; import type {SourceMapGeneratorOptions} from './sourceMapGenerator'; import type {MixedSourceMap} from 'metro-source-map'; -const { +import { sourceMapGenerator, sourceMapGeneratorNonBlocking, -} = require('./sourceMapGenerator'); +} from './sourceMapGenerator'; function sourceMapObject( modules: $ReadOnlyArray>, @@ -40,7 +38,4 @@ async function sourceMapObjectNonBlocking( }); } -module.exports = { - sourceMapObject, - sourceMapObjectNonBlocking, -}; +export {sourceMapObject, sourceMapObjectNonBlocking}; diff --git a/packages/metro/src/DeltaBundler/Serializers/sourceMapString.js b/packages/metro/src/DeltaBundler/Serializers/sourceMapString.js index 4202e7ac1e..0baf6b1cf8 100644 --- a/packages/metro/src/DeltaBundler/Serializers/sourceMapString.js +++ b/packages/metro/src/DeltaBundler/Serializers/sourceMapString.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {Module} from '../types'; import type {SourceMapGeneratorOptions} from './sourceMapGenerator'; -const { +import { sourceMapGenerator, sourceMapGeneratorNonBlocking, -} = require('./sourceMapGenerator'); +} from './sourceMapGenerator'; function sourceMapString( modules: $ReadOnlyArray>, @@ -38,7 +36,4 @@ async function sourceMapStringNonBlocking( }); } -module.exports = { - sourceMapString, - sourceMapStringNonBlocking, -}; +export {sourceMapString, sourceMapStringNonBlocking}; diff --git a/packages/metro/src/DeltaBundler/Transformer.js b/packages/metro/src/DeltaBundler/Transformer.js index dc4c73b49a..00d9e87d1c 100644 --- a/packages/metro/src/DeltaBundler/Transformer.js +++ b/packages/metro/src/DeltaBundler/Transformer.js @@ -9,27 +9,26 @@ * @oncall react_native */ -'use strict'; - import type {TransformResult, TransformResultWithSource} from '../DeltaBundler'; import type {TransformerConfig, TransformOptions} from './Worker'; import type {ConfigT} from 'metro-config'; +import getTransformCacheKey from './getTransformCacheKey'; +import WorkerFarm from './WorkerFarm'; +import assert from 'assert'; import crypto from 'crypto'; +import fs from 'fs'; +import {Cache, stableHash} from 'metro-cache'; +import path from 'path'; -const getTransformCacheKey = require('./getTransformCacheKey'); -const WorkerFarm = require('./WorkerFarm'); -const assert = require('assert'); +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:Transformer'); -const fs = require('fs'); -const {Cache, stableHash} = require('metro-cache'); -const path = require('path'); type GetOrComputeSha1Fn = string => Promise< $ReadOnly<{content?: Buffer, sha1: string}>, >; -class Transformer { +export default class Transformer { _config: ConfigT; _cache: Cache>; _baseHash: string; @@ -212,5 +211,3 @@ function verifyRootExists(root: string): void { // Verify that the root exists. assert(fs.statSync(root).isDirectory(), 'Root has to be a valid directory'); } - -module.exports = Transformer; diff --git a/packages/metro/src/DeltaBundler/Worker.flow.js b/packages/metro/src/DeltaBundler/Worker.flow.js index 8fc0541cc1..0bcb528c32 100644 --- a/packages/metro/src/DeltaBundler/Worker.flow.js +++ b/packages/metro/src/DeltaBundler/Worker.flow.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {TransformResult} from './types'; import type {LogEntry} from 'metro-core/private/Logger'; import type { @@ -18,17 +16,13 @@ import type { JsTransformOptions, } from 'metro-transform-worker'; -const traverse = require('@babel/traverse').default; -const crypto = require('crypto'); -const fs = require('fs'); -const path = require('path'); +import traverse from '@babel/traverse'; +import crypto from 'crypto'; +import fs from 'fs'; +import path from 'path'; export type {JsTransformOptions as TransformOptions} from 'metro-transform-worker'; -export type Worker = { - +transform: typeof transform, -}; - type TransformerInterface = { transform( JsTransformerConfig, @@ -72,13 +66,13 @@ function asDeserializedBuffer(value: any): Buffer | null { return null; } -async function transform( +export const transform = ( filename: string, transformOptions: JsTransformOptions, projectRoot: string, transformerConfig: TransformerConfig, fileBuffer?: Buffer, -): Promise { +): Promise => { let data; const fileBufferObject = asDeserializedBuffer(fileBuffer); @@ -94,7 +88,11 @@ async function transform( projectRoot, transformerConfig, ); -} +}; + +export type Worker = { + +transform: typeof transform, +}; async function transformFile( filename: string, @@ -160,7 +158,3 @@ function getEndLogEntry(startLogEntry: LogEntry, filename: string): LogEntry { log_entry_label: 'Transforming file', }; } - -module.exports = ({ - transform, -}: Worker); diff --git a/packages/metro/src/DeltaBundler/Worker.js b/packages/metro/src/DeltaBundler/Worker.js index 3b5718dbc8..bf5c1b00ea 100644 --- a/packages/metro/src/DeltaBundler/Worker.js +++ b/packages/metro/src/DeltaBundler/Worker.js @@ -9,6 +9,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; /*:: diff --git a/packages/metro/src/DeltaBundler/WorkerFarm.js b/packages/metro/src/DeltaBundler/WorkerFarm.js index e0869df637..29da1f2665 100644 --- a/packages/metro/src/DeltaBundler/WorkerFarm.js +++ b/packages/metro/src/DeltaBundler/WorkerFarm.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {TransformResult} from '../DeltaBundler'; import type {TransformerConfig, TransformOptions, Worker} from './Worker'; import type {ConfigT} from 'metro-config'; import type {Readable} from 'stream'; -const {Worker: JestWorker} = require('jest-worker'); -const {Logger} = require('metro-core'); +import {Worker as JestWorker} from 'jest-worker'; +import {Logger} from 'metro-core'; type WorkerInterface = { getStdout(): Readable, @@ -31,7 +29,7 @@ type TransformerResult = $ReadOnly<{ sha1: string, }>; -class WorkerFarm { +export default class WorkerFarm { _config: ConfigT; _transformerConfig: TransformerConfig; _worker: WorkerInterface | Worker; @@ -63,6 +61,7 @@ class WorkerFarm { this._worker = worker; } else { + // eslint-disable-next-line import/no-commonjs this._worker = (require('./Worker'): Worker); } } @@ -180,5 +179,3 @@ class TransformError extends SyntaxError { Error.captureStackTrace && Error.captureStackTrace(this, TransformError); } } - -module.exports = WorkerFarm; diff --git a/packages/metro/src/DeltaBundler/__tests__/DeltaBundler-test.js b/packages/metro/src/DeltaBundler/__tests__/DeltaBundler-test.js index bd033451f0..780ae3cc29 100644 --- a/packages/metro/src/DeltaBundler/__tests__/DeltaBundler-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/DeltaBundler-test.js @@ -9,12 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {MixedOutput, Options, TransformResultDependency} from '../types'; -const DeltaBundler = require('../../DeltaBundler'); -const DeltaCalculator = require('../DeltaCalculator'); +import DeltaBundler from '../../DeltaBundler'; +import DeltaCalculator from '../DeltaCalculator'; + const {EventEmitter} = require('events'); jest.mock('../DeltaCalculator'); diff --git a/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-context-test.js b/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-context-test.js index 34132c9a5d..7181bea140 100644 --- a/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-context-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-context-test.js @@ -15,9 +15,9 @@ import type {Result} from '../Graph'; import type {Options, TransformResultDependency} from '../types'; import CountingSet from '../../lib/CountingSet'; +import DeltaCalculator from '../DeltaCalculator'; import {Graph} from '../Graph'; -const DeltaCalculator = require('../DeltaCalculator'); const {EventEmitter} = require('events'); const traverseDependencies = jest.spyOn( diff --git a/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js b/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js index b296d826ac..3fef3e9c5d 100644 --- a/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/DeltaCalculator-test.js @@ -203,7 +203,7 @@ describe.each(['linux', 'win32'])('DeltaCalculator (%s)', osPlatform => { }; }); - const DeltaCalculator = require('../DeltaCalculator'); + const DeltaCalculator = require('../DeltaCalculator').default; // $FlowFixMe[underconstrained-implicit-instantiation] deltaCalculator = new DeltaCalculator( diff --git a/packages/metro/src/DeltaBundler/__tests__/Transformer-test.js b/packages/metro/src/DeltaBundler/__tests__/Transformer-test.js index 3eb024fccf..1a59581ac8 100644 --- a/packages/metro/src/DeltaBundler/__tests__/Transformer-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/Transformer-test.js @@ -18,10 +18,11 @@ jest .mock('../WorkerFarm') .mock('/path/to/transformer.js', () => ({}), {virtual: true}); -var Transformer = require('../Transformer'); -var fs = require('fs'); -var {getDefaultValues} = require('metro-config').getDefaultConfig; -var {mergeConfig} = require('metro-config/private/loadConfig'); +// Must be required after mocks above +const Transformer = require('../Transformer').default; +const fs = require('fs'); +const {getDefaultValues} = require('metro-config').getDefaultConfig; +const {mergeConfig} = require('metro-config/private/loadConfig'); describe('Transformer', function () { let watchFolders; @@ -74,7 +75,7 @@ describe('Transformer', function () { {getOrComputeSha1}, ); - require('../WorkerFarm').prototype.transform.mockReturnValue({ + require('../WorkerFarm').default.prototype.transform.mockReturnValue({ sha1: 'abcdefabcdefabcdefabcdefabcdefabcdefabcd', result: {}, }); @@ -123,7 +124,7 @@ describe('Transformer', function () { {getOrComputeSha1}, ); - require('../WorkerFarm').prototype.transform.mockReturnValue({ + require('../WorkerFarm').default.prototype.transform.mockReturnValue({ sha1: 'abcdefabcdefabcdefabcdefabcdefabcdefabcd', result: {}, }); @@ -163,7 +164,7 @@ describe('Transformer', function () { {getOrComputeSha1}, ); - require('../WorkerFarm').prototype.transform.mockReturnValue({ + require('../WorkerFarm').default.prototype.transform.mockReturnValue({ sha1: 'abcdefabcdefabcdefabcdefabcdefabcdefabcd', result: {}, }); @@ -204,7 +205,7 @@ describe('Transformer', function () { {getOrComputeSha1}, ); - require('../WorkerFarm').prototype.transform.mockReturnValue({ + require('../WorkerFarm').default.prototype.transform.mockReturnValue({ sha1: 'abcdefabcdefabcdefabcdefabcdefabcdefabcd', result: {}, }); diff --git a/packages/metro/src/DeltaBundler/__tests__/WorkerFarm-test.js b/packages/metro/src/DeltaBundler/__tests__/WorkerFarm-test.js index 5104075098..c35c84d576 100644 --- a/packages/metro/src/DeltaBundler/__tests__/WorkerFarm-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/WorkerFarm-test.js @@ -55,7 +55,7 @@ describe('Worker Farm', function () { return api; }); - WorkerFarm = require('../WorkerFarm'); + WorkerFarm = require('../WorkerFarm').default; }); test('passes transform data to the worker farm when transforming', async () => { diff --git a/packages/metro/src/DeltaBundler/__tests__/mergeDeltas-test.js b/packages/metro/src/DeltaBundler/__tests__/mergeDeltas-test.js index 931ac09c32..9cefc9e6bc 100644 --- a/packages/metro/src/DeltaBundler/__tests__/mergeDeltas-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/mergeDeltas-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const mergeDeltas = require('../mergeDeltas'); +import mergeDeltas from '../mergeDeltas'; function sortById([id1]: [number, T], [id2]: [number, T]): number { return id1 - id2; diff --git a/packages/metro/src/DeltaBundler/__tests__/resolver-test.js b/packages/metro/src/DeltaBundler/__tests__/resolver-test.js index 597ae29f01..44c770c161 100644 --- a/packages/metro/src/DeltaBundler/__tests__/resolver-test.js +++ b/packages/metro/src/DeltaBundler/__tests__/resolver-test.js @@ -115,7 +115,7 @@ function dep(name: string): TransformResultDependency { }; async function createResolver(config: InputConfigT = {}, platform?: string) { - const DependencyGraph = require('../../node-haste/DependencyGraph'); + const DependencyGraph = require('../../node-haste/DependencyGraph').default; const dependencyGraph = new DependencyGraph( mergeConfig(await getDefaultConfig(p('/root')), defaultConfig, config), ); diff --git a/packages/metro/src/DeltaBundler/getTransformCacheKey.js b/packages/metro/src/DeltaBundler/getTransformCacheKey.js index 9574efab87..cc1ef90eac 100644 --- a/packages/metro/src/DeltaBundler/getTransformCacheKey.js +++ b/packages/metro/src/DeltaBundler/getTransformCacheKey.js @@ -9,20 +9,20 @@ * @oncall react_native */ -'use strict'; - import type {TransformerConfig} from './Worker'; import type {JsTransformerConfig} from 'metro-transform-worker'; +import crypto from 'crypto'; +import {getCacheKey} from 'metro-cache-key'; + +// eslint-disable-next-line import/no-commonjs const VERSION = require('../../package.json').version; -const crypto = require('crypto'); -const {getCacheKey} = require('metro-cache-key'); type CacheKeyProvider = { getCacheKey?: JsTransformerConfig => string, }; -function getTransformCacheKey(opts: { +export default function getTransformCacheKey(opts: { +cacheVersion: string, +projectRoot: string, +transformerConfig: TransformerConfig, @@ -49,5 +49,3 @@ function getTransformCacheKey(opts: { ) .digest('hex'); } - -module.exports = getTransformCacheKey; diff --git a/packages/metro/src/DeltaBundler/mergeDeltas.js b/packages/metro/src/DeltaBundler/mergeDeltas.js index dc3f952eda..cc71e9654f 100644 --- a/packages/metro/src/DeltaBundler/mergeDeltas.js +++ b/packages/metro/src/DeltaBundler/mergeDeltas.js @@ -9,11 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {DeltaBundle} from 'metro-runtime/src/modules/types'; -function mergeDeltas(delta1: DeltaBundle, delta2: DeltaBundle): DeltaBundle { +export default function mergeDeltas( + delta1: DeltaBundle, + delta2: DeltaBundle, +): DeltaBundle { const added1 = new Map(delta1.added); const modified1 = new Map(delta1.modified); const deleted1 = new Set(delta1.deleted); @@ -70,5 +71,3 @@ function mergeDeltas(delta1: DeltaBundle, delta2: DeltaBundle): DeltaBundle { deleted: [...deleted], }; } - -module.exports = mergeDeltas; diff --git a/packages/metro/src/DeltaBundler/types.js b/packages/metro/src/DeltaBundler/types.js index ce06388cc5..b39a5ad162 100644 --- a/packages/metro/src/DeltaBundler/types.js +++ b/packages/metro/src/DeltaBundler/types.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {RequireContext} from '../lib/contextModule'; import type {RequireContextParams} from '../ModuleGraph/worker/collectDependencies'; import type {Graph} from './Graph'; diff --git a/packages/metro/src/HmrServer.js b/packages/metro/src/HmrServer.js index 526aa2aca9..285906bfd9 100644 --- a/packages/metro/src/HmrServer.js +++ b/packages/metro/src/HmrServer.js @@ -8,8 +8,6 @@ * @flow */ -'use strict'; - import type IncrementalBundler, {RevisionId} from './IncrementalBundler'; import type {GraphOptions} from './shared/types'; import type {ConfigT, RootPerfLogger} from 'metro-config'; @@ -21,20 +19,20 @@ import type { } from 'metro-runtime/src/modules/types'; import type {UrlWithParsedQuery} from 'url'; -const hmrJSBundle = require('./DeltaBundler/Serializers/hmrJSBundle'); -const GraphNotFoundError = require('./IncrementalBundler/GraphNotFoundError'); -const RevisionNotFoundError = require('./IncrementalBundler/RevisionNotFoundError'); -const debounceAsyncQueue = require('./lib/debounceAsyncQueue'); -const formatBundlingError = require('./lib/formatBundlingError'); -const getGraphId = require('./lib/getGraphId'); -const parseOptionsFromUrl = require('./lib/parseOptionsFromUrl'); -const splitBundleOptions = require('./lib/splitBundleOptions'); -const transformHelpers = require('./lib/transformHelpers'); -const { - Logger: {createActionStartEntry, createActionEndEntry, log}, -} = require('metro-core'); -const nullthrows = require('nullthrows'); -const url = require('url'); +import hmrJSBundle from './DeltaBundler/Serializers/hmrJSBundle'; +import GraphNotFoundError from './IncrementalBundler/GraphNotFoundError'; +import RevisionNotFoundError from './IncrementalBundler/RevisionNotFoundError'; +import debounceAsyncQueue from './lib/debounceAsyncQueue'; +import formatBundlingError from './lib/formatBundlingError'; +import getGraphId from './lib/getGraphId'; +import parseOptionsFromUrl from './lib/parseOptionsFromUrl'; +import splitBundleOptions from './lib/splitBundleOptions'; +import * as transformHelpers from './lib/transformHelpers'; +import {Logger} from 'metro-core'; +import nullthrows from 'nullthrows'; +import url from 'url'; + +const {createActionStartEntry, createActionEndEntry, log} = Logger; export type EntryPointURL = UrlWithParsedQuery; @@ -66,7 +64,7 @@ function send(sendFns: Array<(string) => void>, message: HmrMessage): void { * getting connected, disconnected or having errors (through the * `onClientConnect`, `onClientDisconnect` and `onClientError` methods). */ -class HmrServer { +export default class HmrServer { _config: ConfigT; _bundler: IncrementalBundler; _createModuleId: (path: string) => number; @@ -396,5 +394,3 @@ class HmrServer { } } } - -module.exports = HmrServer; diff --git a/packages/metro/src/IncrementalBundler.js b/packages/metro/src/IncrementalBundler.js index afb23fc838..10521fed2e 100644 --- a/packages/metro/src/IncrementalBundler.js +++ b/packages/metro/src/IncrementalBundler.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {DeltaResult, Graph, MixedOutput, Module} from './DeltaBundler'; import type { Options as DeltaBundlerOptions, @@ -21,15 +19,15 @@ import type {GraphId} from './lib/getGraphId'; import type {ResolverInputOptions} from './shared/types'; import type {ConfigT} from 'metro-config'; -const Bundler = require('./Bundler'); -const DeltaBundler = require('./DeltaBundler'); -const ResourceNotFoundError = require('./IncrementalBundler/ResourceNotFoundError'); -const getGraphId = require('./lib/getGraphId'); -const getPrependedScripts = require('./lib/getPrependedScripts'); -const transformHelpers = require('./lib/transformHelpers'); -const crypto = require('crypto'); -const fs = require('fs'); -const path = require('path'); +import Bundler from './Bundler'; +import DeltaBundler from './DeltaBundler'; +import ResourceNotFoundError from './IncrementalBundler/ResourceNotFoundError'; +import getGraphId from './lib/getGraphId'; +import getPrependedScripts from './lib/getPrependedScripts'; +import * as transformHelpers from './lib/transformHelpers'; +import crypto from 'crypto'; +import fs from 'fs'; +import path from 'path'; export opaque type RevisionId: string = string; @@ -63,7 +61,7 @@ function revisionIdFromString(str: string): RevisionId { return str; } -class IncrementalBundler { +export default class IncrementalBundler { _config: ConfigT; _bundler: Bundler; _deltaBundler: DeltaBundler<>; @@ -366,5 +364,3 @@ class IncrementalBundler { await this._bundler.ready(); } } - -module.exports = IncrementalBundler; diff --git a/packages/metro/src/IncrementalBundler/GraphNotFoundError.js b/packages/metro/src/IncrementalBundler/GraphNotFoundError.js index bb31560232..ac53d83f87 100644 --- a/packages/metro/src/IncrementalBundler/GraphNotFoundError.js +++ b/packages/metro/src/IncrementalBundler/GraphNotFoundError.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {GraphId} from '../lib/getGraphId'; -class GraphNotFoundError extends Error { +export default class GraphNotFoundError extends Error { graphId: GraphId; constructor(graphId: GraphId) { @@ -21,5 +19,3 @@ class GraphNotFoundError extends Error { this.graphId = graphId; } } - -module.exports = GraphNotFoundError; diff --git a/packages/metro/src/IncrementalBundler/ResourceNotFoundError.js b/packages/metro/src/IncrementalBundler/ResourceNotFoundError.js index c55b8c3d9c..19e765488b 100644 --- a/packages/metro/src/IncrementalBundler/ResourceNotFoundError.js +++ b/packages/metro/src/IncrementalBundler/ResourceNotFoundError.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -class ResourceNotFoundError extends Error { +export default class ResourceNotFoundError extends Error { resourcePath: string; constructor(resourcePath: string) { @@ -19,5 +17,3 @@ class ResourceNotFoundError extends Error { this.resourcePath = resourcePath; } } - -module.exports = ResourceNotFoundError; diff --git a/packages/metro/src/IncrementalBundler/RevisionNotFoundError.js b/packages/metro/src/IncrementalBundler/RevisionNotFoundError.js index 04f48ef0b7..0c2e007066 100644 --- a/packages/metro/src/IncrementalBundler/RevisionNotFoundError.js +++ b/packages/metro/src/IncrementalBundler/RevisionNotFoundError.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - import type {RevisionId} from '../IncrementalBundler'; -class RevisionNotFoundError extends Error { +export default class RevisionNotFoundError extends Error { revisionId: RevisionId; constructor(revisionId: RevisionId) { @@ -21,5 +19,3 @@ class RevisionNotFoundError extends Error { this.revisionId = revisionId; } } - -module.exports = RevisionNotFoundError; diff --git a/packages/metro/src/ModuleGraph/test-helpers.js b/packages/metro/src/ModuleGraph/test-helpers.js index f131c2264a..90147960d6 100644 --- a/packages/metro/src/ModuleGraph/test-helpers.js +++ b/packages/metro/src/ModuleGraph/test-helpers.js @@ -8,10 +8,8 @@ * @oncall react_native */ -'use strict'; - -const generate = require('@babel/generator').default; -const {toMatchSnapshot} = require('jest-snapshot'); +import generate from '@babel/generator'; +import {toMatchSnapshot} from 'jest-snapshot'; const generateOptions = {concise: true, sourceType: 'module'}; const codeFromAst = ast => generate(ast, generateOptions).code; @@ -80,7 +78,7 @@ function toMatchCodeFrameSnapshot(received) { ); } -module.exports = { +export { codeFromAst, comparableCode, toEqualComparableCode, diff --git a/packages/metro/src/ModuleGraph/worker/JsFileWrapping.js b/packages/metro/src/ModuleGraph/worker/JsFileWrapping.js index 798e6eddad..f54790d49b 100644 --- a/packages/metro/src/ModuleGraph/worker/JsFileWrapping.js +++ b/packages/metro/src/ModuleGraph/worker/JsFileWrapping.js @@ -8,8 +8,6 @@ * @flow strict-local */ -'use strict'; - import type {FunctionExpression, Identifier, Program} from '@babel/types'; import template from '@babel/template'; @@ -162,11 +160,4 @@ function renameRequires(ast: BabelNodeFile): string { return newRequireName; } -module.exports = { - WRAP_NAME, - - wrapJson, - jsonToCommonJS, - wrapModule, - wrapPolyfill, -}; +export {WRAP_NAME, wrapJson, jsonToCommonJS, wrapModule, wrapPolyfill}; diff --git a/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js b/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js index 154a17a04e..17920a6610 100644 --- a/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js +++ b/packages/metro/src/ModuleGraph/worker/__tests__/collectDependencies-test.js @@ -21,8 +21,9 @@ import type { import type {NodePath} from '@babel/traverse'; import type {MetroBabelFileMetadata} from 'metro-babel-transformer'; +import collectDependencies from '../collectDependencies'; + const {codeFromAst, comparableCode} = require('../../test-helpers'); -const collectDependencies = require('../collectDependencies'); const {importLocationsPlugin, locToKey} = require('../importLocationsPlugin'); const {codeFrameColumns} = require('@babel/code-frame'); const {transformFromAstSync} = require('@babel/core'); diff --git a/packages/metro/src/ModuleGraph/worker/collectDependencies.js b/packages/metro/src/ModuleGraph/worker/collectDependencies.js index 948f6d3bbe..697f225f7e 100644 --- a/packages/metro/src/ModuleGraph/worker/collectDependencies.js +++ b/packages/metro/src/ModuleGraph/worker/collectDependencies.js @@ -8,8 +8,6 @@ * @flow */ -'use strict'; - import type {NodePath} from '@babel/traverse'; import type {CallExpression, Identifier, StringLiteral} from '@babel/types'; import type { @@ -17,17 +15,14 @@ import type { AsyncDependencyType, } from 'metro/private/DeltaBundler/types'; -import {isProgram} from '@babel/types'; - -const generate = require('@babel/generator').default; -const template = require('@babel/template').default; -const traverse = require('@babel/traverse').default; -const types = require('@babel/types'); -const crypto = require('crypto'); -const invariant = require('invariant'); -const nullthrows = require('nullthrows'); - -const {isImport} = types; +import generate from '@babel/generator'; +import template from '@babel/template'; +import traverse from '@babel/traverse'; +import * as types from '@babel/types'; +import {isImport, isProgram} from '@babel/types'; +import crypto from 'crypto'; +import invariant from 'invariant'; +import nullthrows from 'nullthrows'; type ImportDependencyOptions = $ReadOnly<{ asyncType: AsyncDependencyType, @@ -147,7 +142,7 @@ export type DynamicRequiresBehavior = 'throwAtRuntime' | 'reject'; * * The second argument is only provided for debugging purposes. */ -function collectDependencies( +export default function collectDependencies( ast: BabelNodeFile, options: Options, ): CollectedDependencies { @@ -932,5 +927,3 @@ class DependencyRegistry { return Array.from(this._dependencies.values()); } } - -module.exports = collectDependencies; diff --git a/packages/metro/src/ModuleGraph/worker/generateImportNames.js b/packages/metro/src/ModuleGraph/worker/generateImportNames.js index b539084460..8c035a77d2 100644 --- a/packages/metro/src/ModuleGraph/worker/generateImportNames.js +++ b/packages/metro/src/ModuleGraph/worker/generateImportNames.js @@ -8,16 +8,14 @@ * @flow strict-local */ -'use strict'; - -const traverse = require('@babel/traverse').default; -const nullthrows = require('nullthrows'); +import traverse from '@babel/traverse'; +import nullthrows from 'nullthrows'; /** * Select unused names for "metroImportDefault" and "metroImportAll", by * calling "generateUid". */ -function generateImportNames(ast: BabelNode): { +export default function generateImportNames(ast: BabelNode): { importAll: string, importDefault: string, } { @@ -38,5 +36,3 @@ function generateImportNames(ast: BabelNode): { importDefault: nullthrows(importDefault), }; } - -module.exports = generateImportNames; diff --git a/packages/metro/src/ModuleGraph/worker/importLocationsPlugin.js b/packages/metro/src/ModuleGraph/worker/importLocationsPlugin.js index 5730239e00..e4707e0ac5 100644 --- a/packages/metro/src/ModuleGraph/worker/importLocationsPlugin.js +++ b/packages/metro/src/ModuleGraph/worker/importLocationsPlugin.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {File, PluginObj} from '@babel/core'; import typeof * as Types from '@babel/types'; import type {MetroBabelFileMetadata} from 'metro-babel-transformer'; @@ -85,4 +83,4 @@ function locToKey(loc: BabelSourceLocation): string { return `${start.line},${start.column}:${end.line},${end.column}`; } -module.exports = {importLocationsPlugin, locToKey}; +export {importLocationsPlugin, locToKey}; diff --git a/packages/metro/src/Server.js b/packages/metro/src/Server.js index 1b0ad1b4e0..ad81b57a3e 100644 --- a/packages/metro/src/Server.js +++ b/packages/metro/src/Server.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {AssetData} from './Assets'; import type {ExplodedSourceMap} from './DeltaBundler/Serializers/getExplodedSourceMap'; import type {RamBundleInfo} from './DeltaBundler/Serializers/getRamBundleInfo'; @@ -44,49 +42,43 @@ import type { import type {CustomResolverOptions} from 'metro-resolver/private/types'; import type {CustomTransformOptions} from 'metro-transform-worker'; +import {getAsset} from './Assets'; +import baseJSBundle from './DeltaBundler/Serializers/baseJSBundle'; +import getAllFiles from './DeltaBundler/Serializers/getAllFiles'; +import getAssets from './DeltaBundler/Serializers/getAssets'; +import {getExplodedSourceMap} from './DeltaBundler/Serializers/getExplodedSourceMap'; +import getRamBundleInfo from './DeltaBundler/Serializers/getRamBundleInfo'; +import {sourceMapStringNonBlocking} from './DeltaBundler/Serializers/sourceMapString'; +import IncrementalBundler from './IncrementalBundler'; +import ResourceNotFoundError from './IncrementalBundler/ResourceNotFoundError'; +import bundleToString from './lib/bundleToString'; +import formatBundlingError from './lib/formatBundlingError'; +import getGraphId from './lib/getGraphId'; +import parseJsonBody from './lib/parseJsonBody'; +import parseOptionsFromUrl from './lib/parseOptionsFromUrl'; +import splitBundleOptions from './lib/splitBundleOptions'; +import * as transformHelpers from './lib/transformHelpers'; +import {UnableToResolveError} from './node-haste/DependencyGraph/ModuleResolution'; +import parsePlatformFilePath from './node-haste/lib/parsePlatformFilePath'; +import MultipartResponse from './Server/MultipartResponse'; +import symbolicate from './Server/symbolicate'; import {SourcePathsMode} from './shared/types'; - -const {getAsset} = require('./Assets'); -const baseJSBundle = require('./DeltaBundler/Serializers/baseJSBundle'); -const getAllFiles = require('./DeltaBundler/Serializers/getAllFiles'); -const getAssets = require('./DeltaBundler/Serializers/getAssets'); -const { - getExplodedSourceMap, -} = require('./DeltaBundler/Serializers/getExplodedSourceMap'); -const getRamBundleInfo = require('./DeltaBundler/Serializers/getRamBundleInfo'); -const { - sourceMapStringNonBlocking, -} = require('./DeltaBundler/Serializers/sourceMapString'); -const IncrementalBundler = require('./IncrementalBundler'); -const ResourceNotFoundError = require('./IncrementalBundler/ResourceNotFoundError'); -const bundleToString = require('./lib/bundleToString'); -const formatBundlingError = require('./lib/formatBundlingError'); -const getGraphId = require('./lib/getGraphId'); -const parseJsonBody = require('./lib/parseJsonBody'); -const parseOptionsFromUrl = require('./lib/parseOptionsFromUrl'); -const splitBundleOptions = require('./lib/splitBundleOptions'); -const transformHelpers = require('./lib/transformHelpers'); -const { - UnableToResolveError, -} = require('./node-haste/DependencyGraph/ModuleResolution'); -const parsePlatformFilePath = require('./node-haste/lib/parsePlatformFilePath'); -const MultipartResponse = require('./Server/MultipartResponse'); -const symbolicate = require('./Server/symbolicate'); -const {codeFrameColumns} = require('@babel/code-frame'); +import {codeFrameColumns} from '@babel/code-frame'; +import * as fs from 'graceful-fs'; +import invariant from 'invariant'; +import * as jscSafeUrl from 'jsc-safe-url'; +import {Logger} from 'metro-core'; +import mime from 'mime-types'; +import nullthrows from 'nullthrows'; +import path from 'path'; +import {performance} from 'perf_hooks'; +import querystring from 'querystring'; +import url from 'url'; + +// eslint-disable-next-line import/no-commonjs const debug = require('debug')('Metro:Server'); -const fs = require('graceful-fs'); -const invariant = require('invariant'); -const jscSafeUrl = require('jsc-safe-url'); -const { - Logger, - Logger: {createActionStartEntry, createActionEndEntry, log}, -} = require('metro-core'); -const mime = require('mime-types'); -const nullthrows = require('nullthrows'); -const path = require('path'); -const {performance} = require('perf_hooks'); -const querystring = require('querystring'); -const url = require('url'); + +const {createActionStartEntry, createActionEndEntry, log} = Logger; const noopLogger: RootPerfLogger = { start: () => {}, @@ -139,7 +131,7 @@ export type ServerOptions = $ReadOnly<{ const DELTA_ID_HEADER = 'X-Metro-Delta-ID'; const FILES_CHANGED_COUNT_HEADER = 'X-Metro-Files-Changed-Count'; -class Server { +export default class Server { _bundler: IncrementalBundler; _config: ConfigT; _createModuleId: (path: string) => number; @@ -1626,5 +1618,3 @@ function* zip(xs: Iterable, ys: Iterable): Iterable<[X, Y]> { function getBuildID(buildNumber: number): string { return buildNumber.toString(36); } - -module.exports = Server; diff --git a/packages/metro/src/Server/MultipartResponse.js b/packages/metro/src/Server/MultipartResponse.js index 0fe85b581e..42148efa4e 100644 --- a/packages/metro/src/Server/MultipartResponse.js +++ b/packages/metro/src/Server/MultipartResponse.js @@ -9,17 +9,16 @@ * @oncall react_native */ -'use strict'; import type {IncomingMessage, ServerResponse} from 'http'; -const accepts = require('accepts'); +import accepts from 'accepts'; const CRLF = '\r\n'; const BOUNDARY = '3beqjf3apnqeu3h5jqorms4i'; type Data = string | Buffer | Uint8Array; type Headers = {[string]: string | number}; -class MultipartResponse { +export default class MultipartResponse { static wrapIfSupported( req: IncomingMessage, res: ServerResponse, @@ -100,5 +99,3 @@ class MultipartResponse { return this; } } - -module.exports = MultipartResponse; diff --git a/packages/metro/src/Server/__tests__/Server-test.js b/packages/metro/src/Server/__tests__/Server-test.js index beb036ba23..0736f9d469 100644 --- a/packages/metro/src/Server/__tests__/Server-test.js +++ b/packages/metro/src/Server/__tests__/Server-test.js @@ -18,6 +18,7 @@ import type { TransformResultDependency, } from '../../DeltaBundler/types'; +import ResourceNotFoundError from '../../IncrementalBundler/ResourceNotFoundError'; import CountingSet from '../../lib/CountingSet'; import {mergeConfig} from 'metro-config'; // $FlowFixMe[untyped-import] @@ -25,7 +26,6 @@ import MockRequest from 'mock-req'; // $FlowFixMe[untyped-import] import MockResponse from 'mock-res'; -const ResourceNotFoundError = require('../../IncrementalBundler/ResourceNotFoundError'); const { getDefaultConfig: {getDefaultValues}, } = require('metro-config'); @@ -96,7 +96,7 @@ describe('processRequest', () => { getResolveDependencyFn, })); - Bundler = require('../../Bundler'); + Bundler = require('../../Bundler').default; jest .spyOn(Bundler.prototype, 'getDependencyGraph') .mockImplementation(getDependencyGraph); @@ -104,13 +104,13 @@ describe('processRequest', () => { jest.mock('fs', () => new (require('metro-memory-fs'))()); fs = require('fs'); - DeltaBundler = require('../../DeltaBundler'); + DeltaBundler = require('../../DeltaBundler').default; jest .spyOn(DeltaBundler.prototype, 'buildGraph') .mockImplementation(buildGraph); jest.spyOn(DeltaBundler.prototype, 'getDelta').mockImplementation(getDelta); - Server = require('../../Server'); + Server = require('../../Server').default; }); afterEach(() => { @@ -487,7 +487,7 @@ describe('processRequest', () => { }); test('should handle DELETE requests on *.bundle', async () => { - const IncrementalBundler = require('../../IncrementalBundler'); + const IncrementalBundler = require('../../IncrementalBundler').default; const updateSpy = jest.spyOn(IncrementalBundler.prototype, 'updateGraph'); const initSpy = jest.spyOn(IncrementalBundler.prototype, 'initializeGraph'); @@ -545,7 +545,7 @@ describe('processRequest', () => { }); test('DELETE handles errors', async () => { - const IncrementalBundler = require('../../IncrementalBundler'); + const IncrementalBundler = require('../../IncrementalBundler').default; jest .spyOn(IncrementalBundler.prototype, 'endGraph') .mockImplementationOnce(async () => { @@ -1122,7 +1122,7 @@ describe('processRequest', () => { }), }; - const IncrementalBundler = require('../../IncrementalBundler'); + const IncrementalBundler = require('../../IncrementalBundler').default; const updateSpy = jest.spyOn( IncrementalBundler.prototype, 'updateGraph', diff --git a/packages/metro/src/Server/symbolicate.js b/packages/metro/src/Server/symbolicate.js index 0cb55ec942..01dadb119c 100644 --- a/packages/metro/src/Server/symbolicate.js +++ b/packages/metro/src/Server/symbolicate.js @@ -9,7 +9,6 @@ * @oncall react_native */ -'use strict'; import type { FBSourceFunctionMap, MetroSourceMapSegmentTuple, @@ -17,12 +16,8 @@ import type { import type {ExplodedSourceMap} from '../DeltaBundler/Serializers/getExplodedSourceMap'; import type {ConfigT} from 'metro-config'; -const { - greatestLowerBound, -} = require('metro-source-map/private/Consumer/search'); -const { - SourceMetadataMapConsumer, -} = require('metro-symbolicate/private/Symbolication'); +import {greatestLowerBound} from 'metro-source-map/private/Consumer/search'; +import {SourceMetadataMapConsumer} from 'metro-symbolicate/private/Symbolication'; export type StackFrameInput = { +file: ?string, @@ -64,7 +59,7 @@ function createFunctionNameGetter( }); } -async function symbolicate( +export default async function symbolicate( stack: $ReadOnlyArray, maps: Iterable<[string, ExplodedSourceMap]>, config: ConfigT, @@ -224,5 +219,3 @@ async function symbolicate( customizeStack, ); } - -module.exports = symbolicate; diff --git a/packages/metro/src/__tests__/HmrServer-test.js b/packages/metro/src/__tests__/HmrServer-test.js index 8a0be0abc4..f9d9f6a516 100644 --- a/packages/metro/src/__tests__/HmrServer-test.js +++ b/packages/metro/src/__tests__/HmrServer-test.js @@ -14,12 +14,12 @@ import type {Client} from '../HmrServer'; import type {HmrClientMessage} from 'metro-runtime/src/modules/types'; import DeltaBundler from '../DeltaBundler'; +import HmrServer from '../HmrServer'; import IncrementalBundler from '../IncrementalBundler'; +import getGraphId from '../lib/getGraphId'; import EventEmitter from 'events'; import {mergeConfig} from 'metro-config'; -const HmrServer = require('../HmrServer'); -const getGraphId = require('../lib/getGraphId'); const { getDefaultConfig: {getDefaultValues}, } = require('metro-config'); diff --git a/packages/metro/src/cli-utils.js b/packages/metro/src/cli-utils.js index 146e203cf8..e80acf0118 100644 --- a/packages/metro/src/cli-utils.js +++ b/packages/metro/src/cli-utils.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; +import fs from 'fs'; -const fs = require('fs'); - -exports.watchFile = async function ( +export const watchFile = async function ( filename: string, callback: () => any, ): Promise { @@ -24,7 +22,7 @@ exports.watchFile = async function ( await callback(); }; -exports.makeAsyncCommand = +export const makeAsyncCommand = (command: (argv: T) => Promise): ((argv: T) => void) => (argv: T) => { Promise.resolve(command(argv)).catch(error => { diff --git a/packages/metro/src/cli.js b/packages/metro/src/cli.js index 04a57659f2..8e451cae50 100755 --- a/packages/metro/src/cli.js +++ b/packages/metro/src/cli.js @@ -10,6 +10,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; try { diff --git a/packages/metro/src/commands/build.js b/packages/metro/src/commands/build.js index da63296f30..3826da68f0 100644 --- a/packages/metro/src/commands/build.js +++ b/packages/metro/src/commands/build.js @@ -15,12 +15,11 @@ import type {CustomResolverOptions} from 'metro-resolver'; import type {ModuleObject} from 'yargs'; import typeof Yargs from 'yargs'; +import {makeAsyncCommand} from '../cli-utils'; import parseKeyValueParamArray from '../cli/parseKeyValueParamArray'; - -const {makeAsyncCommand} = require('../cli-utils'); -const TerminalReporter = require('../lib/TerminalReporter'); -const {loadConfig} = require('metro-config'); -const {Terminal} = require('metro-core'); +import TerminalReporter from '../lib/TerminalReporter'; +import {loadConfig} from 'metro-config'; +import {Terminal} from 'metro-core'; const term = new Terminal(process.stdout); const updateReporter = new TerminalReporter(term); @@ -43,7 +42,7 @@ type Args = $ReadOnly<{ resolverOption: CustomResolverOptions, }>; -module.exports = (): { +export default (): { ...ModuleObject, handler: Function, } => ({ @@ -109,6 +108,7 @@ module.exports = (): { }; // Inline require() to avoid circular dependency with ../index + // eslint-disable-next-line import/no-commonjs const MetroApi = require('../index'); await MetroApi.runBuild(config, { diff --git a/packages/metro/src/commands/dependencies.js b/packages/metro/src/commands/dependencies.js index 05cf39b7ee..0c2615216d 100644 --- a/packages/metro/src/commands/dependencies.js +++ b/packages/metro/src/commands/dependencies.js @@ -9,18 +9,16 @@ * @oncall react_native */ -'use strict'; - import type {ConfigT} from 'metro-config'; import type {ModuleObject} from 'yargs'; import typeof Yargs from 'yargs'; -const {makeAsyncCommand} = require('../cli-utils'); -const Server = require('../Server'); -const fs = require('fs'); -const {loadConfig} = require('metro-config'); -const path = require('path'); -const {promisify} = require('util'); +import {makeAsyncCommand} from '../cli-utils'; +import Server from '../Server'; +import fs from 'fs'; +import {loadConfig} from 'metro-config'; +import path from 'path'; +import {promisify} from 'util'; type Args = $ReadOnly<{ entryFile: string, @@ -84,7 +82,7 @@ async function dependencies(args: Args, config: ConfigT) { : Promise.resolve(); } -module.exports = (): {...ModuleObject, handler: Function} => ({ +export default (): {...ModuleObject, handler: Function} => ({ command: 'get-dependencies [entryFile]', desc: 'List all dependencies that will be bundled for a given entry point', builder: (yargs: Yargs) => { diff --git a/packages/metro/src/commands/serve.js b/packages/metro/src/commands/serve.js index d802ec5394..c90ea9ad8a 100644 --- a/packages/metro/src/commands/serve.js +++ b/packages/metro/src/commands/serve.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {ModuleObject} from 'yargs'; import typeof Yargs from 'yargs'; -const {makeAsyncCommand, watchFile} = require('../cli-utils'); -const {loadConfig, resolveConfig} = require('metro-config'); -const {promisify} = require('util'); +import {makeAsyncCommand, watchFile} from '../cli-utils'; +import {loadConfig, resolveConfig} from 'metro-config'; +import {promisify} from 'util'; type Args = $ReadOnly<{ projectRoots?: $ReadOnlyArray, @@ -32,7 +30,7 @@ type Args = $ReadOnly<{ resetCache?: boolean, }>; -module.exports = (): { +export default (): { ...ModuleObject, handler: Function, } => ({ @@ -96,6 +94,7 @@ module.exports = (): { const config = await loadConfig(argv); // Inline require() to avoid circular dependency with ../index + // eslint-disable-next-line import/no-commonjs const MetroApi = require('../index'); const { diff --git a/packages/metro/src/index.flow.js b/packages/metro/src/index.flow.js index 027e964db2..f333ad2a08 100644 --- a/packages/metro/src/index.flow.js +++ b/packages/metro/src/index.flow.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {AssetData} from './Assets'; import type {ReadOnlyGraph} from './DeltaBundler'; import type {ServerOptions} from './Server'; @@ -29,30 +27,30 @@ import type {CustomResolverOptions} from 'metro-resolver'; import type {CustomTransformOptions} from 'metro-transform-worker'; import typeof Yargs from 'yargs'; -const makeBuildCommand = require('./commands/build'); -const makeDependenciesCommand = require('./commands/dependencies'); -const makeServeCommand = require('./commands/serve'); -const MetroHmrServer = require('./HmrServer'); -const IncrementalBundler = require('./IncrementalBundler'); -const createWebsocketServer = require('./lib/createWebsocketServer'); -const JsonReporter = require('./lib/JsonReporter'); -const TerminalReporter = require('./lib/TerminalReporter'); -const MetroServer = require('./Server'); -const outputBundle = require('./shared/output/bundle'); -const chalk = require('chalk'); -const fs = require('fs'); -const http = require('http'); -const https = require('https'); -const { +import makeBuildCommand from './commands/build'; +import makeDependenciesCommand from './commands/dependencies'; +import makeServeCommand from './commands/serve'; +import MetroHmrServer from './HmrServer'; +import IncrementalBundler from './IncrementalBundler'; +import createWebsocketServer from './lib/createWebsocketServer'; +import JsonReporter from './lib/JsonReporter'; +import TerminalReporter from './lib/TerminalReporter'; +import MetroServer from './Server'; +import * as outputBundle from './shared/output/bundle'; +import chalk from 'chalk'; +import fs from 'fs'; +import http from 'http'; +import https from 'https'; +import { getDefaultConfig, loadConfig, mergeConfig, resolveConfig, -} = require('metro-config'); -const {Terminal} = require('metro-core'); -const net = require('net'); -const nullthrows = require('nullthrows'); -const {parse} = require('url'); +} from 'metro-config'; +import {Terminal} from 'metro-core'; +import net from 'net'; +import nullthrows from 'nullthrows'; +import {parse} from 'url'; type MetroMiddleWare = { attachHmrServer: (httpServer: HttpServer | HttpsServer) => void, @@ -149,9 +147,7 @@ export type RunBuildResult = { type BuildCommandOptions = {} | null; type ServeCommandOptions = {} | null; -exports.Terminal = Terminal; -exports.JsonReporter = JsonReporter; -exports.TerminalReporter = TerminalReporter; +export {Terminal, JsonReporter, TerminalReporter}; export type {AssetData} from './Assets'; export type {Reporter, ReportableEvent} from './lib/reporting'; @@ -163,7 +159,7 @@ async function getConfig(config: InputConfigT): Promise { return mergeConfig(defaultConfig, config); } -async function runMetro( +export async function runMetro( config: InputConfigT, options?: RunMetroOptions, ): Promise { @@ -206,12 +202,9 @@ async function runMetro( return server; } -exports.runMetro = runMetro; -exports.loadConfig = loadConfig; -exports.mergeConfig = mergeConfig; -exports.resolveConfig = resolveConfig; +export {loadConfig, mergeConfig, resolveConfig}; -const createConnectMiddleware = async function ( +export const createConnectMiddleware = async function ( config: ConfigT, options?: RunMetroOptions, ): Promise { @@ -254,9 +247,8 @@ const createConnectMiddleware = async function ( }, }; }; -exports.createConnectMiddleware = createConnectMiddleware; -exports.runServer = async ( +export const runServer = async ( config: ConfigT, { hasReducedPerformance = false, @@ -286,6 +278,7 @@ exports.runServer = async ( ); } // Lazy require + // eslint-disable-next-line import/no-commonjs const connect = require('connect'); const serverApp = connect(); @@ -386,7 +379,7 @@ exports.runServer = async ( }); }; -exports.runBuild = async ( +export const runBuild = async ( config: ConfigT, { assets = false, @@ -477,7 +470,7 @@ exports.runBuild = async ( } }; -exports.buildGraph = async function ( +export const buildGraph = async function ( config: InputConfigT, { customTransformOptions = Object.create(null), @@ -520,7 +513,7 @@ type AttachMetroCLIOptions = { ... }; -exports.attachMetroCli = function ( +export const attachMetroCli = function ( yargs: Yargs, options?: AttachMetroCLIOptions = {}, ): Yargs { diff --git a/packages/metro/src/index.js b/packages/metro/src/index.js index 47a8753481..ad754a8d16 100644 --- a/packages/metro/src/index.js +++ b/packages/metro/src/index.js @@ -9,6 +9,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; /*:: diff --git a/packages/metro/src/integration_tests/__tests__/rambundle-test.js b/packages/metro/src/integration_tests/__tests__/rambundle-test.js index 476083480c..6d15b98674 100644 --- a/packages/metro/src/integration_tests/__tests__/rambundle-test.js +++ b/packages/metro/src/integration_tests/__tests__/rambundle-test.js @@ -8,11 +8,10 @@ * @oncall react_native */ -'use strict'; +import * as Metro from '../../..'; +import RamBundleParser from '../../lib/RamBundleParser'; +import * as ramBundleOutput from '../../shared/output/unbundle'; -const Metro = require('../../..'); -const RamBundleParser = require('../../lib/RamBundleParser'); -const ramBundleOutput = require('../../shared/output/unbundle'); const fs = require('fs'); const os = require('os'); const path = require('path'); diff --git a/packages/metro/src/integration_tests/execBundle.js b/packages/metro/src/integration_tests/execBundle.js index f040dad425..83926a476e 100644 --- a/packages/metro/src/integration_tests/execBundle.js +++ b/packages/metro/src/integration_tests/execBundle.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const vm = require('vm'); +import vm from 'vm'; module.exports = function execBundle(code: string, context: any = {}): mixed { if (vm.isContext(context)) { diff --git a/packages/metro/src/lib/BatchProcessor.js b/packages/metro/src/lib/BatchProcessor.js index 05372c6b70..f01b1fe6fc 100644 --- a/packages/metro/src/lib/BatchProcessor.js +++ b/packages/metro/src/lib/BatchProcessor.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const invariant = require('invariant'); +import invariant from 'invariant'; type ProcessBatch = ( batch: Array, @@ -38,7 +36,7 @@ type QueueItem = { * if we have many items pending in a short amount of time, we can start * processing right away. */ -class BatchProcessor { +export default class BatchProcessor { _currentProcessCount: number; _options: BatchProcessorOptions; _processBatch: ProcessBatch; @@ -124,5 +122,3 @@ class BatchProcessor { return this._queue.length; } } - -module.exports = BatchProcessor; diff --git a/packages/metro/src/lib/JsonReporter.js b/packages/metro/src/lib/JsonReporter.js index 5a4fe118eb..59f75f17ad 100644 --- a/packages/metro/src/lib/JsonReporter.js +++ b/packages/metro/src/lib/JsonReporter.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {Writable} from 'stream'; export type SerializedError = { @@ -32,7 +30,7 @@ export type SerializedEvent = TEvent extends { } : TEvent; -class JsonReporter { +export default class JsonReporter { _stream: Writable; constructor(stream: Writable) { @@ -82,5 +80,3 @@ function serializeError( } return serialized; } - -module.exports = JsonReporter; diff --git a/packages/metro/src/lib/RamBundleParser.js b/packages/metro/src/lib/RamBundleParser.js index d83e9c13dc..0af6db2eb3 100644 --- a/packages/metro/src/lib/RamBundleParser.js +++ b/packages/metro/src/lib/RamBundleParser.js @@ -8,9 +8,7 @@ * @flow strict */ -'use strict'; - -const MAGIC_NUMBER = require('../shared/output/RamBundle/magic-number'); +import MAGIC_NUMBER from '../shared/output/RamBundle/magic-number'; const SIZEOF_UINT32 = 4; const HEADER_SIZE = 3; @@ -24,7 +22,7 @@ const HEADER_SIZE = 3; * getStartupCode(): returns the runtime and the startup code of the bundle. * getModule(): returns the code for the specified module. */ -class RamBundleParser { +export default class RamBundleParser { _buffer: Buffer; _numModules: number; _startupCodeLength: number; @@ -66,5 +64,3 @@ class RamBundleParser { return this._buffer.toString('utf8', start, end); } } - -module.exports = RamBundleParser; diff --git a/packages/metro/src/lib/TerminalReporter.js b/packages/metro/src/lib/TerminalReporter.js index fe0a24107c..09c325b385 100644 --- a/packages/metro/src/lib/TerminalReporter.js +++ b/packages/metro/src/lib/TerminalReporter.js @@ -9,18 +9,16 @@ * @oncall react_native */ -'use strict'; - import type {BundleDetails, ReportableEvent} from './reporting'; import type {Terminal} from 'metro-core'; import type {HealthCheckResult, WatcherStatus} from 'metro-file-map'; -const logToConsole = require('./logToConsole'); -const reporting = require('./reporting'); -const chalk = require('chalk'); -const throttle = require('lodash.throttle'); -const {AmbiguousModuleResolutionError} = require('metro-core'); -const path = require('path'); +import logToConsole from './logToConsole'; +import * as reporting from './reporting'; +import chalk from 'chalk'; +import throttle from 'lodash.throttle'; +import {AmbiguousModuleResolutionError} from 'metro-core'; +import path from 'path'; type BundleProgress = { bundleDetails: BundleDetails, @@ -72,7 +70,7 @@ const MAX_PROGRESS_BAR_CHAR_WIDTH = 16; * We try to print useful information to the terminal for interactive builds. * This implements the `Reporter` interface from the './reporting' module. */ -class TerminalReporter { +export default class TerminalReporter { /** * The bundle builds for which we are actively maintaining the status on the * terminal, ie. showing a progress bar. There can be several bundles being @@ -274,6 +272,7 @@ class TerminalReporter { break; case 'dep_graph_loading': const color = event.hasReducedPerformance ? chalk.red : chalk.blue; + // eslint-disable-next-line import/no-commonjs const version = 'v' + require('../../package.json').version; this.terminal.log( color.bold( @@ -543,5 +542,3 @@ class TerminalReporter { this.terminal.status(this._getStatusMessage()); } } - -module.exports = TerminalReporter; diff --git a/packages/metro/src/lib/__mocks__/GlobalTransformCache.js b/packages/metro/src/lib/__mocks__/GlobalTransformCache.js index 9ccde94e57..71d13c9bc4 100644 --- a/packages/metro/src/lib/__mocks__/GlobalTransformCache.js +++ b/packages/metro/src/lib/__mocks__/GlobalTransformCache.js @@ -15,4 +15,4 @@ function get(): null { return null; } -module.exports = {get}; +export {get}; diff --git a/packages/metro/src/lib/__mocks__/declareOpts.js b/packages/metro/src/lib/__mocks__/declareOpts.js index fe512a5d4e..6ea41aa844 100644 --- a/packages/metro/src/lib/__mocks__/declareOpts.js +++ b/packages/metro/src/lib/__mocks__/declareOpts.js @@ -10,7 +10,7 @@ 'use strict'; -module.exports = function (declared: Object): (opts: any) => any { +export default function (declared: Object): (opts: any) => any { return function (opts: Object) { for (var p in declared) { if (opts[p] == null && declared[p].default != null) { @@ -19,4 +19,4 @@ module.exports = function (declared: Object): (opts: any) => any { } return opts; }; -}; +} diff --git a/packages/metro/src/lib/__mocks__/getAbsolutePath.js b/packages/metro/src/lib/__mocks__/getAbsolutePath.js index cfa83521fb..d034626ab1 100644 --- a/packages/metro/src/lib/__mocks__/getAbsolutePath.js +++ b/packages/metro/src/lib/__mocks__/getAbsolutePath.js @@ -13,5 +13,5 @@ const path = require('path'); -module.exports = (file: string, roots: $ReadOnlyArray): string => +export default (file: string, roots: $ReadOnlyArray): string => path.resolve(roots[0], file); diff --git a/packages/metro/src/lib/__tests__/BatchProcessor-test.js b/packages/metro/src/lib/__tests__/BatchProcessor-test.js index d56a7b405f..5fd1e3a49d 100644 --- a/packages/metro/src/lib/__tests__/BatchProcessor-test.js +++ b/packages/metro/src/lib/__tests__/BatchProcessor-test.js @@ -13,7 +13,7 @@ jest.useRealTimers(); -const BatchProcessor = require('../BatchProcessor'); +import BatchProcessor from '../BatchProcessor'; describe('BatchProcessor', () => { const options = { diff --git a/packages/metro/src/lib/__tests__/bundleToString-test.js b/packages/metro/src/lib/__tests__/bundleToString-test.js index 2bf33a3c6e..ccd4101d61 100644 --- a/packages/metro/src/lib/__tests__/bundleToString-test.js +++ b/packages/metro/src/lib/__tests__/bundleToString-test.js @@ -8,9 +8,7 @@ * @oncall react_native */ -'use strict'; - -const bundleToString = require('../bundleToString'); +import bundleToString from '../bundleToString'; describe('bundleToString', () => { test('serializes a bundle into a plain JS bundle', () => { diff --git a/packages/metro/src/lib/__tests__/debounceAsyncQueue-test.js b/packages/metro/src/lib/__tests__/debounceAsyncQueue-test.js index 5322d4f3ea..6a286be460 100644 --- a/packages/metro/src/lib/__tests__/debounceAsyncQueue-test.js +++ b/packages/metro/src/lib/__tests__/debounceAsyncQueue-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const debounceAsyncQueue = require('../debounceAsyncQueue'); +import debounceAsyncQueue from '../debounceAsyncQueue'; describe('debounceAsyncQueue', () => { test('debounces calls', async () => { diff --git a/packages/metro/src/lib/__tests__/getGraphId-test.js b/packages/metro/src/lib/__tests__/getGraphId-test.js index 7ef151176e..ac0a8a21cd 100644 --- a/packages/metro/src/lib/__tests__/getGraphId-test.js +++ b/packages/metro/src/lib/__tests__/getGraphId-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const getGraphId = require('../getGraphId'); +import getGraphId from '../getGraphId'; describe('getGraphId', () => { test('generates a unique id from entry file', () => { diff --git a/packages/metro/src/lib/__tests__/getMaxWorkers-test.js b/packages/metro/src/lib/__tests__/getMaxWorkers-test.js index 6c46d95edb..e4fca50c7a 100644 --- a/packages/metro/src/lib/__tests__/getMaxWorkers-test.js +++ b/packages/metro/src/lib/__tests__/getMaxWorkers-test.js @@ -13,7 +13,8 @@ jest.mock('os'); -const getMaxWorkers = require('../getMaxWorkers'); +import getMaxWorkers from '../getMaxWorkers'; + const os = require('os'); test('calculates the number of max workers', () => { diff --git a/packages/metro/src/lib/__tests__/getPreludeCode-test.js b/packages/metro/src/lib/__tests__/getPreludeCode-test.js index f6551d8fb9..b3f8c09bc7 100644 --- a/packages/metro/src/lib/__tests__/getPreludeCode-test.js +++ b/packages/metro/src/lib/__tests__/getPreludeCode-test.js @@ -9,9 +9,8 @@ * @oncall react_native */ -'use strict'; +import getPreludeCode from '../getPreludeCode'; -const getPreludeCode = require('../getPreludeCode'); const vm = require('vm'); ['development', 'production'].forEach((mode: string) => { diff --git a/packages/metro/src/lib/__tests__/logToConsole-test.js b/packages/metro/src/lib/__tests__/logToConsole-test.js index f59929a60f..c410c52627 100644 --- a/packages/metro/src/lib/__tests__/logToConsole-test.js +++ b/packages/metro/src/lib/__tests__/logToConsole-test.js @@ -27,7 +27,7 @@ let log; beforeEach(() => { jest.resetModules(); - log = require('../logToConsole'); + log = require('../logToConsole').default; console.log = jest.fn(); }); diff --git a/packages/metro/src/lib/__tests__/parseCustomResolverOptions-test.js b/packages/metro/src/lib/__tests__/parseCustomResolverOptions-test.js index b0b65ae827..de970a7e9b 100644 --- a/packages/metro/src/lib/__tests__/parseCustomResolverOptions-test.js +++ b/packages/metro/src/lib/__tests__/parseCustomResolverOptions-test.js @@ -9,9 +9,8 @@ * @oncall react_native */ -'use strict'; +import parseCustomResolverOptions from '../parseCustomResolverOptions'; -const parseCustomResolverOptions = require('../parseCustomResolverOptions'); const url = require('url'); test('should parse some custom options from a http url', () => { diff --git a/packages/metro/src/lib/__tests__/parseCustomTransformOptions-test.js b/packages/metro/src/lib/__tests__/parseCustomTransformOptions-test.js index 056ee9850c..4ea629dc72 100644 --- a/packages/metro/src/lib/__tests__/parseCustomTransformOptions-test.js +++ b/packages/metro/src/lib/__tests__/parseCustomTransformOptions-test.js @@ -9,9 +9,8 @@ * @oncall react_native */ -'use strict'; +import parseCustomTransformOptions from '../parseCustomTransformOptions'; -const parseCustomTransformOptions = require('../parseCustomTransformOptions'); const url = require('url'); test('should parse some custom options from a http url', () => { diff --git a/packages/metro/src/lib/__tests__/parseOptionsFromUrl-test.js b/packages/metro/src/lib/__tests__/parseOptionsFromUrl-test.js index ea6c8f6ebd..acef9778d7 100644 --- a/packages/metro/src/lib/__tests__/parseOptionsFromUrl-test.js +++ b/packages/metro/src/lib/__tests__/parseOptionsFromUrl-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const parseOptionsFromUrl = require('../parseOptionsFromUrl'); +import parseOptionsFromUrl from '../parseOptionsFromUrl'; describe('parseOptionsFromUrl', () => { test.each([['map'], ['bundle']])('detects %s requests', type => { diff --git a/packages/metro/src/lib/bundleToString.js b/packages/metro/src/lib/bundleToString.js index 268d9ba23d..fe4a3eff80 100644 --- a/packages/metro/src/lib/bundleToString.js +++ b/packages/metro/src/lib/bundleToString.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {Bundle, BundleMetadata} from 'metro-runtime/src/modules/types'; /** * Serializes a bundle into a plain JS bundle. */ -function bundleToString(bundle: Bundle): { +export default function bundleToString(bundle: Bundle): { +code: string, +metadata: BundleMetadata, } { @@ -47,5 +45,3 @@ function bundleToString(bundle: Bundle): { metadata: {pre: bundle.pre.length, post: bundle.post.length, modules}, }; } - -module.exports = bundleToString; diff --git a/packages/metro/src/lib/countLines.js b/packages/metro/src/lib/countLines.js index 38175489c6..56ccbf9df1 100644 --- a/packages/metro/src/lib/countLines.js +++ b/packages/metro/src/lib/countLines.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - const newline = /\r\n?|\n|\u2028|\u2029/g; const countLines = (string: string): number => (string.match(newline) || []).length + 1; -module.exports = countLines; +export default countLines; diff --git a/packages/metro/src/lib/createModuleIdFactory.js b/packages/metro/src/lib/createModuleIdFactory.js index 24e964fe04..bd15cf1686 100644 --- a/packages/metro/src/lib/createModuleIdFactory.js +++ b/packages/metro/src/lib/createModuleIdFactory.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -function createModuleIdFactory(): (path: string) => number { +export default function createModuleIdFactory(): (path: string) => number { const fileToIdMap: Map = new Map(); let nextId = 0; return (path: string) => { @@ -23,5 +21,3 @@ function createModuleIdFactory(): (path: string) => number { return id; }; } - -module.exports = createModuleIdFactory; diff --git a/packages/metro/src/lib/createWebsocketServer.js b/packages/metro/src/lib/createWebsocketServer.js index b5291ddbd0..a9076dfa50 100644 --- a/packages/metro/src/lib/createWebsocketServer.js +++ b/packages/metro/src/lib/createWebsocketServer.js @@ -41,7 +41,7 @@ type HMROptions = { * - onClientDisconnect */ -module.exports = function createWebsocketServer({ +export default function createWebsocketServer({ websocketServer, }: HMROptions): ws.Server { const wss = new ws.Server({ @@ -84,4 +84,4 @@ module.exports = function createWebsocketServer({ }); return wss; -}; +} diff --git a/packages/metro/src/lib/debounceAsyncQueue.js b/packages/metro/src/lib/debounceAsyncQueue.js index bc7934672c..fad7cc1aa8 100644 --- a/packages/metro/src/lib/debounceAsyncQueue.js +++ b/packages/metro/src/lib/debounceAsyncQueue.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; - // Debounces calls with the given delay, and queues the next call while the // previous one hasn't completed so that no two calls can execute concurrently. -function debounceAsyncQueue( +export default function debounceAsyncQueue( fn: () => Promise, delay: number, ): () => Promise { @@ -51,5 +49,3 @@ function debounceAsyncQueue( } }); } - -module.exports = debounceAsyncQueue; diff --git a/packages/metro/src/lib/formatBundlingError.js b/packages/metro/src/lib/formatBundlingError.js index 261a33e69f..d0cd3d92dc 100644 --- a/packages/metro/src/lib/formatBundlingError.js +++ b/packages/metro/src/lib/formatBundlingError.js @@ -8,21 +8,17 @@ * @flow */ -'use strict'; - import type {FormattedError} from 'metro-runtime/src/modules/types'; -const GraphNotFoundError = require('../IncrementalBundler/GraphNotFoundError'); -const ResourceNotFoundError = require('../IncrementalBundler/ResourceNotFoundError'); -const RevisionNotFoundError = require('../IncrementalBundler/RevisionNotFoundError'); -const { - UnableToResolveError, -} = require('../node-haste/DependencyGraph/ModuleResolution'); -const {codeFrameColumns} = require('@babel/code-frame'); -const ErrorStackParser = require('error-stack-parser'); -const fs = require('fs'); -const {AmbiguousModuleResolutionError} = require('metro-core'); -const serializeError = require('serialize-error'); +import GraphNotFoundError from '../IncrementalBundler/GraphNotFoundError'; +import ResourceNotFoundError from '../IncrementalBundler/ResourceNotFoundError'; +import RevisionNotFoundError from '../IncrementalBundler/RevisionNotFoundError'; +import {UnableToResolveError} from '../node-haste/DependencyGraph/ModuleResolution'; +import {codeFrameColumns} from '@babel/code-frame'; +import ErrorStackParser from 'error-stack-parser'; +import fs from 'fs'; +import {AmbiguousModuleResolutionError} from 'metro-core'; +import serializeError from 'serialize-error'; export type CustomError = Error & interface { @@ -37,7 +33,9 @@ export type CustomError = Error & }>, }; -function formatBundlingError(error: CustomError): FormattedError { +export default function formatBundlingError( + error: CustomError, +): FormattedError { if (error instanceof AmbiguousModuleResolutionError) { const he = error.hasteError; const message = @@ -120,5 +118,3 @@ function formatBundlingError(error: CustomError): FormattedError { }; } } - -module.exports = formatBundlingError; diff --git a/packages/metro/src/lib/getAppendScripts.js b/packages/metro/src/lib/getAppendScripts.js index 2038994bc2..9eae15f1b9 100644 --- a/packages/metro/src/lib/getAppendScripts.js +++ b/packages/metro/src/lib/getAppendScripts.js @@ -9,18 +9,14 @@ * @oncall react_native */ -'use strict'; import type {Module} from '../DeltaBundler'; import type {Dependency} from '../DeltaBundler/types'; +import getInlineSourceMappingURL from '../DeltaBundler/Serializers/helpers/getInlineSourceMappingURL'; +import {sourceMapString} from '../DeltaBundler/Serializers/sourceMapString'; import CountingSet from './CountingSet'; - -const getInlineSourceMappingURL = require('../DeltaBundler/Serializers/helpers/getInlineSourceMappingURL'); -const { - sourceMapString, -} = require('../DeltaBundler/Serializers/sourceMapString'); -const countLines = require('./countLines'); -const nullthrows = require('nullthrows'); +import countLines from './countLines'; +import nullthrows from 'nullthrows'; type Options = $ReadOnly<{ asyncRequireModulePath: string, @@ -36,7 +32,7 @@ type Options = $ReadOnly<{ ... }>; -function getAppendScripts( +export default function getAppendScripts( entryPoint: string, modules: $ReadOnlyArray>, options: Options, @@ -124,5 +120,3 @@ function getAppendScripts( return output; } - -module.exports = getAppendScripts; diff --git a/packages/metro/src/lib/getGraphId.js b/packages/metro/src/lib/getGraphId.js index 65d76d4231..49916d08a2 100644 --- a/packages/metro/src/lib/getGraphId.js +++ b/packages/metro/src/lib/getGraphId.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {TransformInputOptions} from '../DeltaBundler/types'; import type {ResolverInputOptions} from '../shared/types'; -const canonicalize = require('metro-core/private/canonicalize'); +import canonicalize from 'metro-core/private/canonicalize'; export opaque type GraphId: string = string; -function getGraphId( +export default function getGraphId( entryFile: string, options: TransformInputOptions, { @@ -56,5 +54,3 @@ function getGraphId( canonicalize, ); } - -module.exports = getGraphId; diff --git a/packages/metro/src/lib/getMaxWorkers.js b/packages/metro/src/lib/getMaxWorkers.js index 3b75786a94..59320ae3fb 100644 --- a/packages/metro/src/lib/getMaxWorkers.js +++ b/packages/metro/src/lib/getMaxWorkers.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; +import os from 'os'; -const os = require('os'); - -module.exports = (workers: ?number): number => { +export default (workers: ?number): number => { // $FlowFixMe[prop-missing] Missing Flow lib def for availableParallelism const cores = os.availableParallelism(); return typeof workers === 'number' && Number.isInteger(workers) diff --git a/packages/metro/src/lib/getPreludeCode.js b/packages/metro/src/lib/getPreludeCode.js index f1dcecee66..3b2d2c2027 100644 --- a/packages/metro/src/lib/getPreludeCode.js +++ b/packages/metro/src/lib/getPreludeCode.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -function getPreludeCode({ +export default function getPreludeCode({ extraVars, isDev, globalPrefix, @@ -69,5 +67,3 @@ function processEnv(nodeEnv: string): string { nodeEnv, )};`; } - -module.exports = getPreludeCode; diff --git a/packages/metro/src/lib/getPrependedScripts.js b/packages/metro/src/lib/getPrependedScripts.js index 2c8836c29b..42c3b2f03f 100644 --- a/packages/metro/src/lib/getPrependedScripts.js +++ b/packages/metro/src/lib/getPrependedScripts.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type Bundler from '../Bundler'; import type DeltaBundler, {Module} from '../DeltaBundler'; import type {TransformInputOptions} from '../DeltaBundler/types'; @@ -18,13 +16,12 @@ import type {ResolverInputOptions} from '../shared/types'; import type {ConfigT} from 'metro-config'; import CountingSet from './CountingSet'; +import countLines from './countLines'; +import getPreludeCode from './getPreludeCode'; +import * as transformHelpers from './transformHelpers'; +import * as defaults from 'metro-config/private/defaults/defaults'; -const countLines = require('./countLines'); -const getPreludeCode = require('./getPreludeCode'); -const transformHelpers = require('./transformHelpers'); -const defaults = require('metro-config/private/defaults/defaults'); - -async function getPrependedScripts( +export default async function getPrependedScripts( config: ConfigT, options: Omit, resolverOptions: ResolverInputOptions, @@ -115,5 +112,3 @@ function _getPrelude({ ], }; } - -module.exports = getPrependedScripts; diff --git a/packages/metro/src/lib/logToConsole.js b/packages/metro/src/lib/logToConsole.js index 68df433c73..f8853d3970 100644 --- a/packages/metro/src/lib/logToConsole.js +++ b/packages/metro/src/lib/logToConsole.js @@ -10,17 +10,15 @@ /* eslint-disable no-console */ -'use strict'; - import type {Terminal} from 'metro-core'; -const chalk = require('chalk'); -const util = require('util'); +import chalk from 'chalk'; +import util from 'util'; const groupStack = []; let collapsedGuardTimer; -module.exports = (terminal: Terminal, level: string, ...data: Array) => { +export default (terminal: Terminal, level: string, ...data: Array) => { // $FlowFixMe[invalid-computed-prop] const logFunction = console[level] && level !== 'trace' ? level : 'log'; const color = diff --git a/packages/metro/src/lib/parseCustomResolverOptions.js b/packages/metro/src/lib/parseCustomResolverOptions.js index 1012c48692..6515bd4597 100644 --- a/packages/metro/src/lib/parseCustomResolverOptions.js +++ b/packages/metro/src/lib/parseCustomResolverOptions.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {CustomResolverOptions} from '../../../metro-resolver/src/types'; -const nullthrows = require('nullthrows'); +import nullthrows from 'nullthrows'; const PREFIX = 'resolver.'; -module.exports = function parseCustomResolverOptions(urlObj: { +export default function parseCustomResolverOptions(urlObj: { +query?: {[string]: string, ...}, ... }): CustomResolverOptions { @@ -35,4 +33,4 @@ module.exports = function parseCustomResolverOptions(urlObj: { }); return customResolverOptions; -}; +} diff --git a/packages/metro/src/lib/parseCustomTransformOptions.js b/packages/metro/src/lib/parseCustomTransformOptions.js index b327ac2190..629a679473 100644 --- a/packages/metro/src/lib/parseCustomTransformOptions.js +++ b/packages/metro/src/lib/parseCustomTransformOptions.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {CustomTransformOptions} from 'metro-transform-worker'; -const nullthrows = require('nullthrows'); +import nullthrows from 'nullthrows'; const PREFIX = 'transform.'; -module.exports = function parseCustomTransformOptions(urlObj: { +export default function parseCustomTransformOptions(urlObj: { +query?: {[string]: string, ...}, ... }): CustomTransformOptions { @@ -32,4 +30,4 @@ module.exports = function parseCustomTransformOptions(urlObj: { }); return customTransformOptions; -}; +} diff --git a/packages/metro/src/lib/parseJsonBody.js b/packages/metro/src/lib/parseJsonBody.js index 26447d3d0a..3bb734fb8c 100644 --- a/packages/metro/src/lib/parseJsonBody.js +++ b/packages/metro/src/lib/parseJsonBody.js @@ -17,7 +17,7 @@ const SIZE_LIMIT = 100 * 1024 * 1024; // 100MB /** * Attempt to parse a request body as JSON. */ -function parseJsonBody( +export default function parseJsonBody( req: IncomingMessage, options: {strict?: boolean} = {}, ): Promise<$FlowFixMe> { @@ -56,5 +56,3 @@ function parseJsonBody( }); }); } - -module.exports = parseJsonBody; diff --git a/packages/metro/src/lib/parseOptionsFromUrl.js b/packages/metro/src/lib/parseOptionsFromUrl.js index 22e2ac19d6..443e561d0c 100644 --- a/packages/metro/src/lib/parseOptionsFromUrl.js +++ b/packages/metro/src/lib/parseOptionsFromUrl.js @@ -9,20 +9,17 @@ * @oncall react_native */ -'use strict'; - import type {BundleOptions} from '../shared/types'; import type {TransformProfile} from 'metro-babel-transformer'; +import parsePlatformFilePath from '../node-haste/lib/parsePlatformFilePath'; import {SourcePathsMode} from '../shared/types'; - -const parsePlatformFilePath = require('../node-haste/lib/parsePlatformFilePath'); -const parseCustomResolverOptions = require('./parseCustomResolverOptions'); -const parseCustomTransformOptions = require('./parseCustomTransformOptions'); -const jscSafeUrl = require('jsc-safe-url'); -const nullthrows = require('nullthrows'); -const path = require('path'); -const url = require('url'); +import parseCustomResolverOptions from './parseCustomResolverOptions'; +import parseCustomTransformOptions from './parseCustomTransformOptions'; +import * as jscSafeUrl from 'jsc-safe-url'; +import nullthrows from 'nullthrows'; +import path from 'path'; +import url from 'url'; const getBoolean = ( query: $ReadOnly<{[opt: string]: string}>, @@ -41,7 +38,7 @@ const getTransformProfile = (transformProfile: string): TransformProfile => ? transformProfile : 'default'; -module.exports = function parseOptionsFromUrl( +export default function parseOptionsFromUrl( normalizedRequestUrl: string, platforms: Set, ): { @@ -94,4 +91,4 @@ module.exports = function parseOptionsFromUrl( query.unstable_transformProfile, ), }; -}; +} diff --git a/packages/metro/src/lib/relativizeSourceMap.js b/packages/metro/src/lib/relativizeSourceMap.js index 2edc28f144..9d5bdf1696 100644 --- a/packages/metro/src/lib/relativizeSourceMap.js +++ b/packages/metro/src/lib/relativizeSourceMap.js @@ -9,13 +9,11 @@ * @oncall react_native */ -'use strict'; - import type {MixedSourceMap} from 'metro-source-map'; -const path = require('path'); +import path from 'path'; -function relativizeSourceMapInline( +export default function relativizeSourceMapInline( sourceMap: MixedSourceMap, sourcesRoot: string, ): void { @@ -30,5 +28,3 @@ function relativizeSourceMapInline( } } } - -module.exports = relativizeSourceMapInline; diff --git a/packages/metro/src/lib/reporting.js b/packages/metro/src/lib/reporting.js index fc16b66e68..1b690d7741 100644 --- a/packages/metro/src/lib/reporting.js +++ b/packages/metro/src/lib/reporting.js @@ -9,15 +9,13 @@ * @oncall react_native */ -'use strict'; - import type {Terminal} from 'metro-core'; import type {HealthCheckResult, WatcherStatus} from 'metro-file-map'; import type {CustomResolverOptions} from 'metro-resolver'; import type {CustomTransformOptions} from 'metro-transform-worker'; -const chalk = require('chalk'); -const util = require('util'); +import chalk from 'chalk'; +import util from 'util'; export type BundleDetails = { bundleType: string, @@ -186,7 +184,7 @@ export type Reporter = interface {update(event: ReportableEvent): void}; * calling this, add a new type of ReportableEvent instead, and implement a * proper handler in the reporter(s). */ -function logWarning( +export function logWarning( terminal: Terminal, format: string, ...args: Array @@ -198,7 +196,7 @@ function logWarning( /** * Similar to `logWarning`, but for messages that require the user to act. */ -function logError( +export function logError( terminal: Terminal, format: string, ...args: Array @@ -220,7 +218,7 @@ function logError( /** * Similar to `logWarning`, but for informational messages. */ -function logInfo( +export function logInfo( terminal: Terminal, format: string, ...args: Array @@ -233,11 +231,4 @@ function logInfo( * A reporter that does nothing. Errors and warnings will be swallowed, that * is generally not what you want. */ -const nullReporter = {update(): void {}}; - -module.exports = { - logWarning, - logError, - logInfo, - nullReporter, -}; +export const nullReporter = {update(): void {}}; diff --git a/packages/metro/src/lib/splitBundleOptions.js b/packages/metro/src/lib/splitBundleOptions.js index 81c51ee281..b52dab95f8 100644 --- a/packages/metro/src/lib/splitBundleOptions.js +++ b/packages/metro/src/lib/splitBundleOptions.js @@ -9,14 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {BundleOptions, SplitBundleOptions} from '../shared/types'; /** * Splits a BundleOptions object into smaller, more manageable parts. */ -function splitBundleOptions(options: BundleOptions): SplitBundleOptions { +export default function splitBundleOptions( + options: BundleOptions, +): SplitBundleOptions { return { entryFile: options.entryFile, resolverOptions: { @@ -48,5 +48,3 @@ function splitBundleOptions(options: BundleOptions): SplitBundleOptions { onProgress: options.onProgress, }; } - -module.exports = splitBundleOptions; diff --git a/packages/metro/src/lib/transformHelpers.js b/packages/metro/src/lib/transformHelpers.js index 28d6c07006..8a432e2b7c 100644 --- a/packages/metro/src/lib/transformHelpers.js +++ b/packages/metro/src/lib/transformHelpers.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type Bundler from '../Bundler'; import type DeltaBundler, {TransformFn} from '../DeltaBundler'; import type { @@ -138,7 +136,7 @@ function removeInlineRequiresBlockListFromOptions( return inlineRequires; } -async function getTransformFn( +export async function getTransformFn( entryFiles: $ReadOnlyArray, bundler: Bundler, deltaBundler: DeltaBundler<>, @@ -213,7 +211,7 @@ function getType( return 'module'; } -async function getResolveDependencyFn( +export async function getResolveDependencyFn( bundler: Bundler, platform: ?string, resolverOptions: ResolverInputOptions, @@ -230,8 +228,3 @@ async function getResolveDependencyFn( resolverOptions, ); } - -module.exports = { - getTransformFn, - getResolveDependencyFn, -}; diff --git a/packages/metro/src/node-haste/DependencyGraph.js b/packages/metro/src/node-haste/DependencyGraph.js index 2fa82cd95f..c905dc9140 100644 --- a/packages/metro/src/node-haste/DependencyGraph.js +++ b/packages/metro/src/node-haste/DependencyGraph.js @@ -25,22 +25,23 @@ import type MetroFileMap, { } from 'metro-file-map'; import type {FileSystemLookup} from 'metro-resolver'; +import createFileMap from './DependencyGraph/createFileMap'; +import {ModuleResolver} from './DependencyGraph/ModuleResolution'; import {PackageCache} from './PackageCache'; -import {DuplicateHasteCandidatesError} from 'metro-file-map'; - -const createFileMap = require('./DependencyGraph/createFileMap'); -const {ModuleResolver} = require('./DependencyGraph/ModuleResolution'); -const {EventEmitter} = require('events'); -const fs = require('fs'); -const { +import EventEmitter from 'events'; +import fs from 'fs'; +import { AmbiguousModuleResolutionError, - Logger: {createActionStartEntry, createActionEndEntry, log}, + Logger, PackageResolutionError, -} = require('metro-core'); -const canonicalize = require('metro-core/private/canonicalize'); -const {InvalidPackageError} = require('metro-resolver'); -const nullthrows = require('nullthrows'); -const path = require('path'); +} from 'metro-core'; +import canonicalize from 'metro-core/private/canonicalize'; +import {DuplicateHasteCandidatesError} from 'metro-file-map'; +import {InvalidPackageError} from 'metro-resolver'; +import nullthrows from 'nullthrows'; +import path from 'path'; + +const {createActionStartEntry, createActionEndEntry, log} = Logger; const NULL_PLATFORM = Symbol(); @@ -56,7 +57,7 @@ function getOrCreateMap( return subMap; } -class DependencyGraph extends EventEmitter { +export default class DependencyGraph extends EventEmitter { _config: ConfigT; _haste: MetroFileMap; _fileSystem: FileSystem; @@ -393,5 +394,3 @@ class DependencyGraph extends EventEmitter { return nullthrows(this._fileSystem.getDependencies(filePath)); } } - -module.exports = DependencyGraph; diff --git a/packages/metro/src/node-haste/DependencyGraph/ModuleResolution.js b/packages/metro/src/node-haste/DependencyGraph/ModuleResolution.js index 268b08ff1e..8f354fce06 100644 --- a/packages/metro/src/node-haste/DependencyGraph/ModuleResolution.js +++ b/packages/metro/src/node-haste/DependencyGraph/ModuleResolution.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type { BundlerResolution, TransformResultDependency, @@ -27,13 +25,13 @@ import type { } from 'metro-resolver'; import type {PackageForModule, PackageJson} from 'metro-resolver/private/types'; -const {codeFrameColumns} = require('@babel/code-frame'); -const fs = require('fs'); -const invariant = require('invariant'); -const Resolver = require('metro-resolver'); -const createDefaultContext = require('metro-resolver/private/createDefaultContext'); -const path = require('path'); -const util = require('util'); +import {codeFrameColumns} from '@babel/code-frame'; +import fs from 'fs'; +import invariant from 'invariant'; +import * as Resolver from 'metro-resolver'; +import createDefaultContext from 'metro-resolver/private/createDefaultContext'; +import path from 'path'; +import util from 'util'; export type DirExistsFn = (filePath: string) => boolean; @@ -84,7 +82,7 @@ type Options = $ReadOnly<{ unstable_enablePackageExports: boolean, }>; -class ModuleResolver { +export class ModuleResolver { _options: Options; // A module representing the project root, used as the origin when resolving `emptyModulePath`. _projectRootFakeModulePath: string; @@ -320,7 +318,7 @@ function getArrayLowestItem(a: $ReadOnlyArray): string | void { } // $FlowFixMe[incompatible-extend] -class UnableToResolveError extends Error { +export class UnableToResolveError extends Error { /** * File path of the module that tried to require a module, ex. `/js/foo.js`. */ @@ -482,8 +480,3 @@ function guessDependencyLocation( function isQuote(str: ?string): boolean { return str === '"' || str === "'" || str === '`'; } - -module.exports = { - ModuleResolver, - UnableToResolveError, -}; diff --git a/packages/metro/src/node-haste/DependencyGraph/createFileMap.js b/packages/metro/src/node-haste/DependencyGraph/createFileMap.js index 9c3fe200d1..cde3e4c933 100644 --- a/packages/metro/src/node-haste/DependencyGraph/createFileMap.js +++ b/packages/metro/src/node-haste/DependencyGraph/createFileMap.js @@ -11,10 +11,9 @@ import type {ConfigT} from 'metro-config'; +import ci from 'ci-info'; import MetroFileMap, {DiskCacheManager} from 'metro-file-map'; -const ci = require('ci-info'); - function getIgnorePattern(config: ConfigT): RegExp { // For now we support both options const {blockList, blacklistRE} = config.resolver; @@ -53,7 +52,7 @@ function getIgnorePattern(config: ConfigT): RegExp { return ignorePattern; } -function createFileMap( +export default function createFileMap( config: ConfigT, options?: $ReadOnly<{ extractDependencies?: boolean, @@ -114,5 +113,3 @@ function createFileMap( watchmanDeferStates: config.watcher.watchman.deferStates, }); } - -module.exports = createFileMap; diff --git a/packages/metro/src/node-haste/Package.js b/packages/metro/src/node-haste/Package.js index ab8e0efe96..ad906ee3f4 100644 --- a/packages/metro/src/node-haste/Package.js +++ b/packages/metro/src/node-haste/Package.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; - import type {PackageJson} from 'metro-resolver/private/types'; -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; -class Package { +export default class Package { path: string; _root: string; @@ -39,5 +37,3 @@ class Package { return this._content; } } - -module.exports = Package; diff --git a/packages/metro/src/node-haste/PackageCache.js b/packages/metro/src/node-haste/PackageCache.js index bb9666c0f4..74323a719b 100644 --- a/packages/metro/src/node-haste/PackageCache.js +++ b/packages/metro/src/node-haste/PackageCache.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const Package = require('./Package'); +import Package from './Package'; type GetClosestPackageFn = (absoluteFilePath: string) => ?{ packageJsonPath: string, diff --git a/packages/metro/src/node-haste/__mocks__/graceful-fs.js b/packages/metro/src/node-haste/__mocks__/graceful-fs.js index 93a6690417..c41ced118d 100644 --- a/packages/metro/src/node-haste/__mocks__/graceful-fs.js +++ b/packages/metro/src/node-haste/__mocks__/graceful-fs.js @@ -8,6 +8,4 @@ * @flow strict */ -'use strict'; - -module.exports = require('fs'); +export * from 'fs'; diff --git a/packages/metro/src/node-haste/lib/AssetPaths.js b/packages/metro/src/node-haste/lib/AssetPaths.js index def6ae72a6..c9963e53be 100644 --- a/packages/metro/src/node-haste/lib/AssetPaths.js +++ b/packages/metro/src/node-haste/lib/AssetPaths.js @@ -9,10 +9,8 @@ * @oncall react_native */ -'use strict'; - -const parsePlatformFilePath = require('./parsePlatformFilePath'); -const path = require('path'); +import parsePlatformFilePath from './parsePlatformFilePath'; +import path from 'path'; export type AssetPath = { assetName: string, @@ -47,7 +45,7 @@ function parseBaseName(baseName: string): { * Return `null` if the `filePath` doesn't have a valid extension, required * to describe the type of an asset. */ -function tryParse( +export function tryParse( filePath: string, platforms: $ReadOnlySet, ): ?AssetPath { @@ -66,12 +64,13 @@ function tryParse( }; } -function parse(filePath: string, platforms: $ReadOnlySet): AssetPath { +export function parse( + filePath: string, + platforms: $ReadOnlySet, +): AssetPath { const result = tryParse(filePath, platforms); if (result == null) { throw new Error(`invalid asset file path: ${filePath}`); } return result; } - -module.exports = {parse, tryParse}; diff --git a/packages/metro/src/node-haste/lib/__tests__/parsePlatformFilePath-test.js b/packages/metro/src/node-haste/lib/__tests__/parsePlatformFilePath-test.js index 0e8cb15b8b..b2dea13a68 100644 --- a/packages/metro/src/node-haste/lib/__tests__/parsePlatformFilePath-test.js +++ b/packages/metro/src/node-haste/lib/__tests__/parsePlatformFilePath-test.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -var parsePlatformFilePath = require('../parsePlatformFilePath'); +import parsePlatformFilePath from '../parsePlatformFilePath'; const TEST_PLATFORMS = new Set(['ios', 'android']); diff --git a/packages/metro/src/node-haste/lib/parsePlatformFilePath.js b/packages/metro/src/node-haste/lib/parsePlatformFilePath.js index 310965ce1a..6d0fefd2dd 100644 --- a/packages/metro/src/node-haste/lib/parsePlatformFilePath.js +++ b/packages/metro/src/node-haste/lib/parsePlatformFilePath.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const path = require('path'); +import path from 'path'; type PlatformFilePathParts = { dirPath: string, @@ -26,7 +24,7 @@ const PATH_RE = /^(.+?)(\.([^.]+))?\.([^.]+)$/; * Extract the components of a file path that can have a platform specifier: Ex. * `index.ios.js` is specific to the `ios` platform and has the extension `js`. */ -function parsePlatformFilePath( +export default function parsePlatformFilePath( filePath: string, platforms: $ReadOnlySet, ): PlatformFilePathParts { @@ -44,5 +42,3 @@ function parsePlatformFilePath( const baseName = `${match[1]}.${platform}`; return {dirPath, baseName, platform: null, extension}; } - -module.exports = parsePlatformFilePath; diff --git a/packages/metro/src/shared/output/RamBundle.js b/packages/metro/src/shared/output/RamBundle.js index ff57368c9f..d53db786fb 100644 --- a/packages/metro/src/shared/output/RamBundle.js +++ b/packages/metro/src/shared/output/RamBundle.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {RamBundleInfo} from '../../DeltaBundler/Serializers/getRamBundleInfo'; import type {OutputOptions, RequestOptions} from '../types'; -const Server = require('../../Server'); -const asAssets = require('./RamBundle/as-assets'); -const asIndexedFile = require('./RamBundle/as-indexed-file').save; +import Server from '../../Server'; +import asAssets from './RamBundle/as-assets'; +import {save as asIndexedFile} from './RamBundle/as-indexed-file'; -async function build( +export async function build( packagerClient: Server, requestOptions: RequestOptions, ): Promise { @@ -31,7 +29,7 @@ async function build( return await packagerClient.getRamBundleInfo(options); } -function save( +export function save( bundle: RamBundleInfo, options: OutputOptions, log: (x: string) => void, @@ -44,6 +42,4 @@ function save( : asIndexedFile(bundle, options, log); } -exports.build = build; -exports.save = save; -exports.formatName = 'bundle'; +export const formatName = 'bundle'; diff --git a/packages/metro/src/shared/output/RamBundle/as-assets.js b/packages/metro/src/shared/output/RamBundle/as-assets.js index 9979b46ca9..c85b1f2d3b 100644 --- a/packages/metro/src/shared/output/RamBundle/as-assets.js +++ b/packages/metro/src/shared/output/RamBundle/as-assets.js @@ -9,20 +9,19 @@ * @oncall react_native */ -'use strict'; - import type {RamBundleInfo} from '../../../DeltaBundler/Serializers/getRamBundleInfo'; import type {ModuleTransportLike} from '../../../shared/types'; import type {OutputOptions} from '../../types'; -const relativizeSourceMapInline = require('../../../lib/relativizeSourceMap'); -const writeFile = require('../writeFile'); -const buildSourcemapWithMetadata = require('./buildSourcemapWithMetadata'); -const MAGIC_RAM_BUNDLE_NUMBER = require('./magic-number'); -const {joinModules} = require('./util'); -const writeSourceMap = require('./write-sourcemap'); -const fsPromises = require('fs').promises; -const path = require('path'); +import relativizeSourceMapInline from '../../../lib/relativizeSourceMap'; +import writeFile from '../writeFile'; +import buildSourcemapWithMetadata from './buildSourcemapWithMetadata'; +import MAGIC_RAM_BUNDLE_NUMBER from './magic-number'; +import {joinModules} from './util'; +import writeSourceMap from './write-sourcemap'; +import {promises as fsPromises} from 'fs'; +import path from 'path'; + // must not start with a dot, as that won't go into the apk const MAGIC_RAM_BUNDLE_FILENAME = 'UNBUNDLE'; const MODULES_DIR = 'js-modules'; @@ -34,7 +33,7 @@ const MODULES_DIR = 'js-modules'; * All other modules go into a 'js-modules' folder that in the same parent * directory as the startup file. */ -function saveAsAssets( +export default function saveAsAssets( bundle: RamBundleInfo, options: OutputOptions, log: (...args: Array) => void, @@ -123,5 +122,3 @@ function writeMagicFlagFile(outputDir: string): Promise { buffer.writeUInt32LE(MAGIC_RAM_BUNDLE_NUMBER, 0); return writeFile(path.join(outputDir, MAGIC_RAM_BUNDLE_FILENAME), buffer); } - -module.exports = saveAsAssets; diff --git a/packages/metro/src/shared/output/RamBundle/as-indexed-file.js b/packages/metro/src/shared/output/RamBundle/as-indexed-file.js index 0e509a9f83..da67726e1b 100644 --- a/packages/metro/src/shared/output/RamBundle/as-indexed-file.js +++ b/packages/metro/src/shared/output/RamBundle/as-indexed-file.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {RamBundleInfo} from '../../../DeltaBundler/Serializers/getRamBundleInfo'; import type { ModuleGroups, @@ -19,12 +17,12 @@ import type { } from '../../types'; import type {WriteStream} from 'fs'; -const relativizeSourceMapInline = require('../../../lib/relativizeSourceMap'); -const buildSourcemapWithMetadata = require('./buildSourcemapWithMetadata'); -const MAGIC_UNBUNDLE_FILE_HEADER = require('./magic-number'); -const {joinModules} = require('./util'); -const writeSourceMap = require('./write-sourcemap'); -const fs = require('fs'); +import relativizeSourceMapInline from '../../../lib/relativizeSourceMap'; +import buildSourcemapWithMetadata from './buildSourcemapWithMetadata'; +import MAGIC_UNBUNDLE_FILE_HEADER from './magic-number'; +import {joinModules} from './util'; +import writeSourceMap from './write-sourcemap'; +import fs from 'fs'; const SIZEOF_UINT32 = 4; @@ -35,7 +33,7 @@ const SIZEOF_UINT32 = 4; * The module id for the startup code (prelude, polyfills etc.) is the * empty string. */ -function saveAsIndexedFile( +export function save( bundle: RamBundleInfo, options: OutputOptions, log: (...args: Array) => void, @@ -217,7 +215,7 @@ function buildModuleBuffers( ); } -function buildTableAndContents( +export function buildTableAndContents( startupCode: string, modules: $ReadOnlyArray, moduleGroups: ModuleGroups, @@ -242,7 +240,7 @@ function buildTableAndContents( ); } -function createModuleGroups( +export function createModuleGroups( groups: Map>, modules: $ReadOnlyArray, ): ModuleGroups { @@ -260,7 +258,3 @@ function* concat( yield* it; } } - -exports.save = saveAsIndexedFile; -exports.buildTableAndContents = buildTableAndContents; -exports.createModuleGroups = createModuleGroups; diff --git a/packages/metro/src/shared/output/RamBundle/buildSourcemapWithMetadata.js b/packages/metro/src/shared/output/RamBundle/buildSourcemapWithMetadata.js index a5b9aa130f..feee279c58 100644 --- a/packages/metro/src/shared/output/RamBundle/buildSourcemapWithMetadata.js +++ b/packages/metro/src/shared/output/RamBundle/buildSourcemapWithMetadata.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {ModuleGroups, ModuleTransportLike} from '../../types'; import type {IndexMap} from 'metro-source-map'; -const { +import { combineSourceMaps, combineSourceMapsAddingOffsets, joinModules, -} = require('./util'); +} from './util'; type Params = { fixWrapperOffset: boolean, @@ -27,7 +25,7 @@ type Params = { startupModules: $ReadOnlyArray, }; -module.exports = (({ +export default (({ fixWrapperOffset, lazyModules, moduleGroups, diff --git a/packages/metro/src/shared/output/RamBundle/magic-number.js b/packages/metro/src/shared/output/RamBundle/magic-number.js index c19a9dadd2..ec1322f739 100644 --- a/packages/metro/src/shared/output/RamBundle/magic-number.js +++ b/packages/metro/src/shared/output/RamBundle/magic-number.js @@ -9,6 +9,4 @@ * @oncall react_native */ -'use strict'; - -module.exports = 0xfb0bd1e5; +export default 0xfb0bd1e5; diff --git a/packages/metro/src/shared/output/RamBundle/util.js b/packages/metro/src/shared/output/RamBundle/util.js index ff71b6869d..5a0d821b06 100644 --- a/packages/metro/src/shared/output/RamBundle/util.js +++ b/packages/metro/src/shared/output/RamBundle/util.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type {ModuleGroups, ModuleTransportLike} from '../../types'; import type { BasicSourceMap, @@ -20,8 +18,7 @@ import type { } from 'metro-source-map'; import countLines from '../../../lib/countLines'; - -const invariant = require('invariant'); +import invariant from 'invariant'; function lineToLineSourceMap( source: string, @@ -140,7 +137,7 @@ function combineMaps( const joinModules = (modules: $ReadOnlyArray<{+code: string, ...}>): string => modules.map((m: {+code: string, ...}) => m.code).join('\n'); -module.exports = { +export { combineSourceMaps, combineSourceMapsAddingOffsets, countLines, diff --git a/packages/metro/src/shared/output/RamBundle/write-sourcemap.js b/packages/metro/src/shared/output/RamBundle/write-sourcemap.js index 2d6604f9bd..168905a0ca 100644 --- a/packages/metro/src/shared/output/RamBundle/write-sourcemap.js +++ b/packages/metro/src/shared/output/RamBundle/write-sourcemap.js @@ -9,11 +9,9 @@ * @oncall react_native */ -'use strict'; +import writeFile from '../writeFile'; -const writeFile = require('../writeFile'); - -function writeSourcemap( +export default function writeSourcemap( fileName: string, contents: string, log: (...args: Array) => void, @@ -27,5 +25,3 @@ function writeSourcemap( writeMap.then(() => log('Done writing sourcemap output')); return writeMap; } - -module.exports = writeSourcemap; diff --git a/packages/metro/src/shared/output/__tests__/meta-test.js b/packages/metro/src/shared/output/__tests__/meta-test.js index 48f09e16ba..b301c4a176 100644 --- a/packages/metro/src/shared/output/__tests__/meta-test.js +++ b/packages/metro/src/shared/output/__tests__/meta-test.js @@ -11,7 +11,7 @@ 'use strict'; -const meta = require('../meta'); +import meta from '../meta'; test('exports the block list creator', () => { expect(meta('some formatted code', 'utf8')).toMatchSnapshot(); diff --git a/packages/metro/src/shared/output/bundle.flow.js b/packages/metro/src/shared/output/bundle.flow.js index a9f77a8e30..00d4629dea 100644 --- a/packages/metro/src/shared/output/bundle.flow.js +++ b/packages/metro/src/shared/output/bundle.flow.js @@ -9,17 +9,15 @@ * @oncall react_native */ -'use strict'; - import type {AssetData} from '../../Assets'; import type {BuildOptions, OutputOptions, RequestOptions} from '../types'; import type {MixedSourceMap} from 'metro-source-map'; -const relativizeSourceMapInline = require('../../lib/relativizeSourceMap'); -const Server = require('../../Server'); -const writeFile = require('./writeFile'); +import relativizeSourceMapInline from '../../lib/relativizeSourceMap'; +import Server from '../../Server'; +import writeFile from './writeFile'; -function buildBundle( +export function build( packagerClient: Server, requestOptions: RequestOptions, buildOptions?: BuildOptions = {}, @@ -47,7 +45,7 @@ function relativateSerializedMap( return JSON.stringify(sourceMap); } -async function saveBundleAndMap( +export async function save( bundle: { code: string, map: string, @@ -90,6 +88,4 @@ async function saveBundleAndMap( await Promise.all(writeFns.map((cb: void => mixed) => cb())); } -exports.build = buildBundle; -exports.save = saveBundleAndMap; -exports.formatName = 'bundle'; +export const formatName = 'bundle'; diff --git a/packages/metro/src/shared/output/bundle.js b/packages/metro/src/shared/output/bundle.js index fd214f16cb..b4c2accf7d 100644 --- a/packages/metro/src/shared/output/bundle.js +++ b/packages/metro/src/shared/output/bundle.js @@ -9,6 +9,8 @@ * @oncall react_native */ +/* eslint-disable import/no-commonjs */ + 'use strict'; /*:: diff --git a/packages/metro/src/shared/output/meta.js b/packages/metro/src/shared/output/meta.js index a1dfa5f866..d30c3b01cf 100644 --- a/packages/metro/src/shared/output/meta.js +++ b/packages/metro/src/shared/output/meta.js @@ -9,9 +9,7 @@ * @oncall react_native */ -'use strict'; - -const crypto = require('crypto'); +import crypto from 'crypto'; const isUTF8 = (encoding: 'ascii' | 'utf16le' | 'utf8') => /^utf-?8$/i.test(encoding); @@ -25,7 +23,7 @@ const constantFor = (encoding: 'ascii' | 'utf16le' | 'utf8') => ? 3 : 0; -module.exports = function ( +export default function ( code: Buffer | string, encoding: 'ascii' | 'utf16le' | 'utf8' = 'utf8', ): Buffer { @@ -40,7 +38,7 @@ module.exports = function ( signature.length - 1, ); return signature; -}; +} function tryAsciiPromotion( buffer: Buffer, diff --git a/packages/metro/src/shared/output/unbundle.js b/packages/metro/src/shared/output/unbundle.js index 18a5a74078..1eb2bc1e97 100644 --- a/packages/metro/src/shared/output/unbundle.js +++ b/packages/metro/src/shared/output/unbundle.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - /* This is for retro-compatibility of React Native with older versions of * Metro. Use the `RamBundle` module directly. */ -module.exports = require('./RamBundle'); +export * from './RamBundle'; diff --git a/packages/metro/src/shared/output/writeFile.js b/packages/metro/src/shared/output/writeFile.js index 7b5ca7343c..5191710faa 100644 --- a/packages/metro/src/shared/output/writeFile.js +++ b/packages/metro/src/shared/output/writeFile.js @@ -9,14 +9,12 @@ * @oncall react_native */ -'use strict'; - -const fs = require('fs'); -const throat = require('throat'); +import fs from 'fs'; +import throat from 'throat'; const writeFile: typeof fs.promises.writeFile = throat( 128, fs.promises.writeFile, ); -module.exports = writeFile; +export default writeFile; diff --git a/packages/metro/src/shared/types.js b/packages/metro/src/shared/types.js index fc798abdcf..24b6eea36e 100644 --- a/packages/metro/src/shared/types.js +++ b/packages/metro/src/shared/types.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - import type { Options as DeltaBundlerOptions, TransformInputOptions, diff --git a/packages/ob1/src/__flowtests__/ob1-flowtest.js b/packages/ob1/src/__flowtests__/ob1-flowtest.js index d7e43241fa..054d0ad20a 100644 --- a/packages/ob1/src/__flowtests__/ob1-flowtest.js +++ b/packages/ob1/src/__flowtests__/ob1-flowtest.js @@ -9,16 +9,14 @@ * @oncall react_native */ -'use strict'; - import type {Number0, Number1} from '../ob1'; -const {add, add0, add1, get0, get1, inc, neg, sub, sub1} = require('../ob1'); +import {add, add0, add1, get0, get1, inc, neg, sub, sub1} from '../ob1'; const FORTY_TWO_0 = add0(42); const FORTY_TWO_1 = add1(42); -module.exports = { +export default { testSafeOps() { (add(FORTY_TWO_0, FORTY_TWO_0): Number0); (add(FORTY_TWO_0, FORTY_TWO_1): Number1); diff --git a/packages/ob1/src/ob1.js b/packages/ob1/src/ob1.js index e24c7a1747..84acc842d5 100644 --- a/packages/ob1/src/ob1.js +++ b/packages/ob1/src/ob1.js @@ -9,8 +9,6 @@ * @oncall react_native */ -'use strict'; - /* eslint-disable no-redeclare */ // A type representing 0-based offsets. @@ -27,7 +25,7 @@ declare function add(a: Number1, b: Number0): Number1; declare function add(a: Number0, b: Number1): Number1; declare function add(a: Number0, b: Number0): Number0; -function add(a: number, b: number): number { +export function add(a: number, b: number): number { return a + b; } @@ -40,41 +38,41 @@ declare function sub(a: Number1, b: Number0): Number1; declare function sub(a: Number0, b: Number0): Number0; declare function sub(a: Number1, b: Number1): Number0; -function sub(a: number, b: number): number { +export function sub(a: number, b: number): number { return a - b; } // Get the underlying number of a 0-based offset, casting away the opaque type. declare function get0(x: Number0): number; declare function get0(x: void | null): void | null; -function get0(x: number): number { +export function get0(x: number): number { return x; } // Get the underlying number of a 1-based offset, casting away the opaque type. declare function get1(x: Number1): number; declare function get1(x: void | null): void | null; -function get1(x: number): number { +export function get1(x: number): number { return x; } // Add 1 to a 0-based offset, thus converting it to 1-based. -function add1(x: Number0 | number): Number1 { +export function add1(x: Number0 | number): Number1 { return x + 1; } // Subtract 1 from a 1-based offset, thus converting it to 0-based. -function sub1(x: Number1): Number0 { +export function sub1(x: Number1): Number0 { return x - 1; } // Negate a 0-based offset. -function neg(x: Number0): Number0 { +export function neg(x: Number0): Number0 { return -x; } // Cast a number to a 0-based offset. -function add0(x: number): Number0 { +export function add0(x: number): Number0 { return x; } @@ -83,8 +81,6 @@ declare function inc(a: Number0): Number0; // Increment a 1-based offset. declare function inc(a: Number1): Number1; -function inc(x: number): number { +export function inc(x: number): number { return x + 1; } - -module.exports = {add, get0, get1, add1, sub1, sub, neg, add0, inc}; diff --git a/scripts/__tests__/subpackages-test.js b/scripts/__tests__/subpackages-test.js index e9a3e1f903..68445701d2 100644 --- a/scripts/__tests__/subpackages-test.js +++ b/scripts/__tests__/subpackages-test.js @@ -152,6 +152,8 @@ describe.each([...ALL_PACKAGES])('%s', packagePath => { const endOfHeader = content.indexOf('*/\n') + 3; expect(endOfHeader).toBeGreaterThan(3); expect(content.slice(endOfHeader)).toEqual(` +/* eslint-disable import/no-commonjs */ + 'use strict'; /*::