]> git.kaiwu.me - njs.git/commitdiff
Added support for export {name as default} statement.
authorVadim Zhestikov <v.zhestikov@f5.com>
Tue, 21 Mar 2023 04:09:58 +0000 (21:09 -0700)
committerVadim Zhestikov <v.zhestikov@f5.com>
Tue, 21 Mar 2023 04:09:58 +0000 (21:09 -0700)
This fixes #624 issue on Github.

src/njs_parser.c
test/js/import_as_default.t.js [new file with mode: 0644]
test/js/import_as_default_compare.t.js [new file with mode: 0644]
test/js/import_as_default_double.t.js [new file with mode: 0644]
test/js/module/lib4.js [new file with mode: 0644]
test/js/module/lib5.js [new file with mode: 0644]
test/js/module/lib6-1.js [new file with mode: 0644]
test/js/module/lib6.js [new file with mode: 0644]

index 754aa784cb791a577a5047c7abd0a4af5709534b..f5f3b62617423b388ed3c1bd4c4d071776ac99de 100644 (file)
@@ -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 (file)
index 0000000..b200adc
--- /dev/null
@@ -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 (file)
index 0000000..5dde318
--- /dev/null
@@ -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 (file)
index 0000000..2d01141
--- /dev/null
@@ -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 (file)
index 0000000..2f67601
--- /dev/null
@@ -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 (file)
index 0000000..8a0598e
--- /dev/null
@@ -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 (file)
index 0000000..a235a23
--- /dev/null
@@ -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 (file)
index 0000000..5c356f4
--- /dev/null
@@ -0,0 +1,6 @@
+var obj = {
+  a:1,
+  b:2
+}
+
+export {obj as default};