From 522df1ebd9e9fd83b2b2ef67092858cf390a4e77 Mon Sep 17 00:00:00 2001 From: Anthony Martin Date: Thu, 20 May 2021 12:40:38 -0400 Subject: [PATCH 1/5] Generate config files on-the-fly --- src/generator/README.md | 30 +- src/generator/cmd/generate.ts | 76 ++- src/generator/package-lock.json | 521 ++++-------------- src/generator/package.json | 3 + .../src/Bicep.TypeGen.Autorest/Program.cs | 2 +- 5 files changed, 208 insertions(+), 424 deletions(-) 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..2004625e5c 100644 --- a/src/generator/cmd/generate.ts +++ b/src/generator/cmd/generate.ts @@ -9,6 +9,8 @@ import stripAnsi from 'strip-ansi'; import yargs from 'yargs'; import { groupBy, keys, orderBy, sortBy, Dictionary } from 'lodash'; import { TypeBaseKind } from '../types'; +import * as markdown from '@ts-common/commonmark-to-markdown' +import * as yaml from 'js-yaml' interface ILogger { out: (data: string) => void; @@ -74,6 +76,7 @@ executeSynchronous(async () => { const logger = await getLogger(`${outputDir}/log.out`); try { + await buildConfiguration(logger, readmePath); await generateSchema(logger, readmePath, outputDir, verbose, waitForDebugger); await copyRecursive(outputDir, `${outputBaseDir}/${basePath}`); @@ -91,10 +94,66 @@ executeSynchronous(async () => { await buildTypeIndex(defaultLogger, outputBaseDir); }); +async function buildConfiguration(logger: ILogger, readme: string) { + const pathRegex = /(microsoft\.\w+)[\\\/]\S*[\\\/](\d{4}-\d{2}-\d{2}(|-preview))[\\\/]/i; + const readmeContents = await readFile(readme, { encoding: 'utf8' }); + const readmeMarkdown = markdown.parse(readmeContents); + + const inputFiles = new Set(); + for (const codeBlock of markdown.iterate(readmeMarkdown.markDown)) { + if (codeBlock.type === 'code_block' && codeBlock?.info?.startsWith('yaml') && codeBlock.literal !== null) { + const yamlBlock = yaml.load(codeBlock.literal) as any; + if (yamlBlock) { + const inputFile = yamlBlock['input-file']; + if (typeof inputFile === 'string') { + inputFiles.add(inputFile); + } else if (inputFile instanceof Array) { + for (const i of inputFile) { + inputFiles.add(i); + } + } + } + } + } + + const filesByTag: Dictionary = {}; + for (const file of inputFiles) { + const match = pathRegex.exec(file); + if (match) { + 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( + `${path.dirname(readme)}/readme.bicep.md`, + generatedContent); + } +} + async function generateSchema(logger: ILogger, readme: string, outputBaseDir: string, verbose: boolean, waitForDebugger: boolean) { let autoRestParams = [ `--use=${extensionDir}`, - '--azureresourceschema', + '--bicep', `--output-folder=${outputBaseDir}`, `--multiapi`, readme, @@ -109,11 +168,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 +223,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 +352,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/package-lock.json b/src/generator/package-lock.json index f1516dc423..89dbdfc4f7 100644 --- a/src/generator/package-lock.json +++ b/src/generator/package-lock.json @@ -1,415 +1,31 @@ { "name": "@autorest/bicep", "version": "0.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@autorest/bicep", - "version": "0.0.0", - "license": "MIT", - "devDependencies": { - "@autorest/core": "^3.4.2", - "@types/async": "^3.2.6", - "@types/lodash": "^4.14.168", - "@types/node": "^15.0.2", - "@types/yargs": "^16.0.1", - "async": "^3.2.0", - "autorest": "^3.2.0", - "chalk": "^4.1.1", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.0", - "ts-node": "^9.0.0", - "typescript": "^4.2.4", - "yargs": "^17.0.1" - } - }, - "node_modules/@autorest/core": { + "dependencies": { + "@autorest/core": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/@autorest/core/-/core-3.4.2.tgz", "integrity": "sha512-nCKlvMmTjAz3DwYb0EoMfg0FITqCSFZaxzqel762+KOcKM4cToqjqLhfZKtb9EeATApRuZG3kfcYqaSdkrlHWA==", - "dev": true, - "bin": { - "autorest-core": "entrypoints/app.js", - "autorest-language-service": "entrypoints/language-service.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.6.tgz", - "integrity": "sha512-ZkrXnZLC1mc4b9QLKaSrsxV4oxTRs10OI2kgSApT8G0v1jrmqppSHUVQ15kLorzsFBTjvf7OKF4kAibuuNQ+xA==", - "dev": true - }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", - "dev": true - }, - "node_modules/@types/node": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", - "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.1.tgz", - "integrity": "sha512-x4HABGLyzr5hKUzBC9dvjciOTm11WVH1NWonNjGgxapnTHu5SWUqyqn0zQ6Re0yQU0lsQ6ztLCoMAKDGZflyxA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, - "node_modules/autorest": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.2.0.tgz", - "integrity": "sha512-/hFBvyCxbfZ/xolqTGYRcIuyYWEDSRdxbPtcRKa0C/2td8W0IZLeDtDeX7f2fnCjPzd8WllGJhr8N49xL+AUiA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "autorest": "entrypoints/app.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "@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, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", - "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" + "requires": { + "@ts-common/iterator": "^1.1.0", + "@types/commonmark": "^0.27.3", + "commonmark": "^0.28.1", + "front-matter": "^3.0.1" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@autorest/core": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@autorest/core/-/core-3.4.2.tgz", - "integrity": "sha512-nCKlvMmTjAz3DwYb0EoMfg0FITqCSFZaxzqel762+KOcKM4cToqjqLhfZKtb9EeATApRuZG3kfcYqaSdkrlHWA==", + "@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 }, "@types/async": { @@ -424,6 +40,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.168", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", @@ -473,6 +101,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", @@ -527,6 +161,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", @@ -545,12 +191,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", @@ -569,6 +257,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", @@ -581,6 +278,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", @@ -603,6 +312,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", @@ -614,6 +329,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", diff --git a/src/generator/package.json b/src/generator/package.json index 732e107958..31f09eafa4 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.2", + "@ts-common/commonmark-to-markdown": "^2.0.0", "@types/async": "^3.2.6", + "@types/js-yaml": "^4.0.1", "@types/lodash": "^4.14.168", "@types/node": "^15.0.2", "@types/yargs": "^16.0.1", "async": "^3.2.0", "autorest": "^3.2.0", "chalk": "^4.1.1", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.0", "ts-node": "^9.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) { From f292041a95be3b7cac8de1f0ae7348febbcf663b Mon Sep 17 00:00:00 2001 From: Anthony Martin Date: Thu, 20 May 2021 14:29:36 -0400 Subject: [PATCH 2/5] Add config for keyvault --- src/generator/cmd/generate.ts | 22 ++++++++++++---------- src/generator/config.ts | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 src/generator/config.ts diff --git a/src/generator/cmd/generate.ts b/src/generator/cmd/generate.ts index 2004625e5c..254d0e4fae 100644 --- a/src/generator/cmd/generate.ts +++ b/src/generator/cmd/generate.ts @@ -9,6 +9,7 @@ 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' @@ -63,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}`; @@ -74,9 +76,10 @@ executeSynchronous(async () => { await rmdir(outputDir, { recursive: true }); await mkdir(outputDir, { recursive: true }); const logger = await getLogger(`${outputDir}/log.out`); + const config = getConfig(basePath); try { - await buildConfiguration(logger, readmePath); + await buildConfiguration(readmePath, bicepReadmePath, config); await generateSchema(logger, readmePath, outputDir, verbose, waitForDebugger); await copyRecursive(outputDir, `${outputBaseDir}/${basePath}`); @@ -88,28 +91,29 @@ executeSynchronous(async () => { // clean up temp dir await rmdir(outputDir, { recursive: true }); + await rm(bicepReadmePath, { force: true }); } // build the type index await buildTypeIndex(defaultLogger, outputBaseDir); }); -async function buildConfiguration(logger: ILogger, readme: string) { - const pathRegex = /(microsoft\.\w+)[\\\/]\S*[\\\/](\d{4}-\d{2}-\d{2}(|-preview))[\\\/]/i; - const readmeContents = await readFile(readme, { encoding: 'utf8' }); +async function buildConfiguration(readmePath: string, bicepReadmePath: string, config: GeneratorConfig) { + 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(); + const inputFiles = new Set(config.additionalFiles); for (const codeBlock of markdown.iterate(readmeMarkdown.markDown)) { if (codeBlock.type === 'code_block' && codeBlock?.info?.startsWith('yaml') && codeBlock.literal !== null) { const yamlBlock = yaml.load(codeBlock.literal) as any; if (yamlBlock) { const inputFile = yamlBlock['input-file']; if (typeof inputFile === 'string') { - inputFiles.add(inputFile); + inputFiles.add(inputFile.replace(/[\\\/]/g, '/')); } else if (inputFile instanceof Array) { for (const i of inputFile) { - inputFiles.add(i); + inputFiles.add(i.replace(/[\\\/]/g, '/')); } } } @@ -144,9 +148,7 @@ ${yaml.dump({ 'input-file': filesByTag[tag] }, { lineWidth: 1000})} \`\`\` `; - await writeFile( - `${path.dirname(readme)}/readme.bicep.md`, - generatedContent); + await writeFile(bicepReadmePath, generatedContent); } } 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 From 8f73663388b3f3f517a70785a1591c3b27be7fed Mon Sep 17 00:00:00 2001 From: Anthony Martin Date: Thu, 20 May 2021 15:18:21 -0400 Subject: [PATCH 3/5] Disable semantic validation --- src/generator/cmd/generate.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/generator/cmd/generate.ts b/src/generator/cmd/generate.ts index 254d0e4fae..00de556a92 100644 --- a/src/generator/cmd/generate.ts +++ b/src/generator/cmd/generate.ts @@ -158,6 +158,8 @@ async function generateSchema(logger: ILogger, readme: string, outputBaseDir: st '--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 + `--skip-semantics-validation`, readme, ]; From d2e251041081237cc47936a78a20f885ebb14a47 Mon Sep 17 00:00:00 2001 From: Anthony Martin Date: Fri, 21 May 2021 10:52:49 -0400 Subject: [PATCH 4/5] Add some comments --- src/generator/cmd/generate.ts | 53 ++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/generator/cmd/generate.ts b/src/generator/cmd/generate.ts index 00de556a92..ac90f1f864 100644 --- a/src/generator/cmd/generate.ts +++ b/src/generator/cmd/generate.ts @@ -79,7 +79,8 @@ executeSynchronous(async () => { const config = getConfig(basePath); try { - await buildConfiguration(readmePath, bicepReadmePath, config); + // 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}`); @@ -91,6 +92,7 @@ executeSynchronous(async () => { // clean up temp dir await rmdir(outputDir, { recursive: true }); + // clean up autorest readme.bicep.md files await rm(bicepReadmePath, { force: true }); } @@ -98,23 +100,37 @@ executeSynchronous(async () => { await buildTypeIndex(defaultLogger, outputBaseDir); }); -async function buildConfiguration(readmePath: string, bicepReadmePath: string, config: GeneratorConfig) { +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); - for (const codeBlock of markdown.iterate(readmeMarkdown.markDown)) { - if (codeBlock.type === 'code_block' && codeBlock?.info?.startsWith('yaml') && codeBlock.literal !== null) { - const yamlBlock = yaml.load(codeBlock.literal) as any; - if (yamlBlock) { - const inputFile = yamlBlock['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, '/')); - } + // 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); + if (typeof yamlData === 'object') { + // 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, '/')); } } } @@ -124,6 +140,9 @@ async function buildConfiguration(readmePath: string, bicepReadmePath: string, c 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] = []; @@ -136,14 +155,14 @@ async function buildConfiguration(readmePath: string, bicepReadmePath: string, c let generatedContent = `##Bicep ### Bicep multi-api -\`\`\` yaml $(bicep) && $(multiapi) +\`\`\`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 $(tag) == '${tag}' && $(bicep) ${yaml.dump({ 'input-file': filesByTag[tag] }, { lineWidth: 1000})} \`\`\` `; @@ -158,7 +177,9 @@ async function generateSchema(logger: ILogger, readme: string, outputBaseDir: st '--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 + // 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, ]; From 9c40fd536b777eca95d2aaf335ec270fb2e235c5 Mon Sep 17 00:00:00 2001 From: Anthony Martin Date: Fri, 21 May 2021 11:23:02 -0400 Subject: [PATCH 5/5] Fix IDE validation errors --- src/generator/cmd/generate.ts | 4 ++-- src/generator/package-lock.json | 14 +++++++------- src/generator/package.json | 2 +- src/generator/tsconfig.json | 3 +-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/generator/cmd/generate.ts b/src/generator/cmd/generate.ts index ac90f1f864..3bb71facc7 100644 --- a/src/generator/cmd/generate.ts +++ b/src/generator/cmd/generate.ts @@ -122,8 +122,8 @@ async function generateAutorestConfig(readmePath: string, bicepReadmePath: strin continue; } - const yamlData = yaml.load(node.literal); - if (typeof yamlData === 'object') { + 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') { diff --git a/src/generator/package-lock.json b/src/generator/package-lock.json index 5f2a60c35e..6f81914cf5 100644 --- a/src/generator/package-lock.json +++ b/src/generator/package-lock.json @@ -14,7 +14,7 @@ "@types/async": "^3.2.6", "@types/js-yaml": "^4.0.1", "@types/lodash": "^4.14.169", - "@types/node": "^15.3.1", + "@types/node": "^15.6.0", "@types/yargs": "^16.0.2", "async": "^3.2.0", "autorest": "^3.2.0", @@ -92,9 +92,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.1.tgz", - "integrity": "sha512-weaeiP4UF4XgF++3rpQhpIJWsCTS4QJw5gvBhQu6cFIxTwyxWIe3xbnrY/o2lTCQ0lsdb8YIUDUvLR4Vuz5rbw==", + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.0.tgz", + "integrity": "sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A==", "dev": true }, "node_modules/@types/yargs": { @@ -615,9 +615,9 @@ "dev": true }, "@types/node": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.1.tgz", - "integrity": "sha512-weaeiP4UF4XgF++3rpQhpIJWsCTS4QJw5gvBhQu6cFIxTwyxWIe3xbnrY/o2lTCQ0lsdb8YIUDUvLR4Vuz5rbw==", + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.0.tgz", + "integrity": "sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A==", "dev": true }, "@types/yargs": { diff --git a/src/generator/package.json b/src/generator/package.json index cf19e60d4c..17a417264b 100644 --- a/src/generator/package.json +++ b/src/generator/package.json @@ -28,7 +28,7 @@ "@types/async": "^3.2.6", "@types/js-yaml": "^4.0.1", "@types/lodash": "^4.14.169", - "@types/node": "^15.3.1", + "@types/node": "^15.6.0", "@types/yargs": "^16.0.2", "async": "^3.2.0", "autorest": "^3.2.0", 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