@sasjs/utils 4.3.0 → 4.3.1
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/logs/sasLog.d.ts +5 -0
- package/logs/sasLog.js +148 -41
- package/logs/sasLog.js.map +1 -1
- package/package.json +1 -1
package/logs/sasLog.d.ts
CHANGED
|
@@ -108,6 +108,11 @@ export declare const isNotableNote: (message: string) => boolean;
|
|
|
108
108
|
* directly. A host that wants errors only filters on `severity`; nothing is
|
|
109
109
|
* behind an option, because a notable note is worth reporting wherever the log
|
|
110
110
|
* is shown.
|
|
111
|
+
*
|
|
112
|
+
* The text is never split into lines: a log is often megabytes, and a pass that
|
|
113
|
+
* builds an array of its lines costs more than the scan and hands the collector
|
|
114
|
+
* a million strings. One global match walks the text, the line number is counted
|
|
115
|
+
* forward from the previous match, and only the lines a message needs are sliced.
|
|
111
116
|
*/
|
|
112
117
|
export declare const parseLog: (text: string) => LogIssue[];
|
|
113
118
|
/**
|
package/logs/sasLog.js
CHANGED
|
@@ -71,10 +71,26 @@ exports.nextIssue = exports.parseLog = exports.isNotableNote = exports.isSasLog
|
|
|
71
71
|
* line's text. Padding without markup is not allowed: an indented marker is text
|
|
72
72
|
* in a listing, not a message. The prefix is captured so the marker's column is
|
|
73
73
|
* exact, and the code and message are captured separately.
|
|
74
|
+
*
|
|
75
|
+
* The spaces either side of a message code are a character class, not `\s`: the
|
|
76
|
+
* expression now runs over the whole text, where `\s` would let a match swallow
|
|
77
|
+
* the line break and read the next line as this message's code.
|
|
74
78
|
*/
|
|
75
|
-
const MARKER = /^((?:<[^>]*>)+[ \t]*|)(?:(ERROR|WARNING)(
|
|
76
|
-
/**
|
|
77
|
-
|
|
79
|
+
const MARKER = /^((?:<[^>]*>)+[ \t]*|)(?:(ERROR|WARNING)(?:[ \t]+(\d+-\d+))?(:[ \t]?|[ \t]+)|(NOTE)(?:[ \t]+(\d+-\d+))?:[ \t]?)(.*)$/;
|
|
80
|
+
/**
|
|
81
|
+
* The shapes only SAS writes, tested over the whole text in one pass so no line
|
|
82
|
+
* array is built: a coded marker (`ERROR 22-322:`), or a line SAS numbers at the
|
|
83
|
+
* start followed by a statement - one that begins with a macro call, a comment,
|
|
84
|
+
* or ends in the semicolon SAS statement syntax requires. The padded number alone
|
|
85
|
+
* is not evidence: `1 item` is a numbered list in somebody else's output.
|
|
86
|
+
*
|
|
87
|
+
* The statement tail is `[^\n;]*` rather than `[^;]*` because a negated class
|
|
88
|
+
* matches a newline, and a shape match must not span two lines. A semicolon alone
|
|
89
|
+
* does not make a statement - `12 Building target;` is a numbered list in output
|
|
90
|
+
* that is not SAS - so the line also has to begin with a statement keyword or
|
|
91
|
+
* carry an assignment or a call before its semicolon.
|
|
92
|
+
*/
|
|
93
|
+
const SAS_SHAPE = /^(?:(?:<[^>]*>)+[ \t]*|)(?:(?:ERROR|WARNING|NOTE) +\d+-\d+|\d+ {2,}(?:[%*/]|(?:by|data|filename|footnote|format|if|infile|input|libname|merge|ods|options|output|proc|put|quit|run|set|title|where)\b|[^\n;]*[=(][^\n;]*;))/m;
|
|
78
94
|
/**
|
|
79
95
|
* The phrases SAS prints about itself, and nothing else does: the version banner,
|
|
80
96
|
* the licence note, the platform note, the work-area conversion warning, the page
|
|
@@ -82,8 +98,6 @@ const NUMBERED_STEP = /^\d+ {2,}\S/;
|
|
|
82
98
|
* a log that has lost its head usually keeps the step footer.
|
|
83
99
|
*/
|
|
84
100
|
const SAS_BANNER = /(?:The SAS System|^You are running SAS \d|^NOTE: (?:SAS|Copyright .*\bSAS Institute|This session is executing|DATA statement used))/m;
|
|
85
|
-
/** A coded marker, e.g. `ERROR 22-322:` - SAS's message identifiers, again its own. */
|
|
86
|
-
const CODED_MARKER = /^((?:<[^>]*>)+[ \t]*|)(?:ERROR|WARNING|NOTE) +\d+-\d+/;
|
|
87
101
|
/**
|
|
88
102
|
* Whether a text is a SAS log rather than somebody else's log file.
|
|
89
103
|
*
|
|
@@ -107,10 +121,7 @@ const CODED_MARKER = /^((?:<[^>]*>)+[ \t]*|)(?:ERROR|WARNING|NOTE) +\d+-\d+/;
|
|
|
107
121
|
* The check is deliberately cheap and runs before a host publishes anything, so
|
|
108
122
|
* a `.log` from another tool is left alone.
|
|
109
123
|
*/
|
|
110
|
-
const isSasLog = (text) => SAS_BANNER.test(text) ||
|
|
111
|
-
text
|
|
112
|
-
.split(/\r?\n/)
|
|
113
|
-
.some((line) => CODED_MARKER.test(line) || NUMBERED_STEP.test(line));
|
|
124
|
+
const isSasLog = (text) => SAS_BANNER.test(text) || SAS_SHAPE.test(text);
|
|
114
125
|
exports.isSasLog = isSasLog;
|
|
115
126
|
/**
|
|
116
127
|
* The notes worth reporting, matched case-insensitively against the folded
|
|
@@ -157,24 +168,83 @@ const NOTE_KEYWORDS = [
|
|
|
157
168
|
'not positive definite',
|
|
158
169
|
'The SAS System stopped processing this step because of errors'
|
|
159
170
|
];
|
|
160
|
-
|
|
171
|
+
/** `RegExp`-escaping, so a keyword added later cannot change the meaning of the pattern. */
|
|
172
|
+
const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
173
|
+
/**
|
|
174
|
+
* The keyword list as one case-insensitive expression. Testing 30 keywords with
|
|
175
|
+
* `includes` meant lowercasing every note and up to 30 scans of it; a log holds
|
|
176
|
+
* thousands of notes and this is the second hottest function in the module.
|
|
177
|
+
*/
|
|
178
|
+
const NOTABLE_NOTE = new RegExp(NOTE_KEYWORDS.map(escape).join('|'), 'i');
|
|
161
179
|
/** How many wrapped lines one message may absorb, so a malformed log cannot run away. */
|
|
162
180
|
const MAX_WRAPPED_LINES = 10;
|
|
163
181
|
/** Whether a note's message is one of the notable ones. */
|
|
164
|
-
const isNotableNote = (message) =>
|
|
165
|
-
const lower = message.toLowerCase();
|
|
166
|
-
return NOTABLE_NOTE_KEYWORDS.some((keyword) => lower.includes(keyword));
|
|
167
|
-
};
|
|
182
|
+
const isNotableNote = (message) => NOTABLE_NOTE.test(message);
|
|
168
183
|
exports.isNotableNote = isNotableNote;
|
|
169
|
-
/**
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
184
|
+
/**
|
|
185
|
+
* The pointer line SAS prints under the token it complains about: a run of
|
|
186
|
+
* dashes, or the column number on its own.
|
|
187
|
+
*/
|
|
188
|
+
const POINTER_LINE = /^\s*(?:[-_]+\s*$|\d+\s*$)/;
|
|
189
|
+
/**
|
|
190
|
+
* A line SAS wrapped: indented, and neither a pointer line nor a marker.
|
|
191
|
+
*
|
|
192
|
+
* The marker test is {@link MARKER} itself, applied to the trimmed line, so a
|
|
193
|
+
* continuation is excluded exactly when the line would have been a marker had it
|
|
194
|
+
* begun the line - the markup-prefixed form included. A second, subtly different
|
|
195
|
+
* expression is how an indented marker ends up belonging to neither the message
|
|
196
|
+
* above nor the issue list. Such a marker is dropped rather than reported, which
|
|
197
|
+
* is the rule the parser states: a message begins the line.
|
|
198
|
+
*/
|
|
199
|
+
const isWrappedLine = (line) => /^\s+\S/.test(line) && !POINTER_LINE.test(line) && !MARKER.test(line.trim());
|
|
200
|
+
/**
|
|
201
|
+
* Whether a character code is printable ASCII and not a space. The fast path in
|
|
202
|
+
* {@link clean} is limited to ASCII at both ends, so a message carrying one of
|
|
203
|
+
* the non-ASCII spaces the slow path collapses still takes the slow path.
|
|
204
|
+
*/
|
|
205
|
+
const isPlainCode = (code) => code > 32 && code < 127;
|
|
206
|
+
/**
|
|
207
|
+
* Removes markup and collapses the whitespace a wrapped message carries.
|
|
208
|
+
*
|
|
209
|
+
* Most messages need neither: a single line with no markup and no run of spaces
|
|
210
|
+
* is returned as it is, which keeps three passes off the common path - this is
|
|
211
|
+
* the hottest function in the module on a large log.
|
|
212
|
+
*/
|
|
213
|
+
const clean = (text) => {
|
|
214
|
+
const plain = isPlainCode(text.charCodeAt(0)) &&
|
|
215
|
+
isPlainCode(text.charCodeAt(text.length - 1)) &&
|
|
216
|
+
text.indexOf('<') < 0 &&
|
|
217
|
+
text.indexOf('\t') < 0 &&
|
|
218
|
+
text.indexOf(' ') < 0;
|
|
219
|
+
return plain
|
|
220
|
+
? text
|
|
221
|
+
: text
|
|
222
|
+
.replace(/<[^>]*>/g, '')
|
|
223
|
+
.replace(/\s+/g, ' ')
|
|
224
|
+
.trim();
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* Finds every ERROR and WARNING in a SAS log, and every notable note.
|
|
228
|
+
*
|
|
229
|
+
* The issue list is in log order. `line` and `column` address the text as
|
|
230
|
+
* supplied, so a caller can offset a decoration or a diagnostic by them
|
|
231
|
+
* directly. A host that wants errors only filters on `severity`; nothing is
|
|
232
|
+
* behind an option, because a notable note is worth reporting wherever the log
|
|
233
|
+
* is shown.
|
|
234
|
+
*/
|
|
235
|
+
/**
|
|
236
|
+
* The marker expression with the multiline flags, so one call walks the whole
|
|
237
|
+
* text. `exec` on a line at a time costs a call per line - half a million on a
|
|
238
|
+
* 16 MB log - where one pass over the string costs a fraction of that, and the
|
|
239
|
+
* line and column indexes are recovered from the match offsets instead.
|
|
240
|
+
*/
|
|
241
|
+
const SCAN = new RegExp(MARKER.source, 'gm');
|
|
242
|
+
/** The index of the line break that ends the line starting at `from`, or -1. */
|
|
243
|
+
const lineEnd = (text, from) => text.indexOf('\n', from);
|
|
244
|
+
/** A slice of the text with the carriage return of a CRLF line ending removed. */
|
|
245
|
+
const withoutCr = (text, from, to) => to > from && text.charCodeAt(to - 1) === 13
|
|
246
|
+
? text.slice(from, to - 1)
|
|
247
|
+
: text.slice(from, to);
|
|
178
248
|
/**
|
|
179
249
|
* Finds every ERROR and WARNING in a SAS log, and every notable note.
|
|
180
250
|
*
|
|
@@ -183,46 +253,83 @@ const clean = (text) => text
|
|
|
183
253
|
* directly. A host that wants errors only filters on `severity`; nothing is
|
|
184
254
|
* behind an option, because a notable note is worth reporting wherever the log
|
|
185
255
|
* is shown.
|
|
256
|
+
*
|
|
257
|
+
* The text is never split into lines: a log is often megabytes, and a pass that
|
|
258
|
+
* builds an array of its lines costs more than the scan and hands the collector
|
|
259
|
+
* a million strings. One global match walks the text, the line number is counted
|
|
260
|
+
* forward from the previous match, and only the lines a message needs are sliced.
|
|
186
261
|
*/
|
|
187
262
|
const parseLog = (text) => {
|
|
188
|
-
var _a
|
|
263
|
+
var _a;
|
|
189
264
|
if (!text) {
|
|
190
265
|
return [];
|
|
191
266
|
}
|
|
192
|
-
const lines = text.split(/\r?\n/);
|
|
193
267
|
const issues = [];
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
268
|
+
let line = 0;
|
|
269
|
+
let countedTo = 0;
|
|
270
|
+
let match;
|
|
271
|
+
SCAN.lastIndex = 0;
|
|
272
|
+
while ((match = SCAN.exec(text)) !== null) {
|
|
273
|
+
const markerStart = match.index;
|
|
274
|
+
// Lines between the last block and this marker.
|
|
275
|
+
for (let index = text.indexOf('\n', countedTo); index !== -1 && index < markerStart; index = text.indexOf('\n', index + 1)) {
|
|
276
|
+
line++;
|
|
198
277
|
}
|
|
278
|
+
const markerEnd = lineEnd(text, markerStart);
|
|
279
|
+
const endIndex = markerEnd === -1 ? text.length : markerEnd;
|
|
199
280
|
const markerLine = line;
|
|
200
|
-
|
|
281
|
+
let message = clean(match[7]);
|
|
201
282
|
let endLine = markerLine;
|
|
283
|
+
let cursor = endIndex + 1;
|
|
202
284
|
let wrapped = 0;
|
|
203
|
-
while (wrapped < MAX_WRAPPED_LINES
|
|
204
|
-
|
|
205
|
-
|
|
285
|
+
while (cursor <= text.length && wrapped < MAX_WRAPPED_LINES) {
|
|
286
|
+
const nextEnd = lineEnd(text, cursor);
|
|
287
|
+
const sliceEnd = nextEnd === -1 ? text.length : nextEnd;
|
|
288
|
+
const candidate = withoutCr(text, cursor, sliceEnd);
|
|
289
|
+
if (!isWrappedLine(candidate)) {
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
const part = clean(candidate);
|
|
293
|
+
if (part !== '') {
|
|
294
|
+
message = message === '' ? part : `${message} ${part}`;
|
|
295
|
+
}
|
|
206
296
|
endLine++;
|
|
207
297
|
wrapped++;
|
|
208
|
-
|
|
298
|
+
cursor = sliceEnd + 1;
|
|
209
299
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
line = endLine;
|
|
300
|
+
// The lines folded into this message belong to it whether or not it is
|
|
301
|
+
// reported, so the scan resumes after them either way.
|
|
302
|
+
SCAN.lastIndex = cursor;
|
|
303
|
+
countedTo = cursor;
|
|
304
|
+
line = endLine + 1;
|
|
215
305
|
// A marker with nothing after it is not a message: SAS does not print a bare
|
|
216
306
|
// `ERROR` or `ERROR:` line, and an empty issue would reach a host as a blank
|
|
217
307
|
// line in its problem list.
|
|
218
308
|
if (message === '') {
|
|
219
309
|
continue;
|
|
220
310
|
}
|
|
311
|
+
const severity = match[2]
|
|
312
|
+
? match[2] === 'ERROR'
|
|
313
|
+
? 'error'
|
|
314
|
+
: 'warning'
|
|
315
|
+
: 'note';
|
|
221
316
|
if (severity === 'note' && !(0, exports.isNotableNote)(message)) {
|
|
222
317
|
continue;
|
|
223
318
|
}
|
|
224
|
-
const code = (
|
|
225
|
-
|
|
319
|
+
const code = (_a = match[3]) !== null && _a !== void 0 ? _a : match[6];
|
|
320
|
+
const issue = {
|
|
321
|
+
line: markerLine,
|
|
322
|
+
endLine,
|
|
323
|
+
column: match[1].length,
|
|
324
|
+
// The whole match is the line's text: `$` stops before the `\r` of a CRLF.
|
|
325
|
+
endColumn: match[0].length,
|
|
326
|
+
severity,
|
|
327
|
+
message
|
|
328
|
+
};
|
|
329
|
+
if (code) {
|
|
330
|
+
issue.code = code;
|
|
331
|
+
}
|
|
332
|
+
issues.push(issue);
|
|
226
333
|
}
|
|
227
334
|
return issues;
|
|
228
335
|
};
|
package/logs/sasLog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sasLog.js","sourceRoot":"","sources":["../../src/logs/sasLog.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;;;AA6BH
|
|
1
|
+
{"version":3,"file":"sasLog.js","sourceRoot":"","sources":["../../src/logs/sasLog.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED