Welcome! Log In Create A New Profile

Advanced

[njs] Added support for export {name as default} statement.

Vadim Zhestikov via nginx-devel
March 21, 2023 12:18AM
details: https://hg.nginx.org/njs/rev/fbd36220ea17
branches:
changeset: 2073:fbd36220ea17
user: Vadim Zhestikov <v.zhestikov@f5.com>
date: Mon Mar 20 21:09:58 2023 -0700
description:
Added support for export {name as default} statement.

This fixes #624 issue on Github.

diffstat:

src/njs_parser.c | 78 +++++++++++++++++++++++++++++++++-
test/js/import_as_default.t.js | 9 +++
test/js/import_as_default_compare.t.js | 14 ++++++
test/js/import_as_default_double.t.js | 9 +++
test/js/module/lib4.js | 2 +
test/js/module/lib5.js | 6 ++
test/js/module/lib6-1.js | 6 ++
test/js/module/lib6.js | 6 ++
8 files changed, 128 insertions(+), 2 deletions(-)

diffs (175 lines):

diff -r 95f57822bdaa -r fbd36220ea17 src/njs_parser.c
--- a/src/njs_parser.c Fri Mar 10 14:15:29 2023 -0800
+++ b/src/njs_parser.c Mon Mar 20 21:09:58 2023 -0700
@@ -7973,6 +7973,9 @@ njs_parser_export(njs_parser_t *parser,
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,
}

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 -r 95f57822bdaa -r fbd36220ea17 test/js/import_as_default.t.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/js/import_as_default.t.js Mon Mar 20 21:09:58 2023 -0700
@@ -0,0 +1,9 @@
+/*---
+includes: []
+flags: []
+paths: [test/js/module/]
+---*/
+
+import imp from 'lib4.js';
+
+assert.sameValue(imp, 10);
diff -r 95f57822bdaa -r fbd36220ea17 test/js/import_as_default_compare.t.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/js/import_as_default_compare.t.js Mon Mar 20 21:09:58 2023 -0700
@@ -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 -r 95f57822bdaa -r fbd36220ea17 test/js/import_as_default_double.t.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/js/import_as_default_double.t.js Mon Mar 20 21:09:58 2023 -0700
@@ -0,0 +1,9 @@
+/*---
+includes: []
+flags: []
+paths: [test/js/module]
+negative:
+ phase: runtime
+---*/
+
+import m from 'lib5.js';
diff -r 95f57822bdaa -r fbd36220ea17 test/js/module/lib4.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/js/module/lib4.js Mon Mar 20 21:09:58 2023 -0700
@@ -0,0 +1,2 @@
+var var10 = 10;
+export { var10 as default };
diff -r 95f57822bdaa -r fbd36220ea17 test/js/module/lib5.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/js/module/lib5.js Mon Mar 20 21:09:58 2023 -0700
@@ -0,0 +1,6 @@
+var uu = 10;
+var uu1 = 11;
+
+export { uu as default };
+
+export { uu1 as default };
diff -r 95f57822bdaa -r fbd36220ea17 test/js/module/lib6-1.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/js/module/lib6-1.js Mon Mar 20 21:09:58 2023 -0700
@@ -0,0 +1,6 @@
+var obj = {
+ a:1,
+ b:2
+}
+
+export default obj;
diff -r 95f57822bdaa -r fbd36220ea17 test/js/module/lib6.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/js/module/lib6.js Mon Mar 20 21:09:58 2023 -0700
@@ -0,0 +1,6 @@
+var obj = {
+ a:1,
+ b:2
+}
+
+export {obj as default};
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Added support for export {name as default} statement.

Vadim Zhestikov via nginx-devel 636 March 21, 2023 12:18AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 109
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready