@plexcord-companion/global-env-parser 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,16 @@
1
+ import { AstParser } from "@plexcord-companion/ast-parser/AstParser";
2
+ import type { EnvBuildVars, JsonType, MaybeLiteralJsonType, NonLiteral } from "./types.js";
3
+ export declare class GlobalEnvParser extends AstParser {
4
+ static readonly SYM_UNSERIALIZABLE: unique symbol;
5
+ static readonly SYM_UNREADABLE_KEYS: unique symbol;
6
+ static isLiteral(value: MaybeLiteralJsonType): value is Exclude<JsonType, NonLiteral>;
7
+ static isObject(value: MaybeLiteralJsonType): value is {
8
+ [key: string]: MaybeLiteralJsonType;
9
+ };
10
+ static isSingleValue(value: MaybeLiteralJsonType): value is string | number | boolean | null;
11
+ get buildId(): string | undefined;
12
+ getGlobalEnvObject(): EnvBuildVars | undefined;
13
+ private parseLiteral;
14
+ private parseValue;
15
+ private parseObjectLiteral;
16
+ }
@@ -0,0 +1,121 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { isArrayLiteralExpression, isBigIntLiteral, isBinaryExpression, isNumericLiteral, isObjectLiteralExpression, isPropertyAssignment, isStringLiteralLike, SyntaxKind, } from "typescript";
8
+ import { AstParser } from "@plexcord-companion/ast-parser/AstParser";
9
+ import { isLiteralish } from "@plexcord-companion/ast-parser/util";
10
+ import { Cache, CacheGetter } from "@plexcord-companion/shared/decorators";
11
+ export class GlobalEnvParser extends AstParser {
12
+ static SYM_UNSERIALIZABLE = Symbol("GlobalEnvParser.unserializable");
13
+ static SYM_UNREADABLE_KEYS = Symbol("GlobalEnvParser.unreadableKeys");
14
+ static isLiteral(value) {
15
+ if (value === null || typeof value !== "object") {
16
+ return true;
17
+ }
18
+ return !(GlobalEnvParser.SYM_UNSERIALIZABLE in value);
19
+ }
20
+ static isObject(value) {
21
+ if (!GlobalEnvParser.isLiteral(value)) {
22
+ return false;
23
+ }
24
+ return typeof value === "object" && value !== null && !Array.isArray(value);
25
+ }
26
+ static isSingleValue(value) {
27
+ if (!GlobalEnvParser.isLiteral(value)) {
28
+ return false;
29
+ }
30
+ if (Array.isArray(value)) {
31
+ return false;
32
+ }
33
+ if (typeof value === "object" && value !== null) {
34
+ return false;
35
+ }
36
+ return true;
37
+ }
38
+ get buildId() {
39
+ const { SENTRY_TAGS } = this.getGlobalEnvObject() ?? {};
40
+ if (typeof SENTRY_TAGS !== "object" || !GlobalEnvParser.isObject(SENTRY_TAGS)) {
41
+ return;
42
+ }
43
+ const maybeBuildId = SENTRY_TAGS?.buildId;
44
+ if (typeof maybeBuildId !== "string") {
45
+ return;
46
+ }
47
+ return maybeBuildId;
48
+ }
49
+ getGlobalEnvObject() {
50
+ if (!this.text.includes("window.GLOBAL_ENV")) {
51
+ return undefined;
52
+ }
53
+ const expr = this.sourceFile.getChildAt(0)?.getChildAt(0)
54
+ ?.getChildAt(0);
55
+ if (!isBinaryExpression(expr)
56
+ || expr.operatorToken.kind !== SyntaxKind.EqualsToken
57
+ || !isObjectLiteralExpression(expr.right)) {
58
+ return;
59
+ }
60
+ return this.parseObjectLiteral(expr.right);
61
+ }
62
+ parseLiteral(node) {
63
+ if (isStringLiteralLike(node) || isBigIntLiteral(node)) {
64
+ return node.text;
65
+ }
66
+ else if (isNumericLiteral(node)) {
67
+ return Number(node.text);
68
+ }
69
+ throw new Error("weird unsupported literal token in globalEnv");
70
+ }
71
+ parseValue(node) {
72
+ if (isLiteralish(node)) {
73
+ return [this.parseLiteral(node), []];
74
+ }
75
+ else if (isObjectLiteralExpression(node)) {
76
+ const parsed = this.parseObjectLiteral(node);
77
+ const keys = [...parsed[GlobalEnvParser.SYM_UNREADABLE_KEYS]];
78
+ delete parsed[GlobalEnvParser.SYM_UNREADABLE_KEYS];
79
+ return [parsed, keys];
80
+ }
81
+ else if (isArrayLiteralExpression(node)) {
82
+ const parsed = node
83
+ .elements
84
+ .map(this.parseValue.bind(this))
85
+ .reduce((acc, [jsonValue, badKeys]) => {
86
+ // @ts-expect-error loses the [] from JsonType[] for some reason
87
+ acc[0].push(jsonValue);
88
+ acc[1].push(...badKeys);
89
+ return acc;
90
+ }, [[], []]);
91
+ return parsed;
92
+ }
93
+ return [
94
+ {
95
+ [GlobalEnvParser.SYM_UNSERIALIZABLE]: true,
96
+ expression: node.getText(),
97
+ },
98
+ [],
99
+ ];
100
+ }
101
+ parseObjectLiteral(expr) {
102
+ const ret = { [GlobalEnvParser.SYM_UNREADABLE_KEYS]: [] };
103
+ for (const prop of expr.properties) {
104
+ if (!prop.name || !isStringLiteralLike(prop.name) || !isPropertyAssignment(prop)) {
105
+ ret[GlobalEnvParser.SYM_UNREADABLE_KEYS].push(prop.name?.getText() ?? "<unknown>");
106
+ continue;
107
+ }
108
+ const [value, badkeys] = this.parseValue(prop.initializer);
109
+ ret[prop.name.text] = value;
110
+ ret[GlobalEnvParser.SYM_UNREADABLE_KEYS].push(...badkeys);
111
+ }
112
+ return ret;
113
+ }
114
+ }
115
+ __decorate([
116
+ CacheGetter()
117
+ ], GlobalEnvParser.prototype, "buildId", null);
118
+ __decorate([
119
+ Cache()
120
+ ], GlobalEnvParser.prototype, "getGlobalEnvObject", null);
121
+ //# sourceMappingURL=GlobalEnvParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalEnvParser.js","sourceRoot":"","sources":["../src/GlobalEnvParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { GlobalEnvParser, } from "./GlobalEnvParser.js";
2
+ export type { EnvBuildVars, JsonType, MaybeLiteralJsonType, NonLiteral, } from "./types.js";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { GlobalEnvParser, } from "./GlobalEnvParser.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,GAClB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { GlobalEnvParser } from "./GlobalEnvParser.js";
2
+ /**
3
+ * @internal
4
+ */
5
+ export interface NonLiteral {
6
+ [GlobalEnvParser.SYM_UNSERIALIZABLE]: true;
7
+ expression: string;
8
+ }
9
+ export type MaybeLiteralJsonType = JsonType | NonLiteral;
10
+ export type JsonType = string | number | boolean | null | NonLiteral | MaybeLiteralJsonType[] | {
11
+ [key: string]: MaybeLiteralJsonType;
12
+ };
13
+ export type EnvBuildVars = Record<string, JsonType> & {
14
+ [GlobalEnvParser.SYM_UNREADABLE_KEYS]: string[];
15
+ };
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@plexcord-companion/global-env-parser",
3
+ "version": "2.0.0",
4
+ "description": "",
5
+ "author": {
6
+ "name": "MutanPlex",
7
+ "url": "https://mutanplex.com"
8
+ },
9
+ "main": "index.js",
10
+ "exports": {
11
+ "./*": "./dist/*.js",
12
+ ".": "./dist/index.js"
13
+ },
14
+ "keywords": [],
15
+ "license": "LGPL-3.0-or-later",
16
+ "dependencies": {
17
+ "@plexcord-companion/shared": "2.0.0",
18
+ "@plexcord-companion/ast-parser": "2.0.0"
19
+ },
20
+ "peerDependencies": {
21
+ "ts-api-utils": "^2.1.0",
22
+ "typescript": "^5.9.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^24.6.0",
26
+ "vitest": "^3.2.4"
27
+ },
28
+ "scripts": {
29
+ "preversion": "mkdir .git || :",
30
+ "bump": "npm version",
31
+ "postversion": "rmdir .git",
32
+ "build": "tsc -b && tsc-alias -f"
33
+ }
34
+ }
@@ -0,0 +1,147 @@
1
+ import {
2
+ type Expression,
3
+ isArrayLiteralExpression,
4
+ isBigIntLiteral,
5
+ isBinaryExpression,
6
+ isNumericLiteral,
7
+ isObjectLiteralExpression,
8
+ isPropertyAssignment,
9
+ isStringLiteralLike,
10
+ type LiteralToken,
11
+ type ObjectLiteralExpression,
12
+ SyntaxKind,
13
+ } from "typescript";
14
+
15
+ import { AstParser } from "@plexcord-companion/ast-parser/AstParser";
16
+ import { isLiteralish } from "@plexcord-companion/ast-parser/util";
17
+ import { Cache, CacheGetter } from "@plexcord-companion/shared/decorators";
18
+
19
+ import type { EnvBuildVars, JsonType, MaybeLiteralJsonType, NonLiteral } from "./types";
20
+
21
+ export class GlobalEnvParser extends AstParser {
22
+ static readonly SYM_UNSERIALIZABLE: unique symbol = Symbol("GlobalEnvParser.unserializable");
23
+ static readonly SYM_UNREADABLE_KEYS: unique symbol = Symbol("GlobalEnvParser.unreadableKeys");
24
+
25
+ public static isLiteral(value: MaybeLiteralJsonType): value is Exclude<JsonType, NonLiteral> {
26
+ if (value === null || typeof value !== "object") {
27
+ return true;
28
+ }
29
+ return !(GlobalEnvParser.SYM_UNSERIALIZABLE in value);
30
+ }
31
+
32
+ public static isObject(value: MaybeLiteralJsonType): value is { [key: string]: MaybeLiteralJsonType; } {
33
+ if (!GlobalEnvParser.isLiteral(value)) {
34
+ return false;
35
+ }
36
+ return typeof value === "object" && value !== null && !Array.isArray(value);
37
+ }
38
+
39
+ public static isSingleValue(value: MaybeLiteralJsonType): value is string | number | boolean | null {
40
+ if (!GlobalEnvParser.isLiteral(value)) {
41
+ return false;
42
+ }
43
+ if (Array.isArray(value)) {
44
+ return false;
45
+ }
46
+ if (typeof value === "object" && value !== null) {
47
+ return false;
48
+ }
49
+ return true;
50
+ }
51
+
52
+ @CacheGetter()
53
+ public get buildId(): string | undefined {
54
+ const { SENTRY_TAGS } = this.getGlobalEnvObject() ?? {} as EnvBuildVars;
55
+
56
+ if (typeof SENTRY_TAGS !== "object" || !GlobalEnvParser.isObject(SENTRY_TAGS)) {
57
+ return;
58
+ }
59
+
60
+ const maybeBuildId = SENTRY_TAGS?.buildId;
61
+
62
+ if (typeof maybeBuildId !== "string") {
63
+ return;
64
+ }
65
+ return maybeBuildId;
66
+ }
67
+
68
+ @Cache()
69
+ public getGlobalEnvObject(): EnvBuildVars | undefined {
70
+ if (!this.text.includes("window.GLOBAL_ENV")) {
71
+ return undefined;
72
+ }
73
+
74
+ const expr = this.sourceFile.getChildAt(0)?.getChildAt(0)
75
+ ?.getChildAt(0);
76
+
77
+ if (
78
+ !isBinaryExpression(expr)
79
+ || expr.operatorToken.kind !== SyntaxKind.EqualsToken
80
+ || !isObjectLiteralExpression(expr.right)
81
+ ) {
82
+ return;
83
+ }
84
+
85
+ return this.parseObjectLiteral(expr.right);
86
+ }
87
+
88
+ private parseLiteral(node: LiteralToken) {
89
+ if (isStringLiteralLike(node) || isBigIntLiteral(node)) {
90
+ return node.text;
91
+ } else if (isNumericLiteral(node)) {
92
+ return Number(node.text);
93
+ }
94
+ throw new Error("weird unsupported literal token in globalEnv");
95
+ }
96
+
97
+ private parseValue(node: Expression): [JsonType, string[]] {
98
+ if (isLiteralish(node)) {
99
+ return [this.parseLiteral(node), []];
100
+ } else if (isObjectLiteralExpression(node)) {
101
+ const parsed: Omit<EnvBuildVars, typeof GlobalEnvParser.SYM_UNREADABLE_KEYS>
102
+ = this.parseObjectLiteral(node);
103
+
104
+ const keys = [...(parsed as any)[GlobalEnvParser.SYM_UNREADABLE_KEYS]];
105
+
106
+ delete (parsed as any)[GlobalEnvParser.SYM_UNREADABLE_KEYS];
107
+
108
+ return [parsed, keys];
109
+ } else if (isArrayLiteralExpression(node)) {
110
+ const parsed = node
111
+ .elements
112
+ .map(this.parseValue.bind(this))
113
+ .reduce((acc, [jsonValue, badKeys]) => {
114
+ // @ts-expect-error loses the [] from JsonType[] for some reason
115
+ acc[0].push(jsonValue);
116
+ acc[1].push(...badKeys);
117
+ return acc;
118
+ }, [[], []] as [JsonType[], string[]]);
119
+
120
+ return parsed;
121
+ }
122
+ return [
123
+ {
124
+ [GlobalEnvParser.SYM_UNSERIALIZABLE]: true,
125
+ expression: node.getText(),
126
+ },
127
+ [],
128
+ ];
129
+ }
130
+
131
+ private parseObjectLiteral(expr: ObjectLiteralExpression): EnvBuildVars {
132
+ const ret: EnvBuildVars = { [GlobalEnvParser.SYM_UNREADABLE_KEYS]: [] };
133
+
134
+ for (const prop of expr.properties) {
135
+ if (!prop.name || !isStringLiteralLike(prop.name) || !isPropertyAssignment(prop)) {
136
+ ret[GlobalEnvParser.SYM_UNREADABLE_KEYS].push(prop.name?.getText() ?? "<unknown>");
137
+ continue;
138
+ }
139
+
140
+ const [value, badkeys] = this.parseValue(prop.initializer);
141
+
142
+ ret[prop.name.text] = value;
143
+ ret[GlobalEnvParser.SYM_UNREADABLE_KEYS].push(...badkeys);
144
+ }
145
+ return ret;
146
+ }
147
+ }
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+ export {
2
+ GlobalEnvParser,
3
+ } from "./GlobalEnvParser";
4
+ export type {
5
+ EnvBuildVars,
6
+ JsonType,
7
+ MaybeLiteralJsonType,
8
+ NonLiteral,
9
+ } from "./types";
package/src/types.ts ADDED
@@ -0,0 +1,21 @@
1
+ import type { GlobalEnvParser } from "./GlobalEnvParser";
2
+
3
+ /**
4
+ * @internal
5
+ */
6
+ export interface NonLiteral {
7
+ [GlobalEnvParser.SYM_UNSERIALIZABLE]: true;
8
+ expression: string;
9
+ }
10
+
11
+ export type MaybeLiteralJsonType = JsonType | NonLiteral;
12
+ export type JsonType
13
+ = | string
14
+ | number
15
+ | boolean
16
+ | null
17
+ | NonLiteral
18
+ | MaybeLiteralJsonType[]
19
+ | { [key: string]: MaybeLiteralJsonType; };
20
+
21
+ export type EnvBuildVars = Record<string, JsonType> & { [GlobalEnvParser.SYM_UNREADABLE_KEYS]: string[]; };