mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-01 07:33:12 +08:00
A top-level return in a CommonJS module compiles when declarations follow it. When the return is taken, only code that already exists can observe the bindings it skips: functions and classes created before the return, and function declarations after it. A module where one of them reads a binding declared after the return, or that assigns exports after it, still stops with SC1090. assert.strictEqual and assert.notStrictEqual compare a nullable number, string or boolean (`number | null`, `string | null`) with a scalar, null or undefined through the checked-dynamic SameValue compare, which reports Node's failure messages. notStrictEqual of another nullable value, such as `child.stdin`, against null or undefined tests the value's tag. An initializer-less JavaScript `let` whose writes all agree also takes their type when the writes are calls declared in the standard library, such as `spawn(...)`, and at file scope. A runtime handle that a closure captures takes the handle or undefined. Inside a nested function, a member read on it (`c.address()`, `child.stdin`) reads the handle and throws Node's TypeError while the binding is still undefined; other reads there take the checked-dynamic value.
12 lines
1.3 KiB
Plaintext
12 lines
1.3 KiB
Plaintext
- **CommonJS `require`:** Literal `require()` calls of compiled modules, supported builtins, and JSON documents compile.
|
|
Reading a top-level `const` or `let` require binding before its `require` runs throws the same `ReferenceError` as Node.js.
|
|
A `var` binding that code above its `require` can reach is unsupported, and so is a read that compiles to no checkable expression, such as exporting the binding before the `require`.
|
|
JSON documents are parsed at build time, and every `require()` of a document returns the same object.
|
|
Destructuring the exports of a module supports plain and renamed properties, plus nested patterns for builtin sub-modules such as `util.types`.
|
|
Any pattern works on a JSON document.
|
|
Defaults, rest elements, and nested patterns over other modules are unsupported.
|
|
A require cycle compiles when each of its modules assigns all of its exports before its first `require` and uses the other modules of the cycle only inside functions that its top-level code can't call.
|
|
Other require cycles are rejected with `SC1016`.
|
|
A top-level `return` ends the module's evaluation.
|
|
It is unsupported when the module assigns exports after it, or when a function that exists before it runs reads a binding declared after it, such as a callback created above the `return` or a function declaration.
|