liferay-npm-bundler-preset-reactjs
Version:
liferay npm bundler preset react
221 lines (191 loc) • 4.54 kB
text/typescript
/**
* SPDX-FileCopyrightText: © 2020 Liferay, Inc. <https://liferay.com>
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
/**
* An object to describe the parts composing a module name.
* @see splitModuleName
*/
export interface ModuleNameParts {
/** Module file path relative to package root (starts with /) */
modulePath?: string;
/** Package name of module */
pkgName: string;
/** Scope of module (starts with at sign) */
scope?: string;
}
/**
* List of built-in Node.js v10.16.3 modules as returned by
* require('module').builtinModules
*/
const nodeCoreModules = new Set<string>([
'async_hooks',
'assert',
'buffer',
'child_process',
'console',
'constants',
'crypto',
'cluster',
'dgram',
'dns',
'domain',
'events',
'fs',
'http',
'http2',
'_http_agent',
'_http_client',
'_http_common',
'_http_incoming',
'_http_outgoing',
'_http_server',
'https',
'inspector',
'module',
'net',
'os',
'path',
'perf_hooks',
'process',
'punycode',
'querystring',
'readline',
'repl',
'stream',
'_stream_readable',
'_stream_writable',
'_stream_duplex',
'_stream_transform',
'_stream_passthrough',
'_stream_wrap',
'string_decoder',
'sys',
'timers',
'tls',
'_tls_common',
'_tls_wrap',
'trace_events',
'tty',
'url',
'util',
'v8',
'vm',
'zlib',
'v8/tools/splaytree',
'v8/tools/codemap',
'v8/tools/consarray',
'v8/tools/csvparser',
'v8/tools/profile',
'v8/tools/profile_view',
'v8/tools/logreader',
'v8/tools/arguments',
'v8/tools/tickprocessor',
'v8/tools/SourceMap',
'v8/tools/tickprocessor-driver',
'node-inspect/lib/_inspect',
'node-inspect/lib/internal/inspect_client',
'node-inspect/lib/internal/inspect_repl',
]);
/**
* Test if a module name is local to current package.
* @param modulePath the module path
* @return true if module is local to current package
*/
export function isLocalModule(modulePath: string): boolean {
// See https://nodejs.org/api/modules.html#modules_all_together
return modulePath.startsWith('.') || modulePath.startsWith('/');
}
/**
* Test whether a module name is a Node.js core module
* @param modulePath the module path
* @return true if module is a Node.js core module
*/
export function isNodeCoreModule(modulePath: string): boolean {
return nodeCoreModules.has(modulePath);
}
/**
* Test whether a module name is a reserved AMD dependency
* @param modulePath the module path
* @return true if module is a reserved AMD dependency
*/
export function isReservedDependency(modulePath: string): boolean {
return (
modulePath === 'module' ||
modulePath === 'exports' ||
modulePath === 'require'
);
}
/**
* Test whether a module name is an external dependency
* @param modulePath the module path
* @return true if module is an external dependency
*/
export function isExternalDependency(modulePath: string): boolean {
return !isLocalModule(modulePath) && !isReservedDependency(modulePath);
}
/**
* Splits a module name into scope, package and module path parts.
* @param scope
* @param pkgName
* @param modulePath
* @retur a full module name
*/
export function joinModuleName(
scope: string,
pkgName: string,
modulePath: string
): string {
if (!pkgName || pkgName === '') {
throw new Error('Argument pkgName is mandatory');
}
let moduleName = '';
if (scope && scope !== '') {
if (!scope.startsWith('@')) {
throw new Error('Argument scope must start with @');
}
moduleName += `${scope}/`;
}
moduleName += pkgName;
if (modulePath && modulePath !== '') {
if (!modulePath.startsWith('/')) {
throw new Error('Argument modulePath must start with /');
}
moduleName += modulePath;
}
return moduleName;
}
/**
* Splits a module name into scope, package and module path parts.
* @param moduleName a full module name
* @return {Object} a hash with scope (starts with at sign), pkgName and
* modulePath (starts with /)
*/
export function splitModuleName(moduleName: string): ModuleNameParts {
let ret: ModuleNameParts;
let parts = moduleName.split('/');
if (moduleName.startsWith('@')) {
if (parts.length < 2) {
throw new Error(`No package name found in: ${moduleName}`);
}
ret = {
scope: parts[0],
pkgName: parts[1],
};
parts = parts.slice(2);
}
else {
if (parts.length < 1) {
throw new Error(`No package name found in: ${moduleName}`);
}
ret = {
pkgName: parts[0],
};
parts = parts.slice(1);
}
const modulePath = parts.join('/');
if (modulePath !== '') {
ret.modulePath = `/${modulePath}`;
}
return ret;
}