- Consolidated duplicate UndoManagers to single instance - Fixed connection promise to only resolve on 'connected' status - Fixed WebSocketProvider import (WebsocketProvider) - Added proper doc.destroy() cleanup - Renamed isPresenceInitialized property to avoid conflict Co-Authored-By: Paperclip <noreply@paperclip.ing>
111 lines
3.4 KiB
Plaintext
111 lines
3.4 KiB
Plaintext
/**
|
|
* 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 {ExportsLikeMap, FileResolution, ResolutionContext} from './types';
|
|
|
|
import InvalidPackageConfigurationError from './errors/InvalidPackageConfigurationError';
|
|
import PackageImportNotResolvedError from './errors/PackageImportNotResolvedError';
|
|
import resolveAsset from './resolveAsset';
|
|
import isAssetFile from './utils/isAssetFile';
|
|
import {isSubpathDefinedInExportsLike} from './utils/isSubpathDefinedInExportsLike';
|
|
import {matchSubpathFromExportsLike} from './utils/matchSubpathFromExportsLike';
|
|
import path from 'path';
|
|
|
|
/**
|
|
* Resolve a package subpath based on the entry points defined in the package's
|
|
* "imports" field. If there is no match for the given subpath (which may be
|
|
* augmented by resolution of conditional exports for the passed `context`),
|
|
* throws a `PackagePathNotExportedError`.
|
|
*
|
|
* Implementation of PACKAGE_IMPORTS_RESOLVE described in https://nodejs.org/api/esm.html
|
|
*
|
|
* @throws {InvalidPackageConfigurationError} Raised if configuration specified
|
|
* by `importsMap` is invalid.
|
|
*/
|
|
export function resolvePackageTargetFromImports(
|
|
context: ResolutionContext,
|
|
/**
|
|
* The absolute path to the package.json
|
|
*/
|
|
packagePath: string,
|
|
importPath: string,
|
|
importsMap: ExportsLikeMap,
|
|
platform: string | null,
|
|
): FileResolution {
|
|
const createConfigError = (reason: string) => {
|
|
return new InvalidPackageConfigurationError({
|
|
reason,
|
|
packagePath,
|
|
});
|
|
};
|
|
|
|
const firstLevelKeys = Object.keys(importsMap);
|
|
const keysWithoutPrefix = firstLevelKeys.filter(key => !key.startsWith('#'));
|
|
if (firstLevelKeys.length === 0) {
|
|
throw createConfigError('The "imports" field cannot be empty');
|
|
} else if (keysWithoutPrefix.length !== 0) {
|
|
throw createConfigError(
|
|
'The "imports" field cannot have keys which do not start with #',
|
|
);
|
|
}
|
|
|
|
const normalizedMap = new Map(Object.entries(importsMap));
|
|
if (!isSubpathDefinedInExportsLike(normalizedMap, importPath)) {
|
|
throw new PackageImportNotResolvedError({
|
|
importSpecifier: importPath,
|
|
reason: `"${importPath}" could not be matched using "imports" of ${packagePath}`,
|
|
});
|
|
}
|
|
|
|
const {target, patternMatch} = matchSubpathFromExportsLike(
|
|
context,
|
|
importPath,
|
|
normalizedMap,
|
|
platform,
|
|
createConfigError,
|
|
);
|
|
|
|
if (target == null) {
|
|
throw new PackageImportNotResolvedError({
|
|
importSpecifier: importPath,
|
|
reason:
|
|
`"${importPath}" which matches a subpath "imports" in ${packagePath}` +
|
|
`however no match was resolved for this request (platform = ${platform ?? 'null'}).`,
|
|
});
|
|
}
|
|
|
|
const filePath = path.join(
|
|
packagePath,
|
|
patternMatch != null ? target.replaceAll('*', patternMatch) : target,
|
|
);
|
|
|
|
if (isAssetFile(filePath, context.assetExts)) {
|
|
const assetResult = resolveAsset(context, filePath);
|
|
|
|
if (assetResult != null) {
|
|
return assetResult;
|
|
}
|
|
}
|
|
|
|
const lookupResult = context.fileSystemLookup(filePath);
|
|
if (lookupResult.exists && lookupResult.type === 'f') {
|
|
return {
|
|
type: 'sourceFile',
|
|
filePath: lookupResult.realPath,
|
|
};
|
|
}
|
|
|
|
throw createConfigError(
|
|
`The resolved path for "${importPath}" defined in "imports" is ${filePath}, ` +
|
|
'however this file does not exist.',
|
|
);
|
|
}
|