@microsoft/managed-apps-cli 0.10.0 → 0.11.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 +4 -308
- package/dist/ArgumentProvider.d.ts.map +1 -1
- package/dist/ArgumentProvider.js +5 -1
- package/dist/ArgumentProvider.js.map +1 -1
- package/dist/Cli.d.ts.map +1 -1
- package/dist/Cli.js +3 -1
- package/dist/Cli.js.map +1 -1
- package/dist/Constants/CommandRegistry.d.ts +1 -2
- package/dist/Constants/CommandRegistry.d.ts.map +1 -1
- package/dist/Constants/CommandRegistry.js +27 -27
- package/dist/Constants/CommandRegistry.js.map +1 -1
- package/dist/Constants/HelpStrings.d.ts +5 -2
- package/dist/Constants/HelpStrings.d.ts.map +1 -1
- package/dist/Constants/HelpStrings.js +25 -12
- 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 +9 -4
- package/dist/Constants.js.map +1 -1
- package/dist/Errors/GitHubErrorMap.d.ts.map +1 -1
- package/dist/Errors/GitHubErrorMap.js +1 -0
- package/dist/Errors/GitHubErrorMap.js.map +1 -1
- package/dist/Logger/CliLogger.d.ts +1 -0
- package/dist/Logger/CliLogger.d.ts.map +1 -1
- package/dist/Logger/CliLogger.js +7 -0
- package/dist/Logger/CliLogger.js.map +1 -1
- package/dist/Logger/ConsoleWriter.d.ts +2 -0
- package/dist/Logger/ConsoleWriter.d.ts.map +1 -1
- package/dist/Logger/ConsoleWriter.js +17 -7
- package/dist/Logger/ConsoleWriter.js.map +1 -1
- package/dist/Types/Command.types.d.ts +6 -0
- package/dist/Types/Command.types.d.ts.map +1 -1
- package/dist/Types/Command.types.js +8 -0
- package/dist/Types/Command.types.js.map +1 -1
- package/dist/Utils/BuildVerbDescriptionTable.d.ts.map +1 -1
- package/dist/Utils/BuildVerbDescriptionTable.js +6 -2
- package/dist/Utils/BuildVerbDescriptionTable.js.map +1 -1
- package/dist/Utils/ConnectorIds.d.ts +12 -0
- package/dist/Utils/ConnectorIds.d.ts.map +1 -0
- package/dist/Utils/ConnectorIds.js +20 -0
- package/dist/Utils/ConnectorIds.js.map +1 -0
- package/dist/Utils/DownloadTemplate.d.ts.map +1 -1
- package/dist/Utils/DownloadTemplate.js +7 -5
- package/dist/Utils/DownloadTemplate.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 +20 -1
- package/dist/Utils/EnvironmentRoutingUtils.d.ts.map +1 -1
- package/dist/Utils/EnvironmentRoutingUtils.js +78 -3
- package/dist/Utils/EnvironmentRoutingUtils.js.map +1 -1
- package/dist/Utils/GitErrorClassifier.d.ts +40 -0
- package/dist/Utils/GitErrorClassifier.d.ts.map +1 -0
- package/dist/Utils/GitErrorClassifier.js +120 -0
- package/dist/Utils/GitErrorClassifier.js.map +1 -0
- package/dist/Utils/GitRunner.d.ts +107 -0
- package/dist/Utils/GitRunner.d.ts.map +1 -0
- package/dist/Utils/GitRunner.js +89 -0
- package/dist/Utils/GitRunner.js.map +1 -0
- package/dist/Utils/GitUtils.d.ts +12 -0
- package/dist/Utils/GitUtils.d.ts.map +1 -1
- package/dist/Utils/GitUtils.js +83 -20
- package/dist/Utils/GitUtils.js.map +1 -1
- package/dist/Utils/GitVersionChecker.d.ts.map +1 -1
- package/dist/Utils/GitVersionChecker.js +11 -8
- package/dist/Utils/GitVersionChecker.js.map +1 -1
- package/dist/Utils/Paging.d.ts +1 -0
- package/dist/Utils/Paging.d.ts.map +1 -1
- package/dist/Utils/Paging.js +7 -1
- package/dist/Utils/Paging.js.map +1 -1
- package/dist/Utils/RepoDetails.d.ts +29 -0
- package/dist/Utils/RepoDetails.d.ts.map +1 -0
- package/dist/Utils/RepoDetails.js +37 -0
- package/dist/Utils/RepoDetails.js.map +1 -0
- package/dist/Utils/ResolveCommand.d.ts.map +1 -1
- package/dist/Utils/ResolveCommand.js +6 -4
- package/dist/Utils/ResolveCommand.js.map +1 -1
- package/dist/Verbs/AddConnector.d.ts +1 -1
- package/dist/Verbs/AddConnector.d.ts.map +1 -1
- package/dist/Verbs/AddConnector.js +13 -7
- package/dist/Verbs/AddConnector.js.map +1 -1
- package/dist/Verbs/AddConnectorFlows.d.ts +2 -2
- package/dist/Verbs/AddConnectorFlows.d.ts.map +1 -1
- package/dist/Verbs/AddConnectorFlows.js +11 -13
- package/dist/Verbs/AddConnectorFlows.js.map +1 -1
- package/dist/Verbs/AddDataSource.js +1 -1
- package/dist/Verbs/AddDataSource.js.map +1 -1
- package/dist/Verbs/AddTable.js +1 -1
- package/dist/Verbs/AddTable.js.map +1 -1
- package/dist/Verbs/ConnectorHelpers.d.ts +2 -0
- package/dist/Verbs/ConnectorHelpers.d.ts.map +1 -1
- package/dist/Verbs/ConnectorHelpers.js +7 -1
- package/dist/Verbs/ConnectorHelpers.js.map +1 -1
- package/dist/Verbs/CreateMaafApp.d.ts +25 -13
- package/dist/Verbs/CreateMaafApp.d.ts.map +1 -1
- package/dist/Verbs/CreateMaafApp.js +265 -116
- package/dist/Verbs/CreateMaafApp.js.map +1 -1
- package/dist/Verbs/GetMaafApp.d.ts.map +1 -1
- package/dist/Verbs/GetMaafApp.js +10 -0
- package/dist/Verbs/GetMaafApp.js.map +1 -1
- package/dist/Verbs/Init.d.ts.map +1 -1
- package/dist/Verbs/Init.js +36 -21
- package/dist/Verbs/Init.js.map +1 -1
- package/dist/Verbs/ListConnectors.d.ts.map +1 -1
- package/dist/Verbs/ListConnectors.js +1 -0
- package/dist/Verbs/ListConnectors.js.map +1 -1
- package/dist/Verbs/MaafAppPermissions.d.ts.map +1 -1
- package/dist/Verbs/MaafAppPermissions.js +87 -15
- package/dist/Verbs/MaafAppPermissions.js.map +1 -1
- package/dist/Verbs/Pack.d.ts +1 -1
- package/dist/Verbs/RefreshDataSource.js +1 -1
- package/dist/Verbs/RefreshDataSource.js.map +1 -1
- package/dist/Verbs/{DeleteDataSource.d.ts → RemoveDataSource.d.ts} +2 -2
- package/dist/Verbs/RemoveDataSource.d.ts.map +1 -0
- package/dist/Verbs/RemoveDataSource.js +158 -0
- package/dist/Verbs/RemoveDataSource.js.map +1 -0
- package/dist/Verbs/ShareLinkList.js +1 -1
- package/dist/Verbs/ShareLinkList.js.map +1 -1
- package/dist/Verbs/ShowMaafApp.d.ts +6 -0
- package/dist/Verbs/ShowMaafApp.d.ts.map +1 -1
- package/dist/Verbs/ShowMaafApp.js +8 -0
- package/dist/Verbs/ShowMaafApp.js.map +1 -1
- package/dist/Verbs/VerbConstants.d.ts +1 -1
- package/dist/Verbs/VerbConstants.js +1 -1
- package/dist/Verbs/VerbConstants.js.map +1 -1
- package/dist/Verbs/index.d.ts +1 -1
- package/dist/Verbs/index.d.ts.map +1 -1
- package/dist/Verbs/index.js +1 -1
- package/dist/Verbs/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/Verbs/DeleteDataSource.d.ts.map +0 -1
- package/dist/Verbs/DeleteDataSource.js +0 -105
- package/dist/Verbs/DeleteDataSource.js.map +0 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { execFileSync } from 'child_process';
|
|
5
|
+
import { classifyLocalGitError } from './GitErrorClassifier.js';
|
|
6
|
+
function toStr(value) {
|
|
7
|
+
if (value == null)
|
|
8
|
+
return '';
|
|
9
|
+
return Buffer.isBuffer(value) ? value.toString() : value;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Explicit stdout/stderr capture ceiling for every git invocation. Node's
|
|
13
|
+
* `execFileSync` defaults to a 1 MB `maxBuffer`; exceeding it throws `ENOBUFS`
|
|
14
|
+
* (treated by callers as a generic failure). `ls-tree -r HEAD` on a large repo,
|
|
15
|
+
* or verbose clone/fetch progress, can blow past 1 MB — and an `allowFailure`
|
|
16
|
+
* probe would silently misread that `ENOBUFS` as its expected control-flow
|
|
17
|
+
* signal (e.g. "repo is empty"). A generous ceiling avoids those spurious
|
|
18
|
+
* failures while still guarding against runaway memory.
|
|
19
|
+
*/
|
|
20
|
+
const GIT_MAX_BUFFER_BYTES = 64 * 1024 * 1024;
|
|
21
|
+
/**
|
|
22
|
+
* Single chokepoint for every `git` invocation in the CLI.
|
|
23
|
+
*
|
|
24
|
+
* Centralizing git here gives one stdio policy (stdin ignored so a child can
|
|
25
|
+
* never block waiting for input; stderr piped so a *failure's* output is
|
|
26
|
+
* captured rather than lost to an inherited stream) and one place to hang
|
|
27
|
+
* pre/post checks on. Because `execFileSync` only surfaces stderr via the
|
|
28
|
+
* thrown error, capture applies to the failure path: on failure the captured
|
|
29
|
+
* stderr is re-emitted by default so users still see git's own message, and is
|
|
30
|
+
* also returned (on `allowFailure`) or attached to the thrown error
|
|
31
|
+
* (`error.stderr`) for classification. A *successful* piped op's stderr is not
|
|
32
|
+
* captured (it is discarded). The one exception to piping is an un-classified,
|
|
33
|
+
* non-probe {@link RunGitOptions.network} op, whose stderr is inherited so live
|
|
34
|
+
* progress and credential prompts stream straight through on success too.
|
|
35
|
+
*
|
|
36
|
+
* On failure with `allowFailure: false` (the default), the *original* error is
|
|
37
|
+
* re-thrown so existing message-based handling keeps working — the caught error
|
|
38
|
+
* now additionally carries a populated `stderr` because we pipe it.
|
|
39
|
+
*/
|
|
40
|
+
export function runGit(args, options = {}) {
|
|
41
|
+
const { cwd, allowFailure = false, captureStdout = false, emitStderr = true, classify, network = false, } = options;
|
|
42
|
+
// A network op that is neither classified nor a silent probe streams git's
|
|
43
|
+
// stderr live (progress + interactive credential prompts) instead of
|
|
44
|
+
// buffering it; every other case pipes stderr so it can be captured for
|
|
45
|
+
// classification or returned to the caller.
|
|
46
|
+
const inheritStderr = network && !classify && !allowFailure;
|
|
47
|
+
try {
|
|
48
|
+
const stdout = execFileSync('git', args, {
|
|
49
|
+
cwd,
|
|
50
|
+
stdio: ['ignore', captureStdout ? 'pipe' : 'ignore', inheritStderr ? 'inherit' : 'pipe'],
|
|
51
|
+
maxBuffer: GIT_MAX_BUFFER_BYTES,
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
success: true,
|
|
55
|
+
status: 0,
|
|
56
|
+
stdout: captureStdout ? toStr(stdout) : '',
|
|
57
|
+
stderr: '',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const e = err;
|
|
62
|
+
const stderr = toStr(e.stderr);
|
|
63
|
+
// Classification runs on the throwing path only, and BEFORE we re-emit
|
|
64
|
+
// stderr: a recognized failure is re-thrown as a typed AppError whose
|
|
65
|
+
// message already embeds git's output, so emitting stderr here too would
|
|
66
|
+
// double-print it (the top-level catch prints the thrown message).
|
|
67
|
+
if (classify && !allowFailure) {
|
|
68
|
+
const text = stderr || toStr(e.stdout) || (err instanceof Error ? err.message : String(err));
|
|
69
|
+
const classified = classifyLocalGitError(text, classify);
|
|
70
|
+
if (classified) {
|
|
71
|
+
throw classified;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (emitStderr && stderr) {
|
|
75
|
+
process.stderr.write(stderr);
|
|
76
|
+
}
|
|
77
|
+
if (!allowFailure) {
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
status: typeof e.status === 'number' ? e.status : null,
|
|
83
|
+
stdout: toStr(e.stdout),
|
|
84
|
+
stderr,
|
|
85
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=GitRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitRunner.js","sourceRoot":"","sources":["../../src/Utils/GitRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/Utils/GitUtils.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ export interface GitDefaults {
|
|
|
6
6
|
commitSha: string;
|
|
7
7
|
detached: boolean;
|
|
8
8
|
}
|
|
9
|
+
export interface InitializeLocalGitRepoResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
9
13
|
/**
|
|
10
14
|
* Reads the current branch and commit SHA from the working directory's git repo.
|
|
11
15
|
* Returns null when git is unavailable or the directory is not a git repo.
|
|
@@ -18,6 +22,14 @@ export declare function resolveGitDefaults(): GitDefaults | null;
|
|
|
18
22
|
* Returns null when git is unavailable or the directory is not a git repo
|
|
19
23
|
*/
|
|
20
24
|
export declare function getCurrentGitRemoteUrl(): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Initializes a local git repository in the current working directory and
|
|
27
|
+
* optionally configures the origin remote in the supplied working directory.
|
|
28
|
+
* Returns true when `git init` succeeds, false when git is unavailable or the
|
|
29
|
+
* command fails for any reason (e.g. permissions). Callers should treat false as
|
|
30
|
+
* a soft failure — the app was already created; git can be initialized manually.
|
|
31
|
+
*/
|
|
32
|
+
export declare function initializeLocalGitRepo(remoteUrl?: string, cwd?: string): InitializeLocalGitRepoResult;
|
|
21
33
|
/**
|
|
22
34
|
* Returns true when the working tree has uncommitted changes (staged, unstaged, or untracked).
|
|
23
35
|
* Returns null when git is unavailable or the directory is not a git repo, so callers can skip
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitUtils.d.ts","sourceRoot":"","sources":["../../src/Utils/GitUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"GitUtils.d.ts","sourceRoot":"","sources":["../../src/Utils/GitUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,IAAI,CAkBvD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAQ3D;AA0BD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,CAAC,EAAE,MAAM,EAClB,GAAG,SAAgB,GAClB,4BAA4B,CA0B9B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,GAAG,IAAI,CAQtD"}
|
package/dist/Utils/GitUtils.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { execFileSync } from 'child_process';
|
|
5
|
+
import { runGit } from './GitRunner.js';
|
|
5
6
|
/**
|
|
6
7
|
* Reads the current branch and commit SHA from the working directory's git repo.
|
|
7
8
|
* Returns null when git is unavailable or the directory is not a git repo.
|
|
@@ -9,28 +10,89 @@ import { execSync } from 'child_process';
|
|
|
9
10
|
* literal string 'HEAD' and callers should not treat it as a branch name.
|
|
10
11
|
*/
|
|
11
12
|
export function resolveGitDefaults() {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
13
|
+
const sha = runGit(['rev-parse', 'HEAD'], {
|
|
14
|
+
captureStdout: true,
|
|
15
|
+
allowFailure: true,
|
|
16
|
+
emitStderr: false,
|
|
17
|
+
});
|
|
18
|
+
if (!sha.success)
|
|
18
19
|
return null;
|
|
19
|
-
|
|
20
|
+
const ref = runGit(['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
21
|
+
captureStdout: true,
|
|
22
|
+
allowFailure: true,
|
|
23
|
+
emitStderr: false,
|
|
24
|
+
});
|
|
25
|
+
if (!ref.success)
|
|
26
|
+
return null;
|
|
27
|
+
const commitSha = sha.stdout.trim();
|
|
28
|
+
const branch = ref.stdout.trim();
|
|
29
|
+
return { branch, commitSha, detached: branch === 'HEAD' };
|
|
20
30
|
}
|
|
21
31
|
/**
|
|
22
32
|
* Reads the current git remote origin URL from the working directory's git repo.
|
|
23
33
|
* Returns null when git is unavailable or the directory is not a git repo
|
|
24
34
|
*/
|
|
25
35
|
export function getCurrentGitRemoteUrl() {
|
|
36
|
+
const result = runGit(['config', '--get', 'remote.origin.url'], {
|
|
37
|
+
captureStdout: true,
|
|
38
|
+
allowFailure: true,
|
|
39
|
+
emitStderr: false,
|
|
40
|
+
});
|
|
41
|
+
if (!result.success)
|
|
42
|
+
return undefined;
|
|
43
|
+
return result.stdout.trim() || undefined;
|
|
44
|
+
}
|
|
45
|
+
// Only allow transport schemes the platform actually returns: HTTPS clone URLs
|
|
46
|
+
// (native Azure DevOps and GitHub HTTPS) and SSH clone URLs. This blocks git's
|
|
47
|
+
// `ext::`, `fd::`, and similar protocols that can spawn external commands as
|
|
48
|
+
// transport helpers without the shell ever being involved.
|
|
49
|
+
const allowedGitRemoteSchemes = ['https://', 'ssh://', 'git@'];
|
|
50
|
+
function isSafeGitRemoteUrl(remoteUrl) {
|
|
51
|
+
return (allowedGitRemoteSchemes.some((scheme) => remoteUrl.startsWith(scheme)) &&
|
|
52
|
+
remoteUrl.trim() === remoteUrl &&
|
|
53
|
+
!remoteUrl.startsWith('-') &&
|
|
54
|
+
!/[\r\n\0]/.test(remoteUrl));
|
|
55
|
+
}
|
|
56
|
+
// A failing `execFileSync` sets `error.message` to
|
|
57
|
+
// "Command failed: git remote add origin <url>", embedding the remote URL
|
|
58
|
+
// verbatim. If that URL ever carries credentials (e.g. https://<PAT>@host/...),
|
|
59
|
+
// returning the raw message would leak the secret into telemetry. Redact any
|
|
60
|
+
// userinfo segment before surfacing the error to callers.
|
|
61
|
+
function scrubGitErrorMessage(message) {
|
|
62
|
+
return message.replace(/:\/\/[^@\s/]+@/g, '://[REDACTED]@');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Initializes a local git repository in the current working directory and
|
|
66
|
+
* optionally configures the origin remote in the supplied working directory.
|
|
67
|
+
* Returns true when `git init` succeeds, false when git is unavailable or the
|
|
68
|
+
* command fails for any reason (e.g. permissions). Callers should treat false as
|
|
69
|
+
* a soft failure — the app was already created; git can be initialized manually.
|
|
70
|
+
*/
|
|
71
|
+
export function initializeLocalGitRepo(remoteUrl, cwd = process.cwd()) {
|
|
26
72
|
try {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
73
|
+
if (remoteUrl !== undefined && !isSafeGitRemoteUrl(remoteUrl)) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
error: 'Unsafe git remote URL.',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
execFileSync('git', ['init'], { stdio: 'pipe', windowsHide: true, cwd });
|
|
80
|
+
if (remoteUrl) {
|
|
81
|
+
execFileSync('git', ['remote', 'add', 'origin', remoteUrl], {
|
|
82
|
+
stdio: 'pipe',
|
|
83
|
+
windowsHide: true,
|
|
84
|
+
cwd,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
success: true,
|
|
89
|
+
};
|
|
31
90
|
}
|
|
32
|
-
catch {
|
|
33
|
-
return
|
|
91
|
+
catch (error) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: scrubGitErrorMessage(error instanceof Error ? error.message : String(error)),
|
|
95
|
+
};
|
|
34
96
|
}
|
|
35
97
|
}
|
|
36
98
|
/**
|
|
@@ -39,12 +101,13 @@ export function getCurrentGitRemoteUrl() {
|
|
|
39
101
|
* the check rather than treat it as a clean tree.
|
|
40
102
|
*/
|
|
41
103
|
export function hasUncommittedChanges() {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
104
|
+
const result = runGit(['status', '--porcelain'], {
|
|
105
|
+
captureStdout: true,
|
|
106
|
+
allowFailure: true,
|
|
107
|
+
emitStderr: false,
|
|
108
|
+
});
|
|
109
|
+
if (!result.success)
|
|
47
110
|
return null;
|
|
48
|
-
|
|
111
|
+
return result.stdout.trim().length > 0;
|
|
49
112
|
}
|
|
50
113
|
//# sourceMappingURL=GitUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitUtils.js","sourceRoot":"","sources":["../../src/Utils/GitUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"GitUtils.js","sourceRoot":"","sources":["../../src/Utils/GitUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitVersionChecker.d.ts","sourceRoot":"","sources":["../../src/Utils/GitVersionChecker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"GitVersionChecker.d.ts","sourceRoot":"","sources":["../../src/Utils/GitVersionChecker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAuBzC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import { execFileSync } from 'child_process';
|
|
5
4
|
import semver from 'semver';
|
|
6
5
|
import packageJson from '../../package.json' with { type: 'json' };
|
|
7
6
|
import { ConfigurationError } from '../Errors/CliError.js';
|
|
7
|
+
import { runGit } from './GitRunner.js';
|
|
8
8
|
/**
|
|
9
9
|
* Preflight guard for `ms app create`: throws `ConfigurationError` when `git` is
|
|
10
10
|
* missing from PATH, or present but older than this package's `engines.git`
|
|
@@ -39,15 +39,18 @@ import { ConfigurationError } from '../Errors/CliError.js';
|
|
|
39
39
|
* format we couldn't predict.
|
|
40
40
|
*/
|
|
41
41
|
export function ensureGitInstalled() {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
// `runGit` with allowFailure turns a missing-git spawn failure into a
|
|
43
|
+
// structured result instead of a throw; emitStderr is off because we own the
|
|
44
|
+
// user-facing message here (the raw "command not found" stderr would be noise).
|
|
45
|
+
const result = runGit(['--version'], {
|
|
46
|
+
captureStdout: true,
|
|
47
|
+
allowFailure: true,
|
|
48
|
+
emitStderr: false,
|
|
49
|
+
});
|
|
50
|
+
if (!result.success) {
|
|
49
51
|
throw new ConfigurationError("'git' is required but was not found on PATH.");
|
|
50
52
|
}
|
|
53
|
+
const versionOutput = result.stdout;
|
|
51
54
|
const required = packageJson.engines.git;
|
|
52
55
|
if (!semver.validRange(required))
|
|
53
56
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitVersionChecker.js","sourceRoot":"","sources":["../../src/Utils/GitVersionChecker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"GitVersionChecker.js","sourceRoot":"","sources":["../../src/Utils/GitVersionChecker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,kBAAkB;IAChC,sEAAsE;IACtE,6EAA6E;IAC7E,gFAAgF;IAChF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC,EAAE;QACnC,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,kBAAkB,CAAC,8CAA8C,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IAEpC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,OAAO;IAE9C,MAAM,IAAI,kBAAkB,CAC1B,OAAO,QAAQ,uBAAuB,KAAK,CAAC,OAAO,wBAAwB,CAC5E,CAAC;AACJ,CAAC"}
|
package/dist/Utils/Paging.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Paging.d.ts","sourceRoot":"","sources":["../../src/Utils/Paging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CA2BnE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BhE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Paging.d.ts","sourceRoot":"","sources":["../../src/Utils/Paging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CA2BnE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BhE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChB"}
|
package/dist/Utils/Paging.js
CHANGED
|
@@ -69,11 +69,14 @@ export async function printPagedText(text) {
|
|
|
69
69
|
* or a single full table in non-TTY/piped mode.
|
|
70
70
|
*/
|
|
71
71
|
export async function printPagedTable(options) {
|
|
72
|
-
const { title, metadata, columns, rows, emptyMessage, totalLabel } = options;
|
|
72
|
+
const { title, metadata, columns, rows, emptyMessage, totalLabel, hint } = options;
|
|
73
73
|
const total = rows.length;
|
|
74
74
|
if (!process.stdout.isTTY) {
|
|
75
75
|
printTable({ title, metadata, columns, rows, emptyMessage });
|
|
76
76
|
console.log(styleText('dim', ` Showing ${total} of ${total} ${totalLabel}`));
|
|
77
|
+
if (hint) {
|
|
78
|
+
console.log(styleText('dim', ` ${hint}`));
|
|
79
|
+
}
|
|
77
80
|
return;
|
|
78
81
|
}
|
|
79
82
|
const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
|
|
@@ -83,6 +86,9 @@ export async function printPagedTable(options) {
|
|
|
83
86
|
const isLastPage = page === totalPages - 1;
|
|
84
87
|
printTable({ title, metadata, columns, rows: pageRows, emptyMessage });
|
|
85
88
|
console.log(styleText('dim', ` Showing ${start + pageRows.length} of ${total} ${totalLabel}`));
|
|
89
|
+
if (hint) {
|
|
90
|
+
console.log(styleText('dim', ` ${hint}`));
|
|
91
|
+
}
|
|
86
92
|
if (!isLastPage) {
|
|
87
93
|
console.log(styleText('dim', ' Press Enter for more, Esc or q to exit'));
|
|
88
94
|
}
|
package/dist/Utils/Paging.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Paging.js","sourceRoot":"","sources":["../../src/Utils/Paging.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Paging.js","sourceRoot":"","sources":["../../src/Utils/Paging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { MaafAppDefinition, ManagedAppRepoType } from '@microsoft/managed-apps-actions';
|
|
5
|
+
/** Display-ready repository classification + clone URL derived from a `MaafAppDefinition`. */
|
|
6
|
+
export type RepoDetails = {
|
|
7
|
+
/**
|
|
8
|
+
* Repository-type label for display. Known {@link ManagedAppRepoType} values
|
|
9
|
+
* are mapped to friendly labels; unknown/forward-compat values pass through
|
|
10
|
+
* as the raw server string (see {@link friendlyRepoType}).
|
|
11
|
+
*/
|
|
12
|
+
repoType?: string;
|
|
13
|
+
/** Git clone URL for the backing repository, when applicable. */
|
|
14
|
+
cloneUrl?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Maps the raw {@link ManagedAppRepoType} enum returned by the server to a
|
|
18
|
+
* human-friendly label for display. Unknown/forward-compat values fall through
|
|
19
|
+
* to the raw string; `undefined` (legacy apps with no source-control metadata)
|
|
20
|
+
* yields `undefined` so callers can omit the line entirely.
|
|
21
|
+
*/
|
|
22
|
+
export declare function friendlyRepoType(repoType: ManagedAppRepoType | undefined): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Derives the display-ready {@link RepoDetails} from an app definition. Returns
|
|
25
|
+
* `undefined` when the app exposes no source-control metadata at all (no
|
|
26
|
+
* `repoType` and no `cloneUrl`), so callers can omit the lines entirely.
|
|
27
|
+
*/
|
|
28
|
+
export declare function toRepoDetails(app: Pick<MaafAppDefinition, 'repoType' | 'cloneUrl'>): RepoDetails | undefined;
|
|
29
|
+
//# sourceMappingURL=RepoDetails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RepoDetails.d.ts","sourceRoot":"","sources":["../../src/Utils/RepoDetails.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE7F,8FAA8F;AAC9F,MAAM,MAAM,WAAW,GAAG;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAa7F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,UAAU,CAAC,GACpD,WAAW,GAAG,SAAS,CAOzB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Maps the raw {@link ManagedAppRepoType} enum returned by the server to a
|
|
6
|
+
* human-friendly label for display. Unknown/forward-compat values fall through
|
|
7
|
+
* to the raw string; `undefined` (legacy apps with no source-control metadata)
|
|
8
|
+
* yields `undefined` so callers can omit the line entirely.
|
|
9
|
+
*/
|
|
10
|
+
export function friendlyRepoType(repoType) {
|
|
11
|
+
switch (repoType) {
|
|
12
|
+
case undefined:
|
|
13
|
+
return undefined;
|
|
14
|
+
case 'Native':
|
|
15
|
+
return 'Platform-managed Git repository';
|
|
16
|
+
case 'ExternallyProvidedBuild':
|
|
17
|
+
return 'Externally provided build (no source)';
|
|
18
|
+
case 'ExternalGitProviderBound':
|
|
19
|
+
return 'External Git provider';
|
|
20
|
+
default:
|
|
21
|
+
return repoType;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Derives the display-ready {@link RepoDetails} from an app definition. Returns
|
|
26
|
+
* `undefined` when the app exposes no source-control metadata at all (no
|
|
27
|
+
* `repoType` and no `cloneUrl`), so callers can omit the lines entirely.
|
|
28
|
+
*/
|
|
29
|
+
export function toRepoDetails(app) {
|
|
30
|
+
const repoType = friendlyRepoType(app.repoType);
|
|
31
|
+
const cloneUrl = app.cloneUrl ?? undefined;
|
|
32
|
+
if (!repoType && !cloneUrl) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
return { repoType, cloneUrl };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=RepoDetails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RepoDetails.js","sourceRoot":"","sources":["../../src/Utils/RepoDetails.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAwC;IACvE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,iCAAiC,CAAC;QAC3C,KAAK,yBAAyB;YAC5B,OAAO,uCAAuC,CAAC;QACjD,KAAK,0BAA0B;YAC7B,OAAO,uBAAuB,CAAC;QACjC;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAqD;IAErD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC;IAC3C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResolveCommand.d.ts","sourceRoot":"","sources":["../../src/Utils/ResolveCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,WAAW,EAEX,OAAO,EACP,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAGhC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,CAWjG;
|
|
1
|
+
{"version":3,"file":"ResolveCommand.d.ts","sourceRoot":"","sources":["../../src/Utils/ResolveCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,WAAW,EAEX,OAAO,EACP,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAGhC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,CAWjG;AA0DD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,iGAAiG;IACjG,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,uGAAuG;IACvG,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,WAAW,GAChB,mBAAmB,GAAG,IAAI,CA8B5B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,KAAK,IAAI,OAAO,CAE9E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAK1F"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import { hasParentHandler, isTypedVerbDef } from '../Types/Command.types.js';
|
|
4
|
+
import { getCommandEntry, hasParentHandler, isTypedVerbDef } from '../Types/Command.types.js';
|
|
5
5
|
/**
|
|
6
6
|
* Resolves command-line tokens against the command tree.
|
|
7
7
|
*
|
|
@@ -57,7 +57,7 @@ function walkCommands(commands, tokens, index, path) {
|
|
|
57
57
|
const token = tokens[index];
|
|
58
58
|
if (token.startsWith('-'))
|
|
59
59
|
return null;
|
|
60
|
-
const entry = commands
|
|
60
|
+
const entry = getCommandEntry(commands, token);
|
|
61
61
|
if (!entry)
|
|
62
62
|
return null;
|
|
63
63
|
const nextPath = [...path, token];
|
|
@@ -65,7 +65,9 @@ function walkCommands(commands, tokens, index, path) {
|
|
|
65
65
|
return { path: nextPath, handler: entry.handler, tokensConsumed: index + 1 };
|
|
66
66
|
}
|
|
67
67
|
const next = tokens[index + 1];
|
|
68
|
-
const nextIsKnownSub = next !== undefined &&
|
|
68
|
+
const nextIsKnownSub = next !== undefined &&
|
|
69
|
+
!next.startsWith('-') &&
|
|
70
|
+
getCommandEntry(entry.commands, next) !== undefined;
|
|
69
71
|
if (nextIsKnownSub) {
|
|
70
72
|
return walkCommands(entry.commands, tokens, index + 1, nextPath);
|
|
71
73
|
}
|
|
@@ -104,7 +106,7 @@ export function findIncompleteTypedPath(argv, tree) {
|
|
|
104
106
|
const pathTokens = [noun];
|
|
105
107
|
let inTypedGroup = false;
|
|
106
108
|
for (const token of rest) {
|
|
107
|
-
const entry = commands
|
|
109
|
+
const entry = getCommandEntry(commands, token);
|
|
108
110
|
if (!entry) {
|
|
109
111
|
return inTypedGroup ? { pathTokens, unknownToken: token } : null;
|
|
110
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResolveCommand.js","sourceRoot":"","sources":["../../src/Utils/ResolveCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ResolveCommand.js","sourceRoot":"","sources":["../../src/Utils/ResolveCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { ArgumentProvider } from '../ArgumentProvider.js';
|
|
5
5
|
/**
|
|
6
|
-
* `ms app add
|
|
6
|
+
* `ms app add data-source` — a single entry point that adds a connector to
|
|
7
7
|
* the app and picks the right shape (table or action) based on the
|
|
8
8
|
* connector's capabilities.
|
|
9
9
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddConnector.d.ts","sourceRoot":"","sources":["../../src/Verbs/AddConnector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAkB5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"AddConnector.d.ts","sourceRoot":"","sources":["../../src/Verbs/AddConnector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAkB5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FzF"}
|
|
@@ -5,13 +5,13 @@ import { getSettings } from '../CliSettings.js';
|
|
|
5
5
|
import { createDefaultStringOption, promptConfirm } from '../CliUtils.js';
|
|
6
6
|
import { HelpStrings } from '../Constants/HelpStrings.js';
|
|
7
7
|
import { UsageError } from '../Errors/CliError.js';
|
|
8
|
+
import { isCdsConnectorId } from '../Utils/ConnectorIds.js';
|
|
8
9
|
import { isTabularConnector, runAddActionFlowAsync, runAddTableFlowAsync, } from './AddConnectorFlows.js';
|
|
9
10
|
import { runConnectorDlpPreflightAsync } from './ConnectorHelpers.js';
|
|
10
11
|
import { AddConnectorArguments, SharedArguments } from './VerbConstants.js';
|
|
11
|
-
const COMMON_DATA_SERVICE_FOR_APPS_API_ID = 'shared_commondataserviceforapps';
|
|
12
12
|
const DATAVERSE_PAIR_ERROR = '--dataverse-environment-id and --table must be specified together for the Common Data Service for Apps connector. Provide both or neither.';
|
|
13
13
|
/**
|
|
14
|
-
* `ms app add
|
|
14
|
+
* `ms app add data-source` — a single entry point that adds a connector to
|
|
15
15
|
* the app and picks the right shape (table or action) based on the
|
|
16
16
|
* connector's capabilities.
|
|
17
17
|
*
|
|
@@ -60,8 +60,7 @@ export async function addConnectorAsync(argumentProvider) {
|
|
|
60
60
|
asFlag,
|
|
61
61
|
connectorLabel,
|
|
62
62
|
});
|
|
63
|
-
const isCommonDataServiceForApps = apiId
|
|
64
|
-
apiId.toLowerCase().endsWith(`/${COMMON_DATA_SERVICE_FOR_APPS_API_ID}`);
|
|
63
|
+
const isCommonDataServiceForApps = isCdsConnectorId(apiId);
|
|
65
64
|
// ── CDS connector special case: reinterpret --table as Dataverse logical name ─
|
|
66
65
|
// For the Common Data Service for Apps connector, `--table` (existing flag) carries
|
|
67
66
|
// the Dataverse entity logical name and pairs with `--dataverse-environment-id`. The
|
|
@@ -79,7 +78,7 @@ export async function addConnectorAsync(argumentProvider) {
|
|
|
79
78
|
}
|
|
80
79
|
}
|
|
81
80
|
else if (!isCommonDataServiceForApps && dataverseEnvironmentIdFlag) {
|
|
82
|
-
throw new UsageError('--dataverse-environment-id can only be used with --connector shared_commondataserviceforapps.');
|
|
81
|
+
throw new UsageError('--dataverse-environment-id can only be used with the Common Data Service for Apps connector (--connector shared_commondataserviceforapps or --connector commondataserviceforapps).');
|
|
83
82
|
}
|
|
84
83
|
// ── Reject contradictory flags when adding actions (CDS already handled above) ─
|
|
85
84
|
if (mode === 'action' && !isCommonDataServiceForApps && (datasetFlag || tableFlag)) {
|
|
@@ -135,8 +134,15 @@ async function resolveModeAsync(input) {
|
|
|
135
134
|
return addAsTable ? 'table' : 'action';
|
|
136
135
|
}
|
|
137
136
|
function createOptionSchema(argumentProvider) {
|
|
138
|
-
argumentProvider.
|
|
139
|
-
|
|
137
|
+
const invokedAsConnector = argumentProvider.getResolvedCommand()?.path.at(-1) === 'connector';
|
|
138
|
+
if (invokedAsConnector) {
|
|
139
|
+
argumentProvider.setDescription(`${HelpStrings.app.add.connector.deprecation}\n\n${HelpStrings.app.add.connector.description}`);
|
|
140
|
+
argumentProvider.addExamples(HelpStrings.app.add.connector.deprecatedExamples);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
argumentProvider.setDescription(HelpStrings.app.add.connector.description);
|
|
144
|
+
argumentProvider.addExamples(HelpStrings.app.add.connector.examples);
|
|
145
|
+
}
|
|
140
146
|
argumentProvider.addOptions([
|
|
141
147
|
createDefaultStringOption({
|
|
142
148
|
flags: { key: SharedArguments.Connector.name },
|