@microsoft/m365-spec-parser 0.2.6-alpha.d99d3c39d.0 → 0.2.6-alpha.dea29f186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm2017.js +38 -3
- package/dist/index.esm2017.js.map +1 -1
- package/dist/index.esm2017.mjs +144 -11
- package/dist/index.esm2017.mjs.map +1 -1
- package/dist/index.esm5.js +38 -3
- package/dist/index.esm5.js.map +1 -1
- package/dist/index.node.cjs.js +147 -10
- package/dist/index.node.cjs.js.map +1 -1
- package/dist/src/constants.d.ts +2 -2
- package/dist/src/index.d.ts +1 -1
- package/dist/src/interfaces.d.ts +8 -1
- package/dist/src/manifestUpdater.d.ts +2 -2
- package/dist/src/specParser.d.ts +5 -2
- package/dist/src/utils.d.ts +1 -0
- package/package.json +3 -3
package/dist/index.esm2017.mjs
CHANGED
|
@@ -47,6 +47,7 @@ var ErrorType;
|
|
|
47
47
|
ErrorType["UrlPathNotExist"] = "url-path-not-exist";
|
|
48
48
|
ErrorType["Cancelled"] = "cancelled";
|
|
49
49
|
ErrorType["Unknown"] = "unknown";
|
|
50
|
+
ErrorType["AddAuthFailed"] = "add-auth-failed";
|
|
50
51
|
})(ErrorType || (ErrorType = {}));
|
|
51
52
|
/**
|
|
52
53
|
* An enum that represents the types of warnings that can occur during validation.
|
|
@@ -77,7 +78,12 @@ var ProjectType;
|
|
|
77
78
|
ProjectType[ProjectType["Copilot"] = 0] = "Copilot";
|
|
78
79
|
ProjectType[ProjectType["SME"] = 1] = "SME";
|
|
79
80
|
ProjectType[ProjectType["TeamsAi"] = 2] = "TeamsAi";
|
|
80
|
-
})(ProjectType || (ProjectType = {}));
|
|
81
|
+
})(ProjectType || (ProjectType = {}));
|
|
82
|
+
var AdaptiveCardUpdateStrategy;
|
|
83
|
+
(function (AdaptiveCardUpdateStrategy) {
|
|
84
|
+
AdaptiveCardUpdateStrategy[AdaptiveCardUpdateStrategy["CreateNew"] = 0] = "CreateNew";
|
|
85
|
+
AdaptiveCardUpdateStrategy[AdaptiveCardUpdateStrategy["KeepExisting"] = 1] = "KeepExisting";
|
|
86
|
+
})(AdaptiveCardUpdateStrategy || (AdaptiveCardUpdateStrategy = {}));
|
|
81
87
|
|
|
82
88
|
// Copyright (c) Microsoft Corporation.
|
|
83
89
|
class ConstantString {
|
|
@@ -103,8 +109,8 @@ ConstantString.AuthTypeIsNotSupported = "Unsupported authorization type in API '
|
|
|
103
109
|
ConstantString.UnsupportedSchema = "Unsupported schema in %s %s: %s";
|
|
104
110
|
ConstantString.FuncDescriptionTooLong = "The description of the function '%s' is too long. The current length is %s characters, while the maximum allowed length is %s characters.";
|
|
105
111
|
ConstantString.GenerateJsonDataFailed = "Failed to generate JSON data for api: %s due to %s.";
|
|
106
|
-
ConstantString.WrappedCardVersion = "
|
|
107
|
-
ConstantString.WrappedCardSchema = "https://developer.microsoft.com/json-schemas/teams/
|
|
112
|
+
ConstantString.WrappedCardVersion = "1.0";
|
|
113
|
+
ConstantString.WrappedCardSchema = "https://developer.microsoft.com/json-schemas/teams/v1.19/MicrosoftTeams.ResponseRenderingTemplate.schema.json";
|
|
108
114
|
ConstantString.WrappedCardResponseLayout = "list";
|
|
109
115
|
ConstantString.GetMethod = "get";
|
|
110
116
|
ConstantString.PostMethod = "post";
|
|
@@ -578,6 +584,35 @@ class Utils {
|
|
|
578
584
|
const serverUrl = operationServer || methodServer || rootServer;
|
|
579
585
|
return serverUrl;
|
|
580
586
|
}
|
|
587
|
+
static getAuthSchemaObject(authType, authParameters) {
|
|
588
|
+
switch (authType) {
|
|
589
|
+
case "oauth":
|
|
590
|
+
case "microsoft-entra":
|
|
591
|
+
return {
|
|
592
|
+
type: "oauth2",
|
|
593
|
+
flows: {
|
|
594
|
+
authorizationCode: {
|
|
595
|
+
authorizationUrl: authParameters.authorizationUrl,
|
|
596
|
+
tokenUrl: authParameters.tokenUrl,
|
|
597
|
+
refreshUrl: authParameters.refreshUrl,
|
|
598
|
+
scopes: authParameters.scopes,
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
};
|
|
602
|
+
case "api-key":
|
|
603
|
+
return {
|
|
604
|
+
type: "apiKey",
|
|
605
|
+
in: authParameters.in,
|
|
606
|
+
name: authParameters.name,
|
|
607
|
+
};
|
|
608
|
+
case "bearer-token":
|
|
609
|
+
default:
|
|
610
|
+
return {
|
|
611
|
+
type: "http",
|
|
612
|
+
scheme: "bearer",
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
}
|
|
581
616
|
}
|
|
582
617
|
|
|
583
618
|
// Copyright (c) Microsoft Corporation.
|
|
@@ -1722,8 +1757,8 @@ class ManifestUpdater {
|
|
|
1722
1757
|
}
|
|
1723
1758
|
const appName = this.removeEnvs(manifest.name.short);
|
|
1724
1759
|
const specRelativePath = ManifestUpdater.getRelativePath(manifestPath, outputSpecPath);
|
|
1725
|
-
const [apiPlugin, warnings] = await ManifestUpdater.generatePluginManifestSchema(spec, specRelativePath, apiPluginFilePath, appName, authMap, options, existingPluginManifestInfo);
|
|
1726
|
-
return [manifest, apiPlugin, warnings];
|
|
1760
|
+
const [apiPlugin, warnings, jsonDataSet] = await ManifestUpdater.generatePluginManifestSchema(spec, specRelativePath, apiPluginFilePath, appName, authMap, options, existingPluginManifestInfo);
|
|
1761
|
+
return [manifest, apiPlugin, warnings, jsonDataSet];
|
|
1727
1762
|
}
|
|
1728
1763
|
static updateManifestDescription(manifest, spec) {
|
|
1729
1764
|
var _a, _b;
|
|
@@ -1749,6 +1784,7 @@ class ManifestUpdater {
|
|
|
1749
1784
|
const warnings = [];
|
|
1750
1785
|
const functions = [];
|
|
1751
1786
|
const functionNamesMap = {};
|
|
1787
|
+
const jsonDataSet = {};
|
|
1752
1788
|
const conversationStarters = [];
|
|
1753
1789
|
const paths = spec.paths;
|
|
1754
1790
|
for (const pathUrl in paths) {
|
|
@@ -1780,11 +1816,17 @@ class ManifestUpdater {
|
|
|
1780
1816
|
try {
|
|
1781
1817
|
const { json } = Utils.getResponseJson(operationItem);
|
|
1782
1818
|
if (json.schema) {
|
|
1783
|
-
const [card, jsonPath] = AdaptiveCardGenerator.generateAdaptiveCard(operationItem, false, 5);
|
|
1819
|
+
const [card, jsonPath, jsonData] = AdaptiveCardGenerator.generateAdaptiveCard(operationItem, false, 5);
|
|
1784
1820
|
const responseSemantic = wrapResponseSemantics(card, jsonPath);
|
|
1785
1821
|
funcObj.capabilities = {
|
|
1786
1822
|
response_semantics: responseSemantic,
|
|
1787
1823
|
};
|
|
1824
|
+
if (jsonPath === "$") {
|
|
1825
|
+
jsonDataSet[safeFunctionName] = jsonData;
|
|
1826
|
+
}
|
|
1827
|
+
else {
|
|
1828
|
+
jsonDataSet[safeFunctionName] = jsonData[jsonPath];
|
|
1829
|
+
}
|
|
1788
1830
|
}
|
|
1789
1831
|
}
|
|
1790
1832
|
catch (err) {
|
|
@@ -1956,7 +1998,7 @@ class ManifestUpdater {
|
|
|
1956
1998
|
.map((text) => ({ text }));
|
|
1957
1999
|
}
|
|
1958
2000
|
}
|
|
1959
|
-
return [apiPlugin, warnings];
|
|
2001
|
+
return [apiPlugin, warnings, jsonDataSet];
|
|
1960
2002
|
}
|
|
1961
2003
|
static async updateManifest(manifestPath, outputSpecPath, spec, options, adaptiveCardFolder, authInfo) {
|
|
1962
2004
|
try {
|
|
@@ -2191,6 +2233,39 @@ class SpecParser {
|
|
|
2191
2233
|
async listSupportedAPIInfo() {
|
|
2192
2234
|
throw new Error("Method not implemented.");
|
|
2193
2235
|
}
|
|
2236
|
+
async addAuthScheme(authName, authType, authParameters, signal) {
|
|
2237
|
+
try {
|
|
2238
|
+
await this.loadSpec();
|
|
2239
|
+
const spec = this.spec;
|
|
2240
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
2241
|
+
throw new SpecParserError(ConstantString.CancelledMessage, ErrorType.Cancelled);
|
|
2242
|
+
}
|
|
2243
|
+
if (!spec.components) {
|
|
2244
|
+
spec.components = {};
|
|
2245
|
+
}
|
|
2246
|
+
if (!spec.components.securitySchemes) {
|
|
2247
|
+
spec.components.securitySchemes = {};
|
|
2248
|
+
}
|
|
2249
|
+
spec.components.securitySchemes[authName] = Utils.getAuthSchemaObject(authType, authParameters);
|
|
2250
|
+
const paths = spec.paths;
|
|
2251
|
+
for (const path in paths) {
|
|
2252
|
+
const methods = paths[path];
|
|
2253
|
+
for (const method in methods) {
|
|
2254
|
+
const operationId = methods[method].operationId;
|
|
2255
|
+
if (authParameters.apis.includes(operationId)) {
|
|
2256
|
+
methods[method].security = [{ [authName]: [] }];
|
|
2257
|
+
}
|
|
2258
|
+
}
|
|
2259
|
+
}
|
|
2260
|
+
await this.saveFilterSpec(this.pathOrSpec, this.spec);
|
|
2261
|
+
}
|
|
2262
|
+
catch (err) {
|
|
2263
|
+
if (err instanceof SpecParserError) {
|
|
2264
|
+
throw err;
|
|
2265
|
+
}
|
|
2266
|
+
throw new SpecParserError(err.toString(), ErrorType.AddAuthFailed);
|
|
2267
|
+
}
|
|
2268
|
+
}
|
|
2194
2269
|
/**
|
|
2195
2270
|
* Lists all the OpenAPI operations in the specification file.
|
|
2196
2271
|
* @returns A string array that represents the HTTP method and path of each operation, such as ['GET /pets/{petId}', 'GET /user/{userId}']
|
|
@@ -2217,6 +2292,8 @@ class SpecParser {
|
|
|
2217
2292
|
operationId: operationId,
|
|
2218
2293
|
isValid: isValid,
|
|
2219
2294
|
reason: reason,
|
|
2295
|
+
description: operation.description,
|
|
2296
|
+
summary: operation.summary,
|
|
2220
2297
|
};
|
|
2221
2298
|
// Try best to parse server url and auth type
|
|
2222
2299
|
try {
|
|
@@ -2300,7 +2377,7 @@ class SpecParser {
|
|
|
2300
2377
|
* @param outputSpecPath File path of the new OpenAPI specification file to generate. If not specified or empty, no spec file will be generated.
|
|
2301
2378
|
* @param pluginFilePath File path of the api plugin file to generate.
|
|
2302
2379
|
*/
|
|
2303
|
-
async generateForCopilot(manifestPath, filter, outputSpecPath, pluginFilePath, existingPluginFilePath, signal) {
|
|
2380
|
+
async generateForCopilot(manifestPath, filter, outputSpecPath, pluginFilePath, existingPluginFilePath, signal, adaptiveCardUpdateStrategy) {
|
|
2304
2381
|
const result = {
|
|
2305
2382
|
allSuccess: true,
|
|
2306
2383
|
warnings: [],
|
|
@@ -2345,7 +2422,8 @@ class SpecParser {
|
|
|
2345
2422
|
}
|
|
2346
2423
|
: undefined;
|
|
2347
2424
|
const authMap = Utils.getAuthMap(newSpec);
|
|
2348
|
-
const [updatedManifest, apiPlugin, warnings] = await ManifestUpdater.updateManifestWithAiPlugin(manifestPath, outputSpecPath, pluginFilePath, newSpec, this.options, authMap, existingPluginManifestInfo);
|
|
2425
|
+
const [updatedManifest, apiPlugin, warnings, jsonDataSet] = await ManifestUpdater.updateManifestWithAiPlugin(manifestPath, outputSpecPath, pluginFilePath, newSpec, this.options, authMap, existingPluginManifestInfo);
|
|
2426
|
+
await this.separateAdaptiveCards(apiPlugin, pluginFilePath, jsonDataSet, adaptiveCardUpdateStrategy);
|
|
2349
2427
|
result.warnings.push(...warnings);
|
|
2350
2428
|
await fs.outputJSON(manifestPath, updatedManifest, { spaces: 4 });
|
|
2351
2429
|
await fs.outputJSON(pluginFilePath, apiPlugin, { spaces: 4 });
|
|
@@ -2434,6 +2512,7 @@ class SpecParser {
|
|
|
2434
2512
|
const newSpecs = await this.getFilteredSpecs(filter, signal);
|
|
2435
2513
|
const newSpec = newSpecs[1];
|
|
2436
2514
|
const apiPlugin = (await fs.readJSON(pluginFilePath));
|
|
2515
|
+
const jsonDataSet = {};
|
|
2437
2516
|
const paths = newSpec.paths;
|
|
2438
2517
|
for (const pathUrl in paths) {
|
|
2439
2518
|
const pathItem = paths[pathUrl];
|
|
@@ -2451,7 +2530,13 @@ class SpecParser {
|
|
|
2451
2530
|
}
|
|
2452
2531
|
const { json } = Utils.getResponseJson(operationItem);
|
|
2453
2532
|
if (json.schema) {
|
|
2454
|
-
const [card, jsonPath] = AdaptiveCardGenerator.generateAdaptiveCard(operationItem, false, 5);
|
|
2533
|
+
const [card, jsonPath, jsonData] = AdaptiveCardGenerator.generateAdaptiveCard(operationItem, false, 5);
|
|
2534
|
+
if (jsonPath === "$") {
|
|
2535
|
+
jsonDataSet[safeFunctionName] = jsonData;
|
|
2536
|
+
}
|
|
2537
|
+
else {
|
|
2538
|
+
jsonDataSet[safeFunctionName] = jsonData[jsonPath];
|
|
2539
|
+
}
|
|
2455
2540
|
const responseSemantic = wrapResponseSemantics(card, jsonPath);
|
|
2456
2541
|
apiPlugin.functions.find((func) => func.name === safeFunctionName).capabilities = {
|
|
2457
2542
|
response_semantics: responseSemantic,
|
|
@@ -2466,8 +2551,44 @@ class SpecParser {
|
|
|
2466
2551
|
}
|
|
2467
2552
|
}
|
|
2468
2553
|
}
|
|
2554
|
+
await this.separateAdaptiveCards(apiPlugin, pluginFilePath, jsonDataSet);
|
|
2469
2555
|
await fs.outputJSON(pluginFilePath, apiPlugin, { spaces: 4 });
|
|
2470
2556
|
}
|
|
2557
|
+
async separateAdaptiveCards(apiPlugin, pluginFilePath, jsonDataSet = {}, adaptiveCardUpdateStrategy) {
|
|
2558
|
+
var _a, _b;
|
|
2559
|
+
const functions = apiPlugin.functions;
|
|
2560
|
+
if (!adaptiveCardUpdateStrategy) {
|
|
2561
|
+
adaptiveCardUpdateStrategy = AdaptiveCardUpdateStrategy.CreateNew;
|
|
2562
|
+
}
|
|
2563
|
+
if (functions) {
|
|
2564
|
+
const adaptiveCardFolder = path.join(path.dirname(pluginFilePath), "adaptiveCards");
|
|
2565
|
+
for (const func of functions) {
|
|
2566
|
+
if ((_a = func.capabilities) === null || _a === void 0 ? void 0 : _a.response_semantics) {
|
|
2567
|
+
const responseSemantic = func.capabilities.response_semantics;
|
|
2568
|
+
const card = responseSemantic.static_template;
|
|
2569
|
+
if (card && Object.keys(card).length !== 0) {
|
|
2570
|
+
let cardName = func.name;
|
|
2571
|
+
if (adaptiveCardUpdateStrategy === AdaptiveCardUpdateStrategy.CreateNew) {
|
|
2572
|
+
cardName = this.findUniqueCardName(func.name, adaptiveCardFolder);
|
|
2573
|
+
}
|
|
2574
|
+
else {
|
|
2575
|
+
if (adaptiveCardUpdateStrategy === AdaptiveCardUpdateStrategy.KeepExisting &&
|
|
2576
|
+
fs.existsSync(path.join(adaptiveCardFolder, `${cardName}.json`))) {
|
|
2577
|
+
responseSemantic.static_template = { file: `adaptiveCards/${cardName}.json` };
|
|
2578
|
+
continue;
|
|
2579
|
+
}
|
|
2580
|
+
}
|
|
2581
|
+
const cardPath = path.join(adaptiveCardFolder, `${cardName}.json`);
|
|
2582
|
+
const dataPath = path.join(adaptiveCardFolder, `${cardName}.data.json`);
|
|
2583
|
+
responseSemantic.static_template = { file: `adaptiveCards/${cardName}.json` };
|
|
2584
|
+
await fs.outputJSON(cardPath, card, { spaces: 4 });
|
|
2585
|
+
const data = (_b = jsonDataSet[cardName]) !== null && _b !== void 0 ? _b : {};
|
|
2586
|
+
await fs.outputJSON(dataPath, data, { spaces: 4 });
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
}
|
|
2590
|
+
}
|
|
2591
|
+
}
|
|
2471
2592
|
async loadSpec() {
|
|
2472
2593
|
if (!this.spec) {
|
|
2473
2594
|
const spec = (await this.parser.parse(this.pathOrSpec));
|
|
@@ -2510,7 +2631,19 @@ class SpecParser {
|
|
|
2510
2631
|
const specResolved = Utils.resolveEnv(specString);
|
|
2511
2632
|
return JSON.parse(specResolved);
|
|
2512
2633
|
}
|
|
2634
|
+
findUniqueCardName(defaultName, cardFolder) {
|
|
2635
|
+
let cardName = defaultName;
|
|
2636
|
+
let counter = 1;
|
|
2637
|
+
while (true) {
|
|
2638
|
+
if (!fs.existsSync(path.join(cardFolder, cardName + ".json"))) {
|
|
2639
|
+
break;
|
|
2640
|
+
}
|
|
2641
|
+
cardName = `${defaultName}${counter}`;
|
|
2642
|
+
counter++;
|
|
2643
|
+
}
|
|
2644
|
+
return cardName;
|
|
2645
|
+
}
|
|
2513
2646
|
}
|
|
2514
2647
|
|
|
2515
|
-
export { AdaptiveCardGenerator, ConstantString, ErrorType, ProjectType, SpecParser, SpecParserError, Utils, ValidationStatus, WarningType };
|
|
2648
|
+
export { AdaptiveCardGenerator, AdaptiveCardUpdateStrategy, ConstantString, ErrorType, ProjectType, SpecParser, SpecParserError, Utils, ValidationStatus, WarningType };
|
|
2516
2649
|
//# sourceMappingURL=index.esm2017.mjs.map
|