PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/metro/src/lib
Просмотр файла: contextModuleTemplates.js.flow
/**
* 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.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type {ContextMode} from '../ModuleGraph/worker/collectDependencies';
import * as os from 'os';
import * as path from 'path';
function createFileMap(
modulePath: string,
files: string[],
processModule: (moduleId: string) => string,
): string {
let mapString = '\n';
files
.slice()
// Sort for deterministic output
.sort()
.forEach(file => {
let filePath = path.relative(modulePath, file);
if (os.platform() === 'win32') {
filePath = filePath.replaceAll('\\', '/');
}
// NOTE(EvanBacon): I'd prefer we prevent the ability for a module to require itself (`require.context('./')`)
// but Webpack allows this, keeping it here provides better parity between bundlers.
// Ensure relative file paths start with `./` so they match the
// patterns (filters) used to include them.
if (!filePath.startsWith('.')) {
filePath = `./${filePath}`;
}
const key = JSON.stringify(filePath);
// NOTE(EvanBacon): Webpack uses `require.resolve` in order to load modules on demand,
// Metro doesn't have this functionality so it will use getters instead. Modules need to
// be loaded on demand because if we imported directly then users would get errors from importing
// a file without exports as soon as they create a new file and the context module is updated.
// NOTE: The values are set to `enumerable` so the `context.keys()` method works as expected.
mapString += ` ${key}: { enumerable: true, get() { return ${processModule(
file,
)}; } },\n`;
});
return `Object.defineProperties({}, {${mapString}})`;
}
function getEmptyContextModuleTemplate(modulePath: string): string {
return `
function metroEmptyContext(request) {
let e = new Error('No modules in context');
e.code = 'MODULE_NOT_FOUND';
throw e;
}
// Return the keys that can be resolved.
metroEmptyContext.keys = () => ([]);
// Return the module identifier for a user request.
metroEmptyContext.resolve = function metroContextResolve(request) {
throw new Error('Unimplemented Metro module context functionality');
}
module.exports = metroEmptyContext;`;
}
function getLoadableContextModuleTemplate(
modulePath: string,
files: string[],
importSyntax: string,
getContextTemplate: string,
): string {
return `// All of the requested modules are loaded behind enumerable getters.
const map = ${createFileMap(
modulePath,
files,
moduleId => `${importSyntax}(${JSON.stringify(moduleId)})`,
)};
function metroContext(request) {
${getContextTemplate}
}
// Return the keys that can be resolved.
metroContext.keys = function metroContextKeys() {
return Object.keys(map);
};
// Return the module identifier for a user request.
metroContext.resolve = function metroContextResolve(request) {
throw new Error('Unimplemented Metro module context functionality');
}
module.exports = metroContext;`;
}
/**
* Generate a context module as a virtual file string.
*
* @prop {ContextMode} mode indicates how the modules should be loaded.
* @prop {string} modulePath virtual file path for the virtual module. Example: `require.context('./src')` -> `'/path/to/project/src'`.
* @prop {string[]} files list of absolute file paths that must be exported from the context module. Example: `['/path/to/project/src/index.js']`.
*
* @returns a string representing a context module (virtual file contents).
*/
export function getContextModuleTemplate(
mode: ContextMode,
modulePath: string,
files: string[],
): string {
if (!files.length) {
return getEmptyContextModuleTemplate(modulePath);
}
switch (mode) {
case 'eager':
return getLoadableContextModuleTemplate(
modulePath,
files,
// NOTE(EvanBacon): It's unclear if we should use `import` or `require` here so sticking
// with the more stable option (`require`) for now.
'require',
[
' // Here Promise.resolve().then() is used instead of new Promise() to prevent',
' // uncaught exception popping up in devtools',
' return Promise.resolve().then(() => map[request]);',
].join('\n'),
);
case 'sync':
return getLoadableContextModuleTemplate(
modulePath,
files,
'require',
' return map[request];',
);
case 'lazy':
case 'lazy-once':
return getLoadableContextModuleTemplate(
modulePath,
files,
'import',
' return map[request];',
);
default:
throw new Error(`Metro context mode "${mode}" is unimplemented`);
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!