@mcp-consultant-tools/powerplatform-core 26.0.0-beta.2

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.
Files changed (153) hide show
  1. package/build/auth/index.d.ts +64 -0
  2. package/build/auth/index.d.ts.map +1 -0
  3. package/build/auth/index.js +39 -0
  4. package/build/auth/index.js.map +1 -0
  5. package/build/auth/interactive-auth.d.ts +60 -0
  6. package/build/auth/interactive-auth.d.ts.map +1 -0
  7. package/build/auth/interactive-auth.js +429 -0
  8. package/build/auth/interactive-auth.js.map +1 -0
  9. package/build/auth/service-principal-auth.d.ts +26 -0
  10. package/build/auth/service-principal-auth.d.ts.map +1 -0
  11. package/build/auth/service-principal-auth.js +60 -0
  12. package/build/auth/service-principal-auth.js.map +1 -0
  13. package/build/auth/token-cache.d.ts +40 -0
  14. package/build/auth/token-cache.d.ts.map +1 -0
  15. package/build/auth/token-cache.js +108 -0
  16. package/build/auth/token-cache.js.map +1 -0
  17. package/build/client/PowerPlatformClient.d.ts +78 -0
  18. package/build/client/PowerPlatformClient.d.ts.map +1 -0
  19. package/build/client/PowerPlatformClient.js +198 -0
  20. package/build/client/PowerPlatformClient.js.map +1 -0
  21. package/build/client/index.d.ts +6 -0
  22. package/build/client/index.d.ts.map +1 -0
  23. package/build/client/index.js +6 -0
  24. package/build/client/index.js.map +1 -0
  25. package/build/client/types.d.ts +300 -0
  26. package/build/client/types.d.ts.map +1 -0
  27. package/build/client/types.js +5 -0
  28. package/build/client/types.js.map +1 -0
  29. package/build/index.d.ts +36 -0
  30. package/build/index.d.ts.map +1 -0
  31. package/build/index.js +55 -0
  32. package/build/index.js.map +1 -0
  33. package/build/services/AppManagementService.d.ts +95 -0
  34. package/build/services/AppManagementService.d.ts.map +1 -0
  35. package/build/services/AppManagementService.js +322 -0
  36. package/build/services/AppManagementService.js.map +1 -0
  37. package/build/services/AppService.d.ts +39 -0
  38. package/build/services/AppService.d.ts.map +1 -0
  39. package/build/services/AppService.js +173 -0
  40. package/build/services/AppService.js.map +1 -0
  41. package/build/services/AttributeService.d.ts +28 -0
  42. package/build/services/AttributeService.d.ts.map +1 -0
  43. package/build/services/AttributeService.js +86 -0
  44. package/build/services/AttributeService.js.map +1 -0
  45. package/build/services/BusinessRuleService.d.ts +22 -0
  46. package/build/services/BusinessRuleService.d.ts.map +1 -0
  47. package/build/services/BusinessRuleService.js +85 -0
  48. package/build/services/BusinessRuleService.js.map +1 -0
  49. package/build/services/DataService.d.ts +53 -0
  50. package/build/services/DataService.d.ts.map +1 -0
  51. package/build/services/DataService.js +204 -0
  52. package/build/services/DataService.js.map +1 -0
  53. package/build/services/DependencyService.d.ts +27 -0
  54. package/build/services/DependencyService.d.ts.map +1 -0
  55. package/build/services/DependencyService.js +47 -0
  56. package/build/services/DependencyService.js.map +1 -0
  57. package/build/services/EntityService.d.ts +42 -0
  58. package/build/services/EntityService.d.ts.map +1 -0
  59. package/build/services/EntityService.js +132 -0
  60. package/build/services/EntityService.js.map +1 -0
  61. package/build/services/FlowService.d.ts +55 -0
  62. package/build/services/FlowService.d.ts.map +1 -0
  63. package/build/services/FlowService.js +608 -0
  64. package/build/services/FlowService.js.map +1 -0
  65. package/build/services/FormService.d.ts +36 -0
  66. package/build/services/FormService.d.ts.map +1 -0
  67. package/build/services/FormService.js +55 -0
  68. package/build/services/FormService.js.map +1 -0
  69. package/build/services/MetadataService.d.ts +63 -0
  70. package/build/services/MetadataService.d.ts.map +1 -0
  71. package/build/services/MetadataService.js +176 -0
  72. package/build/services/MetadataService.js.map +1 -0
  73. package/build/services/OptionSetService.d.ts +40 -0
  74. package/build/services/OptionSetService.d.ts.map +1 -0
  75. package/build/services/OptionSetService.js +91 -0
  76. package/build/services/OptionSetService.js.map +1 -0
  77. package/build/services/PluginDeploymentService.d.ts +102 -0
  78. package/build/services/PluginDeploymentService.d.ts.map +1 -0
  79. package/build/services/PluginDeploymentService.js +412 -0
  80. package/build/services/PluginDeploymentService.js.map +1 -0
  81. package/build/services/PluginService.d.ts +61 -0
  82. package/build/services/PluginService.d.ts.map +1 -0
  83. package/build/services/PluginService.js +289 -0
  84. package/build/services/PluginService.js.map +1 -0
  85. package/build/services/PublishingService.d.ts +37 -0
  86. package/build/services/PublishingService.d.ts.map +1 -0
  87. package/build/services/PublishingService.js +65 -0
  88. package/build/services/PublishingService.js.map +1 -0
  89. package/build/services/RelationshipService.d.ts +29 -0
  90. package/build/services/RelationshipService.d.ts.map +1 -0
  91. package/build/services/RelationshipService.js +46 -0
  92. package/build/services/RelationshipService.js.map +1 -0
  93. package/build/services/SolutionService.d.ts +60 -0
  94. package/build/services/SolutionService.d.ts.map +1 -0
  95. package/build/services/SolutionService.js +125 -0
  96. package/build/services/SolutionService.js.map +1 -0
  97. package/build/services/ValidationService.d.ts +31 -0
  98. package/build/services/ValidationService.d.ts.map +1 -0
  99. package/build/services/ValidationService.js +391 -0
  100. package/build/services/ValidationService.js.map +1 -0
  101. package/build/services/ViewService.d.ts +36 -0
  102. package/build/services/ViewService.d.ts.map +1 -0
  103. package/build/services/ViewService.js +55 -0
  104. package/build/services/ViewService.js.map +1 -0
  105. package/build/services/WebResourceService.d.ts +40 -0
  106. package/build/services/WebResourceService.d.ts.map +1 -0
  107. package/build/services/WebResourceService.js +64 -0
  108. package/build/services/WebResourceService.js.map +1 -0
  109. package/build/services/WorkflowManagementService.d.ts +157 -0
  110. package/build/services/WorkflowManagementService.d.ts.map +1 -0
  111. package/build/services/WorkflowManagementService.js +567 -0
  112. package/build/services/WorkflowManagementService.js.map +1 -0
  113. package/build/services/WorkflowService.d.ts +28 -0
  114. package/build/services/WorkflowService.d.ts.map +1 -0
  115. package/build/services/WorkflowService.js +285 -0
  116. package/build/services/WorkflowService.js.map +1 -0
  117. package/build/services/index.d.ts +29 -0
  118. package/build/services/index.d.ts.map +1 -0
  119. package/build/services/index.js +31 -0
  120. package/build/services/index.js.map +1 -0
  121. package/build/utils/auditLogger.d.ts +76 -0
  122. package/build/utils/auditLogger.d.ts.map +1 -0
  123. package/build/utils/auditLogger.js +110 -0
  124. package/build/utils/auditLogger.js.map +1 -0
  125. package/build/utils/best-practices-formatters.d.ts +26 -0
  126. package/build/utils/best-practices-formatters.d.ts.map +1 -0
  127. package/build/utils/best-practices-formatters.js +238 -0
  128. package/build/utils/best-practices-formatters.js.map +1 -0
  129. package/build/utils/bestPractices.d.ts +150 -0
  130. package/build/utils/bestPractices.d.ts.map +1 -0
  131. package/build/utils/bestPractices.js +324 -0
  132. package/build/utils/bestPractices.js.map +1 -0
  133. package/build/utils/iconManager.d.ts +84 -0
  134. package/build/utils/iconManager.d.ts.map +1 -0
  135. package/build/utils/iconManager.js +338 -0
  136. package/build/utils/iconManager.js.map +1 -0
  137. package/build/utils/index.d.ts +11 -0
  138. package/build/utils/index.d.ts.map +1 -0
  139. package/build/utils/index.js +18 -0
  140. package/build/utils/index.js.map +1 -0
  141. package/build/utils/prompt-templates.d.ts +9 -0
  142. package/build/utils/prompt-templates.d.ts.map +1 -0
  143. package/build/utils/prompt-templates.js +31 -0
  144. package/build/utils/prompt-templates.js.map +1 -0
  145. package/build/utils/publisherConfig.d.ts +33 -0
  146. package/build/utils/publisherConfig.d.ts.map +1 -0
  147. package/build/utils/publisherConfig.js +54 -0
  148. package/build/utils/publisherConfig.js.map +1 -0
  149. package/build/utils/rate-limiter.d.ts +108 -0
  150. package/build/utils/rate-limiter.d.ts.map +1 -0
  151. package/build/utils/rate-limiter.js +242 -0
  152. package/build/utils/rate-limiter.js.map +1 -0
  153. package/package.json +65 -0
