From f5241e20ccfb17a70c3af46d58160288d54f1d19 Mon Sep 17 00:00:00 2001 From: Geoffrey Booth Date: Tue, 19 Mar 2024 20:09:33 -0700 Subject: [PATCH] doc: add spec for contains module syntax PR-URL: https://github.com/nodejs/node/pull/52059 Reviewed-By: Luigi Pinca Reviewed-By: Guy Bedford --- doc/api/esm.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/api/esm.md b/doc/api/esm.md index 6d2860997bc684..92af2d2b498d4a 100644 --- a/doc/api/esm.md +++ b/doc/api/esm.md @@ -1069,8 +1069,8 @@ _isImports_, _conditions_) > 10. If _url_ ends in _".js"_, then > 1. If _packageType_ is not **null**, then > 1. Return _packageType_. -> 2. If `--experimental-detect-module` is enabled and the source of -> module contains static import or export syntax, then +> 2. If `--experimental-detect-module` is enabled and the result of +> **DETECT\_MODULE\_SYNTAX**(_source_) is true, then > 1. Return _"module"_. > 3. Return _"commonjs"_. > 11. If _url_ does not have any extension, then @@ -1107,6 +1107,17 @@ _isImports_, _conditions_) > 1. Throw an _Invalid Package Configuration_ error. > 4. Return the parsed JSON source of the file at _pjsonURL_. +**DETECT\_MODULE\_SYNTAX**(_source_) + +> 1. Parse _source_ as an ECMAScript module. +> 2. If the parse is successful, then +> 1. If _source_ contains top-level `await`, static `import` or `export` +> statements, or `import.meta`, return **true**. +> 2. If _source_ contains a top-level lexical declaration (`const`, `let`, +> or `class`) of any of the CommonJS wrapper variables (`require`, +> `exports`, `module`, `__filename`, or `__dirname`) then return **true**. +> 3. Else return **false**. + ### Customizing ESM specifier resolution algorithm [Module customization hooks][] provide a mechanism for customizing the ESM