endojs / endo

Endo is a distributed secure JavaScript sandbox, based on SES
Apache License 2.0
829 stars 72 forks source link

Exported `var` declaration not supported #67

Closed jfparadis closed 4 years ago

jfparadis commented 4 years ago

Steps to reproduce Replace test/moddir/index.js with this code:

// index.js
import { x } from './foo.js';
if (x !== 1) throw new TypeError();

Replace test/moddir/foo.js with this code:

// foo.js
export var x = 1;

Execute the test:

$ node -r esm test/test-moddir.js 
TAP version 13
# import moddir
(node:30408) ExperimentalWarning: The fs.promises API is experimental
not ok 1 unexpected exception
  ---
    operator: notEqual
    expected: |-
      [TypeError: $h‍_live.x is not a function]
    actual: |-
      [TypeError: $h‍_live.x is not a function]
    at: Test._1cc‍.r.test (~/projects/make-importer/test/test-moddir.js:59:7)
    stack: |-
      TypeError: $h‍_live.x is not a function
          at eval (eval at <anonymous> (eval at globalEval (~/projects/make-importer/node_modules/esm/esm.js:1:238591)), <anonymous>:7:12)
  ...

1..1
# tests 1
# pass  0
# fail  1

You get a failure from the transpilation. Note: works fine with this foo.js:

// foo.js
export const x = 1;

The test assertion fails because the test expectation has not been updated (expected).

erights commented 4 years ago

It never occurred to me that we could export a var declaration. I should have read the spec more carefully. How does the semantics differ from an exported let declaration, aside from the absence of a temporal dead zone?

jfparadis commented 4 years ago

Hoisting and ReferenceError come to mind. This fails under node:

// foo.js
console.log(x);
export let x = 1;
// index.js
import { x,  } from './foo.js';
if (x !== 1) throw new TypeError();
$ node -r esm test/moddir/index.js 
// ReferenceError: x is not defined

This works under node:

// foo.js
console.log(x);
export var x = 1;
// index.js
import { x,  } from './foo.js';
if (x !== 1) throw new TypeError();
$ node -r esm test/moddir/index.js 
// undefined
jfparadis commented 4 years ago

Note: 83 tests rely on "export var"

