mirror of
https://github.com/zhigang1992/create-react-app.git
synced 2026-05-06 20:46:44 +08:00
Add module scope plugin (#2189)
* Add module scope plugin * Oops * Add comments * Check windows seps too * More descriptive error * Document it
This commit is contained in:
68
packages/react-dev-utils/ModuleScopePlugin.js
vendored
Normal file
68
packages/react-dev-utils/ModuleScopePlugin.js
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const chalk = require('chalk');
|
||||
const path = require('path');
|
||||
|
||||
class ModuleScopePlugin {
|
||||
constructor(appSrc) {
|
||||
this.appSrc = appSrc;
|
||||
}
|
||||
|
||||
apply(resolver) {
|
||||
const { appSrc } = this;
|
||||
resolver.plugin('file', (request, callback) => {
|
||||
// Unknown issuer, probably webpack internals
|
||||
if (!request.context.issuer) {
|
||||
return callback();
|
||||
}
|
||||
if (
|
||||
// If this resolves to a node_module, we don't care what happens next
|
||||
request.descriptionFileRoot.indexOf('/node_modules/') !== -1 ||
|
||||
request.descriptionFileRoot.indexOf('\\node_modules\\') !== -1 ||
|
||||
// Make sure this request was manual
|
||||
!request.__innerRequest_request
|
||||
) {
|
||||
return callback();
|
||||
}
|
||||
// Resolve the issuer from our appSrc and make sure it's one of our files
|
||||
// Maybe an indexOf === 0 would be better?
|
||||
const relative = path.relative(appSrc, request.context.issuer);
|
||||
// If it's not in src/ or a subdirectory, not our request!
|
||||
if (relative[0] === '.') {
|
||||
return callback();
|
||||
}
|
||||
// Find path from src to the requested file
|
||||
const requestRelative = path.relative(
|
||||
appSrc,
|
||||
path.resolve(
|
||||
path.dirname(request.context.issuer),
|
||||
request.__innerRequest_request
|
||||
)
|
||||
);
|
||||
// Error if in a parent directory of src/
|
||||
if (requestRelative[0] === '.') {
|
||||
callback(
|
||||
new Error(
|
||||
`You attempted to import ${chalk.cyan(request.__innerRequest_request)} which falls outside of the project ${chalk.cyan('src/')} directory. ` +
|
||||
`Relative imports outside of ${chalk.cyan('src/')} are not supported. ` +
|
||||
`You can either move it inside ${chalk.cyan('src/')}, or add a symlink to it from project's ${chalk.cyan('node_modules/')}.`
|
||||
),
|
||||
request
|
||||
);
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ModuleScopePlugin;
|
||||
Reference in New Issue
Block a user