@mcp-consultant-tools/powerplatform-customization 27.0.0 → 28.0.0-beta.10
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/build/cli/commands/attribute-commands.d.ts +7 -0
- package/build/cli/commands/attribute-commands.d.ts.map +1 -0
- package/build/cli/commands/attribute-commands.js +208 -0
- package/build/cli/commands/attribute-commands.js.map +1 -0
- package/build/cli/commands/entity-commands.d.ts +7 -0
- package/build/cli/commands/entity-commands.d.ts.map +1 -0
- package/build/cli/commands/entity-commands.js +134 -0
- package/build/cli/commands/entity-commands.js.map +1 -0
- package/build/cli/commands/index.d.ts +9 -0
- package/build/cli/commands/index.d.ts.map +1 -0
- package/build/cli/commands/index.js +12 -0
- package/build/cli/commands/index.js.map +1 -0
- package/build/cli/output.d.ts +20 -0
- package/build/cli/output.d.ts.map +1 -0
- package/build/cli/output.js +45 -0
- package/build/cli/output.js.map +1 -0
- package/build/cli.d.ts +9 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +27 -0
- package/build/cli.js.map +1 -0
- package/build/context-factory.d.ts +8 -0
- package/build/context-factory.d.ts.map +1 -0
- package/build/context-factory.js +36 -0
- package/build/context-factory.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +18 -3271
- package/build/index.js.map +1 -1
- package/build/services/index.d.ts +5 -0
- package/build/services/index.d.ts.map +1 -0
- package/build/services/index.js +5 -0
- package/build/services/index.js.map +1 -0
- package/build/tool-examples.d.ts +64 -0
- package/build/tool-examples.d.ts.map +1 -0
- package/build/tool-examples.js +112 -0
- package/build/tool-examples.js.map +1 -0
- package/build/tools/app-endpoint-tools.d.ts +3 -0
- package/build/tools/app-endpoint-tools.d.ts.map +1 -0
- package/build/tools/app-endpoint-tools.js +235 -0
- package/build/tools/app-endpoint-tools.js.map +1 -0
- package/build/tools/attribute-tools.d.ts +3 -0
- package/build/tools/attribute-tools.d.ts.map +1 -0
- package/build/tools/attribute-tools.js +621 -0
- package/build/tools/attribute-tools.js.map +1 -0
- package/build/tools/entity-tools.d.ts +3 -0
- package/build/tools/entity-tools.d.ts.map +1 -0
- package/build/tools/entity-tools.js +240 -0
- package/build/tools/entity-tools.js.map +1 -0
- package/build/tools/flow-tools.d.ts +3 -0
- package/build/tools/flow-tools.d.ts.map +1 -0
- package/build/tools/flow-tools.js +337 -0
- package/build/tools/flow-tools.js.map +1 -0
- package/build/tools/form-view-tools.d.ts +3 -0
- package/build/tools/form-view-tools.d.ts.map +1 -0
- package/build/tools/form-view-tools.js +231 -0
- package/build/tools/form-view-tools.js.map +1 -0
- package/build/tools/index.d.ts +17 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +39 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/optionset-tools.d.ts +3 -0
- package/build/tools/optionset-tools.d.ts.map +1 -0
- package/build/tools/optionset-tools.js +192 -0
- package/build/tools/optionset-tools.js.map +1 -0
- package/build/tools/plugin-tools.d.ts +3 -0
- package/build/tools/plugin-tools.d.ts.map +1 -0
- package/build/tools/plugin-tools.js +485 -0
- package/build/tools/plugin-tools.js.map +1 -0
- package/build/tools/relationship-tools.d.ts +3 -0
- package/build/tools/relationship-tools.d.ts.map +1 -0
- package/build/tools/relationship-tools.js +111 -0
- package/build/tools/relationship-tools.js.map +1 -0
- package/build/tools/solution-tools.d.ts +3 -0
- package/build/tools/solution-tools.d.ts.map +1 -0
- package/build/tools/solution-tools.js +215 -0
- package/build/tools/solution-tools.js.map +1 -0
- package/build/tools/web-resource-tools.d.ts +3 -0
- package/build/tools/web-resource-tools.d.ts.map +1 -0
- package/build/tools/web-resource-tools.js +88 -0
- package/build/tools/web-resource-tools.js.map +1 -0
- package/build/tools/workflow-tools.d.ts +3 -0
- package/build/tools/workflow-tools.d.ts.map +1 -0
- package/build/tools/workflow-tools.js +165 -0
- package/build/tools/workflow-tools.js.map +1 -0
- package/build/types.d.ts +9 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attribute CLI commands: create-attribute, update-attribute, delete-attribute
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../context-factory.js';
|
|
6
|
+
export declare function registerAttributeCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
//# sourceMappingURL=attribute-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/attribute-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAkMrF"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { outputResult, handleCliError } from '../output.js';
|
|
2
|
+
export function registerAttributeCommands(program, ctx) {
|
|
3
|
+
program
|
|
4
|
+
.command('create-attribute')
|
|
5
|
+
.description('Create a new attribute (column) on an entity')
|
|
6
|
+
.requiredOption('--entity <name>', 'Entity logical name')
|
|
7
|
+
.requiredOption('--type <type>', 'Attribute type: String, Memo, Integer, Decimal, Money, DateTime, Boolean, Picklist, Lookup, MultiSelectPicklist, AutoNumber')
|
|
8
|
+
.requiredOption('--schema-name <name>', 'Schema name (e.g., sic_description)')
|
|
9
|
+
.requiredOption('--display-name <name>', 'Display name')
|
|
10
|
+
.option('--description <desc>', 'Description')
|
|
11
|
+
.option('--is-required', 'Whether the attribute is required', false)
|
|
12
|
+
.option('--max-length <n>', 'Max length (String/Memo)', parseInt)
|
|
13
|
+
.option('--auto-number-format <fmt>', 'Auto-number format (AutoNumber type)')
|
|
14
|
+
.option('--precision <n>', 'Decimal precision', parseInt)
|
|
15
|
+
.option('--min-value <n>', 'Minimum value', parseFloat)
|
|
16
|
+
.option('--max-value <n>', 'Maximum value', parseFloat)
|
|
17
|
+
.option('--date-time-behavior <b>', 'DateTime behavior: UserLocal, DateOnly, TimeZoneIndependent')
|
|
18
|
+
.option('--global-option-set <name>', 'Existing global option set name')
|
|
19
|
+
.option('--option-set-options <json>', 'JSON array of option set options')
|
|
20
|
+
.option('--referenced-entity <name>', 'Referenced entity (Lookup)')
|
|
21
|
+
.option('--relationship-schema <name>', 'Relationship schema name (Lookup)')
|
|
22
|
+
.option('--solution <name>', 'Solution unique name')
|
|
23
|
+
.action(async (opts) => {
|
|
24
|
+
try {
|
|
25
|
+
const service = ctx.pp;
|
|
26
|
+
// Build base definition
|
|
27
|
+
const baseDefinition = {
|
|
28
|
+
SchemaName: opts.schemaName,
|
|
29
|
+
RequiredLevel: { Value: opts.isRequired ? "ApplicationRequired" : "None", CanBeChanged: true },
|
|
30
|
+
DisplayName: {
|
|
31
|
+
"@odata.type": "Microsoft.Dynamics.CRM.Label",
|
|
32
|
+
LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.displayName, LanguageCode: 1033 }]
|
|
33
|
+
},
|
|
34
|
+
Description: {
|
|
35
|
+
"@odata.type": "Microsoft.Dynamics.CRM.Label",
|
|
36
|
+
LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.description || "", LanguageCode: 1033 }]
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
let attributeDefinition;
|
|
40
|
+
const attrType = opts.type;
|
|
41
|
+
switch (attrType) {
|
|
42
|
+
case "String":
|
|
43
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata", MaxLength: opts.maxLength || 100, FormatName: { Value: "Text" } };
|
|
44
|
+
break;
|
|
45
|
+
case "AutoNumber":
|
|
46
|
+
if (!opts.autoNumberFormat)
|
|
47
|
+
throw new Error("AutoNumber requires --auto-number-format");
|
|
48
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata", AutoNumberFormat: opts.autoNumberFormat, MaxLength: opts.maxLength || 100, FormatName: { Value: "Text" } };
|
|
49
|
+
break;
|
|
50
|
+
case "Memo":
|
|
51
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.MemoAttributeMetadata", MaxLength: opts.maxLength || 2000, Format: "TextArea" };
|
|
52
|
+
break;
|
|
53
|
+
case "Integer":
|
|
54
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.IntegerAttributeMetadata", Format: "None", MinValue: opts.minValue ?? -2147483648, MaxValue: opts.maxValue ?? 2147483647 };
|
|
55
|
+
break;
|
|
56
|
+
case "Decimal":
|
|
57
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.DecimalAttributeMetadata", Precision: opts.precision || 2, MinValue: opts.minValue ?? -100000000000, MaxValue: opts.maxValue ?? 100000000000 };
|
|
58
|
+
break;
|
|
59
|
+
case "Money":
|
|
60
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.MoneyAttributeMetadata", Precision: opts.precision || 2, MinValue: opts.minValue ?? -922337203685477, MaxValue: opts.maxValue ?? 922337203685477, PrecisionSource: 2 };
|
|
61
|
+
break;
|
|
62
|
+
case "DateTime":
|
|
63
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.DateTimeAttributeMetadata", Format: opts.dateTimeBehavior === "DateOnly" ? "DateOnly" : "DateAndTime", DateTimeBehavior: { Value: opts.dateTimeBehavior || "UserLocal" } };
|
|
64
|
+
break;
|
|
65
|
+
case "Boolean":
|
|
66
|
+
attributeDefinition = {
|
|
67
|
+
...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.BooleanAttributeMetadata", DefaultValue: false,
|
|
68
|
+
OptionSet: {
|
|
69
|
+
"@odata.type": "Microsoft.Dynamics.CRM.BooleanOptionSetMetadata",
|
|
70
|
+
TrueOption: { Value: 1, Label: { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: "Yes", LanguageCode: 1033 }] } },
|
|
71
|
+
FalseOption: { Value: 0, Label: { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: "No", LanguageCode: 1033 }] } }
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
break;
|
|
75
|
+
case "Picklist":
|
|
76
|
+
case "MultiSelectPicklist": {
|
|
77
|
+
const odataType = attrType === "Picklist"
|
|
78
|
+
? "Microsoft.Dynamics.CRM.PicklistAttributeMetadata"
|
|
79
|
+
: "Microsoft.Dynamics.CRM.MultiSelectPicklistAttributeMetadata";
|
|
80
|
+
if (opts.globalOptionSet) {
|
|
81
|
+
const globalOS = await service.getGlobalOptionSet(opts.globalOptionSet);
|
|
82
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": odataType, "GlobalOptionSet@odata.bind": `/GlobalOptionSetDefinitions(${globalOS.MetadataId})` };
|
|
83
|
+
}
|
|
84
|
+
else if (opts.optionSetOptions) {
|
|
85
|
+
const parsedOptions = JSON.parse(opts.optionSetOptions);
|
|
86
|
+
const normalizedOptions = parsedOptions.map((opt, index) => {
|
|
87
|
+
if (typeof opt === 'string') {
|
|
88
|
+
return { Value: index, Label: { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opt, LanguageCode: 1033 }] } };
|
|
89
|
+
}
|
|
90
|
+
return { Value: opt.value, Label: { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opt.label, LanguageCode: 1033 }] } };
|
|
91
|
+
});
|
|
92
|
+
const solutionName = opts.solution || process.env.POWERPLATFORM_DEFAULT_SOLUTION || undefined;
|
|
93
|
+
const globalOSDef = {
|
|
94
|
+
"@odata.type": "Microsoft.Dynamics.CRM.OptionSetMetadata",
|
|
95
|
+
Name: opts.schemaName,
|
|
96
|
+
DisplayName: baseDefinition.DisplayName,
|
|
97
|
+
Description: baseDefinition.Description,
|
|
98
|
+
IsGlobal: true,
|
|
99
|
+
OptionSetType: "Picklist",
|
|
100
|
+
Options: normalizedOptions
|
|
101
|
+
};
|
|
102
|
+
await service.createGlobalOptionSet(globalOSDef, solutionName);
|
|
103
|
+
const createdOS = await service.getGlobalOptionSet(opts.schemaName);
|
|
104
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": odataType, "GlobalOptionSet@odata.bind": `/GlobalOptionSetDefinitions(${createdOS.MetadataId})` };
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
throw new Error("Picklist/MultiSelectPicklist requires --global-option-set or --option-set-options");
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case "Lookup":
|
|
112
|
+
if (!opts.referencedEntity)
|
|
113
|
+
throw new Error("Lookup requires --referenced-entity");
|
|
114
|
+
attributeDefinition = { ...baseDefinition, "@odata.type": "Microsoft.Dynamics.CRM.LookupAttributeMetadata", Targets: [opts.referencedEntity] };
|
|
115
|
+
if (opts.relationshipSchema)
|
|
116
|
+
attributeDefinition.RelationshipSchemaName = opts.relationshipSchema;
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
throw new Error(`Unsupported attribute type: ${attrType}`);
|
|
120
|
+
}
|
|
121
|
+
const solutionName = opts.solution || process.env.POWERPLATFORM_DEFAULT_SOLUTION || undefined;
|
|
122
|
+
const result = await service.createAttribute(opts.entity, attributeDefinition, solutionName);
|
|
123
|
+
outputResult(result);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
handleCliError(error);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
program
|
|
130
|
+
.command('update-attribute')
|
|
131
|
+
.description('Update an existing attribute on an entity')
|
|
132
|
+
.requiredOption('--entity <name>', 'Entity logical name')
|
|
133
|
+
.requiredOption('--attribute <name>', 'Attribute logical name')
|
|
134
|
+
.option('--display-name <name>', 'New display name')
|
|
135
|
+
.option('--description <desc>', 'New description')
|
|
136
|
+
.option('--required-level <level>', 'Required level: None, Recommended, ApplicationRequired')
|
|
137
|
+
.option('--max-length <n>', 'Max length', parseInt)
|
|
138
|
+
.option('--format-name <fmt>', 'Format: Text, TextArea, Email, Phone, Url, TickerSymbol')
|
|
139
|
+
.option('--min-value <n>', 'Min value', parseFloat)
|
|
140
|
+
.option('--max-value <n>', 'Max value', parseFloat)
|
|
141
|
+
.option('--precision <n>', 'Decimal precision', parseInt)
|
|
142
|
+
.option('--precision-source <src>', 'Precision source: Precision, Pricing, Currency')
|
|
143
|
+
.option('--format <fmt>', 'DateTime format: DateAndTime, DateOnly')
|
|
144
|
+
.option('--date-time-behavior <b>', 'DateTime behavior: UserLocal, DateOnly, TimeZoneIndependent')
|
|
145
|
+
.option('--is-audit-enabled', 'Enable auditing')
|
|
146
|
+
.option('--no-audit', 'Disable auditing')
|
|
147
|
+
.option('--auto-number-format <fmt>', 'Auto-number format string')
|
|
148
|
+
.option('--solution <name>', 'Solution context')
|
|
149
|
+
.action(async (opts) => {
|
|
150
|
+
try {
|
|
151
|
+
const service = ctx.pp;
|
|
152
|
+
const updates = {};
|
|
153
|
+
if (opts.displayName) {
|
|
154
|
+
updates.DisplayName = { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.displayName, LanguageCode: 1033 }] };
|
|
155
|
+
}
|
|
156
|
+
if (opts.description) {
|
|
157
|
+
updates.Description = { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.description, LanguageCode: 1033 }] };
|
|
158
|
+
}
|
|
159
|
+
if (opts.requiredLevel)
|
|
160
|
+
updates.RequiredLevel = { Value: opts.requiredLevel, CanBeChanged: true };
|
|
161
|
+
if (opts.maxLength !== undefined)
|
|
162
|
+
updates.MaxLength = opts.maxLength;
|
|
163
|
+
if (opts.formatName)
|
|
164
|
+
updates.FormatName = { Value: opts.formatName };
|
|
165
|
+
if (opts.minValue !== undefined)
|
|
166
|
+
updates.MinValue = opts.minValue;
|
|
167
|
+
if (opts.maxValue !== undefined)
|
|
168
|
+
updates.MaxValue = opts.maxValue;
|
|
169
|
+
if (opts.precision !== undefined)
|
|
170
|
+
updates.Precision = opts.precision;
|
|
171
|
+
if (opts.precisionSource) {
|
|
172
|
+
const map = { "Precision": 0, "Pricing": 1, "Currency": 2 };
|
|
173
|
+
updates.PrecisionSource = map[opts.precisionSource];
|
|
174
|
+
}
|
|
175
|
+
if (opts.format)
|
|
176
|
+
updates.Format = opts.format;
|
|
177
|
+
if (opts.dateTimeBehavior)
|
|
178
|
+
updates.DateTimeBehavior = { "@odata.type": "Microsoft.Dynamics.CRM.DateTimeBehavior", Value: opts.dateTimeBehavior };
|
|
179
|
+
if (opts.isAuditEnabled)
|
|
180
|
+
updates.IsAuditEnabled = { Value: true, CanBeChanged: true };
|
|
181
|
+
if (opts.audit === false)
|
|
182
|
+
updates.IsAuditEnabled = { Value: false, CanBeChanged: true };
|
|
183
|
+
if (opts.autoNumberFormat)
|
|
184
|
+
updates.AutoNumberFormat = opts.autoNumberFormat;
|
|
185
|
+
await service.updateAttribute(opts.entity, opts.attribute, updates, opts.solution);
|
|
186
|
+
outputResult({ success: true, entity: opts.entity, attribute: opts.attribute });
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
handleCliError(error);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
program
|
|
193
|
+
.command('delete-attribute')
|
|
194
|
+
.description('Delete an attribute from an entity')
|
|
195
|
+
.requiredOption('--entity <name>', 'Entity logical name')
|
|
196
|
+
.requiredOption('--attribute-metadata-id <guid>', 'Attribute MetadataId (GUID)')
|
|
197
|
+
.action(async (opts) => {
|
|
198
|
+
try {
|
|
199
|
+
const service = ctx.pp;
|
|
200
|
+
await service.deleteAttribute(opts.entity, opts.attributeMetadataId);
|
|
201
|
+
outputResult({ success: true, entity: opts.entity, deleted: opts.attributeMetadataId });
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
handleCliError(error);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=attribute-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/attribute-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity CLI commands: create-entity, update-entity, update-entity-icon, delete-entity
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../context-factory.js';
|
|
6
|
+
export declare function registerEntityCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
//# sourceMappingURL=entity-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/entity-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAiIlF"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { outputResult, handleCliError } from '../output.js';
|
|
2
|
+
export function registerEntityCommands(program, ctx) {
|
|
3
|
+
program
|
|
4
|
+
.command('create-entity')
|
|
5
|
+
.description('Create a new custom entity (table)')
|
|
6
|
+
.requiredOption('--schema-name <name>', 'Schema name (e.g., sic_application)')
|
|
7
|
+
.requiredOption('--display-name <name>', 'Display name')
|
|
8
|
+
.requiredOption('--plural-display-name <name>', 'Plural display name')
|
|
9
|
+
.requiredOption('--description <desc>', 'Description')
|
|
10
|
+
.requiredOption('--ownership-type <type>', 'Ownership: UserOwned, TeamOwned, OrganizationOwned')
|
|
11
|
+
.option('--has-activities', 'Enable activities', false)
|
|
12
|
+
.option('--has-notes', 'Enable notes', false)
|
|
13
|
+
.option('--is-activity-party', 'Can be party in activities', false)
|
|
14
|
+
.option('--primary-attr-schema <name>', 'Primary attribute schema name')
|
|
15
|
+
.option('--primary-attr-display <name>', 'Primary attribute display name')
|
|
16
|
+
.option('--primary-attr-max-length <n>', 'Primary attribute max length', parseInt)
|
|
17
|
+
.option('--solution <name>', 'Solution unique name')
|
|
18
|
+
.action(async (opts) => {
|
|
19
|
+
try {
|
|
20
|
+
const service = ctx.pp;
|
|
21
|
+
const entityDefinition = {
|
|
22
|
+
"@odata.type": "Microsoft.Dynamics.CRM.EntityMetadata",
|
|
23
|
+
SchemaName: opts.schemaName,
|
|
24
|
+
DisplayName: {
|
|
25
|
+
"@odata.type": "Microsoft.Dynamics.CRM.Label",
|
|
26
|
+
LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.displayName, LanguageCode: 1033 }]
|
|
27
|
+
},
|
|
28
|
+
DisplayCollectionName: {
|
|
29
|
+
"@odata.type": "Microsoft.Dynamics.CRM.Label",
|
|
30
|
+
LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.pluralDisplayName, LanguageCode: 1033 }]
|
|
31
|
+
},
|
|
32
|
+
Description: {
|
|
33
|
+
"@odata.type": "Microsoft.Dynamics.CRM.Label",
|
|
34
|
+
LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.description, LanguageCode: 1033 }]
|
|
35
|
+
},
|
|
36
|
+
OwnershipType: opts.ownershipType,
|
|
37
|
+
IsActivity: false,
|
|
38
|
+
HasActivities: opts.hasActivities,
|
|
39
|
+
HasNotes: opts.hasNotes,
|
|
40
|
+
IsActivityParty: opts.isActivityParty,
|
|
41
|
+
IsDuplicateDetectionEnabled: { Value: false, CanBeChanged: true },
|
|
42
|
+
IsMailMergeEnabled: { Value: false, CanBeChanged: true },
|
|
43
|
+
Attributes: [{
|
|
44
|
+
"@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata",
|
|
45
|
+
SchemaName: opts.primaryAttrSchema || "name",
|
|
46
|
+
IsPrimaryName: true,
|
|
47
|
+
RequiredLevel: { Value: "None", CanBeChanged: true },
|
|
48
|
+
MaxLength: opts.primaryAttrMaxLength || 850,
|
|
49
|
+
FormatName: { Value: "Text" },
|
|
50
|
+
DisplayName: {
|
|
51
|
+
"@odata.type": "Microsoft.Dynamics.CRM.Label",
|
|
52
|
+
LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.primaryAttrDisplay || "Name", LanguageCode: 1033 }]
|
|
53
|
+
},
|
|
54
|
+
Description: {
|
|
55
|
+
"@odata.type": "Microsoft.Dynamics.CRM.Label",
|
|
56
|
+
LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: "The primary attribute for the entity", LanguageCode: 1033 }]
|
|
57
|
+
}
|
|
58
|
+
}],
|
|
59
|
+
HasFeedback: false
|
|
60
|
+
};
|
|
61
|
+
const solutionName = opts.solution || process.env.POWERPLATFORM_DEFAULT_SOLUTION || undefined;
|
|
62
|
+
const result = await service.createEntity(entityDefinition, solutionName);
|
|
63
|
+
outputResult(result);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
handleCliError(error);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
program
|
|
70
|
+
.command('update-entity')
|
|
71
|
+
.description('Update an existing custom entity')
|
|
72
|
+
.requiredOption('--metadata-id <guid>', 'Entity MetadataId (GUID)')
|
|
73
|
+
.option('--display-name <name>', 'New display name')
|
|
74
|
+
.option('--plural-display-name <name>', 'New plural display name')
|
|
75
|
+
.option('--description <desc>', 'New description')
|
|
76
|
+
.option('--has-activities', 'Enable activities')
|
|
77
|
+
.option('--has-notes', 'Enable notes')
|
|
78
|
+
.option('--solution <name>', 'Solution context')
|
|
79
|
+
.action(async (opts) => {
|
|
80
|
+
try {
|
|
81
|
+
const service = ctx.pp;
|
|
82
|
+
const updates = {};
|
|
83
|
+
if (opts.displayName) {
|
|
84
|
+
updates.DisplayName = { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.displayName, LanguageCode: 1033 }] };
|
|
85
|
+
}
|
|
86
|
+
if (opts.pluralDisplayName) {
|
|
87
|
+
updates.DisplayCollectionName = { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.pluralDisplayName, LanguageCode: 1033 }] };
|
|
88
|
+
}
|
|
89
|
+
if (opts.description) {
|
|
90
|
+
updates.Description = { "@odata.type": "Microsoft.Dynamics.CRM.Label", LocalizedLabels: [{ "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", Label: opts.description, LanguageCode: 1033 }] };
|
|
91
|
+
}
|
|
92
|
+
if (opts.hasActivities !== undefined)
|
|
93
|
+
updates.HasActivities = opts.hasActivities;
|
|
94
|
+
if (opts.hasNotes !== undefined)
|
|
95
|
+
updates.HasNotes = opts.hasNotes;
|
|
96
|
+
await service.updateEntity(opts.metadataId, updates, opts.solution);
|
|
97
|
+
outputResult({ success: true, metadataId: opts.metadataId });
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
handleCliError(error);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
program
|
|
104
|
+
.command('update-entity-icon')
|
|
105
|
+
.description('Update entity icon using Fluent UI System Icons')
|
|
106
|
+
.requiredOption('--entity <name>', 'Entity logical name')
|
|
107
|
+
.requiredOption('--icon-file <name>', 'Fluent UI icon file name (e.g., people_community_24_filled.svg)')
|
|
108
|
+
.option('--solution <name>', 'Solution unique name')
|
|
109
|
+
.action(async (opts) => {
|
|
110
|
+
try {
|
|
111
|
+
const service = ctx.pp;
|
|
112
|
+
const result = await service.updateEntityIcon(opts.entity, opts.iconFile, opts.solution);
|
|
113
|
+
outputResult(result);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
handleCliError(error);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
program
|
|
120
|
+
.command('delete-entity')
|
|
121
|
+
.description('Delete a custom entity')
|
|
122
|
+
.requiredOption('--metadata-id <guid>', 'Entity MetadataId (GUID)')
|
|
123
|
+
.action(async (opts) => {
|
|
124
|
+
try {
|
|
125
|
+
const service = ctx.pp;
|
|
126
|
+
await service.deleteEntity(opts.metadataId);
|
|
127
|
+
outputResult({ success: true, deleted: opts.metadataId });
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
handleCliError(error);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=entity-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/entity-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Commands barrel export + combined registration
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { ServiceContext } from '../../context-factory.js';
|
|
6
|
+
export declare function registerAllCommands(program: Command, ctx: ServiceContext): void;
|
|
7
|
+
export { registerEntityCommands } from './entity-commands.js';
|
|
8
|
+
export { registerAttributeCommands } from './attribute-commands.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAG/E;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Commands barrel export + combined registration
|
|
3
|
+
*/
|
|
4
|
+
import { registerEntityCommands } from './entity-commands.js';
|
|
5
|
+
import { registerAttributeCommands } from './attribute-commands.js';
|
|
6
|
+
export function registerAllCommands(program, ctx) {
|
|
7
|
+
registerEntityCommands(program, ctx);
|
|
8
|
+
registerAttributeCommands(program, ctx);
|
|
9
|
+
}
|
|
10
|
+
export { registerEntityCommands } from './entity-commands.js';
|
|
11
|
+
export { registerAttributeCommands } from './attribute-commands.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAmB;IACvE,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrC,yBAAyB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helpers for powerplatform-customization
|
|
3
|
+
*
|
|
4
|
+
* Formats results as JSON or human-readable text based on global flags.
|
|
5
|
+
*/
|
|
6
|
+
export interface GlobalFlags {
|
|
7
|
+
json: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function setGlobalFlags(flags: GlobalFlags): void;
|
|
10
|
+
export declare function getGlobalFlags(): GlobalFlags;
|
|
11
|
+
/**
|
|
12
|
+
* Output a result to stdout.
|
|
13
|
+
* In JSON mode, prints JSON. Otherwise prints human-readable text.
|
|
14
|
+
*/
|
|
15
|
+
export declare function outputResult(data: unknown): void;
|
|
16
|
+
/**
|
|
17
|
+
* Output an error and exit with code 1.
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleCliError(error: unknown): never;
|
|
20
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;CACf;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAEvD;AAED,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAUhD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CASpD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helpers for powerplatform-customization
|
|
3
|
+
*
|
|
4
|
+
* Formats results as JSON or human-readable text based on global flags.
|
|
5
|
+
*/
|
|
6
|
+
let globalFlags = { json: false };
|
|
7
|
+
export function setGlobalFlags(flags) {
|
|
8
|
+
globalFlags = flags;
|
|
9
|
+
}
|
|
10
|
+
export function getGlobalFlags() {
|
|
11
|
+
return globalFlags;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Output a result to stdout.
|
|
15
|
+
* In JSON mode, prints JSON. Otherwise prints human-readable text.
|
|
16
|
+
*/
|
|
17
|
+
export function outputResult(data) {
|
|
18
|
+
if (globalFlags.json) {
|
|
19
|
+
console.log(JSON.stringify(data, null, 2));
|
|
20
|
+
}
|
|
21
|
+
else if (typeof data === 'string') {
|
|
22
|
+
console.log(data);
|
|
23
|
+
}
|
|
24
|
+
else if (data === null || data === undefined) {
|
|
25
|
+
console.log('Done.');
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(JSON.stringify(data, null, 2));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Output an error and exit with code 1.
|
|
33
|
+
*/
|
|
34
|
+
export function handleCliError(error) {
|
|
35
|
+
if (globalFlags.json) {
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
console.error(JSON.stringify({ error: message }, null, 2));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
41
|
+
console.error(`Error: ${message}`);
|
|
42
|
+
}
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,IAAI,WAAW,GAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAE/C,MAAM,UAAU,cAAc,CAAC,KAAkB;IAC/C,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/build/cli.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @mcp-consultant-tools/powerplatform-customization CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for PowerPlatform Customization operations.
|
|
6
|
+
* Reuses the same ServiceContext and services as the MCP server.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
package/build/cli.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @mcp-consultant-tools/powerplatform-customization CLI
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for PowerPlatform Customization operations.
|
|
6
|
+
* Reuses the same ServiceContext and services as the MCP server.
|
|
7
|
+
*/
|
|
8
|
+
import { createCliProgram, loadEnvForCli } from '@mcp-consultant-tools/core';
|
|
9
|
+
import { createServiceContext } from './context-factory.js';
|
|
10
|
+
import { registerAllCommands } from './cli/commands/index.js';
|
|
11
|
+
const program = createCliProgram({
|
|
12
|
+
name: 'mcp-pp-custom-cli',
|
|
13
|
+
description: 'PowerPlatform Customization CLI - entities, attributes, and schema changes',
|
|
14
|
+
version: '27.0.0',
|
|
15
|
+
});
|
|
16
|
+
// Load env before parsing (--env-file handled by commander hook)
|
|
17
|
+
program.hook('preAction', (thisCommand) => {
|
|
18
|
+
const opts = thisCommand.opts();
|
|
19
|
+
loadEnvForCli(opts.envFile);
|
|
20
|
+
});
|
|
21
|
+
const ctx = createServiceContext();
|
|
22
|
+
registerAllCommands(program, ctx);
|
|
23
|
+
program.parseAsync(process.argv).catch((error) => {
|
|
24
|
+
console.error('CLI error:', error.message);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=cli.js.map
|
package/build/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,gBAAgB,CAAC;IAC/B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,4EAA4E;IACzF,OAAO,EAAE,QAAQ;CAClB,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAgB,EAAE,EAAE;IAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;AACnC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAElC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;IACpD,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared service context factory - used by both MCP server and CLI.
|
|
3
|
+
*/
|
|
4
|
+
import { PowerPlatformService } from './PowerPlatformService.js';
|
|
5
|
+
import type { ServiceContext } from './types.js';
|
|
6
|
+
export type { ServiceContext } from './types.js';
|
|
7
|
+
export declare function createServiceContext(service?: PowerPlatformService): ServiceContext;
|
|
8
|
+
//# sourceMappingURL=context-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-factory.d.ts","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAuB,MAAM,2BAA2B,CAAC;AAEtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,cAAc,CAkCnF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared service context factory - used by both MCP server and CLI.
|
|
3
|
+
*/
|
|
4
|
+
import { PowerPlatformService } from './PowerPlatformService.js';
|
|
5
|
+
import { initializePublisherPrefix } from '@mcp-consultant-tools/powerplatform-core';
|
|
6
|
+
export function createServiceContext(service) {
|
|
7
|
+
let ppService = service || null;
|
|
8
|
+
function getPowerPlatformService() {
|
|
9
|
+
if (!ppService) {
|
|
10
|
+
const requiredVars = [
|
|
11
|
+
'POWERPLATFORM_URL',
|
|
12
|
+
'POWERPLATFORM_CLIENT_ID',
|
|
13
|
+
'POWERPLATFORM_CLIENT_SECRET',
|
|
14
|
+
'POWERPLATFORM_TENANT_ID',
|
|
15
|
+
'PUBLISHER_PREFIX'
|
|
16
|
+
];
|
|
17
|
+
const missing = requiredVars.filter(v => !process.env[v]);
|
|
18
|
+
if (missing.length > 0) {
|
|
19
|
+
throw new Error(`Missing required PowerPlatform configuration: ${missing.join(', ')}`);
|
|
20
|
+
}
|
|
21
|
+
initializePublisherPrefix();
|
|
22
|
+
const config = {
|
|
23
|
+
organizationUrl: process.env.POWERPLATFORM_URL,
|
|
24
|
+
clientId: process.env.POWERPLATFORM_CLIENT_ID,
|
|
25
|
+
clientSecret: process.env.POWERPLATFORM_CLIENT_SECRET,
|
|
26
|
+
tenantId: process.env.POWERPLATFORM_TENANT_ID,
|
|
27
|
+
};
|
|
28
|
+
ppService = new PowerPlatformService(config);
|
|
29
|
+
}
|
|
30
|
+
return ppService;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
get pp() { return getPowerPlatformService(); },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=context-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAuB,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAKrF,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,IAAI,SAAS,GAAgC,OAAO,IAAI,IAAI,CAAC;IAE7D,SAAS,uBAAuB;QAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,YAAY,GAAG;gBACnB,mBAAmB;gBACnB,yBAAyB;gBACzB,6BAA6B;gBAC7B,yBAAyB;gBACzB,kBAAkB;aACnB,CAAC;YACF,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,iDAAiD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,yBAAyB,EAAE,CAAC;YAE5B,MAAM,MAAM,GAAwB;gBAClC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAkB;gBAC/C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAwB;gBAC9C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA4B;gBACtD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAwB;aAC/C,CAAC;YAEF,SAAS,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,OAAO,uBAAuB,EAAE,CAAC,CAAC,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -6,4 +6,7 @@ import { PowerPlatformService } from './PowerPlatformService.js';
|
|
|
6
6
|
* @param service - Optional pre-initialized PowerPlatformService (for testing)
|
|
7
7
|
*/
|
|
8
8
|
export declare function registerPowerplatformCustomizationTools(server: any, service?: PowerPlatformService): void;
|
|
9
|
+
export { PowerPlatformService } from './PowerPlatformService.js';
|
|
10
|
+
export type { PowerPlatformConfig } from './PowerPlatformService.js';
|
|
11
|
+
export type { ServiceContext } from './types.js';
|
|
9
12
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAKA,OAAO,EAAE,oBAAoB,EAAuB,MAAM,2BAA2B,CAAC;AA8CtF;;;;GAIG;AACH,wBAAgB,uCAAuC,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,oBAAoB,QAGlG;AAGD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|