@microsoft/power-apps-cli 0.9.1 → 0.10.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 +81 -10
- package/dist/ArgumentProvider.d.ts +61 -0
- package/dist/ArgumentProvider.d.ts.map +1 -0
- package/dist/ArgumentProvider.js +247 -0
- package/dist/ArgumentProvider.js.map +1 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts +17 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.js +91 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.js.map +1 -0
- package/dist/Authentication/PacCliAuthenticationProvider.d.ts +15 -0
- package/dist/Authentication/PacCliAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/PacCliAuthenticationProvider.js +51 -0
- package/dist/Authentication/PacCliAuthenticationProvider.js.map +1 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.d.ts +20 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.js +51 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.js.map +1 -0
- package/dist/Bin.d.ts +6 -0
- package/dist/Bin.d.ts.map +1 -0
- package/dist/Bin.js +2 -3357
- package/dist/Bin.js.map +1 -0
- package/dist/Cli.d.ts +2 -0
- package/dist/Cli.d.ts.map +1 -0
- package/dist/Cli.js +131 -0
- package/dist/Cli.js.map +1 -0
- package/dist/CliSettings.d.ts +14 -0
- package/dist/CliSettings.d.ts.map +1 -0
- package/dist/CliSettings.js +70 -0
- package/dist/CliSettings.js.map +1 -0
- package/dist/CliUtils.d.ts +21 -0
- package/dist/CliUtils.d.ts.map +1 -0
- package/dist/CliUtils.js +92 -0
- package/dist/CliUtils.js.map +1 -0
- package/dist/Constants/HelpStrings.d.ts +168 -0
- package/dist/Constants/HelpStrings.d.ts.map +1 -0
- package/dist/Constants/HelpStrings.js +216 -0
- package/dist/Constants/HelpStrings.js.map +1 -0
- package/dist/Constants/VerbRegistry.d.ts +79 -0
- package/dist/Constants/VerbRegistry.d.ts.map +1 -0
- package/dist/Constants/VerbRegistry.js +46 -0
- package/dist/Constants/VerbRegistry.js.map +1 -0
- package/dist/Constants.d.ts +10 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +12 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Errors/CliError.d.ts +11 -0
- package/dist/Errors/CliError.d.ts.map +1 -0
- package/dist/Errors/CliError.js +16 -0
- package/dist/Errors/CliError.js.map +1 -0
- package/dist/FS/CliFs.d.ts +41 -0
- package/dist/FS/CliFs.d.ts.map +1 -0
- package/dist/FS/CliFs.js +136 -0
- package/dist/FS/CliFs.js.map +1 -0
- package/dist/HttpClient/CliHttpClient.d.ts +21 -0
- package/dist/HttpClient/CliHttpClient.d.ts.map +1 -0
- package/dist/HttpClient/CliHttpClient.js +118 -0
- package/dist/HttpClient/CliHttpClient.js.map +1 -0
- package/dist/Logger/CliLogger.d.ts +27 -0
- package/dist/Logger/CliLogger.d.ts.map +1 -0
- package/dist/Logger/CliLogger.js +222 -0
- package/dist/Logger/CliLogger.js.map +1 -0
- package/dist/Logger/ConsoleWriter.d.ts +15 -0
- package/dist/Logger/ConsoleWriter.d.ts.map +1 -0
- package/dist/Logger/ConsoleWriter.js +45 -0
- package/dist/Logger/ConsoleWriter.js.map +1 -0
- package/dist/Logger/Constants.d.ts +6 -0
- package/dist/Logger/Constants.d.ts.map +1 -0
- package/dist/Logger/Constants.js +15 -0
- package/dist/Logger/Constants.js.map +1 -0
- package/dist/Logger/LoggerSettings.d.ts +18 -0
- package/dist/Logger/LoggerSettings.d.ts.map +1 -0
- package/dist/Logger/LoggerSettings.js +100 -0
- package/dist/Logger/LoggerSettings.js.map +1 -0
- package/dist/Logger/OneDSWriter.d.ts +22 -0
- package/dist/Logger/OneDSWriter.d.ts.map +1 -0
- package/dist/Logger/OneDSWriter.js +137 -0
- package/dist/Logger/OneDSWriter.js.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.d.ts +5 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.d.ts.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.js +46 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.js.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.d.ts +27 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.d.ts.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.js +168 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.js.map +1 -0
- package/dist/Logger/Scrubber/ScrubUtils.d.ts +8 -0
- package/dist/Logger/Scrubber/ScrubUtils.d.ts.map +1 -0
- package/dist/Logger/Scrubber/ScrubUtils.js +34 -0
- package/dist/Logger/Scrubber/ScrubUtils.js.map +1 -0
- package/dist/Types/Argument.types.d.ts +20 -0
- package/dist/Types/Argument.types.d.ts.map +1 -0
- package/dist/Types/Argument.types.js +5 -0
- package/dist/Types/Argument.types.js.map +1 -0
- package/dist/Types/Cli.types.d.ts +35 -0
- package/dist/Types/Cli.types.d.ts.map +1 -0
- package/dist/Types/Cli.types.js +5 -0
- package/dist/Types/Cli.types.js.map +1 -0
- package/dist/Types/Datasource.types.d.ts +43 -0
- package/dist/Types/Datasource.types.d.ts.map +1 -0
- package/dist/Types/Datasource.types.js +5 -0
- package/dist/Types/Datasource.types.js.map +1 -0
- package/dist/Types/LoggerTypes.types.d.ts +17 -0
- package/dist/Types/LoggerTypes.types.d.ts.map +1 -0
- package/dist/Types/LoggerTypes.types.js +5 -0
- package/dist/Types/LoggerTypes.types.js.map +1 -0
- package/dist/Utils/BuildVerbDescriptionTable.d.ts +9 -0
- package/dist/Utils/BuildVerbDescriptionTable.d.ts.map +1 -0
- package/dist/Utils/BuildVerbDescriptionTable.js +29 -0
- package/dist/Utils/BuildVerbDescriptionTable.js.map +1 -0
- package/dist/Utils/ConsoleOutput.d.ts +39 -0
- package/dist/Utils/ConsoleOutput.d.ts.map +1 -0
- package/dist/Utils/ConsoleOutput.js +111 -0
- package/dist/Utils/ConsoleOutput.js.map +1 -0
- package/dist/Utils/EnhanceNetworkError.d.ts +14 -0
- package/dist/Utils/EnhanceNetworkError.d.ts.map +1 -0
- package/dist/Utils/EnhanceNetworkError.js +59 -0
- package/dist/Utils/EnhanceNetworkError.js.map +1 -0
- package/dist/Verbs/AddDataSource.d.ts +19 -0
- package/dist/Verbs/AddDataSource.d.ts.map +1 -0
- package/dist/Verbs/AddDataSource.js +157 -0
- package/dist/Verbs/AddDataSource.js.map +1 -0
- package/dist/Verbs/AddDataverseApi.d.ts +13 -0
- package/dist/Verbs/AddDataverseApi.d.ts.map +1 -0
- package/dist/Verbs/AddDataverseApi.js +67 -0
- package/dist/Verbs/AddDataverseApi.js.map +1 -0
- package/dist/Verbs/AddFlow.d.ts +12 -0
- package/dist/Verbs/AddFlow.d.ts.map +1 -0
- package/dist/Verbs/AddFlow.js +66 -0
- package/dist/Verbs/AddFlow.js.map +1 -0
- package/dist/Verbs/DeleteDataSource.d.ts +6 -0
- package/dist/Verbs/DeleteDataSource.d.ts.map +1 -0
- package/dist/Verbs/DeleteDataSource.js +108 -0
- package/dist/Verbs/DeleteDataSource.js.map +1 -0
- package/dist/Verbs/FindDataverseApi.d.ts +12 -0
- package/dist/Verbs/FindDataverseApi.d.ts.map +1 -0
- package/dist/Verbs/FindDataverseApi.js +101 -0
- package/dist/Verbs/FindDataverseApi.js.map +1 -0
- package/dist/Verbs/Init.d.ts +6 -0
- package/dist/Verbs/Init.d.ts.map +1 -0
- package/dist/Verbs/Init.js +146 -0
- package/dist/Verbs/Init.js.map +1 -0
- package/dist/Verbs/ListCodeApps.d.ts +6 -0
- package/dist/Verbs/ListCodeApps.d.ts.map +1 -0
- package/dist/Verbs/ListCodeApps.js +31 -0
- package/dist/Verbs/ListCodeApps.js.map +1 -0
- package/dist/Verbs/ListConnectionReferences.d.ts +6 -0
- package/dist/Verbs/ListConnectionReferences.d.ts.map +1 -0
- package/dist/Verbs/ListConnectionReferences.js +80 -0
- package/dist/Verbs/ListConnectionReferences.js.map +1 -0
- package/dist/Verbs/ListDatasets.d.ts +6 -0
- package/dist/Verbs/ListDatasets.d.ts.map +1 -0
- package/dist/Verbs/ListDatasets.js +83 -0
- package/dist/Verbs/ListDatasets.js.map +1 -0
- package/dist/Verbs/ListEnvironmentVariables.d.ts +14 -0
- package/dist/Verbs/ListEnvironmentVariables.d.ts.map +1 -0
- package/dist/Verbs/ListEnvironmentVariables.js +82 -0
- package/dist/Verbs/ListEnvironmentVariables.js.map +1 -0
- package/dist/Verbs/ListFlows.d.ts +13 -0
- package/dist/Verbs/ListFlows.d.ts.map +1 -0
- package/dist/Verbs/ListFlows.js +88 -0
- package/dist/Verbs/ListFlows.js.map +1 -0
- package/dist/Verbs/ListSqlStoredProcedures.d.ts +6 -0
- package/dist/Verbs/ListSqlStoredProcedures.d.ts.map +1 -0
- package/dist/Verbs/ListSqlStoredProcedures.js +84 -0
- package/dist/Verbs/ListSqlStoredProcedures.js.map +1 -0
- package/dist/Verbs/ListTables.d.ts +6 -0
- package/dist/Verbs/ListTables.d.ts.map +1 -0
- package/dist/Verbs/ListTables.js +95 -0
- package/dist/Verbs/ListTables.js.map +1 -0
- package/dist/Verbs/Logout.d.ts +6 -0
- package/dist/Verbs/Logout.d.ts.map +1 -0
- package/dist/Verbs/Logout.js +28 -0
- package/dist/Verbs/Logout.js.map +1 -0
- package/dist/Verbs/Push.d.ts +6 -0
- package/dist/Verbs/Push.d.ts.map +1 -0
- package/dist/Verbs/Push.js +108 -0
- package/dist/Verbs/Push.js.map +1 -0
- package/dist/Verbs/RefreshDataSource.d.ts +6 -0
- package/dist/Verbs/RefreshDataSource.d.ts.map +1 -0
- package/dist/Verbs/RefreshDataSource.js +70 -0
- package/dist/Verbs/RefreshDataSource.js.map +1 -0
- package/dist/Verbs/RemoveFlow.d.ts +12 -0
- package/dist/Verbs/RemoveFlow.d.ts.map +1 -0
- package/dist/Verbs/RemoveFlow.js +98 -0
- package/dist/Verbs/RemoveFlow.js.map +1 -0
- package/dist/Verbs/Run.d.ts +6 -0
- package/dist/Verbs/Run.d.ts.map +1 -0
- package/dist/Verbs/Run.js +122 -0
- package/dist/Verbs/Run.js.map +1 -0
- package/dist/Verbs/TelemetrySettings.d.ts +12 -0
- package/dist/Verbs/TelemetrySettings.d.ts.map +1 -0
- package/dist/Verbs/TelemetrySettings.js +158 -0
- package/dist/Verbs/TelemetrySettings.js.map +1 -0
- package/dist/Verbs/VerbConstants.d.ts +203 -0
- package/dist/Verbs/VerbConstants.d.ts.map +1 -0
- package/dist/Verbs/VerbConstants.js +201 -0
- package/dist/Verbs/VerbConstants.js.map +1 -0
- package/dist/Verbs/index.d.ts +22 -0
- package/dist/Verbs/index.d.ts.map +1 -0
- package/dist/Verbs/index.js +22 -0
- package/dist/Verbs/index.js.map +1 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -63,16 +63,16 @@ npx power-apps init [options]
|
|
|
63
63
|
|
|
64
64
|
**Options:**
|
|
65
65
|
|
|
66
|
-
| Option | Alias | Description
|
|
67
|
-
| -------------------- | ----- |
|
|
68
|
-
| `--environment-id` | `-e` | Environment ID to connect to
|
|
69
|
-
| `--cloud` | | Cloud instance to use (e.g., prod, test, etc.)
|
|
70
|
-
| `--display-name` | `-n` | Display name for the app
|
|
71
|
-
| `--description` | `-d` | App description
|
|
72
|
-
| `--build-path` | `-b` | Build output path
|
|
73
|
-
| `--file-entry-point` | `-f` | Entry point file for the app
|
|
74
|
-
| `--app-url` | `-a` | Local URL where the app is hosted
|
|
75
|
-
| `--logo-path` | `-l` | Path to the app logo file
|
|
66
|
+
| Option | Alias | Description | Default |
|
|
67
|
+
| -------------------- | ----- | ---------------------------------------------- | ----------------------- |
|
|
68
|
+
| `--environment-id` | `-e` | Environment ID to connect to | |
|
|
69
|
+
| `--cloud` | | Cloud instance to use (e.g., prod, test, etc.) | `prod` |
|
|
70
|
+
| `--display-name` | `-n` | Display name for the app | |
|
|
71
|
+
| `--description` | `-d` | App description | _(empty)_ |
|
|
72
|
+
| `--build-path` | `-b` | Build output path | `./dist` |
|
|
73
|
+
| `--file-entry-point` | `-f` | Entry point file for the app | `index.html` |
|
|
74
|
+
| `--app-url` | `-a` | Local URL where the app is hosted | `http://localhost:3000` |
|
|
75
|
+
| `--logo-path` | `-l` | Path to the app logo file | `Default` |
|
|
76
76
|
|
|
77
77
|
---
|
|
78
78
|
|
|
@@ -261,6 +261,77 @@ npx power-apps list-flows [options]
|
|
|
261
261
|
|
|
262
262
|
---
|
|
263
263
|
|
|
264
|
+
### `add-flow`
|
|
265
|
+
|
|
266
|
+
Add a cloud flow to the current Power Apps code app by flow ID. Fetches the flow metadata and swagger, updates `power.config` with connection references, and generates model services.
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
npx power-apps add-flow --flow-id <flow-id>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Options:**
|
|
273
|
+
|
|
274
|
+
| Option | Alias | Description |
|
|
275
|
+
| ----------- | ----- | ----------------------------------------------- |
|
|
276
|
+
| `--flow-id` | `-f` | The unique identifier (GUID) of the flow to add |
|
|
277
|
+
|
|
278
|
+
**Example:**
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
npx power-apps add-flow --flow-id 00000000-0000-0000-0000-000000000000
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
### `find-dataverse-api`
|
|
287
|
+
|
|
288
|
+
Search Dataverse actions and functions in the environment by name.
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
npx power-apps find-dataverse-api [options]
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Options:**
|
|
295
|
+
|
|
296
|
+
| Option | Alias | Description |
|
|
297
|
+
| ---------- | ----- | -------------------------------------------------- |
|
|
298
|
+
| `--search` | `-s` | Search term to filter Dataverse operations by name |
|
|
299
|
+
|
|
300
|
+
**Examples:**
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
npx power-apps find-dataverse-api --search "account"
|
|
304
|
+
npx power-apps find-dataverse-api --search "account" --json
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
### `remove-flow`
|
|
310
|
+
|
|
311
|
+
Remove a cloud flow from the current Power Apps code app. Deletes the flow's connection references from `power.config`, removes the schema file, and regenerates model services.
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
npx power-apps remove-flow [options]
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**Options:**
|
|
318
|
+
|
|
319
|
+
| Option | Alias | Description |
|
|
320
|
+
| ------------- | ----- | --------------------------------------------------------------------- |
|
|
321
|
+
| `--flow-name` | `-n` | The flow data source name to remove (as it appears in `power.config`) |
|
|
322
|
+
| `--flow-id` | `-f` | The flow resource ID (GUID) to remove — same ID used with `add-flow` |
|
|
323
|
+
|
|
324
|
+
Provide either `--flow-name` or `--flow-id`.
|
|
325
|
+
|
|
326
|
+
**Examples:**
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
npx power-apps remove-flow --flow-name myFlow
|
|
330
|
+
npx power-apps remove-flow --flow-id 00000000-0000-0000-0000-000000000000
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
264
335
|
### `telemetry`
|
|
265
336
|
|
|
266
337
|
Manage telemetry settings.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { IHttpClient } from '@microsoft/power-apps-actions';
|
|
5
|
+
import type { CliLogger } from './Logger/CliLogger.js';
|
|
6
|
+
import type { CliOption } from './Types/Argument.types.js';
|
|
7
|
+
import type { Verb } from './Types/Cli.types.js';
|
|
8
|
+
import type { IAuthenticationProvider } from './Types/Cli.types.js';
|
|
9
|
+
export interface IArgumentProvider {
|
|
10
|
+
addOption(cliOption: CliOption): void;
|
|
11
|
+
addOptions(cliOptions: CliOption[]): void;
|
|
12
|
+
addSwitch(cliOption: CliOption): void;
|
|
13
|
+
addSwitches(cliOptions: CliOption[]): void;
|
|
14
|
+
runVerb(): Promise<void>;
|
|
15
|
+
getVerb(): Verb;
|
|
16
|
+
handleGlobalHelpOrFlagsAndExit(): void;
|
|
17
|
+
getOption<T>(key: string, ignorePrompt?: boolean): Promise<T>;
|
|
18
|
+
getAuthenticationProvider(): IAuthenticationProvider;
|
|
19
|
+
setDescription(description: string): void;
|
|
20
|
+
isJsonMode(): boolean;
|
|
21
|
+
addExamples(examples: string[]): void;
|
|
22
|
+
}
|
|
23
|
+
export declare class ArgumentProvider implements IArgumentProvider {
|
|
24
|
+
private _httpClient;
|
|
25
|
+
private _logger;
|
|
26
|
+
private _authenticationProvider;
|
|
27
|
+
private _environmentId;
|
|
28
|
+
private _region;
|
|
29
|
+
private _verb;
|
|
30
|
+
private _program;
|
|
31
|
+
private _options;
|
|
32
|
+
constructor(_httpClient: IHttpClient, _logger: CliLogger, _authenticationProvider: IAuthenticationProvider);
|
|
33
|
+
addSwitch(cliOption: CliOption): void;
|
|
34
|
+
addSwitches(cliOptions: CliOption[]): void;
|
|
35
|
+
addOption(cliOption: CliOption): void;
|
|
36
|
+
addOptions(cliOptions: CliOption[]): void;
|
|
37
|
+
runVerb(): Promise<void>;
|
|
38
|
+
handleGlobalHelpOrFlagsAndExit(): void;
|
|
39
|
+
getVerb(): Verb;
|
|
40
|
+
getOption<T>(key: string, ignorePrompt?: boolean): Promise<T>;
|
|
41
|
+
getAuthenticationProvider(): IAuthenticationProvider;
|
|
42
|
+
/**
|
|
43
|
+
* Sets the description for the current command context.
|
|
44
|
+
* This is used to display help information specific to the verb being executed.
|
|
45
|
+
*
|
|
46
|
+
* @param {string} description - The description to set for the program.
|
|
47
|
+
*/
|
|
48
|
+
setDescription(description: string): void;
|
|
49
|
+
isJsonMode(): boolean;
|
|
50
|
+
addExamples(examples: string[]): void;
|
|
51
|
+
getEnvironmentId(): string | undefined;
|
|
52
|
+
private _getRequiredVariables;
|
|
53
|
+
/**
|
|
54
|
+
* @param {CliOption} cliOption
|
|
55
|
+
* @param {boolean} [hasValue=true] true if the option requires a value, false for a switch such as --help
|
|
56
|
+
*/
|
|
57
|
+
private _createOption;
|
|
58
|
+
private _createFlags;
|
|
59
|
+
private _createSwitchFlags;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ArgumentProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArgumentProvider.d.ts","sourceRoot":"","sources":["../src/ArgumentProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAcjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAS,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAIjE,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC1C,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,IAAI,CAAC;IAChB,8BAA8B,IAAI,IAAI,CAAC;IACvC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9D,yBAAyB,IAAI,uBAAuB,CAAC;IACrD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACvC;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IAQtD,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,uBAAuB;IATjC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,QAAQ,CAAiC;gBAGvC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,SAAS,EAClB,uBAAuB,EAAE,uBAAuB;IAgFnD,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIrC,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAI1C,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIrC,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAInC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B9B,8BAA8B;IAU9B,OAAO,IAAI,IAAI;IAOT,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAqCnE,yBAAyB,IAAI,uBAAuB;IAI3D;;;;;OAKG;IACI,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,IAAI,OAAO;IAIrB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAWrC,gBAAgB,IAAI,MAAM,GAAG,SAAS;YAI/B,qBAAqB;IAsBnC;;;OAGG;IACH,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,kBAAkB;CAI3B"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { initializePlayerServices, updateEnvironmentName, updateRegion, } from '@microsoft/power-apps-actions';
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import packageJson from '../package.json' with { type: 'json' };
|
|
7
|
+
import { getSettings } from './CliSettings.js';
|
|
8
|
+
import { createDefaultStringOption } from './CliUtils.js';
|
|
9
|
+
import { HelpStrings } from './Constants/HelpStrings.js';
|
|
10
|
+
import { UsageError } from './Errors/CliError.js';
|
|
11
|
+
import { buildVerbDescriptionTable } from './Utils/BuildVerbDescriptionTable.js';
|
|
12
|
+
import { GlobalArguments } from './Verbs/VerbConstants.js';
|
|
13
|
+
export class ArgumentProvider {
|
|
14
|
+
_httpClient;
|
|
15
|
+
_logger;
|
|
16
|
+
_authenticationProvider;
|
|
17
|
+
_environmentId;
|
|
18
|
+
_region;
|
|
19
|
+
_verb;
|
|
20
|
+
_program;
|
|
21
|
+
_options = {};
|
|
22
|
+
constructor(_httpClient, _logger, _authenticationProvider) {
|
|
23
|
+
this._httpClient = _httpClient;
|
|
24
|
+
this._logger = _logger;
|
|
25
|
+
this._authenticationProvider = _authenticationProvider;
|
|
26
|
+
this._verb = (process.argv[2] || process.env.VERB);
|
|
27
|
+
this._program = new Command();
|
|
28
|
+
// Add the --non-interactive switch as a global option
|
|
29
|
+
this._program.option('--non-interactive', 'Run in non-interactive mode (no prompts, all parameters must be provided via flags or environment variables)');
|
|
30
|
+
this._program.option('--json', 'Format output as JSON');
|
|
31
|
+
this._program.option('--no-color', 'Disable colored output');
|
|
32
|
+
// If a specific verb is detected (and it's not a flag like --help), we configure the program
|
|
33
|
+
// to behave as if that verb is the command itself (e.g., "power-apps-cli add-data-source").
|
|
34
|
+
// This allows us to display help specific to that verb (options, description) when --help is used,
|
|
35
|
+
// rather than showing the generic top-level help. We omit the [verb] argument definition here
|
|
36
|
+
// because the verb is already "consumed" into the program name for this execution context.
|
|
37
|
+
if (this._verb && !this._verb.startsWith('-')) {
|
|
38
|
+
this._program.name(`power-apps ${this._verb}`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this._program.name('power-apps');
|
|
42
|
+
this._program.usage('[option] [command] [<args>]');
|
|
43
|
+
}
|
|
44
|
+
this._program.version(packageJson.version, '-v, --version', 'output the current version');
|
|
45
|
+
this._program.description(HelpStrings.Global.ProgramDescription);
|
|
46
|
+
// Register custom help text to show verb table on global --help
|
|
47
|
+
// This uses Commander's addHelpText hook which runs when help is displayed
|
|
48
|
+
this._program.addHelpText('after', (_context) => {
|
|
49
|
+
// Only show verb table for global help (not verb-specific help)
|
|
50
|
+
if (!this._verb || this._verb.startsWith('-')) {
|
|
51
|
+
return '\n' + buildVerbDescriptionTable() + '\n';
|
|
52
|
+
}
|
|
53
|
+
return '';
|
|
54
|
+
});
|
|
55
|
+
const settings = getSettings();
|
|
56
|
+
this._environmentId = settings.appConfig?.environmentId;
|
|
57
|
+
this._region = settings.appConfig?.region;
|
|
58
|
+
if (!this._region) {
|
|
59
|
+
// Do not provide a prompt, default to prod
|
|
60
|
+
this.addOption({
|
|
61
|
+
flags: {
|
|
62
|
+
key: GlobalArguments.Cloud.name,
|
|
63
|
+
},
|
|
64
|
+
env: GlobalArguments.Cloud.envVar,
|
|
65
|
+
default: 'prod',
|
|
66
|
+
description: HelpStrings.Global.Cloud,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// If we do not have an environmentId, add an option to get one
|
|
70
|
+
if (!this._environmentId) {
|
|
71
|
+
this.addOption(createDefaultStringOption({
|
|
72
|
+
flags: {
|
|
73
|
+
key: GlobalArguments.EnvironmentId.name,
|
|
74
|
+
alias: GlobalArguments.EnvironmentId.alias,
|
|
75
|
+
},
|
|
76
|
+
env: GlobalArguments.EnvironmentId.envVar,
|
|
77
|
+
message: 'Please provide the environment ID:',
|
|
78
|
+
description: HelpStrings.Global.EnvironmentId,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
initializePlayerServices({
|
|
82
|
+
httpClient: this._httpClient,
|
|
83
|
+
logger: this._logger,
|
|
84
|
+
// Default region is 'prod' if not specified
|
|
85
|
+
region: this._region || 'prod',
|
|
86
|
+
// Do a temporary variable
|
|
87
|
+
environmentName: this._environmentId || 'default',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
addSwitch(cliOption) {
|
|
91
|
+
this._createOption(cliOption, false);
|
|
92
|
+
}
|
|
93
|
+
addSwitches(cliOptions) {
|
|
94
|
+
cliOptions.forEach((cliOption) => this._createOption(cliOption, false));
|
|
95
|
+
}
|
|
96
|
+
addOption(cliOption) {
|
|
97
|
+
this._createOption(cliOption);
|
|
98
|
+
}
|
|
99
|
+
addOptions(cliOptions) {
|
|
100
|
+
cliOptions.forEach((cliOption) => this._createOption(cliOption));
|
|
101
|
+
}
|
|
102
|
+
async runVerb() {
|
|
103
|
+
// Commander needs to see only the verb-specific arguments, so strip the verb token
|
|
104
|
+
// when a verb was supplied explicitly; global flag paths skip this method entirely.
|
|
105
|
+
if (this._verb && !this._verb.startsWith('-') && process.argv[2] === this._verb) {
|
|
106
|
+
const args = [process.argv[0], process.argv[1], ...process.argv.slice(3)];
|
|
107
|
+
this._program.parse(args);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this._program.parse();
|
|
111
|
+
}
|
|
112
|
+
await this._getRequiredVariables();
|
|
113
|
+
if (!this._region) {
|
|
114
|
+
throw new UsageError('Region is not set. Use --cloud or set the CLOUD_INSTANCE environment variable.');
|
|
115
|
+
}
|
|
116
|
+
await this._authenticationProvider.initAsync(this._region);
|
|
117
|
+
await this._logger.initializeTelemetry(this._authenticationProvider);
|
|
118
|
+
this._logger.trackActivityEvent('Initialize', {
|
|
119
|
+
verb: this._verb,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Handles scenarios where only global flags (e.g., --help/--version) are provided.
|
|
123
|
+
// Returns 'help' when no verb is present, 'flag' when a flag verb needs Commander handling,
|
|
124
|
+
// and 'none' when execution should continue to verb-specific logic.
|
|
125
|
+
handleGlobalHelpOrFlagsAndExit() {
|
|
126
|
+
if (!this._verb) {
|
|
127
|
+
this._program.help(); // This will display help and exit
|
|
128
|
+
}
|
|
129
|
+
if (this._verb.startsWith('-')) {
|
|
130
|
+
this._program.parse(process.argv);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
getVerb() {
|
|
134
|
+
if (!this._verb || this._verb.startsWith('-')) {
|
|
135
|
+
throw new UsageError('No command specified. Run "power-apps --help" for available commands.');
|
|
136
|
+
}
|
|
137
|
+
return this._verb;
|
|
138
|
+
}
|
|
139
|
+
async getOption(key, ignorePrompt) {
|
|
140
|
+
const settings = getSettings();
|
|
141
|
+
let value = this._program.getOptionValue(key);
|
|
142
|
+
const option = this._options[key];
|
|
143
|
+
// Fallback to environment variable if not provided via CLI
|
|
144
|
+
if (value === undefined && option && option.env) {
|
|
145
|
+
value = process.env[option.env];
|
|
146
|
+
}
|
|
147
|
+
// Fallback to default value if not provided via CLI or Env
|
|
148
|
+
if (value === undefined && option && option.default !== undefined) {
|
|
149
|
+
value = option.default;
|
|
150
|
+
}
|
|
151
|
+
if (!value && !ignorePrompt && option?.customPrompt) {
|
|
152
|
+
if (!settings.interactive) {
|
|
153
|
+
if (option.optionalInNonInteractive) {
|
|
154
|
+
// Option is optional — return undefined and let the actions layer handle it.
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const flagName = option.flags.key;
|
|
158
|
+
const alias = option.flags.alias;
|
|
159
|
+
const flagHint = alias ? `--${flagName} (-${alias})` : `--${flagName}`;
|
|
160
|
+
const envHint = option.env ? ` or environment variable (${option.env})` : '';
|
|
161
|
+
throw new UsageError(`Missing required option ${flagHint}${envHint}. In non-interactive mode, all parameters must be provided via flags or environment variables.`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
value = await option.customPrompt();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Option could be undefined by design, so just return it.
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
getAuthenticationProvider() {
|
|
172
|
+
return this._authenticationProvider;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Sets the description for the current command context.
|
|
176
|
+
* This is used to display help information specific to the verb being executed.
|
|
177
|
+
*
|
|
178
|
+
* @param {string} description - The description to set for the program.
|
|
179
|
+
*/
|
|
180
|
+
setDescription(description) {
|
|
181
|
+
this._program.description(description);
|
|
182
|
+
}
|
|
183
|
+
isJsonMode() {
|
|
184
|
+
return this._program.opts().json === true;
|
|
185
|
+
}
|
|
186
|
+
addExamples(examples) {
|
|
187
|
+
if (!examples || examples.length === 0)
|
|
188
|
+
return;
|
|
189
|
+
this._program.addHelpText('after', () => {
|
|
190
|
+
const lines = ['', 'Examples:'];
|
|
191
|
+
examples.forEach((example) => {
|
|
192
|
+
lines.push(` $ ${example}`);
|
|
193
|
+
});
|
|
194
|
+
return lines.join('\n');
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
getEnvironmentId() {
|
|
198
|
+
return this._environmentId;
|
|
199
|
+
}
|
|
200
|
+
async _getRequiredVariables() {
|
|
201
|
+
// We always need a region and environmentId, which we usually get from the config.
|
|
202
|
+
// If there is no config we prompt for them, except for init/telemetry which manage their own state.
|
|
203
|
+
if (this._verb !== 'telemetry' && this._verb !== 'logout') {
|
|
204
|
+
if (!this._environmentId) {
|
|
205
|
+
const environmentId = await this.getOption('environmentId');
|
|
206
|
+
if (environmentId) {
|
|
207
|
+
this._environmentId = environmentId;
|
|
208
|
+
updateEnvironmentName(this._environmentId);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (!this._region) {
|
|
213
|
+
const region = await this.getOption('cloud');
|
|
214
|
+
if (region) {
|
|
215
|
+
this._region = region;
|
|
216
|
+
updateRegion(region);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* @param {CliOption} cliOption
|
|
222
|
+
* @param {boolean} [hasValue=true] true if the option requires a value, false for a switch such as --help
|
|
223
|
+
*/
|
|
224
|
+
_createOption(cliOption, hasValue = true) {
|
|
225
|
+
const option = this._program.createOption(hasValue ? this._createFlags(cliOption.flags) : this._createSwitchFlags(cliOption.flags), cliOption.description);
|
|
226
|
+
// We do not set the env or default here because we want to handle it manually in getOption
|
|
227
|
+
// This allows us to hide the env variable from the help text
|
|
228
|
+
// Hide global options from help output when showing global help
|
|
229
|
+
// This prevents --environment-id and --cloud from showing up in the global help
|
|
230
|
+
if (!this._verb || this._verb.startsWith('-')) {
|
|
231
|
+
option.hideHelp();
|
|
232
|
+
}
|
|
233
|
+
this._program.addOption(option);
|
|
234
|
+
// Map to CliOption using Commander's camelCase attribute name so
|
|
235
|
+
// getOption('environmentId') finds the option registered as --environment-id.
|
|
236
|
+
this._options[option.attributeName()] = cliOption;
|
|
237
|
+
}
|
|
238
|
+
_createFlags(flags) {
|
|
239
|
+
const { key, alias } = flags;
|
|
240
|
+
return alias ? `-${alias}, --${key} <${key}>` : `--${key} <${key}>`;
|
|
241
|
+
}
|
|
242
|
+
_createSwitchFlags(flags) {
|
|
243
|
+
const { key, alias } = flags;
|
|
244
|
+
return alias ? `-${alias}, --${key}` : `--${key}`;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=ArgumentProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArgumentProvider.js","sourceRoot":"","sources":["../src/ArgumentProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { Region } from '@microsoft/power-apps-common/services';
|
|
5
|
+
import type { IAuthenticationProvider } from '../Types/Cli.types.js';
|
|
6
|
+
export declare class NodeMsalAuthenticationProvider implements IAuthenticationProvider {
|
|
7
|
+
private _msalClient;
|
|
8
|
+
private _tenantId;
|
|
9
|
+
private _region;
|
|
10
|
+
constructor();
|
|
11
|
+
initAsync(region: Region): Promise<void>;
|
|
12
|
+
getAccessTokenForResource(resource: string): Promise<string>;
|
|
13
|
+
getUserTenantId(): string | undefined;
|
|
14
|
+
private _acquireTokenInternal;
|
|
15
|
+
private _getInteractiveLoginRequest;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=NodeMsalAuthenticationProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeMsalAuthenticationProvider.d.ts","sourceRoot":"","sources":["../../src/Authentication/NodeMsalAuthenticationProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAKpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAGlE,qBAAa,8BAA+B,YAAW,uBAAuB;IAC5E,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAqB;;IAIvB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BxC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlE,eAAe,IAAI,MAAM,GAAG,SAAS;YAI9B,qBAAqB;IAmCnC,OAAO,CAAC,2BAA2B;CAepC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { InteractionRequiredAuthError, PublicClientApplication } from '@azure/msal-node';
|
|
5
|
+
import open from 'open';
|
|
6
|
+
import { getAuthority } from '../CliUtils.js';
|
|
7
|
+
import { AUTH_CACHE_DIRECTORY } from '../Constants.js';
|
|
8
|
+
import { printError, printInfo } from '../Utils/ConsoleOutput.js';
|
|
9
|
+
export class NodeMsalAuthenticationProvider {
|
|
10
|
+
_msalClient;
|
|
11
|
+
_tenantId;
|
|
12
|
+
_region;
|
|
13
|
+
constructor() { }
|
|
14
|
+
async initAsync(region) {
|
|
15
|
+
this._region = region;
|
|
16
|
+
const { DataProtectionScope, PersistenceCachePlugin, PersistenceCreator } = await import('@azure/msal-node-extensions');
|
|
17
|
+
const persistenceConfiguration = {
|
|
18
|
+
cachePath: AUTH_CACHE_DIRECTORY + '/msal_cache.json',
|
|
19
|
+
dataProtectionScope: DataProtectionScope.CurrentUser,
|
|
20
|
+
serviceName: 'power-apps',
|
|
21
|
+
accountName: 'power-apps',
|
|
22
|
+
usePlaintextFileOnLinux: false,
|
|
23
|
+
};
|
|
24
|
+
const persistence = await PersistenceCreator.createPersistence(persistenceConfiguration);
|
|
25
|
+
const authConfig = {
|
|
26
|
+
auth: {
|
|
27
|
+
authority: getAuthority(this._region, this._tenantId),
|
|
28
|
+
clientId: '9cee029c-6210-4654-90bb-17e6e9d36617',
|
|
29
|
+
},
|
|
30
|
+
cache: {
|
|
31
|
+
cachePlugin: new PersistenceCachePlugin(persistence),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
this._msalClient = new PublicClientApplication(authConfig);
|
|
35
|
+
}
|
|
36
|
+
async getAccessTokenForResource(resource) {
|
|
37
|
+
const result = await this._acquireTokenInternal(resource + '/.default');
|
|
38
|
+
this._tenantId = result.tenantId;
|
|
39
|
+
return result.accessToken;
|
|
40
|
+
}
|
|
41
|
+
getUserTenantId() {
|
|
42
|
+
return this._tenantId;
|
|
43
|
+
}
|
|
44
|
+
async _acquireTokenInternal(resource) {
|
|
45
|
+
if (!this._msalClient) {
|
|
46
|
+
throw new Error('Authentication not initialized yet');
|
|
47
|
+
}
|
|
48
|
+
const accounts = await this._msalClient.getTokenCache().getAllAccounts();
|
|
49
|
+
if (accounts.length === 1) {
|
|
50
|
+
const silentRequest = {
|
|
51
|
+
account: accounts[0],
|
|
52
|
+
scopes: [resource],
|
|
53
|
+
};
|
|
54
|
+
try {
|
|
55
|
+
const result = await this._msalClient.acquireTokenSilent(silentRequest);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof InteractionRequiredAuthError) {
|
|
60
|
+
return this._msalClient.acquireTokenInteractive(this._getInteractiveLoginRequest(resource));
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (accounts.length > 1) {
|
|
66
|
+
accounts.forEach((account) => {
|
|
67
|
+
printInfo(account.username);
|
|
68
|
+
});
|
|
69
|
+
return Promise.reject('Multiple accounts found. Please use the logout command to remove existing accounts.');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return this._msalClient.acquireTokenInteractive(this._getInteractiveLoginRequest(resource));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
_getInteractiveLoginRequest(resource) {
|
|
76
|
+
const openBrowser = async (url) => {
|
|
77
|
+
try {
|
|
78
|
+
await open(url, { wait: false });
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
printError(`Failed to open browser: ${String(error)}`);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
scopes: [resource],
|
|
86
|
+
openBrowser,
|
|
87
|
+
successTemplate: 'You can close this window now.',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=NodeMsalAuthenticationProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeMsalAuthenticationProvider.js","sourceRoot":"","sources":["../../src/Authentication/NodeMsalAuthenticationProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { Region } from '@microsoft/power-apps-common/services';
|
|
5
|
+
import type { IAuthenticationProvider } from '../Types/Cli.types.js';
|
|
6
|
+
export declare class PacCliAuthenticationProvider implements IAuthenticationProvider {
|
|
7
|
+
private _tokenCache;
|
|
8
|
+
initAsync(_region: Region): Promise<void>;
|
|
9
|
+
getAccessTokenForResource(resource: string): Promise<string>;
|
|
10
|
+
getUserTenantId(): string | undefined;
|
|
11
|
+
private _getAccessTokenFromResourceInternal;
|
|
12
|
+
private _requestToken;
|
|
13
|
+
private _readStdIn;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=PacCliAuthenticationProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PacCliAuthenticationProvider.d.ts","sourceRoot":"","sources":["../../src/Authentication/PacCliAuthenticationProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAGpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,qBAAa,4BAA6B,YAAW,uBAAuB;IAC1E,OAAO,CAAC,WAAW,CAA8B;IAEpC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlE,eAAe,IAAI,MAAM,GAAG,SAAS;YAI9B,mCAAmC;IAgBjD,OAAO,CAAC,aAAa;YAIP,UAAU;CAqBzB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import * as readline from 'readline';
|
|
5
|
+
export class PacCliAuthenticationProvider {
|
|
6
|
+
_tokenCache = {};
|
|
7
|
+
async initAsync(_region) {
|
|
8
|
+
// no-op
|
|
9
|
+
}
|
|
10
|
+
async getAccessTokenForResource(resource) {
|
|
11
|
+
return this._getAccessTokenFromResourceInternal(resource);
|
|
12
|
+
}
|
|
13
|
+
getUserTenantId() {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
async _getAccessTokenFromResourceInternal(resource) {
|
|
17
|
+
if (this._tokenCache[resource]) {
|
|
18
|
+
return this._tokenCache[resource];
|
|
19
|
+
}
|
|
20
|
+
this._requestToken(resource);
|
|
21
|
+
const token = await this._readStdIn();
|
|
22
|
+
if (!token) {
|
|
23
|
+
throw new Error('No token provided');
|
|
24
|
+
}
|
|
25
|
+
this._tokenCache[resource] = token;
|
|
26
|
+
return token;
|
|
27
|
+
}
|
|
28
|
+
_requestToken(resource) {
|
|
29
|
+
console.log('REQUEST_TOKEN ' + resource);
|
|
30
|
+
}
|
|
31
|
+
async _readStdIn() {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const rl = readline.createInterface({
|
|
34
|
+
input: process.stdin,
|
|
35
|
+
output: process.stdout,
|
|
36
|
+
terminal: false,
|
|
37
|
+
});
|
|
38
|
+
// Wait 10 seconds to get the token before throwing an error
|
|
39
|
+
const timeout = setTimeout(() => {
|
|
40
|
+
rl.close();
|
|
41
|
+
reject(new Error('Token input timeout: No token received within 10 seconds'));
|
|
42
|
+
}, 10000);
|
|
43
|
+
rl.once('line', (line) => {
|
|
44
|
+
clearTimeout(timeout);
|
|
45
|
+
rl.close();
|
|
46
|
+
resolve(line.trim());
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=PacCliAuthenticationProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PacCliAuthenticationProvider.js","sourceRoot":"","sources":["../../src/Authentication/PacCliAuthenticationProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAIrC,MAAM,OAAO,4BAA4B;IAC/B,WAAW,GAA2B,EAAE,CAAC;IAE1C,KAAK,CAAC,SAAS,CAAC,OAAe;QACpC,QAAQ;IACV,CAAC;IAEM,KAAK,CAAC,yBAAyB,CAAC,QAAgB;QACrD,OAAO,IAAI,CAAC,mCAAmC,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAEM,eAAe;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,mCAAmC,CAAC,QAAgB;QAChE,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,aAAa,CAAC,QAAgB;QACpC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YAEH,4DAA4D;YAC5D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC;YAChF,CAAC,EAAE,KAAK,CAAC,CAAC;YAEV,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { Region } from '@microsoft/power-apps-common/services';
|
|
5
|
+
import type { IAuthenticationProvider } from '../Types/Cli.types.js';
|
|
6
|
+
/**
|
|
7
|
+
* note: This is meant for use in CI only since it hardcodes the authority & tenant ID.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ServicePrincipalAuthenticationProvider implements IAuthenticationProvider {
|
|
10
|
+
private _msalClient;
|
|
11
|
+
private _clientId;
|
|
12
|
+
private _clientSecret;
|
|
13
|
+
private _tenantId;
|
|
14
|
+
private _region;
|
|
15
|
+
constructor();
|
|
16
|
+
initAsync(region: Region): Promise<void>;
|
|
17
|
+
getAccessTokenForResource(resource: string): Promise<string>;
|
|
18
|
+
getUserTenantId(): string | undefined;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ServicePrincipalAuthenticationProvider.d.ts.map
|