From: Vadim Zhestikov Date: Tue, 21 Mar 2023 04:09:58 +0000 (-0700) Subject: Added support for export {name as default} statement. X-Git-Tag: 0.7.12~9 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/postgres_fdw.c?a=commitdiff_plain;h=eb87e24974775274d254ad81e060f415067be92d;p=njs.git Added support for export {name as default} statement. This fixes #624 issue on Github. --- diff --git a/src/njs_parser.c b/src/njs_parser.c index 754aa784..f5f3b626 100644 --- a/src/njs_parser.c +++ b/src/njs_parser.c @@ -7973,6 +7973,9 @@ 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"); @@ -7980,8 +7983,79 @@ njs_parser_export(njs_parser_t *parser, njs_lexer_token_t *token, } 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); diff --git a/test/js/import_as_default.t.js b/test/js/import_as_default.t.js new file mode 100644 index 00000000..b200adcb --- /dev/null +++ b/test/js/import_as_default.t.js @@ -0,0 +1,9 @@ +/*--- +includes: [] +flags: [] +paths: [test/js/module/] +---*/ + +import imp from 'lib4.js'; + +assert.sameValue(imp, 10); diff --git a/test/js/import_as_default_compare.t.js b/test/js/import_as_default_compare.t.js new file mode 100644 index 00000000..5dde3184 --- /dev/null +++ b/test/js/import_as_default_compare.t.js @@ -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); diff --git a/test/js/import_as_default_double.t.js b/test/js/import_as_default_double.t.js new file mode 100644 index 00000000..2d011419 --- /dev/null +++ b/test/js/import_as_default_double.t.js @@ -0,0 +1,9 @@ +/*--- +includes: [] +flags: [] +paths: [test/js/module] +negative: + phase: runtime +---*/ + +import m from 'lib5.js'; diff --git a/test/js/module/lib4.js b/test/js/module/lib4.js new file mode 100644 index 00000000..2f67601f --- /dev/null +++ b/test/js/module/lib4.js @@ -0,0 +1,2 @@ +var var10 = 10; +export { var10 as default }; diff --git a/test/js/module/lib5.js b/test/js/module/lib5.js new file mode 100644 index 00000000..8a0598e4 --- /dev/null +++ b/test/js/module/lib5.js @@ -0,0 +1,6 @@ +var uu = 10; +var uu1 = 11; + +export { uu as default }; + +export { uu1 as default }; diff --git a/test/js/module/lib6-1.js b/test/js/module/lib6-1.js new file mode 100644 index 00000000..a235a23a --- /dev/null +++ b/test/js/module/lib6-1.js @@ -0,0 +1,6 @@ +var obj = { + a:1, + b:2 +} + +export default obj; diff --git a/test/js/module/lib6.js b/test/js/module/lib6.js new file mode 100644 index 00000000..5c356f44 --- /dev/null +++ b/test/js/module/lib6.js @@ -0,0 +1,6 @@ +var obj = { + a:1, + b:2 +} + +export {obj as default};