@unito/integration-cli 0.64.5 → 0.64.6
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/dist/src/commands/graph.d.ts +21 -0
- package/dist/src/commands/graph.js +144 -0
- package/dist/src/hooks/init/displayLogo.js +3 -1
- package/dist/test/commands/graph.test.d.ts +1 -0
- package/dist/test/commands/graph.test.js +188 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/oclif.manifest.json +126 -1
- package/package.json +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseCommand } from '../baseCommand';
|
|
2
|
+
import * as GlobalConfiguration from '../resources/globalConfiguration';
|
|
3
|
+
export default class Graph extends BaseCommand<typeof Graph> {
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static args: {
|
|
7
|
+
operation: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
catch(error: Error): Promise<void>;
|
|
10
|
+
static flags: {
|
|
11
|
+
path: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
12
|
+
port: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
13
|
+
environment: import("@oclif/core/lib/interfaces").OptionFlag<GlobalConfiguration.Environment, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
14
|
+
'test-account': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
15
|
+
'credential-payload': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
16
|
+
'credential-id': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
17
|
+
'config-path': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
18
|
+
output: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
19
|
+
};
|
|
20
|
+
run(): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const crypto_1 = tslib_1.__importDefault(require("crypto"));
|
|
5
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
6
|
+
const core_1 = require("@oclif/core");
|
|
7
|
+
const baseCommand_1 = require("../baseCommand");
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
const GlobalConfiguration = tslib_1.__importStar(require("../resources/globalConfiguration"));
|
|
10
|
+
const integrations_1 = require("../resources/integrations");
|
|
11
|
+
const configuration_1 = require("../resources/configuration");
|
|
12
|
+
const decryption_1 = require("../resources/decryption");
|
|
13
|
+
const credentials_1 = require("../resources/credentials");
|
|
14
|
+
class Graph extends baseCommand_1.BaseCommand {
|
|
15
|
+
static description = 'Query a running integration graph and print the response';
|
|
16
|
+
static examples = [
|
|
17
|
+
'<%= config.bin %> <%= command.id %> --path=/sobjects/Opportunity/records/abc123',
|
|
18
|
+
'<%= config.bin %> <%= command.id %> get --path=/sobjects/Opportunity --port=9201',
|
|
19
|
+
];
|
|
20
|
+
static args = {
|
|
21
|
+
operation: core_1.Args.string({
|
|
22
|
+
description: 'Operation to perform on the graph path',
|
|
23
|
+
required: false,
|
|
24
|
+
default: 'get',
|
|
25
|
+
options: ['get', 'getItem', 'getCollection', 'createItem', 'updateItem', 'deleteItem'],
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
async catch(error) {
|
|
29
|
+
/* istanbul ignore if */
|
|
30
|
+
if ((0, errors_1.handleError)(this, error)) {
|
|
31
|
+
this.exit(-1);
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
static flags = {
|
|
36
|
+
path: core_1.Flags.string({
|
|
37
|
+
description: 'Graph path to fetch (must start with /), e.g. /sobjects/Opportunity/records/abc123',
|
|
38
|
+
required: true,
|
|
39
|
+
}),
|
|
40
|
+
port: core_1.Flags.integer({
|
|
41
|
+
description: 'Port the integration is running on',
|
|
42
|
+
default: 9200,
|
|
43
|
+
}),
|
|
44
|
+
environment: core_1.Flags.custom({
|
|
45
|
+
description: 'the environment of the platform',
|
|
46
|
+
options: Object.values(GlobalConfiguration.Environment),
|
|
47
|
+
default: GlobalConfiguration.Environment.Production,
|
|
48
|
+
})(),
|
|
49
|
+
'test-account': core_1.Flags.string({
|
|
50
|
+
description: 'test account to use',
|
|
51
|
+
options: Object.values(configuration_1.CredentialScope),
|
|
52
|
+
default: configuration_1.CredentialScope.DEVELOPMENT,
|
|
53
|
+
}),
|
|
54
|
+
'credential-payload': core_1.Flags.string({
|
|
55
|
+
description: '(advanced) credential payload to use.',
|
|
56
|
+
exclusive: ['credential-id'],
|
|
57
|
+
}),
|
|
58
|
+
'credential-id': core_1.Flags.string({
|
|
59
|
+
description: '(advanced) credential to use.',
|
|
60
|
+
exclusive: ['credential-payload'],
|
|
61
|
+
}),
|
|
62
|
+
'config-path': core_1.Flags.string({
|
|
63
|
+
summary: 'relative path to a custom ".unito.json" file',
|
|
64
|
+
description: `Use a custom configuration file instead of the default '.unito.json'.
|
|
65
|
+
|
|
66
|
+
If you want to force the CLI to use a specific configuration file, you can use this flag to specify the relative
|
|
67
|
+
path from your integration's root folder (with a leading '/').
|
|
68
|
+
|
|
69
|
+
Usage: <%= config.bin %> <%= command.id %> --config-path=/myCustomConfig.json`,
|
|
70
|
+
}),
|
|
71
|
+
output: core_1.Flags.string({
|
|
72
|
+
char: 'o',
|
|
73
|
+
description: 'Write response body to file instead of stdout',
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
async run() {
|
|
77
|
+
(0, integrations_1.validateIsIntegrationDirectory)();
|
|
78
|
+
const { args, flags } = await this.parse(Graph);
|
|
79
|
+
const operation = args.operation ?? 'get';
|
|
80
|
+
if (operation === 'createItem' || operation === 'updateItem' || operation === 'deleteItem') {
|
|
81
|
+
this.error(`Operation "${operation}" is not yet implemented`, { exit: 1 });
|
|
82
|
+
}
|
|
83
|
+
const environment = flags.environment ?? GlobalConfiguration.Environment.Production;
|
|
84
|
+
const configuration = await (0, configuration_1.getConfiguration)(environment, flags['config-path']);
|
|
85
|
+
// Credential resolution — identical to dev.ts
|
|
86
|
+
let credentialPayload = '{}';
|
|
87
|
+
if (flags['credential-id']) {
|
|
88
|
+
const credential = await (0, credentials_1.fetchCredential)(environment, this.config.configDir, flags['credential-id']);
|
|
89
|
+
credentialPayload = JSON.stringify({
|
|
90
|
+
...credential.payload,
|
|
91
|
+
unitoCredentialId: credential.id,
|
|
92
|
+
unitoUserId: credential.unitoUserId,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if (flags['credential-payload']) {
|
|
96
|
+
credentialPayload = flags['credential-payload'];
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const credentials = configuration.testAccounts?.[flags['test-account']];
|
|
100
|
+
if (credentials) {
|
|
101
|
+
const decryptedEntries = await (0, decryption_1.decryptEntries)(configuration.name, environment, this.config.configDir, credentials);
|
|
102
|
+
if (decryptedEntries.failed.length) {
|
|
103
|
+
throw new errors_1.EntryDecryptionError(decryptedEntries.failed.at(0), environment);
|
|
104
|
+
}
|
|
105
|
+
credentialPayload = JSON.stringify({
|
|
106
|
+
...decryptedEntries.successful,
|
|
107
|
+
unitoCredentialId: flags['test-account'],
|
|
108
|
+
unitoUserId: flags['test-account'],
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Load secrets — identical to dev.ts
|
|
113
|
+
const { successful: secrets, failed: failedSecrets } = await (0, decryption_1.decryptEntries)(configuration.name, environment, this.config.configDir, configuration.secrets ?? {});
|
|
114
|
+
if (failedSecrets.length) {
|
|
115
|
+
throw new errors_1.EntryDecryptionError(failedSecrets.at(0), environment);
|
|
116
|
+
}
|
|
117
|
+
// Build Unito request headers.
|
|
118
|
+
// Encoding: base64(JSON.stringify(payload)) — same as integrationDebugger/src/services/crawlerDriver.ts line 424.
|
|
119
|
+
const headers = {
|
|
120
|
+
'X-Unito-Credentials': Buffer.from(credentialPayload).toString('base64'),
|
|
121
|
+
'X-Unito-Secrets': Buffer.from(JSON.stringify(secrets)).toString('base64'),
|
|
122
|
+
'X-Unito-Correlation-Id': crypto_1.default.randomUUID(),
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
};
|
|
125
|
+
const url = `http://localhost:${flags.port}${flags.path}`;
|
|
126
|
+
const response = await fetch(url, { headers });
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
const body = await response.json().catch(() => undefined);
|
|
129
|
+
if (body !== undefined) {
|
|
130
|
+
this.logToStderr(JSON.stringify(body, null, 2));
|
|
131
|
+
}
|
|
132
|
+
this.error(`HTTP ${response.status} from ${url}`, { exit: response.status });
|
|
133
|
+
}
|
|
134
|
+
const body = (await response.json());
|
|
135
|
+
const json = JSON.stringify(body, null, 2);
|
|
136
|
+
if (flags.output) {
|
|
137
|
+
await fs_1.default.promises.writeFile(flags.output, json, 'utf8');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.log(json);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.default = Graph;
|
|
@@ -4,7 +4,9 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
const core_1 = require("@oclif/core");
|
|
5
5
|
const gradient = tslib_1.__importStar(require("gradient-string"));
|
|
6
6
|
const updateNotifier_1 = require("./updateNotifier");
|
|
7
|
-
const displayLogo = async function () {
|
|
7
|
+
const displayLogo = async function ({ id }) {
|
|
8
|
+
if (id === 'graph')
|
|
9
|
+
return;
|
|
8
10
|
const gradients = [
|
|
9
11
|
gradient.atlas,
|
|
10
12
|
gradient.mind,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
5
|
+
const test_1 = require("@oclif/test");
|
|
6
|
+
const sinon_1 = tslib_1.__importDefault(require("sinon"));
|
|
7
|
+
const Configuration = tslib_1.__importStar(require("../../src/resources/configuration"));
|
|
8
|
+
const Decryption = tslib_1.__importStar(require("../../src/resources/decryption"));
|
|
9
|
+
const Integrations = tslib_1.__importStar(require("../../src/resources/integrations"));
|
|
10
|
+
const MOCK_CONFIG = {
|
|
11
|
+
name: 'salesforce-v2',
|
|
12
|
+
testAccounts: {
|
|
13
|
+
development: { token: 'test-token' },
|
|
14
|
+
},
|
|
15
|
+
secrets: {},
|
|
16
|
+
};
|
|
17
|
+
const MOCK_RESPONSE = {
|
|
18
|
+
label: 'Opportunity',
|
|
19
|
+
fields: [{ name: 'Name', type: 'string' }],
|
|
20
|
+
relations: [{ name: 'tasks', semantic: 'subtasks', path: '/sobjects/Task/records?filter=WhatId=abc' }],
|
|
21
|
+
};
|
|
22
|
+
describe('graph', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
sinon_1.default.stub(Integrations, 'validateIsIntegrationDirectory');
|
|
25
|
+
sinon_1.default.stub(Decryption, 'decryptEntries').resolves({
|
|
26
|
+
successful: { token: 'test-token' },
|
|
27
|
+
failed: [],
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
afterEach(() => sinon_1.default.restore());
|
|
31
|
+
test_1.test
|
|
32
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
33
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
34
|
+
ok: true,
|
|
35
|
+
status: 200,
|
|
36
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
37
|
+
}))
|
|
38
|
+
.stdout()
|
|
39
|
+
.command(['graph', '--path=/sobjects/Opportunity/records/abc123'])
|
|
40
|
+
.it('prints pretty-printed JSON response to stdout', ctx => {
|
|
41
|
+
(0, test_1.expect)(ctx.stdout).to.contain('"label": "Opportunity"');
|
|
42
|
+
(0, test_1.expect)(ctx.stdout).to.contain('"semantic": "subtasks"');
|
|
43
|
+
});
|
|
44
|
+
test_1.test
|
|
45
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
46
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
47
|
+
ok: true,
|
|
48
|
+
status: 200,
|
|
49
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
50
|
+
}))
|
|
51
|
+
.stdout()
|
|
52
|
+
.command(['graph', '--path=/sobjects/Opportunity/records/abc123'])
|
|
53
|
+
.it('calls fetch with the correct default-port URL', () => {
|
|
54
|
+
const fetchStub = global.fetch;
|
|
55
|
+
(0, test_1.expect)(fetchStub.calledOnce).to.be.true;
|
|
56
|
+
const [calledUrl] = fetchStub.firstCall.args;
|
|
57
|
+
(0, test_1.expect)(calledUrl).to.equal('http://localhost:9200/sobjects/Opportunity/records/abc123');
|
|
58
|
+
});
|
|
59
|
+
test_1.test
|
|
60
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
61
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
62
|
+
ok: true,
|
|
63
|
+
status: 200,
|
|
64
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
65
|
+
}))
|
|
66
|
+
.stdout()
|
|
67
|
+
.command(['graph', '--path=/sobjects/Opportunity', '--port=9201'])
|
|
68
|
+
.it('uses custom port when specified', () => {
|
|
69
|
+
const fetchStub = global.fetch;
|
|
70
|
+
const [calledUrl] = fetchStub.firstCall.args;
|
|
71
|
+
(0, test_1.expect)(calledUrl).to.equal('http://localhost:9201/sobjects/Opportunity');
|
|
72
|
+
});
|
|
73
|
+
test_1.test
|
|
74
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
75
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
76
|
+
ok: false,
|
|
77
|
+
status: 404,
|
|
78
|
+
json: () => Promise.resolve({ error: 'Not found' }),
|
|
79
|
+
}))
|
|
80
|
+
.stdout()
|
|
81
|
+
.stderr()
|
|
82
|
+
.command(['graph', '--path=/sobjects/NonExistent/records/abc'])
|
|
83
|
+
.catch(err => {
|
|
84
|
+
(0, test_1.expect)(err.message).to.contain('404');
|
|
85
|
+
(0, test_1.expect)(err.oclif?.exit).to.equal(404);
|
|
86
|
+
})
|
|
87
|
+
.it('exits with HTTP status code and prints error body to stderr', ctx => {
|
|
88
|
+
(0, test_1.expect)(ctx.stderr).to.contain('"error": "Not found"');
|
|
89
|
+
});
|
|
90
|
+
test_1.test
|
|
91
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
92
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
93
|
+
ok: true,
|
|
94
|
+
status: 200,
|
|
95
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
96
|
+
}))
|
|
97
|
+
.stdout()
|
|
98
|
+
.command(['graph', '--path=/sobjects/Opportunity'])
|
|
99
|
+
.it('sets base64-encoded X-Unito-Credentials header', () => {
|
|
100
|
+
const fetchStub = global.fetch;
|
|
101
|
+
const [, options] = fetchStub.firstCall.args;
|
|
102
|
+
const decoded = Buffer.from(options.headers['X-Unito-Credentials'], 'base64').toString('utf8');
|
|
103
|
+
const credentials = JSON.parse(decoded);
|
|
104
|
+
(0, test_1.expect)(credentials).to.have.property('token', 'test-token');
|
|
105
|
+
});
|
|
106
|
+
test_1.test
|
|
107
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
108
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
109
|
+
ok: true,
|
|
110
|
+
status: 200,
|
|
111
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
112
|
+
}))
|
|
113
|
+
.stub(fs_1.default.promises, 'writeFile', stub => stub.resolves())
|
|
114
|
+
.stdout()
|
|
115
|
+
.command(['graph', '--path=/sobjects/Opportunity', '--output=/tmp/response.json'])
|
|
116
|
+
.it('writes response to file when --output is provided', ctx => {
|
|
117
|
+
const writeStub = fs_1.default.promises.writeFile;
|
|
118
|
+
(0, test_1.expect)(writeStub.calledOnce).to.be.true;
|
|
119
|
+
const [path, content] = writeStub.firstCall.args;
|
|
120
|
+
(0, test_1.expect)(path).to.equal('/tmp/response.json');
|
|
121
|
+
(0, test_1.expect)(content).to.contain('"label": "Opportunity"');
|
|
122
|
+
(0, test_1.expect)(ctx.stdout).to.equal('');
|
|
123
|
+
});
|
|
124
|
+
test_1.test
|
|
125
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
126
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
127
|
+
ok: true,
|
|
128
|
+
status: 200,
|
|
129
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
130
|
+
}))
|
|
131
|
+
.stdout()
|
|
132
|
+
.command(['graph', '--path=/sobjects/Opportunity'])
|
|
133
|
+
.it('prints to stdout when --output is not provided', ctx => {
|
|
134
|
+
(0, test_1.expect)(ctx.stdout).to.contain('"label": "Opportunity"');
|
|
135
|
+
});
|
|
136
|
+
test_1.test
|
|
137
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
138
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
139
|
+
ok: true,
|
|
140
|
+
status: 200,
|
|
141
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
142
|
+
}))
|
|
143
|
+
.stdout()
|
|
144
|
+
.command(['graph', 'get', '--path=/sobjects/Opportunity'])
|
|
145
|
+
.it('accepts explicit "get" operation arg', ctx => {
|
|
146
|
+
(0, test_1.expect)(ctx.stdout).to.contain('"label": "Opportunity"');
|
|
147
|
+
});
|
|
148
|
+
test_1.test
|
|
149
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
150
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
151
|
+
ok: true,
|
|
152
|
+
status: 200,
|
|
153
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
154
|
+
}))
|
|
155
|
+
.stdout()
|
|
156
|
+
.command(['graph', 'getItem', '--path=/sobjects/Opportunity'])
|
|
157
|
+
.it('treats "getItem" as a get operation', ctx => {
|
|
158
|
+
(0, test_1.expect)(ctx.stdout).to.contain('"label": "Opportunity"');
|
|
159
|
+
});
|
|
160
|
+
test_1.test
|
|
161
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
162
|
+
.stub(global, 'fetch', stub => stub.resolves({
|
|
163
|
+
ok: true,
|
|
164
|
+
status: 200,
|
|
165
|
+
json: () => Promise.resolve(MOCK_RESPONSE),
|
|
166
|
+
}))
|
|
167
|
+
.stdout()
|
|
168
|
+
.command(['graph', 'getCollection', '--path=/sobjects/Opportunity'])
|
|
169
|
+
.it('treats "getCollection" as a get operation', ctx => {
|
|
170
|
+
(0, test_1.expect)(ctx.stdout).to.contain('"label": "Opportunity"');
|
|
171
|
+
});
|
|
172
|
+
for (const op of ['createItem', 'updateItem', 'deleteItem']) {
|
|
173
|
+
test_1.test
|
|
174
|
+
.stub(Configuration, 'getConfiguration', stub => stub.resolves(MOCK_CONFIG))
|
|
175
|
+
.command(['graph', op, '--path=/sobjects/Opportunity'])
|
|
176
|
+
.catch(err => {
|
|
177
|
+
(0, test_1.expect)(err.message).to.contain(`Operation "${op}" is not yet implemented`);
|
|
178
|
+
})
|
|
179
|
+
.it(`rejects "${op}" as not yet implemented`);
|
|
180
|
+
}
|
|
181
|
+
test_1.test
|
|
182
|
+
.stderr()
|
|
183
|
+
.command(['graph', 'put', '--path=/sobjects/Opportunity'])
|
|
184
|
+
.catch(err => {
|
|
185
|
+
(0, test_1.expect)(err.message).to.contain('Expected put to be one of');
|
|
186
|
+
})
|
|
187
|
+
.it('rejects invalid operation arg');
|
|
188
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/baseCommand.ts","../src/configurationTypes.ts","../src/errors.ts","../src/index.ts","../src/commands/activity.ts","../src/commands/dev.ts","../src/commands/encrypt.ts","../src/commands/init.ts","../src/commands/invite.ts","../src/commands/login.ts","../src/commands/oauth2.ts","../src/commands/publish.ts","../src/commands/test.ts","../src/commands/upgrade.ts","../src/hooks/init/displayLogo.ts","../src/hooks/init/updateNotifier.ts","../src/resources/configuration.ts","../src/resources/credentials.ts","../src/resources/decryption.ts","../src/resources/fileSystem.ts","../src/resources/globalConfiguration.ts","../src/resources/integrations.ts","../src/resources/integrationsPlatform.ts","../src/resources/oauth2.ts","../src/resources/template.ts","../src/services/integrationsPlatform.ts","../src/services/integrationsPlatformClient.ts","../src/services/oauth2.ts","../test/errors.test.ts","../test/commands/activity.test.ts","../test/commands/dev.test.ts","../test/commands/encrypt.test.ts","../test/commands/init.test.ts","../test/commands/invite.test.ts","../test/commands/login.test.ts","../test/commands/oauth2.test.ts","../test/commands/publish.test.ts","../test/commands/test.test.ts","../test/commands/upgrade.test.ts","../test/helpers/init.js","../test/helpers/integrations.ts","../test/helpers/styles.ts","../test/hooks/updateNotifier.test.ts","../test/resources/configuration.test.ts","../test/resources/decryption.test.ts","../test/resources/globalConfiguration.test.ts","../test/resources/integrations.test.ts","../test/resources/oauth2.test.ts","../test/resources/template.test.ts","../test/services/integrationsPlatform.test.ts","../test/services/oauth2.test.ts","../scripts/generateTypes.ts","../.eslintrc.js"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/baseCommand.ts","../src/configurationTypes.ts","../src/errors.ts","../src/index.ts","../src/commands/activity.ts","../src/commands/dev.ts","../src/commands/encrypt.ts","../src/commands/graph.ts","../src/commands/init.ts","../src/commands/invite.ts","../src/commands/login.ts","../src/commands/oauth2.ts","../src/commands/publish.ts","../src/commands/test.ts","../src/commands/upgrade.ts","../src/hooks/init/displayLogo.ts","../src/hooks/init/updateNotifier.ts","../src/resources/configuration.ts","../src/resources/credentials.ts","../src/resources/decryption.ts","../src/resources/fileSystem.ts","../src/resources/globalConfiguration.ts","../src/resources/integrations.ts","../src/resources/integrationsPlatform.ts","../src/resources/oauth2.ts","../src/resources/template.ts","../src/services/integrationsPlatform.ts","../src/services/integrationsPlatformClient.ts","../src/services/oauth2.ts","../test/errors.test.ts","../test/commands/activity.test.ts","../test/commands/dev.test.ts","../test/commands/encrypt.test.ts","../test/commands/graph.test.ts","../test/commands/init.test.ts","../test/commands/invite.test.ts","../test/commands/login.test.ts","../test/commands/oauth2.test.ts","../test/commands/publish.test.ts","../test/commands/test.test.ts","../test/commands/upgrade.test.ts","../test/helpers/init.js","../test/helpers/integrations.ts","../test/helpers/styles.ts","../test/hooks/updateNotifier.test.ts","../test/resources/configuration.test.ts","../test/resources/decryption.test.ts","../test/resources/globalConfiguration.test.ts","../test/resources/integrations.test.ts","../test/resources/oauth2.test.ts","../test/resources/template.test.ts","../test/services/integrationsPlatform.test.ts","../test/services/oauth2.test.ts","../scripts/generateTypes.ts","../.eslintrc.js"],"version":"5.9.3"}
|
package/oclif.manifest.json
CHANGED
|
@@ -253,6 +253,131 @@
|
|
|
253
253
|
"encrypt.js"
|
|
254
254
|
]
|
|
255
255
|
},
|
|
256
|
+
"graph": {
|
|
257
|
+
"aliases": [],
|
|
258
|
+
"args": {
|
|
259
|
+
"operation": {
|
|
260
|
+
"default": "get",
|
|
261
|
+
"description": "Operation to perform on the graph path",
|
|
262
|
+
"name": "operation",
|
|
263
|
+
"options": [
|
|
264
|
+
"get",
|
|
265
|
+
"getItem",
|
|
266
|
+
"getCollection",
|
|
267
|
+
"createItem",
|
|
268
|
+
"updateItem",
|
|
269
|
+
"deleteItem"
|
|
270
|
+
],
|
|
271
|
+
"required": false
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
"description": "Query a running integration graph and print the response",
|
|
275
|
+
"examples": [
|
|
276
|
+
"<%= config.bin %> <%= command.id %> --path=/sobjects/Opportunity/records/abc123",
|
|
277
|
+
"<%= config.bin %> <%= command.id %> get --path=/sobjects/Opportunity --port=9201"
|
|
278
|
+
],
|
|
279
|
+
"flags": {
|
|
280
|
+
"json": {
|
|
281
|
+
"description": "Format output as json.",
|
|
282
|
+
"helpGroup": "GLOBAL",
|
|
283
|
+
"name": "json",
|
|
284
|
+
"allowNo": false,
|
|
285
|
+
"type": "boolean"
|
|
286
|
+
},
|
|
287
|
+
"path": {
|
|
288
|
+
"description": "Graph path to fetch (must start with /), e.g. /sobjects/Opportunity/records/abc123",
|
|
289
|
+
"name": "path",
|
|
290
|
+
"required": true,
|
|
291
|
+
"hasDynamicHelp": false,
|
|
292
|
+
"multiple": false,
|
|
293
|
+
"type": "option"
|
|
294
|
+
},
|
|
295
|
+
"port": {
|
|
296
|
+
"description": "Port the integration is running on",
|
|
297
|
+
"name": "port",
|
|
298
|
+
"default": 9200,
|
|
299
|
+
"hasDynamicHelp": false,
|
|
300
|
+
"multiple": false,
|
|
301
|
+
"type": "option"
|
|
302
|
+
},
|
|
303
|
+
"environment": {
|
|
304
|
+
"description": "the environment of the platform",
|
|
305
|
+
"name": "environment",
|
|
306
|
+
"default": "production",
|
|
307
|
+
"hasDynamicHelp": false,
|
|
308
|
+
"multiple": false,
|
|
309
|
+
"options": [
|
|
310
|
+
"local",
|
|
311
|
+
"staging",
|
|
312
|
+
"production"
|
|
313
|
+
],
|
|
314
|
+
"type": "option"
|
|
315
|
+
},
|
|
316
|
+
"test-account": {
|
|
317
|
+
"description": "test account to use",
|
|
318
|
+
"name": "test-account",
|
|
319
|
+
"default": "development",
|
|
320
|
+
"hasDynamicHelp": false,
|
|
321
|
+
"multiple": false,
|
|
322
|
+
"options": [
|
|
323
|
+
"development",
|
|
324
|
+
"compliance"
|
|
325
|
+
],
|
|
326
|
+
"type": "option"
|
|
327
|
+
},
|
|
328
|
+
"credential-payload": {
|
|
329
|
+
"description": "(advanced) credential payload to use.",
|
|
330
|
+
"exclusive": [
|
|
331
|
+
"credential-id"
|
|
332
|
+
],
|
|
333
|
+
"name": "credential-payload",
|
|
334
|
+
"hasDynamicHelp": false,
|
|
335
|
+
"multiple": false,
|
|
336
|
+
"type": "option"
|
|
337
|
+
},
|
|
338
|
+
"credential-id": {
|
|
339
|
+
"description": "(advanced) credential to use.",
|
|
340
|
+
"exclusive": [
|
|
341
|
+
"credential-payload"
|
|
342
|
+
],
|
|
343
|
+
"name": "credential-id",
|
|
344
|
+
"hasDynamicHelp": false,
|
|
345
|
+
"multiple": false,
|
|
346
|
+
"type": "option"
|
|
347
|
+
},
|
|
348
|
+
"config-path": {
|
|
349
|
+
"description": "Use a custom configuration file instead of the default '.unito.json'.\n\n If you want to force the CLI to use a specific configuration file, you can use this flag to specify the relative\n path from your integration's root folder (with a leading '/').\n\n Usage: <%= config.bin %> <%= command.id %> --config-path=/myCustomConfig.json",
|
|
350
|
+
"name": "config-path",
|
|
351
|
+
"summary": "relative path to a custom \".unito.json\" file",
|
|
352
|
+
"hasDynamicHelp": false,
|
|
353
|
+
"multiple": false,
|
|
354
|
+
"type": "option"
|
|
355
|
+
},
|
|
356
|
+
"output": {
|
|
357
|
+
"char": "o",
|
|
358
|
+
"description": "Write response body to file instead of stdout",
|
|
359
|
+
"name": "output",
|
|
360
|
+
"hasDynamicHelp": false,
|
|
361
|
+
"multiple": false,
|
|
362
|
+
"type": "option"
|
|
363
|
+
}
|
|
364
|
+
},
|
|
365
|
+
"hasDynamicHelp": false,
|
|
366
|
+
"hiddenAliases": [],
|
|
367
|
+
"id": "graph",
|
|
368
|
+
"pluginAlias": "@unito/integration-cli",
|
|
369
|
+
"pluginName": "@unito/integration-cli",
|
|
370
|
+
"pluginType": "core",
|
|
371
|
+
"strict": true,
|
|
372
|
+
"enableJsonFlag": true,
|
|
373
|
+
"isESM": false,
|
|
374
|
+
"relativePath": [
|
|
375
|
+
"dist",
|
|
376
|
+
"src",
|
|
377
|
+
"commands",
|
|
378
|
+
"graph.js"
|
|
379
|
+
]
|
|
380
|
+
},
|
|
256
381
|
"init": {
|
|
257
382
|
"aliases": [],
|
|
258
383
|
"args": {},
|
|
@@ -748,5 +873,5 @@
|
|
|
748
873
|
]
|
|
749
874
|
}
|
|
750
875
|
},
|
|
751
|
-
"version": "0.64.
|
|
876
|
+
"version": "0.64.6"
|
|
752
877
|
}
|