@scriptc/compiler 0.4.6 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/node-fallback/events.d.ts +6 -1
- package/ambient/node-fallback/fs-promises.d.ts +1 -1
- package/ambient/node-fallback/fs.d.ts +54 -10
- package/ambient/node-fallback/http.d.ts +3 -1
- package/ambient/node-fallback/net.d.ts +19 -0
- package/ambient/node-fallback/querystring.d.ts +3 -3
- package/ambient/scriptc-node-fallback.d.ts +58 -13
- package/dist/backend/executable-features.js +13 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +12 -1
- package/dist/backend/immutability.js +50 -4
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/immutability.test.js +95 -1
- package/dist/backend/immutability.test.js.map +1 -1
- package/dist/backend/library-pack.js +2 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/linker.d.ts +11 -0
- package/dist/backend/linker.js +31 -3
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +7 -2
- package/dist/backend/lld.js +5 -3
- package/dist/backend/lld.js.map +1 -1
- package/dist/backend/lld.test.js +10 -4
- package/dist/backend/lld.test.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +50 -1
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/cpu-dispatch.js +6 -5
- package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +53 -1
- package/dist/backend/llvm/dyn.js +221 -9
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +1 -1
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +148 -50
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.js +39 -19
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +29 -2
- package/dist/backend/llvm/emitter.js +86 -7
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +4 -1
- package/dist/backend/llvm/expr-calls.js +20 -4
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +209 -16
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +94 -11
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
- package/dist/backend/llvm/expr-stream-bridges.js +42 -2
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +16 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +206 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/integer-values.d.ts +2 -0
- package/dist/backend/llvm/integer-values.js +6 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +38 -0
- package/dist/backend/llvm/js-ic.js +295 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +20 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +116 -11
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +136 -24
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +70 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +67 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/loop-entry-versions.d.ts +2 -2
- package/dist/backend/llvm/loop-entry-versions.js +43 -21
- package/dist/backend/llvm/loop-entry-versions.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +7 -1
- package/dist/backend/llvm/loop-state.js +20 -2
- package/dist/backend/llvm/loop-state.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +3 -1
- package/dist/backend/llvm/map-number-lookup.js +7 -3
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +52 -11
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/receiver-brackets.test.d.ts +1 -0
- package/dist/backend/llvm/receiver-brackets.test.js +68 -0
- package/dist/backend/llvm/receiver-brackets.test.js.map +1 -0
- package/dist/backend/llvm/record-views.d.ts +22 -2
- package/dist/backend/llvm/record-views.js +139 -10
- package/dist/backend/llvm/record-views.js.map +1 -1
- package/dist/backend/llvm/record-views.test.js +76 -0
- package/dist/backend/llvm/record-views.test.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +1 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +3 -0
- package/dist/backend/llvm/shapes.js +18 -3
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +4 -0
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +10 -1
- package/dist/backend/llvm/speculative-integers.js +59 -8
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/unwind-abi.d.ts +3 -3
- package/dist/backend/llvm/unwind-abi.js +8 -3
- package/dist/backend/llvm/unwind-abi.js.map +1 -1
- package/dist/backend/llvm/walkers.js +1 -1
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +54 -0
- package/dist/backend/native/executable.js +87 -5
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.js +5 -1
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native/vendor.d.ts +1 -1
- package/dist/backend/native/vendor.js +1 -1
- package/dist/backend/native/vendor.js.map +1 -1
- package/dist/backend/native-codegen.js +3 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +43 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.js +1 -0
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-profile.d.ts +4 -1
- package/dist/backend/native-profile.js +12 -1
- package/dist/backend/native-profile.js.map +1 -1
- package/dist/backend/native-profile.test.js +10 -0
- package/dist/backend/native-profile.test.js.map +1 -1
- package/dist/backend/publication.d.ts +4 -1
- package/dist/backend/publication.js +4 -2
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +31 -7
- package/dist/backend/runtime-pack-core.js +21 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +18 -1
- package/dist/backend/runtime-pack-native.js +138 -29
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.js +166 -4
- package/dist/backend/runtime-pack-native.test.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +3 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +7 -0
- package/dist/backend/runtime-pack.js +25 -3
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +3 -11
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/vendor-archives.d.ts +4 -1
- package/dist/backend/vendor-archives.js +264 -3
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +36 -0
- package/dist/backend/vendor-inputs.js +42 -0
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/vendor-inputs.test.js +28 -1
- package/dist/backend/vendor-inputs.test.js.map +1 -1
- package/dist/backend/warm-cache.js +2 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/compat/fetch-profile.d.ts +7 -1
- package/dist/compat/fetch-profile.js +23 -10
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/check.d.ts +3 -0
- package/dist/contracts/check.js +18 -5
- package/dist/contracts/check.js.map +1 -1
- package/dist/coverage/surface-manifest.js +1 -1
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/codes.d.ts +6 -0
- package/dist/diagnostics/codes.js +6 -0
- package/dist/diagnostics/codes.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +50 -0
- package/dist/diagnostics/diagnostic.js +142 -3
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.js +3 -1
- package/dist/diagnostics/dynamic-tier.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +29 -0
- package/dist/executable/executable-cache.js +18 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +5 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +13 -3
- package/dist/executable/prepare.js +271 -18
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/early-errors.d.ts +14 -0
- package/dist/frontend/early-errors.js +305 -0
- package/dist/frontend/early-errors.js.map +1 -0
- package/dist/frontend/early-errors.test.d.ts +1 -0
- package/dist/frontend/early-errors.test.js +42 -0
- package/dist/frontend/early-errors.test.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.js +23 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +47 -0
- package/dist/frontend/input-tracker.js +173 -36
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +86 -2
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/js-inference.d.ts +2 -0
- package/dist/frontend/js-inference.js +18 -0
- package/dist/frontend/js-inference.js.map +1 -0
- package/dist/frontend/lowering/binding-analysis.d.ts +2 -1
- package/dist/frontend/lowering/binding-analysis.js +65 -1
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.js +9 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +1 -1
- package/dist/frontend/lowering/builtin-namespaces.js +19 -2
- package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.d.ts +7 -0
- package/dist/frontend/lowering/builtins/child-process-methods.js +50 -10
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +5 -1
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +1 -1
- package/dist/frontend/lowering/builtins/dates.js +23 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/environment.d.ts +55 -0
- package/dist/frontend/lowering/builtins/environment.js +213 -2
- package/dist/frontend/lowering/builtins/environment.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +47 -16
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.d.ts +25 -7
- package/dist/frontend/lowering/builtins/filesystem.js +185 -16
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +39 -2
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +31 -5
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +3 -2
- package/dist/frontend/lowering/builtins/operating-system.js +5 -4
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +17 -1
- package/dist/frontend/lowering/builtins/process.js +285 -19
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/querystring.d.ts +8 -0
- package/dist/frontend/lowering/builtins/querystring.js +202 -18
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.js +21 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +60 -1
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +208 -59
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +20 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.d.ts +5 -5
- package/dist/frontend/lowering/builtins/v8.js +7 -5
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +17 -2
- package/dist/frontend/lowering/builtins/web-streams-dyn.js +97 -9
- package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +77 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.d.ts +3 -0
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.js +5 -0
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +5 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.js +59 -10
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js +15 -0
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-views.d.ts +13 -0
- package/dist/frontend/lowering/class-views.js +51 -0
- package/dist/frontend/lowering/class-views.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +15 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +54 -10
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +7 -0
- package/dist/frontend/lowering/coercions/state.js +7 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +60 -3
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +29 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +132 -28
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +16 -5
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +16 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +4 -0
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +11 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +53 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +10 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +69 -3
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -2
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -0
- package/dist/frontend/lowering/expressions/array-literals.js +26 -10
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +104 -12
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +121 -4
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +143 -3
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +11 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +22 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +25 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +5 -1
- package/dist/frontend/lowering/expressions/object-literals.js +778 -229
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +66 -20
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +31 -0
- package/dist/frontend/lowering/expressions/property-access.js +796 -12
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +29 -1
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +17 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +132 -17
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +6 -0
- package/dist/frontend/lowering/frozen-records.js +10 -4
- package/dist/frontend/lowering/frozen-records.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.test.d.ts +1 -0
- package/dist/frontend/lowering/frozen-records.test.js +44 -0
- package/dist/frontend/lowering/frozen-records.test.js.map +1 -0
- package/dist/frontend/lowering/function-names.d.ts +9 -0
- package/dist/frontend/lowering/function-names.js +95 -0
- package/dist/frontend/lowering/function-names.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +5 -3
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +49 -0
- package/dist/frontend/lowering/generic-functions.js +365 -7
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/global-values.d.ts +9 -0
- package/dist/frontend/lowering/global-values.js +44 -0
- package/dist/frontend/lowering/global-values.js.map +1 -1
- package/dist/frontend/lowering/handle-properties.js +34 -1
- package/dist/frontend/lowering/handle-properties.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +54 -0
- package/dist/frontend/lowering/key-order-witness.js +546 -5
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +14 -0
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +110 -1
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +36 -6
- package/dist/frontend/lowering/lower-builtin-values.js +332 -58
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +22 -1
- package/dist/frontend/lowering/lower-calls.js +427 -48
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-calls.test.js +78 -0
- package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
- package/dist/frontend/lowering/lower-classes.d.ts +16 -5
- package/dist/frontend/lowering/lower-classes.js +168 -51
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -0
- package/dist/frontend/lowering/lower-event-emitter.js +383 -41
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +14 -0
- package/dist/frontend/lowering/lower-exprs.js +25 -0
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +2 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +80 -33
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +87 -25
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-node-island.d.ts +35 -4
- package/dist/frontend/lowering/lower-node-island.js +456 -61
- package/dist/frontend/lowering/lower-node-island.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +160 -9
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-shared-modules.js +13 -1
- package/dist/frontend/lowering/lower-shared-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +3 -2
- package/dist/frontend/lowering/lower-stdlib.js +32 -18
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +21 -4
- package/dist/frontend/lowering/lower-stmts.js +580 -103
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +126 -8
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +133 -21
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +139 -3
- package/dist/frontend/lowering/lowerer.js +579 -43
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +1 -1
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.js +15 -0
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.js +2 -2
- package/dist/frontend/lowering/nullish-empty-pattern.d.ts +17 -0
- package/dist/frontend/lowering/nullish-empty-pattern.js +118 -0
- package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -0
- package/dist/frontend/lowering/partial-assertions.d.ts +39 -0
- package/dist/frontend/lowering/partial-assertions.js +195 -0
- package/dist/frontend/lowering/partial-assertions.js.map +1 -0
- package/dist/frontend/lowering/primitive-wrappers.d.ts +34 -0
- package/dist/frontend/lowering/primitive-wrappers.js +220 -0
- package/dist/frontend/lowering/primitive-wrappers.js.map +1 -0
- package/dist/frontend/lowering/private-statics.d.ts +46 -0
- package/dist/frontend/lowering/private-statics.js +322 -0
- package/dist/frontend/lowering/private-statics.js.map +1 -0
- package/dist/frontend/lowering/record-sources.d.ts +12 -1
- package/dist/frontend/lowering/record-sources.js +60 -0
- package/dist/frontend/lowering/record-sources.js.map +1 -1
- package/dist/frontend/lowering/strict-equality.d.ts +4 -0
- package/dist/frontend/lowering/strict-equality.js +14 -0
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +27 -0
- package/dist/frontend/lowering/surfaces.js +135 -62
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.d.ts +128 -17
- package/dist/frontend/lowering/unit-journal.js +310 -53
- package/dist/frontend/lowering/unit-journal.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.test.js +91 -3
- package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
- package/dist/frontend/lowering/unit-reuse.d.ts +92 -0
- package/dist/frontend/lowering/unit-reuse.js +1008 -0
- package/dist/frontend/lowering/unit-reuse.js.map +1 -0
- package/dist/frontend/lowering/width-lift.d.ts +12 -0
- package/dist/frontend/npm-file-import.test.d.ts +1 -0
- package/dist/frontend/npm-file-import.test.js +76 -0
- package/dist/frontend/npm-file-import.test.js.map +1 -0
- package/dist/frontend/npm-static.js +17 -2
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +9 -0
- package/dist/frontend/npm.js +82 -0
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/pipeline-native.js +2 -1
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +4 -0
- package/dist/frontend/pipeline.js +68 -7
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-node.d.ts +3 -0
- package/dist/frontend/program-node.js +13 -6
- package/dist/frontend/program-node.js.map +1 -1
- package/dist/frontend/program.d.ts +9 -0
- package/dist/frontend/program.js +159 -7
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/provenance-core.js +4 -0
- package/dist/frontend/provenance-core.js.map +1 -1
- package/dist/frontend/services.d.ts +14 -0
- package/dist/frontend/services.js +52 -2
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +61 -1
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/shape-inference/analyze.d.ts +5 -0
- package/dist/frontend/shape-inference/analyze.js +104 -4
- package/dist/frontend/shape-inference/analyze.js.map +1 -1
- package/dist/frontend/shape-inference/domain.js +0 -1
- package/dist/frontend/shape-inference/domain.js.map +1 -1
- package/dist/frontend/shape-inference/index.js +5 -1
- package/dist/frontend/shape-inference/index.js.map +1 -1
- package/dist/frontend/shape-inference/memo.d.ts +2 -1
- package/dist/frontend/shape-inference/memo.js +6 -2
- package/dist/frontend/shape-inference/memo.js.map +1 -1
- package/dist/frontend/shape-inference/overlay.d.ts +1 -1
- package/dist/frontend/shape-inference/overlay.js +116 -2
- package/dist/frontend/shape-inference/overlay.js.map +1 -1
- package/dist/frontend/shape-inference/static-objects.js +11 -6
- package/dist/frontend/shape-inference/static-objects.js.map +1 -1
- package/dist/frontend/source-phase-imports.test.d.ts +1 -0
- package/dist/frontend/source-phase-imports.test.js +37 -0
- package/dist/frontend/source-phase-imports.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +6 -1
- package/dist/frontend/ts7/ast-node.js +12 -0
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-wire-protocols.test.js +11 -3
- package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.js +3 -5
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +13 -0
- package/dist/frontend/ts7/checker-backend.js +84 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +126 -2
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +22 -1
- package/dist/frontend/ts7/program-host.js +49 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +83 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.d.ts +16 -1
- package/dist/frontend/ts7/rpc-process.js +170 -92
- package/dist/frontend/ts7/rpc-process.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.test.js +49 -21
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
- package/dist/frontend/tsc-codes.js +70 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +7 -2
- package/dist/frontend/type-mapper.js +148 -1
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +152 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/api.d.ts +1 -1
- package/dist/ir/api.js +1 -1
- package/dist/ir/api.js.map +1 -1
- package/dist/ir/build.d.ts +3 -2
- package/dist/ir/build.js +4 -2
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.js +53 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +211 -10
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/codec.d.ts +82 -0
- package/dist/ir/codec.generated.d.ts +13 -0
- package/dist/ir/codec.generated.js +5274 -0
- package/dist/ir/codec.generated.js.map +1 -0
- package/dist/ir/codec.js +325 -0
- package/dist/ir/codec.js.map +1 -0
- package/dist/ir/codec.test.d.ts +1 -0
- package/dist/ir/codec.test.js +225 -0
- package/dist/ir/codec.test.js.map +1 -0
- package/dist/ir/fields.generated.d.ts +20 -10
- package/dist/ir/fields.generated.js +1031 -11
- package/dist/ir/fields.generated.js.map +1 -1
- package/dist/ir/fields.test.js +46 -2
- package/dist/ir/fields.test.js.map +1 -1
- package/dist/ir/function-references.d.ts +5 -4
- package/dist/ir/function-references.js +8 -4
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +7 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/inline-array-sources.js +4 -1
- package/dist/ir/inline-array-sources.js.map +1 -1
- package/dist/ir/inline-array-views.d.ts +13 -0
- package/dist/ir/inline-array-views.js +944 -0
- package/dist/ir/inline-array-views.js.map +1 -0
- package/dist/ir/inline-arrays.d.ts +7 -0
- package/dist/ir/inline-arrays.js +190 -55
- package/dist/ir/inline-arrays.js.map +1 -1
- package/dist/ir/inline-arrays.test.js +140 -2
- package/dist/ir/inline-arrays.test.js.map +1 -1
- package/dist/ir/integer-ranges.js +16 -6
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/ir.d.ts +75 -44
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-ic.d.ts +10 -9
- package/dist/ir/js-ic.js +28 -20
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +10 -2
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/jsval.js +374 -63
- package/dist/ir/jsval.js.map +1 -1
- package/dist/ir/jsval.test.js +96 -2
- package/dist/ir/jsval.test.js.map +1 -1
- package/dist/ir/loop-entry-ranges.js +112 -9
- package/dist/ir/loop-entry-ranges.js.map +1 -1
- package/dist/ir/loop-entry-ranges.test.js +40 -0
- package/dist/ir/loop-entry-ranges.test.js.map +1 -1
- package/dist/ir/parameter-versions.d.ts +2 -1
- package/dist/ir/parameter-versions.js +3 -1
- package/dist/ir/parameter-versions.js.map +1 -1
- package/dist/ir/receiver-readers.js +58 -2
- package/dist/ir/receiver-readers.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +60 -1
- package/dist/ir/runtime-features.js +277 -2
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +165 -1
- package/dist/ir/runtime-features.test.js.map +1 -1
- package/dist/ir/saturating-loop-jams.d.ts +8 -1
- package/dist/ir/saturating-loop-jams.js +46 -7
- package/dist/ir/saturating-loop-jams.js.map +1 -1
- package/dist/ir/saturating-loop-jams.test.js +39 -1
- package/dist/ir/saturating-loop-jams.test.js.map +1 -1
- package/dist/ir/self-captures.js +8 -1
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/self-captures.test.js +15 -0
- package/dist/ir/self-captures.test.js.map +1 -1
- package/dist/ir/serialize.d.ts +3 -2
- package/dist/ir/serialize.js +6 -2
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/validate.js +82 -4
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +46 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/ir-policy.js +3 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.js +2 -0
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +2 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -2
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.js +32 -3
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.js +53 -3
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +88 -2
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/toolchain.js +9 -2
- package/dist/native/toolchain.js.map +1 -1
- package/dist/node-islands/boundary.d.ts +25 -1
- package/dist/node-islands/boundary.js +28 -2
- package/dist/node-islands/boundary.js.map +1 -1
- package/dist/node-islands/detect.d.ts +18 -1
- package/dist/node-islands/detect.js +365 -40
- package/dist/node-islands/detect.js.map +1 -1
- package/dist/node-islands/detect.test.js +151 -4
- package/dist/node-islands/detect.test.js.map +1 -1
- package/dist/node-islands/effect-gate.js +30 -20
- package/dist/node-islands/effect-gate.js.map +1 -1
- package/dist/node-islands/effect-gate.test.js +4 -1
- package/dist/node-islands/effect-gate.test.js.map +1 -1
- package/dist/node-islands/libnode.d.ts +1 -1
- package/dist/node-islands/libnode.js +1 -1
- package/dist/node-islands/libnode.js.map +1 -1
- package/dist/node-islands/modules.d.ts +28 -0
- package/dist/node-islands/modules.js +156 -0
- package/dist/node-islands/modules.js.map +1 -1
- package/dist/node-islands/modules.test.js +105 -1
- package/dist/node-islands/modules.test.js.map +1 -1
- package/dist/node-islands/policy.js +2 -3
- package/dist/node-islands/policy.js.map +1 -1
- package/dist/node-islands/probe-recorder.d.ts +1 -0
- package/dist/node-islands/probe-recorder.js +596 -0
- package/dist/node-islands/probe-recorder.js.map +1 -0
- package/dist/node-islands/probe-recorder.test.d.ts +1 -0
- package/dist/node-islands/probe-recorder.test.js +80 -0
- package/dist/node-islands/probe-recorder.test.js.map +1 -0
- package/dist/node-islands/report.test.js +2 -0
- package/dist/node-islands/report.test.js.map +1 -1
- package/dist/node-islands/rules.js +4 -0
- package/dist/node-islands/rules.js.map +1 -1
- package/dist/node-islands/scan.d.ts +7 -1
- package/dist/node-islands/scan.js +51 -2
- package/dist/node-islands/scan.js.map +1 -1
- package/dist/node-islands/snapshot.d.ts +38 -1
- package/dist/node-islands/snapshot.js +165 -161
- package/dist/node-islands/snapshot.js.map +1 -1
- package/dist/node-islands/snapshot.test.js +63 -2
- package/dist/node-islands/snapshot.test.js.map +1 -1
- package/dist/node-islands/summary.js +8 -0
- package/dist/node-islands/summary.js.map +1 -1
- package/dist/node-islands/type-strip.d.ts +11 -0
- package/dist/node-islands/type-strip.js +157 -0
- package/dist/node-islands/type-strip.js.map +1 -0
- package/dist/node-islands/type-strip.test.d.ts +1 -0
- package/dist/node-islands/type-strip.test.js +31 -0
- package/dist/node-islands/type-strip.test.js.map +1 -0
- package/dist/project-config.d.ts +4 -0
- package/dist/project-config.js +19 -0
- package/dist/project-config.js.map +1 -1
- package/dist/project-config.test.js +10 -0
- package/dist/project-config.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +43 -11
|
@@ -96,6 +96,21 @@ function builtinModuleName(spec) {
|
|
|
96
96
|
return bare;
|
|
97
97
|
return null;
|
|
98
98
|
}
|
|
99
|
+
/** Parentheses and the TypeScript wrappers Node erases (`as`,
|
|
100
|
+
* `satisfies`, `!` and the angle-bracket assertion). */
|
|
101
|
+
function stripWrappers(node) {
|
|
102
|
+
let value = node;
|
|
103
|
+
for (;;) {
|
|
104
|
+
if (ts.isParenthesizedExpression(value) ||
|
|
105
|
+
ts.isAsExpression(value) ||
|
|
106
|
+
ts.isTypeAssertion(value) ||
|
|
107
|
+
ts.isNonNullExpression(value) ||
|
|
108
|
+
ts.isSatisfiesExpression(value))
|
|
109
|
+
value = value.expression;
|
|
110
|
+
else
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
99
114
|
function literalText(node) {
|
|
100
115
|
if (node === undefined)
|
|
101
116
|
return null;
|
|
@@ -103,6 +118,15 @@ function literalText(node) {
|
|
|
103
118
|
return node.text;
|
|
104
119
|
return null;
|
|
105
120
|
}
|
|
121
|
+
/** A property name the scan can spell: an identifier, a string or number
|
|
122
|
+
* literal, or a computed literal key. */
|
|
123
|
+
function staticKey(node) {
|
|
124
|
+
if (ts.isIdentifier(node) || ts.isNumericLiteral(node))
|
|
125
|
+
return node.text;
|
|
126
|
+
if (ts.isComputedPropertyName(node))
|
|
127
|
+
return literalText(stripWrappers(node.expression));
|
|
128
|
+
return literalText(node);
|
|
129
|
+
}
|
|
106
130
|
/** A specifier that folds at build time: a literal, or a concatenation of
|
|
107
131
|
* literals. */
|
|
108
132
|
function isFoldableSpecifier(node) {
|
|
@@ -117,6 +141,15 @@ function isFoldableSpecifier(node) {
|
|
|
117
141
|
function isAssignmentOperator(kind) {
|
|
118
142
|
return kind >= ts.SyntaxKind.FirstAssignment && kind <= ts.SyntaxKind.LastAssignment;
|
|
119
143
|
}
|
|
144
|
+
/** The key of an object-literal property (`name`, `"name"` or a
|
|
145
|
+
* template without substitutions). */
|
|
146
|
+
function literalKeyName(name) {
|
|
147
|
+
if (name === undefined)
|
|
148
|
+
return null;
|
|
149
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNoSubstitutionTemplateLiteral(name))
|
|
150
|
+
return name.text;
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
120
153
|
function propertyName(node) {
|
|
121
154
|
if (ts.isPropertyAccessExpression(node)) {
|
|
122
155
|
const name = node.name;
|
|
@@ -129,15 +162,14 @@ function propertyName(node) {
|
|
|
129
162
|
/** `a.b.c` as "a.b.c" (element accesses with literal keys included), or
|
|
130
163
|
* null when the chain has a computed key or does not start at a name. */
|
|
131
164
|
function chainText(node) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
165
|
+
const value = stripWrappers(node);
|
|
166
|
+
if (ts.isIdentifier(value))
|
|
167
|
+
return value.text;
|
|
168
|
+
if (value.kind === ts.SyntaxKind.ThisKeyword)
|
|
135
169
|
return "this";
|
|
136
|
-
if (ts.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const base = chainText(node.expression);
|
|
140
|
-
const name = propertyName(node);
|
|
170
|
+
if (ts.isPropertyAccessExpression(value) || ts.isElementAccessExpression(value)) {
|
|
171
|
+
const base = chainText(value.expression);
|
|
172
|
+
const name = propertyName(value);
|
|
141
173
|
if (base === null || name === null)
|
|
142
174
|
return null;
|
|
143
175
|
return `${base}.${name}`;
|
|
@@ -146,32 +178,29 @@ function chainText(node) {
|
|
|
146
178
|
}
|
|
147
179
|
/** Like chainText, with computed keys spelled `[…]`: `process.env[…]`. */
|
|
148
180
|
function memberText(node) {
|
|
149
|
-
const
|
|
181
|
+
const value = stripWrappers(node);
|
|
182
|
+
const text = chainText(value);
|
|
150
183
|
if (text !== null)
|
|
151
184
|
return text;
|
|
152
|
-
if (ts.isElementAccessExpression(
|
|
153
|
-
const base = memberText(
|
|
185
|
+
if (ts.isElementAccessExpression(value)) {
|
|
186
|
+
const base = memberText(value.expression);
|
|
154
187
|
return base === null ? null : `${base}[…]`;
|
|
155
188
|
}
|
|
156
|
-
if (ts.isPropertyAccessExpression(
|
|
157
|
-
const base = memberText(
|
|
158
|
-
const name = propertyName(
|
|
189
|
+
if (ts.isPropertyAccessExpression(value)) {
|
|
190
|
+
const base = memberText(value.expression);
|
|
191
|
+
const name = propertyName(value);
|
|
159
192
|
return base === null || name === null ? null : `${base}.${name}`;
|
|
160
193
|
}
|
|
161
194
|
return null;
|
|
162
195
|
}
|
|
163
196
|
/** The identifier a member chain starts at (`a` of `a.b[c].d`). */
|
|
164
197
|
function chainRoot(node) {
|
|
165
|
-
let cur = node;
|
|
198
|
+
let cur = stripWrappers(node);
|
|
166
199
|
for (;;) {
|
|
167
200
|
if (ts.isIdentifier(cur))
|
|
168
201
|
return cur;
|
|
169
202
|
if (ts.isPropertyAccessExpression(cur) || ts.isElementAccessExpression(cur)) {
|
|
170
|
-
cur = cur.expression;
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
if (ts.isParenthesizedExpression(cur)) {
|
|
174
|
-
cur = cur.expression;
|
|
203
|
+
cur = stripWrappers(cur.expression);
|
|
175
204
|
continue;
|
|
176
205
|
}
|
|
177
206
|
return null;
|
|
@@ -212,6 +241,30 @@ function isFunctionBoundary(node) {
|
|
|
212
241
|
ts.isGetAccessorDeclaration(node) ||
|
|
213
242
|
ts.isSetAccessorDeclaration(node));
|
|
214
243
|
}
|
|
244
|
+
/** The name a plain function value is bound to in the same file
|
|
245
|
+
* (`function f`, `var f = function`), for the constructor refinement. */
|
|
246
|
+
function boundFunctionName(fn) {
|
|
247
|
+
if (ts.isFunctionDeclaration(fn))
|
|
248
|
+
return fn.name?.text ?? null;
|
|
249
|
+
const parent = fn.parent;
|
|
250
|
+
if (parent === undefined)
|
|
251
|
+
return null;
|
|
252
|
+
if (ts.isVariableDeclaration(parent) && ts.isIdentifier(parent.name))
|
|
253
|
+
return parent.name.text;
|
|
254
|
+
if (ts.isPropertyAssignment(parent))
|
|
255
|
+
return propertyName(parent.name);
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
/** `X.prototype.name = function () {}`: a method assignment, whose every
|
|
259
|
+
* call through the same spelling has a receiver. */
|
|
260
|
+
function isPrototypeFunctionAssignment(left, right) {
|
|
261
|
+
let value = right;
|
|
262
|
+
while (ts.isParenthesizedExpression(value))
|
|
263
|
+
value = value.expression;
|
|
264
|
+
return (ts.isFunctionExpression(value) &&
|
|
265
|
+
ts.isPropertyAccessExpression(left.expression) &&
|
|
266
|
+
propertyName(left.expression) === "prototype");
|
|
267
|
+
}
|
|
215
268
|
/** One module's pre-scan. */
|
|
216
269
|
class ModuleScanner {
|
|
217
270
|
sf;
|
|
@@ -227,6 +280,21 @@ class ModuleScanner {
|
|
|
227
280
|
builtinBindings = new Map();
|
|
228
281
|
/** Local names bound to a createRequire(...) result. */
|
|
229
282
|
createdRequires = new Set();
|
|
283
|
+
/** Local names bound to a builtin module's CommonJS object: require(),
|
|
284
|
+
* a createRequire'd require's result, a default import, or an alias of
|
|
285
|
+
* one. Writes through these names are patches of the module object. */
|
|
286
|
+
cjsBuiltinObjects = new Set();
|
|
287
|
+
/** Members read through a CommonJS builtin object (H3.4). */
|
|
288
|
+
cjsReads = [];
|
|
289
|
+
/** Names the file constructs with `new`: a constructor's `this` is never
|
|
290
|
+
* the global object, so its `this` uses need no island (decision S5). */
|
|
291
|
+
constructed = new Set();
|
|
292
|
+
/** Names the file calls as a bare identifier, `f(...)`: a name used both
|
|
293
|
+
* ways is a constructor and a plain function, so it still marks. */
|
|
294
|
+
bareCalled = new Set();
|
|
295
|
+
/** Function expressions the file assigns to `X.prototype.name`: every
|
|
296
|
+
* same-file call of them is a receiver call (decision S5). */
|
|
297
|
+
prototypeFunctions = new Set();
|
|
230
298
|
strictness = new Map();
|
|
231
299
|
moduleStrict;
|
|
232
300
|
constructor(sf) {
|
|
@@ -248,7 +316,7 @@ class ModuleScanner {
|
|
|
248
316
|
});
|
|
249
317
|
return this.markers;
|
|
250
318
|
}
|
|
251
|
-
add(rule, reason, construct, node) {
|
|
319
|
+
add(rule, reason, construct, node, member) {
|
|
252
320
|
if (this.markers.length >= MARKER_CAP)
|
|
253
321
|
return;
|
|
254
322
|
this.markers.push({
|
|
@@ -256,6 +324,7 @@ class ModuleScanner {
|
|
|
256
324
|
reason,
|
|
257
325
|
construct,
|
|
258
326
|
loc: { file: this.sf.fileName, start: ts.tokenStartOfNode(node), end: node.end },
|
|
327
|
+
...(member === undefined ? {} : { member }),
|
|
259
328
|
});
|
|
260
329
|
}
|
|
261
330
|
bindName(name, init) {
|
|
@@ -265,21 +334,23 @@ class ModuleScanner {
|
|
|
265
334
|
this.declared.add(name.text);
|
|
266
335
|
if (init === undefined)
|
|
267
336
|
return;
|
|
268
|
-
|
|
269
|
-
while (ts.isParenthesizedExpression(value))
|
|
270
|
-
value = value.expression;
|
|
337
|
+
const value = stripWrappers(init);
|
|
271
338
|
if (ts.isFunctionExpression(value) || ts.isArrowFunction(value))
|
|
272
339
|
this.functions.add(name.text);
|
|
273
340
|
else if (ts.isClassExpression(value))
|
|
274
341
|
this.classes.add(name.text);
|
|
275
342
|
const bound = this.builtinOf(value);
|
|
276
|
-
if (bound !== null)
|
|
343
|
+
if (bound !== null) {
|
|
277
344
|
this.builtinBindings.set(name.text, bound);
|
|
345
|
+
if (!bound.includes(".") && this.isCjsObjectValue(value))
|
|
346
|
+
this.cjsBuiltinObjects.add(name.text);
|
|
347
|
+
}
|
|
278
348
|
if (ts.isCallExpression(value) && this.isCreateRequireCallee(value.expression))
|
|
279
349
|
this.createdRequires.add(name.text);
|
|
280
350
|
return;
|
|
281
351
|
}
|
|
282
352
|
if (ts.isObjectBindingPattern(name)) {
|
|
353
|
+
this.recordCjsPatternReads(name, init);
|
|
283
354
|
const base = init === undefined ? null : this.builtinOf(init);
|
|
284
355
|
for (const element of name.elements.nodes) {
|
|
285
356
|
if (!ts.isBindingElement(element))
|
|
@@ -301,12 +372,22 @@ class ModuleScanner {
|
|
|
301
372
|
}
|
|
302
373
|
}
|
|
303
374
|
}
|
|
375
|
+
/** A value that is a builtin module's CommonJS object: a require() or a
|
|
376
|
+
* createRequire'd require's result of a builtin, or an alias of one. */
|
|
377
|
+
isCjsObjectValue(value) {
|
|
378
|
+
if (ts.isIdentifier(value))
|
|
379
|
+
return this.cjsBuiltinObjects.has(value.text);
|
|
380
|
+
if (!ts.isCallExpression(value))
|
|
381
|
+
return false;
|
|
382
|
+
return (this.isRequireCallee(value.expression) ||
|
|
383
|
+
(ts.isIdentifier(value.expression) && this.createdRequires.has(value.expression.text)));
|
|
384
|
+
}
|
|
304
385
|
/** `require("fs")`, `require("node:util").inherits` → "fs", "util.inherits". */
|
|
305
386
|
builtinOf(node) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
value
|
|
309
|
-
|
|
387
|
+
const value = stripWrappers(node);
|
|
388
|
+
if (ts.isCallExpression(value) &&
|
|
389
|
+
(this.isRequireCallee(value.expression) ||
|
|
390
|
+
(ts.isIdentifier(value.expression) && this.createdRequires.has(value.expression.text)))) {
|
|
310
391
|
const spec = literalText(value.arguments.nodes[0]);
|
|
311
392
|
return spec === null ? null : builtinModuleName(spec);
|
|
312
393
|
}
|
|
@@ -345,6 +426,18 @@ class ModuleScanner {
|
|
|
345
426
|
else if (ts.isParameter(node)) {
|
|
346
427
|
this.bindName(node.name, undefined);
|
|
347
428
|
}
|
|
429
|
+
else if (ts.isNewExpression(node) && ts.isIdentifier(node.expression)) {
|
|
430
|
+
this.constructed.add(node.expression.text);
|
|
431
|
+
}
|
|
432
|
+
else if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
|
|
433
|
+
this.bareCalled.add(node.expression.text);
|
|
434
|
+
}
|
|
435
|
+
else if (ts.isBinaryExpression(node) &&
|
|
436
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
437
|
+
ts.isPropertyAccessExpression(node.left) &&
|
|
438
|
+
isPrototypeFunctionAssignment(node.left, node.right)) {
|
|
439
|
+
this.prototypeFunctions.add(node.right);
|
|
440
|
+
}
|
|
348
441
|
else if (ts.isImportDeclaration(node)) {
|
|
349
442
|
const spec = literalText(node.moduleSpecifier);
|
|
350
443
|
const module = spec === null ? null : builtinModuleName(spec);
|
|
@@ -352,8 +445,12 @@ class ModuleScanner {
|
|
|
352
445
|
if (clause !== undefined) {
|
|
353
446
|
if (clause.name !== undefined) {
|
|
354
447
|
this.declared.add(clause.name.text);
|
|
355
|
-
if (module !== null)
|
|
448
|
+
if (module !== null) {
|
|
356
449
|
this.builtinBindings.set(clause.name.text, module);
|
|
450
|
+
// A default import is the CommonJS object (unlike a namespace
|
|
451
|
+
// or named import, through which Node refuses writes).
|
|
452
|
+
this.cjsBuiltinObjects.add(clause.name.text);
|
|
453
|
+
}
|
|
357
454
|
}
|
|
358
455
|
const bindings = clause.namedBindings;
|
|
359
456
|
if (bindings !== undefined && ts.isNamespaceImport(bindings)) {
|
|
@@ -411,13 +508,79 @@ class ModuleScanner {
|
|
|
411
508
|
isGlobal(name) {
|
|
412
509
|
return BUILTIN_GLOBALS.has(name) && !this.declared.has(name);
|
|
413
510
|
}
|
|
511
|
+
/** A function declaration whose parent is a block that is not a function
|
|
512
|
+
* body: Annex B.3.2's block-level declaration, which in sloppy code also
|
|
513
|
+
* creates a `var`-like binding in the enclosing function (DESIGN.md note 1
|
|
514
|
+
* §3.1, construct 5). A declaration directly in a function body or at the
|
|
515
|
+
* top level of a script is ordinary. */
|
|
516
|
+
isAnnexBBlockFunction(fn) {
|
|
517
|
+
const parent = fn.parent;
|
|
518
|
+
if (parent === undefined || !ts.isBlock(parent))
|
|
519
|
+
return false;
|
|
520
|
+
const owner = parent.parent;
|
|
521
|
+
if (owner === undefined)
|
|
522
|
+
return false;
|
|
523
|
+
// A function-like body, a class static block or a class member
|
|
524
|
+
// initializer block is not a bare block statement.
|
|
525
|
+
return owner.body !== parent;
|
|
526
|
+
}
|
|
527
|
+
/** Whether the file shows the function is only ever called with a
|
|
528
|
+
* receiver, so native's missing sloppy `this` cannot be observed: it is
|
|
529
|
+
* constructed with `new`, or it is a `X.prototype.name` method (decision
|
|
530
|
+
* S5 — the marker islands what native gets wrong, and native passes the
|
|
531
|
+
* receiver for both shapes). */
|
|
532
|
+
receiverSafe(fn) {
|
|
533
|
+
if (this.prototypeFunctions.has(fn))
|
|
534
|
+
return true;
|
|
535
|
+
const name = boundFunctionName(fn);
|
|
536
|
+
return name !== null && this.constructed.has(name) && !this.bareCalled.has(name);
|
|
537
|
+
}
|
|
538
|
+
/** `this` in a plain function call: a sloppy function that is not a
|
|
539
|
+
* method, constructor, accessor or class member, and is not an arrow
|
|
540
|
+
* function (whose `this` is its enclosing function's). Conservative
|
|
541
|
+
* (decision S2): a file-level scan cannot see cross-file call sites, so
|
|
542
|
+
* any `this` in such a function marks the module, except the shapes the
|
|
543
|
+
* file itself proves are receiver calls (decision S5). Top-level `this`
|
|
544
|
+
* is not this marker: it is the module's exports object, and the test262
|
|
545
|
+
* profile's script-environment exclusion covers the script form. */
|
|
546
|
+
visitThis(node) {
|
|
547
|
+
if (this.isStrict(node))
|
|
548
|
+
return;
|
|
549
|
+
for (let cur = node.parent; cur !== undefined; cur = cur.parent) {
|
|
550
|
+
// An arrow function has no `this` of its own: keep looking outward.
|
|
551
|
+
if (ts.isArrowFunction(cur))
|
|
552
|
+
continue;
|
|
553
|
+
if (ts.isFunctionDeclaration(cur) || ts.isFunctionExpression(cur)) {
|
|
554
|
+
if (this.receiverSafe(cur))
|
|
555
|
+
return;
|
|
556
|
+
this.add("R2.4", "sloppy-this", "'this' in a plain call in sloppy mode", node);
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
// A method, constructor or accessor has a receiver; a class member
|
|
560
|
+
// initializer and a class static block have their own `this`; a
|
|
561
|
+
// property assignment's function is commonly a method too.
|
|
562
|
+
if (isFunctionBoundary(cur) ||
|
|
563
|
+
ts.isClassDeclaration(cur) ||
|
|
564
|
+
ts.isClassExpression(cur) ||
|
|
565
|
+
ts.isClassStaticBlockDeclaration(cur) ||
|
|
566
|
+
ts.isPropertyDeclaration(cur) ||
|
|
567
|
+
ts.isPropertyAssignment(cur))
|
|
568
|
+
return;
|
|
569
|
+
// Top-level `this` is the module's exports object, not a call site.
|
|
570
|
+
if (ts.isSourceFile(cur))
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
414
574
|
visit(node) {
|
|
415
575
|
if (ts.isCallExpression(node))
|
|
416
576
|
this.visitCall(node);
|
|
417
577
|
else if (ts.isNewExpression(node))
|
|
418
578
|
this.visitNew(node);
|
|
419
|
-
else if (ts.isBinaryExpression(node) && isAssignmentOperator(node.operatorToken.kind))
|
|
579
|
+
else if (ts.isBinaryExpression(node) && isAssignmentOperator(node.operatorToken.kind)) {
|
|
420
580
|
this.visitWrite(node.left, node, "write");
|
|
581
|
+
if (node.operatorToken.kind === ts.SyntaxKind.EqualsToken)
|
|
582
|
+
this.recordCjsPatternReads(node.left, node.right);
|
|
583
|
+
}
|
|
421
584
|
else if (ts.isDeleteExpression(node))
|
|
422
585
|
this.visitDelete(node);
|
|
423
586
|
else if (ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) {
|
|
@@ -426,7 +589,10 @@ class ModuleScanner {
|
|
|
426
589
|
this.visitWrite(node.operand, node, "write");
|
|
427
590
|
}
|
|
428
591
|
else if (ts.isWithStatement(node)) {
|
|
429
|
-
|
|
592
|
+
// A `with` in strict code is an early error (Node refuses the file
|
|
593
|
+
// too), so only sloppy code carries the sloppy-semantics marker.
|
|
594
|
+
if (!this.isStrict(node))
|
|
595
|
+
this.add("R2.4", "with", "a 'with' statement", node);
|
|
430
596
|
}
|
|
431
597
|
else if (ts.isImportDeclaration(node)) {
|
|
432
598
|
const spec = literalText(node.moduleSpecifier);
|
|
@@ -445,6 +611,13 @@ class ModuleScanner {
|
|
|
445
611
|
const text = chainText(node);
|
|
446
612
|
if ((text === "arguments.callee" || text === "arguments.caller") && !this.isStrict(node))
|
|
447
613
|
this.add("R2.4", "sloppy-arguments", `'${text}'`, node);
|
|
614
|
+
this.recordCjsRead(node);
|
|
615
|
+
}
|
|
616
|
+
else if (ts.isElementAccessExpression(node)) {
|
|
617
|
+
this.recordCjsRead(node);
|
|
618
|
+
}
|
|
619
|
+
else if (node.kind === ts.SyntaxKind.ThisKeyword) {
|
|
620
|
+
this.visitThis(node);
|
|
448
621
|
}
|
|
449
622
|
else if (ts.isObjectLiteralExpression(node)) {
|
|
450
623
|
for (const prop of node.properties.nodes) {
|
|
@@ -460,6 +633,100 @@ class ModuleScanner {
|
|
|
460
633
|
this.visitFunction(node);
|
|
461
634
|
}
|
|
462
635
|
}
|
|
636
|
+
/** Records a read of a member of a builtin module's CommonJS object, so
|
|
637
|
+
* a patch installed by an island module can be checked against it
|
|
638
|
+
* (H3.4). The left of an assignment (and a delete or ++/-- target) is a
|
|
639
|
+
* write, not a read. A computed key reads a member the scan cannot name,
|
|
640
|
+
* so it is recorded as the whole module ("fs.*"). */
|
|
641
|
+
recordCjsRead(node) {
|
|
642
|
+
const root = chainRoot(node);
|
|
643
|
+
if (root === null || !this.cjsBuiltinObjects.has(root.text))
|
|
644
|
+
return;
|
|
645
|
+
const module = this.builtinBindings.get(root.text);
|
|
646
|
+
if (module === undefined)
|
|
647
|
+
return;
|
|
648
|
+
const text = chainText(node);
|
|
649
|
+
const parent = node.parent;
|
|
650
|
+
if (parent !== undefined) {
|
|
651
|
+
if (ts.isBinaryExpression(parent) &&
|
|
652
|
+
isAssignmentOperator(parent.operatorToken.kind) &&
|
|
653
|
+
parent.left === node)
|
|
654
|
+
return;
|
|
655
|
+
if (ts.isDeleteExpression(parent) ||
|
|
656
|
+
ts.isPrefixUnaryExpression(parent) ||
|
|
657
|
+
ts.isPostfixUnaryExpression(parent))
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
this.pushCjsRead(text === null ? `${module}.*` : module + text.slice(root.text.length), node);
|
|
661
|
+
}
|
|
662
|
+
pushCjsRead(member, node) {
|
|
663
|
+
this.cjsReads.push({
|
|
664
|
+
member,
|
|
665
|
+
loc: { file: this.sf.fileName, start: ts.tokenStartOfNode(node), end: node.end },
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
/** The reads of a destructuring whose source is a builtin module's
|
|
669
|
+
* CommonJS object (`const { readFileSync } = require("fs")`,
|
|
670
|
+
* `({ readFileSync } = fs)`): each property it takes is read when the
|
|
671
|
+
* destructuring runs, so it sees a patch installed before. A rest element
|
|
672
|
+
* or a computed key reads members the scan cannot name ("fs.*"). */
|
|
673
|
+
recordCjsPatternReads(pattern, source) {
|
|
674
|
+
if (source === undefined)
|
|
675
|
+
return;
|
|
676
|
+
const value = stripWrappers(source);
|
|
677
|
+
if (!this.isCjsObjectValue(value))
|
|
678
|
+
return;
|
|
679
|
+
const module = this.builtinOf(value);
|
|
680
|
+
if (module === null || module.includes("."))
|
|
681
|
+
return;
|
|
682
|
+
this.recordPatternReads(pattern, module);
|
|
683
|
+
}
|
|
684
|
+
recordPatternReads(pattern, base) {
|
|
685
|
+
const target = stripWrappers(pattern);
|
|
686
|
+
const elements = [];
|
|
687
|
+
if (ts.isObjectBindingPattern(target)) {
|
|
688
|
+
for (const element of target.elements.nodes) {
|
|
689
|
+
if (!ts.isBindingElement(element))
|
|
690
|
+
continue;
|
|
691
|
+
elements.push({
|
|
692
|
+
key: element.propertyName ?? element.name,
|
|
693
|
+
value: element.name,
|
|
694
|
+
rest: element.dotDotDotToken !== undefined,
|
|
695
|
+
node: element,
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
else if (ts.isObjectLiteralExpression(target)) {
|
|
700
|
+
for (const prop of target.properties.nodes) {
|
|
701
|
+
if (ts.isPropertyAssignment(prop))
|
|
702
|
+
elements.push({ key: prop.name, value: prop.initializer, rest: false, node: prop });
|
|
703
|
+
else if (ts.isShorthandPropertyAssignment(prop))
|
|
704
|
+
elements.push({ key: prop.name, value: undefined, rest: false, node: prop });
|
|
705
|
+
else if (ts.isSpreadAssignment(prop))
|
|
706
|
+
elements.push({ key: undefined, value: undefined, rest: true, node: prop });
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
else
|
|
710
|
+
return;
|
|
711
|
+
for (const element of elements) {
|
|
712
|
+
const key = element.rest || element.key === undefined ? null : staticKey(element.key);
|
|
713
|
+
if (key === null) {
|
|
714
|
+
this.pushCjsRead(`${base.split(".")[0]}.*`, element.node);
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
const member = `${base}.${key}`;
|
|
718
|
+
this.pushCjsRead(member, element.node);
|
|
719
|
+
// A nested pattern reads the member's own properties too.
|
|
720
|
+
if (element.value !== undefined) {
|
|
721
|
+
let inner = stripWrappers(element.value);
|
|
722
|
+
// `{ readFileSync = fallback }` (a default) and `{ a: { b } = {} }`.
|
|
723
|
+
if (ts.isBinaryExpression(inner) && inner.operatorToken.kind === ts.SyntaxKind.EqualsToken)
|
|
724
|
+
inner = stripWrappers(inner.left);
|
|
725
|
+
if (ts.isObjectBindingPattern(inner) || ts.isObjectLiteralExpression(inner))
|
|
726
|
+
this.recordPatternReads(inner, member);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
}
|
|
463
730
|
visitSpecifier(spec, node) {
|
|
464
731
|
const builtin = builtinModuleName(spec);
|
|
465
732
|
if (builtin === "vm")
|
|
@@ -500,15 +767,24 @@ class ModuleScanner {
|
|
|
500
767
|
let target = callee;
|
|
501
768
|
while (ts.isParenthesizedExpression(target))
|
|
502
769
|
target = target.expression;
|
|
770
|
+
// A bare `eval(...)` is the intrinsic's DIRECT call: it reads and
|
|
771
|
+
// creates bindings in the caller's scope, and in sloppy mode creates
|
|
772
|
+
// globals (DESIGN.md note 1 §3.1). `globalThis.eval(...)`, the
|
|
773
|
+
// comma-operator idiom `(0, eval)(...)` and the other spellings are
|
|
774
|
+
// indirect: they observe no caller scope, so only R1.1.
|
|
775
|
+
const direct = ts.isIdentifier(target) && target.text === "eval" && !this.declared.has("eval");
|
|
503
776
|
if (ts.isBinaryExpression(target) && target.operatorToken.kind === ts.SyntaxKind.CommaToken)
|
|
504
777
|
target = target.right;
|
|
505
778
|
const text = chainText(target);
|
|
506
779
|
if (text === null)
|
|
507
780
|
return;
|
|
508
|
-
if (
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
781
|
+
if (text === "eval" && !this.declared.has("eval")) {
|
|
782
|
+
this.add("R1.1", "code-from-string", "eval()", call);
|
|
783
|
+
if (direct && !this.isStrict(call))
|
|
784
|
+
this.add("R2.4", "direct-eval", "a direct call of eval() in sloppy mode", call);
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
if (text === "globalThis.eval" || text === "global.eval" || text === "window.eval") {
|
|
512
788
|
this.add("R1.1", "code-from-string", "eval()", call);
|
|
513
789
|
return;
|
|
514
790
|
}
|
|
@@ -560,10 +836,45 @@ class ModuleScanner {
|
|
|
560
836
|
if (((text === "Object.defineProperty" || text === "Object.defineProperties") &&
|
|
561
837
|
this.isGlobal("Object")) ||
|
|
562
838
|
(text === "Reflect.defineProperty" && this.isGlobal("Reflect"))) {
|
|
839
|
+
// A definition on a builtin module's CommonJS object is a patch the
|
|
840
|
+
// code loading that object must see (R2.5, H3.1.4).
|
|
841
|
+
const target = first === undefined ? undefined : stripWrappers(first);
|
|
842
|
+
const builtin = target !== undefined && ts.isIdentifier(target) && this.cjsBuiltinObjects.has(target.text)
|
|
843
|
+
? (this.builtinBindings.get(target.text) ?? null)
|
|
844
|
+
: null;
|
|
845
|
+
if (builtin !== null) {
|
|
846
|
+
const key = literalText(args[1] === undefined ? undefined : stripWrappers(args[1]));
|
|
847
|
+
this.add("R2.5", "builtin-patch", `'${text}()' on the builtin module '${builtin}'`, call, key === null ? `${builtin}.*` : `${builtin}.${key}`);
|
|
848
|
+
return;
|
|
849
|
+
}
|
|
563
850
|
if (first !== undefined && !this.isModuleObject(first) && !this.inInteropHelper(call))
|
|
564
851
|
this.add("R2.3", "define-property", `'${text}()'`, call);
|
|
565
852
|
return;
|
|
566
853
|
}
|
|
854
|
+
// Object.assign(fs, …) on a builtin module's CommonJS object: every
|
|
855
|
+
// literal key is a patch (R2.5, H3.1.4).
|
|
856
|
+
if (text === "Object.assign" && this.isGlobal("Object") && first !== undefined) {
|
|
857
|
+
const target = stripWrappers(first);
|
|
858
|
+
if (ts.isIdentifier(target) && this.cjsBuiltinObjects.has(target.text)) {
|
|
859
|
+
const builtin = this.builtinBindings.get(target.text) ?? null;
|
|
860
|
+
if (builtin !== null) {
|
|
861
|
+
const source = args.length === 2 ? stripWrappers(args[1]) : undefined;
|
|
862
|
+
const keys = source !== undefined && ts.isObjectLiteralExpression(source)
|
|
863
|
+
? source.properties.nodes
|
|
864
|
+
.map((property) => ts.isPropertyAssignment(property) || ts.isShorthandPropertyAssignment(property)
|
|
865
|
+
? literalKeyName(property.name)
|
|
866
|
+
: null)
|
|
867
|
+
.filter((key) => key !== null)
|
|
868
|
+
: [];
|
|
869
|
+
if (keys.length === 0)
|
|
870
|
+
this.add("R2.5", "builtin-patch", `'Object.assign()' on the builtin module '${builtin}'`, call, `${builtin}.*`);
|
|
871
|
+
else
|
|
872
|
+
for (const key of keys)
|
|
873
|
+
this.add("R2.5", "builtin-patch", `'Object.assign()' on the builtin module '${builtin}'`, call, `${builtin}.${key}`);
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
}
|
|
567
878
|
if (text.endsWith(".__defineGetter__") || text.endsWith(".__defineSetter__")) {
|
|
568
879
|
this.add("R2.3", "define-property", `'${text.slice(text.lastIndexOf(".") + 1)}()'`, call);
|
|
569
880
|
return;
|
|
@@ -706,7 +1017,10 @@ class ModuleScanner {
|
|
|
706
1017
|
if (binding !== undefined) {
|
|
707
1018
|
const member = binding + spelled.slice(root.text.length);
|
|
708
1019
|
if (!this.allowedWrite(member)) {
|
|
709
|
-
|
|
1020
|
+
// A write through a builtin module's CommonJS object patches that
|
|
1021
|
+
// object; only code sharing Node's builtin can see it (H3.1).
|
|
1022
|
+
const patch = this.cjsBuiltinObjects.has(root.text);
|
|
1023
|
+
this.add("R2.5", patch ? "builtin-patch" : "builtin-write", `a ${what} of the builtin module member '${member}'`, node, patch ? member : undefined);
|
|
710
1024
|
}
|
|
711
1025
|
return;
|
|
712
1026
|
}
|
|
@@ -757,6 +1071,8 @@ class ModuleScanner {
|
|
|
757
1071
|
/** Observable `arguments` aliasing in a sloppy function: writes to
|
|
758
1072
|
* arguments[i], or to a parameter while `arguments` is read. */
|
|
759
1073
|
visitFunction(fn) {
|
|
1074
|
+
if (ts.isFunctionDeclaration(fn) && this.isAnnexBBlockFunction(fn) && !this.isStrict(fn))
|
|
1075
|
+
this.add("R2.4", "annexb-block-function", "a function declaration in a block in sloppy mode", fn);
|
|
760
1076
|
const body = fn.body;
|
|
761
1077
|
if (body === undefined || !ts.isBlock(body))
|
|
762
1078
|
return;
|
|
@@ -797,9 +1113,18 @@ class ModuleScanner {
|
|
|
797
1113
|
this.add("R2.4", "sloppy-arguments", "a parameter write while 'arguments' is read in sloppy mode", seen.paramWrite);
|
|
798
1114
|
}
|
|
799
1115
|
}
|
|
800
|
-
/** The R1/R2 markers of one
|
|
1116
|
+
/** The R1/R2 markers and CommonJS-object reads of one module, in source
|
|
1117
|
+
* order. */
|
|
1118
|
+
export function scanModuleFacts(sf) {
|
|
1119
|
+
const scanner = new ModuleScanner(sf);
|
|
1120
|
+
const markers = scanner.scan();
|
|
1121
|
+
return {
|
|
1122
|
+
markers: markers.sort((a, b) => a.loc.start - b.loc.start),
|
|
1123
|
+
cjsReads: scanner.cjsReads.sort((a, b) => a.loc.start - b.loc.start),
|
|
1124
|
+
};
|
|
1125
|
+
}
|
|
1126
|
+
/** The R1/R2 markers of one module, in source order. */
|
|
801
1127
|
export function scanModule(sf) {
|
|
802
|
-
|
|
803
|
-
return markers.sort((a, b) => a.loc.start - b.loc.start);
|
|
1128
|
+
return scanModuleFacts(sf).markers;
|
|
804
1129
|
}
|
|
805
1130
|
//# sourceMappingURL=detect.js.map
|