This repository has been archived by the owner on Feb 12, 2022. It is now read-only.
/
schemaAsync.ts
74 lines (55 loc) · 2.3 KB
/
schemaAsync.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
import _ = require("underscore");
import xmlutil = require('./xmlutil');
import contentprovider = require('./contentprovider');
import lowLevel = require("../parser/lowLevelAST");
import util = require("./index");
import resourceRegistry = require("../parser/jsyaml/resourceRegistry");
import def = require('raml-definition-system');
var su = def.getSchemaUtils();
export function isScheme(content) {
if(!content||!content.trim()||content.trim().charAt(0)!="{"){
return false;
}
try {
var schemeObject = JSON.parse(content);
return schemeObject && (typeof schemeObject === "object");
} catch(exception) {
return xmlutil.isXmlScheme(content);
}
}
export function startDownloadingReferencesAsync(schemaContent: string, unit: lowLevel.ICompilationUnit): Promise<lowLevel.ICompilationUnit>{
if(xmlutil.isXmlScheme(schemaContent)) {
return su.getXMLSchema(schemaContent, new contentprovider.ContentProvider(unit)).loadSchemaReferencesAsync().then(() => unit);
}
var schemaObject = su.getJSONSchema(schemaContent, new contentprovider.ContentProvider(unit));
var missedReferences = schemaObject.getMissingReferences([]).map(reference => schemaObject.contentAsync(reference));
if(missedReferences.length === 0) {
return Promise.resolve(unit);
}
var allReferences = Promise.all(missedReferences);
var result = getRefs(allReferences, schemaObject);
return result.then(() => unit);
}
export function getReferences(schemaContent, unit) {
var schemaObject = su.createSchema(schemaContent, new contentprovider.ContentProvider(unit));
if(schemaObject && schemaObject.getMissingReferences) {
return schemaObject.getMissingReferences([], true);
}
return [];
}
function getRefs(promise, schemaObject) {
return promise.then(references => {
if(references.length > 0) {
var missedRefs = schemaObject.getMissingReferences(references);
if(missedRefs.length === 0) {
return [];
}
var promises = [];
missedRefs.forEach(ref => {
promises.push(schemaObject.contentAsync(ref));
});
return getRefs(Promise.all(promises.concat(references)), schemaObject);
}
return Promise.resolve([]);
});
}