@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,125 @@
1
+ /**
2
+ * SolutionService
3
+ *
4
+ * Service for solution management operations.
5
+ * Note: This service should only be used by powerplatform-customization package.
6
+ */
7
+ export class SolutionService {
8
+ client;
9
+ constructor(client) {
10
+ this.client = client;
11
+ }
12
+ /**
13
+ * Create a publisher
14
+ */
15
+ async createPublisher(publisher) {
16
+ return this.client.makeRequest('api/data/v9.2/publishers', 'POST', publisher);
17
+ }
18
+ /**
19
+ * Get publishers
20
+ */
21
+ async getPublishers() {
22
+ return this.client.makeRequest('api/data/v9.2/publishers?$filter=isreadonly eq false');
23
+ }
24
+ /**
25
+ * Create a solution
26
+ */
27
+ async createSolution(solution) {
28
+ return this.client.makeRequest('api/data/v9.2/solutions', 'POST', solution);
29
+ }
30
+ /**
31
+ * Get solutions
32
+ */
33
+ async getSolutions() {
34
+ return this.client.makeRequest('api/data/v9.2/solutions?$filter=isvisible eq true&$orderby=createdon desc');
35
+ }
36
+ /**
37
+ * Get solution by unique name
38
+ */
39
+ async getSolution(uniqueName) {
40
+ const result = await this.client.makeRequest(`api/data/v9.2/solutions?$filter=uniquename eq '${uniqueName}'&$top=1`);
41
+ return result.value && result.value.length > 0 ? result.value[0] : null;
42
+ }
43
+ /**
44
+ * Add component to solution
45
+ */
46
+ async addComponentToSolution(solutionUniqueName, componentId, componentType, addRequiredComponents = true, includedComponentSettingsValues) {
47
+ await this.client.makeRequest('api/data/v9.2/AddSolutionComponent', 'POST', {
48
+ SolutionUniqueName: solutionUniqueName,
49
+ ComponentId: componentId,
50
+ ComponentType: componentType,
51
+ AddRequiredComponents: addRequiredComponents,
52
+ IncludedComponentSettingsValues: includedComponentSettingsValues,
53
+ });
54
+ }
55
+ /**
56
+ * Remove component from solution
57
+ */
58
+ async removeComponentFromSolution(solutionUniqueName, componentId, componentType) {
59
+ await this.client.makeRequest('api/data/v9.2/RemoveSolutionComponent', 'POST', {
60
+ SolutionUniqueName: solutionUniqueName,
61
+ ComponentId: componentId,
62
+ ComponentType: componentType,
63
+ });
64
+ }
65
+ /**
66
+ * Get solution components
67
+ */
68
+ async getSolutionComponents(solutionUniqueName) {
69
+ const solution = await this.getSolution(solutionUniqueName);
70
+ if (!solution) {
71
+ throw new Error(`Solution '${solutionUniqueName}' not found`);
72
+ }
73
+ return this.client.makeRequest(`api/data/v9.2/solutioncomponents?$filter=_solutionid_value eq ${solution.solutionid}&$orderby=componenttype`);
74
+ }
75
+ /**
76
+ * Export solution
77
+ */
78
+ async exportSolution(solutionName, managed = false) {
79
+ return this.client.makeRequest('api/data/v9.2/ExportSolution', 'POST', {
80
+ SolutionName: solutionName,
81
+ Managed: managed,
82
+ ExportAutoNumberingSettings: true,
83
+ ExportCalendarSettings: true,
84
+ ExportCustomizationSettings: true,
85
+ ExportEmailTrackingSettings: true,
86
+ ExportGeneralSettings: true,
87
+ ExportMarketingSettings: true,
88
+ ExportOutlookSynchronizationSettings: true,
89
+ ExportRelationshipRoles: true,
90
+ ExportIsvConfig: true,
91
+ ExportSales: true,
92
+ ExportExternalApplications: true,
93
+ });
94
+ }
95
+ /**
96
+ * Import solution
97
+ */
98
+ async importSolution(customizationFile, publishWorkflows = true, overwriteUnmanagedCustomizations = false) {
99
+ return this.client.makeRequest('api/data/v9.2/ImportSolution', 'POST', {
100
+ CustomizationFile: customizationFile,
101
+ PublishWorkflows: publishWorkflows,
102
+ OverwriteUnmanagedCustomizations: overwriteUnmanagedCustomizations,
103
+ SkipProductUpdateDependencies: false,
104
+ HoldingSolution: false,
105
+ ImportJobId: this.generateGuid(),
106
+ });
107
+ }
108
+ /**
109
+ * Delete a solution
110
+ */
111
+ async deleteSolution(solutionId) {
112
+ await this.client.makeRequest(`api/data/v9.2/solutions(${solutionId})`, 'DELETE');
113
+ }
114
+ /**
115
+ * Generate a GUID
116
+ */
117
+ generateGuid() {
118
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
119
+ const r = (Math.random() * 16) | 0;
120
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
121
+ return v.toString(16);
122
+ });
123
+ }
124
+ }
125
+ //# sourceMappingURL=SolutionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolutionService.js","sourceRoot":"","sources":["../../src/services/SolutionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * ValidationService
3
+ *
4
+ * Read-only service for validating entities against best practices.
5
+ */
6
+ import type { PowerPlatformClient } from '../client/PowerPlatformClient.js';
7
+ import type { BestPracticesValidationResult } from '../client/types.js';
8
+ export declare class ValidationService {
9
+ private client;
10
+ constructor(client: PowerPlatformClient);
11
+ /**
12
+ * Validate entities against Dataverse best practices
13
+ */
14
+ validateBestPractices(solutionUniqueName: string | undefined, entityLogicalNames: string[] | undefined, publisherPrefix: string, recentDays?: number, includeRefDataTables?: boolean, rules?: string[], maxEntities?: number, requiredColumns?: string[]): Promise<BestPracticesValidationResult>;
15
+ /**
16
+ * Helper method to validate entity-level properties and attributes against best practice rules
17
+ */
18
+ private validateEntityAndAttributes;
19
+ /**
20
+ * Build violations summary with complete lists of affected entities and columns grouped by rule
21
+ */
22
+ private buildViolationsSummary;
23
+ /**
24
+ * Validate schema name against PowerPlatform naming rules
25
+ */
26
+ validateSchemaName(schemaName: string, prefix: string): {
27
+ valid: boolean;
28
+ errors: string[];
29
+ };
30
+ }
31
+ //# sourceMappingURL=ValidationService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationService.d.ts","sourceRoot":"","sources":["../../src/services/ValidationService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAEV,6BAA6B,EAI9B,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,iBAAiB;IAChB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,mBAAmB;IAE/C;;OAEG;IACG,qBAAqB,CACzB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,kBAAkB,EAAE,MAAM,EAAE,GAAG,SAAS,EACxC,eAAe,EAAE,MAAM,EACvB,UAAU,GAAE,MAAW,EACvB,oBAAoB,GAAE,OAAc,EACpC,KAAK,GAAE,MAAM,EAOZ,EACD,WAAW,GAAE,MAAU,EACvB,eAAe,GAAE,MAAM,EAAiC,GACvD,OAAO,CAAC,6BAA6B,CAAC;IAiNzC;;OAEG;YACW,2BAA2B;IAkMzC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuE9B;;OAEG;IACH,kBAAkB,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CAyBxC"}
@@ -0,0 +1,391 @@
1
+ /**
2
+ * ValidationService
3
+ *
4
+ * Read-only service for validating entities against best practices.
5
+ */
6
+ export class ValidationService {
7
+ client;
8
+ constructor(client) {
9
+ this.client = client;
10
+ }
11
+ /**
12
+ * Validate entities against Dataverse best practices
13
+ */
14
+ async validateBestPractices(solutionUniqueName, entityLogicalNames, publisherPrefix, recentDays = 30, includeRefDataTables = true, rules = [
15
+ 'prefix',
16
+ 'lowercase',
17
+ 'lookup',
18
+ 'optionset',
19
+ 'required-column',
20
+ 'entity-icon',
21
+ ], maxEntities = 0, requiredColumns = ['{prefix}updatedbyprocess']) {
22
+ const startTime = Date.now();
23
+ const statisticsCounters = {
24
+ systemColumns: 0,
25
+ oldColumns: 0,
26
+ };
27
+ let entities = [];
28
+ let solutionFriendlyName;
29
+ // STEP 1: Discover entities
30
+ if (solutionUniqueName) {
31
+ // Get solution ID
32
+ const solutionResponse = await this.client.makeRequest(`api/data/v9.2/solutions?$filter=uniquename eq '${solutionUniqueName}'&$select=solutionid,friendlyname,uniquename`);
33
+ if (!solutionResponse.value || solutionResponse.value.length === 0) {
34
+ throw new Error(`Solution not found: ${solutionUniqueName}`);
35
+ }
36
+ const solution = solutionResponse.value[0];
37
+ const solutionId = solution.solutionid;
38
+ solutionFriendlyName = solution.friendlyname;
39
+ // Get solution components (entities only, componenttype = 1)
40
+ const componentsResponse = await this.client.makeRequest(`api/data/v9.2/solutioncomponents?$filter=_solutionid_value eq ${solutionId} and componenttype eq 1&$select=objectid`);
41
+ // Get entity metadata for each component
42
+ for (const component of componentsResponse.value || []) {
43
+ const metadataId = component.objectid;
44
+ try {
45
+ // Query entity by MetadataId
46
+ const entityResponse = await this.client.makeRequest(`api/data/v9.2/EntityDefinitions(${metadataId})?$select=LogicalName,SchemaName`);
47
+ const logicalName = entityResponse.LogicalName;
48
+ // Filter: Only entities with publisher prefix
49
+ if (logicalName.startsWith(publisherPrefix)) {
50
+ // Filter: Optionally exclude RefData tables
51
+ if (includeRefDataTables ||
52
+ !logicalName.startsWith(`${publisherPrefix}ref_`)) {
53
+ entities.push(logicalName);
54
+ }
55
+ }
56
+ }
57
+ catch {
58
+ // Skip entities that can't be queried (managed/system entities)
59
+ }
60
+ }
61
+ // Apply max entities limit
62
+ if (maxEntities > 0 && entities.length > maxEntities) {
63
+ entities = entities.slice(0, maxEntities);
64
+ }
65
+ }
66
+ else if (entityLogicalNames) {
67
+ // Use explicit entity list
68
+ entities = entityLogicalNames.filter((name) => name.startsWith(publisherPrefix));
69
+ }
70
+ else {
71
+ throw new Error('Either solutionUniqueName or entityLogicalNames must be provided');
72
+ }
73
+ // STEP 2: Validate each entity
74
+ const results = [];
75
+ for (const entityLogicalName of entities) {
76
+ try {
77
+ // Get entity metadata (including icon information)
78
+ const entityMetadata = await this.client.makeRequest(`api/data/v9.2/EntityDefinitions(LogicalName='${entityLogicalName}')?$select=LogicalName,SchemaName,DisplayName,MetadataId,IconVectorName,IsCustomEntity`);
79
+ // Get all attributes for entity
80
+ const attributesResponse = await this.client.makeRequest(`api/data/v9.2/EntityDefinitions(LogicalName='${entityLogicalName}')/Attributes?$select=LogicalName,AttributeType,DisplayName,CreatedOn,IsCustomAttribute,AttributeTypeName`);
81
+ const attributes = attributesResponse.value || [];
82
+ // Apply filtering
83
+ const filteredAttributes = attributes.filter((attr) => {
84
+ const logicalName = attr.LogicalName;
85
+ const isCustomAttribute = attr.IsCustomAttribute;
86
+ const createdOn = attr.CreatedOn;
87
+ // Rule: Must have publisher prefix
88
+ if (!logicalName.startsWith(publisherPrefix)) {
89
+ statisticsCounters.systemColumns++;
90
+ return false; // Exclude system columns
91
+ }
92
+ // Rule: Must be custom attribute (additional safety)
93
+ if (!isCustomAttribute) {
94
+ statisticsCounters.systemColumns++;
95
+ return false;
96
+ }
97
+ // Rule: Must be within time threshold
98
+ if (recentDays > 0 && createdOn) {
99
+ const createdDate = new Date(createdOn);
100
+ const daysAgo = (Date.now() - createdDate.getTime()) / (1000 * 60 * 60 * 24);
101
+ if (daysAgo > recentDays) {
102
+ statisticsCounters.oldColumns++;
103
+ return false; // Too old
104
+ }
105
+ }
106
+ return true;
107
+ });
108
+ // Validate entity-level properties and attributes
109
+ const violations = await this.validateEntityAndAttributes(entityMetadata, filteredAttributes, attributes, // Pass all attributes for required column check
110
+ publisherPrefix, rules, requiredColumns);
111
+ const displayName = entityMetadata.DisplayName?.UserLocalizedLabel?.Label || entityMetadata.LogicalName;
112
+ results.push({
113
+ logicalName: entityMetadata.LogicalName,
114
+ schemaName: entityMetadata.SchemaName,
115
+ displayName: displayName,
116
+ isRefData: entityMetadata.LogicalName.startsWith(`${publisherPrefix}ref_`),
117
+ attributesChecked: filteredAttributes.length,
118
+ violations: violations,
119
+ isCompliant: violations.length === 0,
120
+ });
121
+ }
122
+ catch {
123
+ // Skip entities that fail validation
124
+ }
125
+ }
126
+ // STEP 3: Calculate summary statistics
127
+ const summary = {
128
+ entitiesChecked: results.length,
129
+ attributesChecked: results.reduce((sum, e) => sum + e.attributesChecked, 0),
130
+ totalViolations: results.reduce((sum, e) => sum + e.violations.length, 0),
131
+ criticalViolations: results.reduce((sum, e) => sum + e.violations.filter((v) => v.severity === 'MUST').length, 0),
132
+ warnings: results.reduce((sum, e) => sum + e.violations.filter((v) => v.severity === 'SHOULD').length, 0),
133
+ compliantEntities: results.filter((e) => e.isCompliant).length,
134
+ };
135
+ const executionTimeMs = Date.now() - startTime;
136
+ // STEP 4: Build violations summary with complete lists
137
+ const violationsSummary = this.buildViolationsSummary(results);
138
+ // Build final result
139
+ return {
140
+ metadata: {
141
+ generatedAt: new Date().toISOString(),
142
+ solutionName: solutionFriendlyName,
143
+ solutionUniqueName: solutionUniqueName,
144
+ publisherPrefix,
145
+ recentDays,
146
+ executionTimeMs,
147
+ },
148
+ summary,
149
+ violationsSummary,
150
+ entities: results,
151
+ statistics: {
152
+ systemColumnsExcluded: statisticsCounters.systemColumns,
153
+ oldColumnsExcluded: statisticsCounters.oldColumns,
154
+ refDataTablesSkipped: results.filter((e) => e.isRefData).length,
155
+ },
156
+ };
157
+ }
158
+ /**
159
+ * Helper method to validate entity-level properties and attributes against best practice rules
160
+ */
161
+ async validateEntityAndAttributes(entityMetadata, filteredAttributes, allAttributes, publisherPrefix, rules, requiredColumns) {
162
+ const violations = [];
163
+ const entityLogicalName = entityMetadata.LogicalName;
164
+ // ENTITY-LEVEL VALIDATION: Check if entity has an icon
165
+ if (rules.includes('entity-icon')) {
166
+ // Only check custom entities (IsCustomEntity = true)
167
+ if (entityMetadata.IsCustomEntity) {
168
+ const iconVectorName = entityMetadata.IconVectorName;
169
+ const hasIcon = iconVectorName && iconVectorName.length > 0 && iconVectorName !== null;
170
+ if (!hasIcon) {
171
+ violations.push({
172
+ attributeLogicalName: undefined, // Entity-level violation
173
+ rule: 'Entity Icon',
174
+ severity: 'SHOULD',
175
+ message: `Entity "${entityLogicalName}" does not have a custom icon assigned`,
176
+ currentValue: 'No icon',
177
+ expectedValue: 'Custom icon (SVG web resource)',
178
+ action: `Assign a Fluent UI icon using the update-entity-icon tool. Example: update-entity-icon with entityLogicalName="${entityLogicalName}" and an appropriate icon file.`,
179
+ recommendation: 'Custom icons improve entity recognition in Model-Driven Apps and enhance user experience. Use Fluent UI System Icons for consistency with Microsoft design language.',
180
+ });
181
+ }
182
+ }
183
+ }
184
+ // RULE 1: Publisher Prefix Check
185
+ if (rules.includes('prefix')) {
186
+ for (const attr of filteredAttributes) {
187
+ const logicalName = attr.LogicalName;
188
+ if (!logicalName.startsWith(publisherPrefix)) {
189
+ violations.push({
190
+ attributeLogicalName: logicalName,
191
+ attributeType: attr.AttributeTypeName?.Value ||
192
+ attr.AttributeType,
193
+ createdOn: attr.CreatedOn,
194
+ rule: 'Publisher Prefix',
195
+ severity: 'MUST',
196
+ message: `Column "${logicalName}" does not have required prefix "${publisherPrefix}"`,
197
+ currentValue: logicalName,
198
+ expectedValue: `${publisherPrefix}${logicalName}`,
199
+ action: `Rename column to add "${publisherPrefix}" prefix`,
200
+ });
201
+ }
202
+ }
203
+ }
204
+ // RULE 2: Schema Name Lowercase Check
205
+ if (rules.includes('lowercase')) {
206
+ for (const attr of filteredAttributes) {
207
+ const logicalName = attr.LogicalName;
208
+ if (logicalName !== logicalName.toLowerCase()) {
209
+ violations.push({
210
+ attributeLogicalName: logicalName,
211
+ attributeType: attr.AttributeTypeName?.Value ||
212
+ attr.AttributeType,
213
+ createdOn: attr.CreatedOn,
214
+ rule: 'Schema Name Lowercase',
215
+ severity: 'MUST',
216
+ message: `Column "${logicalName}" contains uppercase letters`,
217
+ currentValue: logicalName,
218
+ expectedValue: logicalName.toLowerCase(),
219
+ action: `Rename column to use all lowercase: ${logicalName.toLowerCase()}`,
220
+ });
221
+ }
222
+ }
223
+ }
224
+ // RULE 3: Lookup Naming Convention
225
+ if (rules.includes('lookup')) {
226
+ for (const attr of filteredAttributes) {
227
+ const logicalName = attr.LogicalName;
228
+ const attributeType = attr.AttributeType;
229
+ const attributeTypeName = attr.AttributeTypeName
230
+ ?.Value;
231
+ // Check if it's a Lookup type
232
+ const isLookup = attributeType === 'Lookup' || attributeTypeName === 'LookupType';
233
+ if (isLookup && !logicalName.endsWith('id')) {
234
+ violations.push({
235
+ attributeLogicalName: logicalName,
236
+ attributeType: 'Lookup',
237
+ createdOn: attr.CreatedOn,
238
+ rule: 'Lookup Naming Convention',
239
+ severity: 'MUST',
240
+ message: `Lookup column "${logicalName}" does not end with "id"`,
241
+ currentValue: logicalName,
242
+ expectedValue: `${logicalName}id`,
243
+ action: `Rename column to add "id" suffix: ${logicalName}id`,
244
+ });
245
+ }
246
+ }
247
+ }
248
+ // RULE 4: Option Set Scope Check
249
+ if (rules.includes('optionset')) {
250
+ for (const attr of filteredAttributes) {
251
+ const logicalName = attr.LogicalName;
252
+ const attributeType = attr.AttributeType;
253
+ const attributeTypeName = attr.AttributeTypeName
254
+ ?.Value;
255
+ // Check if it's a Picklist type
256
+ const isPicklist = attributeType === 'Picklist' || attributeTypeName === 'PicklistType';
257
+ if (isPicklist) {
258
+ try {
259
+ // Need to get full attribute details to check OptionSet.IsGlobal
260
+ const attrDetails = await this.client.makeRequest(`api/data/v9.2/EntityDefinitions(LogicalName='${entityLogicalName}')/Attributes(LogicalName='${logicalName}')?$select=LogicalName&$expand=OptionSet($select=IsGlobal)`);
261
+ const optionSet = attrDetails.OptionSet;
262
+ if (optionSet && !optionSet.IsGlobal) {
263
+ violations.push({
264
+ attributeLogicalName: logicalName,
265
+ attributeType: 'Picklist',
266
+ createdOn: attr.CreatedOn,
267
+ rule: 'Option Set Scope',
268
+ severity: 'MUST',
269
+ message: `Option set "${logicalName}" is local, must be global`,
270
+ currentValue: 'Local Option Set',
271
+ expectedValue: 'Global Option Set',
272
+ action: 'Convert to global option set for reusability',
273
+ recommendation: 'Use global option sets to enable reuse across entities and reduce maintenance',
274
+ });
275
+ }
276
+ }
277
+ catch {
278
+ // Skip if we can't get option set details
279
+ }
280
+ }
281
+ }
282
+ }
283
+ // RULE 5: Required Column Existence
284
+ if (rules.includes('required-column')) {
285
+ // Skip for RefData tables
286
+ if (!entityLogicalName.startsWith(`${publisherPrefix}ref_`)) {
287
+ // Replace {prefix} placeholder in each required column name
288
+ const resolvedColumns = requiredColumns.map((col) => col.replace('{prefix}', publisherPrefix));
289
+ // Check each required column
290
+ for (const requiredColumn of resolvedColumns) {
291
+ const hasColumn = allAttributes.some((attr) => attr.LogicalName === requiredColumn);
292
+ if (!hasColumn) {
293
+ // Extract display name from schema name (remove prefix, capitalize words)
294
+ const displayName = requiredColumn
295
+ .replace(publisherPrefix, '')
296
+ .split('_')
297
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
298
+ .join(' ');
299
+ violations.push({
300
+ attributeLogicalName: undefined, // Entity-level violation
301
+ rule: 'Required Column Existence',
302
+ severity: 'MUST',
303
+ message: `Entity "${entityLogicalName}" is missing required column "${requiredColumn}"`,
304
+ currentValue: 'Missing',
305
+ expectedValue: `Column "${requiredColumn}" must exist`,
306
+ action: `Create column with Display Name "${displayName}", Schema Name "${requiredColumn}", Type: Text (4000 chars), Description: "This field tracks ${displayName.toLowerCase()} information."`,
307
+ });
308
+ }
309
+ }
310
+ }
311
+ }
312
+ return violations;
313
+ }
314
+ /**
315
+ * Build violations summary with complete lists of affected entities and columns grouped by rule
316
+ */
317
+ buildViolationsSummary(entities) {
318
+ // Group violations by rule
319
+ const grouped = new Map();
320
+ for (const entity of entities) {
321
+ for (const violation of entity.violations) {
322
+ if (!grouped.has(violation.rule)) {
323
+ grouped.set(violation.rule, []);
324
+ }
325
+ grouped.get(violation.rule).push({
326
+ ...violation,
327
+ entityLogicalName: entity.logicalName,
328
+ });
329
+ }
330
+ }
331
+ // Build summary for each rule
332
+ const summary = [];
333
+ for (const [rule, items] of grouped.entries()) {
334
+ if (items.length === 0)
335
+ continue;
336
+ // Separate entity-level violations (no attributeLogicalName) from column-level
337
+ const entityLevelViolations = items.filter((v) => !v.attributeLogicalName);
338
+ const columnLevelViolations = items.filter((v) => v.attributeLogicalName);
339
+ // Get unique affected entities
340
+ const affectedEntities = [
341
+ ...new Set(entityLevelViolations.map((v) => v.entityLogicalName)),
342
+ ];
343
+ // Get unique affected columns (entity.column format)
344
+ const affectedColumns = [
345
+ ...new Set(columnLevelViolations.map((v) => `${v.entityLogicalName}.${v.attributeLogicalName}`)),
346
+ ];
347
+ // Get severity, action, and recommendation from first violation
348
+ const firstViolation = items[0];
349
+ summary.push({
350
+ rule,
351
+ severity: firstViolation.severity,
352
+ totalCount: items.length,
353
+ affectedEntities,
354
+ affectedColumns,
355
+ action: firstViolation.action,
356
+ recommendation: firstViolation.recommendation,
357
+ });
358
+ }
359
+ // Sort by severity (MUST first) then by count (descending)
360
+ summary.sort((a, b) => {
361
+ if (a.severity !== b.severity) {
362
+ return a.severity === 'MUST' ? -1 : 1;
363
+ }
364
+ return b.totalCount - a.totalCount;
365
+ });
366
+ return summary;
367
+ }
368
+ /**
369
+ * Validate schema name against PowerPlatform naming rules
370
+ */
371
+ validateSchemaName(schemaName, prefix) {
372
+ const errors = [];
373
+ // Check if starts with prefix
374
+ if (!schemaName.startsWith(prefix)) {
375
+ errors.push(`Schema name must start with prefix '${prefix}'`);
376
+ }
377
+ // Check for invalid characters
378
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(schemaName)) {
379
+ errors.push('Schema name must start with a letter or underscore and contain only letters, numbers, and underscores');
380
+ }
381
+ // Check length (max 64 characters for most components)
382
+ if (schemaName.length > 64) {
383
+ errors.push('Schema name must be 64 characters or less');
384
+ }
385
+ return {
386
+ valid: errors.length === 0,
387
+ errors,
388
+ };
389
+ }
390
+ }
391
+ //# sourceMappingURL=ValidationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationService.js","sourceRoot":"","sources":["../../src/services/ValidationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ViewService
3
+ *
4
+ * Service for view (saved query) 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 ViewService {
9
+ private client;
10
+ constructor(client: PowerPlatformClient);
11
+ /**
12
+ * Create a view (savedquery)
13
+ */
14
+ createView(view: Record<string, unknown>, solutionUniqueName?: string): Promise<unknown>;
15
+ /**
16
+ * Update a view
17
+ */
18
+ updateView(viewId: string, updates: Record<string, unknown>, solutionUniqueName?: string): Promise<void>;
19
+ /**
20
+ * Delete a view
21
+ */
22
+ deleteView(viewId: string): Promise<void>;
23
+ /**
24
+ * Get views for an entity
25
+ */
26
+ getViews(entityLogicalName: string): Promise<unknown>;
27
+ /**
28
+ * Set a view as the default view for its entity
29
+ */
30
+ setDefaultView(viewId: string): Promise<void>;
31
+ /**
32
+ * Get the FetchXML from a view
33
+ */
34
+ getViewFetchXml(viewId: string): Promise<unknown>;
35
+ }
36
+ //# sourceMappingURL=ViewService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewService.d.ts","sourceRoot":"","sources":["../../src/services/ViewService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,qBAAa,WAAW;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,mBAAmB;IAE/C;;OAEG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,OAAO,CAAC;IAanB;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IAahB;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACG,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM3D;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAKxD"}