@microsoft/managed-apps-cli 0.5.0 → 0.7.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 +65 -24
- package/dist/ArgumentProvider.d.ts +10 -2
- package/dist/ArgumentProvider.d.ts.map +1 -1
- package/dist/ArgumentProvider.js +11 -2
- package/dist/ArgumentProvider.js.map +1 -1
- package/dist/Authentication/ActiveAccountStore.d.ts +24 -0
- package/dist/Authentication/ActiveAccountStore.d.ts.map +1 -0
- package/dist/Authentication/ActiveAccountStore.js +54 -0
- package/dist/Authentication/ActiveAccountStore.js.map +1 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.d.ts +26 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.js +31 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.js.map +1 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts +57 -3
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -1
- package/dist/Authentication/NodeMsalAuthenticationProvider.js +187 -27
- package/dist/Authentication/NodeMsalAuthenticationProvider.js.map +1 -1
- package/dist/Cli.d.ts.map +1 -1
- package/dist/Cli.js +74 -23
- package/dist/Cli.js.map +1 -1
- package/dist/CliUtils.d.ts +2 -8
- package/dist/CliUtils.d.ts.map +1 -1
- package/dist/CliUtils.js.map +1 -1
- package/dist/Constants/CommandRegistry.d.ts.map +1 -1
- package/dist/Constants/CommandRegistry.js +32 -6
- package/dist/Constants/CommandRegistry.js.map +1 -1
- package/dist/Constants/HelpStrings.d.ts +39 -3
- package/dist/Constants/HelpStrings.d.ts.map +1 -1
- package/dist/Constants/HelpStrings.js +63 -10
- package/dist/Constants/HelpStrings.js.map +1 -1
- package/dist/Constants.d.ts +2 -0
- package/dist/Constants.d.ts.map +1 -1
- package/dist/Constants.js +2 -0
- package/dist/Constants.js.map +1 -1
- package/dist/Errors/GitHubErrorMap.d.ts +39 -0
- package/dist/Errors/GitHubErrorMap.d.ts.map +1 -0
- package/dist/Errors/GitHubErrorMap.js +187 -0
- package/dist/Errors/GitHubErrorMap.js.map +1 -0
- package/dist/HttpClient/CliHttpClient.d.ts +8 -3
- package/dist/HttpClient/CliHttpClient.d.ts.map +1 -1
- package/dist/HttpClient/CliHttpClient.js +33 -13
- package/dist/HttpClient/CliHttpClient.js.map +1 -1
- package/dist/Logger/ConsoleWriter.d.ts.map +1 -1
- package/dist/Logger/ConsoleWriter.js +7 -7
- package/dist/Logger/ConsoleWriter.js.map +1 -1
- package/dist/Middletier/FunctionsBundler.d.ts +17 -0
- package/dist/Middletier/FunctionsBundler.d.ts.map +1 -0
- package/dist/Middletier/FunctionsBundler.js +165 -0
- package/dist/Middletier/FunctionsBundler.js.map +1 -0
- package/dist/Middletier/PackFunctions.d.ts +52 -0
- package/dist/Middletier/PackFunctions.d.ts.map +1 -0
- package/dist/Middletier/PackFunctions.js +122 -0
- package/dist/Middletier/PackFunctions.js.map +1 -0
- package/dist/Types/Cli.types.d.ts +42 -1
- package/dist/Types/Cli.types.d.ts.map +1 -1
- package/dist/Types/Command.types.d.ts +1 -1
- package/dist/Types/Command.types.d.ts.map +1 -1
- package/dist/Utils/ConsoleOutput.d.ts +6 -0
- package/dist/Utils/ConsoleOutput.d.ts.map +1 -1
- package/dist/Utils/ConsoleOutput.js +23 -12
- package/dist/Utils/ConsoleOutput.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/EnvironmentRoutingUtils.d.ts +8 -0
- package/dist/Utils/EnvironmentRoutingUtils.d.ts.map +1 -0
- package/dist/Utils/EnvironmentRoutingUtils.js +45 -0
- package/dist/Utils/EnvironmentRoutingUtils.js.map +1 -0
- package/dist/Utils/GitHubDcfFlow.d.ts +59 -0
- package/dist/Utils/GitHubDcfFlow.d.ts.map +1 -0
- package/dist/Utils/GitHubDcfFlow.js +165 -0
- package/dist/Utils/GitHubDcfFlow.js.map +1 -0
- package/dist/Utils/GitUtils.d.ts +5 -0
- package/dist/Utils/GitUtils.d.ts.map +1 -1
- package/dist/Utils/GitUtils.js +15 -0
- package/dist/Utils/GitUtils.js.map +1 -1
- package/dist/Utils/Paging.d.ts.map +1 -1
- package/dist/Utils/Paging.js +4 -4
- package/dist/Utils/Paging.js.map +1 -1
- package/dist/Utils/RepoUrl.d.ts +13 -0
- package/dist/Utils/RepoUrl.d.ts.map +1 -0
- package/dist/Utils/RepoUrl.js +6 -0
- package/dist/Utils/RepoUrl.js.map +1 -0
- package/dist/Utils/Spinner.d.ts +9 -1
- package/dist/Utils/Spinner.d.ts.map +1 -1
- package/dist/Utils/Spinner.js +25 -5
- package/dist/Utils/Spinner.js.map +1 -1
- package/dist/Verbs/AddAction.d.ts.map +1 -1
- package/dist/Verbs/AddAction.js +12 -41
- package/dist/Verbs/AddAction.js.map +1 -1
- package/dist/Verbs/AddConnector.d.ts +24 -0
- package/dist/Verbs/AddConnector.d.ts.map +1 -0
- package/dist/Verbs/AddConnector.js +156 -0
- package/dist/Verbs/AddConnector.js.map +1 -0
- package/dist/Verbs/AddConnectorFlows.d.ts +72 -0
- package/dist/Verbs/AddConnectorFlows.d.ts.map +1 -0
- package/dist/Verbs/AddConnectorFlows.js +198 -0
- package/dist/Verbs/AddConnectorFlows.js.map +1 -0
- package/dist/Verbs/AddDataSource.js +1 -1
- package/dist/Verbs/AddDataSource.js.map +1 -1
- package/dist/Verbs/AddFlow.d.ts.map +1 -1
- package/dist/Verbs/AddFlow.js +3 -2
- package/dist/Verbs/AddFlow.js.map +1 -1
- package/dist/Verbs/AddTable.d.ts.map +1 -1
- package/dist/Verbs/AddTable.js +15 -100
- package/dist/Verbs/AddTable.js.map +1 -1
- package/dist/Verbs/AuthStatus.d.ts.map +1 -1
- package/dist/Verbs/AuthStatus.js +34 -6
- package/dist/Verbs/AuthStatus.js.map +1 -1
- package/dist/Verbs/AuthSwitch.d.ts +6 -0
- package/dist/Verbs/AuthSwitch.d.ts.map +1 -0
- package/dist/Verbs/AuthSwitch.js +67 -0
- package/dist/Verbs/AuthSwitch.js.map +1 -0
- package/dist/Verbs/ConnectorHelpers.d.ts +54 -1
- package/dist/Verbs/ConnectorHelpers.d.ts.map +1 -1
- package/dist/Verbs/ConnectorHelpers.js +217 -16
- package/dist/Verbs/ConnectorHelpers.js.map +1 -1
- package/dist/Verbs/CreateMaafApp.d.ts +26 -1
- package/dist/Verbs/CreateMaafApp.d.ts.map +1 -1
- package/dist/Verbs/CreateMaafApp.js +310 -135
- package/dist/Verbs/CreateMaafApp.js.map +1 -1
- package/dist/Verbs/DeployMaafApp.d.ts.map +1 -1
- package/dist/Verbs/DeployMaafApp.js +4 -0
- package/dist/Verbs/DeployMaafApp.js.map +1 -1
- package/dist/Verbs/Dev.js +5 -5
- package/dist/Verbs/Dev.js.map +1 -1
- package/dist/Verbs/FindDataverseApi.js +15 -15
- package/dist/Verbs/FindDataverseApi.js.map +1 -1
- package/dist/Verbs/GetSettings.d.ts +1 -1
- package/dist/Verbs/GetSettings.js +1 -1
- package/dist/Verbs/Init.d.ts.map +1 -1
- package/dist/Verbs/Init.js +129 -61
- package/dist/Verbs/Init.js.map +1 -1
- package/dist/Verbs/ListConnectors.d.ts.map +1 -1
- package/dist/Verbs/ListConnectors.js +4 -2
- package/dist/Verbs/ListConnectors.js.map +1 -1
- package/dist/Verbs/ListDatasets.d.ts.map +1 -1
- package/dist/Verbs/ListDatasets.js +5 -0
- package/dist/Verbs/ListDatasets.js.map +1 -1
- package/dist/Verbs/ListSqlStoredProcedures.d.ts.map +1 -1
- package/dist/Verbs/ListSqlStoredProcedures.js +5 -0
- package/dist/Verbs/ListSqlStoredProcedures.js.map +1 -1
- package/dist/Verbs/ListTables.d.ts.map +1 -1
- package/dist/Verbs/ListTables.js +5 -0
- package/dist/Verbs/ListTables.js.map +1 -1
- package/dist/Verbs/Login.d.ts.map +1 -1
- package/dist/Verbs/Login.js +16 -13
- package/dist/Verbs/Login.js.map +1 -1
- package/dist/Verbs/Logout.d.ts.map +1 -1
- package/dist/Verbs/Logout.js +19 -13
- package/dist/Verbs/Logout.js.map +1 -1
- package/dist/Verbs/MaafAppPermissions.d.ts +26 -6
- package/dist/Verbs/MaafAppPermissions.d.ts.map +1 -1
- package/dist/Verbs/MaafAppPermissions.js +193 -28
- package/dist/Verbs/MaafAppPermissions.js.map +1 -1
- package/dist/Verbs/Pack.d.ts +6 -6
- package/dist/Verbs/Pack.d.ts.map +1 -1
- package/dist/Verbs/Pack.js +80 -12
- package/dist/Verbs/Pack.js.map +1 -1
- package/dist/Verbs/RefreshDataSource.d.ts.map +1 -1
- package/dist/Verbs/RefreshDataSource.js +4 -3
- package/dist/Verbs/RefreshDataSource.js.map +1 -1
- package/dist/Verbs/RefreshGitAuth.d.ts +6 -0
- package/dist/Verbs/RefreshGitAuth.d.ts.map +1 -0
- package/dist/Verbs/RefreshGitAuth.js +153 -0
- package/dist/Verbs/RefreshGitAuth.js.map +1 -0
- package/dist/Verbs/RemoveFlow.d.ts.map +1 -1
- package/dist/Verbs/RemoveFlow.js +4 -3
- package/dist/Verbs/RemoveFlow.js.map +1 -1
- package/dist/Verbs/SetSetting.d.ts +1 -1
- package/dist/Verbs/SetSetting.js +1 -1
- package/dist/Verbs/VerbConstants.d.ts +72 -16
- package/dist/Verbs/VerbConstants.d.ts.map +1 -1
- package/dist/Verbs/VerbConstants.js +64 -16
- package/dist/Verbs/VerbConstants.js.map +1 -1
- package/dist/Verbs/index.d.ts +3 -0
- package/dist/Verbs/index.d.ts.map +1 -1
- package/dist/Verbs/index.js +3 -0
- package/dist/Verbs/index.js.map +1 -1
- package/package.json +8 -8
- package/dist/Authentication/OrchardAuthenticationProvider.d.ts +0 -13
- package/dist/Authentication/OrchardAuthenticationProvider.d.ts.map +0 -1
- package/dist/Authentication/OrchardAuthenticationProvider.js +0 -30
- package/dist/Authentication/OrchardAuthenticationProvider.js.map +0 -1
- package/dist/HttpClient/OrchardProxy.d.ts +0 -11
- package/dist/HttpClient/OrchardProxy.d.ts.map +0 -1
- package/dist/HttpClient/OrchardProxy.js +0 -25
- package/dist/HttpClient/OrchardProxy.js.map +0 -1
- package/dist/HttpClient/Proxy.d.ts +0 -7
- package/dist/HttpClient/Proxy.d.ts.map +0 -1
- package/dist/HttpClient/Proxy.js +0 -5
- package/dist/HttpClient/Proxy.js.map +0 -1
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import { encodeBody, HttpClientError, parseServerErrorCode } from '@microsoft/managed-apps-common/services';
|
|
4
|
+
import { encodeBody, HttpClientError, parseServerErrorCode, } from '@microsoft/managed-apps-common/services';
|
|
5
5
|
import { randomUUID } from 'crypto';
|
|
6
6
|
import { getSettings } from '../CliSettings.js';
|
|
7
|
-
import { MS_CLIENT_REQUESTID } from '../Constants.js';
|
|
7
|
+
import { MS_AUTH_RESOURCE, MS_CLIENT_REQUESTID, MS_TARGET_URL } from '../Constants.js';
|
|
8
8
|
import { enhanceNetworkError } from '../Utils/EnhanceNetworkError.js';
|
|
9
9
|
import { CliSpinner } from '../Utils/Spinner.js';
|
|
10
10
|
export class CliHttpClient {
|
|
11
11
|
_authenticationProvider;
|
|
12
|
-
|
|
12
|
+
_forwardUrl;
|
|
13
13
|
_inflight = 0;
|
|
14
14
|
_spinner = new CliSpinner();
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* @param _authenticationProvider — provides bearer tokens for `authResource`-tagged requests.
|
|
17
|
+
* @param _forwardUrl — when set, every request is forwarded to this URL with the original
|
|
18
|
+
* URL surfaced via the `x-ms-target-url` header and the resource audience (if any) via
|
|
19
|
+
* `x-ms-auth-resource`. Used for proxy / dev-tunnel scenarios.
|
|
20
|
+
*/
|
|
21
|
+
constructor(_authenticationProvider, _forwardUrl) {
|
|
16
22
|
this._authenticationProvider = _authenticationProvider;
|
|
17
|
-
this.
|
|
23
|
+
this._forwardUrl = _forwardUrl;
|
|
18
24
|
}
|
|
19
25
|
async get(url, config) {
|
|
20
26
|
return this._sendRequestAsync(url, 'GET', config);
|
|
@@ -37,7 +43,10 @@ export class CliHttpClient {
|
|
|
37
43
|
const headers = config?.headers || {};
|
|
38
44
|
if (config?.authResource) {
|
|
39
45
|
const token = await this._authenticationProvider.getAccessTokenForResource(config.authResource);
|
|
40
|
-
|
|
46
|
+
// Forward mode supplies an optional static token; omit Authorization when blank.
|
|
47
|
+
if (token) {
|
|
48
|
+
headers.Authorization = `Bearer ${token}`;
|
|
49
|
+
}
|
|
41
50
|
}
|
|
42
51
|
if (config?.contentType) {
|
|
43
52
|
headers['Content-Type'] = config.contentType;
|
|
@@ -46,26 +55,36 @@ export class CliHttpClient {
|
|
|
46
55
|
headers['Content-Type'] = 'application/json';
|
|
47
56
|
}
|
|
48
57
|
headers[MS_CLIENT_REQUESTID] = randomUUID();
|
|
58
|
+
let targetUrl = url;
|
|
59
|
+
if (this._forwardUrl) {
|
|
60
|
+
headers[MS_TARGET_URL] = url;
|
|
61
|
+
if (config?.authResource) {
|
|
62
|
+
headers[MS_AUTH_RESOURCE] = config.authResource;
|
|
63
|
+
}
|
|
64
|
+
targetUrl = this._forwardUrl;
|
|
65
|
+
}
|
|
49
66
|
const bodyContent = encodeBody(config?.body, headers['Content-Type']);
|
|
50
67
|
const requestOptions = {
|
|
51
68
|
method,
|
|
52
69
|
headers,
|
|
53
70
|
body: bodyContent,
|
|
54
71
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
const response = await fetch(url, requestOptions);
|
|
59
|
-
if (!response.ok) {
|
|
72
|
+
const response = await fetch(targetUrl, requestOptions);
|
|
73
|
+
if (!response.ok && !config?.allowErrorResponse) {
|
|
60
74
|
const correlationId = response.headers.get('x-ms-correlation-id');
|
|
61
75
|
const correlationSuffix = correlationId ? ` (correlation ID: ${correlationId})` : '';
|
|
62
76
|
const errorBody = await response.text();
|
|
63
|
-
|
|
77
|
+
// In forward mode the response came from the forwarder, not the
|
|
78
|
+
// original target — surface both so it's clear which hop failed.
|
|
79
|
+
const urlSuffix = this._forwardUrl ? `${url} via ${this._forwardUrl}` : url;
|
|
80
|
+
throw new HttpClientError(`HTTP error status: ${response.status} for ${method} ${urlSuffix}${correlationSuffix}: ${errorBody}`, {
|
|
64
81
|
status: response.status,
|
|
65
82
|
code: parseServerErrorCode(errorBody),
|
|
66
83
|
body: errorBody,
|
|
67
84
|
});
|
|
68
85
|
}
|
|
86
|
+
// When allowErrorResponse is true and we got a non-2xx, fall through to parse the body
|
|
87
|
+
// so callers can inspect the structured error envelope (e.g. { error: { code, message } }).
|
|
69
88
|
const data = await this._parseResponse(response);
|
|
70
89
|
return {
|
|
71
90
|
data,
|
|
@@ -74,7 +93,8 @@ export class CliHttpClient {
|
|
|
74
93
|
};
|
|
75
94
|
}
|
|
76
95
|
catch (error) {
|
|
77
|
-
|
|
96
|
+
const errorUrl = this._forwardUrl ? `${url} via ${this._forwardUrl}` : url;
|
|
97
|
+
throw enhanceNetworkError(error, method, errorUrl);
|
|
78
98
|
}
|
|
79
99
|
finally {
|
|
80
100
|
this._stopSpinner();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliHttpClient.js","sourceRoot":"","sources":["../../src/HttpClient/CliHttpClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,
|
|
1
|
+
{"version":3,"file":"CliHttpClient.js","sourceRoot":"","sources":["../../src/HttpClient/CliHttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAsBnE,qBAAa,aAAc,YAAW,gBAAgB;IAC7C,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"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
4
|
+
import { styleText } from 'node:util';
|
|
5
5
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
6
6
|
// Logger function factory
|
|
7
|
-
function loggerFn(
|
|
7
|
+
function loggerFn(format, log = console.log.bind(console)) {
|
|
8
8
|
return (scenarioName, ...data) => {
|
|
9
9
|
const time = new Date().toISOString().split('T')[1];
|
|
10
|
-
const prefix = `${
|
|
10
|
+
const prefix = `${styleText('gray', time)}: [${styleText(format, scenarioName)}]: `;
|
|
11
11
|
log(prefix, ...data);
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
const activity = loggerFn(
|
|
15
|
-
const scenario = loggerFn(
|
|
16
|
-
const error = loggerFn(
|
|
17
|
-
const warn = loggerFn(
|
|
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
18
|
export class ConsoleWriter {
|
|
19
19
|
trackActivityEvent(eventName, eventData) {
|
|
20
20
|
activity(eventName, eventData || {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleWriter.js","sourceRoot":"","sources":["../../src/Logger/ConsoleWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"ConsoleWriter.js","sourceRoot":"","sources":["../../src/Logger/ConsoleWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAMtC,uDAAuD;AACvD,0BAA0B;AAC1B,SAAS,QAAQ,CACf,MAAmB,EACnB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;IAE/B,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,MAAM,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;QACpF,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAE1C,MAAM,OAAO,aAAa;IACjB,kBAAkB,CAAC,SAAiB,EAAE,SAAkB;QAC7D,QAAQ,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAEM,eAAe,CAAC,SAAiB,EAAE,SAAkB;QAC1D,KAAK,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAEM,aAAa,CAAC,YAAoB,EAAE,SAAkB;QAC3D,QAAQ,CAAC,oBAAoB,YAAY,EAAE,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAEM,gBAAgB,CAAC,YAAoB,EAAE,YAAqB;QACjE,QAAQ,CAAC,uBAAuB,YAAY,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAEM,cAAc,CAAC,YAAoB,EAAE,WAAoB;QAC9D,KAAK,CAAC,sBAAsB,YAAY,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAEM,0BAA0B,CAAC,YAAoB,EAAE,qBAA8B;QACpF,IAAI,CAAC,gCAAgC,YAAY,EAAE,EAAE,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACpF,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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { DiscoveredFunction } from './PackFunctions.js';
|
|
5
|
+
/**
|
|
6
|
+
* Bundles each discovered function entry point to ESM JavaScript using esbuild.
|
|
7
|
+
* Returns a Map keyed by the function's `relPath` (same key as
|
|
8
|
+
* {@link DiscoveredFunction.relPath}) with the bundled JS source as the value.
|
|
9
|
+
*
|
|
10
|
+
* esbuild is imported dynamically (`await import('esbuild')`) so the CLI can be
|
|
11
|
+
* shipped into environments that mark esbuild `--external` and supply their own.
|
|
12
|
+
*/
|
|
13
|
+
export declare function bundleFunctionsAsync(args: {
|
|
14
|
+
projectRoot: string;
|
|
15
|
+
functions: readonly DiscoveredFunction[];
|
|
16
|
+
}): Promise<Map<string, string>>;
|
|
17
|
+
//# sourceMappingURL=FunctionsBundler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionsBundler.d.ts","sourceRoot":"","sources":["../../src/Middletier/FunctionsBundler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AA2B1D;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC1C,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2C/B"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { AppError } from '../Errors/CliError.js';
|
|
6
|
+
/**
|
|
7
|
+
* Maps the browser-SDK specifiers that generated/customer code imports to the
|
|
8
|
+
* workerd-SDK specifiers that survive into the bundled output. esbuild uses
|
|
9
|
+
* this map for two things:
|
|
10
|
+
* - `alias`: rewrites every key to its value during resolution.
|
|
11
|
+
* - `external`: marks every value as external so the import statement is
|
|
12
|
+
* left intact in the bundle and resolved at workerd instantiation time.
|
|
13
|
+
*
|
|
14
|
+
* The allowlist plugin also derives from this map (see {@link ALLOWED_PACKAGES}),
|
|
15
|
+
* so this is the single source of truth — the three derived uses stay in sync
|
|
16
|
+
* automatically.
|
|
17
|
+
*/
|
|
18
|
+
const MIDDLETIER_PACKAGE_ALIAS_MAP = {
|
|
19
|
+
'@microsoft/managed-apps/data': '@microsoft/managed-apps-functions/data',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Specifier the externalized `generated/dataSources` import gets rewritten to.
|
|
23
|
+
* The functions-runtime registers a workerd `json` module under this name with
|
|
24
|
+
* the pack's `dataSources.json` as its content, so every customer bundle reads
|
|
25
|
+
* the data sources from a single shared file instead of inlining a per-bundle
|
|
26
|
+
* copy of the ~16KB config blob.
|
|
27
|
+
*/
|
|
28
|
+
const DATA_SOURCES_MODULE = '@config/dataSources';
|
|
29
|
+
/**
|
|
30
|
+
* Bundles each discovered function entry point to ESM JavaScript using esbuild.
|
|
31
|
+
* Returns a Map keyed by the function's `relPath` (same key as
|
|
32
|
+
* {@link DiscoveredFunction.relPath}) with the bundled JS source as the value.
|
|
33
|
+
*
|
|
34
|
+
* esbuild is imported dynamically (`await import('esbuild')`) so the CLI can be
|
|
35
|
+
* shipped into environments that mark esbuild `--external` and supply their own.
|
|
36
|
+
*/
|
|
37
|
+
export async function bundleFunctionsAsync(args) {
|
|
38
|
+
const { projectRoot, functions } = args;
|
|
39
|
+
if (functions.length === 0)
|
|
40
|
+
return new Map();
|
|
41
|
+
// `.catch` so a missing-esbuild error gets a clear, actionable message
|
|
42
|
+
// instead of the raw module-resolution failure surfacing to the user.
|
|
43
|
+
const esbuild = await import('esbuild').catch((err) => {
|
|
44
|
+
throw new AppError(`esbuild is required to pack functions but could not be loaded: ${err.message}`);
|
|
45
|
+
});
|
|
46
|
+
// esbuild's Go worker pool parallelises within a single `build()`, but
|
|
47
|
+
// running per-file builds in parallel still lets us overlap plugin
|
|
48
|
+
// callbacks and JS-side work. esbuild self-bounds concurrency internally,
|
|
49
|
+
// so we don't need our own semaphore.
|
|
50
|
+
const entries = await Promise.all(functions.map(async (fn) => {
|
|
51
|
+
const result = await esbuild.build({
|
|
52
|
+
entryPoints: [fn.absPath],
|
|
53
|
+
bundle: true,
|
|
54
|
+
write: false,
|
|
55
|
+
format: 'esm',
|
|
56
|
+
platform: 'neutral',
|
|
57
|
+
target: 'es2022',
|
|
58
|
+
external: [...Object.values(MIDDLETIER_PACKAGE_ALIAS_MAP), DATA_SOURCES_MODULE],
|
|
59
|
+
alias: MIDDLETIER_PACKAGE_ALIAS_MAP,
|
|
60
|
+
// Plugin order matters — `dataSourcesPlugin` returns first so the
|
|
61
|
+
// allowlist never sees the externalised `@config/dataSources` rewrite
|
|
62
|
+
// and the resolved-path lookup for `generated/dataSources.ts` short-
|
|
63
|
+
// circuits before the allowlist would have admitted it via the
|
|
64
|
+
// `generated/` rule.
|
|
65
|
+
plugins: [dataSourcesPlugin(projectRoot), allowlistPlugin(projectRoot)],
|
|
66
|
+
logLevel: 'silent',
|
|
67
|
+
});
|
|
68
|
+
const output = result.outputFiles?.[0];
|
|
69
|
+
if (!output) {
|
|
70
|
+
throw new AppError(`Failed to bundle function ${fn.relPath}: esbuild produced no output`);
|
|
71
|
+
}
|
|
72
|
+
return [fn.relPath, output.text];
|
|
73
|
+
}));
|
|
74
|
+
return new Map(entries);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* esbuild `onResolve` plugin that intercepts the codegen-emitted
|
|
78
|
+
* `import dataSources from '../dataSources'` (or any path resolving to
|
|
79
|
+
* `<projectRoot>/generated/dataSources.<ext>`) and rewrites it to the
|
|
80
|
+
* canonical {@link DATA_SOURCES_MODULE} specifier, marked external. The
|
|
81
|
+
* functions-runtime supplies the resolved value at workerd config time as a
|
|
82
|
+
* `json` module embedded from the pack's `dataSources.json`, so a single
|
|
83
|
+
* shared copy is read by every function instead of the ~16KB config map
|
|
84
|
+
* being inlined into each bundle.
|
|
85
|
+
*
|
|
86
|
+
* Matching is by resolved file path (not import-specifier string) so codegen
|
|
87
|
+
* layout changes that move the file or alter the relative-path shape don't
|
|
88
|
+
* break the substitution.
|
|
89
|
+
*/
|
|
90
|
+
function dataSourcesPlugin(projectRoot) {
|
|
91
|
+
// Codegen always emits `generated/dataSources.ts`; specifier is extensionless
|
|
92
|
+
// (`../dataSources`), so we resolve the relative path and tack on `.ts` to
|
|
93
|
+
// get the candidate filesystem location, then compare.
|
|
94
|
+
const target = path.resolve(projectRoot, 'generated/dataSources.ts');
|
|
95
|
+
return {
|
|
96
|
+
name: 'external-data-sources',
|
|
97
|
+
setup(build) {
|
|
98
|
+
build.onResolve({ filter: /(^|\/)dataSources$/ }, (args) => {
|
|
99
|
+
if (!args.path.startsWith('.'))
|
|
100
|
+
return null;
|
|
101
|
+
const resolved = path.resolve(path.dirname(args.importer), args.path) + '.ts';
|
|
102
|
+
if (resolved !== target)
|
|
103
|
+
return null;
|
|
104
|
+
return { path: DATA_SOURCES_MODULE, external: true };
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* esbuild `onResolve` plugin that fails the build when customer code imports
|
|
111
|
+
* anything outside the allowlist. Two categories pass:
|
|
112
|
+
*
|
|
113
|
+
* - Relative imports that resolve inside the project's `generated/` folder.
|
|
114
|
+
* - Bare specifiers exactly matching an entry in {@link ALLOWED_PACKAGES}.
|
|
115
|
+
*
|
|
116
|
+
* esbuild applies `alias` substitution *after* `onResolve` plugins run, so the
|
|
117
|
+
* incoming `args.path` is always the pre-alias specifier.
|
|
118
|
+
*/
|
|
119
|
+
function allowlistPlugin(projectRoot) {
|
|
120
|
+
const generatedDir = path.resolve(projectRoot, 'generated');
|
|
121
|
+
return {
|
|
122
|
+
name: 'allowlist-imports',
|
|
123
|
+
setup(build) {
|
|
124
|
+
build.onResolve({ filter: /.*/ }, (args) => {
|
|
125
|
+
if (args.kind === 'entry-point')
|
|
126
|
+
return null;
|
|
127
|
+
if (args.path.startsWith('.')) {
|
|
128
|
+
const resolved = path.resolve(path.dirname(args.importer), args.path);
|
|
129
|
+
if (resolved.startsWith(generatedDir + path.sep)) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
errors: [
|
|
134
|
+
{
|
|
135
|
+
text: `Relative import '${args.path}' is outside the allowed 'generated/' folder`,
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The exact module specifiers customer/generated code is allowed to import
|
|
142
|
+
* from outside the project's `generated/` folder. Anything else — arbitrary
|
|
143
|
+
* npm packages, `node:*` built-ins, other scopes, deeper subpaths — is a
|
|
144
|
+
* build error.
|
|
145
|
+
*
|
|
146
|
+
* esbuild applies `alias` substitution *after* `onResolve` plugins run, so the
|
|
147
|
+
* allowlist matches the pre-alias specifier (the map key), not the post-alias
|
|
148
|
+
* target.
|
|
149
|
+
*/
|
|
150
|
+
if (MIDDLETIER_PACKAGE_ALIAS_MAP[args.path])
|
|
151
|
+
return null;
|
|
152
|
+
return {
|
|
153
|
+
errors: [
|
|
154
|
+
{
|
|
155
|
+
text: `Import '${args.path}' is not on the allowlist. Allowed: relative imports into 'generated/' and ${Object.keys(MIDDLETIER_PACKAGE_ALIAS_MAP)
|
|
156
|
+
.map((p) => `'${p}'`)
|
|
157
|
+
.join(', ')}.`,
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=FunctionsBundler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionsBundler.js","sourceRoot":"","sources":["../../src/Middletier/FunctionsBundler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { FunctionRoute, FunctionsPackage } from '@microsoft/managed-apps-common/types';
|
|
5
|
+
/** Filename of the functions archive written next to manifest.json. */
|
|
6
|
+
export declare const FUNCTIONS_ARCHIVE_NAME = "functions.zip";
|
|
7
|
+
/** Archive format/compression embedded in the manifest. Standard zip uses DEFLATE. */
|
|
8
|
+
export declare const FUNCTIONS_ARCHIVE_DESCRIPTOR: Omit<FunctionsPackage, 'path'>;
|
|
9
|
+
/** A single `.ts` function discovered under `functions.baseDirectory`. */
|
|
10
|
+
export interface DiscoveredFunction {
|
|
11
|
+
/** Path relative to `functions.baseDirectory`, with forward slashes. Includes `.ts` suffix. */
|
|
12
|
+
relPath: string;
|
|
13
|
+
/** Absolute path to the source file on disk. */
|
|
14
|
+
absPath: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Recursively walks `baseDirectory` and returns every `.ts` file beneath it.
|
|
18
|
+
*
|
|
19
|
+
* The directory must exist; callers are expected to have validated this via
|
|
20
|
+
* {@link assertFunctionsDirectoryExists}. An existing directory containing no
|
|
21
|
+
* `.ts` files returns an empty array — that case maps to "skip packing" per the
|
|
22
|
+
* pack spec, not an error.
|
|
23
|
+
*/
|
|
24
|
+
export declare function discoverFunctionsAsync(baseDirectory: string): Promise<DiscoveredFunction[]>;
|
|
25
|
+
export declare function assertFunctionsDirectoryExists(baseDirectory: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Builds the `routes` entries for compiled functions. The key is the basename
|
|
28
|
+
* of `functions.baseDirectory` joined with the function's path relative to
|
|
29
|
+
* that directory (`.ts` stripped); `path` is the same string with `.js`. Both
|
|
30
|
+
* mirror the entry's location inside the archive.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildFunctionRoutes(functions: readonly DiscoveredFunction[], baseDirName: string): Record<string, FunctionRoute>;
|
|
33
|
+
/**
|
|
34
|
+
* Builds a zip Buffer containing one bundled `.js` per discovered `.ts` source
|
|
35
|
+
* (mirroring the source layout under `<baseDirName>/`), plus the generated
|
|
36
|
+
* `manifest.json` and — when present — `dataSources.json`.
|
|
37
|
+
*
|
|
38
|
+
* `bundles` is a Map keyed by `DiscoveredFunction.relPath` whose value is the
|
|
39
|
+
* bundled JS source from {@link bundleFunctionsAsync}. Every discovered function
|
|
40
|
+
* must have a corresponding bundle; missing entries throw.
|
|
41
|
+
*
|
|
42
|
+
* Returning a `Buffer` (vs. streaming to disk) lets callers use `fsp.writeFile`,
|
|
43
|
+
* which keeps the implementation testable under memfs.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildFunctionsArchiveAsync(args: {
|
|
46
|
+
baseDirName: string;
|
|
47
|
+
functions: readonly DiscoveredFunction[];
|
|
48
|
+
bundles: ReadonlyMap<string, string>;
|
|
49
|
+
manifestContent: string;
|
|
50
|
+
dataSourcesJson: string | undefined;
|
|
51
|
+
}): Promise<Buffer>;
|
|
52
|
+
//# sourceMappingURL=PackFunctions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PackFunctions.d.ts","sourceRoot":"","sources":["../../src/Middletier/PackFunctions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAK5F,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAEtD,sFAAsF;AACtF,eAAO,MAAM,4BAA4B,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAGvE,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,+FAA+F;IAC/F,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAKjG;AA6BD,wBAAsB,8BAA8B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,kBAAkB,EAAE,EACxC,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAU/B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACzC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BlB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import * as fsp from 'node:fs/promises';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import archiver from 'archiver';
|
|
7
|
+
import { ConfigurationError } from '../Errors/CliError.js';
|
|
8
|
+
/** Filename of the functions archive written next to manifest.json. */
|
|
9
|
+
export const FUNCTIONS_ARCHIVE_NAME = 'functions.zip';
|
|
10
|
+
/** Archive format/compression embedded in the manifest. Standard zip uses DEFLATE. */
|
|
11
|
+
export const FUNCTIONS_ARCHIVE_DESCRIPTOR = {
|
|
12
|
+
archive: 'zip',
|
|
13
|
+
compression: 'deflate',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Recursively walks `baseDirectory` and returns every `.ts` file beneath it.
|
|
17
|
+
*
|
|
18
|
+
* The directory must exist; callers are expected to have validated this via
|
|
19
|
+
* {@link assertFunctionsDirectoryExists}. An existing directory containing no
|
|
20
|
+
* `.ts` files returns an empty array — that case maps to "skip packing" per the
|
|
21
|
+
* pack spec, not an error.
|
|
22
|
+
*/
|
|
23
|
+
export async function discoverFunctionsAsync(baseDirectory) {
|
|
24
|
+
const results = [];
|
|
25
|
+
await walkAsync(baseDirectory, '', results);
|
|
26
|
+
results.sort((a, b) => a.relPath.localeCompare(b.relPath));
|
|
27
|
+
return results;
|
|
28
|
+
}
|
|
29
|
+
async function walkAsync(absDir, relDir, out) {
|
|
30
|
+
const entries = await fsp.readdir(absDir, { withFileTypes: true });
|
|
31
|
+
for (const entry of entries) {
|
|
32
|
+
const entryRel = relDir ? `${relDir}/${entry.name}` : entry.name;
|
|
33
|
+
const entryAbs = path.join(absDir, entry.name);
|
|
34
|
+
if (entry.isDirectory()) {
|
|
35
|
+
await walkAsync(entryAbs, entryRel, out);
|
|
36
|
+
}
|
|
37
|
+
else if (entry.isFile() && isFunctionSourceFile(entry.name)) {
|
|
38
|
+
out.push({ relPath: entryRel, absPath: entryAbs });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* `.ts` files that are part of the function surface. Skips type declarations
|
|
44
|
+
* (`.d.ts` — no runtime) and unit-test files (`.test.ts` / `.spec.ts` — not
|
|
45
|
+
* functions, and the common JS ecosystem convention is to co-locate them).
|
|
46
|
+
*/
|
|
47
|
+
function isFunctionSourceFile(name) {
|
|
48
|
+
return (name.endsWith('.ts') &&
|
|
49
|
+
!name.endsWith('.d.ts') &&
|
|
50
|
+
!name.endsWith('.test.ts') &&
|
|
51
|
+
!name.endsWith('.spec.ts'));
|
|
52
|
+
}
|
|
53
|
+
export async function assertFunctionsDirectoryExists(baseDirectory) {
|
|
54
|
+
let stat;
|
|
55
|
+
try {
|
|
56
|
+
stat = await fsp.stat(baseDirectory);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
throw new ConfigurationError(`functions.baseDirectory does not exist: ${baseDirectory}`);
|
|
60
|
+
}
|
|
61
|
+
if (!stat.isDirectory()) {
|
|
62
|
+
throw new ConfigurationError(`functions.baseDirectory is not a directory: ${baseDirectory}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Builds the `routes` entries for compiled functions. The key is the basename
|
|
67
|
+
* of `functions.baseDirectory` joined with the function's path relative to
|
|
68
|
+
* that directory (`.ts` stripped); `path` is the same string with `.js`. Both
|
|
69
|
+
* mirror the entry's location inside the archive.
|
|
70
|
+
*/
|
|
71
|
+
export function buildFunctionRoutes(functions, baseDirName) {
|
|
72
|
+
const routes = {};
|
|
73
|
+
for (const fn of functions) {
|
|
74
|
+
const routeKey = `${baseDirName}/${stripTsExtension(fn.relPath)}`;
|
|
75
|
+
routes[routeKey] = {
|
|
76
|
+
type: 'function',
|
|
77
|
+
path: `${routeKey}.js`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return routes;
|
|
81
|
+
}
|
|
82
|
+
function stripTsExtension(relPath) {
|
|
83
|
+
return relPath.slice(0, -'.ts'.length);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Builds a zip Buffer containing one bundled `.js` per discovered `.ts` source
|
|
87
|
+
* (mirroring the source layout under `<baseDirName>/`), plus the generated
|
|
88
|
+
* `manifest.json` and — when present — `dataSources.json`.
|
|
89
|
+
*
|
|
90
|
+
* `bundles` is a Map keyed by `DiscoveredFunction.relPath` whose value is the
|
|
91
|
+
* bundled JS source from {@link bundleFunctionsAsync}. Every discovered function
|
|
92
|
+
* must have a corresponding bundle; missing entries throw.
|
|
93
|
+
*
|
|
94
|
+
* Returning a `Buffer` (vs. streaming to disk) lets callers use `fsp.writeFile`,
|
|
95
|
+
* which keeps the implementation testable under memfs.
|
|
96
|
+
*/
|
|
97
|
+
export async function buildFunctionsArchiveAsync(args) {
|
|
98
|
+
const { baseDirName, functions, bundles, manifestContent, dataSourcesJson } = args;
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const chunks = [];
|
|
101
|
+
const archive = archiver('zip', { zlib: { level: 9 } });
|
|
102
|
+
archive.on('data', (chunk) => chunks.push(chunk));
|
|
103
|
+
archive.on('warning', reject);
|
|
104
|
+
archive.on('error', reject);
|
|
105
|
+
archive.on('end', () => resolve(Buffer.concat(chunks)));
|
|
106
|
+
for (const fn of functions) {
|
|
107
|
+
const bundled = bundles.get(fn.relPath);
|
|
108
|
+
if (bundled === undefined) {
|
|
109
|
+
reject(new Error(`Missing bundled output for function ${fn.relPath}`));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const routeKey = stripTsExtension(fn.relPath);
|
|
113
|
+
archive.append(bundled, { name: `${baseDirName}/${routeKey}.js` });
|
|
114
|
+
}
|
|
115
|
+
archive.append(manifestContent, { name: 'manifest.json' });
|
|
116
|
+
if (dataSourcesJson !== undefined) {
|
|
117
|
+
archive.append(dataSourcesJson, { name: 'dataSources.json' });
|
|
118
|
+
}
|
|
119
|
+
void archive.finalize();
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=PackFunctions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PackFunctions.js","sourceRoot":"","sources":["../../src/Middletier/PackFunctions.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,54 @@
|
|
|
4
4
|
import type { AppConfig } from '@microsoft/managed-apps-common/config';
|
|
5
5
|
import type { Region } from '@microsoft/managed-apps-common/services';
|
|
6
6
|
import type { CliFS } from '../FS/CliFs.js';
|
|
7
|
+
export interface CachedAccount {
|
|
8
|
+
/** MSAL home account ID (`<oid>.<tid>`). Stable across email changes; the canonical key. */
|
|
9
|
+
homeAccountId: string;
|
|
10
|
+
/** UPN / email — what we show to the user. */
|
|
11
|
+
username: string;
|
|
12
|
+
/** True if this is the account currently used by silent token acquisition. */
|
|
13
|
+
isActive: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Acquires access tokens for authenticated CLI calls. Every auth mode (interactive MSAL,
|
|
17
|
+
* service principal, HTTP forward) implements this — it's the lowest common denominator.
|
|
18
|
+
*/
|
|
7
19
|
export interface IAuthenticationProvider {
|
|
8
20
|
initAsync(region: Region): Promise<void>;
|
|
9
21
|
getAccessTokenForResource(resource: string, loginHint?: string): Promise<string>;
|
|
10
22
|
getUserTenantId(): string | undefined;
|
|
11
|
-
/** Returns the cached account email without triggering interactive login. */
|
|
23
|
+
/** Returns the active cached account email without triggering interactive login. */
|
|
12
24
|
getCachedAccountAsync(): Promise<string | undefined>;
|
|
13
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Manages the local cache of signed-in accounts: list, switch, remove, add. Only the
|
|
28
|
+
* interactive MSAL provider supports this. Service principal and HTTP forward modes don't
|
|
29
|
+
* have a "cached account" concept, so they don't implement this interface and the
|
|
30
|
+
* `auth login`/`logout`/`status`/`switch` verbs refuse to run in those modes.
|
|
31
|
+
*/
|
|
32
|
+
export interface IAccountManager {
|
|
33
|
+
/** Returns every cached account, marking which one is currently active. */
|
|
34
|
+
listCachedAccountsAsync(): Promise<CachedAccount[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Marks `accountKey` (a username or homeAccountId) as the active account.
|
|
37
|
+
* Throws if no cached account matches. Returns the resolved account.
|
|
38
|
+
*/
|
|
39
|
+
setActiveAccountAsync(accountKey: string): Promise<CachedAccount>;
|
|
40
|
+
/**
|
|
41
|
+
* Forces an interactive browser sign-in for `resource`. Used by `auth login` so users
|
|
42
|
+
* can add a new account even when one is already cached. Writes the signed-in account
|
|
43
|
+
* as the active one.
|
|
44
|
+
*/
|
|
45
|
+
loginInteractiveAsync(resource: string, loginHint?: string): Promise<CachedAccount>;
|
|
46
|
+
/**
|
|
47
|
+
* Removes every cached account and the active-account pointer. Backs `auth logout`.
|
|
48
|
+
* Routing through the account manager (rather than `fs.rmSync` directly in the verb)
|
|
49
|
+
* lets non-interactive auth modes refuse the call uniformly via the standard
|
|
50
|
+
* `getAccountManager()` UsageError. Returns `true` when something was cleared and
|
|
51
|
+
* `false` when no cached state existed.
|
|
52
|
+
*/
|
|
53
|
+
clearCacheAsync(): Promise<boolean>;
|
|
54
|
+
}
|
|
14
55
|
export type CliSettings = {
|
|
15
56
|
source: 'pac-cli' | 'standalone';
|
|
16
57
|
interactive: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cli.types.d.ts","sourceRoot":"","sources":["../../src/Types/Cli.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yCAAyC,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjF,eAAe,IAAI,MAAM,GAAG,SAAS,CAAC;IACtC,
|
|
1
|
+
{"version":3,"file":"Cli.types.d.ts","sourceRoot":"","sources":["../../src/Types/Cli.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yCAAyC,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjF,eAAe,IAAI,MAAM,GAAG,SAAS,CAAC;IACtC,oFAAoF;IACpF,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtD;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,uBAAuB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACpD;;;OAGG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClE;;;;OAIG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACpF;;;;;;OAMG;IACH,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,SAAS,GAAG,YAAY,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,6DAA6D;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC"}
|
|
@@ -33,7 +33,7 @@ export interface NounDef {
|
|
|
33
33
|
* - Index access with an unvalidated string is a compile-time error
|
|
34
34
|
* Update this union whenever a noun is added to or removed from COMMAND_TREE.
|
|
35
35
|
*/
|
|
36
|
-
export type NounKey = 'auth' | 'app' | 'connector' | 'telemetry';
|
|
36
|
+
export type NounKey = 'auth' | 'app' | 'connector' | 'git' | 'telemetry';
|
|
37
37
|
/**
|
|
38
38
|
* The full command tree (noun → verb → [type →] command).
|
|
39
39
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.types.d.ts","sourceRoot":"","sources":["../../src/Types/Command.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnF,uEAAuE;AACvE,MAAM,MAAM,WAAW,GAAG,SAAS,MAAM,EAAE,CAAC;AAI5C,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,GAAG,KAAK,IAAI,YAAY,CAE1F;AAED,yDAAyD;AACzD,MAAM,WAAW,OAAO;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;CACzD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Command.types.d.ts","sourceRoot":"","sources":["../../src/Types/Command.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnF,uEAAuE;AACvE,MAAM,MAAM,WAAW,GAAG,SAAS,MAAM,EAAE,CAAC;AAI5C,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,GAAG,KAAK,IAAI,YAAY,CAE1F;AAED,yDAAyD;AACzD,MAAM,WAAW,OAAO;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;CACzD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,WAAW,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEnD,+DAA+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,IAAI,EAAE,WAAW,CAAC;IAClB,qCAAqC;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;CACxB"}
|