Skip to content

Commit

Permalink
Added support for export {name as default} statement.
Browse files Browse the repository at this point in the history
This fixes #624 issue on Github.
  • Loading branch information
VadimZhestikov committed Mar 21, 2023
1 parent 07bea68 commit eb87e24
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 2 deletions.
78 changes: 76 additions & 2 deletions src/njs_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -7973,15 +7973,89 @@ njs_parser_export(njs_parser_t *parser, njs_lexer_token_t *token,
njs_queue_link_t *current)
{
njs_parser_node_t *node;
njs_lexer_token_t *peek;

static const njs_str_t as_string = njs_str("as");

if (!parser->module) {
njs_parser_syntax_error(parser, "Illegal export statement");
return NJS_DONE;
}

if (token->type != NJS_TOKEN_DEFAULT) {
njs_parser_syntax_error(parser, "Non-default export is not supported");
return NJS_DONE;

if (token->type != NJS_TOKEN_OPEN_BRACE) {
njs_parser_syntax_error(parser,
"Non-default export is not supported");
return NJS_DONE;
}

/*
* 'export {'
* supported only: export {identifier as default};
*/

njs_lexer_consume_token(parser->lexer, 1);

token = njs_lexer_token(parser->lexer, 0);
if (njs_slow_path(token == NULL)) {
return NJS_ERROR;
}

if (token->type != NJS_TOKEN_NAME) {
njs_parser_syntax_error(parser, "Identifier expected");
return NJS_DONE;
}

peek = njs_lexer_peek_token(parser->lexer, token, 0);
if (njs_slow_path(peek == NULL)) {
return NJS_ERROR;
}

if (peek->type != NJS_TOKEN_NAME ||
!njs_strstr_eq(&peek->text, &as_string))
{
njs_parser_syntax_error(parser, "'as' expected");
return NJS_DONE;
}

peek = njs_lexer_peek_token(parser->lexer, peek, 0);
if (njs_slow_path(peek == NULL)) {
return NJS_ERROR;
}

if (peek->type != NJS_TOKEN_DEFAULT) {
njs_parser_syntax_error(parser,
"Non-default export is not supported");
return NJS_DONE;
}

peek = njs_lexer_peek_token(parser->lexer, peek, 1);
if (njs_slow_path(token == NULL)) {
return NJS_ERROR;
}

if (peek->type != NJS_TOKEN_CLOSE_BRACE) {
njs_parser_syntax_error(parser, "Close brace is expected");
return NJS_DONE;
}

node = njs_parser_node_new(parser, NJS_TOKEN_EXPORT);
if (node == NULL) {
return NJS_ERROR;
}

node->token_line = parser->line;
node->right = njs_parser_reference(parser, token);
if (node->right == NULL) {
return NJS_ERROR;
}

parser->node = node;

njs_lexer_consume_token(parser->lexer, 4);

return njs_parser_stack_pop(parser);
}

njs_lexer_consume_token(parser->lexer, 1);
Expand Down
9 changes: 9 additions & 0 deletions test/js/import_as_default.t.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/*---
includes: []
flags: []
paths: [test/js/module/]
---*/

import imp from 'lib4.js';

assert.sameValue(imp, 10);
14 changes: 14 additions & 0 deletions test/js/import_as_default_compare.t.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*---
includes: []
flags: []
paths: [test/js/module]
---*/

import a from 'lib6.js';
import b from 'lib6-1.js';

assert.sameValue(a.a, 1);
assert.sameValue(a.b, 2);

assert.sameValue(a.a, b.a);
assert.sameValue(a.b, b.b);
9 changes: 9 additions & 0 deletions test/js/import_as_default_double.t.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/*---
includes: []
flags: []
paths: [test/js/module]
negative:
phase: runtime
---*/

import m from 'lib5.js';
2 changes: 2 additions & 0 deletions test/js/module/lib4.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
var var10 = 10;
export { var10 as default };
6 changes: 6 additions & 0 deletions test/js/module/lib5.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
var uu = 10;
var uu1 = 11;

export { uu as default };

export { uu1 as default };
6 changes: 6 additions & 0 deletions test/js/module/lib6-1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
var obj = {
a:1,
b:2
}

export default obj;
6 changes: 6 additions & 0 deletions test/js/module/lib6.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
var obj = {
a:1,
b:2
}

export {obj as default};

0 comments on commit eb87e24

Please sign in to comment.