diff --git a/src/generator/README.md b/src/generator/README.md index 6a739024c4..039c7d1929 100644 --- a/src/generator/README.md +++ b/src/generator/README.md @@ -13,37 +13,37 @@ pass-thru: - tree-shaker pipeline: - azureresourceschema/imodeler2: + bicep/imodeler2: input: openapi-document/multi-api/identity - scope: azureresourceschema - azureresourceschema/commonmarker: + scope: bicep + bicep/commonmarker: input: imodeler2 - azureresourceschema/cm/transform: + bicep/cm/transform: input: commonmarker - azureresourceschema/cm/emitter: + bicep/cm/emitter: input: transform scope: scope-cm/emitter - azureresourceschema/generate: - plugin: azureresourceschema + bicep/generate: + plugin: bicep input: cm/transform - output-artifact: source-file-azureresourceschema - azureresourceschema/transform: + output-artifact: source-file-bicep + bicep/transform: input: generate - output-artifact: source-file-azureresourceschema + output-artifact: source-file-bicep scope: scope-transform-string - azureresourceschema/emitter: + bicep/emitter: input: transform - scope: scope-azureresourceschema/emitter + scope: scope-bicep/emitter -scope-azureresourceschema/emitter: - input-artifact: source-file-azureresourceschema +scope-bicep/emitter: + input-artifact: source-file-bicep output-uri-expr: $key scope-transform-string: is-object: false output-artifact: -- source-file-azureresourceschema +- source-file-bicep scope-cm/emitter: input-artifact: code-model-v1 diff --git a/src/generator/cmd/generate.ts b/src/generator/cmd/generate.ts index 5db8be628b..3bb71facc7 100644 --- a/src/generator/cmd/generate.ts +++ b/src/generator/cmd/generate.ts @@ -9,6 +9,9 @@ import stripAnsi from 'strip-ansi'; import yargs from 'yargs'; import { groupBy, keys, orderBy, sortBy, Dictionary } from 'lodash'; import { TypeBaseKind } from '../types'; +import { GeneratorConfig, getConfig } from '../config'; +import * as markdown from '@ts-common/commonmark-to-markdown' +import * as yaml from 'js-yaml' interface ILogger { out: (data: string) => void; @@ -61,6 +64,7 @@ executeSynchronous(async () => { // use consistent sorting to make log changes easier to review for (const readmePath of readmePaths.sort(lowerCaseCompare)) { + const bicepReadmePath = `${path.dirname(readmePath)}/readme.bicep.md`; const basePath = path.relative(specsPath, readmePath).split(path.sep)[0].toLowerCase(); const outputDir = `${tmpOutputPath}/${basePath}`; @@ -72,8 +76,11 @@ executeSynchronous(async () => { await rmdir(outputDir, { recursive: true }); await mkdir(outputDir, { recursive: true }); const logger = await getLogger(`${outputDir}/log.out`); + const config = getConfig(basePath); try { + // autorest readme.bicep.md files are not checked in, so we must generate them before invoking autorest + await generateAutorestConfig(readmePath, bicepReadmePath, config); await generateSchema(logger, readmePath, outputDir, verbose, waitForDebugger); await copyRecursive(outputDir, `${outputBaseDir}/${basePath}`); @@ -85,18 +92,95 @@ executeSynchronous(async () => { // clean up temp dir await rmdir(outputDir, { recursive: true }); + // clean up autorest readme.bicep.md files + await rm(bicepReadmePath, { force: true }); } // build the type index await buildTypeIndex(defaultLogger, outputBaseDir); }); +async function generateAutorestConfig(readmePath: string, bicepReadmePath: string, config: GeneratorConfig) { + // We expect a path format convention of /(preview|stable)/--
(|-preview)/.json + // This information is used to generate individual tags in the generated autorest configuration + const pathRegex = /^([^\/]+)\/[^\/]+\/(\d{4}-\d{2}-\d{2}(|-preview))\/.*\.json$/i; + + const readmeContents = await readFile(readmePath, { encoding: 'utf8' }); + const readmeMarkdown = markdown.parse(readmeContents); + + const inputFiles = new Set(config.additionalFiles); + // we need to look for all autorest configuration elements containing input files, and collect that list of files. These will look like (e.g.): + // ```yaml $(tag) == 'someTag' + // input-file: + // - path/to/file.json + // - path/to/other_file.json + // ``` + for (const node of markdown.iterate(readmeMarkdown.markDown)) { + // We're only interested in yaml code blocks + if (node.type !== 'code_block' || !node.info || !node.literal || + !node.info.trim().startsWith('yaml')) { + continue; + } + + const yamlData = yaml.load(node.literal) as any; + if (yamlData) { + // input-file may be a single string or an array of strings + const inputFile = yamlData['input-file']; + if (typeof inputFile === 'string') { + inputFiles.add(inputFile.replace(/[\\\/]/g, '/')); + } else if (inputFile instanceof Array) { + for (const i of inputFile) { + inputFiles.add(i.replace(/[\\\/]/g, '/')); + } + } + } + } + + const filesByTag: Dictionary = {}; + for (const file of inputFiles) { + const match = pathRegex.exec(file); + if (match) { + // Generate a unique tag. We can't process all of the different API versions in one autorest pass + // because there are constraints on naming uniqueness (e.g. naming of definitions), so we want to pass over + // each API version separately. + const tagName = `${match[1].toLowerCase()}-${match[2].toLowerCase()}`; + if (!filesByTag[tagName]) { + filesByTag[tagName] = []; + } + + filesByTag[tagName].push(file); + } + } + + let generatedContent = `##Bicep + +### Bicep multi-api +\`\`\`yaml $(bicep) && $(multiapi) +${yaml.dump({ 'batch': Object.keys(filesByTag).map(tag => ({ 'tag': tag })) }, { lineWidth: 1000 })} +\`\`\` +`; + + for (const tag of Object.keys(filesByTag)) { + generatedContent += `### Tag: ${tag} and bicep +\`\`\`yaml $(tag) == '${tag}' && $(bicep) +${yaml.dump({ 'input-file': filesByTag[tag] }, { lineWidth: 1000})} +\`\`\` +`; + + await writeFile(bicepReadmePath, generatedContent); + } +} + async function generateSchema(logger: ILogger, readme: string, outputBaseDir: string, verbose: boolean, waitForDebugger: boolean) { let autoRestParams = [ `--use=${extensionDir}`, - '--azureresourceschema', + '--bicep', `--output-folder=${outputBaseDir}`, `--multiapi`, + // This is necessary to avoid failures such as "ERROR: Semantic violation: Discriminator must be a required property." blocking type generation. + // In an ideal world, we'd raise issues in https://github.com/Azure/azure-rest-api-specs and force RP teams to fix them, but this isn't very practical + // as new validations are added continuously, and there's often quite a lag before teams will fix them - we don't want to be blocked by this in generating types. + `--skip-semantics-validation`, readme, ]; @@ -109,11 +193,11 @@ async function generateSchema(logger: ILogger, readme: string, outputBaseDir: st if (waitForDebugger) { autoRestParams = autoRestParams.concat([ - `--azureresourceschema.debugger=true`, + `--bicep.debugger=true`, ]); } - return await executeCmd(logger, __dirname, autorestBinary, autoRestParams); + return await executeCmd(logger, verbose, __dirname, autorestBinary, autoRestParams); } async function findReadmePaths(specsPath: string) { @@ -164,10 +248,11 @@ async function findRecursive(basePath: string, filter: (name: string) => boolean return results; } -function executeCmd(logger: ILogger, cwd: string, cmd: string, args: string[]) : Promise { +function executeCmd(logger: ILogger, verbose: boolean, cwd: string, cmd: string, args: string[]) : Promise { return new Promise((resolve, reject) => { - logOut(logger, ''); - logOut(logger, chalk.green(`Executing: ${cmd} ${args.join(' ')}`)); + if (verbose) { + logOut(logger, chalk.green(`Executing: ${cmd} ${args.join(' ')}`)); + } const child = spawn(cmd, args, { cwd: cwd, @@ -292,9 +377,9 @@ async function buildIndex(logger: ILogger, baseDir: string): Promise // Use a consistent sort order so that file system differences don't generate changes for (const typeFilePath of orderBy(typeFiles, f => f.toLowerCase(), 'asc')) { - const content = await readFile(typeFilePath); + const content = await readFile(typeFilePath, { encoding: 'utf8' }); - const types = JSON.parse(content.toString()) as any[]; + const types = JSON.parse(content) as any[]; for (const type of types) { const resource = type[TypeBaseKind.ResourceType]; if (!resource) { diff --git a/src/generator/config.ts b/src/generator/config.ts new file mode 100644 index 0000000000..a0207cba85 --- /dev/null +++ b/src/generator/config.ts @@ -0,0 +1,24 @@ +import { Dictionary } from "lodash"; + +export interface GeneratorConfig { + additionalFiles: string[]; +} + +const defaultConfig: GeneratorConfig = { + additionalFiles: [], +} + +const config: Dictionary = { + 'keyvault': { + additionalFiles: [ + 'Microsoft.KeyVault/stable/2016-10-01/secrets.json', + 'Microsoft.KeyVault/stable/2018-02-14/secrets.json', + 'Microsoft.KeyVault/preview/2018-02-14-preview/secrets.json', + 'Microsoft.KeyVault/stable/2019-09-01/secrets.json', + ], + } +} + +export function getConfig(basePath: string): GeneratorConfig { + return config[basePath.toLowerCase()] || defaultConfig; +} \ No newline at end of file diff --git a/src/generator/package-lock.json b/src/generator/package-lock.json index 21c383d89d..a2eeddd9a0 100644 --- a/src/generator/package-lock.json +++ b/src/generator/package-lock.json @@ -10,13 +10,16 @@ "license": "MIT", "devDependencies": { "@autorest/core": "^3.4.3", + "@ts-common/commonmark-to-markdown": "^2.0.0", "@types/async": "^3.2.6", + "@types/js-yaml": "^4.0.1", "@types/lodash": "^4.14.170", "@types/node": "^15.6.0", "@types/yargs": "^17.0.0", "async": "^3.2.0", "autorest": "^3.2.1", "chalk": "^4.1.1", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.0", "ts-node": "^10.0.0", @@ -37,6 +40,27 @@ "node": ">=10.13.0" } }, + "node_modules/@ts-common/commonmark-to-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ts-common/commonmark-to-markdown/-/commonmark-to-markdown-2.0.0.tgz", + "integrity": "sha512-1C2P3k6Hmigp9V6PaggRABHR1Sf+VI7EmBcSA8tdVGFMoGbZTF3Mmen5PEbQJq5OA5gtvDkMN1ouVs3SJnH0Bw==", + "dev": true, + "dependencies": { + "@ts-common/iterator": "^1.1.0", + "@types/commonmark": "^0.27.3", + "commonmark": "^0.28.1", + "front-matter": "^3.0.1" + } + }, + "node_modules/@ts-common/iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ts-common/iterator/-/iterator-1.1.0.tgz", + "integrity": "sha512-pP7Ee7c54XiLyD2twIQtUGId4ln3w/HxBT207Aq+n4RMq7lGqHt97zKBYlsGawPTuF2z2ZoYiC9l1Wx2lMVpRA==", + "dev": true, + "peerDependencies": { + "tslib": "^1.0.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.7.tgz", @@ -73,6 +97,18 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "node_modules/@types/commonmark": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@types/commonmark/-/commonmark-0.27.4.tgz", + "integrity": "sha512-7koSjp08QxKoS1/+3T15+kD7+vqOUvZRHvM8PutF3Xsk5aAEkdlIGRsHJ3/XsC3izoqTwBdRW/vH7rzCKkIicA==", + "dev": true + }, + "node_modules/@types/js-yaml": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.1.tgz", + "integrity": "sha512-xdOvNmXmrZqqPy3kuCQ+fz6wA0xU5pji9cd1nDrflWaAWtYLLGk5ykW0H6yg5TVyehHP1pfmuuSaZkhP+kspVA==", + "dev": true + }, "node_modules/@types/lodash": { "version": "4.14.170", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", @@ -128,6 +164,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", @@ -198,6 +240,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/commonmark": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.28.1.tgz", + "integrity": "sha1-Buq41SM4uDn6Gi11rwCF7tGxvq4=", + "dev": true, + "dependencies": { + "entities": "~ 1.1.1", + "mdurl": "~ 1.0.1", + "minimist": "~ 1.2.0", + "string.prototype.repeat": "^0.2.0" + }, + "bin": { + "commonmark": "bin/commonmark" + }, + "engines": { + "node": "*" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -219,6 +279,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -228,6 +294,50 @@ "node": ">=6" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/front-matter": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-3.2.1.tgz", + "integrity": "sha512-YUhgEhbL6tG+Ok3vTGIoSDKqcr47aSDvyhEqIv8B+YuBJFsPnOiArNXTPp2yO07NL+a0L4+2jXlKlKqyVcsRRA==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -255,6 +365,18 @@ "node": ">=8" } }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -267,6 +389,18 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -295,6 +429,12 @@ "source-map": "^0.6.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "node_modules/string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -309,6 +449,12 @@ "node": ">=8" } }, + "node_modules/string.prototype.repeat": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz", + "integrity": "sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=", + "dev": true + }, "node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -375,6 +521,13 @@ } } }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "peer": true + }, "node_modules/typescript": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", @@ -455,6 +608,25 @@ "integrity": "sha512-FcMxbGTp8QCBiHFhqWsKWVoV5ow2/RyFMGCPRJ+ZMYqfcDxRT277nDcZyMz6jIIyMwNXOzStzhFqeP6FmCoPKw==", "dev": true }, + "@ts-common/commonmark-to-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ts-common/commonmark-to-markdown/-/commonmark-to-markdown-2.0.0.tgz", + "integrity": "sha512-1C2P3k6Hmigp9V6PaggRABHR1Sf+VI7EmBcSA8tdVGFMoGbZTF3Mmen5PEbQJq5OA5gtvDkMN1ouVs3SJnH0Bw==", + "dev": true, + "requires": { + "@ts-common/iterator": "^1.1.0", + "@types/commonmark": "^0.27.3", + "commonmark": "^0.28.1", + "front-matter": "^3.0.1" + } + }, + "@ts-common/iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ts-common/iterator/-/iterator-1.1.0.tgz", + "integrity": "sha512-pP7Ee7c54XiLyD2twIQtUGId4ln3w/HxBT207Aq+n4RMq7lGqHt97zKBYlsGawPTuF2z2ZoYiC9l1Wx2lMVpRA==", + "dev": true, + "requires": {} + }, "@tsconfig/node10": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.7.tgz", @@ -491,6 +663,18 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/commonmark": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@types/commonmark/-/commonmark-0.27.4.tgz", + "integrity": "sha512-7koSjp08QxKoS1/+3T15+kD7+vqOUvZRHvM8PutF3Xsk5aAEkdlIGRsHJ3/XsC3izoqTwBdRW/vH7rzCKkIicA==", + "dev": true + }, + "@types/js-yaml": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.1.tgz", + "integrity": "sha512-xdOvNmXmrZqqPy3kuCQ+fz6wA0xU5pji9cd1nDrflWaAWtYLLGk5ykW0H6yg5TVyehHP1pfmuuSaZkhP+kspVA==", + "dev": true + }, "@types/lodash": { "version": "4.14.170", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", @@ -540,6 +724,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", @@ -594,6 +784,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "commonmark": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.28.1.tgz", + "integrity": "sha1-Buq41SM4uDn6Gi11rwCF7tGxvq4=", + "dev": true, + "requires": { + "entities": "~ 1.1.1", + "mdurl": "~ 1.0.1", + "minimist": "~ 1.2.0", + "string.prototype.repeat": "^0.2.0" + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -612,12 +814,54 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "front-matter": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-3.2.1.tgz", + "integrity": "sha512-YUhgEhbL6tG+Ok3vTGIoSDKqcr47aSDvyhEqIv8B+YuBJFsPnOiArNXTPp2yO07NL+a0L4+2jXlKlKqyVcsRRA==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -636,6 +880,15 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -648,6 +901,18 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -670,6 +935,12 @@ "source-map": "^0.6.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -681,6 +952,12 @@ "strip-ansi": "^6.0.0" } }, + "string.prototype.repeat": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz", + "integrity": "sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=", + "dev": true + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -717,6 +994,13 @@ "yn": "3.1.1" } }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "peer": true + }, "typescript": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", diff --git a/src/generator/package.json b/src/generator/package.json index d1a06a8436..f2437804ef 100644 --- a/src/generator/package.json +++ b/src/generator/package.json @@ -24,13 +24,16 @@ "homepage": "https://github.com/Azure/bicep-types-az/blob/main/README.md", "devDependencies": { "@autorest/core": "^3.4.3", + "@ts-common/commonmark-to-markdown": "^2.0.0", "@types/async": "^3.2.6", + "@types/js-yaml": "^4.0.1", "@types/lodash": "^4.14.170", "@types/node": "^15.6.0", "@types/yargs": "^17.0.0", "async": "^3.2.0", "autorest": "^3.2.1", "chalk": "^4.1.1", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.0", "ts-node": "^10.0.0", diff --git a/src/generator/src/Bicep.TypeGen.Autorest/Program.cs b/src/generator/src/Bicep.TypeGen.Autorest/Program.cs index a5eacc54cc..9f2ece2ffd 100644 --- a/src/generator/src/Bicep.TypeGen.Autorest/Program.cs +++ b/src/generator/src/Bicep.TypeGen.Autorest/Program.cs @@ -17,7 +17,7 @@ namespace Azure.Bicep.TypeGen.Autorest { public class Program : NewPlugin { - private static IEnumerable PluginNames = new []{ "azureresourceschema", "imodeler2" }; + private static IEnumerable PluginNames = new []{ "bicep", "imodeler2" }; public static async Task Main(string[] args) { diff --git a/src/generator/tsconfig.json b/src/generator/tsconfig.json index 93403b4fbd..d3bd8dffe0 100644 --- a/src/generator/tsconfig.json +++ b/src/generator/tsconfig.json @@ -22,6 +22,5 @@ "outDir": "dist", "rootDir": "." }, - "include": ["src"], - "exclude": ["dist", "node_modules", "**/*.d.ts"] + "exclude": ["dist", "node_modules"] } \ No newline at end of file