@ue-shed/config-explorer 0.2.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 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAmB,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA2F3F,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;CACxB,GAAG,gBAAgB,CA4FnB;AAED,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;CACxB,GAAG,OAAO,CAsCV"}
package/dist/parser.js ADDED
@@ -0,0 +1,215 @@
1
+ const OPERATIONS = {
2
+ "": "set",
3
+ "+": "add_unique",
4
+ ".": "append",
5
+ "-": "remove",
6
+ "!": "clear",
7
+ "^": "initialize_empty"
8
+ };
9
+ function equalsConfigName(left, right) {
10
+ return left.toLowerCase() === right.toLowerCase();
11
+ }
12
+ function quotedValue(input) {
13
+ if (!input.startsWith('"'))
14
+ return { value: input, malformed: false };
15
+ let value = "";
16
+ let escaped = false;
17
+ for (let index = 1; index < input.length; index++) {
18
+ const character = input[index];
19
+ if (escaped) {
20
+ value +=
21
+ character === "n"
22
+ ? "\n"
23
+ : character === "r"
24
+ ? "\r"
25
+ : character === "t"
26
+ ? "\t"
27
+ : character;
28
+ escaped = false;
29
+ continue;
30
+ }
31
+ if (character === "\\") {
32
+ escaped = true;
33
+ continue;
34
+ }
35
+ if (character === '"') {
36
+ const trailing = input.slice(index + 1).trim();
37
+ return { value, malformed: trailing !== "" && !trailing.startsWith("//") };
38
+ }
39
+ value += character;
40
+ }
41
+ return { malformed: true };
42
+ }
43
+ function withoutDoubleSlashComment(input) {
44
+ let quoted = false;
45
+ let escaped = false;
46
+ for (let index = 0; index < input.length - 1; index++) {
47
+ const character = input[index];
48
+ if (escaped) {
49
+ escaped = false;
50
+ continue;
51
+ }
52
+ if (character === "\\" && quoted) {
53
+ escaped = true;
54
+ continue;
55
+ }
56
+ if (character === '"')
57
+ quoted = !quoted;
58
+ if (!quoted && character === "/" && input[index + 1] === "/") {
59
+ return input.slice(0, index).trimEnd();
60
+ }
61
+ }
62
+ return input;
63
+ }
64
+ function curlyDepth(input) {
65
+ let depth = 0;
66
+ let quoted = false;
67
+ let escaped = false;
68
+ for (const character of withoutDoubleSlashComment(input)) {
69
+ if (escaped) {
70
+ escaped = false;
71
+ continue;
72
+ }
73
+ if (character === "\\" && quoted) {
74
+ escaped = true;
75
+ continue;
76
+ }
77
+ if (character === '"')
78
+ quoted = !quoted;
79
+ if (!quoted && character === "{")
80
+ depth++;
81
+ if (!quoted && character === "}")
82
+ depth--;
83
+ }
84
+ return depth;
85
+ }
86
+ export function parseConfigFile(options) {
87
+ const commands = [];
88
+ const diagnostics = [];
89
+ const lines = options.text.replaceAll("\r\n", "\n").replaceAll("\r", "\n").split("\n");
90
+ let currentSection;
91
+ let skipContinuation = false;
92
+ let bracketDepth = 0;
93
+ for (let index = 0; index < lines.length; index++) {
94
+ const raw = lines[index];
95
+ const trimmed = raw.trim();
96
+ if (skipContinuation) {
97
+ skipContinuation = raw.trimEnd().endsWith("\\");
98
+ continue;
99
+ }
100
+ if (bracketDepth > 0) {
101
+ bracketDepth += curlyDepth(raw);
102
+ continue;
103
+ }
104
+ if (trimmed === "" || trimmed.startsWith(";") || trimmed.startsWith("//"))
105
+ continue;
106
+ if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
107
+ currentSection = trimmed.slice(1, -1);
108
+ continue;
109
+ }
110
+ if (!equalsConfigName(currentSection ?? "", options.section))
111
+ continue;
112
+ const column = raw.search(/\S/u) + 1;
113
+ if (raw.trimEnd().endsWith("\\")) {
114
+ diagnostics.push({
115
+ code: "unsupported_multiline",
116
+ message: "Escaped or bracketed multiline config values are not supported in this slice.",
117
+ source: options.source,
118
+ location: { line: index + 1, column }
119
+ });
120
+ skipContinuation = true;
121
+ continue;
122
+ }
123
+ const equals = trimmed.indexOf("=");
124
+ const first = trimmed[0] ?? "";
125
+ const prefix = "+.-!^@*~".includes(first) ? first : "";
126
+ const rawKey = (equals === -1 ? trimmed : trimmed.slice(0, equals))
127
+ .slice(prefix === "" ? 0 : 1)
128
+ .trim();
129
+ if (!equalsConfigName(rawKey, options.key))
130
+ continue;
131
+ if (prefix === "@" || prefix === "*") {
132
+ diagnostics.push({
133
+ code: "unsupported_operator",
134
+ message: `${prefix} keyed-array metadata requires semantics outside this slice.`,
135
+ source: options.source,
136
+ location: { line: index + 1, column }
137
+ });
138
+ continue;
139
+ }
140
+ if (equals === -1) {
141
+ diagnostics.push({
142
+ code: "malformed_entry",
143
+ message: "The selected config entry has no equals delimiter.",
144
+ source: options.source,
145
+ location: { line: index + 1, column }
146
+ });
147
+ continue;
148
+ }
149
+ const rawValue = trimmed.slice(equals + 1).trim();
150
+ bracketDepth = curlyDepth(rawValue);
151
+ if (bracketDepth > 0) {
152
+ diagnostics.push({
153
+ code: "unsupported_multiline",
154
+ message: "Bracketed multiline config values are not supported in this slice.",
155
+ source: options.source,
156
+ location: { line: index + 1, column }
157
+ });
158
+ continue;
159
+ }
160
+ const parsed = quotedValue(withoutDoubleSlashComment(rawValue));
161
+ if (parsed.malformed || parsed.value === undefined) {
162
+ diagnostics.push({
163
+ code: "malformed_entry",
164
+ message: "The selected config entry has an unterminated or malformed quoted value.",
165
+ source: options.source,
166
+ location: { line: index + 1, column }
167
+ });
168
+ continue;
169
+ }
170
+ commands.push({
171
+ source: options.source,
172
+ location: { line: index + 1, column },
173
+ operation: OPERATIONS[prefix === "~" ? "" : prefix],
174
+ ...(prefix === "!" || prefix === "^" ? undefined : { value: parsed.value })
175
+ });
176
+ }
177
+ return { commands, diagnostics };
178
+ }
179
+ /** Detects redirect evidence that can rename the selected section or key during UE load. */
180
+ export function configRedirectAffects(options) {
181
+ let currentSection = "";
182
+ const relatedSections = new Set([options.section.toLowerCase()]);
183
+ const entries = [];
184
+ for (const raw of options.text.replaceAll("\r\n", "\n").replaceAll("\r", "\n").split("\n")) {
185
+ const line = withoutDoubleSlashComment(raw).trim();
186
+ if (line === "" || line.startsWith(";"))
187
+ continue;
188
+ if (line.startsWith("[") && line.endsWith("]")) {
189
+ currentSection = line.slice(1, -1);
190
+ continue;
191
+ }
192
+ const equals = line.indexOf("=");
193
+ if (equals === -1)
194
+ continue;
195
+ entries.push({
196
+ section: currentSection,
197
+ from: line.slice(0, equals).trim(),
198
+ to: line.slice(equals + 1).trim()
199
+ });
200
+ }
201
+ for (const entry of entries) {
202
+ if (!equalsConfigName(entry.section, "SectionNameRemap"))
203
+ continue;
204
+ if (relatedSections.has(entry.from.toLowerCase()) ||
205
+ relatedSections.has(entry.to.toLowerCase())) {
206
+ relatedSections.add(entry.from.toLowerCase());
207
+ relatedSections.add(entry.to.toLowerCase());
208
+ }
209
+ }
210
+ return (entries.some((entry) => !equalsConfigName(entry.section, "SectionNameRemap") &&
211
+ relatedSections.has(entry.section.toLowerCase()) &&
212
+ (equalsConfigName(entry.from, options.key) ||
213
+ equalsConfigName(entry.to, options.key))) || relatedSections.size > 1);
214
+ }
215
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}