@vencord-companion/webpack-chunk-parser 1.0.0 → 1.0.2

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.
package/dist/index.d.ts CHANGED
@@ -0,0 +1,4 @@
1
+ export type { JSHashEntry, ModuleEntry, } from "./types";
2
+ export { WebpackChunkParser, } from "./WebpackChunkParser";
3
+ export { WebpackLazyChunkParser, } from "./WebpackLazyChunkParser";
4
+ export { WebpackMainChunkParser, } from "./WebpackMainChunkParser";
package/dist/index.js CHANGED
@@ -1,2 +1,4 @@
1
- "use strict";
1
+ export { WebpackChunkParser, } from "./WebpackChunkParser";
2
+ export { WebpackLazyChunkParser, } from "./WebpackLazyChunkParser";
3
+ export { WebpackMainChunkParser, } from "./WebpackMainChunkParser";
2
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,kBAAkB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,sBAAsB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,sBAAsB,GACzB,MAAM,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vencord-companion/webpack-chunk-parser",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "",
5
5
  "author": {
6
6
  "name": "sadan",
@@ -14,8 +14,8 @@
14
14
  "keywords": [],
15
15
  "license": "LGPL-3.0-or-later",
16
16
  "dependencies": {
17
- "@vencord-companion/ast-parser": "1.0.0",
18
- "@vencord-companion/shared": "1.0.0"
17
+ "@vencord-companion/ast-parser": "1.0.2",
18
+ "@vencord-companion/shared": "1.0.2"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "ts-api-utils": "^2.1.0",
@@ -1,7 +0,0 @@
1
- import { type ObjectLiteralExpression } from "typescript";
2
- import { AstParser } from "@vencord-companion/ast-parser";
3
- export declare abstract class ChunkParser extends AstParser {
4
- abstract getModuleObject(): ObjectLiteralExpression | undefined;
5
- private tryParseChunkEntry;
6
- getDefinedModules(): Record<string, string> | undefined;
7
- }
@@ -1,41 +0,0 @@
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 { isPropertyAssignment } from "typescript";
8
- import { AstParser, isFunctionish, nonNull, tryParseStringOrNumberLiteral } from "@vencord-companion/ast-parser";
9
- import { Cache } from "@vencord-companion/shared/decorators";
10
- function fromEntries(obj, [k, v], _idx, _arr) {
11
- obj[k] = v;
12
- return obj;
13
- }
14
- export class ChunkParser extends AstParser {
15
- tryParseChunkEntry(entry) {
16
- if (!isPropertyAssignment(entry)) {
17
- return;
18
- }
19
- const moduleId = tryParseStringOrNumberLiteral(entry.name);
20
- if (!moduleId) {
21
- return;
22
- }
23
- const moduleValue = entry.initializer;
24
- if (!isFunctionish(moduleValue)) {
25
- return;
26
- }
27
- return [moduleId, moduleValue.getText()];
28
- }
29
- getDefinedModules() {
30
- return this
31
- .getModuleObject()
32
- ?.properties
33
- .map(this.tryParseChunkEntry.bind(this))
34
- .filter(nonNull)
35
- .reduce((fromEntries), {});
36
- }
37
- }
38
- __decorate([
39
- Cache()
40
- ], ChunkParser.prototype, "getDefinedModules", null);
41
- //# sourceMappingURL=ChunkParser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChunkParser.js","sourceRoot":"","sources":["../src/ChunkParser.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,oBAAoB,EAA+D,MAAM,YAAY,CAAC;AAE/G,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACjH,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAI7D,SAAS,WAAW,CAGlB,GAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,CAA2B,EAAE,IAAY,EAAE,IAAuB;IACxF,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,OAAgB,WAAY,SAAQ,SAAS;IAGvC,kBAAkB,CAAC,KAA+B;QACtD,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,6BAA6B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO;QACX,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAEtC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAGM,iBAAiB;QACpB,OAAO,IAAI;aACN,eAAe,EAAE;YAClB,EAAE,UAAU;aACX,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACvC,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,CAAA,WAA2B,CAAA,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;CACJ;AARU;IADN,KAAK,EAAE;oDAQP"}
@@ -1,8 +0,0 @@
1
- import { type ObjectLiteralExpression } from "typescript";
2
- import { ChunkParser } from "./ChunkParser";
3
- export declare class LazyChunkParser extends ChunkParser {
4
- private get pushCall();
5
- private assertOneEntry;
6
- getModuleObject(): ObjectLiteralExpression | undefined;
7
- get chunkId(): string | undefined;
8
- }
@@ -1,85 +0,0 @@
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, isCallExpression, isExpressionStatement, isObjectLiteralExpression, isPropertyAccessExpression } from "typescript";
8
- import { isDirective, tryParseStringOrNumberLiteral } from "@vencord-companion/ast-parser/util";
9
- import { Cache, CacheGetter } from "@vencord-companion/shared/decorators";
10
- import { ChunkParser } from "./ChunkParser";
11
- export class LazyChunkParser extends ChunkParser {
12
- get pushCall() {
13
- const topLevelStatements = this.sourceFile.statements.filter((stmt) => !isDirective(stmt));
14
- // we only expect one top-level statement
15
- if (topLevelStatements.length !== 1) {
16
- return;
17
- }
18
- const [stmt] = topLevelStatements;
19
- if (!isExpressionStatement(stmt)) {
20
- return;
21
- }
22
- const call = stmt.expression;
23
- if (!isCallExpression(call)) {
24
- return;
25
- }
26
- const { arguments: args, expression: funcExpr } = call;
27
- // ensure push call
28
- {
29
- if (!isPropertyAccessExpression(funcExpr)) {
30
- return;
31
- }
32
- const { expression: _pushToGlobal, name: pushIdent } = funcExpr;
33
- if (!pushIdent) {
34
- return;
35
- }
36
- if (pushIdent.text !== "push") {
37
- return;
38
- }
39
- }
40
- if (args.length !== 1) {
41
- return;
42
- }
43
- return call;
44
- }
45
- assertOneEntry() {
46
- const [arg] = this.pushCall?.arguments ?? [];
47
- if (!arg || !isArrayLiteralExpression(arg)) {
48
- return;
49
- }
50
- const { elements } = arg;
51
- if (elements.length !== 2) {
52
- return;
53
- }
54
- const [idTuple, modulesObject] = elements;
55
- return [idTuple, modulesObject];
56
- }
57
- getModuleObject() {
58
- const [, modulesArg] = this.assertOneEntry() ?? [];
59
- if (!modulesArg || !isObjectLiteralExpression(modulesArg)) {
60
- return;
61
- }
62
- return modulesArg;
63
- }
64
- get chunkId() {
65
- const [idTuple] = this.assertOneEntry() ?? [];
66
- if (!idTuple || !isArrayLiteralExpression(idTuple)) {
67
- return;
68
- }
69
- const { elements: [idExpr] } = idTuple;
70
- return tryParseStringOrNumberLiteral(idExpr);
71
- }
72
- }
73
- __decorate([
74
- CacheGetter()
75
- ], LazyChunkParser.prototype, "pushCall", null);
76
- __decorate([
77
- Cache()
78
- ], LazyChunkParser.prototype, "assertOneEntry", null);
79
- __decorate([
80
- Cache()
81
- ], LazyChunkParser.prototype, "getModuleObject", null);
82
- __decorate([
83
- CacheGetter()
84
- ], LazyChunkParser.prototype, "chunkId", null);
85
- //# sourceMappingURL=LazyChunkParser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LazyChunkParser.js","sourceRoot":"","sources":["../src/LazyChunkParser.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { VariableInfo } from "ts-api-utils";
2
- import { type ObjectLiteralExpression, type PropertyName } from "typescript";
3
- import { ChunkParser } from "./ChunkParser";
4
- import type { JSHashEntry } from "./types";
5
- export declare class MainChunkParser extends ChunkParser {
6
- get __webpack_require__(): VariableInfo | undefined;
7
- get __webpack_modules__(): VariableInfo | undefined;
8
- getJsChunkHashes(): JSHashEntry[];
9
- getBuildNumber(): string | undefined;
10
- protected tryParseHashMapKey(node: PropertyName): string | undefined;
11
- private tryParseHashMapValue;
12
- private parseHashMapEntry;
13
- getModuleObject(): ObjectLiteralExpression | undefined;
14
- }
@@ -1,149 +0,0 @@
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 { isArrowFunction, isElementAccessExpression, isObjectLiteralExpression, isPropertyAccessExpression, isPropertyAssignment, isStringLiteralLike, isVariableDeclaration } from "typescript";
8
- import { findParent, isAssignmentExpression, isBinaryPlusExpression, isFunctionish, lastChild, nonNull, tryParseStringOrNumberLiteral } from "@vencord-companion/ast-parser/util";
9
- import { Cache, CacheGetter } from "@vencord-companion/shared/decorators";
10
- import { ChunkParser } from "./ChunkParser";
11
- const BUILD_MODULE_REGEX = /Trying to open a changelog for an invalid build number/;
12
- const BUILD_NUMBER_REGEX = /parseInt\("(\d+?)"\)/;
13
- const KNOWN_BUILD_MODULE_IDS = Object.freeze(["128014"]);
14
- export class MainChunkParser extends ChunkParser {
15
- get __webpack_require__() {
16
- for (const [ident, info] of this.vars) {
17
- if (ident.text === "__webpack_require__") {
18
- return info;
19
- }
20
- }
21
- }
22
- get __webpack_modules__() {
23
- for (const [ident, info] of this.vars) {
24
- if (ident.text === "__webpack_modules__") {
25
- return info;
26
- }
27
- }
28
- }
29
- getJsChunkHashes() {
30
- const uses = this.__webpack_require__?.uses;
31
- if (!uses) {
32
- return [];
33
- }
34
- let uFunc;
35
- foundU: {
36
- for (const { location: { parent } } of uses) {
37
- if (!isPropertyAccessExpression(parent)) {
38
- continue;
39
- }
40
- // webpack js chunk name->id function
41
- if (parent.name.text !== "u") {
42
- continue;
43
- }
44
- const maybeAssign = parent.parent;
45
- if (!isAssignmentExpression(maybeAssign) || !isFunctionish(maybeAssign.right)) {
46
- continue;
47
- }
48
- uFunc = maybeAssign.right;
49
- break foundU;
50
- }
51
- return [];
52
- }
53
- if (!isArrowFunction(uFunc)) {
54
- return [];
55
- }
56
- const { body: ret } = uFunc;
57
- // expect body to be BinExp>[BinExp>["" + {id:hash}[id]] + ".js"]
58
- if (!isBinaryPlusExpression(ret)) {
59
- return [];
60
- }
61
- const { left: concatWithHashMap } = ret;
62
- if (!isBinaryPlusExpression(concatWithHashMap)) {
63
- return [];
64
- }
65
- // {id:hash}[id]
66
- const { right: hashMapAccess } = concatWithHashMap;
67
- if (!isElementAccessExpression(hashMapAccess)) {
68
- return [];
69
- }
70
- const hashMap = lastChild(hashMapAccess.expression, isObjectLiteralExpression);
71
- if (!hashMap) {
72
- return [];
73
- }
74
- return hashMap
75
- .properties
76
- .map(this.parseHashMapEntry.bind(this))
77
- .filter(nonNull);
78
- }
79
- getBuildNumber() {
80
- const m = this.getDefinedModules();
81
- if (!m) {
82
- return;
83
- }
84
- for (const maybeId of KNOWN_BUILD_MODULE_IDS) {
85
- const moduleText = m[maybeId];
86
- if (BUILD_MODULE_REGEX.test(moduleText)) {
87
- const [, id] = BUILD_NUMBER_REGEX.exec(moduleText) ?? [];
88
- if (!id) {
89
- return;
90
- }
91
- return id;
92
- }
93
- }
94
- }
95
- tryParseHashMapKey(node) {
96
- return tryParseStringOrNumberLiteral(node);
97
- }
98
- tryParseHashMapValue(node) {
99
- if (!isStringLiteralLike(node)) {
100
- return;
101
- }
102
- return node.text;
103
- }
104
- parseHashMapEntry(node) {
105
- if (!isPropertyAssignment(node)) {
106
- return;
107
- }
108
- const id = this.tryParseHashMapKey(node.name);
109
- if (!id) {
110
- return;
111
- }
112
- const hash = this.tryParseHashMapValue(node.initializer);
113
- if (!hash) {
114
- return;
115
- }
116
- return [id, hash];
117
- }
118
- getModuleObject() {
119
- const wpModules = this.__webpack_modules__;
120
- if (!wpModules) {
121
- return;
122
- }
123
- const { declarations } = wpModules;
124
- if (declarations.length !== 1) {
125
- return;
126
- }
127
- const wpModulesDecl = findParent(declarations[0], isVariableDeclaration)?.initializer;
128
- if (!wpModulesDecl || !isObjectLiteralExpression(wpModulesDecl)) {
129
- return;
130
- }
131
- return wpModulesDecl;
132
- }
133
- }
134
- __decorate([
135
- CacheGetter()
136
- ], MainChunkParser.prototype, "__webpack_require__", null);
137
- __decorate([
138
- CacheGetter()
139
- ], MainChunkParser.prototype, "__webpack_modules__", null);
140
- __decorate([
141
- Cache()
142
- ], MainChunkParser.prototype, "getJsChunkHashes", null);
143
- __decorate([
144
- Cache()
145
- ], MainChunkParser.prototype, "getBuildNumber", null);
146
- __decorate([
147
- Cache()
148
- ], MainChunkParser.prototype, "getModuleObject", null);
149
- //# sourceMappingURL=MainChunkParser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MainChunkParser.js","sourceRoot":"","sources":["../src/MainChunkParser.ts"],"names":[],"mappings":"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"}