UNPKG

@parcel/core

Version:
234 lines (226 loc) • 11.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = resolveOptions; function _path() { const data = _interopRequireDefault(require("path")); _path = function () { return data; }; return data; } function _rust() { const data = require("@parcel/rust"); _rust = function () { return data; }; return data; } function _fs() { const data = require("@parcel/fs"); _fs = function () { return data; }; return data; } function _cache() { const data = require("@parcel/cache"); _cache = function () { return data; }; return data; } function _packageManager() { const data = require("@parcel/package-manager"); _packageManager = function () { return data; }; return data; } function _utils() { const data = require("@parcel/utils"); _utils = function () { return data; }; return data; } var _loadDotEnv = _interopRequireDefault(require("./loadDotEnv")); var _projectPath = require("./projectPath"); var _ParcelConfigRequest = require("./requests/ParcelConfigRequest"); function _featureFlags() { const data = require("@parcel/feature-flags"); _featureFlags = function () { return data; }; return data; } var _constants = require("./constants"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } // Default cache directory name const DEFAULT_CACHE_DIRNAME = '.parcel-cache'; const LOCK_FILE_NAMES = ['yarn.lock', 'package-lock.json', 'pnpm-lock.yaml']; // Generate a unique instanceId, will change on every run of parcel function generateInstanceId(entries) { return (0, _rust().hashString)(`${entries.join(',')}-${Date.now()}-${Math.round(Math.random() * 100)}`); } // Compiles an array of globs to regex - used for lazy include/excludes function compileGlobs(globs) { return globs.map(glob => (0, _utils().globToRegex)(glob)); } async function resolveOptions(initialOptions) { var _initialOptions$defau, _initialOptions$defau2, _initialOptions$defau3, _initialOptions$defau4, _initialOptions$addit, _initialOptions$defau5, _initialOptions$defau6, _initialOptions$defau7, _initialOptions$defau8, _initialOptions$defau9; let inputFS = initialOptions.inputFS || new (_fs().NodeFS)(); let outputFS = initialOptions.outputFS || new (_fs().NodeFS)(); let inputCwd = inputFS.cwd(); let outputCwd = outputFS.cwd(); let entries; if (initialOptions.entries == null || initialOptions.entries === '') { entries = []; } else if (Array.isArray(initialOptions.entries)) { entries = initialOptions.entries.map(entry => _path().default.resolve(inputCwd, entry)); } else { entries = [_path().default.resolve(inputCwd, initialOptions.entries)]; } let shouldMakeEntryReferFolder = false; if (entries.length === 1 && !(0, _utils().isGlob)(entries[0])) { let [entry] = entries; try { shouldMakeEntryReferFolder = (await inputFS.stat(entry)).isDirectory(); } catch { // ignore failing stat call } } // getRootDir treats the input as files, so getRootDir(["/home/user/myproject"]) returns "/home/user". // Instead we need to make the the entry refer to some file inside the specified folders if entries refers to the directory. let entryRoot = (0, _utils().getRootDir)(shouldMakeEntryReferFolder ? [_path().default.join(entries[0], 'index')] : entries); let projectRootFile = (await (0, _utils().resolveConfig)(inputFS, _path().default.join(entryRoot, 'index'), [...LOCK_FILE_NAMES, '.git', '.hg'], _path().default.parse(entryRoot).root)) || _path().default.join(inputCwd, 'index'); // ? Should this just be rootDir let projectRoot = _path().default.dirname(projectRootFile); let packageManager = initialOptions.packageManager || new (_packageManager().NodePackageManager)(inputFS, projectRoot); let cacheDir = // If a cacheDir is provided, resolve it relative to cwd. Otherwise, // use a default directory resolved relative to the project root. initialOptions.cacheDir != null ? _path().default.resolve(outputCwd, initialOptions.cacheDir) : _path().default.resolve(projectRoot, DEFAULT_CACHE_DIRNAME); // Make the root watch directory configurable. This is useful in some cases // where symlinked dependencies outside the project root need to trigger HMR // updates. Default to the project root if not provided. let watchDir = initialOptions.watchDir != null ? _path().default.resolve(initialOptions.watchDir) : projectRoot; let cache = initialOptions.cache ?? (outputFS instanceof _fs().NodeFS ? new (_cache().LMDBCache)(cacheDir) : new (_cache().FSCache)(outputFS, cacheDir)); let mode = initialOptions.mode ?? 'development'; let shouldOptimize = (initialOptions === null || initialOptions === void 0 || (_initialOptions$defau = initialOptions.defaultTargetOptions) === null || _initialOptions$defau === void 0 ? void 0 : _initialOptions$defau.shouldOptimize) ?? mode === 'production'; let publicUrl = (initialOptions === null || initialOptions === void 0 || (_initialOptions$defau2 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau2 === void 0 ? void 0 : _initialOptions$defau2.publicUrl) ?? '/'; let distDir = (initialOptions === null || initialOptions === void 0 || (_initialOptions$defau3 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau3 === void 0 ? void 0 : _initialOptions$defau3.distDir) != null ? _path().default.resolve(inputCwd, initialOptions === null || initialOptions === void 0 || (_initialOptions$defau4 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau4 === void 0 ? void 0 : _initialOptions$defau4.distDir) : undefined; let shouldBuildLazily = initialOptions.shouldBuildLazily ?? false; let lazyIncludes = compileGlobs(initialOptions.lazyIncludes ?? []); if (lazyIncludes.length > 0 && !shouldBuildLazily) { throw new Error('Lazy includes can only be provided when lazy building is enabled'); } let lazyExcludes = compileGlobs(initialOptions.lazyExcludes ?? []); if (lazyExcludes.length > 0 && !shouldBuildLazily) { throw new Error('Lazy excludes can only be provided when lazy building is enabled'); } let shouldContentHash = initialOptions.shouldContentHash ?? initialOptions.mode === 'production'; if (shouldBuildLazily && shouldContentHash) { throw new Error('Lazy bundling does not work with content hashing'); } let env = { ...(await (0, _loadDotEnv.default)(initialOptions.env ?? {}, inputFS, _path().default.join(projectRoot, 'index'), projectRoot)), ...process.env, ...initialOptions.env }; let port = determinePort(initialOptions.serveOptions, env.PORT); return { config: getRelativeConfigSpecifier(inputFS, projectRoot, initialOptions.config), defaultConfig: getRelativeConfigSpecifier(inputFS, projectRoot, initialOptions.defaultConfig), shouldPatchConsole: initialOptions.shouldPatchConsole ?? false, env, mode, shouldAutoInstall: initialOptions.shouldAutoInstall ?? false, hmrOptions: initialOptions.hmrOptions ?? null, shouldBuildLazily, lazyIncludes, lazyExcludes, unstableFileInvalidations: initialOptions.unstableFileInvalidations, shouldBundleIncrementally: initialOptions.shouldBundleIncrementally ?? true, shouldContentHash, serveOptions: initialOptions.serveOptions ? { ...initialOptions.serveOptions, distDir: distDir ?? _path().default.join(outputCwd, 'dist'), port } : false, shouldDisableCache: initialOptions.shouldDisableCache ?? false, shouldProfile: initialOptions.shouldProfile ?? false, shouldTrace: initialOptions.shouldTrace ?? false, cacheDir, watchDir, watchBackend: initialOptions.watchBackend, watchIgnore: initialOptions.watchIgnore, entries: entries.map(e => (0, _projectPath.toProjectPath)(projectRoot, e)), targets: initialOptions.targets, logLevel: initialOptions.logLevel ?? 'info', projectRoot, inputFS, outputFS, cache, packageManager, additionalReporters: ((_initialOptions$addit = initialOptions.additionalReporters) === null || _initialOptions$addit === void 0 ? void 0 : _initialOptions$addit.map(({ packageName, resolveFrom }) => ({ packageName, resolveFrom: (0, _projectPath.toProjectPath)(projectRoot, resolveFrom) }))) ?? [], instanceId: generateInstanceId(entries), detailedReport: initialOptions.detailedReport, defaultTargetOptions: { shouldOptimize, shouldScopeHoist: initialOptions === null || initialOptions === void 0 || (_initialOptions$defau5 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau5 === void 0 ? void 0 : _initialOptions$defau5.shouldScopeHoist, sourceMaps: (initialOptions === null || initialOptions === void 0 || (_initialOptions$defau6 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau6 === void 0 ? void 0 : _initialOptions$defau6.sourceMaps) ?? true, publicUrl, ...(distDir != null ? { distDir: (0, _projectPath.toProjectPath)(projectRoot, distDir) } : { /*::...null*/ }), engines: initialOptions === null || initialOptions === void 0 || (_initialOptions$defau7 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau7 === void 0 ? void 0 : _initialOptions$defau7.engines, outputFormat: initialOptions === null || initialOptions === void 0 || (_initialOptions$defau8 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau8 === void 0 ? void 0 : _initialOptions$defau8.outputFormat, isLibrary: initialOptions === null || initialOptions === void 0 || (_initialOptions$defau9 = initialOptions.defaultTargetOptions) === null || _initialOptions$defau9 === void 0 ? void 0 : _initialOptions$defau9.isLibrary }, featureFlags: { ..._featureFlags().DEFAULT_FEATURE_FLAGS, ...(initialOptions === null || initialOptions === void 0 ? void 0 : initialOptions.featureFlags) }, parcelVersion: _constants.PARCEL_VERSION }; } function getRelativeConfigSpecifier(fs, projectRoot, specifier) { if (specifier == null) { return undefined; } else if (_path().default.isAbsolute(specifier)) { let resolveFrom = (0, _ParcelConfigRequest.getResolveFrom)(fs, projectRoot); let relative = (0, _utils().relativePath)(_path().default.dirname(resolveFrom), specifier); // If the config is outside the project root, use an absolute path so that if the project root // moves the path still works. Otherwise, use a relative path so that the cache is portable. return relative.startsWith('..') ? specifier : relative; } else { return specifier; } } function determinePort(initialServerOptions, portInEnv, defaultPort = 1234) { function parsePort(port) { let parsedPort = Number(port); // return undefined if port number defined in .env is not valid integer if (!Number.isInteger(parsedPort)) { return undefined; } return parsedPort; } if (!initialServerOptions) { return typeof portInEnv !== 'undefined' ? parsePort(portInEnv) ?? defaultPort : defaultPort; } // if initialServerOptions.port is equal to defaultPort, then this means that port number is provided via PORT=~~~~ on cli. In this case, we should ignore port number defined in .env. if (initialServerOptions.port !== defaultPort) { return initialServerOptions.port; } return typeof portInEnv !== 'undefined' ? parsePort(portInEnv) ?? defaultPort : defaultPort; }