test262/test/language/module-code/instn-star-props-dflt-skip-star-as-named-end_FIXTURE.js
test262/test/language/module-code/instn-star-props-dflt-skip-prod_FIXTURE.js
test262/test/language/module-code/instn-iee-bndng-var.js
test262/test/language/module-code/instn-star-props-nrml-1_FIXTURE.js
test262/test/language/module-code/instn-named-err-ambiguous-1_FIXTURE.js
test262/test/language/module-code/instn-star-iee-cycle.js
test262/test/language/module-code/instn-star-props-nrml-indirect_FIXTURE.js
test262/test/language/module-code/eval-gtbndng-indirect-trlng-comma_FIXTURE.js
test262/test/language/module-code/instn-iee-iee-cycle.js
test262/test/language/module-code/instn-star-ambiguous-1_FIXTURE.js
test262/test/language/module-code/instn-star-props-circular-b_FIXTURE.js
test262/test/language/module-code/instn-local-bndng-export-var.js
test262/test/language/module-code/instn-iee-err-ambiguous-2_FIXTURE.js
test262/test/language/module-code/instn-star-props-nrml-star_FIXTURE.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-literal-string.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-identifier.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-this.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-obj-literal.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-null.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-literal-number.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-template-literal.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-new-expr.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-regexp.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-array-literal.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-nested.js
test262/test/language/module-code/top-level-await/syntax/export-var-await-expr-func-expression.js
test262/test/language/module-code/namespace/internals/has-property-str-found-init.js
test262/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-named-end_FIXTURE.js
test262/test/language/module-code/namespace/internals/get-str-found-init.js
test262/test/language/module-code/namespace/internals/own-property-keys-binding-types.js
test262/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-2_FIXTURE.js
test262/test/language/module-code/namespace/internals/get-str-update.js
test262/test/language/module-code/namespace/internals/own-property-keys-binding-types_FIXTURE.js
test262/test/language/module-code/namespace/internals/get-own-property-str-found-init.js
test262/test/language/module-code/namespace/internals/set.js
test262/test/language/module-code/namespace/internals/delete-exported-init.js
test262/test/language/module-code/namespace/internals/get-nested-namespace-props-nrml-3_FIXTURE.js
test262/test/language/module-code/namespace/internals/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js
test262/test/language/module-code/namespace/internals/define-own-property.js
test262/test/language/module-code/instn-iee-trlng-comma_FIXTURE.js
test262/test/language/module-code/instn-named-bndng-dflt-star.js
test262/test/language/module-code/instn-iee-star-cycle-indirect-x_FIXTURE.js
test262/test/language/module-code/instn-star-props-dflt-skip-star-as-prod-end_FIXTURE.js
test262/test/language/module-code/instn-named-bndng-trlng-comma.js
test262/test/language/module-code/instn-iee-err-ambiguous-1_FIXTURE.js
test262/test/language/module-code/instn-star-star-cycle-indirect-x_FIXTURE.js
test262/test/language/module-code/instn-named-iee-cycle.js
test262/test/language/module-code/instn-star-props-circular-a_FIXTURE.js
test262/test/language/module-code/instn-named-star-cycle-indirect-x_FIXTURE.js
test262/test/language/module-code/instn-star-ambiguous-2_FIXTURE.js
test262/test/language/module-code/instn-named-bndng-dflt-named.js
test262/test/language/module-code/instn-named-bndng-var.js
test262/test/language/module-code/instn-star-props-dflt-skip-named_FIXTURE.js
test262/test/language/module-code/instn-named-err-ambiguous-2_FIXTURE.js
test262/test/language/expressions/dynamic-import/assignment-expression/module-code-other_FIXTURE.js
test262/test/language/expressions/dynamic-import/assignment-expression/module-code_FIXTURE.js
test262/test/language/expressions/dynamic-import/dynamic-import-module_FIXTURE.js
test262/test/language/expressions/dynamic-import/namespace/get-nested-namespace-dflt-skip-named-end_FIXTURE.js
test262/test/language/expressions/dynamic-import/namespace/get-nested-namespace-props-nrml-2_FIXTURE.js
test262/test/language/expressions/dynamic-import/namespace/module-code_FIXTURE.js
test262/test/language/expressions/dynamic-import/namespace/get-nested-namespace-props-nrml-3_FIXTURE.js
test262/test/language/expressions/dynamic-import/namespace/define-own-property_FIXTURE.js
test262/test/language/expressions/dynamic-import/namespace/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js
test262/test/language/expressions/dynamic-import/usage/dynamic-import-module_FIXTURE.js
test262/test/language/expressions/dynamic-import/for-await-resolution-and-error-a_FIXTURE.js
test262/test/language/expressions/dynamic-import/module-code_FIXTURE.js
test262/test/language/expressions/dynamic-import/update-to-dynamic-import_FIXTURE.js
test262/test/language/expressions/dynamic-import/for-await-resolution-and-error-b_FIXTURE.js
test262/test/language/expressions/dynamic-import/catch/instn-iee-err-ambiguous-2_FIXTURE.js
test262/test/language/expressions/dynamic-import/catch/instn-iee-err-ambiguous-1_FIXTURE.js
test262/test/language/expressions/import.meta/distinct-for-each-module_FIXTURE.js
test262/test/language/export/escaped-as-export-specifier.js
test262/test/language/import/escaped-as-import-specifier.js
test262/implementation-contributed/v8/mjsunit/modules-exports1.js
test262/implementation-contributed/v8/mjsunit/modules-namespace4.js
test262/implementation-contributed/v8/mjsunit/regress/regress-6681.js
test262/implementation-contributed/v8/mjsunit/modules-imports5.js
test262/implementation-contributed/v8/mjsunit/modules-namespace3.js
test262/implementation-contributed/v8/mjsunit/modules-init3.js
test262/implementation-contributed/v8/mjsunit/modules-skip-namespace.js
test262/implementation-contributed/javascriptcore/modules/cyclic-may-produce-tdz/2.js
test262/implementation-contributed/javascriptcore/modules/imported-bindings-are-immutable/bindings.js
test262/implementation-contributed/javascriptcore/modules/export-from/second.js