-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
webpack-utils.js
85 lines (80 loc) · 3.42 KB
/
webpack-utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// This module fixes sourcemap paths for the various Amplify packages. It's
// needed because packages at build time live in different (relative) folder
// locations than the folders where packages are installed from npm. For
// example, /packages/aws-amplify/src/index.ts imports @aws-amplify/ui. At build
// time, the aws-amplify and amplify-ui folders are siblings, but when the
// aws-amplify package is installed from npm, the amplify-ui folder is installed
// at ./node_modules/@aws-amplify/ui, which is a new name and is no longer a
// sibling to ./node_modules/aws-amplify like it was at build time. These
// changes mean that end users can't easily debug into Amplify code, especially
// using IDEs like VSCode.
//
// The code in this file changes paths inside Amplify sourcemaps to work around
// the issues above. The following changes are made:
// 1. sourcemap paths that point to node_modules dependencies (e.g. lodash) are
// mapped to webpack:///./node_modules/*
// 2. sourcemap paths that point to sibling packages under the @aws-amplify
// alias (like the UI example above) are mapped (using package names, not
// folders) to webpack:///./node_modules/@aws-amplify/*
// 3. other paths, e.g. relative paths in the same package, or webpack or node
// builtins, will be left alone (same behavior as current webpack config).
//
// These path mappings are designed to be compatible with VSCode's default
// source mapping options here:
// https://github.com/Microsoft/vscode-chrome-debug#sourcemaps
//
// IMPORTANT: if new packages are added to Amplify, add them to the map below.
const packageFolderMap = {
'amazon-cognito-identity-js': 'amazon-cognito-identity-js',
'amplify-ui': '@aws-amplify/ui',
analytics: '@aws-amplify/analytics',
api: '@aws-amplify/api',
auth: '@aws-amplify/auth',
'aws-amplify': 'aws-amplify',
'aws-amplify-angular': 'aws-amplify-angular',
'aws-amplify-react': 'aws-amplify-react',
'aws-amplify-react-native': 'aws-amplify-react-native',
'aws-amplify-vue': 'aws-amplify-vue',
cache: '@aws-amplify/cache',
core: '@aws-amplify/core',
datastore: '@aws-amplify/datastore',
interactions: '@aws-amplify/interactions',
pubsub: '@aws-amplify/pubsub',
pushnotification: '@aws-amplify/pushnotification',
storage: '@aws-amplify/storage',
xr: '@aws-amplify/xr',
};
const folders = Object.keys(packageFolderMap);
const nodeModules = '/node_modules/';
const webpackPrefix = 'webpack:///';
const webpackNodeModules = webpackPrefix + '.' + nodeModules;
function devtoolModuleFilenameTemplate(info) {
const resource = info.resource;
if (resource.includes(nodeModules)) {
// dependency paths
const start = resource.indexOf(nodeModules);
const after = start + nodeModules.length;
return webpackNodeModules + resource.substring(after);
} else if (resource.includes('../')) {
// handle relative paths to other packages in this monorepo by converting them into absolute
// paths pointing at node_modules
for (let i = 0; i < folders.length; i++) {
const folder = folders[i];
const relative = '../' + folder;
const start = resource.indexOf(relative);
if (start !== -1) {
const after = start + relative.length;
return (
webpackNodeModules +
packageFolderMap[folder] +
resource.substring(after)
);
}
}
}
// fall-through (e.g. relative paths in this package, webpack builtins, unknown package paths)
return webpackPrefix + resource;
}
module.exports = {
devtoolModuleFilenameTemplate,
};