-
Notifications
You must be signed in to change notification settings - Fork 93
/
validate.ts
140 lines (123 loc) · 4.08 KB
/
validate.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
import { createReadStream } from "fs";
import { ManifestUtil, devPreview } from "@microsoft/teams-manifest";
import fetch from "node-fetch";
import { OfficeAddinManifest } from "./manifestOperations";
import { usageDataObject } from "./defaults";
export class ManifestValidationDetails {
public adminInstallOnly?: boolean;
public capabilities?: object;
public defaultLocale?: string;
public description?: string;
public displayName?: string;
public hosts?: string[];
public iconUrl?: string;
public localizedDescriptions?: object;
public localizedIconUrls?: object;
public localizedRootSourceUrls?: object;
public productId?: string;
public providerName?: string;
public requirements?: string;
public rootSourceUrl?: string;
public subtype?: string;
public supportedLanguages?: string[];
public supportedProducts?: ManifestValidationProduct[];
public type?: string;
public version?: string;
}
export class ManifestValidationIssue {
public code?: string;
public column?: number;
public line?: number;
public title?: string;
public content?: string;
public helpUrl?: string;
}
export class ManifestValidationProduct {
public code?: string;
public title?: string;
public version?: string;
}
export class ManifestValidationReport {
public status?: string;
public errors?: ManifestValidationIssue[];
public warnings?: ManifestValidationIssue[];
public notes?: ManifestValidationIssue[];
public addInDetails?: ManifestValidationDetails;
}
export class ManifestValidation {
public isValid: boolean;
public report?: ManifestValidationReport;
public status?: number;
public statusText?: string;
constructor() {
this.isValid = false;
}
}
export async function validateManifest(
manifestPath: string,
verifyProduction: boolean = false
): Promise<ManifestValidation> {
try {
const validation: ManifestValidation = new ManifestValidation();
// read the manifest file to ensure the file path is valid
await OfficeAddinManifest.readManifestFile(manifestPath);
if (manifestPath.endsWith(".json")) {
const manifest: devPreview.DevPreviewSchema = await ManifestUtil.loadFromPath(manifestPath);
const validationResult: string[] = await ManifestUtil.validateManifest(manifest);
if (validationResult.length !== 0) {
// There are errors
validation.isValid = false;
validation.report = new ManifestValidationReport();
validation.report.errors = [];
validationResult.forEach((error: string) => {
let issue: ManifestValidationIssue = new ManifestValidationIssue();
issue.content = error;
issue.title = "Error";
validation.report?.errors?.push(issue);
});
} else {
validation.isValid = true;
}
} else {
const stream = await createReadStream(manifestPath);
const clientId: string = verifyProduction ? "Default" : "devx";
let response;
try {
response = await fetch(`https://validationgateway.omex.office.net/package/api/check?clientId=${clientId}`, {
body: stream,
headers: {
"Content-Type": "application/xml",
},
method: "POST",
});
} catch (err) {
throw new Error(`Unable to contact the manifest validation service.\n${err}`);
}
validation.status = response.status;
validation.statusText = response.statusText;
const text = await response.text();
try {
const json = JSON.parse(text.trim());
if (json) {
validation.report = json;
}
} catch {} // eslint-disable-line no-empty
if (validation.report) {
const result = validation.report.status;
if (result) {
switch (result.toLowerCase()) {
case "accepted":
validation.isValid = true;
break;
}
}
}
}
return validation;
} catch (err: any) {
usageDataObject.reportException("validateManifest()", err);
throw err;
}
}