@@ -0,0 +1,322 @@
1
+ /**
2
+ * AppManagementService
3
+ *
4
+ * Service for app management operations (create, configure, publish).
5
+ * Note: This service should only be used by powerplatform-customization package.
6
+ */
7
+ import { auditLogger } from '../utils/auditLogger.js';
8
+ import { rateLimiter } from '../utils/rate-limiter.js';
9
+ export class AppManagementService {
10
+ client;
11
+ getAppSitemap;
12
+ constructor(client, getAppSitemap) {
13
+ this.client = client;
14
+ this.getAppSitemap = getAppSitemap;
15
+ }
16
+ /**
17
+ * Escape XML special characters
18
+ */
19
+ escapeXml(unsafe) {
20
+ return unsafe.replace(/[<>&'"]/g, (c) => {
21
+ switch (c) {
22
+ case '<':
23
+ return '&lt;';
24
+ case '>':
25
+ return '&gt;';
26
+ case '&':
27
+ return '&amp;';
28
+ case "'":
29
+ return '&apos;';
30
+ case '"':
31
+ return '&quot;';
32
+ default:
33
+ return c;
34
+ }
35
+ });
36
+ }
37
+ /**
38
+ * Create a simple sitemap
39
+ */
40
+ async createSimpleSitemap(config, solutionUniqueName) {
41
+ const startTime = Date.now();
42
+ try {
43
+ // Generate sitemap XML
44
+ let xml = '<SiteMap>';
45
+ config.areas.forEach((area) => {
46
+ xml += `<Area Id="${area.id}"`;
47
+ if (area.icon)
48
+ xml += ` Icon="${area.icon}"`;
49
+ if (area.showGroups !== undefined)
50
+ xml += ` ShowGroups="${area.showGroups}"`;
51
+ xml += '>';
52
+ xml += `<Titles><Title LCID="1033" Title="${this.escapeXml(area.title)}" /></Titles>`;
53
+ if (area.description) {
54
+ xml += `<Descriptions><Description LCID="1033" Description="${this.escapeXml(area.description)}" /></Descriptions>`;
55
+ }
56
+ area.groups.forEach((group) => {
57
+ xml += `<Group Id="${group.id}"`;
58
+ if (group.isProfile !== undefined)
59
+ xml += ` IsProfile="${group.isProfile}"`;
60
+ xml += '>';
61
+ xml += `<Titles><Title LCID="1033" Title="${this.escapeXml(group.title)}" /></Titles>`;
62
+ if (group.description) {
63
+ xml += `<Descriptions><Description LCID="1033" Description="${this.escapeXml(group.description)}" /></Descriptions>`;
64
+ }
65
+ group.subareas.forEach((subarea) => {
66
+ xml += `<SubArea Id="${subarea.id}"`;
67
+ if (subarea.entity)
68
+ xml += ` Entity="${subarea.entity}"`;
69
+ if (subarea.url)
70
+ xml += ` Url="${subarea.url}"`;
71
+ if (subarea.icon)
72
+ xml += ` Icon="${subarea.icon}"`;
73
+ if (subarea.availableOffline !== undefined) {
74
+ xml += ` AvailableOffline="${subarea.availableOffline}"`;
75
+ }
76
+ if (subarea.passParams !== undefined) {
77
+ xml += ` PassParams="${subarea.passParams}"`;
78
+ }
79
+ xml += '>';
80
+ xml += `<Titles><Title LCID="1033" Title="${this.escapeXml(subarea.title)}" /></Titles>`;
81
+ if (subarea.description) {
82
+ xml += `<Descriptions><Description LCID="1033" Description="${this.escapeXml(subarea.description)}" /></Descriptions>`;
83
+ }
84
+ xml += '</SubArea>';
85
+ });
86
+ xml += '</Group>';
87
+ });
88
+ xml += '</Area>';
89
+ });
90
+ xml += '</SiteMap>';
91
+ const sitemapRequest = {
92
+ sitemapname: config.name,
93
+ sitemapxml: xml,
94
+ isappaware: true,
95
+ enablecollapsiblegroups: config.enableCollapsibleGroups ?? false,
96
+ showhome: config.showHome ?? true,
97
+ showpinned: config.showPinned ?? true,
98
+ showrecents: config.showRecents ?? true,
99
+ };
100
+ const headers = {};
101
+ if (solutionUniqueName) {
102
+ headers['MSCRM.SolutionUniqueName'] = solutionUniqueName;
103
+ }
104
+ const response = await rateLimiter.execute(async () => {
105
+ return await this.client.makeRequest('api/data/v9.2/sitemaps', 'POST', sitemapRequest, headers);
106
+ });
107
+ const sitemapId = response.sitemapid;
108
+ auditLogger.log({
109
+ operation: 'createSimpleSitemap',
110
+ operationType: 'CREATE',
111
+ componentType: 'SiteMap',
112
+ componentName: config.name,
113
+ componentId: sitemapId,
114
+ success: true,
115
+ executionTimeMs: Date.now() - startTime,
116
+ });
117
+ return {
118
+ sitemapId,
119
+ sitemapName: config.name,
120
+ sitemapXml: xml,
121
+ message: 'Sitemap created successfully. Add it to your app using add-entities-to-app.',
122
+ };
123
+ }
124
+ catch (error) {
125
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
126
+ auditLogger.log({
127
+ operation: 'createSimpleSitemap',
128
+ operationType: 'CREATE',
129
+ componentType: 'SiteMap',
130
+ componentName: config.name,
131
+ success: false,
132
+ error: errorMessage,
133
+ executionTimeMs: Date.now() - startTime,
134
+ });
135
+ throw new Error(`Failed to create sitemap: ${errorMessage}`);
136
+ }
137
+ }
138
+ /**
139
+ * Add entities to an app
140
+ */
141
+ async addEntitiesToApp(appId, entityNames) {
142
+ const startTime = Date.now();
143
+ try {
144
+ // Get app details
145
+ const app = await this.client.makeRequest(`api/data/v9.2/appmodules(${appId})?$select=appmoduleid,name,uniquename`);
146
+ // Validate entities and get metadata
147
+ const entityPromises = entityNames.map((name) => this.client.makeRequest(`api/data/v9.2/EntityDefinitions(LogicalName='${name}')?$select=LogicalName,DisplayName,MetadataId`));
148
+ const entities = await Promise.all(entityPromises);
149
+ // Get the app's sitemap
150
+ let sitemapInfo = await this.getAppSitemap(appId);
151
+ // If not found via components, try to find by matching name
152
+ if (!sitemapInfo.hasSitemap) {
153
+ const sitemapQuery = await this.client.makeRequest(`api/data/v9.2/sitemaps?$filter=sitemapnameunique eq '${app.uniquename}'&$select=sitemapid,sitemapname,sitemapnameunique,sitemapxml`);
154
+ if (sitemapQuery.value.length > 0) {
155
+ const sitemap = sitemapQuery.value[0];
156
+ sitemapInfo = {
157
+ hasSitemap: true,
158
+ sitemapid: sitemap.sitemapid,
159
+ sitemapxml: sitemap.sitemapxml,
160
+ };
161
+ }
162
+ else {
163
+ throw new Error(`App '${app.name}' does not have a sitemap. Cannot add entities without a sitemap.`);
164
+ }
165
+ }
166
+ // Parse sitemap XML
167
+ let sitemapXml = sitemapInfo.sitemapxml;
168
+ // Check for or create Tables area
169
+ const areaRegex = /<Area[^>]+Id="Area_Tables"[^>]*>/;
170
+ const hasTablesArea = areaRegex.test(sitemapXml);
171
+ if (!hasTablesArea) {
172
+ const newArea = `
173
+ <Area Id="Area_Tables" Title="Tables" ShowGroups="true">
174
+ <Group Id="Group_Tables" Title="Custom Tables">
175
+ </Group>
176
+ </Area>`;
177
+ sitemapXml = sitemapXml.replace('</SiteMap>', newArea + '\n</SiteMap>');
178
+ }
179
+ // Add SubArea elements for each entity
180
+ for (const entity of entities) {
181
+ const displayName = entity.DisplayName
182
+ ?.UserLocalizedLabel?.Label ||
183
+ entity.LogicalName;
184
+ const subAreaId = `SubArea_${entity.LogicalName}`;
185
+ // Skip if already exists
186
+ const subAreaRegex = new RegExp(`<SubArea[^>]+Id="${subAreaId}"[^>]*>`);
187
+ if (subAreaRegex.test(sitemapXml)) {
188
+ continue;
189
+ }
190
+ const newSubArea = `
191
+ <SubArea Id="${subAreaId}" Entity="${entity.LogicalName}" Title="${displayName}" />`;
192
+ sitemapXml = sitemapXml.replace(/<\/Group>/, newSubArea + '\n </Group>');
193
+ }
194
+ // Update the sitemap
195
+ await rateLimiter.execute(async () => {
196
+ return await this.client.makeRequest(`api/data/v9.2/sitemaps(${sitemapInfo.sitemapid})`, 'PATCH', { sitemapxml: sitemapXml });
197
+ });
198
+ // Add entity components to app
199
+ for (const entity of entities) {
200
+ try {
201
+ await rateLimiter.execute(async () => {
202
+ return await this.client.makeRequest(`api/data/v9.2/appmodules(${appId})/appmodule_appmodulecomponent`, 'POST', {
203
+ componenttype: 1, // Entity
204
+ objectid: entity.MetadataId,
205
+ });
206
+ });
207
+ }
208
+ catch (componentError) {
209
+ const errorMsg = componentError instanceof Error
210
+ ? componentError.message
211
+ : 'Unknown error';
212
+ auditLogger.log({
213
+ operation: 'addEntitiesToApp',
214
+ operationType: 'CREATE',
215
+ componentType: 'AppModuleComponent',
216
+ componentName: entity.LogicalName,
217
+ success: false,
218
+ error: `Failed to add ${entity.LogicalName} as app component: ${errorMsg}`,
219
+ executionTimeMs: Date.now() - startTime,
220
+ });
221
+ }
222
+ }
223
+ auditLogger.log({
224
+ operation: 'addEntitiesToApp',
225
+ operationType: 'UPDATE',
226
+ componentType: 'AppModule',
227
+ componentId: appId,
228
+ success: true,
229
+ executionTimeMs: Date.now() - startTime,
230
+ });
231
+ return {
232
+ appId,
233
+ sitemapId: sitemapInfo.sitemapid,
234
+ entitiesAdded: entityNames,
235
+ message: `Successfully added ${entityNames.length} entities to app sitemap. Remember to publish the app.`,
236
+ };
237
+ }
238
+ catch (error) {
239
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
240
+ auditLogger.log({
241
+ operation: 'addEntitiesToApp',
242
+ operationType: 'UPDATE',
243
+ componentType: 'AppModule',
244
+ componentId: appId,
245
+ success: false,
246
+ error: errorMessage,
247
+ executionTimeMs: Date.now() - startTime,
248
+ });
249
+ throw new Error(`Failed to add entities to app: ${errorMessage}`);
250
+ }
251
+ }
252
+ /**
253
+ * Validate an app before publishing
254
+ */
255
+ async validateApp(appId) {
256
+ const response = await this.client.makeRequest(`api/data/v9.2/ValidateApp(AppModuleId=${appId})`);
257
+ const validationResponse = response.AppValidationResponse;
258
+ const isValid = validationResponse.ValidationSuccess;
259
+ const issues = validationResponse.ValidationIssueList || [];
260
+ return {
261
+ appId,
262
+ isValid,
263
+ issueCount: issues.length,
264
+ issues: issues.map((issue) => {
265
+ const i = issue;
266
+ return {
267
+ errorType: i.ErrorType,
268
+ message: i.Message,
269
+ componentId: i.ComponentId,
270
+ componentType: i.ComponentType,
271
+ };
272
+ }),
273
+ message: isValid
274
+ ? 'App validation passed. Ready to publish.'
275
+ : `App validation found ${issues.length} issue(s). Fix them before publishing.`,
276
+ };
277
+ }
278
+ /**
279
+ * Publish an app
280
+ */
281
+ async publishApp(appId, publishXml) {
282
+ const startTime = Date.now();
283
+ try {
284
+ // First validate
285
+ const validation = await this.validateApp(appId);
286
+ if (!validation.isValid) {
287
+ throw new Error(`Cannot publish app with validation errors: ${JSON.stringify(validation.issues)}`);
288
+ }
289
+ // Publish
290
+ const parameterXml = `<importexportxml><appmodules><appmodule>${appId}</appmodule></appmodules></importexportxml>`;
291
+ await rateLimiter.execute(async () => {
292
+ return await publishXml(parameterXml);
293
+ });
294
+ auditLogger.log({
295
+ operation: 'publishApp',
296
+ operationType: 'PUBLISH',
297
+ componentType: 'AppModule',
298
+ componentId: appId,
299
+ success: true,
300
+ executionTimeMs: Date.now() - startTime,
301
+ });
302
+ return {
303
+ appId,
304
+ message: 'App published successfully. It is now available to users with appropriate security roles.',
305
+ };
306
+ }
307
+ catch (error) {
308
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
309
+ auditLogger.log({
310
+ operation: 'publishApp',
311
+ operationType: 'PUBLISH',
312
+ componentType: 'AppModule',
313
+ componentId: appId,
314
+ success: false,
315
+ error: errorMessage,
316
+ executionTimeMs: Date.now() - startTime,
317
+ });
318
+ throw new Error(`Failed to publish app: ${errorMessage}`);
319
+ }
320
+ }
321
+ }
322
+ //# sourceMappingURL=AppManagementService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppManagementService.js","sourceRoot":"","sources":["../../src/services/AppManagementService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * AppService
3
+ *
4
+ * Read-only service for model-driven apps in Dynamics 365.
5
+ */
6
+ import type { PowerPlatformClient } from '../client/PowerPlatformClient.js';
7
+ export declare class AppService {
8
+ private client;
9
+ constructor(client: PowerPlatformClient);
10
+ /**
11
+ * Get all model-driven apps in the environment
12
+ */
13
+ getApps(activeOnly?: boolean, maxRecords?: number, includeUnpublished?: boolean, solutionUniqueName?: string): Promise<{
14
+ totalCount: number;
15
+ apps: unknown[];
16
+ filters: {
17
+ activeOnly: boolean;
18
+ includeUnpublished: boolean;
19
+ solutionUniqueName: string;
20
+ };
21
+ }>;
22
+ /**
23
+ * Get a specific model-driven app by ID
24
+ */
25
+ getApp(appId: string): Promise<unknown>;
26
+ /**
27
+ * Get all components (entities, forms, views, sitemaps) associated with an app
28
+ */
29
+ getAppComponents(appId: string): Promise<{
30
+ totalCount: number;
31
+ components: unknown[];
32
+ groupedByType: Record<string, unknown[]>;
33
+ }>;
34
+ /**
35
+ * Get the sitemap for a specific app
36
+ */
37
+ getAppSitemap(appId: string): Promise<unknown>;
38
+ }
39
+ //# sourceMappingURL=AppService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppService.d.ts","sourceRoot":"","sources":["../../src/services/AppService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAG5E,qBAAa,UAAU;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,mBAAmB;IAE/C;;OAEG;IACG,OAAO,CACX,UAAU,GAAE,OAAe,EAC3B,UAAU,GAAE,MAAY,EACxB,kBAAkB,GAAE,OAAc,EAClC,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,OAAO,EAAE,CAAC;QAChB,OAAO,EAAE;YACP,UAAU,EAAE,OAAO,CAAC;YACpB,kBAAkB,EAAE,OAAO,CAAC;YAC5B,kBAAkB,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH,CAAC;IAwFF;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B7C;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,EAAE,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;KAC1C,CAAC;IAgDF;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAqCrD"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * AppService
3
+ *
4
+ * Read-only service for model-driven apps in Dynamics 365.
5
+ */
6
+ export class AppService {
7
+ client;
8
+ constructor(client) {
9
+ this.client = client;
10
+ }
11
+ /**
12
+ * Get all model-driven apps in the environment
13
+ */
14
+ async getApps(activeOnly = false, maxRecords = 100, includeUnpublished = true, solutionUniqueName) {
15
+ // Build filter conditions
16
+ const filters = [];
17
+ // StateCode: 0=Active, 1=Inactive
18
+ if (activeOnly) {
19
+ filters.push('statecode eq 0');
20
+ }
21
+ // Published status: publishedon null = unpublished
22
+ if (!includeUnpublished) {
23
+ filters.push('publishedon ne null');
24
+ }
25
+ const filterString = filters.length > 0 ? `&$filter=${filters.join(' and ')}` : '';
26
+ const apps = await this.client.makeRequest(`api/data/v9.2/appmodules?$select=appmoduleid,name,uniquename,description,webresourceid,clienttype,formfactor,navigationtype,url,isfeatured,isdefault,publishedon,statecode,statuscode,_publisherid_value,createdon,modifiedon&$orderby=modifiedon desc&$top=${maxRecords}${filterString}`);
27
+ // If solution filter specified, filter results by solution
28
+ let filteredApps = apps.value;
29
+ if (solutionUniqueName) {
30
+ // Query solution components to find apps in the specified solution
31
+ const solution = await this.client.makeRequest(`api/data/v9.2/solutions?$filter=uniquename eq '${solutionUniqueName}'&$select=solutionid`);
32
+ if (solution.value.length > 0) {
33
+ const solutionId = solution.value[0].solutionid;
34
+ // Query solution components for app modules
35
+ const solutionComponents = await this.client.makeRequest(`api/data/v9.2/solutioncomponents?$filter=_solutionid_value eq ${solutionId} and componenttype eq 80&$select=objectid`);
36
+ const appIdsInSolution = new Set(solutionComponents.value.map((c) => c.objectid.toLowerCase()));
37
+ filteredApps = apps.value.filter((app) => appIdsInSolution.has(app.appmoduleid.toLowerCase()));
38
+ }
39
+ }
40
+ // Format the results for better readability
41
+ const formattedApps = filteredApps.map((app) => ({
42
+ appmoduleid: app.appmoduleid,
43
+ name: app.name,
44
+ uniquename: app.uniquename,
45
+ description: app.description,
46
+ webresourceid: app.webresourceid,
47
+ clienttype: app.clienttype,
48
+ formfactor: app.formfactor,
49
+ navigationtype: app.navigationtype,
50
+ url: app.url,
51
+ isfeatured: app.isfeatured,
52
+ isdefault: app.isdefault,
53
+ state: app.statecode === 0 ? 'Active' : 'Inactive',
54
+ statecode: app.statecode,
55
+ statuscode: app.statuscode,
56
+ publishedon: app.publishedon,
57
+ published: app.publishedon ? true : false,
58
+ publisherid: app._publisherid_value || null,
59
+ createdon: app.createdon,
60
+ modifiedon: app.modifiedon,
61
+ }));
62
+ return {
63
+ totalCount: formattedApps.length,
64
+ apps: formattedApps,
65
+ filters: {
66
+ activeOnly,
67
+ includeUnpublished,
68
+ solutionUniqueName: solutionUniqueName || 'all',
69
+ },
70
+ };
71
+ }
72
+ /**
73
+ * Get a specific model-driven app by ID
74
+ */
75
+ async getApp(appId) {
76
+ const app = await this.client.makeRequest(`api/data/v9.2/appmodules(${appId})?$select=appmoduleid,name,uniquename,description,webresourceid,clienttype,formfactor,navigationtype,url,isfeatured,isdefault,publishedon,statecode,statuscode,configxml,createdon,modifiedon,_publisherid_value,_createdby_value,_modifiedby_value`);
77
+ return {
78
+ appmoduleid: app.appmoduleid,
79
+ name: app.name,
80
+ uniquename: app.uniquename,
81
+ description: app.description,
82
+ webresourceid: app.webresourceid,
83
+ clienttype: app.clienttype,
84
+ formfactor: app.formfactor,
85
+ navigationtype: app.navigationtype === 0 ? 'Single Session' : 'Multi Session',
86
+ url: app.url,
87
+ isfeatured: app.isfeatured,
88
+ isdefault: app.isdefault,
89
+ state: app.statecode === 0 ? 'Active' : 'Inactive',
90
+ statecode: app.statecode,
91
+ statuscode: app.statuscode,
92
+ publishedon: app.publishedon,
93
+ createdon: app.createdon,
94
+ modifiedon: app.modifiedon,
95
+ createdBy: app._createdby_value || null,
96
+ modifiedBy: app._modifiedby_value || null,
97
+ publisherid: app._publisherid_value || null,
98
+ };
99
+ }
100
+ /**
101
+ * Get all components (entities, forms, views, sitemaps) associated with an app
102
+ */
103
+ async getAppComponents(appId) {
104
+ const components = await this.client.makeRequest(`api/data/v9.2/appmodulecomponents?$filter=_appmoduleidunique_value eq ${appId}&$select=appmodulecomponentid,objectid,componenttype,rootappmodulecomponentid,createdon,modifiedon&$orderby=componenttype asc`);
105
+ // Map component type numbers to friendly names
106
+ const componentTypeMap = {
107
+ 1: 'Entity',
108
+ 24: 'Form',
109
+ 26: 'View',
110
+ 29: 'Business Process Flow',
111
+ 48: 'Ribbon Command',
112
+ 59: 'Chart/Dashboard',
113
+ 60: 'System Form',
114
+ 62: 'SiteMap',
115
+ };
116
+ const formattedComponents = components.value.map((component) => ({
117
+ appmodulecomponentid: component.appmodulecomponentid,
118
+ objectid: component.objectid,
119
+ componenttype: component.componenttype,
120
+ componenttypeName: componentTypeMap[component.componenttype] ||
121
+ `Unknown (${component.componenttype})`,
122
+ rootappmodulecomponentid: component.rootappmodulecomponentid,
123
+ createdon: component.createdon,
124
+ modifiedon: component.modifiedon,
125
+ }));
126
+ // Group by component type for easier reading
127
+ const groupedByType = {};
128
+ formattedComponents.forEach((comp) => {
129
+ const typeName = comp.componenttypeName;
130
+ if (!groupedByType[typeName]) {
131
+ groupedByType[typeName] = [];
132
+ }
133
+ groupedByType[typeName].push(comp);
134
+ });
135
+ return {
136
+ totalCount: formattedComponents.length,
137
+ components: formattedComponents,
138
+ groupedByType,
139
+ };
140
+ }
141
+ /**
142
+ * Get the sitemap for a specific app
143
+ */
144
+ async getAppSitemap(appId) {
145
+ // First get the app components to find the sitemap
146
+ const components = await this.client.makeRequest(`api/data/v9.2/appmodulecomponents?$filter=_appmoduleidunique_value eq ${appId} and componenttype eq 62&$select=objectid`);
147
+ if (components.value.length === 0) {
148
+ return {
149
+ hasSitemap: false,
150
+ message: 'No sitemap found for this app',
151
+ };
152
+ }
153
+ // Get the sitemap details
154
+ const sitemapId = components.value[0].objectid;
155
+ const sitemap = await this.client.makeRequest(`api/data/v9.2/sitemaps(${sitemapId})?$select=sitemapid,sitemapname,sitemapnameunique,sitemapxml,isappaware,enablecollapsiblegroups,showhome,showpinned,showrecents,ismanaged,createdon,modifiedon`);
156
+ return {
157
+ hasSitemap: true,
158
+ sitemapid: sitemap.sitemapid,
159
+ sitemapname: sitemap.sitemapname,
160
+ sitemapnameunique: sitemap.sitemapnameunique,
161
+ sitemapxml: sitemap.sitemapxml,
162
+ isappaware: sitemap.isappaware,
163
+ enablecollapsiblegroups: sitemap.enablecollapsiblegroups,
164
+ showhome: sitemap.showhome,
165
+ showpinned: sitemap.showpinned,
166
+ showrecents: sitemap.showrecents,
167
+ ismanaged: sitemap.ismanaged,
168
+ createdon: sitemap.createdon,
169
+ modifiedon: sitemap.modifiedon,
170
+ };
171
+ }
172
+ }
173
+ //# sourceMappingURL=AppService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppService.js","sourceRoot":"","sources":["../../src/services/AppService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * AttributeService
3
+ *
4
+ * Service for attribute (column) customization operations.
5
+ * Note: This service should only be used by powerplatform-customization package.
6
+ */
7
+ import type { PowerPlatformClient } from '../client/PowerPlatformClient.js';
8
+ export declare class AttributeService {
9
+ private client;
10
+ constructor(client: PowerPlatformClient);
11
+ /**
12
+ * Create a new attribute on an entity
13
+ */
14
+ createAttribute(entityLogicalName: string, attributeDefinition: Record<string, unknown>, solutionUniqueName?: string): Promise<unknown>;
15
+ /**
16
+ * Update an existing attribute
17
+ */
18
+ updateAttribute(entityLogicalName: string, attributeLogicalName: string, updates: Record<string, unknown>, getEntityAttribute: (entityName: string, attrName: string) => Promise<Record<string, unknown>>, solutionUniqueName?: string): Promise<void>;
19
+ /**
20
+ * Delete an attribute
21
+ */
22
+ deleteAttribute(entityLogicalName: string, attributeMetadataId: string): Promise<void>;
23
+ /**
24
+ * Create a picklist attribute using a global option set
25
+ */
26
+ createGlobalOptionSetAttribute(entityLogicalName: string, attributeDefinition: Record<string, unknown>, solutionUniqueName?: string): Promise<unknown>;
27
+ }
28
+ //# sourceMappingURL=AttributeService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttributeService.d.ts","sourceRoot":"","sources":["../../src/services/AttributeService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,qBAAa,gBAAgB;IACf,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,mBAAmB;IAE/C;;OAEG;IACG,eAAe,CACnB,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,OAAO,CAAC;IA2CnB;;OAEG;IACG,eAAe,CACnB,iBAAiB,EAAE,MAAM,EACzB,oBAAoB,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,kBAAkB,EAAE,CAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACrC,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IA8BhB;;OAEG;IACG,eAAe,CACnB,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,8BAA8B,CAClC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,OAAO,CAAC;CAoBpB"}