@acquis-consulting/asm 1.0.5
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 +0 -0
- package/dist/apps/gitDiffReview/gitDiffParser.d.ts +6 -0
- package/dist/apps/gitDiffReview/gitDiffParser.js +1 -0
- package/dist/apps/gitDiffReview/packageXml.d.ts +8 -0
- package/dist/apps/gitDiffReview/packageXml.js +1 -0
- package/dist/apps/gitDiffReview/tools.d.ts +42 -0
- package/dist/apps/gitDiffReview/tools.js +1 -0
- package/dist/apps/gitDiffReview/types.d.ts +19 -0
- package/dist/apps/gitDiffReview/types.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata-diff.html +98 -0
- package/dist/tools/aggregateQuery.d.ts +85 -0
- package/dist/tools/aggregateQuery.js +110 -0
- package/dist/tools/aggregateQuery.js.map +1 -0
- package/dist/tools/bulkExportAbort.d.ts +37 -0
- package/dist/tools/bulkExportAbort.js +44 -0
- package/dist/tools/bulkExportAbort.js.map +1 -0
- package/dist/tools/bulkExportResults.d.ts +51 -0
- package/dist/tools/bulkExportResults.js +76 -0
- package/dist/tools/bulkExportResults.js.map +1 -0
- package/dist/tools/bulkExportStart.d.ts +61 -0
- package/dist/tools/bulkExportStart.js +68 -0
- package/dist/tools/bulkExportStart.js.map +1 -0
- package/dist/tools/bulkExportStatus.d.ts +37 -0
- package/dist/tools/bulkExportStatus.js +54 -0
- package/dist/tools/bulkExportStatus.js.map +1 -0
- package/dist/tools/crossObjectSearch.d.ts +155 -0
- package/dist/tools/crossObjectSearch.js +145 -0
- package/dist/tools/crossObjectSearch.js.map +1 -0
- package/dist/tools/debugLogs.d.ts +106 -0
- package/dist/tools/debugLogs.js +189 -0
- package/dist/tools/debugLogs.js.map +1 -0
- package/dist/tools/deployMetadata.d.ts +60 -0
- package/dist/tools/deployMetadata.js +106 -0
- package/dist/tools/deployMetadata.js.map +1 -0
- package/dist/tools/deployPackage.d.ts +49 -0
- package/dist/tools/deployPackage.js +1 -0
- package/dist/tools/dml.d.ts +70 -0
- package/dist/tools/dml.js +105 -0
- package/dist/tools/dml.js.map +1 -0
- package/dist/tools/dmlDelete.d.ts +51 -0
- package/dist/tools/dmlDelete.js +71 -0
- package/dist/tools/dmlDelete.js.map +1 -0
- package/dist/tools/executeAnonymous.d.ts +63 -0
- package/dist/tools/executeAnonymous.js +77 -0
- package/dist/tools/executeAnonymous.js.map +1 -0
- package/dist/tools/fieldManagement.d.ts +222 -0
- package/dist/tools/fieldManagement.js +234 -0
- package/dist/tools/fieldManagement.js.map +1 -0
- package/dist/tools/fieldPermissions.d.ts +94 -0
- package/dist/tools/fieldPermissions.js +191 -0
- package/dist/tools/fieldPermissions.js.map +1 -0
- package/dist/tools/getDependencies.d.ts +58 -0
- package/dist/tools/getDependencies.js +105 -0
- package/dist/tools/getDependencies.js.map +1 -0
- package/dist/tools/listUserPermissions.d.ts +36 -0
- package/dist/tools/listUserPermissions.js +59 -0
- package/dist/tools/listUserPermissions.js.map +1 -0
- package/dist/tools/metadataDescribe.d.ts +37 -0
- package/dist/tools/metadataDescribe.js +35 -0
- package/dist/tools/metadataDescribe.js.map +1 -0
- package/dist/tools/metadataDiff.d.ts +66 -0
- package/dist/tools/metadataDiff.js +215 -0
- package/dist/tools/metadataDiff.js.map +1 -0
- package/dist/tools/metadataDiffFileDetail.d.ts +44 -0
- package/dist/tools/metadataDiffFileDetail.js +84 -0
- package/dist/tools/metadataDiffFileDetail.js.map +1 -0
- package/dist/tools/metadataDiffFiles.d.ts +37 -0
- package/dist/tools/metadataDiffFiles.js +72 -0
- package/dist/tools/metadataDiffFiles.js.map +1 -0
- package/dist/tools/metadataDiffGeneratePackage.d.ts +73 -0
- package/dist/tools/metadataDiffGeneratePackage.js +122 -0
- package/dist/tools/metadataDiffGeneratePackage.js.map +1 -0
- package/dist/tools/metadataImport.d.ts +63 -0
- package/dist/tools/metadataImport.js +122 -0
- package/dist/tools/metadataImport.js.map +1 -0
- package/dist/tools/metadataJobStatus.d.ts +44 -0
- package/dist/tools/metadataJobStatus.js +101 -0
- package/dist/tools/metadataJobStatus.js.map +1 -0
- package/dist/tools/metadataList.d.ts +44 -0
- package/dist/tools/metadataList.js +49 -0
- package/dist/tools/metadataList.js.map +1 -0
- package/dist/tools/metadataRead.d.ts +47 -0
- package/dist/tools/metadataRead.js +52 -0
- package/dist/tools/metadataRead.js.map +1 -0
- package/dist/tools/metadataTypeSchema.d.ts +44 -0
- package/dist/tools/metadataTypeSchema.js +101 -0
- package/dist/tools/metadataTypeSchema.js.map +1 -0
- package/dist/tools/metadataWsdl.d.ts +19 -0
- package/dist/tools/metadataWsdl.js +1 -0
- package/dist/tools/objectManagement.d.ts +107 -0
- package/dist/tools/objectManagement.js +123 -0
- package/dist/tools/objectManagement.js.map +1 -0
- package/dist/tools/objectPermissions.d.ts +101 -0
- package/dist/tools/objectPermissions.js +157 -0
- package/dist/tools/objectPermissions.js.map +1 -0
- package/dist/tools/objectSchema.d.ts +37 -0
- package/dist/tools/objectSchema.js +66 -0
- package/dist/tools/objectSchema.js.map +1 -0
- package/dist/tools/objectSearch.d.ts +37 -0
- package/dist/tools/objectSearch.js +44 -0
- package/dist/tools/objectSearch.js.map +1 -0
- package/dist/tools/packageStatus.d.ts +24 -0
- package/dist/tools/packageStatus.js +1 -0
- package/dist/tools/permissionSetAssignment.d.ts +39 -0
- package/dist/tools/permissionSetAssignment.js +1 -0
- package/dist/tools/readApexClasses.d.ts +50 -0
- package/dist/tools/readApexClasses.js +83 -0
- package/dist/tools/readApexClasses.js.map +1 -0
- package/dist/tools/readApexTriggers.d.ts +50 -0
- package/dist/tools/readApexTriggers.js +82 -0
- package/dist/tools/readApexTriggers.js.map +1 -0
- package/dist/tools/recordPicker.d.ts +48 -0
- package/dist/tools/recordPicker.js +1 -0
- package/dist/tools/recordQuery.d.ts +68 -0
- package/dist/tools/recordQuery.js +131 -0
- package/dist/tools/recordQuery.js.map +1 -0
- package/dist/tools/retrieveJobStatus.d.ts +51 -0
- package/dist/tools/retrieveJobStatus.js +192 -0
- package/dist/tools/retrieveJobStatus.js.map +1 -0
- package/dist/tools/retrieveMetadata.d.ts +79 -0
- package/dist/tools/retrieveMetadata.js +225 -0
- package/dist/tools/retrieveMetadata.js.map +1 -0
- package/dist/tools/retrievePackage.d.ts +37 -0
- package/dist/tools/retrievePackage.js +1 -0
- package/dist/tools/salesforceLogin.d.ts +36 -0
- package/dist/tools/salesforceLogin.js +75 -0
- package/dist/tools/salesforceLogin.js.map +1 -0
- package/dist/tools/selectOrg.d.ts +25 -0
- package/dist/tools/selectOrg.js +91 -0
- package/dist/tools/selectOrg.js.map +1 -0
- package/dist/tools/toolingQuery.d.ts +37 -0
- package/dist/tools/toolingQuery.js +54 -0
- package/dist/tools/toolingQuery.js.map +1 -0
- package/dist/tools/userPermissions.d.ts +76 -0
- package/dist/tools/userPermissions.js +130 -0
- package/dist/tools/userPermissions.js.map +1 -0
- package/dist/tools/versionMetadataComplete.d.ts +45 -0
- package/dist/tools/versionMetadataComplete.js +1 -0
- package/dist/tools/versionMetadataStart.d.ts +25 -0
- package/dist/tools/versionMetadataStart.js +1 -0
- package/dist/tools/versionMetadataStatus.d.ts +25 -0
- package/dist/tools/versionMetadataStatus.js +1 -0
- package/dist/tools/writeApexClasses.d.ts +64 -0
- package/dist/tools/writeApexClasses.js +79 -0
- package/dist/tools/writeApexClasses.js.map +1 -0
- package/dist/tools/writeApexTriggers.d.ts +71 -0
- package/dist/tools/writeApexTriggers.js +96 -0
- package/dist/tools/writeApexTriggers.js.map +1 -0
- package/dist/types/connection.d.ts +20 -0
- package/dist/types/connection.js +9 -0
- package/dist/types/connection.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metadata.d.ts +44 -0
- package/dist/types/metadata.js +2 -0
- package/dist/types/metadata.js.map +1 -0
- package/dist/types/salesforce.d.ts +38 -0
- package/dist/types/salesforce.js +2 -0
- package/dist/types/salesforce.js.map +1 -0
- package/dist/utils/apexContainer.d.ts +18 -0
- package/dist/utils/apexContainer.js +79 -0
- package/dist/utils/apexContainer.js.map +1 -0
- package/dist/utils/connection.d.ts +3 -0
- package/dist/utils/connection.js +135 -0
- package/dist/utils/connection.js.map +1 -0
- package/dist/utils/decomposePermissions.d.ts +16 -0
- package/dist/utils/decomposePermissions.js +188 -0
- package/dist/utils/decomposePermissions.js.map +1 -0
- package/dist/utils/dxPathMapper.d.ts +16 -0
- package/dist/utils/dxPathMapper.js +217 -0
- package/dist/utils/dxPathMapper.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.js +40 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/oauthWebFlow.d.ts +8 -0
- package/dist/utils/oauthWebFlow.js +172 -0
- package/dist/utils/oauthWebFlow.js.map +1 -0
- package/dist/utils/packageJobs.d.ts +17 -0
- package/dist/utils/packageJobs.js +1 -0
- package/dist/utils/packageXml.d.ts +18 -0
- package/dist/utils/packageXml.js +1 -0
- package/dist/utils/permissionSetResolver.d.ts +14 -0
- package/dist/utils/permissionSetResolver.js +1 -0
- package/dist/utils/preSelectMatcher.d.ts +18 -0
- package/dist/utils/preSelectMatcher.js +1 -0
- package/dist/utils/profileCleanup.d.ts +18 -0
- package/dist/utils/profileCleanup.js +1 -0
- package/dist/utils/retrieveStore.d.ts +12 -0
- package/dist/utils/retrieveStore.js +1 -0
- package/dist/utils/sfCli.d.ts +18 -0
- package/dist/utils/sfCli.js +130 -0
- package/dist/utils/sfCli.js.map +1 -0
- package/dist/utils/tokenBroker.d.ts +13 -0
- package/dist/utils/tokenBroker.js +73 -0
- package/dist/utils/tokenBroker.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import http from 'http';
|
|
3
|
+
import { exec } from 'child_process';
|
|
4
|
+
// In-memory token store (cleared on process restart)
|
|
5
|
+
let storedToken = null;
|
|
6
|
+
export function getOAuthWebFlowToken() {
|
|
7
|
+
return storedToken;
|
|
8
|
+
}
|
|
9
|
+
export function setOAuthWebFlowToken(accessToken, instanceUrl) {
|
|
10
|
+
storedToken = { accessToken, instanceUrl };
|
|
11
|
+
}
|
|
12
|
+
function generateCodeVerifier() {
|
|
13
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
14
|
+
}
|
|
15
|
+
function generateCodeChallenge(verifier) {
|
|
16
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
17
|
+
}
|
|
18
|
+
function generateState() {
|
|
19
|
+
return crypto.randomBytes(16).toString('hex');
|
|
20
|
+
}
|
|
21
|
+
function openBrowser(url) {
|
|
22
|
+
const platform = process.platform;
|
|
23
|
+
let cmd;
|
|
24
|
+
if (platform === 'darwin') {
|
|
25
|
+
cmd = `open "${url}"`;
|
|
26
|
+
}
|
|
27
|
+
else if (platform === 'win32') {
|
|
28
|
+
cmd = `start "" "${url}"`;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
cmd = `xdg-open "${url}"`;
|
|
32
|
+
}
|
|
33
|
+
exec(cmd, (err) => {
|
|
34
|
+
if (err)
|
|
35
|
+
console.error('[oauth] Failed to open browser:', err.message);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const SUCCESS_HTML = `<!DOCTYPE html>
|
|
39
|
+
<html>
|
|
40
|
+
<head><title>Login Successful</title><style>
|
|
41
|
+
body { font-family: sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0; background: #f4f6f8; }
|
|
42
|
+
.card { background: white; border-radius: 8px; padding: 40px; text-align: center; box-shadow: 0 2px 12px rgba(0,0,0,0.1); }
|
|
43
|
+
h2 { color: #1a73e8; } p { color: #5f6368; }
|
|
44
|
+
</style></head>
|
|
45
|
+
<body><div class="card"><h2>✓ Login successful</h2><p>You can close this tab and return to your AI assistant.</p></div></body>
|
|
46
|
+
</html>`;
|
|
47
|
+
const ERROR_HTML = (msg) => `<!DOCTYPE html>
|
|
48
|
+
<html>
|
|
49
|
+
<head><title>Login Failed</title><style>
|
|
50
|
+
body { font-family: sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0; background: #f4f6f8; }
|
|
51
|
+
.card { background: white; border-radius: 8px; padding: 40px; text-align: center; box-shadow: 0 2px 12px rgba(0,0,0,0.1); }
|
|
52
|
+
h2 { color: #d93025; } p { color: #5f6368; }
|
|
53
|
+
</style></head>
|
|
54
|
+
<body><div class="card"><h2>✗ Login failed</h2><p>${msg}</p><p>You can close this tab and try again.</p></div></body>
|
|
55
|
+
</html>`;
|
|
56
|
+
function waitForCallback(port, expectedState, timeoutMs = 120000) {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
let settled = false;
|
|
59
|
+
const server = http.createServer((req, res) => {
|
|
60
|
+
if (!req.url)
|
|
61
|
+
return;
|
|
62
|
+
let url;
|
|
63
|
+
try {
|
|
64
|
+
url = new URL(req.url, `http://localhost:${port}`);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (url.pathname !== '/callback') {
|
|
70
|
+
res.writeHead(404);
|
|
71
|
+
res.end();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const error = url.searchParams.get('error');
|
|
75
|
+
const errorDescription = url.searchParams.get('error_description') ?? error ?? 'Unknown error';
|
|
76
|
+
const code = url.searchParams.get('code');
|
|
77
|
+
const state = url.searchParams.get('state');
|
|
78
|
+
if (error) {
|
|
79
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
80
|
+
res.end(ERROR_HTML(errorDescription));
|
|
81
|
+
if (!settled) {
|
|
82
|
+
settled = true;
|
|
83
|
+
server.close();
|
|
84
|
+
reject(new Error(`Salesforce OAuth error: ${errorDescription}`));
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!code) {
|
|
89
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
90
|
+
res.end(ERROR_HTML('No authorization code received.'));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (state !== expectedState) {
|
|
94
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
95
|
+
res.end(ERROR_HTML('Invalid state parameter. Possible CSRF attempt.'));
|
|
96
|
+
if (!settled) {
|
|
97
|
+
settled = true;
|
|
98
|
+
server.close();
|
|
99
|
+
reject(new Error('OAuth state mismatch — possible CSRF attempt'));
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
104
|
+
res.end(SUCCESS_HTML);
|
|
105
|
+
if (!settled) {
|
|
106
|
+
settled = true;
|
|
107
|
+
server.close();
|
|
108
|
+
resolve({ code });
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
server.on('error', (err) => {
|
|
112
|
+
if (!settled) {
|
|
113
|
+
settled = true;
|
|
114
|
+
reject(new Error(err.code === 'EADDRINUSE'
|
|
115
|
+
? `Port ${port} is already in use. Set SALESFORCE_OAUTH_CALLBACK_PORT to a different port.`
|
|
116
|
+
: `Callback server error: ${err.message}`));
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
server.listen(port);
|
|
120
|
+
const timer = setTimeout(() => {
|
|
121
|
+
if (!settled) {
|
|
122
|
+
settled = true;
|
|
123
|
+
server.close();
|
|
124
|
+
reject(new Error('OAuth callback timed out after 120 seconds. Please try again.'));
|
|
125
|
+
}
|
|
126
|
+
}, timeoutMs);
|
|
127
|
+
// Prevent the timer from blocking Node process exit
|
|
128
|
+
if (timer.unref)
|
|
129
|
+
timer.unref();
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async function exchangeCodeForToken(loginUrl, clientId, redirectUri, code, codeVerifier) {
|
|
133
|
+
const params = new URLSearchParams({
|
|
134
|
+
grant_type: 'authorization_code',
|
|
135
|
+
client_id: clientId,
|
|
136
|
+
redirect_uri: redirectUri,
|
|
137
|
+
code,
|
|
138
|
+
code_verifier: codeVerifier,
|
|
139
|
+
});
|
|
140
|
+
const response = await fetch(`${loginUrl}/services/oauth2/token`, {
|
|
141
|
+
method: 'POST',
|
|
142
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
143
|
+
body: params.toString(),
|
|
144
|
+
});
|
|
145
|
+
if (!response.ok) {
|
|
146
|
+
const body = await response.text();
|
|
147
|
+
throw new Error(`Token exchange failed (${response.status}): ${body}`);
|
|
148
|
+
}
|
|
149
|
+
const data = await response.json();
|
|
150
|
+
return { accessToken: data.access_token, instanceUrl: data.instance_url };
|
|
151
|
+
}
|
|
152
|
+
export async function startOAuthWebFlow(loginUrl, clientId, callbackPort) {
|
|
153
|
+
const codeVerifier = generateCodeVerifier();
|
|
154
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
155
|
+
const state = generateState();
|
|
156
|
+
const redirectUri = `http://localhost:${callbackPort}/callback`;
|
|
157
|
+
const authUrl = new URL(`${loginUrl}/services/oauth2/authorize`);
|
|
158
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
159
|
+
authUrl.searchParams.set('client_id', clientId);
|
|
160
|
+
authUrl.searchParams.set('redirect_uri', redirectUri);
|
|
161
|
+
authUrl.searchParams.set('scope', 'api refresh_token');
|
|
162
|
+
authUrl.searchParams.set('state', state);
|
|
163
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
164
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
165
|
+
console.error(`[oauth] Opening browser for authorization: ${authUrl.toString()}`);
|
|
166
|
+
openBrowser(authUrl.toString());
|
|
167
|
+
const { code } = await waitForCallback(callbackPort, state);
|
|
168
|
+
const { accessToken, instanceUrl } = await exchangeCodeForToken(loginUrl, clientId, redirectUri, code, codeVerifier);
|
|
169
|
+
setOAuthWebFlowToken(accessToken, instanceUrl);
|
|
170
|
+
return { instanceUrl };
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=oauthWebFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthWebFlow.js","sourceRoot":"","sources":["../../src/utils/oauthWebFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process job tracking for async retrieve/deploy operations.
|
|
3
|
+
* The shared status tool uses this store to look up active jobs.
|
|
4
|
+
*/
|
|
5
|
+
import type { Connection } from 'jsforce';
|
|
6
|
+
import type { ComponentMap } from './packageXml.js';
|
|
7
|
+
export interface PackageJob {
|
|
8
|
+
type: 'retrieve' | 'deploy';
|
|
9
|
+
id: string;
|
|
10
|
+
conn: Connection;
|
|
11
|
+
startedAt: number;
|
|
12
|
+
outputDirectory?: string;
|
|
13
|
+
componentMap?: ComponentMap;
|
|
14
|
+
}
|
|
15
|
+
export declare function registerJob(job: PackageJob): void;
|
|
16
|
+
export declare function getJob(id: string): PackageJob | undefined;
|
|
17
|
+
export declare function removeJob(id: string): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=new Map;export function registerJob(t){e.set(t.id,t)}export function getJob(t){return e.get(t)}export function removeJob(t){e.delete(t)}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for generating package.xml and converting component maps
|
|
3
|
+
* to jsforce's metadata retrieve format.
|
|
4
|
+
*/
|
|
5
|
+
export interface PackageType {
|
|
6
|
+
name: string;
|
|
7
|
+
members: string[];
|
|
8
|
+
}
|
|
9
|
+
export type ComponentMap = Record<string, string[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Converts a component map like `{ "ApexClass": ["MyClass"] }`
|
|
12
|
+
* to jsforce's `{ name, members }[]` format.
|
|
13
|
+
*/
|
|
14
|
+
export declare function componentMapToPackageTypes(map: ComponentMap): PackageType[];
|
|
15
|
+
/**
|
|
16
|
+
* Generates a `package.xml` XML string from a component map.
|
|
17
|
+
*/
|
|
18
|
+
export declare function generatePackageXml(map: ComponentMap, apiVersion?: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function componentMapToPackageTypes(e){return Object.entries(e).map(([e,n])=>({name:e,members:n}))}export function generatePackageXml(n,a="62.0"){return`<?xml version="1.0" encoding="UTF-8"?>\n<Package xmlns="http://soap.sforce.com/2006/04/metadata">\n${componentMapToPackageTypes(n).map(n=>` <types>\n${n.members.map(n=>` <members>${e(n)}</members>`).join("\n")}\n <name>${e(n.name)}</name>\n </types>`).join("\n")}\n <version>${a}</version>\n</Package>`}function e(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Connection } from 'jsforce';
|
|
2
|
+
export interface ResolvedPermissionSet {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
type: 'Profile' | 'PermissionSet';
|
|
6
|
+
}
|
|
7
|
+
export interface ResolveResult {
|
|
8
|
+
resolved: ResolvedPermissionSet[];
|
|
9
|
+
errors: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function resolvePermissionSets(conn: Connection, opts: {
|
|
12
|
+
profileNames?: string[];
|
|
13
|
+
permissionSetNames?: string[];
|
|
14
|
+
}): Promise<ResolveResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export async function resolvePermissionSets(e,s){const o=[],r=[];if(s.profileNames?.length)for(const i of s.profileNames)try{const s=await e.query(`SELECT Id FROM Profile WHERE Name = '${i.replace(/'/g,"\\'")}'`);if(!s.records?.length){r.push(`Profile "${i}" not found`);continue}const t=s.records[0].Id,n=await e.query(`SELECT Id, Label FROM PermissionSet WHERE ProfileId = '${t}' AND IsOwnedByProfile = true`);if(!n.records?.length){r.push(`No permission set found for profile "${i}"`);continue}const l=n.records[0];o.push({id:l.Id,label:i,type:"Profile"})}catch(e){r.push(`Failed to resolve profile "${i}": ${e.message}`)}if(s.permissionSetNames?.length)for(const i of s.permissionSetNames)try{const s=await e.query(`SELECT Id, Label FROM PermissionSet WHERE Name = '${i.replace(/'/g,"\\'")}' AND IsOwnedByProfile = false`);if(!s.records?.length){r.push(`Permission set "${i}" not found (use DeveloperName)`);continue}const t=s.records[0];o.push({id:t.Id,label:t.Label,type:"PermissionSet"})}catch(e){r.push(`Failed to resolve permission set "${i}": ${e.message}`)}return{resolved:o,errors:r}}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface MatchableFile {
|
|
2
|
+
metadataType: string | null;
|
|
3
|
+
componentName: string | null;
|
|
4
|
+
}
|
|
5
|
+
export interface PreSelectionResult {
|
|
6
|
+
matched: Set<string>;
|
|
7
|
+
unmatched: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolve pre-selection entries against a list of diff files.
|
|
11
|
+
*
|
|
12
|
+
* Each entry can be:
|
|
13
|
+
* - Bare name: "AccountTrigger" — case-insensitive match on componentName
|
|
14
|
+
* - Qualified: "ApexClass::AccountTrigger" — exact match on metadataType + componentName
|
|
15
|
+
*
|
|
16
|
+
* Returns matched keys as "metadataType::componentName" and unmatched original strings.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolvePreSelections(preSelections: string[], files: MatchableFile[]): PreSelectionResult;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function resolvePreSelections(e,t){const o=new Set,n=[];for(const a of e){const e=a.trim(),m=e.indexOf("::");let r=!1;if(-1!==m){const n=e.substring(0,m).trim(),a=e.substring(m+2).trim();for(const e of t)e.metadataType===n&&e.componentName?.trim()===a&&(o.add(`${e.metadataType}::${e.componentName}`),r=!0)}else{const n=e.toLowerCase();for(const e of t)e.componentName&&e.componentName.trim().toLowerCase()===n&&(o.add(`${e.metadataType}::${e.componentName}`),r=!0)}r||n.push(e)}return{matched:o,unmatched:n}}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-retrieve cleanup for Profile and PermissionSet XML files.
|
|
3
|
+
*
|
|
4
|
+
* Salesforce returns the FULL profile/permissionset XML on retrieve,
|
|
5
|
+
* including permissions for components NOT in the package. Deploying
|
|
6
|
+
* these unfiltered files would overwrite unrelated permissions in the
|
|
7
|
+
* target org. This module strips each XML down to only the permission
|
|
8
|
+
* sections that reference components present in the componentMap.
|
|
9
|
+
*/
|
|
10
|
+
import type { ComponentMap } from './packageXml.js';
|
|
11
|
+
/**
|
|
12
|
+
* Clean Profile and PermissionSet XML files in the output directory,
|
|
13
|
+
* keeping only permission sections that reference components in the
|
|
14
|
+
* componentMap.
|
|
15
|
+
*
|
|
16
|
+
* @returns Number of files cleaned.
|
|
17
|
+
*/
|
|
18
|
+
export declare function cleanProfileAndPermissionSetFiles(outputDir: string, componentMap: ComponentMap): Promise<number>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readdir as e,readFile as t,writeFile as s}from"node:fs/promises";import{join as n,extname as i}from"node:path";import{XMLParser as o,XMLBuilder as l}from"fast-xml-parser";const r={CustomField:[{element:"fieldPermissions",keyChild:"field"}],CustomObject:[{element:"objectPermissions",keyChild:"object"}],ApexClass:[{element:"classAccesses",keyChild:"apexClass"}],ApexPage:[{element:"pageAccesses",keyChild:"apexPage"}],Layout:[{element:"layoutAssignments",keyChild:"layout"}],RecordType:[{element:"recordTypeVisibilities",keyChild:"recordType"}],CustomTab:[{element:"tabVisibilities",keyChild:"tab"},{element:"tabSettings",keyChild:"tab"}],CustomApplication:[{element:"applicationVisibilities",keyChild:"application"}],Flow:[{element:"flowAccesses",keyChild:"flow"}],CustomPermission:[{element:"customPermissions",keyChild:"name"}],CustomMetadataType:[{element:"customMetadataTypeAccesses",keyChild:"name"}],CustomSetting:[{element:"customSettingAccesses",keyChild:"name"}]},a=new Set(["userPermissions"]),c=new Set(Object.values(r).flatMap(e=>e.map(e=>e.element))),m={ignoreAttributes:!1,attributeNamePrefix:"@_",parseTagValue:!1,trimValues:!1},f={ignoreAttributes:!1,attributeNamePrefix:"@_",format:!0,indentBy:" ",suppressEmptyNode:!1};export async function cleanProfileAndPermissionSetFiles(d,p){const y=function(e){const t=new Map;for(const[s,n]of Object.entries(e)){if("Profile"===s||"PermissionSet"===s)continue;const e=r[s];if(!e)continue;const i=n.includes("*");for(const{element:s}of e)if(i)t.set(s,null);else{const e=t.get(s);if(null===e)continue;const i=e||new Set;for(const e of n)i.add(e);t.set(s,i)}}return t}(p);if(0===y.size)return 0;const h=await async function(t){const s=[];return await async function t(o){let l;try{l=await e(o,{withFileTypes:!0})}catch{return}for(const e of l){const l=n(o,e.name);if(e.isDirectory())await t(l);else{const t=i(e.name);".profile"!==t&&".permissionset"!==t||s.push(l)}}}(t),s}(d);if(0===h.length)return 0;const C=new o(m),b=new l(f);let g=0;for(const e of h)try{const n=await t(e,"utf-8"),i=C.parse(n),o=Object.keys(i).find(e=>"Profile"===e||"PermissionSet"===e);if(!o)continue;const l=i[o];let r=!1;for(const e of a)void 0!==l[e]&&(delete l[e],r=!0);for(const[e,t]of y.entries()){if(void 0===l[e])continue;const s=u(e);if(!s)continue;if(null===t)continue;const n=Array.isArray(l[e])?l[e]:[l[e]],i=n.filter(e=>{const n=e[s];return null!=n&&t.has(String(n))});i.length!==n.length&&(r=!0,0===i.length?delete l[e]:l[e]=1===i.length?i[0]:i)}for(const e of c)y.has(e)||void 0===l[e]||(delete l[e],r=!0);if(r){const t=n.match(/^<\?xml[^?]*\?>\s*/);delete i["?xml"];const o=b.build(i).replace(/\n\s*\n/g,"\n").trimEnd()+"\n",l=t?t[0].trimEnd()+"\n"+o:o;await s(e,l,"utf-8"),g++}}catch(t){process.stderr.write(`[profileCleanup] Failed to clean ${e}: ${t.message}\n`)}return g}function u(e){for(const t of Object.values(r))for(const s of t)if(s.element===e)return s.keyChild}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface RetrieveEntry {
|
|
2
|
+
retrieveId: string;
|
|
3
|
+
status: 'InProgress' | 'Succeeded' | 'Failed';
|
|
4
|
+
packageXml: string;
|
|
5
|
+
tempDir: string;
|
|
6
|
+
zipPath?: string;
|
|
7
|
+
errorMessage?: string;
|
|
8
|
+
createdAt: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function getRetrieveEntry(retrieveId: string): RetrieveEntry | undefined;
|
|
11
|
+
export declare function setRetrieveEntry(entry: RetrieveEntry): void;
|
|
12
|
+
export declare function deleteRetrieveEntry(retrieveId: string): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=new Map;export function getRetrieveEntry(t){return e.get(t)}export function setRetrieveEntry(t){e.set(t.retrieveId,t)}export function deleteRetrieveEntry(t){e.delete(t)}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Connection } from 'jsforce';
|
|
2
|
+
export interface SfCliResult {
|
|
3
|
+
exitCode: number;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
jsonOutput?: any;
|
|
7
|
+
}
|
|
8
|
+
export declare function resolveBaseOutputDir(): string;
|
|
9
|
+
export declare function createJobDir(baseDir: string): string;
|
|
10
|
+
export declare function runSfCli(args: string[], options?: {
|
|
11
|
+
timeout?: number;
|
|
12
|
+
stdin?: string;
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
cwd?: string;
|
|
15
|
+
}): Promise<SfCliResult>;
|
|
16
|
+
export declare function ensureSfCli(): Promise<void>;
|
|
17
|
+
export declare function authenticateOrg(conn: Connection): Promise<string>;
|
|
18
|
+
export declare function createSfdxProjectJson(dir: string): void;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { mkdirSync, writeFileSync, accessSync, constants } from 'fs';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
const SF_CLI_ALIAS = 'mcp-session';
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
8
|
+
export function resolveBaseOutputDir() {
|
|
9
|
+
return process.env.SALESFORCE_EXPORT_DIR || join(tmpdir(), 'salesforce-retrieve');
|
|
10
|
+
}
|
|
11
|
+
export function createJobDir(baseDir) {
|
|
12
|
+
const jobDir = join(baseDir, randomUUID());
|
|
13
|
+
mkdirSync(jobDir, { recursive: true });
|
|
14
|
+
// Validate writability
|
|
15
|
+
accessSync(jobDir, constants.W_OK);
|
|
16
|
+
return jobDir;
|
|
17
|
+
}
|
|
18
|
+
export function runSfCli(args, options) {
|
|
19
|
+
const timeout = options?.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
20
|
+
const hasJson = args.includes('--json');
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
const child = spawn('sf', args, {
|
|
23
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
24
|
+
timeout,
|
|
25
|
+
env: options?.env ? { ...process.env, ...options.env } : undefined,
|
|
26
|
+
cwd: options?.cwd,
|
|
27
|
+
});
|
|
28
|
+
let stdout = '';
|
|
29
|
+
let stderr = '';
|
|
30
|
+
child.stdout.on('data', (data) => { stdout += data.toString(); });
|
|
31
|
+
child.stderr.on('data', (data) => {
|
|
32
|
+
const chunk = data.toString();
|
|
33
|
+
stderr += chunk;
|
|
34
|
+
process.stderr.write(chunk);
|
|
35
|
+
});
|
|
36
|
+
if (options?.stdin) {
|
|
37
|
+
child.stdin.write(options.stdin);
|
|
38
|
+
child.stdin.end();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
child.stdin.end();
|
|
42
|
+
}
|
|
43
|
+
child.on('error', (err) => {
|
|
44
|
+
if (err.code === 'ENOENT') {
|
|
45
|
+
reject(new Error('Salesforce CLI (sf) is not installed or not on PATH. ' +
|
|
46
|
+
'Install it from https://developer.salesforce.com/tools/salesforcecli'));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
reject(err);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
child.on('close', (code) => {
|
|
53
|
+
const result = {
|
|
54
|
+
exitCode: code ?? 1,
|
|
55
|
+
stdout,
|
|
56
|
+
stderr,
|
|
57
|
+
};
|
|
58
|
+
if (hasJson && stdout.trim()) {
|
|
59
|
+
try {
|
|
60
|
+
result.jsonOutput = JSON.parse(stdout);
|
|
61
|
+
}
|
|
62
|
+
catch { /* leave undefined */ }
|
|
63
|
+
}
|
|
64
|
+
resolve(result);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
export async function ensureSfCli() {
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
const child = spawn('sf', ['--version'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
71
|
+
let stderr = '';
|
|
72
|
+
child.stderr.on('data', (data) => { stderr += data.toString(); });
|
|
73
|
+
child.on('error', (err) => {
|
|
74
|
+
if (err.code === 'ENOENT') {
|
|
75
|
+
reject(new Error('Salesforce CLI (sf) is not installed or not on PATH. ' +
|
|
76
|
+
'Install it from https://developer.salesforce.com/tools/salesforcecli'));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
reject(err);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
child.on('close', (code) => {
|
|
83
|
+
if (code !== 0) {
|
|
84
|
+
reject(new Error(`sf --version failed (exit ${code}): ${stderr}`));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
resolve();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const SESSION_ID_PATTERN = /^[a-zA-Z0-9]{15,18}!/;
|
|
93
|
+
export async function authenticateOrg(conn) {
|
|
94
|
+
let accessToken = conn.accessToken?.trim();
|
|
95
|
+
const instanceUrl = conn.instanceUrl;
|
|
96
|
+
if (!accessToken || !instanceUrl) {
|
|
97
|
+
throw new Error('Connection missing accessToken or instanceUrl — cannot authenticate sf CLI');
|
|
98
|
+
}
|
|
99
|
+
// sf CLI requires tokens in "orgId!token" format — construct it if missing
|
|
100
|
+
if (!SESSION_ID_PATTERN.test(accessToken)) {
|
|
101
|
+
const idResult = await conn.identity();
|
|
102
|
+
const orgId = idResult?.organization_id;
|
|
103
|
+
if (!orgId) {
|
|
104
|
+
throw new Error('Access token lacks the "orgId!token" format required by sf CLI and org identity lookup failed.');
|
|
105
|
+
}
|
|
106
|
+
accessToken = `${orgId}!${accessToken}`;
|
|
107
|
+
}
|
|
108
|
+
const result = await runSfCli([
|
|
109
|
+
'org', 'login', 'access-token',
|
|
110
|
+
'--instance-url', instanceUrl,
|
|
111
|
+
'--alias', SF_CLI_ALIAS,
|
|
112
|
+
'--no-prompt',
|
|
113
|
+
'--json',
|
|
114
|
+
], { env: { SF_ACCESS_TOKEN: accessToken } });
|
|
115
|
+
if (result.exitCode !== 0) {
|
|
116
|
+
const msg = result.jsonOutput?.message || result.stderr || 'Unknown error';
|
|
117
|
+
throw new Error(`sf org login failed (exit ${result.exitCode}): ${msg}`);
|
|
118
|
+
}
|
|
119
|
+
return SF_CLI_ALIAS;
|
|
120
|
+
}
|
|
121
|
+
export function createSfdxProjectJson(dir) {
|
|
122
|
+
const project = {
|
|
123
|
+
packageDirectories: [{ path: '.', default: true }],
|
|
124
|
+
namespace: '',
|
|
125
|
+
sfdcLoginUrl: 'https://login.salesforce.com',
|
|
126
|
+
sourceApiVersion: '62.0',
|
|
127
|
+
};
|
|
128
|
+
writeFileSync(join(dir, 'sfdx-project.json'), JSON.stringify(project, null, 2));
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=sfCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfCli.js","sourceRoot":"","sources":["../../src/utils/sfCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface OrgInfo {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
environment: string;
|
|
5
|
+
instance_url: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getSelectedOrgId(): string | null;
|
|
8
|
+
export declare function setSelectedOrgId(orgId: string): void;
|
|
9
|
+
export declare function listOrgs(): Promise<OrgInfo[]>;
|
|
10
|
+
export declare function getAccessToken(orgId: string): Promise<{
|
|
11
|
+
accessToken: string;
|
|
12
|
+
instanceUrl: string;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Token cache: orgId -> cached token entry
|
|
2
|
+
const tokenCache = new Map();
|
|
3
|
+
// Session-scoped org selection
|
|
4
|
+
let selectedOrgId = null;
|
|
5
|
+
export function getSelectedOrgId() {
|
|
6
|
+
return selectedOrgId;
|
|
7
|
+
}
|
|
8
|
+
export function setSelectedOrgId(orgId) {
|
|
9
|
+
selectedOrgId = orgId;
|
|
10
|
+
}
|
|
11
|
+
function getBrokerConfig() {
|
|
12
|
+
const brokerUrl = process.env.ACQUIS_BROKER_URL;
|
|
13
|
+
const apiKey = process.env.ACQUIS_API_KEY;
|
|
14
|
+
if (!brokerUrl) {
|
|
15
|
+
throw new Error('ACQUIS_BROKER_URL environment variable is required for access_token authentication');
|
|
16
|
+
}
|
|
17
|
+
if (!apiKey) {
|
|
18
|
+
throw new Error('ACQUIS_API_KEY environment variable is required for access_token authentication');
|
|
19
|
+
}
|
|
20
|
+
return { brokerUrl: brokerUrl.replace(/\/$/, ''), apiKey };
|
|
21
|
+
}
|
|
22
|
+
export async function listOrgs() {
|
|
23
|
+
const { brokerUrl, apiKey } = getBrokerConfig();
|
|
24
|
+
const response = await fetch(`${brokerUrl}/api/v1/orgs`, {
|
|
25
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
26
|
+
});
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
const errorText = await response.text();
|
|
29
|
+
throw new Error(`Failed to list orgs (${response.status}): ${errorText}`);
|
|
30
|
+
}
|
|
31
|
+
const body = await response.json();
|
|
32
|
+
// Log raw shape to stderr for debugging (stdout is reserved for MCP JSON-RPC)
|
|
33
|
+
process.stderr.write(`[tokenBroker] listOrgs raw response: ${JSON.stringify(body)}\n`);
|
|
34
|
+
// Handle plain array
|
|
35
|
+
if (Array.isArray(body))
|
|
36
|
+
return body;
|
|
37
|
+
// Handle common wrapper shapes: { orgs: [] }, { data: [] }, { results: [] }, { items: [] }
|
|
38
|
+
for (const key of ['orgs', 'data', 'results', 'items']) {
|
|
39
|
+
if (Array.isArray(body[key]))
|
|
40
|
+
return body[key];
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Unexpected response shape from GET /api/v1/orgs. ` +
|
|
43
|
+
`Expected an array or a wrapped array. Got: ${JSON.stringify(body)}`);
|
|
44
|
+
}
|
|
45
|
+
export async function getAccessToken(orgId) {
|
|
46
|
+
const now = Date.now();
|
|
47
|
+
const cached = tokenCache.get(orgId);
|
|
48
|
+
if (cached && cached.expiresAt > now) {
|
|
49
|
+
return { accessToken: cached.accessToken, instanceUrl: cached.instanceUrl };
|
|
50
|
+
}
|
|
51
|
+
const { brokerUrl, apiKey } = getBrokerConfig();
|
|
52
|
+
const response = await fetch(`${brokerUrl}/api/v1/orgs/${encodeURIComponent(orgId)}/token`, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
55
|
+
});
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
const errorText = await response.text();
|
|
58
|
+
throw new Error(`Failed to get access token for org "${orgId}" (${response.status}): ${errorText}`);
|
|
59
|
+
}
|
|
60
|
+
const data = await response.json();
|
|
61
|
+
if (!data.access_token || !data.instance_url) {
|
|
62
|
+
throw new Error(`Token broker returned an invalid response for org "${orgId}": missing access_token or instance_url`);
|
|
63
|
+
}
|
|
64
|
+
// Cache with a 60-second safety buffer before actual expiry
|
|
65
|
+
const expiresAt = now + (data.expires_in - 60) * 1000;
|
|
66
|
+
tokenCache.set(orgId, {
|
|
67
|
+
accessToken: data.access_token,
|
|
68
|
+
instanceUrl: data.instance_url,
|
|
69
|
+
expiresAt,
|
|
70
|
+
});
|
|
71
|
+
return { accessToken: data.access_token, instanceUrl: data.instance_url };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=tokenBroker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenBroker.js","sourceRoot":"","sources":["../../src/utils/tokenBroker.ts"],"names":[],"mappings":"AAoBA,2CAA2C;AAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;AAElD,+BAA+B;AAC/B,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,aAAa,GAAG,KAAK,CAAC;AACxB,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACrG,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAEhD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,cAAc,EAAE;QACvD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvF,qBAAqB;IACrB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAiB,CAAC;IAElD,2FAA2F;IAC3F,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,CAAC,OAAO,CAAE,IAAY,CAAC,GAAG,CAAC,CAAC;YAAE,OAAQ,IAAY,CAAC,GAAG,CAAc,CAAC;IAChF,CAAC;IAED,MAAM,IAAI,KAAK,CACb,mDAAmD;QACnD,8CAA8C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAErC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;QACrC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAEhD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC1F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,MAAM,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAmB,CAAC;IAEpD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,sDAAsD,KAAK,yCAAyC,CAAC,CAAC;IACxH,CAAC;IAED,4DAA4D;IAC5D,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IACtD,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE;QACpB,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,SAAS;KACV,CAAC,CAAC;IAEH,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC5E,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@acquis-consulting/asm",
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"description": "aha",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"salesforce-connector": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"modryvlk"
|
|
15
|
+
],
|
|
16
|
+
"author": "mkona-acquis",
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc && shx chmod +x dist/*.js && vite build",
|
|
19
|
+
"build:ui": "vite build",
|
|
20
|
+
"test": "node --test 'test/**/*.test.js'",
|
|
21
|
+
"watch": "tsc --watch",
|
|
22
|
+
"watch:ui": "vite build --watch",
|
|
23
|
+
"prepare": "npm run build",
|
|
24
|
+
"obfuscate": "node scripts/obfuscate.js",
|
|
25
|
+
"build:publish": "npm run build && npm run obfuscate",
|
|
26
|
+
"publish:npm": "npm run build:publish && npm publish --access public",
|
|
27
|
+
"dxt": "cd claude_desktop && dxt pack"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@modelcontextprotocol/ext-apps": "^1.2.2",
|
|
31
|
+
"@modelcontextprotocol/sdk": "1.26.0",
|
|
32
|
+
"dotenv": "16.4.7",
|
|
33
|
+
"gitdiff-parser": "^0.3.1",
|
|
34
|
+
"jsforce": "^3.10.3",
|
|
35
|
+
"zod": "^4.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^20.11.0",
|
|
39
|
+
"@types/react": "^19.2.14",
|
|
40
|
+
"@types/react-dom": "^19.2.3",
|
|
41
|
+
"@vitejs/plugin-react": "^5.1.4",
|
|
42
|
+
"cross-env": "^10.1.0",
|
|
43
|
+
"react": "^19.2.4",
|
|
44
|
+
"react-dom": "^19.2.4",
|
|
45
|
+
"shx": "^0.3.4",
|
|
46
|
+
"terser": "^5.46.1",
|
|
47
|
+
"typescript": "^5.3.0",
|
|
48
|
+
"vite": "^7.3.1",
|
|
49
|
+
"vite-plugin-singlefile": "^2.3.0"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|