@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
176 lines (174 loc) • 7.66 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const fs_1 = tslib_1.__importDefault(require("fs"));
const path_1 = tslib_1.__importDefault(require("path"));
const through2_1 = tslib_1.__importDefault(require("through2"));
const vinyl_1 = tslib_1.__importDefault(require("vinyl"));
function generateSmeDocumentation(_) {
const smeDocTag = '@smeDoc';
const labelTag = '@label';
const idTag = '@id';
const overviewTag = '@overview';
const exampleTag = '@example';
const fileTag = '@file ';
const filenameTag = '@filename';
const filepathTag = '@filepath';
const commentEnd = '*/';
const internalTag = '@internal';
const parentIdTag = '@parentId';
function isDocumentationRequired(content) {
return content.indexOf(smeDocTag) !== -1;
}
function documentControl(template, path) {
const blocks = template.split(' *\r\n');
let smeDocId, smeDocLabel, overviewFileContent, parentId, isInternal = false;
const examplesMap = {};
for (let i = 0; i < blocks.length; i++) {
const lines = blocks[i].split('\n');
if (lines[0].indexOf(smeDocTag) !== -1) {
let smeDocDetails = lines[0].split(smeDocTag)[1].split('{')[1].split('}')[0];
if (smeDocDetails.indexOf(internalTag) !== -1) {
smeDocDetails = smeDocDetails.split(internalTag)[0].trim();
isInternal = true;
}
if (smeDocDetails.indexOf(parentIdTag) !== -1) {
const smeDocTree = smeDocDetails.split(parentIdTag);
parentId = smeDocTree[1].trim();
smeDocDetails = smeDocTree[0].trim();
}
if (smeDocDetails.indexOf(idTag) === -1 || smeDocDetails.indexOf(labelTag) === -1) {
throw new Error('@label and/or @id are missing from @smeDoc in ' + path.name);
}
const smeDocHeader = smeDocDetails.split(idTag);
smeDocId = smeDocHeader[1].trim();
smeDocLabel = smeDocHeader[0].split(labelTag)[1].trim();
}
else if (lines[0].indexOf(overviewTag) !== -1) {
if (lines[1].indexOf(fileTag) === -1 || lines[1].indexOf(filepathTag) === -1) {
throw new Error('@file and/or @filepath are missing under @overview in ' + path.name);
}
const overviewFileDetails = lines[1].split(fileTag)[1].split('{')[1].split('}')[0];
const overviewFilePath = overviewFileDetails.split(filepathTag)[1].trim();
overviewFileContent = readFileContent(overviewFilePath, path);
}
else {
if (lines[0].indexOf(exampleTag) !== -1) {
const exampleDetails = lines[0].split(exampleTag)[1].split('{')[1].split('}')[0];
if (exampleDetails.indexOf(idTag) === -1 || exampleDetails.indexOf(labelTag) === -1) {
throw new Error('@label and/or @id are missing from @example in ' + path.name);
}
const exampleDetailsId = exampleDetails.split(idTag)[1].trim();
const exampleDetailsLabel = exampleDetails.split(idTag)[0].split(labelTag)[1].trim();
const exampleFiles = [];
for (let j = 1; j < lines.length - 1; j++) {
if (lines[j].indexOf(fileTag) === -1 || lines[j].indexOf(filepathTag) === -1
|| lines[j].indexOf(filenameTag) === -1) {
throw new Error('One or more of @file, @filepath and @filename are missing under @example in ' + path.name);
}
const exampleFileDetails = lines[j].split(fileTag)[1].split('{')[1].split('}')[0];
const exampleFilePath = exampleFileDetails.split(filepathTag)[1].trim();
const exampleFileName = exampleFileDetails.split(filepathTag)[0].split(filenameTag)[1].trim();
const exampleFileContent = readFileContent(exampleFilePath, path);
const fileNameDetails = exampleFileName.split('.');
let fileLanguage = fileNameDetails[fileNameDetails.length - 1];
if (fileLanguage === 'ts') {
fileLanguage = 'typescript';
}
const exampleFile = {
contents: exampleFileContent,
language: fileLanguage,
name: exampleFileName,
sourcePath: exampleFilePath
};
exampleFiles.push(exampleFile);
}
if (examplesMap[exampleDetailsId]) {
throw new Error('Duplicate example ID');
}
examplesMap[exampleDetailsId] = {
id: exampleDetailsId,
name: exampleDetailsLabel,
files: exampleFiles
};
}
}
}
const document = {
id: smeDocId,
name: smeDocLabel,
internal: isInternal,
parentId: parentId,
overview: overviewFileContent,
api: null,
examples: examplesMap
};
return document;
}
function retrieveTemplate(content) {
let template = '';
let flag = false;
const lines = content.split('\n');
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
if (flag) {
if (line.indexOf(commentEnd) === -1) {
template = template + line + '\n';
}
else {
break;
}
}
else {
if (line.indexOf(smeDocTag) !== -1) {
flag = true;
template = template + line + '\n';
}
}
}
return template;
}
function readFileContent(filepath, path) {
const absolutePath = path.dir + '/' + filepath.slice(2);
try {
if (fs_1.default.existsSync(absolutePath)) {
return fs_1.default.readFileSync(absolutePath, 'utf8');
}
}
catch (err) {
// eslint-disable-next-line no-console
console.error(err);
}
}
const documents = {};
return through2_1.default.obj(
/**
* Transform
*/
function (file, encoding, callback) {
const content = file.contents.toString('utf8');
const path = path_1.default.parse(file.path);
if (isDocumentationRequired(content)) {
const template = retrieveTemplate(content);
const jsonContent = documentControl(template, path);
documents[jsonContent.id] = jsonContent;
return callback();
}
callback();
},
/**
* Flush
*/
function (callback) {
const stringContent = JSON.stringify(documents);
const docFile = new vinyl_1.default({
// cwd: '/',
path: './documentation.json',
contents: Buffer.from(stringContent, 'utf8')
});
this.push(docFile);
callback();
});
}
module.exports = generateSmeDocumentation;
//# sourceMappingURL=index.js.map