1 | 'use strict';
|
2 |
|
3 | const path = require('path');
|
4 |
|
5 | exports.codes = {
|
6 | ERR_INPUT_TYPE_NOT_ALLOWED: createErrorCtor(joinArgs('ERR_INPUT_TYPE_NOT_ALLOWED')),
|
7 | ERR_INVALID_ARG_VALUE: createErrorCtor(joinArgs('ERR_INVALID_ARG_VALUE')),
|
8 | ERR_INVALID_MODULE_SPECIFIER: createErrorCtor(joinArgs('ERR_INVALID_MODULE_SPECIFIER')),
|
9 | ERR_INVALID_PACKAGE_CONFIG: createErrorCtor(joinArgs('ERR_INVALID_PACKAGE_CONFIG')),
|
10 | ERR_INVALID_PACKAGE_TARGET: createErrorCtor(joinArgs('ERR_INVALID_PACKAGE_TARGET')),
|
11 | ERR_MANIFEST_DEPENDENCY_MISSING: createErrorCtor(joinArgs('ERR_MANIFEST_DEPENDENCY_MISSING')),
|
12 | ERR_MODULE_NOT_FOUND: createErrorCtor((path, base, type = 'package') => {
|
13 | return `Cannot find ${type} '${path}' imported from ${base}`
|
14 | }),
|
15 | ERR_PACKAGE_IMPORT_NOT_DEFINED: createErrorCtor(joinArgs('ERR_PACKAGE_IMPORT_NOT_DEFINED')),
|
16 | ERR_PACKAGE_PATH_NOT_EXPORTED: createErrorCtor(joinArgs('ERR_PACKAGE_PATH_NOT_EXPORTED')),
|
17 | ERR_UNSUPPORTED_DIR_IMPORT: createErrorCtor(joinArgs('ERR_UNSUPPORTED_DIR_IMPORT')),
|
18 | ERR_UNSUPPORTED_ESM_URL_SCHEME: createErrorCtor(joinArgs('ERR_UNSUPPORTED_ESM_URL_SCHEME')),
|
19 | ERR_UNKNOWN_FILE_EXTENSION: createErrorCtor(joinArgs('ERR_UNKNOWN_FILE_EXTENSION')),
|
20 | }
|
21 |
|
22 | function joinArgs(name) {
|
23 | return (...args) => {
|
24 | return [name, ...args].join(' ')
|
25 | }
|
26 | }
|
27 |
|
28 | function createErrorCtor(errorMessageCreator) {
|
29 | return class CustomError extends Error {
|
30 | constructor(...args) {
|
31 | super(errorMessageCreator(...args))
|
32 | }
|
33 | }
|
34 | }
|
35 | exports.createErrRequireEsm = createErrRequireEsm;
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 | function createErrRequireEsm(filename, parentPath, packageJsonPath) {
|
45 | const code = 'ERR_REQUIRE_ESM'
|
46 | const err = new Error(getErrRequireEsmMessage(filename, parentPath, packageJsonPath))
|
47 |
|
48 |
|
49 | err.name = `Error [${ code }]`
|
50 | err.stack
|
51 | Object.defineProperty(err, 'name', {
|
52 | value: 'Error',
|
53 | enumerable: false,
|
54 | writable: true,
|
55 | configurable: true
|
56 | })
|
57 | err.code = code
|
58 | return err
|
59 | }
|
60 |
|
61 |
|
62 |
|
63 | function getErrRequireEsmMessage(filename, parentPath = null, packageJsonPath = null) {
|
64 | const ext = path.extname(filename)
|
65 | let msg = `Must use import to load ES Module: ${filename}`;
|
66 | if (parentPath && packageJsonPath) {
|
67 | const path = require('path');
|
68 | const basename = path.basename(filename) === path.basename(parentPath) ?
|
69 | filename : path.basename(filename);
|
70 | msg +=
|
71 | '\nrequire() of ES modules is not supported.\nrequire() of ' +
|
72 | `${filename} ${parentPath ? `from ${parentPath} ` : ''}` +
|
73 | `is an ES module file as it is a ${ext} file whose nearest parent ` +
|
74 | `package.json contains "type": "module" which defines all ${ext} ` +
|
75 | 'files in that package scope as ES modules.\nInstead ' +
|
76 | 'change the requiring code to use ' +
|
77 | 'import(), or remove "type": "module" from ' +
|
78 | `${packageJsonPath}.\n`;
|
79 | return msg;
|
80 | }
|
81 | return msg;
|
82 | }
|