UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

176 lines (174 loc) 7.66 kB
"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