@pax8-cta/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +198 -0
- package/dist/auth/device-code-login.d.ts +40 -0
- package/dist/auth/device-code-login.d.ts.map +1 -0
- package/dist/auth/device-code-login.js +59 -0
- package/dist/auth/device-code-login.js.map +1 -0
- package/dist/auth/gdap-client.d.ts +81 -0
- package/dist/auth/gdap-client.d.ts.map +1 -0
- package/dist/auth/gdap-client.js +128 -0
- package/dist/auth/gdap-client.js.map +1 -0
- package/dist/auth/index.d.ts +19 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +19 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token-manager.d.ts +54 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +150 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +27 -0
- package/dist/client.js.map +1 -0
- package/dist/config/client.d.ts +24 -0
- package/dist/config/client.d.ts.map +1 -0
- package/dist/config/client.js +18 -0
- package/dist/config/client.js.map +1 -0
- package/dist/config/index.d.ts +18 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +18 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +81 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +271 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +751 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +556 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants.d.ts +116 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +170 -0
- package/dist/constants.js.map +1 -0
- package/dist/dataverse/agent-resolver.d.ts +98 -0
- package/dist/dataverse/agent-resolver.d.ts.map +1 -0
- package/dist/dataverse/agent-resolver.js +185 -0
- package/dist/dataverse/agent-resolver.js.map +1 -0
- package/dist/dataverse/client.d.ts +104 -0
- package/dist/dataverse/client.d.ts.map +1 -0
- package/dist/dataverse/client.js +272 -0
- package/dist/dataverse/client.js.map +1 -0
- package/dist/dataverse/connection-refs.d.ts +115 -0
- package/dist/dataverse/connection-refs.d.ts.map +1 -0
- package/dist/dataverse/connection-refs.js +203 -0
- package/dist/dataverse/connection-refs.js.map +1 -0
- package/dist/dataverse/index.d.ts +20 -0
- package/dist/dataverse/index.d.ts.map +1 -0
- package/dist/dataverse/index.js +20 -0
- package/dist/dataverse/index.js.map +1 -0
- package/dist/dataverse/solution-ops.d.ts +100 -0
- package/dist/dataverse/solution-ops.d.ts.map +1 -0
- package/dist/dataverse/solution-ops.js +288 -0
- package/dist/dataverse/solution-ops.js.map +1 -0
- package/dist/errors.d.ts +171 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +178 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mock/demo-data.d.ts +213 -0
- package/dist/mock/demo-data.d.ts.map +1 -0
- package/dist/mock/demo-data.js +1096 -0
- package/dist/mock/demo-data.js.map +1 -0
- package/dist/mock/demo-deployment-store.d.ts +77 -0
- package/dist/mock/demo-deployment-store.d.ts.map +1 -0
- package/dist/mock/demo-deployment-store.js +85 -0
- package/dist/mock/demo-deployment-store.js.map +1 -0
- package/dist/powerplatform/admin-client.d.ts +226 -0
- package/dist/powerplatform/admin-client.d.ts.map +1 -0
- package/dist/powerplatform/admin-client.js +315 -0
- package/dist/powerplatform/admin-client.js.map +1 -0
- package/dist/powerplatform/index.d.ts +18 -0
- package/dist/powerplatform/index.d.ts.map +1 -0
- package/dist/powerplatform/index.js +18 -0
- package/dist/powerplatform/index.js.map +1 -0
- package/dist/powerplatform/tenant-discovery.d.ts +100 -0
- package/dist/powerplatform/tenant-discovery.d.ts.map +1 -0
- package/dist/powerplatform/tenant-discovery.js +205 -0
- package/dist/powerplatform/tenant-discovery.js.map +1 -0
- package/dist/preconditions/check.d.ts +41 -0
- package/dist/preconditions/check.d.ts.map +1 -0
- package/dist/preconditions/check.js +173 -0
- package/dist/preconditions/check.js.map +1 -0
- package/dist/preconditions/index.d.ts +20 -0
- package/dist/preconditions/index.d.ts.map +1 -0
- package/dist/preconditions/index.js +20 -0
- package/dist/preconditions/index.js.map +1 -0
- package/dist/preconditions/loader.d.ts +33 -0
- package/dist/preconditions/loader.d.ts.map +1 -0
- package/dist/preconditions/loader.js +65 -0
- package/dist/preconditions/loader.js.map +1 -0
- package/dist/preconditions/schema.d.ts +103 -0
- package/dist/preconditions/schema.d.ts.map +1 -0
- package/dist/preconditions/schema.js +93 -0
- package/dist/preconditions/schema.js.map +1 -0
- package/dist/preconditions/types.d.ts +118 -0
- package/dist/preconditions/types.d.ts.map +1 -0
- package/dist/preconditions/types.js +17 -0
- package/dist/preconditions/types.js.map +1 -0
- package/dist/queue/index.d.ts +17 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +17 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/memory-queue.d.ts +86 -0
- package/dist/queue/memory-queue.d.ts.map +1 -0
- package/dist/queue/memory-queue.js +221 -0
- package/dist/queue/memory-queue.js.map +1 -0
- package/dist/services/audit-log.d.ts +59 -0
- package/dist/services/audit-log.d.ts.map +1 -0
- package/dist/services/audit-log.js +193 -0
- package/dist/services/audit-log.js.map +1 -0
- package/dist/services/auth-error-parser.d.ts +36 -0
- package/dist/services/auth-error-parser.d.ts.map +1 -0
- package/dist/services/auth-error-parser.js +90 -0
- package/dist/services/auth-error-parser.js.map +1 -0
- package/dist/services/deployment-doctor.d.ts +109 -0
- package/dist/services/deployment-doctor.d.ts.map +1 -0
- package/dist/services/deployment-doctor.js +476 -0
- package/dist/services/deployment-doctor.js.map +1 -0
- package/dist/services/deployment-notifications.d.ts +41 -0
- package/dist/services/deployment-notifications.d.ts.map +1 -0
- package/dist/services/deployment-notifications.js +161 -0
- package/dist/services/deployment-notifications.js.map +1 -0
- package/dist/services/deployment-progress.d.ts +89 -0
- package/dist/services/deployment-progress.d.ts.map +1 -0
- package/dist/services/deployment-progress.js +244 -0
- package/dist/services/deployment-progress.js.map +1 -0
- package/dist/services/deployment-service.d.ts +97 -0
- package/dist/services/deployment-service.d.ts.map +1 -0
- package/dist/services/deployment-service.js +375 -0
- package/dist/services/deployment-service.js.map +1 -0
- package/dist/services/drift-analyzer.d.ts +86 -0
- package/dist/services/drift-analyzer.d.ts.map +1 -0
- package/dist/services/drift-analyzer.js +273 -0
- package/dist/services/drift-analyzer.js.map +1 -0
- package/dist/services/environment-setup.d.ts +97 -0
- package/dist/services/environment-setup.d.ts.map +1 -0
- package/dist/services/environment-setup.js +250 -0
- package/dist/services/environment-setup.js.map +1 -0
- package/dist/services/health-check.d.ts +168 -0
- package/dist/services/health-check.d.ts.map +1 -0
- package/dist/services/health-check.js +705 -0
- package/dist/services/health-check.js.map +1 -0
- package/dist/services/index.d.ts +39 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +39 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/logger.d.ts +139 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +268 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/notification-service.d.ts +55 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +184 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/risk-analyzer.d.ts +252 -0
- package/dist/services/risk-analyzer.d.ts.map +1 -0
- package/dist/services/risk-analyzer.js +866 -0
- package/dist/services/risk-analyzer.js.map +1 -0
- package/dist/services/rollback.d.ts +57 -0
- package/dist/services/rollback.d.ts.map +1 -0
- package/dist/services/rollback.js +270 -0
- package/dist/services/rollback.js.map +1 -0
- package/dist/services/scheduler.d.ts +80 -0
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/services/scheduler.js +350 -0
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/secrets.d.ts +31 -0
- package/dist/services/secrets.d.ts.map +1 -0
- package/dist/services/secrets.js +206 -0
- package/dist/services/secrets.js.map +1 -0
- package/dist/services/settings-service.d.ts +132 -0
- package/dist/services/settings-service.d.ts.map +1 -0
- package/dist/services/settings-service.js +378 -0
- package/dist/services/settings-service.js.map +1 -0
- package/dist/services/solution-diff.d.ts +127 -0
- package/dist/services/solution-diff.d.ts.map +1 -0
- package/dist/services/solution-diff.js +260 -0
- package/dist/services/solution-diff.js.map +1 -0
- package/dist/services/solution-mode-detector.d.ts +35 -0
- package/dist/services/solution-mode-detector.d.ts.map +1 -0
- package/dist/services/solution-mode-detector.js +84 -0
- package/dist/services/solution-mode-detector.js.map +1 -0
- package/dist/services/tenant-resolver.d.ts +55 -0
- package/dist/services/tenant-resolver.d.ts.map +1 -0
- package/dist/services/tenant-resolver.js +126 -0
- package/dist/services/tenant-resolver.js.map +1 -0
- package/dist/services/unmanaged-customizations.d.ts +104 -0
- package/dist/services/unmanaged-customizations.d.ts.map +1 -0
- package/dist/services/unmanaged-customizations.js +521 -0
- package/dist/services/unmanaged-customizations.js.map +1 -0
- package/dist/services/url-templater.d.ts +184 -0
- package/dist/services/url-templater.d.ts.map +1 -0
- package/dist/services/url-templater.js +327 -0
- package/dist/services/url-templater.js.map +1 -0
- package/dist/services/version-checker.d.ts +108 -0
- package/dist/services/version-checker.d.ts.map +1 -0
- package/dist/services/version-checker.js +403 -0
- package/dist/services/version-checker.js.map +1 -0
- package/dist/services/waves.d.ts +90 -0
- package/dist/services/waves.d.ts.map +1 -0
- package/dist/services/waves.js +222 -0
- package/dist/services/waves.js.map +1 -0
- package/dist/services/webhook.d.ts +95 -0
- package/dist/services/webhook.d.ts.map +1 -0
- package/dist/services/webhook.js +244 -0
- package/dist/services/webhook.js.map +1 -0
- package/dist/utils/deployment-tools.d.ts +110 -0
- package/dist/utils/deployment-tools.d.ts.map +1 -0
- package/dist/utils/deployment-tools.js +121 -0
- package/dist/utils/deployment-tools.js.map +1 -0
- package/dist/utils/index.d.ts +17 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Operations for managing Connection References and Environment Variables
|
|
18
|
+
*/
|
|
19
|
+
export class ConnectionOperations {
|
|
20
|
+
client;
|
|
21
|
+
constructor(client) {
|
|
22
|
+
this.client = client;
|
|
23
|
+
}
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Connection References
|
|
26
|
+
// ============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* List all connection references in the environment
|
|
29
|
+
*/
|
|
30
|
+
async listConnectionReferences() {
|
|
31
|
+
const result = await this.client.get("/connectionreferences", {
|
|
32
|
+
$select: "connectionreferenceid,connectionreferencelogicalname,connectionreferencedisplayname,connectionid,connectorid,statecode,statuscode",
|
|
33
|
+
$orderby: "connectionreferencelogicalname asc",
|
|
34
|
+
});
|
|
35
|
+
return result.value;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get a connection reference by logical name
|
|
39
|
+
*/
|
|
40
|
+
async getConnectionReferenceByLogicalName(logicalName) {
|
|
41
|
+
const result = await this.client.get("/connectionreferences", {
|
|
42
|
+
$filter: `connectionreferencelogicalname eq '${logicalName}'`,
|
|
43
|
+
$select: "connectionreferenceid,connectionreferencelogicalname,connectionreferencedisplayname,connectionid,connectorid,statecode,statuscode",
|
|
44
|
+
});
|
|
45
|
+
return result.value[0] || null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Update the connection ID for a connection reference
|
|
49
|
+
*/
|
|
50
|
+
async updateConnectionReference(connectionReferenceId, connectionId) {
|
|
51
|
+
await this.client.patch(`/connectionreferences(${connectionReferenceId})`, {
|
|
52
|
+
connectionid: connectionId,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Apply connection mappings to the environment
|
|
57
|
+
* Maps source connection references to target connections
|
|
58
|
+
*/
|
|
59
|
+
async applyConnectionMappings(mappings) {
|
|
60
|
+
const errors = [];
|
|
61
|
+
let applied = 0;
|
|
62
|
+
for (const mapping of mappings) {
|
|
63
|
+
try {
|
|
64
|
+
// Find the connection reference by logical name
|
|
65
|
+
const connRef = await this.getConnectionReferenceByLogicalName(mapping.sourceLogicalName);
|
|
66
|
+
if (!connRef) {
|
|
67
|
+
errors.push(`Connection reference not found: ${mapping.sourceLogicalName}`);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// Update the connection ID
|
|
71
|
+
await this.updateConnectionReference(connRef.connectionreferenceid, mapping.targetConnectionId);
|
|
72
|
+
applied++;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
errors.push(`Failed to map ${mapping.sourceLogicalName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
success: errors.length === 0,
|
|
80
|
+
applied,
|
|
81
|
+
errors,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate that all required connection references have connections assigned
|
|
86
|
+
*/
|
|
87
|
+
async validateConnectionReferences(logicalNames) {
|
|
88
|
+
const missing = [];
|
|
89
|
+
for (const logicalName of logicalNames) {
|
|
90
|
+
const connRef = await this.getConnectionReferenceByLogicalName(logicalName);
|
|
91
|
+
if (!connRef) {
|
|
92
|
+
missing.push(`${logicalName} (not found)`);
|
|
93
|
+
}
|
|
94
|
+
else if (!connRef.connectionid) {
|
|
95
|
+
missing.push(`${logicalName} (no connection assigned)`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
valid: missing.length === 0,
|
|
100
|
+
missing,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ============================================================================
|
|
104
|
+
// Environment Variables
|
|
105
|
+
// ============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* List all environment variable definitions in the environment
|
|
108
|
+
*/
|
|
109
|
+
async listEnvironmentVariables() {
|
|
110
|
+
const result = await this.client.get("/environmentvariabledefinitions", {
|
|
111
|
+
$select: "environmentvariabledefinitionid,schemaname,displayname,type,defaultvalue",
|
|
112
|
+
$orderby: "schemaname asc",
|
|
113
|
+
});
|
|
114
|
+
return result.value;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get an environment variable definition by schema name
|
|
118
|
+
*/
|
|
119
|
+
async getEnvironmentVariableBySchemaName(schemaName) {
|
|
120
|
+
const result = await this.client.get("/environmentvariabledefinitions", {
|
|
121
|
+
$filter: `schemaname eq '${schemaName}'`,
|
|
122
|
+
$select: "environmentvariabledefinitionid,schemaname,displayname,type,defaultvalue",
|
|
123
|
+
});
|
|
124
|
+
return result.value[0] || null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the current value of an environment variable
|
|
128
|
+
*/
|
|
129
|
+
async getEnvironmentVariableValue(definitionId) {
|
|
130
|
+
const result = await this.client.get("/environmentvariablevalues", {
|
|
131
|
+
$filter: `_environmentvariabledefinitionid_value eq '${definitionId}'`,
|
|
132
|
+
$select: "environmentvariablevalueid,value",
|
|
133
|
+
});
|
|
134
|
+
return result.value[0]?.value || null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Set the value of an environment variable
|
|
138
|
+
* Creates a new value record if none exists, updates if it does
|
|
139
|
+
*/
|
|
140
|
+
async setEnvironmentVariableValue(schemaName, value) {
|
|
141
|
+
// Find the definition
|
|
142
|
+
const definition = await this.getEnvironmentVariableBySchemaName(schemaName);
|
|
143
|
+
if (!definition) {
|
|
144
|
+
throw new Error(`Environment variable not found: ${schemaName}`);
|
|
145
|
+
}
|
|
146
|
+
const stringValue = typeof value === "string" ? value : JSON.stringify(value);
|
|
147
|
+
// Check if a value record exists
|
|
148
|
+
const existingValue = await this.client.get("/environmentvariablevalues", {
|
|
149
|
+
$filter: `_environmentvariabledefinitionid_value eq '${definition.environmentvariabledefinitionid}'`,
|
|
150
|
+
$select: "environmentvariablevalueid",
|
|
151
|
+
});
|
|
152
|
+
if (existingValue.value.length > 0) {
|
|
153
|
+
// Update existing value
|
|
154
|
+
await this.client.patch(`/environmentvariablevalues(${existingValue.value[0].environmentvariablevalueid})`, {
|
|
155
|
+
value: stringValue,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Create new value record
|
|
160
|
+
await this.client.post("/environmentvariablevalues", {
|
|
161
|
+
value: stringValue,
|
|
162
|
+
"EnvironmentVariableDefinitionId@odata.bind": `/environmentvariabledefinitions(${definition.environmentvariabledefinitionid})`,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Apply environment variable values to the environment
|
|
168
|
+
*/
|
|
169
|
+
async applyEnvironmentVariables(variables) {
|
|
170
|
+
const errors = [];
|
|
171
|
+
let applied = 0;
|
|
172
|
+
for (const variable of variables) {
|
|
173
|
+
try {
|
|
174
|
+
await this.setEnvironmentVariableValue(variable.schemaName, variable.value);
|
|
175
|
+
applied++;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
errors.push(`Failed to set ${variable.schemaName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
success: errors.length === 0,
|
|
183
|
+
applied,
|
|
184
|
+
errors,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get current values for all environment variables (for snapshot/rollback)
|
|
189
|
+
*/
|
|
190
|
+
async getCurrentEnvironmentVariableValues() {
|
|
191
|
+
const definitions = await this.listEnvironmentVariables();
|
|
192
|
+
const values = new Map();
|
|
193
|
+
for (const def of definitions) {
|
|
194
|
+
const value = await this.getEnvironmentVariableValue(def.environmentvariabledefinitionid);
|
|
195
|
+
values.set(def.schemaname, {
|
|
196
|
+
definitionId: def.environmentvariabledefinitionid,
|
|
197
|
+
value,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return values;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=connection-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-refs.js","sourceRoot":"","sources":["../../src/dataverse/connection-refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export * from "./client.js";
|
|
17
|
+
export * from "./solution-ops.js";
|
|
18
|
+
export * from "./connection-refs.js";
|
|
19
|
+
export * from "./agent-resolver.js";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dataverse/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export * from "./client.js";
|
|
17
|
+
export * from "./solution-ops.js";
|
|
18
|
+
export * from "./connection-refs.js";
|
|
19
|
+
export * from "./agent-resolver.js";
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dataverse/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { DataverseClient, SolutionRecord } from "./client.js";
|
|
2
|
+
import { SolutionMetadata } from "../config/schema.js";
|
|
3
|
+
export interface ExportOptions {
|
|
4
|
+
managed?: boolean;
|
|
5
|
+
outputPath: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ImportOptions {
|
|
8
|
+
overwriteUnmanagedCustomizations?: boolean;
|
|
9
|
+
publishWorkflows?: boolean;
|
|
10
|
+
convertToManaged?: boolean;
|
|
11
|
+
async?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ImportResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
importJobId?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A record from Dataverse's msdyn_solutionhistory entity
|
|
20
|
+
*/
|
|
21
|
+
export interface SolutionHistoryRecord {
|
|
22
|
+
msdyn_solutionhistoryid: string;
|
|
23
|
+
msdyn_name: string;
|
|
24
|
+
msdyn_solutionversion: string;
|
|
25
|
+
msdyn_operation: number;
|
|
26
|
+
msdyn_suboperation: number;
|
|
27
|
+
msdyn_result: boolean;
|
|
28
|
+
msdyn_status: number;
|
|
29
|
+
msdyn_starttime: string;
|
|
30
|
+
msdyn_endtime: string | null;
|
|
31
|
+
msdyn_totaltime: number | null;
|
|
32
|
+
msdyn_ismanaged: boolean;
|
|
33
|
+
msdyn_exceptionmessage: string | null;
|
|
34
|
+
msdyn_errorcode: number | null;
|
|
35
|
+
msdyn_publishername: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface SolutionHistoryOptions {
|
|
38
|
+
/** Filter by solution name */
|
|
39
|
+
solutionName?: string;
|
|
40
|
+
/** Filter by operation type: 'import' | 'uninstall' | 'export' | 'all' */
|
|
41
|
+
operation?: "import" | "uninstall" | "export" | "all";
|
|
42
|
+
/** Maximum number of records to return */
|
|
43
|
+
limit?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* High-level operations for Copilot Studio solution export/import
|
|
47
|
+
*/
|
|
48
|
+
export declare class SolutionOperations {
|
|
49
|
+
private client;
|
|
50
|
+
constructor(client: DataverseClient);
|
|
51
|
+
private isAsyncImportDisabledError;
|
|
52
|
+
/**
|
|
53
|
+
* List all visible solutions in the environment
|
|
54
|
+
*/
|
|
55
|
+
listSolutions(): Promise<SolutionRecord[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Delete (uninstall) a managed solution from the environment.
|
|
58
|
+
* This removes the solution and all its components.
|
|
59
|
+
*/
|
|
60
|
+
deleteSolution(uniqueName: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Get solution by unique name
|
|
63
|
+
*/
|
|
64
|
+
getSolution(uniqueName: string): Promise<SolutionRecord | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Query solution history (imports, uninstalls, exports) from Dataverse
|
|
67
|
+
*/
|
|
68
|
+
getSolutionHistory(options?: SolutionHistoryOptions): Promise<SolutionHistoryRecord[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Export a solution to a zip file
|
|
71
|
+
*/
|
|
72
|
+
exportSolution(solutionName: string, options: ExportOptions): Promise<SolutionMetadata>;
|
|
73
|
+
/**
|
|
74
|
+
* Import a solution from a zip file
|
|
75
|
+
*/
|
|
76
|
+
importSolution(solutionPath: string, options?: ImportOptions): Promise<ImportResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Import a solution asynchronously and return immediately
|
|
79
|
+
* Use checkImportStatus to poll for completion
|
|
80
|
+
*/
|
|
81
|
+
importSolutionAsync(solutionPath: string, options?: ImportOptions): Promise<string>;
|
|
82
|
+
/**
|
|
83
|
+
* Check the status of an async import job
|
|
84
|
+
*/
|
|
85
|
+
checkImportStatus(importJobId: string): Promise<{
|
|
86
|
+
progress: number;
|
|
87
|
+
completed: boolean;
|
|
88
|
+
success: boolean;
|
|
89
|
+
error?: string;
|
|
90
|
+
}>;
|
|
91
|
+
/**
|
|
92
|
+
* Wait for an async import to complete with polling
|
|
93
|
+
*/
|
|
94
|
+
waitForImport(importJobId: string, options?: {
|
|
95
|
+
pollIntervalMs?: number;
|
|
96
|
+
timeoutMs?: number;
|
|
97
|
+
onProgress?: (progress: number) => void;
|
|
98
|
+
}): Promise<ImportResult>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=solution-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solution-ops.d.ts","sourceRoot":"","sources":["../../src/dataverse/solution-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2024 Pax8, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import crypto from "node:crypto";
|
|
17
|
+
import { writeFile, readFile } from "node:fs/promises";
|
|
18
|
+
import { SolutionError, ErrorCode } from "../errors.js";
|
|
19
|
+
/**
|
|
20
|
+
* High-level operations for Copilot Studio solution export/import
|
|
21
|
+
*/
|
|
22
|
+
export class SolutionOperations {
|
|
23
|
+
client;
|
|
24
|
+
constructor(client) {
|
|
25
|
+
this.client = client;
|
|
26
|
+
}
|
|
27
|
+
isAsyncImportDisabledError(error) {
|
|
28
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
29
|
+
const normalized = message.toLowerCase();
|
|
30
|
+
return (normalized.includes("async operations are currently disabled") ||
|
|
31
|
+
normalized.includes("asynchronous operations are currently disabled"));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* List all visible solutions in the environment
|
|
35
|
+
*/
|
|
36
|
+
async listSolutions() {
|
|
37
|
+
return this.client.querySolutions();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Delete (uninstall) a managed solution from the environment.
|
|
41
|
+
* This removes the solution and all its components.
|
|
42
|
+
*/
|
|
43
|
+
async deleteSolution(uniqueName) {
|
|
44
|
+
const solution = await this.getSolution(uniqueName);
|
|
45
|
+
if (!solution) {
|
|
46
|
+
throw new Error(`Solution '${uniqueName}' not found in environment`);
|
|
47
|
+
}
|
|
48
|
+
if (!solution.ismanaged) {
|
|
49
|
+
throw new Error(`Solution '${uniqueName}' is unmanaged. Only managed solutions can be uninstalled.`);
|
|
50
|
+
}
|
|
51
|
+
await this.client.delete(`/solutions(${solution.solutionid})`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get solution by unique name
|
|
55
|
+
*/
|
|
56
|
+
async getSolution(uniqueName) {
|
|
57
|
+
return this.client.getSolutionByName(uniqueName);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Query solution history (imports, uninstalls, exports) from Dataverse
|
|
61
|
+
*/
|
|
62
|
+
async getSolutionHistory(options = {}) {
|
|
63
|
+
const { solutionName, operation = "all", limit = 50 } = options;
|
|
64
|
+
const filters = [];
|
|
65
|
+
if (solutionName) {
|
|
66
|
+
filters.push(`msdyn_name eq '${solutionName}'`);
|
|
67
|
+
}
|
|
68
|
+
const opMap = { import: 0, uninstall: 1, export: 2 };
|
|
69
|
+
if (operation !== "all") {
|
|
70
|
+
filters.push(`msdyn_operation eq ${opMap[operation]}`);
|
|
71
|
+
}
|
|
72
|
+
const params = {
|
|
73
|
+
$select: [
|
|
74
|
+
"msdyn_solutionhistoryid",
|
|
75
|
+
"msdyn_name",
|
|
76
|
+
"msdyn_solutionversion",
|
|
77
|
+
"msdyn_operation",
|
|
78
|
+
"msdyn_suboperation",
|
|
79
|
+
"msdyn_result",
|
|
80
|
+
"msdyn_status",
|
|
81
|
+
"msdyn_starttime",
|
|
82
|
+
"msdyn_endtime",
|
|
83
|
+
"msdyn_totaltime",
|
|
84
|
+
"msdyn_ismanaged",
|
|
85
|
+
"msdyn_exceptionmessage",
|
|
86
|
+
"msdyn_errorcode",
|
|
87
|
+
"msdyn_publishername",
|
|
88
|
+
].join(","),
|
|
89
|
+
$orderby: "msdyn_starttime desc",
|
|
90
|
+
$top: String(limit),
|
|
91
|
+
};
|
|
92
|
+
if (filters.length > 0) {
|
|
93
|
+
params.$filter = filters.join(" and ");
|
|
94
|
+
}
|
|
95
|
+
const result = await this.client.get("/msdyn_solutionhistories", params);
|
|
96
|
+
return result.value;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Export a solution to a zip file
|
|
100
|
+
*/
|
|
101
|
+
async exportSolution(solutionName, options) {
|
|
102
|
+
// First, verify the solution exists
|
|
103
|
+
const solution = await this.getSolution(solutionName);
|
|
104
|
+
if (!solution) {
|
|
105
|
+
throw new SolutionError(ErrorCode.SOLUTION_NOT_FOUND, `Solution '${solutionName}' not found in environment`, {
|
|
106
|
+
solutionName,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const request = {
|
|
110
|
+
SolutionName: solutionName,
|
|
111
|
+
Managed: options.managed ?? true, // Default to managed for deployment
|
|
112
|
+
};
|
|
113
|
+
const response = await this.client.executeAction("ExportSolution", request);
|
|
114
|
+
// Decode base64 and write to file
|
|
115
|
+
const solutionBuffer = Buffer.from(response.ExportSolutionFile, "base64");
|
|
116
|
+
await writeFile(options.outputPath, solutionBuffer);
|
|
117
|
+
return {
|
|
118
|
+
uniqueName: solution.uniquename,
|
|
119
|
+
friendlyName: solution.friendlyname,
|
|
120
|
+
version: solution.version,
|
|
121
|
+
isManaged: options.managed ?? true,
|
|
122
|
+
publisherId: solution.publisherid?.publisherid,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Import a solution from a zip file
|
|
127
|
+
*/
|
|
128
|
+
async importSolution(solutionPath, options = {}) {
|
|
129
|
+
// Read and encode the solution file
|
|
130
|
+
const solutionBuffer = await readFile(solutionPath);
|
|
131
|
+
const base64Solution = solutionBuffer.toString("base64");
|
|
132
|
+
const importJobId = crypto.randomUUID();
|
|
133
|
+
const request = {
|
|
134
|
+
CustomizationFile: base64Solution,
|
|
135
|
+
OverwriteUnmanagedCustomizations: options.overwriteUnmanagedCustomizations ?? true,
|
|
136
|
+
PublishWorkflows: options.publishWorkflows ?? true,
|
|
137
|
+
ConvertToManaged: options.convertToManaged ?? false,
|
|
138
|
+
ImportJobId: importJobId,
|
|
139
|
+
};
|
|
140
|
+
try {
|
|
141
|
+
await this.client.executeAction("ImportSolution", request);
|
|
142
|
+
return {
|
|
143
|
+
success: true,
|
|
144
|
+
importJobId,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return {
|
|
149
|
+
success: false,
|
|
150
|
+
importJobId,
|
|
151
|
+
error: error instanceof Error ? error.message : String(error),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Import a solution asynchronously and return immediately
|
|
157
|
+
* Use checkImportStatus to poll for completion
|
|
158
|
+
*/
|
|
159
|
+
async importSolutionAsync(solutionPath, options = {}) {
|
|
160
|
+
const solutionBuffer = await readFile(solutionPath);
|
|
161
|
+
const base64Solution = solutionBuffer.toString("base64");
|
|
162
|
+
const importJobId = crypto.randomUUID();
|
|
163
|
+
const request = {
|
|
164
|
+
CustomizationFile: base64Solution,
|
|
165
|
+
OverwriteUnmanagedCustomizations: options.overwriteUnmanagedCustomizations ?? true,
|
|
166
|
+
PublishWorkflows: options.publishWorkflows ?? true,
|
|
167
|
+
ImportJobId: importJobId,
|
|
168
|
+
};
|
|
169
|
+
try {
|
|
170
|
+
// Preferred path for normal environments.
|
|
171
|
+
await this.client.executeAction("ImportSolutionAsync", request);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
// Some environments (for example when async/background operations are disabled)
|
|
175
|
+
// reject ImportSolutionAsync. Fall back to synchronous import so deployments
|
|
176
|
+
// can still proceed.
|
|
177
|
+
if (!this.isAsyncImportDisabledError(error)) {
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
await this.client.executeAction("ImportSolution", {
|
|
181
|
+
...request,
|
|
182
|
+
ConvertToManaged: options.convertToManaged ?? false,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return importJobId;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check the status of an async import job
|
|
189
|
+
*/
|
|
190
|
+
async checkImportStatus(importJobId) {
|
|
191
|
+
try {
|
|
192
|
+
const result = await this.client.get("/importjobs", {
|
|
193
|
+
$filter: `importjobid eq '${importJobId}'`,
|
|
194
|
+
$select: "importjobid,solutionname,progress,completedon,startedon,data",
|
|
195
|
+
});
|
|
196
|
+
if (result.value.length === 0) {
|
|
197
|
+
return {
|
|
198
|
+
progress: 0,
|
|
199
|
+
completed: false,
|
|
200
|
+
success: false,
|
|
201
|
+
error: "Import job not found",
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const job = result.value[0];
|
|
205
|
+
const completed = job.completedon !== null;
|
|
206
|
+
// Parse the data XML to check for errors
|
|
207
|
+
let success = true;
|
|
208
|
+
let error;
|
|
209
|
+
if (completed && job.data) {
|
|
210
|
+
// The data field contains XML with import results
|
|
211
|
+
// Check for failure indicators
|
|
212
|
+
if (job.data.includes('succeeded="failure"') ||
|
|
213
|
+
job.data.includes('<result result="failure"') ||
|
|
214
|
+
job.data.includes("<errortext>")) {
|
|
215
|
+
success = false;
|
|
216
|
+
// Try multiple patterns to extract error message
|
|
217
|
+
// Pattern 1: status attribute in importexportxml element
|
|
218
|
+
const statusMatch = job.data.match(/status="([^"]+)"/);
|
|
219
|
+
if (statusMatch && statusMatch[1].includes("FAILURE")) {
|
|
220
|
+
// Extract the actual error message after "FAILURE:"
|
|
221
|
+
const failureMsg = statusMatch[1].replace(/^[^:]+:\s*FAILURE:\s*/, "");
|
|
222
|
+
error = failureMsg || statusMatch[1];
|
|
223
|
+
}
|
|
224
|
+
// Pattern 2: errortext element
|
|
225
|
+
if (!error) {
|
|
226
|
+
const errorMatch = job.data.match(/<errortext>([^<]+)<\/errortext>/);
|
|
227
|
+
if (errorMatch) {
|
|
228
|
+
error = errorMatch[1];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Pattern 3: Fallback to component name
|
|
232
|
+
if (!error) {
|
|
233
|
+
const componentMatch = job.data.match(/<name>([^<]+)<\/name>/);
|
|
234
|
+
error = componentMatch
|
|
235
|
+
? `Import failed for component: ${componentMatch[1]}`
|
|
236
|
+
: "Import failed - check solution compatibility";
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (completed && !job.data) {
|
|
241
|
+
// Completed but no data - unusual, treat as potential failure
|
|
242
|
+
error = "Import completed but no result data returned";
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
progress: job.progress,
|
|
246
|
+
completed,
|
|
247
|
+
success: completed ? success : false,
|
|
248
|
+
error,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
return {
|
|
253
|
+
progress: 0,
|
|
254
|
+
completed: false,
|
|
255
|
+
success: false,
|
|
256
|
+
error: error instanceof Error ? error.message : String(error),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Wait for an async import to complete with polling
|
|
262
|
+
*/
|
|
263
|
+
async waitForImport(importJobId, options = {}) {
|
|
264
|
+
const { pollIntervalMs = 5000, timeoutMs = 600000, // 10 minutes default
|
|
265
|
+
onProgress, } = options;
|
|
266
|
+
const startTime = Date.now();
|
|
267
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
268
|
+
const status = await this.checkImportStatus(importJobId);
|
|
269
|
+
if (onProgress) {
|
|
270
|
+
onProgress(status.progress);
|
|
271
|
+
}
|
|
272
|
+
if (status.completed) {
|
|
273
|
+
return {
|
|
274
|
+
success: status.success,
|
|
275
|
+
importJobId,
|
|
276
|
+
error: status.error,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
importJobId,
|
|
284
|
+
error: "Import timed out",
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=solution-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solution-ops.js","sourceRoot":"","sources":["../../src/dataverse/solution-ops.ts"],"names":[],"mappings":"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"}
|