An Export That Binds Nothing Is Refused

Status: refused by design

export const {} is not FunctionalScript. export const {} = {}; is valid JavaScript, and fjs compile refuses it by design: the demo below shows what it prints.

An exported pattern exports each name it binds, so export const {} = {}; exports nothing, and a module made of it is a module with no export (no export). JavaScript admits the text; FunctionalScript refuses it as module exports nothing.

The row mod.empty-pattern-export of refused constructs registers the refusal, and module structure gives its reason.

Examples

export const {} = {};

The demo on this page compiles sample.mjs, the module above, with this build's fjs compile, and shows the line it prints and the token it refuses. Below that it shows what JavaScript answers for the same module: undefined.

What to Write Instead

Export a name, as alternative.f.js does:

export const a = 1;
export default a;

It answers 1.

A Better Message

Today fjs compile prints module exports nothing at the refused token. The demo proposes what it should print instead: the reason at the same token, what JavaScript does there, and the allowed spelling, the line alternative.f.js writes, as help. The page compiles the alternative too, so the suggestion is one the compiler accepts.

Reference

Demo

Not allowed in FunctionalScript

This is valid JavaScript, and fjs compile refuses it, by design: it is not a FunctionalScript module.

What fjs compile sample.mjs output.js prints:

sample.mjs:1:1 - error: module exports nothing
1 | export const {} = {};
  | ^

What it should print instead, pointing to what FunctionalScript allows (proposed):

sample.mjs:1:1 - error: this pattern binds no name, so the module exports nothing
1 | export const {} = {};
  | ^^^^^^ JavaScript exports no name here
  = help: export a name:
          export const a = 1;
  = note: refused by design, see spec/modules/empty-pattern-export/README.md

JavaScript source, sample.mjs:

export const {} = {};

What JavaScript answers for the same module, its default export:

undefined

What to write instead

The FunctionalScript spelling, alternative.f.js:

/**
 * The FunctionalScript spelling of [`sample.mjs`](./sample.mjs): an export that binds a name
 * ([`README.md`](./README.md)).
 *
 * @module
 */

export const a = 1;
export default a;

What fjs compile alternative.f.js output.js writes:

export const a=1;export default 1;

What it answers, its default export:

1

Emergent Testing

Idle. Press Run to start the suite.

  • ./proof.f.mjs