summaryrefslogtreecommitdiff
path: root/node_modules/terser/lib/compress/global-defs.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-11-05 17:16:09 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-11-05 17:16:09 +0800
commitd1d9f00b1bd660842addf5e6b1d1b64c852a9eea (patch)
tree60fb37ae73a1109d95301de5ec9b61b5726a4b61 /node_modules/terser/lib/compress/global-defs.js
parent7c85166c4cbdd862fc4252007d2df5befcbc2a58 (diff)
added hover prefixer
Diffstat (limited to 'node_modules/terser/lib/compress/global-defs.js')
-rw-r--r--node_modules/terser/lib/compress/global-defs.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/node_modules/terser/lib/compress/global-defs.js b/node_modules/terser/lib/compress/global-defs.js
new file mode 100644
index 00000000..e9eb7f5e
--- /dev/null
+++ b/node_modules/terser/lib/compress/global-defs.js
@@ -0,0 +1,92 @@
+import {
+ AST_Array,
+ AST_Chain,
+ AST_Constant,
+ AST_Dot,
+ AST_ImportMeta,
+ AST_Node,
+ AST_Object,
+ AST_ObjectKeyVal,
+ AST_PropAccess,
+ AST_SymbolDeclaration,
+ AST_SymbolRef,
+ AST_Toplevel,
+ TreeTransformer,
+} from "../ast.js";
+import { make_node, noop, HOP } from "../utils/index.js";
+import { make_node_from_constant } from "./common.js";
+import { is_lhs } from "./inference.js";
+
+(function(def_find_defs) {
+ function to_node(value, orig) {
+ if (value instanceof AST_Node) {
+ if (!(value instanceof AST_Constant)) {
+ // Value may be a function, an array including functions and even a complex assign / block expression,
+ // so it should never be shared in different places.
+ // Otherwise wrong information may be used in the compression phase
+ value = value.clone(true);
+ }
+ return make_node(value.CTOR, orig, value);
+ }
+ if (Array.isArray(value)) return make_node(AST_Array, orig, {
+ elements: value.map(function(value) {
+ return to_node(value, orig);
+ })
+ });
+ if (value && typeof value == "object") {
+ var props = [];
+ for (var key in value) if (HOP(value, key)) {
+ props.push(make_node(AST_ObjectKeyVal, orig, {
+ key: key,
+ value: to_node(value[key], orig)
+ }));
+ }
+ return make_node(AST_Object, orig, {
+ properties: props
+ });
+ }
+ return make_node_from_constant(value, orig);
+ }
+
+ AST_Toplevel.DEFMETHOD("resolve_defines", function(compressor) {
+ if (!compressor.option("global_defs")) return this;
+ this.figure_out_scope({ ie8: compressor.option("ie8") });
+ return this.transform(new TreeTransformer(function(node) {
+ var def = node._find_defs(compressor, "");
+ if (!def) return;
+ var level = 0, child = node, parent;
+ while (parent = this.parent(level++)) {
+ if (!(parent instanceof AST_PropAccess)) break;
+ if (parent.expression !== child) break;
+ child = parent;
+ }
+ if (is_lhs(child, parent)) {
+ return;
+ }
+ return def;
+ }));
+ });
+ def_find_defs(AST_Node, noop);
+ def_find_defs(AST_Chain, function(compressor, suffix) {
+ return this.expression._find_defs(compressor, suffix);
+ });
+ def_find_defs(AST_Dot, function(compressor, suffix) {
+ return this.expression._find_defs(compressor, "." + this.property + suffix);
+ });
+ def_find_defs(AST_SymbolDeclaration, function() {
+ if (!this.global()) return;
+ });
+ def_find_defs(AST_SymbolRef, function(compressor, suffix) {
+ if (!this.global()) return;
+ var defines = compressor.option("global_defs");
+ var name = this.name + suffix;
+ if (HOP(defines, name)) return to_node(defines[name], this);
+ });
+ def_find_defs(AST_ImportMeta, function(compressor, suffix) {
+ var defines = compressor.option("global_defs");
+ var name = "import.meta" + suffix;
+ if (HOP(defines, name)) return to_node(defines[name], this);
+ });
+})(function(node, func) {
+ node.DEFMETHOD("_find_defs", func);
+});