From 8d7330be0e8a6952438c4671a84d361568b621b2 Mon Sep 17 00:00:00 2001 From: Antoine du HAMEL Date: Wed, 11 Mar 2020 23:44:31 +0100 Subject: [PATCH] module: deprecate module.parent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This feature does not work when a module is imported using ECMAScript modules specification, therefore it is deprecated. Fixes: https://github.com/nodejs/modules/issues/469 Backport-PR-URL: https://github.com/nodejs/node/pull/33533 PR-URL: https://github.com/nodejs/node/pull/32217 Reviewed-By: Gus Caplan Reviewed-By: Bradley Farias Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Matteo Collina Reviewed-By: Tobias Nießen Reviewed-By: Ruben Bridgewater --- doc/api/deprecations.md | 33 +++++++++++++++++++ doc/api/modules.md | 12 +++++-- lib/internal/modules/cjs/loader.js | 3 +- test/common/index.js | 4 +-- test/common/require-as.js | 2 +- test/js-native-api/test_instance_data/test.js | 2 +- test/node-api/test_instance_data/test.js | 2 +- test/parallel/test-cli-eval.js | 2 +- 8 files changed, 51 insertions(+), 9 deletions(-) diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md index 842ebf97ec5aff..58168640cec6cc 100644 --- a/doc/api/deprecations.md +++ b/doc/api/deprecations.md @@ -2707,6 +2707,39 @@ Type: Runtime `Transform._transformState` will be removed in future versions where it is no longer required due to simplification of the implementation. + +### DEP0144: `module.parent` + + +Type: Documentation-only + +A CommonJS module can access the first module that required it using +`module.parent`. This feature is deprecated because it does not work +consistently in the presence of ECMAScript modules and because it gives an +inaccurate representation of the CommonJS module graph. + +Some modules use it to check if they are the entry point of the current process. +Instead, it is recommended to compare `require.main` and `module`: + +```js +if (require.main === module) { + // Code section that will run only if current file is the entry point. +} +``` + +When looking for the CommonJS modules that have required the current one, +`require.cache` and `module.children` can be used: + +```js +const moduleParents = Object.values(require.cache) + .filter((m) => m.children.includes(module)); +``` + ### DEP0XXX: `socket.bufferSize` -* {module} +> Stability: 0 - Deprecated: Please use [`require.main`][] and +> [`module.children`][] instead. + +* {module | null | undefined} -The module that first required this one. +The module that first required this one, or `null` if the current module is the +entry point of the current process, or `undefined` if the module was loaded by +something that is not a CommonJS module (E.G.: REPL or `import`). ### `module.path`