@microsoft/managed-apps-cli 0.7.0 → 0.9.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/README.md +42 -6
- package/dist/ArgumentProvider.d.ts +11 -0
- package/dist/ArgumentProvider.d.ts.map +1 -1
- package/dist/ArgumentProvider.js +61 -19
- package/dist/ArgumentProvider.js.map +1 -1
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts +16 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -1
- package/dist/Authentication/NodeMsalAuthenticationProvider.js +58 -6
- package/dist/Authentication/NodeMsalAuthenticationProvider.js.map +1 -1
- package/dist/Cli.d.ts.map +1 -1
- package/dist/Cli.js +23 -7
- package/dist/Cli.js.map +1 -1
- package/dist/CliSettings.d.ts +2 -2
- package/dist/CliSettings.d.ts.map +1 -1
- package/dist/CliSettings.js +3 -4
- package/dist/CliSettings.js.map +1 -1
- package/dist/CliUtils.d.ts +25 -8
- package/dist/CliUtils.d.ts.map +1 -1
- package/dist/CliUtils.js +19 -23
- package/dist/CliUtils.js.map +1 -1
- package/dist/Constants/CommandRegistry.d.ts.map +1 -1
- package/dist/Constants/CommandRegistry.js +28 -1
- package/dist/Constants/CommandRegistry.js.map +1 -1
- package/dist/Constants/HelpStrings.d.ts +55 -5
- package/dist/Constants/HelpStrings.d.ts.map +1 -1
- package/dist/Constants/HelpStrings.js +113 -42
- package/dist/Constants/HelpStrings.js.map +1 -1
- package/dist/Constants.d.ts +1 -1
- package/dist/Constants.d.ts.map +1 -1
- package/dist/Constants.js +5 -2
- package/dist/Constants.js.map +1 -1
- package/dist/Errors/GitHubErrorMap.d.ts.map +1 -1
- package/dist/Errors/GitHubErrorMap.js +18 -11
- package/dist/Errors/GitHubErrorMap.js.map +1 -1
- package/dist/FS/CliFs.d.ts.map +1 -1
- package/dist/FS/CliFs.js.map +1 -1
- package/dist/HttpClient/CliHttpClient.d.ts +30 -0
- package/dist/HttpClient/CliHttpClient.d.ts.map +1 -1
- package/dist/HttpClient/CliHttpClient.js +136 -1
- package/dist/HttpClient/CliHttpClient.js.map +1 -1
- package/dist/Logger/CliLogger.d.ts +50 -8
- package/dist/Logger/CliLogger.d.ts.map +1 -1
- package/dist/Logger/CliLogger.js +92 -37
- package/dist/Logger/CliLogger.js.map +1 -1
- package/dist/Logger/ConsoleWriter.d.ts +5 -0
- package/dist/Logger/ConsoleWriter.d.ts.map +1 -1
- package/dist/Logger/ConsoleWriter.js +22 -14
- package/dist/Logger/ConsoleWriter.js.map +1 -1
- package/dist/Middletier/FunctionsBundler.js +5 -1
- package/dist/Middletier/FunctionsBundler.js.map +1 -1
- package/dist/Middletier/PackFunctions.d.ts +5 -4
- package/dist/Middletier/PackFunctions.d.ts.map +1 -1
- package/dist/Middletier/PackFunctions.js +8 -7
- package/dist/Middletier/PackFunctions.js.map +1 -1
- package/dist/Types/Cli.types.d.ts +1 -1
- package/dist/Types/Cli.types.d.ts.map +1 -1
- package/dist/Types/Command.types.d.ts +14 -3
- package/dist/Types/Command.types.d.ts.map +1 -1
- package/dist/Types/Command.types.js +4 -0
- package/dist/Types/Command.types.js.map +1 -1
- package/dist/Utils/BuildPolling.d.ts +18 -0
- package/dist/Utils/BuildPolling.d.ts.map +1 -0
- package/dist/Utils/BuildPolling.js +63 -0
- package/dist/Utils/BuildPolling.js.map +1 -0
- package/dist/Utils/BuildVerbDescriptionTable.d.ts +11 -1
- package/dist/Utils/BuildVerbDescriptionTable.d.ts.map +1 -1
- package/dist/Utils/BuildVerbDescriptionTable.js +73 -17
- package/dist/Utils/BuildVerbDescriptionTable.js.map +1 -1
- package/dist/Utils/DcfRecovery.d.ts +84 -0
- package/dist/Utils/DcfRecovery.d.ts.map +1 -0
- package/dist/Utils/DcfRecovery.js +266 -0
- package/dist/Utils/DcfRecovery.js.map +1 -0
- package/dist/Utils/EnhanceNetworkError.d.ts.map +1 -1
- package/dist/Utils/EnhanceNetworkError.js +2 -0
- package/dist/Utils/EnhanceNetworkError.js.map +1 -1
- package/dist/Utils/EnvVars.d.ts +1 -1
- package/dist/Utils/EnvVars.d.ts.map +1 -1
- package/dist/Utils/EnvVars.js.map +1 -1
- package/dist/Utils/RepoUrl.d.ts +11 -6
- package/dist/Utils/RepoUrl.d.ts.map +1 -1
- package/dist/Utils/RepoUrl.js +1 -1
- package/dist/Utils/RepoUrl.js.map +1 -1
- package/dist/Utils/ResolveCommand.d.ts +37 -1
- package/dist/Utils/ResolveCommand.d.ts.map +1 -1
- package/dist/Utils/ResolveCommand.js +97 -20
- package/dist/Utils/ResolveCommand.js.map +1 -1
- package/dist/Verbs/AddConnector.d.ts.map +1 -1
- package/dist/Verbs/AddConnector.js.map +1 -1
- package/dist/Verbs/AddConnectorFlows.d.ts.map +1 -1
- package/dist/Verbs/AddConnectorFlows.js +2 -2
- package/dist/Verbs/AddConnectorFlows.js.map +1 -1
- package/dist/Verbs/BuildMaafApp.d.ts.map +1 -1
- package/dist/Verbs/BuildMaafApp.js +98 -22
- package/dist/Verbs/BuildMaafApp.js.map +1 -1
- package/dist/Verbs/ConnectorHelpers.d.ts.map +1 -1
- package/dist/Verbs/ConnectorHelpers.js.map +1 -1
- package/dist/Verbs/CreateMaafApp.d.ts +54 -5
- package/dist/Verbs/CreateMaafApp.d.ts.map +1 -1
- package/dist/Verbs/CreateMaafApp.js +238 -238
- package/dist/Verbs/CreateMaafApp.js.map +1 -1
- package/dist/Verbs/DeployMaafApp.d.ts.map +1 -1
- package/dist/Verbs/DeployMaafApp.js +48 -20
- package/dist/Verbs/DeployMaafApp.js.map +1 -1
- package/dist/Verbs/GetMaafBuildStatus.d.ts.map +1 -1
- package/dist/Verbs/GetMaafBuildStatus.js +66 -17
- package/dist/Verbs/GetMaafBuildStatus.js.map +1 -1
- package/dist/Verbs/GetSettings.d.ts.map +1 -1
- package/dist/Verbs/GetSettings.js +9 -18
- package/dist/Verbs/GetSettings.js.map +1 -1
- package/dist/Verbs/Init.d.ts.map +1 -1
- package/dist/Verbs/Init.js +63 -46
- package/dist/Verbs/Init.js.map +1 -1
- package/dist/Verbs/ListFlows.d.ts.map +1 -1
- package/dist/Verbs/ListFlows.js +1 -2
- package/dist/Verbs/ListFlows.js.map +1 -1
- package/dist/Verbs/MaafAppPermissions.d.ts +12 -6
- package/dist/Verbs/MaafAppPermissions.d.ts.map +1 -1
- package/dist/Verbs/MaafAppPermissions.js +208 -66
- package/dist/Verbs/MaafAppPermissions.js.map +1 -1
- package/dist/Verbs/PlayMaafApp.d.ts +22 -0
- package/dist/Verbs/PlayMaafApp.d.ts.map +1 -0
- package/dist/Verbs/PlayMaafApp.js +147 -0
- package/dist/Verbs/PlayMaafApp.js.map +1 -0
- package/dist/Verbs/RefreshDataSource.d.ts.map +1 -1
- package/dist/Verbs/RefreshDataSource.js.map +1 -1
- package/dist/Verbs/RefreshGitAuth.d.ts.map +1 -1
- package/dist/Verbs/RefreshGitAuth.js +31 -16
- package/dist/Verbs/RefreshGitAuth.js.map +1 -1
- package/dist/Verbs/SetSetting.d.ts.map +1 -1
- package/dist/Verbs/SetSetting.js +39 -49
- package/dist/Verbs/SetSetting.js.map +1 -1
- package/dist/Verbs/ShareLinkCreate.d.ts +23 -0
- package/dist/Verbs/ShareLinkCreate.d.ts.map +1 -0
- package/dist/Verbs/ShareLinkCreate.js +73 -0
- package/dist/Verbs/ShareLinkCreate.js.map +1 -0
- package/dist/Verbs/ShareLinkList.d.ts +16 -0
- package/dist/Verbs/ShareLinkList.d.ts.map +1 -0
- package/dist/Verbs/ShareLinkList.js +84 -0
- package/dist/Verbs/ShareLinkList.js.map +1 -0
- package/dist/Verbs/ShareLinkRevoke.d.ts +22 -0
- package/dist/Verbs/ShareLinkRevoke.d.ts.map +1 -0
- package/dist/Verbs/ShareLinkRevoke.js +137 -0
- package/dist/Verbs/ShareLinkRevoke.js.map +1 -0
- package/dist/Verbs/VerbConstants.d.ts +113 -16
- package/dist/Verbs/VerbConstants.d.ts.map +1 -1
- package/dist/Verbs/VerbConstants.js +102 -24
- package/dist/Verbs/VerbConstants.js.map +1 -1
- package/dist/Verbs/index.d.ts +4 -0
- package/dist/Verbs/index.d.ts.map +1 -1
- package/dist/Verbs/index.js +4 -0
- package/dist/Verbs/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -12,6 +12,9 @@ export class CliHttpClient {
|
|
|
12
12
|
_forwardUrl;
|
|
13
13
|
_inflight = 0;
|
|
14
14
|
_spinner = new CliSpinner();
|
|
15
|
+
_firstAuthCallback;
|
|
16
|
+
_firstAuthFired = false;
|
|
17
|
+
_logger;
|
|
15
18
|
/**
|
|
16
19
|
* @param _authenticationProvider — provides bearer tokens for `authResource`-tagged requests.
|
|
17
20
|
* @param _forwardUrl — when set, every request is forwarded to this URL with the original
|
|
@@ -22,6 +25,22 @@ export class CliHttpClient {
|
|
|
22
25
|
this._authenticationProvider = _authenticationProvider;
|
|
23
26
|
this._forwardUrl = _forwardUrl;
|
|
24
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Register a one-shot callback that fires (fire-and-forget) after the first successful
|
|
30
|
+
* token acquisition through an authed request. Used by `CliLogger` to lazily upgrade
|
|
31
|
+
* its OneDS writer from the unauthenticated default to the EU-aware authed configuration
|
|
32
|
+
* once we know auth is working. The callback runs in the background — it does NOT block
|
|
33
|
+
* the request that triggered it.
|
|
34
|
+
*
|
|
35
|
+
* Calling this more than once replaces the previous callback. Calling it after the first
|
|
36
|
+
* authed request has already happened is a no-op (the one-shot has already passed).
|
|
37
|
+
*/
|
|
38
|
+
onFirstAuth(callback) {
|
|
39
|
+
this._firstAuthCallback = callback;
|
|
40
|
+
}
|
|
41
|
+
setLogger(logger) {
|
|
42
|
+
this._logger = logger;
|
|
43
|
+
}
|
|
25
44
|
async get(url, config) {
|
|
26
45
|
return this._sendRequestAsync(url, 'GET', config);
|
|
27
46
|
}
|
|
@@ -39,6 +58,24 @@ export class CliHttpClient {
|
|
|
39
58
|
}
|
|
40
59
|
async _sendRequestAsync(url, method, config) {
|
|
41
60
|
this._startSpinner();
|
|
61
|
+
const start = performance.now();
|
|
62
|
+
// Core fields mirror the shape emitted by
|
|
63
|
+
// `packages/managed-apps-common/src/http/middleware/telemetryMiddleware.ts`
|
|
64
|
+
// so a single Kusto query over `HttpClient.Request` covers CLI + runtime.
|
|
65
|
+
// CLI-specific attribution (forwardUrl, authResource, header allowlist) is
|
|
66
|
+
// appended alongside.
|
|
67
|
+
let scenarioData = {
|
|
68
|
+
url,
|
|
69
|
+
method,
|
|
70
|
+
status: 0,
|
|
71
|
+
succeeded: false,
|
|
72
|
+
duration: 0,
|
|
73
|
+
retried: false,
|
|
74
|
+
retryCount: 0,
|
|
75
|
+
forwardUrl: this._forwardUrl || '',
|
|
76
|
+
authResource: config?.authResource || '',
|
|
77
|
+
allowErrorResponse: config?.allowErrorResponse ? 'true' : 'false',
|
|
78
|
+
};
|
|
42
79
|
try {
|
|
43
80
|
const headers = config?.headers || {};
|
|
44
81
|
if (config?.authResource) {
|
|
@@ -47,6 +84,15 @@ export class CliHttpClient {
|
|
|
47
84
|
if (token) {
|
|
48
85
|
headers.Authorization = `Bearer ${token}`;
|
|
49
86
|
}
|
|
87
|
+
// Successful token acquisition is the lazy-auth signal — fire the registered
|
|
88
|
+
// callback once, in the background, so it doesn't block this request.
|
|
89
|
+
if (token && this._firstAuthCallback && !this._firstAuthFired) {
|
|
90
|
+
this._firstAuthFired = true;
|
|
91
|
+
this._firstAuthCallback().catch(() => {
|
|
92
|
+
// Callback owns its own error handling; we don't want a background failure to
|
|
93
|
+
// pollute the current request's outcome.
|
|
94
|
+
});
|
|
95
|
+
}
|
|
50
96
|
}
|
|
51
97
|
if (config?.contentType) {
|
|
52
98
|
headers['Content-Type'] = config.contentType;
|
|
@@ -69,7 +115,19 @@ export class CliHttpClient {
|
|
|
69
115
|
headers,
|
|
70
116
|
body: bodyContent,
|
|
71
117
|
};
|
|
118
|
+
scenarioData = {
|
|
119
|
+
...scenarioData,
|
|
120
|
+
...CliHttpClient._selectHeadersForLogging(headers, 'request'),
|
|
121
|
+
};
|
|
72
122
|
const response = await fetch(targetUrl, requestOptions);
|
|
123
|
+
scenarioData.status = response.status;
|
|
124
|
+
scenarioData.succeeded = response.ok;
|
|
125
|
+
scenarioData.duration = performance.now() - start;
|
|
126
|
+
scenarioData.correlationRequestId =
|
|
127
|
+
response.headers.get('x-ms-correlation-request-id') ?? undefined;
|
|
128
|
+
scenarioData.serverRequestId = response.headers.get('x-ms-request-id') ?? undefined;
|
|
129
|
+
scenarioData.contentType = response.headers.get('content-type') ?? undefined;
|
|
130
|
+
scenarioData.contentLength = response.headers.get('content-length') ?? undefined;
|
|
73
131
|
if (!response.ok && !config?.allowErrorResponse) {
|
|
74
132
|
const correlationId = response.headers.get('x-ms-correlation-id');
|
|
75
133
|
const correlationSuffix = correlationId ? ` (correlation ID: ${correlationId})` : '';
|
|
@@ -77,12 +135,30 @@ export class CliHttpClient {
|
|
|
77
135
|
// In forward mode the response came from the forwarder, not the
|
|
78
136
|
// original target — surface both so it's clear which hop failed.
|
|
79
137
|
const urlSuffix = this._forwardUrl ? `${url} via ${this._forwardUrl}` : url;
|
|
138
|
+
scenarioData.code = parseServerErrorCode(errorBody);
|
|
139
|
+
scenarioData = {
|
|
140
|
+
...scenarioData,
|
|
141
|
+
...CliHttpClient._selectHeadersForLogging(response.headers, 'response'),
|
|
142
|
+
};
|
|
80
143
|
throw new HttpClientError(`HTTP error status: ${response.status} for ${method} ${urlSuffix}${correlationSuffix}: ${errorBody}`, {
|
|
81
144
|
status: response.status,
|
|
82
145
|
code: parseServerErrorCode(errorBody),
|
|
83
146
|
body: errorBody,
|
|
84
147
|
});
|
|
85
148
|
}
|
|
149
|
+
try {
|
|
150
|
+
// Falls through for both successful responses and error responses when
|
|
151
|
+
// allowErrorResponse is true. Always emit `HttpClient.Request` to keep
|
|
152
|
+
// the telemetry vocabulary aligned with telemetryMiddleware.ts.
|
|
153
|
+
scenarioData = {
|
|
154
|
+
...CliHttpClient._selectHeadersForLogging(response.headers, 'response'),
|
|
155
|
+
...scenarioData,
|
|
156
|
+
};
|
|
157
|
+
this._logger?.trackActivityEvent('HttpClient.Request', scenarioData);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// No-op. Telemetry failures should not block CLI operations
|
|
161
|
+
}
|
|
86
162
|
// When allowErrorResponse is true and we got a non-2xx, fall through to parse the body
|
|
87
163
|
// so callers can inspect the structured error envelope (e.g. { error: { code, message } }).
|
|
88
164
|
const data = await this._parseResponse(response);
|
|
@@ -94,7 +170,21 @@ export class CliHttpClient {
|
|
|
94
170
|
}
|
|
95
171
|
catch (error) {
|
|
96
172
|
const errorUrl = this._forwardUrl ? `${url} via ${this._forwardUrl}` : url;
|
|
97
|
-
|
|
173
|
+
const enhancedError = enhanceNetworkError(error, method, errorUrl);
|
|
174
|
+
scenarioData.duration = performance.now() - start;
|
|
175
|
+
scenarioData.networkErrorCode = enhancedError.name;
|
|
176
|
+
scenarioData.name = enhancedError.name;
|
|
177
|
+
try {
|
|
178
|
+
// Mirror telemetryMiddleware: emit the same `HttpClient.Request` event
|
|
179
|
+
// for failures so success/failure share a single query surface.
|
|
180
|
+
// `succeeded`/`status` already default to false/0 from the initializer
|
|
181
|
+
// and remain unchanged unless we got an HTTP response above.
|
|
182
|
+
this._logger?.trackActivityEvent('HttpClient.Request', scenarioData);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// No-op. Telemetry failures should not block CLI operations
|
|
186
|
+
}
|
|
187
|
+
throw enhancedError;
|
|
98
188
|
}
|
|
99
189
|
finally {
|
|
100
190
|
this._stopSpinner();
|
|
@@ -131,6 +221,51 @@ export class CliHttpClient {
|
|
|
131
221
|
return responseText;
|
|
132
222
|
}
|
|
133
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Allowlist of headers that are safe to emit to telemetry. Anything not in this
|
|
226
|
+
* list is dropped to avoid leaking bearer tokens, cookies, or other secrets.
|
|
227
|
+
* Keys are matched case-insensitively.
|
|
228
|
+
*/
|
|
229
|
+
static _LOGGABLE_REQUEST_HEADERS = new Set([
|
|
230
|
+
'content-type',
|
|
231
|
+
MS_CLIENT_REQUESTID.toLowerCase(),
|
|
232
|
+
MS_TARGET_URL.toLowerCase(),
|
|
233
|
+
MS_AUTH_RESOURCE.toLowerCase(),
|
|
234
|
+
]);
|
|
235
|
+
static _LOGGABLE_RESPONSE_HEADERS = new Set([
|
|
236
|
+
'content-type',
|
|
237
|
+
'x-ms-correlation-id',
|
|
238
|
+
'x-ms-request-id',
|
|
239
|
+
'retry-after',
|
|
240
|
+
]);
|
|
241
|
+
/**
|
|
242
|
+
* Filter headers to only those that are allowlisted or start with 'x-ms-' (Microsoft-specific
|
|
243
|
+
* headers), and prefix keys with 'reqHeader.' or 'resHeader.' for disambiguation in telemetry.
|
|
244
|
+
*
|
|
245
|
+
* motivation: The CLI may be used to call arbitrary endpoints (including via the forwarding feature).
|
|
246
|
+
*/
|
|
247
|
+
static _selectHeadersForLogging(headers, kind) {
|
|
248
|
+
const allowlist = kind === 'request'
|
|
249
|
+
? CliHttpClient._LOGGABLE_REQUEST_HEADERS
|
|
250
|
+
: CliHttpClient._LOGGABLE_RESPONSE_HEADERS;
|
|
251
|
+
const result = {};
|
|
252
|
+
const prefix = kind === 'request' ? 'reqHeader.' : 'resHeader.';
|
|
253
|
+
const visit = (name, value) => {
|
|
254
|
+
const lower = name.toLowerCase();
|
|
255
|
+
if (allowlist.has(lower) || lower.startsWith('x-ms-')) {
|
|
256
|
+
result[`${prefix}${lower}`] = value;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
if (headers instanceof Headers) {
|
|
260
|
+
headers.forEach((value, name) => visit(name, value));
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
264
|
+
visit(name, value);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return result;
|
|
268
|
+
}
|
|
134
269
|
async _transformHeaders(headers) {
|
|
135
270
|
const result = {};
|
|
136
271
|
headers.forEach((value, key) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliHttpClient.js","sourceRoot":"","sources":["../../src/HttpClient/CliHttpClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EACL,UAAU,EACV,eAAe,EACf,oBAAoB,GACrB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"CliHttpClient.js","sourceRoot":"","sources":["../../src/HttpClient/CliHttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,65 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import type { IHttpClient } from '@microsoft/managed-apps-actions';
|
|
5
4
|
import type { ILogger, ScenarioTracker } from '@microsoft/managed-apps-common/telemetry';
|
|
5
|
+
import type { CliHttpClient } from '../HttpClient/CliHttpClient.js';
|
|
6
6
|
import type { CliSettings, IAuthenticationProvider } from '../Types/Cli.types.js';
|
|
7
7
|
/**
|
|
8
|
-
* Logger implementation for the CLI
|
|
9
|
-
*
|
|
8
|
+
* Logger implementation for the CLI.
|
|
9
|
+
*
|
|
10
|
+
* Telemetry is **unauthenticated by default**: the OneDS writer is constructed at
|
|
11
|
+
* `create()` time with `telemetryLocation: 'global'` and no `geoLocation`, so events
|
|
12
|
+
* start flowing immediately without any auth dependency. The writer is then upgraded to
|
|
13
|
+
* the EU-aware authed version via one of two paths:
|
|
14
|
+
*
|
|
15
|
+
* - `tryEagerUpgradeAsync` — called from `runVerb` after MSAL is initialized. If a
|
|
16
|
+
* cached account already exists, the upgrade runs synchronously before the first event
|
|
17
|
+
* so signed-in users get authed telemetry for the entire session.
|
|
18
|
+
* - `CliHttpClient.onFirstAuth` callback — registered in `create()`, fires (background)
|
|
19
|
+
* after the verb's first successful authed HTTP call. Handles users who sign in
|
|
20
|
+
* mid-session via MSAL.
|
|
21
|
+
*
|
|
22
|
+
* Verbs that never make an authed HTTP call and have no cached account stay on the
|
|
23
|
+
* unauthenticated writer for their whole lifetime — events still reach 1DS, just on
|
|
24
|
+
* the global endpoint with no `geoLocation` or `tenantId`.
|
|
25
|
+
*
|
|
26
|
+
* 1DS event submission uses its own ingestion credentials (not the Entra bearer token),
|
|
27
|
+
* so events can be sent regardless of sign-in state.
|
|
10
28
|
*/
|
|
11
29
|
export declare class CliLogger implements ILogger {
|
|
12
30
|
private _telemetryWriters;
|
|
13
|
-
private
|
|
31
|
+
private _unauthWriter?;
|
|
32
|
+
private _upgradeFired;
|
|
33
|
+
private _upgradeConfig?;
|
|
14
34
|
private constructor();
|
|
15
|
-
static create(cliSettings: CliSettings, httpClient:
|
|
35
|
+
static create(cliSettings: CliSettings, httpClient: CliHttpClient, authenticationProvider: IAuthenticationProvider): Promise<CliLogger>;
|
|
16
36
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
37
|
+
* Eagerly run the upgrade when a cached account already exists at verb-start time,
|
|
38
|
+
* so even the first telemetry event of the session lands on the authenticated writer.
|
|
39
|
+
* Called from `ArgumentProvider.runVerb` after `authProvider.initAsync(region)` but
|
|
40
|
+
* before any event is emitted.
|
|
41
|
+
*
|
|
42
|
+
* No-op if no cached account is present (we don't want to block CLI startup on a
|
|
43
|
+
* network call when the user isn't even signed in), or if the upgrade has already
|
|
44
|
+
* fired. For not-signed-in users the lazy `onFirstAuth` path still handles things
|
|
45
|
+
* later if the verb itself triggers a sign-in.
|
|
46
|
+
*
|
|
47
|
+
* Cost: ~100-500ms for signed-in users — the time `getEnvironmentByName` takes.
|
|
48
|
+
* Signed-in-but-offline users will block on the default fetch timeout before
|
|
49
|
+
* falling through; events still flow to the unauthenticated writer in that case.
|
|
19
50
|
*/
|
|
20
|
-
|
|
51
|
+
tryEagerUpgradeAsync(authenticationProvider: IAuthenticationProvider): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Replaces the unauthenticated OneDS writer with an EU-aware authed one. Called from
|
|
54
|
+
* two paths:
|
|
55
|
+
* - `tryEagerUpgradeAsync` (blocking, before the first event) when a cached account
|
|
56
|
+
* is already present at verb-start time.
|
|
57
|
+
* - `CliHttpClient.onFirstAuth` (fire-and-forget) after the verb's first successful
|
|
58
|
+
* authed HTTP call, when the user signed in mid-session.
|
|
59
|
+
* Best-effort — on any failure the unauthenticated writer stays in place and events
|
|
60
|
+
* keep flowing to the global endpoint.
|
|
61
|
+
*/
|
|
62
|
+
private _upgradeToAuthedWriterAsync;
|
|
21
63
|
setCustomDimension(_key: string, _value: string): void;
|
|
22
64
|
trackActivityEvent(eventName: string, eventData?: object): void;
|
|
23
65
|
trackErrorEvent(eventName: string, eventData?: object): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliLogger.d.ts","sourceRoot":"","sources":["../../src/Logger/CliLogger.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"CliLogger.d.ts","sourceRoot":"","sources":["../../src/Logger/CliLogger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAIzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EAExB,MAAM,oBAAoB,CAAC;AA0F5B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,SAAU,YAAW,OAAO;IACvC,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAC,CAMrB;IAEF,OAAO;WAIa,MAAM,CACxB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,aAAa,EACzB,sBAAsB,EAAE,uBAAuB,GAC9C,OAAO,CAAC,SAAS,CAAC;IA0CrB;;;;;;;;;;;;;;OAcG;IACU,oBAAoB,CAC/B,sBAAsB,EAAE,uBAAuB,GAC9C,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;;;;OASG;YACW,2BAA2B;IAkDlC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAatD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAW/D,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAW5D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe;IAqBrE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5D,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIvD,YAAY,CAAC,SAAS,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI5E,IAAW,SAAS,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED,IAAW,SAAS,CAAC,MAAM,EAAE,MAAM,EAElC;IAEM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO;CAMjF"}
|
package/dist/Logger/CliLogger.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import { getEnvironmentByName
|
|
5
|
-
import {
|
|
4
|
+
import { getEnvironmentByName } from '@microsoft/managed-apps-actions';
|
|
5
|
+
import { cloudToRegionSafe } from '@microsoft/managed-apps-common/services';
|
|
6
6
|
import { randomUUID } from 'crypto';
|
|
7
7
|
import packageJson from '../../package.json' with { type: 'json' };
|
|
8
|
-
import { printError } from '../Utils/ConsoleOutput.js';
|
|
9
8
|
import { ConsoleWriter } from './ConsoleWriter.js';
|
|
10
9
|
import { EUGeoRegions } from './Constants.js';
|
|
11
10
|
import { resolveUserTelemetrySettings } from './LoggerSettings.js';
|
|
@@ -85,16 +84,36 @@ function createScenarioLogger(telemetryWriters, name, data) {
|
|
|
85
84
|
return base;
|
|
86
85
|
}
|
|
87
86
|
/**
|
|
88
|
-
* Logger implementation for the CLI
|
|
89
|
-
*
|
|
87
|
+
* Logger implementation for the CLI.
|
|
88
|
+
*
|
|
89
|
+
* Telemetry is **unauthenticated by default**: the OneDS writer is constructed at
|
|
90
|
+
* `create()` time with `telemetryLocation: 'global'` and no `geoLocation`, so events
|
|
91
|
+
* start flowing immediately without any auth dependency. The writer is then upgraded to
|
|
92
|
+
* the EU-aware authed version via one of two paths:
|
|
93
|
+
*
|
|
94
|
+
* - `tryEagerUpgradeAsync` — called from `runVerb` after MSAL is initialized. If a
|
|
95
|
+
* cached account already exists, the upgrade runs synchronously before the first event
|
|
96
|
+
* so signed-in users get authed telemetry for the entire session.
|
|
97
|
+
* - `CliHttpClient.onFirstAuth` callback — registered in `create()`, fires (background)
|
|
98
|
+
* after the verb's first successful authed HTTP call. Handles users who sign in
|
|
99
|
+
* mid-session via MSAL.
|
|
100
|
+
*
|
|
101
|
+
* Verbs that never make an authed HTTP call and have no cached account stay on the
|
|
102
|
+
* unauthenticated writer for their whole lifetime — events still reach 1DS, just on
|
|
103
|
+
* the global endpoint with no `geoLocation` or `tenantId`.
|
|
104
|
+
*
|
|
105
|
+
* 1DS event submission uses its own ingestion credentials (not the Entra bearer token),
|
|
106
|
+
* so events can be sent regardless of sign-in state.
|
|
90
107
|
*/
|
|
91
108
|
export class CliLogger {
|
|
92
109
|
_telemetryWriters = [];
|
|
93
|
-
|
|
110
|
+
_unauthWriter;
|
|
111
|
+
_upgradeFired = false;
|
|
112
|
+
_upgradeConfig;
|
|
94
113
|
constructor(telemetryWriters) {
|
|
95
114
|
this._telemetryWriters = telemetryWriters;
|
|
96
115
|
}
|
|
97
|
-
static async create(cliSettings, httpClient) {
|
|
116
|
+
static async create(cliSettings, httpClient, authenticationProvider) {
|
|
98
117
|
const environmentId = cliSettings.appConfig?.environmentId;
|
|
99
118
|
const region = cloudToRegionSafe(cliSettings.appConfig?.cloud);
|
|
100
119
|
const appId = cliSettings.appConfig?.appId;
|
|
@@ -102,53 +121,89 @@ export class CliLogger {
|
|
|
102
121
|
const telemetryWriters = [];
|
|
103
122
|
const userTelemetrySettings = resolveUserTelemetrySettings();
|
|
104
123
|
if (userTelemetrySettings.console) {
|
|
105
|
-
telemetryWriters.push(new ConsoleWriter());
|
|
124
|
+
telemetryWriters.push(new ConsoleWriter(sessionId, cliSettings.origin));
|
|
106
125
|
}
|
|
107
126
|
const instance = new CliLogger(telemetryWriters);
|
|
108
127
|
if (userTelemetrySettings.remote && region && environmentId) {
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
128
|
+
// Push the unauthenticated writer immediately. Defaults to the global 1DS endpoint
|
|
129
|
+
// and omits `geoLocation`; if/when auth succeeds, the upgrade swaps in the EU-aware
|
|
130
|
+
// writer below.
|
|
131
|
+
const unauth = new OneDSWriter(sessionId, region, 'global', environmentId, appId ?? '', undefined, packageJson.version, cliSettings.origin);
|
|
132
|
+
instance._unauthWriter = unauth;
|
|
133
|
+
instance._telemetryWriters.push(unauth);
|
|
134
|
+
instance._upgradeConfig = { sessionId, region, environmentId, appId, cliSettings };
|
|
135
|
+
// Register the lazy upgrade: fires once when the verb makes its first successful
|
|
136
|
+
// authed HTTP call. By that point we know auth works, so the metadata fetch can't
|
|
137
|
+
// pop a browser.
|
|
138
|
+
httpClient.onFirstAuth(() => instance._upgradeToAuthedWriterAsync(authenticationProvider));
|
|
118
139
|
}
|
|
119
140
|
return instance;
|
|
120
141
|
}
|
|
121
142
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
143
|
+
* Eagerly run the upgrade when a cached account already exists at verb-start time,
|
|
144
|
+
* so even the first telemetry event of the session lands on the authenticated writer.
|
|
145
|
+
* Called from `ArgumentProvider.runVerb` after `authProvider.initAsync(region)` but
|
|
146
|
+
* before any event is emitted.
|
|
147
|
+
*
|
|
148
|
+
* No-op if no cached account is present (we don't want to block CLI startup on a
|
|
149
|
+
* network call when the user isn't even signed in), or if the upgrade has already
|
|
150
|
+
* fired. For not-signed-in users the lazy `onFirstAuth` path still handles things
|
|
151
|
+
* later if the verb itself triggers a sign-in.
|
|
152
|
+
*
|
|
153
|
+
* Cost: ~100-500ms for signed-in users — the time `getEnvironmentByName` takes.
|
|
154
|
+
* Signed-in-but-offline users will block on the default fetch timeout before
|
|
155
|
+
* falling through; events still flow to the unauthenticated writer in that case.
|
|
124
156
|
*/
|
|
125
|
-
async
|
|
126
|
-
if (!this.
|
|
157
|
+
async tryEagerUpgradeAsync(authenticationProvider) {
|
|
158
|
+
if (this._upgradeFired || !this._upgradeConfig) {
|
|
127
159
|
return;
|
|
128
160
|
}
|
|
129
|
-
|
|
130
|
-
|
|
161
|
+
if (await authenticationProvider.getCachedAccountAsync()) {
|
|
162
|
+
await this._upgradeToAuthedWriterAsync(authenticationProvider);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Replaces the unauthenticated OneDS writer with an EU-aware authed one. Called from
|
|
167
|
+
* two paths:
|
|
168
|
+
* - `tryEagerUpgradeAsync` (blocking, before the first event) when a cached account
|
|
169
|
+
* is already present at verb-start time.
|
|
170
|
+
* - `CliHttpClient.onFirstAuth` (fire-and-forget) after the verb's first successful
|
|
171
|
+
* authed HTTP call, when the user signed in mid-session.
|
|
172
|
+
* Best-effort — on any failure the unauthenticated writer stays in place and events
|
|
173
|
+
* keep flowing to the global endpoint.
|
|
174
|
+
*/
|
|
175
|
+
async _upgradeToAuthedWriterAsync(authenticationProvider) {
|
|
176
|
+
if (this._upgradeFired || !this._upgradeConfig || !this._unauthWriter) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
this._upgradeFired = true;
|
|
180
|
+
const { sessionId, region, environmentId, appId, cliSettings } = this._upgradeConfig;
|
|
131
181
|
try {
|
|
132
|
-
// Initialize player services to get environment metadata
|
|
133
|
-
initializePlayerServices({
|
|
134
|
-
httpClient,
|
|
135
|
-
environmentName: cliSettings.appConfig?.environmentId || 'default',
|
|
136
|
-
region: cloudToRegionSafe(cliSettings.appConfig?.cloud) ?? cloudToRegion('public'),
|
|
137
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
138
|
-
});
|
|
139
182
|
const metadata = await getEnvironmentByName(environmentId);
|
|
140
183
|
let telemetryLocation = 'global';
|
|
141
184
|
if (metadata?.properties?.location && EUGeoRegions.has(metadata.properties.location)) {
|
|
142
185
|
telemetryLocation = 'eu';
|
|
143
186
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
187
|
+
const authed = new OneDSWriter(sessionId, region, telemetryLocation, environmentId, appId ?? '', metadata?.properties?.cluster?.geoShortName, packageJson.version, cliSettings.origin);
|
|
188
|
+
// Replace the unauth writer in place. Pre-upgrade events have already been
|
|
189
|
+
// dispatched to the unauth writer's channel; we don't re-send them.
|
|
190
|
+
const idx = this._telemetryWriters.indexOf(this._unauthWriter);
|
|
191
|
+
if (idx >= 0) {
|
|
192
|
+
this._telemetryWriters[idx] = authed;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
this._telemetryWriters.push(authed);
|
|
196
|
+
}
|
|
197
|
+
this._unauthWriter = authed;
|
|
198
|
+
// Set the tenantId dimension AFTER the swap so it lands on the authed writer
|
|
199
|
+
// (and any ConsoleWriter that's still in the list), not the discarded unauth one.
|
|
200
|
+
const tenantId = authenticationProvider.getUserTenantId();
|
|
201
|
+
if (tenantId) {
|
|
202
|
+
this.setCustomDimension('tenantId', tenantId);
|
|
203
|
+
}
|
|
148
204
|
}
|
|
149
|
-
|
|
150
|
-
//
|
|
151
|
-
this.setCustomDimension('tenantId', authenticationProvider.getUserTenantId());
|
|
205
|
+
catch {
|
|
206
|
+
// Best-effort. Unauth writer stays in place; subsequent events keep going to global.
|
|
152
207
|
}
|
|
153
208
|
}
|
|
154
209
|
setCustomDimension(_key, _value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliLogger.js","sourceRoot":"","sources":["../../src/Logger/CliLogger.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"CliLogger.js","sourceRoot":"","sources":["../../src/Logger/CliLogger.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { ITelemetryWriter } from '../Types/LoggerTypes.types.js';
|
|
5
5
|
export declare class ConsoleWriter implements ITelemetryWriter {
|
|
6
|
+
private readonly _activity;
|
|
7
|
+
private readonly _scenario;
|
|
8
|
+
private readonly _error;
|
|
9
|
+
private readonly _warn;
|
|
10
|
+
constructor(sessionId: string, origin: string);
|
|
6
11
|
trackActivityEvent(eventName: string, eventData?: object): void;
|
|
7
12
|
trackErrorEvent(eventName: string, eventData?: object): void;
|
|
8
13
|
startScenario(scenarioName: string, startData?: object): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleWriter.d.ts","sourceRoot":"","sources":["../../src/Logger/ConsoleWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"ConsoleWriter.d.ts","sourceRoot":"","sources":["../../src/Logger/ConsoleWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAwBnE,qBAAa,aAAc,YAAW,gBAAgB;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;gBAEd,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAO7C,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAI/D,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5D,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAI7D,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAInE,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhE,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI;IAItF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAG9D"}
|
|
@@ -2,37 +2,45 @@
|
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
4
|
import { styleText } from 'node:util';
|
|
5
|
-
|
|
6
|
-
//
|
|
7
|
-
|
|
5
|
+
// Build a per-style logger that captures sessionId/origin in a closure so the
|
|
6
|
+
// per-method bodies stay one-liners and don't have to thread context strings
|
|
7
|
+
// through every call site.
|
|
8
|
+
function makeLoggerFn(sessionId, origin, format, log = console.log.bind(console)) {
|
|
9
|
+
const context = styleText('gray', `[sessionId=${sessionId} origin=${origin}]`);
|
|
8
10
|
return (scenarioName, ...data) => {
|
|
9
11
|
const time = new Date().toISOString().split('T')[1];
|
|
10
|
-
const prefix = `${styleText('gray', time)}: [${styleText(format, scenarioName)}]: `;
|
|
12
|
+
const prefix = `${styleText('gray', time)} ${context}: [${styleText(format, scenarioName)}]: `;
|
|
11
13
|
log(prefix, ...data);
|
|
12
14
|
};
|
|
13
15
|
}
|
|
14
|
-
const activity = loggerFn(['white', 'bold']);
|
|
15
|
-
const scenario = loggerFn(['cyan', 'bold']);
|
|
16
|
-
const error = loggerFn(['red', 'bold'], console.error.bind(console));
|
|
17
|
-
const warn = loggerFn(['yellow', 'bold']);
|
|
18
16
|
export class ConsoleWriter {
|
|
17
|
+
_activity;
|
|
18
|
+
_scenario;
|
|
19
|
+
_error;
|
|
20
|
+
_warn;
|
|
21
|
+
constructor(sessionId, origin) {
|
|
22
|
+
this._activity = makeLoggerFn(sessionId, origin, ['white', 'bold']);
|
|
23
|
+
this._scenario = makeLoggerFn(sessionId, origin, ['cyan', 'bold']);
|
|
24
|
+
this._error = makeLoggerFn(sessionId, origin, ['red', 'bold'], console.error.bind(console));
|
|
25
|
+
this._warn = makeLoggerFn(sessionId, origin, ['yellow', 'bold']);
|
|
26
|
+
}
|
|
19
27
|
trackActivityEvent(eventName, eventData) {
|
|
20
|
-
|
|
28
|
+
this._activity(eventName, eventData || {});
|
|
21
29
|
}
|
|
22
30
|
trackErrorEvent(eventName, eventData) {
|
|
23
|
-
|
|
31
|
+
this._error(eventName, eventData || {});
|
|
24
32
|
}
|
|
25
33
|
startScenario(scenarioName, startData) {
|
|
26
|
-
|
|
34
|
+
this._scenario(`[scenario:start] ${scenarioName}`, startData || {});
|
|
27
35
|
}
|
|
28
36
|
completeScenario(scenarioName, completeData) {
|
|
29
|
-
|
|
37
|
+
this._scenario(`[scenario:complete] ${scenarioName}`, completeData || {});
|
|
30
38
|
}
|
|
31
39
|
scenarioFailed(scenarioName, failureData) {
|
|
32
|
-
|
|
40
|
+
this._error(`[scenario:failure] ${scenarioName}`, failureData || {});
|
|
33
41
|
}
|
|
34
42
|
scenarioCompletedWithError(scenarioName, completeWithErrorData) {
|
|
35
|
-
|
|
43
|
+
this._warn(`[scenario:completeWithError] ${scenarioName}`, completeWithErrorData || {});
|
|
36
44
|
}
|
|
37
45
|
flush() {
|
|
38
46
|
return Promise.resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleWriter.js","sourceRoot":"","sources":["../../src/Logger/ConsoleWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ConsoleWriter.js","sourceRoot":"","sources":["../../src/Logger/ConsoleWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAStC,8EAA8E;AAC9E,6EAA6E;AAC7E,2BAA2B;AAC3B,SAAS,YAAY,CACnB,SAAiB,EACjB,MAAc,EACd,MAAmB,EACnB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;IAE/B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,cAAc,SAAS,WAAW,MAAM,GAAG,CAAC,CAAC;IAC/E,OAAO,CAAC,YAAoB,EAAE,GAAG,IAAW,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,OAAO,MAAM,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;QAC/F,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,aAAa;IACP,SAAS,CAAW;IACpB,SAAS,CAAW;IACpB,MAAM,CAAW;IACjB,KAAK,CAAW;IAEjC,YAAmB,SAAiB,EAAE,MAAc;QAClD,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;IAEM,kBAAkB,CAAC,SAAiB,EAAE,SAAkB;QAC7D,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEM,eAAe,CAAC,SAAiB,EAAE,SAAkB;QAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEM,aAAa,CAAC,YAAoB,EAAE,SAAkB;QAC3D,IAAI,CAAC,SAAS,CAAC,oBAAoB,YAAY,EAAE,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAEM,gBAAgB,CAAC,YAAoB,EAAE,YAAqB;QACjE,IAAI,CAAC,SAAS,CAAC,uBAAuB,YAAY,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAEM,cAAc,CAAC,YAAoB,EAAE,WAAoB;QAC9D,IAAI,CAAC,MAAM,CAAC,sBAAsB,YAAY,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAEM,0BAA0B,CAAC,YAAoB,EAAE,qBAA8B;QACpF,IAAI,CAAC,KAAK,CAAC,gCAAgC,YAAY,EAAE,EAAE,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAEM,KAAK;QACV,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEM,kBAAkB,CAAC,IAAY,EAAE,MAAc;QACpD,2BAA2B;IAC7B,CAAC;CACF;AACD,sDAAsD"}
|
|
@@ -126,7 +126,11 @@ function allowlistPlugin(projectRoot) {
|
|
|
126
126
|
return null;
|
|
127
127
|
if (args.path.startsWith('.')) {
|
|
128
128
|
const resolved = path.resolve(path.dirname(args.importer), args.path);
|
|
129
|
-
|
|
129
|
+
// Allow the `generated/` folder itself (resolves via its
|
|
130
|
+
// `index.ts` barrel) and anything beneath it. Without the
|
|
131
|
+
// exact-match check, `import '../generated'` would be rejected
|
|
132
|
+
// because the resolved path lacks the trailing separator.
|
|
133
|
+
if (resolved === generatedDir || resolved.startsWith(generatedDir + path.sep)) {
|
|
130
134
|
return null;
|
|
131
135
|
}
|
|
132
136
|
return {
|