@local-labs-jpollock/local-cli 0.0.1
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/addon-dist/bin/mcp-stdio.js +2808 -0
- package/addon-dist/lib/common/constants.d.ts +22 -0
- package/addon-dist/lib/common/constants.js +26 -0
- package/addon-dist/lib/common/theme.d.ts +68 -0
- package/addon-dist/lib/common/theme.js +126 -0
- package/addon-dist/lib/common/types.d.ts +298 -0
- package/addon-dist/lib/common/types.js +6 -0
- package/addon-dist/lib/main/config/ConnectionInfo.d.ts +25 -0
- package/addon-dist/lib/main/config/ConnectionInfo.js +82 -0
- package/addon-dist/lib/main/index.d.ts +12 -0
- package/addon-dist/lib/main/index.js +3322 -0
- package/addon-dist/lib/main/mcp/McpAuth.d.ts +37 -0
- package/addon-dist/lib/main/mcp/McpAuth.js +87 -0
- package/addon-dist/lib/main/mcp/McpServer.d.ts +67 -0
- package/addon-dist/lib/main/mcp/McpServer.js +343 -0
- package/addon-dist/lib/main/mcp/tools/changePhpVersion.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/changePhpVersion.js +81 -0
- package/addon-dist/lib/main/mcp/tools/cloneSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/cloneSite.js +66 -0
- package/addon-dist/lib/main/mcp/tools/createSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/createSite.js +137 -0
- package/addon-dist/lib/main/mcp/tools/deleteSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/deleteSite.js +72 -0
- package/addon-dist/lib/main/mcp/tools/exportDatabase.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/exportDatabase.js +72 -0
- package/addon-dist/lib/main/mcp/tools/exportSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/exportSite.js +103 -0
- package/addon-dist/lib/main/mcp/tools/getLocalInfo.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getLocalInfo.js +72 -0
- package/addon-dist/lib/main/mcp/tools/getSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getSite.js +68 -0
- package/addon-dist/lib/main/mcp/tools/getSiteLogs.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getSiteLogs.js +149 -0
- package/addon-dist/lib/main/mcp/tools/helpers.d.ts +59 -0
- package/addon-dist/lib/main/mcp/tools/helpers.js +179 -0
- package/addon-dist/lib/main/mcp/tools/importDatabase.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/importDatabase.js +109 -0
- package/addon-dist/lib/main/mcp/tools/importSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/importSite.js +149 -0
- package/addon-dist/lib/main/mcp/tools/index.d.ts +26 -0
- package/addon-dist/lib/main/mcp/tools/index.js +117 -0
- package/addon-dist/lib/main/mcp/tools/listBlueprints.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listBlueprints.js +54 -0
- package/addon-dist/lib/main/mcp/tools/listServices.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listServices.js +112 -0
- package/addon-dist/lib/main/mcp/tools/listSites.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listSites.js +62 -0
- package/addon-dist/lib/main/mcp/tools/openAdminer.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/openAdminer.js +59 -0
- package/addon-dist/lib/main/mcp/tools/openSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/openSite.js +62 -0
- package/addon-dist/lib/main/mcp/tools/renameSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/renameSite.js +70 -0
- package/addon-dist/lib/main/mcp/tools/restartSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/restartSite.js +56 -0
- package/addon-dist/lib/main/mcp/tools/saveBlueprint.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/saveBlueprint.js +89 -0
- package/addon-dist/lib/main/mcp/tools/startSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/startSite.js +54 -0
- package/addon-dist/lib/main/mcp/tools/stopSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/stopSite.js +54 -0
- package/addon-dist/lib/main/mcp/tools/toggleXdebug.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/toggleXdebug.js +69 -0
- package/addon-dist/lib/main/mcp/tools/trustSsl.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/trustSsl.js +59 -0
- package/addon-dist/lib/main/mcp/tools/wpCli.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/wpCli.js +110 -0
- package/addon-dist/lib/main.d.ts +1 -0
- package/addon-dist/lib/main.js +10 -0
- package/addon-dist/lib/renderer/index.d.ts +7 -0
- package/addon-dist/lib/renderer/index.js +479 -0
- package/addon-dist/package.json +73 -0
- package/bin/lwp.js +10 -0
- package/lib/bootstrap/index.d.ts +98 -0
- package/lib/bootstrap/index.js +493 -0
- package/lib/bootstrap/paths.d.ts +28 -0
- package/lib/bootstrap/paths.js +96 -0
- package/lib/client/GraphQLClient.d.ts +38 -0
- package/lib/client/GraphQLClient.js +71 -0
- package/lib/client/index.d.ts +4 -0
- package/lib/client/index.js +10 -0
- package/lib/formatters/index.d.ts +75 -0
- package/lib/formatters/index.js +139 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +1173 -0
- package/package.json +72 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-specific paths for Local
|
|
3
|
+
*
|
|
4
|
+
* The CLI talks directly to Local's GraphQL server - no addon required for basic operations.
|
|
5
|
+
* The addon extends GraphQL with additional operations (backups, WPE sync, etc.)
|
|
6
|
+
*/
|
|
7
|
+
export interface LocalPaths {
|
|
8
|
+
/** Local application data directory */
|
|
9
|
+
dataDir: string;
|
|
10
|
+
/** Addons installation directory */
|
|
11
|
+
addonsDir: string;
|
|
12
|
+
/** enabled-addons.json file path */
|
|
13
|
+
enabledAddonsFile: string;
|
|
14
|
+
/** GraphQL connection info file path (Local's native GraphQL server) */
|
|
15
|
+
graphqlConnectionInfoFile: string;
|
|
16
|
+
/** Local application executable path */
|
|
17
|
+
appExecutable: string;
|
|
18
|
+
/** Local application name (for process detection) */
|
|
19
|
+
appName: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get platform-specific paths for Local
|
|
23
|
+
*/
|
|
24
|
+
export declare function getLocalPaths(): LocalPaths;
|
|
25
|
+
/**
|
|
26
|
+
* Get the addon package name
|
|
27
|
+
*/
|
|
28
|
+
export declare const ADDON_PACKAGE_NAME = "@local-labs-jpollock/local-addon-cli";
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Platform-specific paths for Local
|
|
4
|
+
*
|
|
5
|
+
* The CLI talks directly to Local's GraphQL server - no addon required for basic operations.
|
|
6
|
+
* The addon extends GraphQL with additional operations (backups, WPE sync, etc.)
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.ADDON_PACKAGE_NAME = void 0;
|
|
43
|
+
exports.getLocalPaths = getLocalPaths;
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
/**
|
|
47
|
+
* Get platform-specific paths for Local
|
|
48
|
+
*/
|
|
49
|
+
function getLocalPaths() {
|
|
50
|
+
const platform = process.platform;
|
|
51
|
+
const home = os.homedir();
|
|
52
|
+
switch (platform) {
|
|
53
|
+
case 'darwin': {
|
|
54
|
+
const dataDir = path.join(home, 'Library', 'Application Support', 'Local');
|
|
55
|
+
return {
|
|
56
|
+
dataDir,
|
|
57
|
+
addonsDir: path.join(dataDir, 'addons'),
|
|
58
|
+
enabledAddonsFile: path.join(dataDir, 'enabled-addons.json'),
|
|
59
|
+
graphqlConnectionInfoFile: path.join(dataDir, 'graphql-connection-info.json'),
|
|
60
|
+
appExecutable: '/Applications/Local.app',
|
|
61
|
+
appName: 'Local',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
case 'win32': {
|
|
65
|
+
const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');
|
|
66
|
+
const dataDir = path.join(appData, 'Local');
|
|
67
|
+
const programFiles = process.env['ProgramFiles'] || 'C:\\Program Files';
|
|
68
|
+
return {
|
|
69
|
+
dataDir,
|
|
70
|
+
addonsDir: path.join(dataDir, 'addons'),
|
|
71
|
+
enabledAddonsFile: path.join(dataDir, 'enabled-addons.json'),
|
|
72
|
+
graphqlConnectionInfoFile: path.join(dataDir, 'graphql-connection-info.json'),
|
|
73
|
+
appExecutable: path.join(programFiles, 'Local', 'Local.exe'),
|
|
74
|
+
appName: 'Local.exe',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
case 'linux': {
|
|
78
|
+
const dataDir = path.join(home, '.config', 'Local');
|
|
79
|
+
return {
|
|
80
|
+
dataDir,
|
|
81
|
+
addonsDir: path.join(dataDir, 'addons'),
|
|
82
|
+
enabledAddonsFile: path.join(dataDir, 'enabled-addons.json'),
|
|
83
|
+
graphqlConnectionInfoFile: path.join(dataDir, 'graphql-connection-info.json'),
|
|
84
|
+
appExecutable: '/opt/Local/local',
|
|
85
|
+
appName: 'local',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
default:
|
|
89
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the addon package name
|
|
94
|
+
*/
|
|
95
|
+
exports.ADDON_PACKAGE_NAME = '@local-labs-jpollock/local-addon-cli';
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYm9vdHN0cmFwL3BhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJILHNDQThDQztBQW5FRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBaUI3Qjs7R0FFRztBQUNILFNBQWdCLGFBQWE7SUFDM0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNsQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFMUIsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0UsT0FBTztnQkFDTCxPQUFPO2dCQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7Z0JBQ3ZDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDO2dCQUM1RCx5QkFBeUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSw4QkFBOEIsQ0FBQztnQkFDN0UsYUFBYSxFQUFFLHlCQUF5QjtnQkFDeEMsT0FBTyxFQUFFLE9BQU87YUFDakIsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDYixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDN0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxtQkFBbUIsQ0FBQztZQUN4RSxPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztnQkFDdkMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUM7Z0JBQzVELHlCQUF5QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLDhCQUE4QixDQUFDO2dCQUM3RSxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsT0FBTyxFQUFFLFdBQVc7YUFDckIsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDcEQsT0FBTztnQkFDTCxPQUFPO2dCQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7Z0JBQ3ZDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDO2dCQUM1RCx5QkFBeUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSw4QkFBOEIsQ0FBQztnQkFDN0UsYUFBYSxFQUFFLGtCQUFrQjtnQkFDakMsT0FBTyxFQUFFLE9BQU87YUFDakIsQ0FBQztRQUNKLENBQUM7UUFFRDtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNVLFFBQUEsa0JBQWtCLEdBQUcsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBsYXRmb3JtLXNwZWNpZmljIHBhdGhzIGZvciBMb2NhbFxuICpcbiAqIFRoZSBDTEkgdGFsa3MgZGlyZWN0bHkgdG8gTG9jYWwncyBHcmFwaFFMIHNlcnZlciAtIG5vIGFkZG9uIHJlcXVpcmVkIGZvciBiYXNpYyBvcGVyYXRpb25zLlxuICogVGhlIGFkZG9uIGV4dGVuZHMgR3JhcGhRTCB3aXRoIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyAoYmFja3VwcywgV1BFIHN5bmMsIGV0Yy4pXG4gKi9cblxuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbFBhdGhzIHtcbiAgLyoqIExvY2FsIGFwcGxpY2F0aW9uIGRhdGEgZGlyZWN0b3J5ICovXG4gIGRhdGFEaXI6IHN0cmluZztcbiAgLyoqIEFkZG9ucyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICovXG4gIGFkZG9uc0Rpcjogc3RyaW5nO1xuICAvKiogZW5hYmxlZC1hZGRvbnMuanNvbiBmaWxlIHBhdGggKi9cbiAgZW5hYmxlZEFkZG9uc0ZpbGU6IHN0cmluZztcbiAgLyoqIEdyYXBoUUwgY29ubmVjdGlvbiBpbmZvIGZpbGUgcGF0aCAoTG9jYWwncyBuYXRpdmUgR3JhcGhRTCBzZXJ2ZXIpICovXG4gIGdyYXBocWxDb25uZWN0aW9uSW5mb0ZpbGU6IHN0cmluZztcbiAgLyoqIExvY2FsIGFwcGxpY2F0aW9uIGV4ZWN1dGFibGUgcGF0aCAqL1xuICBhcHBFeGVjdXRhYmxlOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBhcHBsaWNhdGlvbiBuYW1lIChmb3IgcHJvY2VzcyBkZXRlY3Rpb24pICovXG4gIGFwcE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZXQgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aHMgZm9yIExvY2FsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFBhdGhzKCk6IExvY2FsUGF0aHMge1xuICBjb25zdCBwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm07XG4gIGNvbnN0IGhvbWUgPSBvcy5ob21lZGlyKCk7XG5cbiAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgIGNhc2UgJ2Rhcndpbic6IHtcbiAgICAgIGNvbnN0IGRhdGFEaXIgPSBwYXRoLmpvaW4oaG9tZSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdMb2NhbCcpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgYWRkb25zRGlyOiBwYXRoLmpvaW4oZGF0YURpciwgJ2FkZG9ucycpLFxuICAgICAgICBlbmFibGVkQWRkb25zRmlsZTogcGF0aC5qb2luKGRhdGFEaXIsICdlbmFibGVkLWFkZG9ucy5qc29uJyksXG4gICAgICAgIGdyYXBocWxDb25uZWN0aW9uSW5mb0ZpbGU6IHBhdGguam9pbihkYXRhRGlyLCAnZ3JhcGhxbC1jb25uZWN0aW9uLWluZm8uanNvbicpLFxuICAgICAgICBhcHBFeGVjdXRhYmxlOiAnL0FwcGxpY2F0aW9ucy9Mb2NhbC5hcHAnLFxuICAgICAgICBhcHBOYW1lOiAnTG9jYWwnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICd3aW4zMic6IHtcbiAgICAgIGNvbnN0IGFwcERhdGEgPSBwcm9jZXNzLmVudi5BUFBEQVRBIHx8IHBhdGguam9pbihob21lLCAnQXBwRGF0YScsICdSb2FtaW5nJyk7XG4gICAgICBjb25zdCBkYXRhRGlyID0gcGF0aC5qb2luKGFwcERhdGEsICdMb2NhbCcpO1xuICAgICAgY29uc3QgcHJvZ3JhbUZpbGVzID0gcHJvY2Vzcy5lbnZbJ1Byb2dyYW1GaWxlcyddIHx8ICdDOlxcXFxQcm9ncmFtIEZpbGVzJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGFkZG9uc0RpcjogcGF0aC5qb2luKGRhdGFEaXIsICdhZGRvbnMnKSxcbiAgICAgICAgZW5hYmxlZEFkZG9uc0ZpbGU6IHBhdGguam9pbihkYXRhRGlyLCAnZW5hYmxlZC1hZGRvbnMuanNvbicpLFxuICAgICAgICBncmFwaHFsQ29ubmVjdGlvbkluZm9GaWxlOiBwYXRoLmpvaW4oZGF0YURpciwgJ2dyYXBocWwtY29ubmVjdGlvbi1pbmZvLmpzb24nKSxcbiAgICAgICAgYXBwRXhlY3V0YWJsZTogcGF0aC5qb2luKHByb2dyYW1GaWxlcywgJ0xvY2FsJywgJ0xvY2FsLmV4ZScpLFxuICAgICAgICBhcHBOYW1lOiAnTG9jYWwuZXhlJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnbGludXgnOiB7XG4gICAgICBjb25zdCBkYXRhRGlyID0gcGF0aC5qb2luKGhvbWUsICcuY29uZmlnJywgJ0xvY2FsJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBhZGRvbnNEaXI6IHBhdGguam9pbihkYXRhRGlyLCAnYWRkb25zJyksXG4gICAgICAgIGVuYWJsZWRBZGRvbnNGaWxlOiBwYXRoLmpvaW4oZGF0YURpciwgJ2VuYWJsZWQtYWRkb25zLmpzb24nKSxcbiAgICAgICAgZ3JhcGhxbENvbm5lY3Rpb25JbmZvRmlsZTogcGF0aC5qb2luKGRhdGFEaXIsICdncmFwaHFsLWNvbm5lY3Rpb24taW5mby5qc29uJyksXG4gICAgICAgIGFwcEV4ZWN1dGFibGU6ICcvb3B0L0xvY2FsL2xvY2FsJyxcbiAgICAgICAgYXBwTmFtZTogJ2xvY2FsJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcGxhdGZvcm06ICR7cGxhdGZvcm19YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGFkZG9uIHBhY2thZ2UgbmFtZVxuICovXG5leHBvcnQgY29uc3QgQURET05fUEFDS0FHRV9OQU1FID0gJ0Bsb2NhbC1sYWJzLWpwb2xsb2NrL2xvY2FsLWFkZG9uLWNsaSc7XG4iXX0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Client
|
|
3
|
+
*
|
|
4
|
+
* Simple GraphQL client for communicating with Local's GraphQL server.
|
|
5
|
+
*/
|
|
6
|
+
import { ConnectionInfo } from '../bootstrap';
|
|
7
|
+
export interface GraphQLError {
|
|
8
|
+
message: string;
|
|
9
|
+
locations?: Array<{
|
|
10
|
+
line: number;
|
|
11
|
+
column: number;
|
|
12
|
+
}>;
|
|
13
|
+
path?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface GraphQLResponse<T = unknown> {
|
|
16
|
+
data?: T;
|
|
17
|
+
errors?: GraphQLError[];
|
|
18
|
+
}
|
|
19
|
+
export declare class GraphQLClientError extends Error {
|
|
20
|
+
errors?: GraphQLError[] | undefined;
|
|
21
|
+
constructor(message: string, errors?: GraphQLError[] | undefined);
|
|
22
|
+
}
|
|
23
|
+
export declare class GraphQLClient {
|
|
24
|
+
private url;
|
|
25
|
+
private authToken;
|
|
26
|
+
private timeout;
|
|
27
|
+
constructor(connectionInfo: ConnectionInfo, options?: {
|
|
28
|
+
timeout?: number;
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Execute a GraphQL query or mutation
|
|
32
|
+
*/
|
|
33
|
+
query<T = unknown>(query: string, variables?: Record<string, unknown>): Promise<T>;
|
|
34
|
+
/**
|
|
35
|
+
* Execute a mutation (alias for query, for clarity)
|
|
36
|
+
*/
|
|
37
|
+
mutate<T = unknown>(mutation: string, variables?: Record<string, unknown>): Promise<T>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GraphQL Client
|
|
4
|
+
*
|
|
5
|
+
* Simple GraphQL client for communicating with Local's GraphQL server.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.GraphQLClient = exports.GraphQLClientError = void 0;
|
|
9
|
+
class GraphQLClientError extends Error {
|
|
10
|
+
constructor(message, errors) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.errors = errors;
|
|
13
|
+
this.name = 'GraphQLClientError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.GraphQLClientError = GraphQLClientError;
|
|
17
|
+
class GraphQLClient {
|
|
18
|
+
constructor(connectionInfo, options = {}) {
|
|
19
|
+
this.url = connectionInfo.url;
|
|
20
|
+
this.authToken = connectionInfo.authToken;
|
|
21
|
+
this.timeout = options.timeout || 30000;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Execute a GraphQL query or mutation
|
|
25
|
+
*/
|
|
26
|
+
async query(query, variables = {}) {
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
29
|
+
try {
|
|
30
|
+
const response = await fetch(this.url, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
Authorization: `Bearer ${this.authToken}`,
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify({ query, variables }),
|
|
37
|
+
signal: controller.signal,
|
|
38
|
+
});
|
|
39
|
+
clearTimeout(timeoutId);
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new GraphQLClientError(`HTTP ${response.status}: ${response.statusText}`);
|
|
42
|
+
}
|
|
43
|
+
const result = (await response.json());
|
|
44
|
+
if (result.errors && result.errors.length > 0) {
|
|
45
|
+
throw new GraphQLClientError(result.errors[0].message, result.errors);
|
|
46
|
+
}
|
|
47
|
+
if (!result.data) {
|
|
48
|
+
throw new GraphQLClientError('No data in response');
|
|
49
|
+
}
|
|
50
|
+
return result.data;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
clearTimeout(timeoutId);
|
|
54
|
+
if (error.name === 'AbortError') {
|
|
55
|
+
throw new GraphQLClientError('Request timed out');
|
|
56
|
+
}
|
|
57
|
+
if (error instanceof GraphQLClientError) {
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
throw new GraphQLClientError(error.message);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Execute a mutation (alias for query, for clarity)
|
|
65
|
+
*/
|
|
66
|
+
async mutate(mutation, variables = {}) {
|
|
67
|
+
return this.query(mutation, variables);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.GraphQLClient = GraphQLClient;
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhRTENsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvR3JhcGhRTENsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBZUgsTUFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQzNDLFlBQ0UsT0FBZSxFQUNSLE1BQXVCO1FBRTlCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUZSLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBRzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBUkQsZ0RBUUM7QUFFRCxNQUFhLGFBQWE7SUFLeEIsWUFBWSxjQUE4QixFQUFFLFVBQWdDLEVBQUU7UUFDNUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLLENBQ1QsS0FBYSxFQUNiLFlBQXFDLEVBQUU7UUFFdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNyQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtvQkFDbEMsYUFBYSxFQUFFLFVBQVUsSUFBSSxDQUFDLFNBQVMsRUFBRTtpQkFDMUM7Z0JBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTthQUMxQixDQUFDLENBQUM7WUFFSCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLGtCQUFrQixDQUFDLFFBQVEsUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNsRixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBdUIsQ0FBQztZQUU3RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXhCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELElBQUksS0FBSyxZQUFZLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsUUFBZ0IsRUFDaEIsWUFBcUMsRUFBRTtRQUV2QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUksUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQXpFRCxzQ0F5RUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyYXBoUUwgQ2xpZW50XG4gKlxuICogU2ltcGxlIEdyYXBoUUwgY2xpZW50IGZvciBjb21tdW5pY2F0aW5nIHdpdGggTG9jYWwncyBHcmFwaFFMIHNlcnZlci5cbiAqL1xuXG5pbXBvcnQgeyBDb25uZWN0aW9uSW5mbyB9IGZyb20gJy4uL2Jvb3RzdHJhcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhRTEVycm9yIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBsb2NhdGlvbnM/OiBBcnJheTx7IGxpbmU6IG51bWJlcjsgY29sdW1uOiBudW1iZXIgfT47XG4gIHBhdGg/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFwaFFMUmVzcG9uc2U8VCA9IHVua25vd24+IHtcbiAgZGF0YT86IFQ7XG4gIGVycm9ycz86IEdyYXBoUUxFcnJvcltdO1xufVxuXG5leHBvcnQgY2xhc3MgR3JhcGhRTENsaWVudEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGVycm9ycz86IEdyYXBoUUxFcnJvcltdXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdHcmFwaFFMQ2xpZW50RXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHcmFwaFFMQ2xpZW50IHtcbiAgcHJpdmF0ZSB1cmw6IHN0cmluZztcbiAgcHJpdmF0ZSBhdXRoVG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSB0aW1lb3V0OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbkluZm86IENvbm5lY3Rpb25JbmZvLCBvcHRpb25zOiB7IHRpbWVvdXQ/OiBudW1iZXIgfSA9IHt9KSB7XG4gICAgdGhpcy51cmwgPSBjb25uZWN0aW9uSW5mby51cmw7XG4gICAgdGhpcy5hdXRoVG9rZW4gPSBjb25uZWN0aW9uSW5mby5hdXRoVG9rZW47XG4gICAgdGhpcy50aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0IHx8IDMwMDAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBHcmFwaFFMIHF1ZXJ5IG9yIG11dGF0aW9uXG4gICAqL1xuICBhc3luYyBxdWVyeTxUID0gdW5rbm93bj4oXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGhpcy50aW1lb3V0KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMudXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hdXRoVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBxdWVyeSwgdmFyaWFibGVzIH0pLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG5cbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFFMQ2xpZW50RXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIEdyYXBoUUxSZXNwb25zZTxUPjtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcnMgJiYgcmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFFMQ2xpZW50RXJyb3IocmVzdWx0LmVycm9yc1swXS5tZXNzYWdlLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXN1bHQuZGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgR3JhcGhRTENsaWVudEVycm9yKCdObyBkYXRhIGluIHJlc3BvbnNlJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICB0aHJvdyBuZXcgR3JhcGhRTENsaWVudEVycm9yKCdSZXF1ZXN0IHRpbWVkIG91dCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBHcmFwaFFMQ2xpZW50RXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBHcmFwaFFMQ2xpZW50RXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBtdXRhdGlvbiAoYWxpYXMgZm9yIHF1ZXJ5LCBmb3IgY2xhcml0eSlcbiAgICovXG4gIGFzeW5jIG11dGF0ZTxUID0gdW5rbm93bj4oXG4gICAgbXV0YXRpb246IHN0cmluZyxcbiAgICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnk8VD4obXV0YXRpb24sIHZhcmlhYmxlcyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Client exports
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GraphQLClientError = exports.GraphQLClient = void 0;
|
|
7
|
+
var GraphQLClient_1 = require("./GraphQLClient");
|
|
8
|
+
Object.defineProperty(exports, "GraphQLClient", { enumerable: true, get: function () { return GraphQLClient_1.GraphQLClient; } });
|
|
9
|
+
Object.defineProperty(exports, "GraphQLClientError", { enumerable: true, get: function () { return GraphQLClient_1.GraphQLClientError; } });
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBRUgsaURBQWtGO0FBQXpFLDhHQUFBLGFBQWEsT0FBQTtBQUFFLG1IQUFBLGtCQUFrQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGllbnQgZXhwb3J0c1xuICovXG5cbmV4cG9ydCB7IEdyYXBoUUxDbGllbnQsIEdyYXBoUUxDbGllbnRFcnJvciwgR3JhcGhRTEVycm9yIH0gZnJvbSAnLi9HcmFwaFFMQ2xpZW50JztcbiJdfQ==
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Formatters
|
|
3
|
+
*
|
|
4
|
+
* Format command output for different modes:
|
|
5
|
+
* - table: Human-readable ASCII tables (default)
|
|
6
|
+
* - json: JSON output for scripting
|
|
7
|
+
* - quiet: Minimal output (IDs/names only)
|
|
8
|
+
*/
|
|
9
|
+
export type OutputFormat = 'table' | 'json' | 'quiet';
|
|
10
|
+
export interface FormatterOptions {
|
|
11
|
+
json?: boolean;
|
|
12
|
+
quiet?: boolean;
|
|
13
|
+
noColor?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the output format from CLI options
|
|
17
|
+
*/
|
|
18
|
+
export declare function getOutputFormat(options: FormatterOptions): OutputFormat;
|
|
19
|
+
/**
|
|
20
|
+
* Format data as a table
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatTable(headers: string[], rows: string[][], options?: {
|
|
23
|
+
noColor?: boolean;
|
|
24
|
+
}): string;
|
|
25
|
+
/**
|
|
26
|
+
* Format data as JSON
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatJson(data: unknown): string;
|
|
29
|
+
/**
|
|
30
|
+
* Format data as quiet output (one item per line)
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatQuiet(items: string[]): string;
|
|
33
|
+
/**
|
|
34
|
+
* Format a success message
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatSuccess(message: string, options?: {
|
|
37
|
+
noColor?: boolean;
|
|
38
|
+
}): string;
|
|
39
|
+
/**
|
|
40
|
+
* Format an error message
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatError(message: string, options?: {
|
|
43
|
+
noColor?: boolean;
|
|
44
|
+
}): string;
|
|
45
|
+
/**
|
|
46
|
+
* Format a warning message
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatWarning(message: string, options?: {
|
|
49
|
+
noColor?: boolean;
|
|
50
|
+
}): string;
|
|
51
|
+
/**
|
|
52
|
+
* Format a status badge
|
|
53
|
+
*/
|
|
54
|
+
export declare function formatStatus(status: 'running' | 'stopped' | 'error' | string, options?: {
|
|
55
|
+
noColor?: boolean;
|
|
56
|
+
}): string;
|
|
57
|
+
/**
|
|
58
|
+
* Site formatter for list command
|
|
59
|
+
*/
|
|
60
|
+
export interface SiteInfo {
|
|
61
|
+
id: string;
|
|
62
|
+
name: string;
|
|
63
|
+
domain: string;
|
|
64
|
+
status: string;
|
|
65
|
+
path?: string;
|
|
66
|
+
}
|
|
67
|
+
export declare function formatSiteList(sites: SiteInfo[], format: OutputFormat, options?: {
|
|
68
|
+
noColor?: boolean;
|
|
69
|
+
}): string;
|
|
70
|
+
/**
|
|
71
|
+
* Site detail formatter
|
|
72
|
+
*/
|
|
73
|
+
export declare function formatSiteDetail(site: Record<string, unknown>, format: OutputFormat, options?: {
|
|
74
|
+
noColor?: boolean;
|
|
75
|
+
}): string;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Output Formatters
|
|
4
|
+
*
|
|
5
|
+
* Format command output for different modes:
|
|
6
|
+
* - table: Human-readable ASCII tables (default)
|
|
7
|
+
* - json: JSON output for scripting
|
|
8
|
+
* - quiet: Minimal output (IDs/names only)
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.getOutputFormat = getOutputFormat;
|
|
15
|
+
exports.formatTable = formatTable;
|
|
16
|
+
exports.formatJson = formatJson;
|
|
17
|
+
exports.formatQuiet = formatQuiet;
|
|
18
|
+
exports.formatSuccess = formatSuccess;
|
|
19
|
+
exports.formatError = formatError;
|
|
20
|
+
exports.formatWarning = formatWarning;
|
|
21
|
+
exports.formatStatus = formatStatus;
|
|
22
|
+
exports.formatSiteList = formatSiteList;
|
|
23
|
+
exports.formatSiteDetail = formatSiteDetail;
|
|
24
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
25
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
26
|
+
/**
|
|
27
|
+
* Get the output format from CLI options
|
|
28
|
+
*/
|
|
29
|
+
function getOutputFormat(options) {
|
|
30
|
+
if (options.json)
|
|
31
|
+
return 'json';
|
|
32
|
+
if (options.quiet)
|
|
33
|
+
return 'quiet';
|
|
34
|
+
return 'table';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Format data as a table
|
|
38
|
+
*/
|
|
39
|
+
function formatTable(headers, rows, options = {}) {
|
|
40
|
+
const table = new cli_table3_1.default({
|
|
41
|
+
head: options.noColor ? headers : headers.map((h) => chalk_1.default.bold(h)),
|
|
42
|
+
style: {
|
|
43
|
+
head: options.noColor ? [] : ['cyan'],
|
|
44
|
+
border: options.noColor ? [] : ['grey'],
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
rows.forEach((row) => table.push(row));
|
|
48
|
+
return table.toString();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Format data as JSON
|
|
52
|
+
*/
|
|
53
|
+
function formatJson(data) {
|
|
54
|
+
return JSON.stringify(data, null, 2);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Format data as quiet output (one item per line)
|
|
58
|
+
*/
|
|
59
|
+
function formatQuiet(items) {
|
|
60
|
+
return items.join('\n');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Format a success message
|
|
64
|
+
*/
|
|
65
|
+
function formatSuccess(message, options = {}) {
|
|
66
|
+
if (options.noColor) {
|
|
67
|
+
return `✓ ${message}`;
|
|
68
|
+
}
|
|
69
|
+
return chalk_1.default.green(`✓ ${message}`);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Format an error message
|
|
73
|
+
*/
|
|
74
|
+
function formatError(message, options = {}) {
|
|
75
|
+
if (options.noColor) {
|
|
76
|
+
return `✗ ${message}`;
|
|
77
|
+
}
|
|
78
|
+
return chalk_1.default.red(`✗ ${message}`);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Format a warning message
|
|
82
|
+
*/
|
|
83
|
+
function formatWarning(message, options = {}) {
|
|
84
|
+
if (options.noColor) {
|
|
85
|
+
return `⚠ ${message}`;
|
|
86
|
+
}
|
|
87
|
+
return chalk_1.default.yellow(`⚠ ${message}`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format a status badge
|
|
91
|
+
*/
|
|
92
|
+
function formatStatus(status, options = {}) {
|
|
93
|
+
if (options.noColor) {
|
|
94
|
+
return status;
|
|
95
|
+
}
|
|
96
|
+
switch (status) {
|
|
97
|
+
case 'running':
|
|
98
|
+
return chalk_1.default.green(status);
|
|
99
|
+
case 'stopped':
|
|
100
|
+
return chalk_1.default.gray(status);
|
|
101
|
+
case 'error':
|
|
102
|
+
return chalk_1.default.red(status);
|
|
103
|
+
default:
|
|
104
|
+
return status;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function formatSiteList(sites, format, options = {}) {
|
|
108
|
+
switch (format) {
|
|
109
|
+
case 'json':
|
|
110
|
+
return formatJson(sites);
|
|
111
|
+
case 'quiet':
|
|
112
|
+
return formatQuiet(sites.map((s) => s.name));
|
|
113
|
+
case 'table':
|
|
114
|
+
default:
|
|
115
|
+
if (sites.length === 0) {
|
|
116
|
+
return 'No sites found.';
|
|
117
|
+
}
|
|
118
|
+
return formatTable(['Name', 'Domain', 'Status'], sites.map((s) => [s.name, s.domain, formatStatus(s.status, options)]), options);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Site detail formatter
|
|
123
|
+
*/
|
|
124
|
+
function formatSiteDetail(site, format, options = {}) {
|
|
125
|
+
switch (format) {
|
|
126
|
+
case 'json':
|
|
127
|
+
return formatJson(site);
|
|
128
|
+
case 'quiet':
|
|
129
|
+
return String(site.name || site.id);
|
|
130
|
+
case 'table':
|
|
131
|
+
default:
|
|
132
|
+
const rows = Object.entries(site).map(([key, value]) => [
|
|
133
|
+
key,
|
|
134
|
+
typeof value === 'object' ? JSON.stringify(value) : String(value),
|
|
135
|
+
]);
|
|
136
|
+
return formatTable(['Property', 'Value'], rows, options);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZm9ybWF0dGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7Ozs7QUFnQkgsMENBSUM7QUFLRCxrQ0FnQkM7QUFLRCxnQ0FFQztBQUtELGtDQUVDO0FBS0Qsc0NBS0M7QUFLRCxrQ0FLQztBQUtELHNDQUtDO0FBS0Qsb0NBa0JDO0FBYUQsd0NBd0JDO0FBS0QsNENBcUJDO0FBektELDREQUErQjtBQUMvQixrREFBMEI7QUFVMUI7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsT0FBeUI7SUFDdkQsSUFBSSxPQUFPLENBQUMsSUFBSTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ2hDLElBQUksT0FBTyxDQUFDLEtBQUs7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUNsQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXLENBQ3pCLE9BQWlCLEVBQ2pCLElBQWdCLEVBQ2hCLFVBQWlDLEVBQUU7SUFFbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBSyxDQUFDO1FBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDckMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDeEM7S0FDRixDQUFDLENBQUM7SUFFSCxJQUFJLENB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QUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFDckUsT0FBTyxDQUNSLENBQUM7SUFDTixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLElBQTZCLEVBQzdCLE1BQW9CLEVBQ3BCLFVBQWlDLEVBQUU7SUFFbkMsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFCLEtBQUssT0FBTztZQUNWLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRDLEtBQUssT0FBTyxDQUFDO1FBQ2I7WUFDRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEQsR0FBRztnQkFDSCxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDbEUsQ0FBQyxDQUFDO1lBRUgsT0FBTyxXQUFXLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPdXRwdXQgRm9ybWF0dGVyc1xuICpcbiAqIEZvcm1hdCBjb21tYW5kIG91dHB1dCBmb3IgZGlmZmVyZW50IG1vZGVzOlxuICogLSB0YWJsZTogSHVtYW4tcmVhZGFibGUgQVNDSUkgdGFibGVzIChkZWZhdWx0KVxuICogLSBqc29uOiBKU09OIG91dHB1dCBmb3Igc2NyaXB0aW5nXG4gKiAtIHF1aWV0OiBNaW5pbWFsIG91dHB1dCAoSURzL25hbWVzIG9ubHkpXG4gKi9cblxuaW1wb3J0IFRhYmxlIGZyb20gJ2NsaS10YWJsZTMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuZXhwb3J0IHR5cGUgT3V0cHV0Rm9ybWF0ID0gJ3RhYmxlJyB8ICdqc29uJyB8ICdxdWlldCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVyT3B0aW9ucyB7XG4gIGpzb24/OiBib29sZWFuO1xuICBxdWlldD86IGJvb2xlYW47XG4gIG5vQ29sb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3V0cHV0IGZvcm1hdCBmcm9tIENMSSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRGb3JtYXQob3B0aW9uczogRm9ybWF0dGVyT3B0aW9ucyk6IE91dHB1dEZvcm1hdCB7XG4gIGlmIChvcHRpb25zLmpzb24pIHJldHVybiAnanNvbic7XG4gIGlmIChvcHRpb25zLnF1aWV0KSByZXR1cm4gJ3F1aWV0JztcbiAgcmV0dXJuICd0YWJsZSc7XG59XG5cbi8qKlxuICogRm9ybWF0IGRhdGEgYXMgYSB0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGFibGUoXG4gIGhlYWRlcnM6IHN0cmluZ1tdLFxuICByb3dzOiBzdHJpbmdbXVtdLFxuICBvcHRpb25zOiB7IG5vQ29sb3I/OiBib29sZWFuIH0gPSB7fVxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGFibGUgPSBuZXcgVGFibGUoe1xuICAgIGhlYWQ6IG9wdGlvbnMubm9Db2xvciA/IGhlYWRlcnMgOiBoZWFkZXJzLm1hcCgoaCkgPT4gY2hhbGsuYm9sZChoKSksXG4gICAgc3R5bGU6IHtcbiAgICAgIGhlYWQ6IG9wdGlvbnMubm9Db2xvciA/IFtdIDogWydjeWFuJ10sXG4gICAgICBib3JkZXI6IG9wdGlvbnMubm9Db2xvciA/IFtdIDogWydncmV5J10sXG4gICAgfSxcbiAgfSk7XG5cbiAgcm93cy5mb3JFYWNoKChyb3cpID0+IHRhYmxlLnB1c2gocm93KSk7XG5cbiAgcmV0dXJuIHRhYmxlLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogRm9ybWF0IGRhdGEgYXMgSlNPTlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SnNvbihkYXRhOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBkYXRhIGFzIHF1aWV0IG91dHB1dCAob25lIGl0ZW0gcGVyIGxpbmUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRRdWlldChpdGVtczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRm9ybWF0IGEgc3VjY2VzcyBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdWNjZXNzKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9uczogeyBub0NvbG9yPzogYm9vbGVhbiB9ID0ge30pOiBzdHJpbmcge1xuICBpZiAob3B0aW9ucy5ub0NvbG9yKSB7XG4gICAgcmV0dXJuIGDinJMgJHttZXNzYWdlfWA7XG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyZWVuKGDinJMgJHttZXNzYWdlfWApO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhbiBlcnJvciBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM6IHsgbm9Db2xvcj86IGJvb2xlYW4gfSA9IHt9KTogc3RyaW5nIHtcbiAgaWYgKG9wdGlvbnMubm9Db2xvcikge1xuICAgIHJldHVybiBg4pyXICR7bWVzc2FnZX1gO1xuICB9XG4gIHJldHVybiBjaGFsay5yZWQoYOKclyAke21lc3NhZ2V9YCk7XG59XG5cbi8qKlxuICogRm9ybWF0IGEgd2FybmluZyBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9uczogeyBub0NvbG9yPzogYm9vbGVhbiB9ID0ge30pOiBzdHJpbmcge1xuICBpZiAob3B0aW9ucy5ub0NvbG9yKSB7XG4gICAgcmV0dXJuIGDimqAgJHttZXNzYWdlfWA7XG4gIH1cbiAgcmV0dXJuIGNoYWxrLnllbGxvdyhg4pqgICR7bWVzc2FnZX1gKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBzdGF0dXMgYmFkZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN0YXR1cyhcbiAgc3RhdHVzOiAncnVubmluZycgfCAnc3RvcHBlZCcgfCAnZXJyb3InIHwgc3RyaW5nLFxuICBvcHRpb25zOiB7IG5vQ29sb3I/OiBib29sZWFuIH0gPSB7fVxuKTogc3RyaW5nIHtcbiAgaWYgKG9wdGlvbnMubm9Db2xvcikge1xuICAgIHJldHVybiBzdGF0dXM7XG4gIH1cblxuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgcmV0dXJuIGNoYWxrLmdyZWVuKHN0YXR1cyk7XG4gICAgY2FzZSAnc3RvcHBlZCc6XG4gICAgICByZXR1cm4gY2hhbGsuZ3JheShzdGF0dXMpO1xuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgfVxufVxuXG4vKipcbiAqIFNpdGUgZm9ybWF0dGVyIGZvciBsaXN0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXRlSW5mbyB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2l0ZUxpc3QoXG4gIHNpdGVzOiBTaXRlSW5mb1tdLFxuICBmb3JtYXQ6IE91dHB1dEZvcm1hdCxcbiAgb3B0aW9uczogeyBub0NvbG9yPzogYm9vbGVhbiB9ID0ge31cbik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnanNvbic6XG4gICAgICByZXR1cm4gZm9ybWF0SnNvbihzaXRlcyk7XG5cbiAgICBjYXNlICdxdWlldCc6XG4gICAgICByZXR1cm4gZm9ybWF0UXVpZXQoc2l0ZXMubWFwKChzKSA9PiBzLm5hbWUpKTtcblxuICAgIGNhc2UgJ3RhYmxlJzpcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHNpdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJ05vIHNpdGVzIGZvdW5kLic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3JtYXRUYWJsZShcbiAgICAgICAgWydOYW1lJywgJ0RvbWFpbicsICdTdGF0dXMnXSxcbiAgICAgICAgc2l0ZXMubWFwKChzKSA9PiBbcy5uYW1lLCBzLmRvbWFpbiwgZm9ybWF0U3RhdHVzKHMuc3RhdHVzLCBvcHRpb25zKV0pLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICB9XG59XG5cbi8qKlxuICogU2l0ZSBkZXRhaWwgZm9ybWF0dGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTaXRlRGV0YWlsKFxuICBzaXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZm9ybWF0OiBPdXRwdXRGb3JtYXQsXG4gIG9wdGlvbnM6IHsgbm9Db2xvcj86IGJvb2xlYW4gfSA9IHt9XG4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ2pzb24nOlxuICAgICAgcmV0dXJuIGZvcm1hdEpzb24oc2l0ZSk7XG5cbiAgICBjYXNlICdxdWlldCc6XG4gICAgICByZXR1cm4gU3RyaW5nKHNpdGUubmFtZSB8fCBzaXRlLmlkKTtcblxuICAgIGNhc2UgJ3RhYmxlJzpcbiAgICBkZWZhdWx0OlxuICAgICAgY29uc3Qgcm93cyA9IE9iamVjdC5lbnRyaWVzKHNpdGUpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IFN0cmluZyh2YWx1ZSksXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIGZvcm1hdFRhYmxlKFsnUHJvcGVydHknLCAnVmFsdWUnXSwgcm93cywgb3B0aW9ucyk7XG4gIH1cbn1cbiJdfQ==
|