phpstan-mcp-mx 0.22.0 → 0.24.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.
- package/CHANGELOG.md +24 -0
- package/README.md +142 -19
- package/dist/baseline.d.ts +10 -0
- package/dist/baseline.js +36 -14
- package/dist/baseline.js.map +1 -1
- package/dist/changed.d.ts +17 -0
- package/dist/changed.js +56 -29
- package/dist/changed.js.map +1 -1
- package/dist/compare.js +12 -6
- package/dist/compare.js.map +1 -1
- package/dist/composer.js +43 -21
- package/dist/composer.js.map +1 -1
- package/dist/config.js +12 -6
- package/dist/config.js.map +1 -1
- package/dist/defaults.js +2 -1
- package/dist/defaults.js.map +1 -1
- package/dist/dumptype.js +16 -8
- package/dist/dumptype.js.map +1 -1
- package/dist/failure.d.ts +1 -1
- package/dist/failure.js.map +1 -1
- package/dist/history.d.ts +61 -0
- package/dist/history.js +275 -0
- package/dist/history.js.map +1 -0
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/php.js +10 -5
- package/dist/php.js.map +1 -1
- package/dist/phpstan/error.js.map +1 -1
- package/dist/phpstan/output.js +12 -6
- package/dist/phpstan/output.js.map +1 -1
- package/dist/phpstan/parameters.js.map +1 -1
- package/dist/phpstan/process.d.ts +10 -0
- package/dist/phpstan/process.js +35 -9
- package/dist/phpstan/process.js.map +1 -1
- package/dist/phpstan/queue.js +4 -2
- package/dist/phpstan/queue.js.map +1 -1
- package/dist/phpstan.d.ts +14 -0
- package/dist/phpstan.js +94 -25
- package/dist/phpstan.js.map +1 -1
- package/dist/project.d.ts +6 -2
- package/dist/project.js +57 -18
- package/dist/project.js.map +1 -1
- package/dist/prune.d.ts +92 -0
- package/dist/prune.js +387 -0
- package/dist/prune.js.map +1 -0
- package/dist/report.js +38 -19
- package/dist/report.js.map +1 -1
- package/dist/root-source.d.ts +43 -0
- package/dist/root-source.js +124 -0
- package/dist/root-source.js.map +1 -0
- package/dist/roots.d.ts +12 -0
- package/dist/roots.js +23 -6
- package/dist/roots.js.map +1 -1
- package/dist/runner.js +14 -7
- package/dist/runner.js.map +1 -1
- package/dist/runs.js +6 -3
- package/dist/runs.js.map +1 -1
- package/dist/schema-dialect.js +6 -3
- package/dist/schema-dialect.js.map +1 -1
- package/dist/server.d.ts +3 -2
- package/dist/server.js +9 -5
- package/dist/server.js.map +1 -1
- package/dist/tmpdir.js +6 -3
- package/dist/tmpdir.js.map +1 -1
- package/dist/tools/analysis.d.ts +4 -4
- package/dist/tools/analysis.js +4 -2
- package/dist/tools/analysis.js.map +1 -1
- package/dist/tools/inspect.d.ts +9 -7
- package/dist/tools/inspect.js +158 -37
- package/dist/tools/inspect.js.map +1 -1
- package/dist/tools/prompts.d.ts +3 -3
- package/dist/tools/prompts.js +16 -8
- package/dist/tools/prompts.js.map +1 -1
- package/dist/tools/shared.d.ts +2 -2
- package/dist/tools/shared.js +7 -5
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/writes.d.ts +8 -3
- package/dist/tools/writes.js +73 -3
- package/dist/tools/writes.js.map +1 -1
- package/dist/tools.d.ts +2 -2
- package/dist/tools.js +6 -3
- package/dist/tools.js.map +1 -1
- package/dist/unmatched.d.ts +66 -0
- package/dist/unmatched.js +194 -44
- package/dist/unmatched.js.map +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
package/dist/php.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"php.js","sourceRoot":"","sources":["../src/php.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAE7C,iFAAiF;AACjF,MAAM,SAAS,GAAG,oDAAoD,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;
|
|
1
|
+
{"version":3,"file":"php.js","sourceRoot":"","sources":["../src/php.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/phpstan/error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,YAAY,OAAe,EAAE,SAAwB,gBAAgB,EAAE,UAA0B,EAAE;
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/phpstan/error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,YAAY,OAAe,EAAE,SAAwB,gBAAgB,EAAE,UAA0B,EAAE;QAEjG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;CACF"}
|
package/dist/phpstan/output.js
CHANGED
|
@@ -16,8 +16,9 @@ const outputSchema = z.object({
|
|
|
16
16
|
* associatieve array nu eenmaal als JSON-array.
|
|
17
17
|
*/
|
|
18
18
|
export function tryParse(stdout) {
|
|
19
|
-
if (stdout.trim() === '')
|
|
19
|
+
if (stdout.trim() === '') {
|
|
20
20
|
return null;
|
|
21
|
+
}
|
|
21
22
|
let raw;
|
|
22
23
|
try {
|
|
23
24
|
raw = JSON.parse(stdout);
|
|
@@ -62,8 +63,9 @@ export function collectWarnings(stderr) {
|
|
|
62
63
|
const regels = stderr.split('\n').map((regel) => regel.trim());
|
|
63
64
|
const kop = regels.findIndex((regel) => INSTRUCTIE_KOP.test(regel));
|
|
64
65
|
const bruikbaar = (deel) => deel.filter((regel) => regel !== '' && !HARMLESS_STDERR.some((patroon) => patroon.test(regel)));
|
|
65
|
-
if (kop === -1)
|
|
66
|
+
if (kop === -1) {
|
|
66
67
|
return { warnings: bruikbaar(regels), instructions: [] };
|
|
68
|
+
}
|
|
67
69
|
return {
|
|
68
70
|
warnings: bruikbaar(regels.slice(0, kop)),
|
|
69
71
|
instructions: bruikbaar(regels.slice(kop)),
|
|
@@ -146,8 +148,9 @@ function dedupeWorkers(regels) {
|
|
|
146
148
|
const sleutel = regel.trim();
|
|
147
149
|
// Lege regels dragen geen inhoud; opeenvolgende blanks worden er één.
|
|
148
150
|
if (sleutel === '') {
|
|
149
|
-
if (uit.length > 0 && uit[uit.length - 1] !== '')
|
|
151
|
+
if (uit.length > 0 && uit[uit.length - 1] !== '') {
|
|
150
152
|
uit.push('');
|
|
153
|
+
}
|
|
151
154
|
continue;
|
|
152
155
|
}
|
|
153
156
|
if (gezien.has(sleutel)) {
|
|
@@ -162,8 +165,9 @@ function dedupeWorkers(regels) {
|
|
|
162
165
|
/** Kort een al ontdubbelde lijst in tot `max` tekens. */
|
|
163
166
|
function beknopt(regels, max) {
|
|
164
167
|
const samen = regels.join('\n');
|
|
165
|
-
if (samen.length <= max)
|
|
168
|
+
if (samen.length <= max) {
|
|
166
169
|
return samen;
|
|
170
|
+
}
|
|
167
171
|
const anker = regels.findIndex((regel) => OORZAAK.test(regel));
|
|
168
172
|
if (anker === -1) {
|
|
169
173
|
// Geen herkenbare oorzaak: dan is de kop het beste wat er is.
|
|
@@ -197,8 +201,9 @@ function dropTips(regels) {
|
|
|
197
201
|
continue;
|
|
198
202
|
}
|
|
199
203
|
// De opsomming eindigt bij de eerste regel die geen streepje of leegte is.
|
|
200
|
-
if (inTips && (regel.trim() === '' || regel.trim().startsWith('-')))
|
|
204
|
+
if (inTips && (regel.trim() === '' || regel.trim().startsWith('-'))) {
|
|
201
205
|
continue;
|
|
206
|
+
}
|
|
202
207
|
inTips = false;
|
|
203
208
|
uit.push(regel);
|
|
204
209
|
}
|
|
@@ -209,8 +214,9 @@ function neemTot(regels, budget) {
|
|
|
209
214
|
const uit = [];
|
|
210
215
|
let gebruikt = 0;
|
|
211
216
|
for (const regel of regels) {
|
|
212
|
-
if (gebruikt + regel.length + 1 > budget)
|
|
217
|
+
if (gebruikt + regel.length + 1 > budget) {
|
|
213
218
|
break;
|
|
219
|
+
}
|
|
214
220
|
uit.push(regel);
|
|
215
221
|
gebruikt += regel.length + 1;
|
|
216
222
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/phpstan/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACjE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC5B,CAAC,CAAC;AAIH;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IAErC,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/phpstan/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../src/phpstan/parameters.ts"],"names":[],"mappings":"AAwBA;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;
|
|
1
|
+
{"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../src/phpstan/parameters.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,16 @@ export interface Execution {
|
|
|
9
9
|
readonly stderr: string;
|
|
10
10
|
readonly spawnError: NodeJS.ErrnoException | null;
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Of deze server de run gestopt heeft, door een timeout of een annulering.
|
|
14
|
+
*
|
|
15
|
+
* Op POSIX blijkt dat uit het signaal. Op Windows niet: `taskkill /F` laat het proces eindigen
|
|
16
|
+
* met exit code 1 en zonder signaal, en tot hier las elke timeout en elke annulering daar als
|
|
17
|
+
* "PHPStan returned no usable JSON", met het advies de cache te legen. Nagemeten toen de
|
|
18
|
+
* testsuite op Windows ging draaien. Daarom telt ook de reden, maar alleen als het proces niet
|
|
19
|
+
* toch nog zelf klaar was (`completed`): een run die net op tijd eindigde, is geen timeout.
|
|
20
|
+
*/
|
|
21
|
+
export declare function wasStopped(execution: Pick<Execution, 'signal' | 'reason'>, completed: boolean): boolean;
|
|
12
22
|
/**
|
|
13
23
|
* Start PHPStan zonder shell. Bewust spawn en niet execFile: die laatste kapt de
|
|
14
24
|
* output af op maxBuffer (1 MB), en de JSON van een groot project gaat daar
|
package/dist/phpstan/process.js
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { tmpDirEnv } from '../tmpdir.js';
|
|
3
|
+
/**
|
|
4
|
+
* Of deze server de run gestopt heeft, door een timeout of een annulering.
|
|
5
|
+
*
|
|
6
|
+
* Op POSIX blijkt dat uit het signaal. Op Windows niet: `taskkill /F` laat het proces eindigen
|
|
7
|
+
* met exit code 1 en zonder signaal, en tot hier las elke timeout en elke annulering daar als
|
|
8
|
+
* "PHPStan returned no usable JSON", met het advies de cache te legen. Nagemeten toen de
|
|
9
|
+
* testsuite op Windows ging draaien. Daarom telt ook de reden, maar alleen als het proces niet
|
|
10
|
+
* toch nog zelf klaar was (`completed`): een run die net op tijd eindigde, is geen timeout.
|
|
11
|
+
*/
|
|
12
|
+
export function wasStopped(execution, completed) {
|
|
13
|
+
return execution.signal !== null || (execution.reason !== null && !completed);
|
|
14
|
+
}
|
|
3
15
|
/** Hoe lang een gedode procesgroep de tijd krijgt voordat SIGKILL volgt. */
|
|
4
16
|
const KILL_GRACE_MS = 5_000;
|
|
5
17
|
/**
|
|
@@ -41,7 +53,9 @@ export function execute(binary, args, cwd, timeoutMs, signal) {
|
|
|
41
53
|
spawnError = error;
|
|
42
54
|
});
|
|
43
55
|
const timers = [];
|
|
44
|
-
const stopTimers = () => timers.forEach((timer) => {
|
|
56
|
+
const stopTimers = () => timers.forEach((timer) => {
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
});
|
|
45
59
|
let reason = null;
|
|
46
60
|
// Timeout en annulering ruimen op dezelfde manier op; alleen de reden verschilt,
|
|
47
61
|
// en die bepaalt straks welke uitleg het model krijgt.
|
|
@@ -49,15 +63,22 @@ export function execute(binary, args, cwd, timeoutMs, signal) {
|
|
|
49
63
|
reason ??= why;
|
|
50
64
|
killGroup(child.pid, 'SIGTERM');
|
|
51
65
|
// Wie op SIGTERM niet reageert, krijgt alsnog SIGKILL.
|
|
52
|
-
timers.push(setTimeout(() => {
|
|
66
|
+
timers.push(setTimeout(() => {
|
|
67
|
+
killGroup(child.pid, 'SIGKILL');
|
|
68
|
+
}, KILL_GRACE_MS));
|
|
69
|
+
};
|
|
70
|
+
timers.push(setTimeout(() => {
|
|
71
|
+
stop('timeout');
|
|
72
|
+
}, timeoutMs));
|
|
73
|
+
const onAbort = () => {
|
|
74
|
+
stop('geannuleerd');
|
|
53
75
|
};
|
|
54
|
-
timers.push(setTimeout(() => { stop('timeout'); }, timeoutMs));
|
|
55
|
-
const onAbort = () => { stop('geannuleerd'); };
|
|
56
76
|
signal?.addEventListener('abort', onAbort, { once: true });
|
|
57
77
|
let settled = false;
|
|
58
78
|
const finish = (code, stopSignal) => {
|
|
59
|
-
if (settled)
|
|
79
|
+
if (settled) {
|
|
60
80
|
return;
|
|
81
|
+
}
|
|
61
82
|
settled = true;
|
|
62
83
|
stopTimers();
|
|
63
84
|
// Listener opruimen: het signaal van een verzoek kan langer leven dan deze
|
|
@@ -80,8 +101,9 @@ export function execute(binary, args, cwd, timeoutMs, signal) {
|
|
|
80
101
|
// meer. Zodra het proces zelf door een signaal is gestopt, heeft wachten op
|
|
81
102
|
// meer output geen zin.
|
|
82
103
|
child.on('exit', (code, exitSignal) => {
|
|
83
|
-
if (exitSignal !== null)
|
|
104
|
+
if (exitSignal !== null) {
|
|
84
105
|
finish(code, exitSignal);
|
|
106
|
+
}
|
|
85
107
|
});
|
|
86
108
|
});
|
|
87
109
|
}
|
|
@@ -120,8 +142,9 @@ export function planKill(pid, signal, platform = process.platform) {
|
|
|
120
142
|
const TASKKILL_NOT_FOUND = 128;
|
|
121
143
|
/** Doodt de hele procesgroep van `pid`, op de manier die dit platform kent. */
|
|
122
144
|
function killGroup(pid, signal) {
|
|
123
|
-
if (pid === undefined)
|
|
145
|
+
if (pid === undefined) {
|
|
124
146
|
return;
|
|
147
|
+
}
|
|
125
148
|
carryOutKill(pid, planKill(pid, signal));
|
|
126
149
|
}
|
|
127
150
|
/**
|
|
@@ -133,7 +156,9 @@ export function carryOutKill(pid, plan) {
|
|
|
133
156
|
if (plan.kind === 'commando') {
|
|
134
157
|
// Fire-and-forget: dit loopt in een timer en mag de event loop niet blokkeren.
|
|
135
158
|
const killer = spawn(plan.command, [...plan.args], { shell: false, stdio: 'ignore', windowsHide: true });
|
|
136
|
-
killer.on('error', (error) => {
|
|
159
|
+
killer.on('error', (error) => {
|
|
160
|
+
reportKillFailure(pid, error);
|
|
161
|
+
});
|
|
137
162
|
killer.on('exit', (code) => {
|
|
138
163
|
if (code !== 0 && code !== TASKKILL_NOT_FOUND) {
|
|
139
164
|
reportKillFailure(pid, new Error(`${plan.command} exited with code ${String(code)}`));
|
|
@@ -145,8 +170,9 @@ export function carryOutKill(pid, plan) {
|
|
|
145
170
|
process.kill(plan.target, plan.signal);
|
|
146
171
|
}
|
|
147
172
|
catch (error) {
|
|
148
|
-
if (isReportableKillError(error))
|
|
173
|
+
if (isReportableKillError(error)) {
|
|
149
174
|
reportKillFailure(pid, error);
|
|
175
|
+
}
|
|
150
176
|
}
|
|
151
177
|
}
|
|
152
178
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/phpstan/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAezC,4EAA4E;AAC5E,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CACrB,MAAc,EACd,IAAuB,EACvB,GAAW,EACX,SAAiB,EACjB,MAA+B;
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/phpstan/process.ts"],"names":[],"mappings":"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"}
|
package/dist/phpstan/queue.js
CHANGED
|
@@ -16,8 +16,9 @@ const DEFAULT_MAX_PARALLEL = 2;
|
|
|
16
16
|
*/
|
|
17
17
|
export function loadMaxParallel(env = process.env) {
|
|
18
18
|
const configured = (env[MAX_PARALLEL_ENV_VAR] ?? fromConfig('maxParallel', env))?.trim();
|
|
19
|
-
if (configured === undefined || configured === '')
|
|
19
|
+
if (configured === undefined || configured === '') {
|
|
20
20
|
return DEFAULT_MAX_PARALLEL;
|
|
21
|
+
}
|
|
21
22
|
const parsed = Number(configured);
|
|
22
23
|
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
23
24
|
throw new PhpstanError(`${MAX_PARALLEL_ENV_VAR} is set to "${configured}", and that is not a whole number of 1 or more. ` +
|
|
@@ -69,8 +70,9 @@ export function enqueue(key, task) {
|
|
|
69
70
|
queues.set(key, tail);
|
|
70
71
|
void tail.then(() => {
|
|
71
72
|
// Alleen opruimen als er ondertussen niets nieuws achteraan is gezet.
|
|
72
|
-
if (queues.get(key) === tail)
|
|
73
|
+
if (queues.get(key) === tail) {
|
|
73
74
|
queues.delete(key);
|
|
75
|
+
}
|
|
74
76
|
});
|
|
75
77
|
return result;
|
|
76
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/phpstan/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAElE,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAEzF,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/phpstan/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAElE,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAEzF,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QAClD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAElC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,YAAY,CACpB,GAAG,oBAAoB,eAAe,UAAU,kDAAkD;YAChG,iCAAiC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CACpE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,MAAM,OAAO,GAAmB,EAAE,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAAsB;IAEtD,gFAAgF;IAChF,yDAAyD;IACzD,OAAO,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,IAAI,CAAC,CAAC;IAEb,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,OAAO,IAAI,CAAC,CAAC;QACb,uEAAuE;QACvE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAA+B;IAE7E,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,YAAY,CAAC,mBAAmB,OAAO,2DAA2D,CAAC,CAAC;IAChH,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAI,GAAW,EAAE,IAAsB;IAE5D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACtD,iFAAiF;IACjF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE3C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QAClB,sEAAsE;QACtE,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/phpstan.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { ResolvedProject } from './project.js';
|
|
2
|
+
import type { FailureDetails, FailureReason } from './failure.js';
|
|
2
3
|
import type { AnalysisResult, Finding } from './phpstan/output.js';
|
|
4
|
+
import type { Execution } from './phpstan/process.js';
|
|
3
5
|
import type { EffectiveParameters } from './phpstan/parameters.js';
|
|
4
6
|
export type { AnalysisResult, Finding };
|
|
5
7
|
export { collectWarnings } from './phpstan/output.js';
|
|
@@ -163,3 +165,15 @@ export declare function serverInvocation(project: ResolvedProject): {
|
|
|
163
165
|
config: string | null;
|
|
164
166
|
memoryLimit: string | null;
|
|
165
167
|
};
|
|
168
|
+
/**
|
|
169
|
+
* Vertaalt een run die geen bruikbare JSON opleverde naar een melding én een reden.
|
|
170
|
+
*
|
|
171
|
+
* De reden is wat een aanroeper nodig heeft om zélf te herstellen; de tekst is voor
|
|
172
|
+
* wie meeleest. Beide, niet het één in plaats van het ander. Geëxporteerd voor de tests:
|
|
173
|
+
* die kunnen zo elke tak raken zonder een PHPStan-script, dus ook op Windows.
|
|
174
|
+
*/
|
|
175
|
+
export declare function describeFailure(project: ResolvedProject, execution: Execution): {
|
|
176
|
+
message: string;
|
|
177
|
+
reason: FailureReason;
|
|
178
|
+
details: FailureDetails;
|
|
179
|
+
};
|
package/dist/phpstan.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
import { baselineEntriesFor } from './baseline.js';
|
|
4
5
|
import { fromConfig } from './config.js';
|
|
5
6
|
import { PROJECTS_ENV_VAR, ProjectDefaultsError, defaultsFor, isValidMemoryLimit } from './defaults.js';
|
|
6
7
|
import { ProjectError, resolveWithin } from './project.js';
|
|
@@ -8,7 +9,7 @@ import { PhpstanError } from './phpstan/error.js';
|
|
|
8
9
|
import { hostPhp, planHostStart } from './php.js';
|
|
9
10
|
import { RUNNERS_ENV_VAR, naarHost, naarOmgeving, phpstanIn, runnerFor } from './runner.js';
|
|
10
11
|
import { collectWarnings, condenseDetails, toResult, tryParse } from './phpstan/output.js';
|
|
11
|
-
import { execute } from './phpstan/process.js';
|
|
12
|
+
import { execute, wasStopped } from './phpstan/process.js';
|
|
12
13
|
import { enqueue, throwIfAborted, withSlot } from './phpstan/queue.js';
|
|
13
14
|
import { summariseParameters } from './phpstan/parameters.js';
|
|
14
15
|
import { displayPath } from './report.js';
|
|
@@ -39,8 +40,9 @@ export async function clearResultCache(project, options = {}) {
|
|
|
39
40
|
// de verkeerde map.
|
|
40
41
|
const args = ['clear-result-cache', '--no-ansi'];
|
|
41
42
|
const config = options.config ?? defaultConfig(project);
|
|
42
|
-
if (config !== undefined)
|
|
43
|
+
if (config !== undefined) {
|
|
43
44
|
args.push(`--configuration=${config}`);
|
|
45
|
+
}
|
|
44
46
|
const execution = await runPhpstan(project, args, timeoutFor(project, options), options.signal);
|
|
45
47
|
const output = execution.stdout.trim();
|
|
46
48
|
if (execution.code !== 0 || output === '') {
|
|
@@ -117,8 +119,9 @@ function runPhpstan(project, ruweArgs, timeoutMs, signal) {
|
|
|
117
119
|
* al geannuleerd verzoek), en die zeggen de aanroeper meer.
|
|
118
120
|
*/
|
|
119
121
|
function requireRunnable(project) {
|
|
120
|
-
if (runnerFor(project.path) === null)
|
|
122
|
+
if (runnerFor(project.path) === null) {
|
|
121
123
|
requireBinary(project);
|
|
124
|
+
}
|
|
122
125
|
}
|
|
123
126
|
/** Zet de argumenten die paden bevatten om naar de omgeving van de runner. */
|
|
124
127
|
function vertaalArgs(args, project, runner) {
|
|
@@ -179,8 +182,9 @@ const WRITE_IN_RUNNER = 'd="${TMPDIR:-/tmp}"; f="$d/$2"; printf "%s" "$1" > "$f.
|
|
|
179
182
|
*/
|
|
180
183
|
export async function writeInRunner(project, name, content, options = {}) {
|
|
181
184
|
const runner = runnerFor(project.path);
|
|
182
|
-
if (runner === null)
|
|
185
|
+
if (runner === null) {
|
|
183
186
|
throw new Error('writeInRunner is only for a project with a runner');
|
|
187
|
+
}
|
|
184
188
|
const [file, ...prefix] = runner.command;
|
|
185
189
|
const execution = await execute(file, [...prefix, 'sh', '-c', WRITE_IN_RUNNER, 'sh', content, name], project.path, timeoutFor(project, options), options.signal);
|
|
186
190
|
const pad = execution.stdout.trim();
|
|
@@ -211,11 +215,11 @@ export async function diagnose(project, options = {}) {
|
|
|
211
215
|
}
|
|
212
216
|
// Met dezelfde redenen als bij een analyse: zonder viel een timeout hier terug op
|
|
213
217
|
// phpstan_failed, en dan weet een aanroeper niet dat opnieuw met meer tijd helpt.
|
|
214
|
-
if (execution.
|
|
218
|
+
if (wasStopped(execution, execution.code === 0)) {
|
|
215
219
|
const geannuleerd = execution.reason === 'geannuleerd';
|
|
216
220
|
throw new PhpstanError(geannuleerd
|
|
217
221
|
? `The diagnosis of ${project.path} was stopped because the request was cancelled.`
|
|
218
|
-
: `The diagnosis of ${project.path} was stopped
|
|
222
|
+
: `The diagnosis of ${project.path} was stopped${viaSignal(execution.signal)}.`, geannuleerd ? 'cancelled' : 'timeout', geannuleerd ? {} : { hint: 'Raise timeoutSeconds.' });
|
|
219
223
|
}
|
|
220
224
|
// diagnose zet zijn rapport op stdout en alleen de configuratieregel op stderr.
|
|
221
225
|
// Een lege stdout betekent dus dat er iets anders mis is; dan is PHPStans eigen
|
|
@@ -327,8 +331,9 @@ export async function analyseEdited(project, edited, options = {}) {
|
|
|
327
331
|
]);
|
|
328
332
|
}
|
|
329
333
|
finally {
|
|
330
|
-
if (runner === null)
|
|
334
|
+
if (runner === null) {
|
|
331
335
|
rmSync(tmpFile, { force: true });
|
|
336
|
+
}
|
|
332
337
|
}
|
|
333
338
|
}));
|
|
334
339
|
}
|
|
@@ -346,6 +351,10 @@ function writeOnHost(project, edited) {
|
|
|
346
351
|
}
|
|
347
352
|
return file;
|
|
348
353
|
}
|
|
354
|
+
/** Het signaal tussen haakjes, of niets: op Windows stopt taskkill het proces zonder signaal. */
|
|
355
|
+
function viaSignal(signal) {
|
|
356
|
+
return signal === null ? '' : ` (signal ${signal})`;
|
|
357
|
+
}
|
|
349
358
|
async function run(project, options, editor = []) {
|
|
350
359
|
const runner = runnerFor(project.path);
|
|
351
360
|
const timeoutMs = timeoutFor(project, options);
|
|
@@ -357,18 +366,18 @@ async function run(project, options, editor = []) {
|
|
|
357
366
|
if (execution.spawnError !== null) {
|
|
358
367
|
throw new PhpstanError(`PHPStan could not be started in ${project.path}: ${execution.spawnError.message}`);
|
|
359
368
|
}
|
|
360
|
-
|
|
369
|
+
// Eerst proberen te parsen, pas daarna naar de exit code kijken: PHPStan geeft
|
|
370
|
+
// ook exit code 1 als het gewoon fouten gevonden heeft, en meldt configuratie-
|
|
371
|
+
// problemen ín de JSON. De exit code alleen is dus geen betrouwbaar signaal.
|
|
372
|
+
const parsed = tryParse(execution.stdout);
|
|
373
|
+
if (wasStopped(execution, parsed !== null)) {
|
|
361
374
|
throw new PhpstanError(execution.reason === 'geannuleerd'
|
|
362
375
|
? `The analysis of ${project.path} was stopped because the request was cancelled.`
|
|
363
|
-
: `The analysis of ${project.path} was stopped after ${Math.round(timeoutMs / 1000)}s
|
|
364
|
-
|
|
376
|
+
: `The analysis of ${project.path} was stopped after ${Math.round(timeoutMs / 1000)}s` +
|
|
377
|
+
`${viaSignal(execution.signal)}. Analyse a smaller part of the project, or raise timeoutSeconds.`, execution.reason === 'geannuleerd' ? 'cancelled' : 'timeout', execution.reason === 'geannuleerd'
|
|
365
378
|
? {}
|
|
366
379
|
: { hint: 'Analyse a smaller part, or raise timeoutSeconds.' });
|
|
367
380
|
}
|
|
368
|
-
// Eerst proberen te parsen, pas daarna naar de exit code kijken: PHPStan geeft
|
|
369
|
-
// ook exit code 1 als het gewoon fouten gevonden heeft, en meldt configuratie-
|
|
370
|
-
// problemen ín de JSON. De exit code alleen is dus geen betrouwbaar signaal.
|
|
371
|
-
const parsed = tryParse(execution.stdout);
|
|
372
381
|
if (parsed !== null) {
|
|
373
382
|
const result = toResult(project.path, parsed, collectWarnings(execution.stderr));
|
|
374
383
|
return runner === null ? result : vertaalResultaat(result, project.path, runner);
|
|
@@ -385,8 +394,9 @@ async function run(project, options, editor = []) {
|
|
|
385
394
|
*/
|
|
386
395
|
export function loadDefaultMemoryLimit(env = process.env) {
|
|
387
396
|
const configured = (env[MEMORY_LIMIT_ENV_VAR] ?? fromConfig('memoryLimit', env))?.trim();
|
|
388
|
-
if (configured === undefined || configured === '')
|
|
397
|
+
if (configured === undefined || configured === '') {
|
|
389
398
|
return undefined;
|
|
399
|
+
}
|
|
390
400
|
if (!isValidMemoryLimit(configured)) {
|
|
391
401
|
throw new PhpstanError(`${MEMORY_LIMIT_ENV_VAR} is set to "${configured}", and PHPStan does not accept that format. ` +
|
|
392
402
|
'Use a number with an optional K, M or G (e.g. "1G"), or -1 for no limit.');
|
|
@@ -408,8 +418,9 @@ function buildArgs(project, options, editor = []) {
|
|
|
408
418
|
* die van de server. Dezelfde volgorde als bij de geheugenlimiet.
|
|
409
419
|
*/
|
|
410
420
|
function timeoutFor(project, options) {
|
|
411
|
-
if (options.timeoutMs !== undefined)
|
|
421
|
+
if (options.timeoutMs !== undefined) {
|
|
412
422
|
return options.timeoutMs;
|
|
423
|
+
}
|
|
413
424
|
const seconds = defaultsFor(project.path).timeoutSeconds;
|
|
414
425
|
return seconds === undefined ? DEFAULT_TIMEOUT_MS : seconds * 1000;
|
|
415
426
|
}
|
|
@@ -424,14 +435,16 @@ function timeoutFor(project, options) {
|
|
|
424
435
|
*/
|
|
425
436
|
function defaultConfig(project) {
|
|
426
437
|
const config = defaultsFor(project.path).config;
|
|
427
|
-
if (config === undefined)
|
|
438
|
+
if (config === undefined) {
|
|
428
439
|
return undefined;
|
|
440
|
+
}
|
|
429
441
|
try {
|
|
430
442
|
return resolveWithin(project, config);
|
|
431
443
|
}
|
|
432
444
|
catch (error) {
|
|
433
|
-
if (!(error instanceof ProjectError))
|
|
445
|
+
if (!(error instanceof ProjectError)) {
|
|
434
446
|
throw error;
|
|
447
|
+
}
|
|
435
448
|
throw new ProjectDefaultsError(`${PROJECTS_ENV_VAR}: the config "${config}" for ${project.path} cannot be used. ${error.message}`);
|
|
436
449
|
}
|
|
437
450
|
}
|
|
@@ -480,13 +493,16 @@ function flags(project, options) {
|
|
|
480
493
|
// Vóór de rest, zoals PHPStan het zelf ook documenteert: de config bepaalt wat de
|
|
481
494
|
// overige vlaggen overrulen.
|
|
482
495
|
const config = options.config ?? defaultConfig(project);
|
|
483
|
-
if (config !== undefined)
|
|
496
|
+
if (config !== undefined) {
|
|
484
497
|
args.push(`--configuration=${config}`);
|
|
485
|
-
|
|
498
|
+
}
|
|
499
|
+
if (options.level !== undefined) {
|
|
486
500
|
args.push(`--level=${options.level}`);
|
|
501
|
+
}
|
|
487
502
|
const memoryLimit = options.memoryLimit ?? defaults.memoryLimit ?? loadDefaultMemoryLimit();
|
|
488
|
-
if (memoryLimit !== undefined)
|
|
503
|
+
if (memoryLimit !== undefined) {
|
|
489
504
|
args.push(`--memory-limit=${memoryLimit}`);
|
|
505
|
+
}
|
|
490
506
|
return args;
|
|
491
507
|
}
|
|
492
508
|
/** De paden die geanalyseerd worden, met de controle die PHPStan zelf niet uitlegt. */
|
|
@@ -499,14 +515,14 @@ function targets(project, options) {
|
|
|
499
515
|
}
|
|
500
516
|
return paths;
|
|
501
517
|
}
|
|
502
|
-
/** Vertaalt een run die geen bruikbare JSON opleverde naar iets waar je wat mee kunt. */
|
|
503
518
|
/**
|
|
504
519
|
* Vertaalt een run die geen bruikbare JSON opleverde naar een melding én een reden.
|
|
505
520
|
*
|
|
506
521
|
* De reden is wat een aanroeper nodig heeft om zélf te herstellen; de tekst is voor
|
|
507
|
-
* wie meeleest. Beide, niet het één in plaats van het ander.
|
|
522
|
+
* wie meeleest. Beide, niet het één in plaats van het ander. Geëxporteerd voor de tests:
|
|
523
|
+
* die kunnen zo elke tak raken zonder een PHPStan-script, dus ook op Windows.
|
|
508
524
|
*/
|
|
509
|
-
function describeFailure(project, execution) {
|
|
525
|
+
export function describeFailure(project, execution) {
|
|
510
526
|
const details = condenseDetails(execution.stderr.trim() || execution.stdout.trim());
|
|
511
527
|
const gemeen = { exitCode: execution.code, ...oorzaakUit(details) };
|
|
512
528
|
// Nagemeten: een bestand onder `excludePaths` dat expliciet als pad meegaat, geeft
|
|
@@ -521,6 +537,12 @@ function describeFailure(project, execution) {
|
|
|
521
537
|
details: { ...gemeen, hint },
|
|
522
538
|
};
|
|
523
539
|
}
|
|
540
|
+
// PHPStan weigert de config zelf. Zonder eigen tak viel dit in unusable_output, met als
|
|
541
|
+
// advies de cache te legen; nagemeten op `shared`, waar een baseline-entry naar een
|
|
542
|
+
// verwijderd testbestand wees en unmatched_ignores daardoor niets opleverde.
|
|
543
|
+
if (/Invalid entry in ignoreErrors|^\s*Invalid configuration:/im.test(details)) {
|
|
544
|
+
return describeInvalidConfig(project, details, gemeen);
|
|
545
|
+
}
|
|
524
546
|
// De server bouwt de vlaggen zelf en een pad kan geen vlag zijn (resolveWithin), dus
|
|
525
547
|
// een onbekende optie betekent een PHPStan die ouder is dan wat deze tool nodig
|
|
526
548
|
// heeft zoals `--tmp-file` voor inspect_type.
|
|
@@ -580,6 +602,52 @@ function describeFailure(project, execution) {
|
|
|
580
602
|
details: { ...gemeen, hint },
|
|
581
603
|
};
|
|
582
604
|
}
|
|
605
|
+
/**
|
|
606
|
+
* Een config die PHPStan weigert. Bij een pad dat niet bestaat noemt de melding welk bestand
|
|
607
|
+
* de entry bevat, want PHPStan zegt alleen het pad; zonder dat moet het model zelf zoeken
|
|
608
|
+
* tussen de config en een baseline van duizenden regels.
|
|
609
|
+
*
|
|
610
|
+
* PHPStan controleert zo'n pad alleen met `reportUnmatchedIgnoredErrors` aan. Dat zet
|
|
611
|
+
* unmatched_ignores altijd, dus daar faalt het, terwijl een gewone analyse kan slagen als de
|
|
612
|
+
* config het zelf uit heeft staan; de melding zegt dat, anders lijkt het tegenstrijdig.
|
|
613
|
+
*/
|
|
614
|
+
function describeInvalidConfig(project, details, gemeen) {
|
|
615
|
+
const missing = /Path "(.+?)" is neither a directory, nor a file path, nor a fnmatch pattern/.exec(details)?.[1];
|
|
616
|
+
if (missing === undefined) {
|
|
617
|
+
const hint = 'Fix the configuration; retrying or clearing the result cache does not help. diagnose_project shows which configs are included.';
|
|
618
|
+
return {
|
|
619
|
+
message: `PHPStan rejects the configuration of ${project.path}. ${hint}\n\n${details}`,
|
|
620
|
+
reason: 'config_invalid',
|
|
621
|
+
details: { ...gemeen, hint },
|
|
622
|
+
};
|
|
623
|
+
}
|
|
624
|
+
const runner = runnerFor(project.path);
|
|
625
|
+
const path = runner === null ? missing : naarHost(runner, project.path, missing);
|
|
626
|
+
const shown = displayPath(project.path, path);
|
|
627
|
+
const baseline = baselineNaming(project, path);
|
|
628
|
+
const hint = baseline === null
|
|
629
|
+
? `Remove the entry for ${shown} from ignoreErrors in the config, or point it at a file that exists.`
|
|
630
|
+
: `Remove the entry for ${shown} from ${baseline}; prune_baseline does that, if writing is enabled on this server.`;
|
|
631
|
+
return {
|
|
632
|
+
message: `PHPStan refuses the configuration of ${project.path}: ${baseline === null ? 'an ignoreErrors entry in the config' : `an entry in ${baseline}`} ` +
|
|
633
|
+
`names ${shown}, which does not exist. PHPStan only checks this with reportUnmatchedIgnoredErrors on, which ` +
|
|
634
|
+
`unmatched_ignores always turns on; a regular analysis can still work if the config leaves it off. ${hint}\n\n${details}`,
|
|
635
|
+
reason: 'config_invalid',
|
|
636
|
+
details: { ...gemeen, hint },
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Het baseline-bestand met een entry voor dit pad, of null. Stil bij een onleesbaar bestand:
|
|
641
|
+
* dit draait in het faalpad, en daar mag een tweede fout de eerste niet vervangen.
|
|
642
|
+
*/
|
|
643
|
+
function baselineNaming(project, path) {
|
|
644
|
+
try {
|
|
645
|
+
return baselineEntriesFor(project, path)[0]?.file ?? null;
|
|
646
|
+
}
|
|
647
|
+
catch {
|
|
648
|
+
return null;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
583
651
|
/**
|
|
584
652
|
* Haalt de oorzaakregel en het eerste stackframe uit de uitvoer. Die twee zeggen
|
|
585
653
|
* samen wát er misging en wáár het vandaan kwam precies wat je anders zelf uit
|
|
@@ -588,8 +656,9 @@ function describeFailure(project, execution) {
|
|
|
588
656
|
function oorzaakUit(details) {
|
|
589
657
|
const regels = details.split('\n');
|
|
590
658
|
const oorzaak = regels.find((regel) => /^\s*(Error|Fatal error|PHP Fatal error):/i.test(regel));
|
|
591
|
-
if (oorzaak === undefined)
|
|
659
|
+
if (oorzaak === undefined) {
|
|
592
660
|
return {};
|
|
661
|
+
}
|
|
593
662
|
const frame = regels.find((regel) => /^#0\s/.test(regel.trim()));
|
|
594
663
|
const cause = oorzaak.replace(/^\s*(Error|Fatal error|PHP Fatal error):\s*/i, '').trim();
|
|
595
664
|
return {
|