From be94aac86710aca2c083ae098d94ac9f8ca09f51 Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 10:00:01 +0100 Subject: [PATCH 01/11] fix: added template selection to create-monokle-plugin and improved docs --- .gitignore | 3 +- package-lock.json | 6 +- packages/create-monokle-plugin/README.md | 29 +- packages/create-monokle-plugin/index.js | 85 +- packages/create-monokle-plugin/package.json | 4 +- .../template-validation-ts/README.md | 37 - .../template-validation-ts/src/plugin.ts | 17 - .../src/rules/2-exampleRelated.ts | 32 - .../src/rules/4-examplePod.ts | 36 - .../template-validation-ts/src/utils.ts | 37 - .../validation-ts/basic-template/README.md | 56 + .../validation-ts/basic-template}/_gitignore | 0 .../basic-template}/package-lock.json | 2 +- .../basic-template}/package.json | 0 .../basic-template/src/plugin.ts | 12 + .../basic-template}/src/rules/1-example.ts | 2 +- .../basic-template}/tsconfig.json | 4 +- .../validation-ts/crd-template/README.md | 56 + .../validation-ts/crd-template/_gitignore | 5 + .../crd-template/package-lock.json | 2839 +++++++++++++++++ .../validation-ts/crd-template/package.json | 19 + .../validation-ts/crd-template/src/plugin.ts | 12 + .../crd-template/src/rules/1-exampleCrd.ts} | 2 +- .../src/schemas/crds/prometheus.yaml | 0 .../validation-ts/crd-template/tsconfig.json | 22 + packages/validation/README.md | 36 +- packages/validation/docs/configuration.md | 173 +- packages/validation/docs/core-plugins.md | 145 + packages/validation/docs/custom-plugins.md | 96 + packages/validation/docs/plugin-examples.md | 137 + packages/validation/docs/plugin-metadata.md | 84 + 31 files changed, 3592 insertions(+), 396 deletions(-) delete mode 100644 packages/create-monokle-plugin/template-validation-ts/README.md delete mode 100644 packages/create-monokle-plugin/template-validation-ts/src/plugin.ts delete mode 100644 packages/create-monokle-plugin/template-validation-ts/src/rules/2-exampleRelated.ts delete mode 100644 packages/create-monokle-plugin/template-validation-ts/src/rules/4-examplePod.ts delete mode 100644 packages/create-monokle-plugin/template-validation-ts/src/utils.ts create mode 100644 packages/create-monokle-plugin/templates/validation-ts/basic-template/README.md rename packages/create-monokle-plugin/{template-validation-ts => templates/validation-ts/basic-template}/_gitignore (100%) rename packages/create-monokle-plugin/{template-validation-ts => templates/validation-ts/basic-template}/package-lock.json (99%) rename packages/create-monokle-plugin/{template-validation-ts => templates/validation-ts/basic-template}/package.json (100%) create mode 100644 packages/create-monokle-plugin/templates/validation-ts/basic-template/src/plugin.ts rename packages/create-monokle-plugin/{template-validation-ts => templates/validation-ts/basic-template}/src/rules/1-example.ts (90%) rename packages/create-monokle-plugin/{template-validation-ts => templates/validation-ts/basic-template}/tsconfig.json (94%) create mode 100644 packages/create-monokle-plugin/templates/validation-ts/crd-template/README.md create mode 100644 packages/create-monokle-plugin/templates/validation-ts/crd-template/_gitignore create mode 100644 packages/create-monokle-plugin/templates/validation-ts/crd-template/package-lock.json create mode 100644 packages/create-monokle-plugin/templates/validation-ts/crd-template/package.json create mode 100644 packages/create-monokle-plugin/templates/validation-ts/crd-template/src/plugin.ts rename packages/create-monokle-plugin/{template-validation-ts/src/rules/3-exampleCrd.ts => templates/validation-ts/crd-template/src/rules/1-exampleCrd.ts} (98%) rename packages/create-monokle-plugin/{template-validation-ts => templates/validation-ts/crd-template}/src/schemas/crds/prometheus.yaml (100%) create mode 100644 packages/create-monokle-plugin/templates/validation-ts/crd-template/tsconfig.json create mode 100644 packages/validation/docs/core-plugins.md create mode 100644 packages/validation/docs/custom-plugins.md create mode 100644 packages/validation/docs/plugin-examples.md create mode 100644 packages/validation/docs/plugin-metadata.md diff --git a/.gitignore b/.gitignore index 0aafb2e98..0607605fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # dependencies node_modules +__generated__ /.pnp .idea .pnp.js @@ -27,4 +28,4 @@ yarn-error.log* .vscode -electron/env.ts \ No newline at end of file +electron/env.ts diff --git a/package-lock.json b/package-lock.json index 8062e72be..72f2f89ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23428,7 +23428,7 @@ }, "packages/components": { "name": "@monokle/components", - "version": "0.0.18", + "version": "0.0.22", "license": "MIT", "devDependencies": { "@ant-design/icons": "4.7.0", @@ -25425,7 +25425,7 @@ } }, "packages/create-monokle-plugin": { - "version": "0.3.1", + "version": "0.4.0", "license": "MIT", "dependencies": { "kolorist": "1.5.1", @@ -26110,7 +26110,7 @@ }, "packages/validation": { "name": "@monokle/validation", - "version": "0.10.2", + "version": "0.10.3", "license": "MIT", "dependencies": { "@open-policy-agent/opa-wasm": "1.8.0", diff --git a/packages/create-monokle-plugin/README.md b/packages/create-monokle-plugin/README.md index 0fe793075..2895db66b 100644 --- a/packages/create-monokle-plugin/README.md +++ b/packages/create-monokle-plugin/README.md @@ -1,25 +1,9 @@ -

- Monokle Logo -

- -

- - - -

- # Welcome to Create Monokle Plugin Use this library to scaffold your custom Monokle validation plugin in seconds - which can then be used locally or contributed to our [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repository. -## Table of contents - -- [Usage](#usage) - - [Interactive](#interactive) - - [Create a TypeScript validation plugin](#create-a-typescript-validation-plugin) - - [Example](#example) -- [Acknowledgements](#acknowledgements) +Read more about custom plugins in the [Custom Validator documentation](../validation/docs/custom-plugins.md) ## Usage @@ -46,3 +30,14 @@ example on how to get started with your own plugin. This project is a modified version of [create-vite](https://github.com/vitejs/vite/tree/main/packages/create-vite) and most credits go to them. + + +

+ Monokle Logo +

+ +

+ + + +

diff --git a/packages/create-monokle-plugin/index.js b/packages/create-monokle-plugin/index.js index 4a4e883a3..7310ff604 100755 --- a/packages/create-monokle-plugin/index.js +++ b/packages/create-monokle-plugin/index.js @@ -21,10 +21,23 @@ const PLUGIN_TYPES = [ { name: "validation-ts", display: "TypeScript", + description: "Validation plugin written in Typescript", color: blue, - }, - ], - }, + templates: [ + { + name: "basic", + description: "A sample typescript plugin with a single sample rule", + path: "validation-ts/basic-template" + }, + { + name: "with-custom-crd", + description: "A sample typescript plugin using a custom resource definition (CRD)", + path: "validation-ts/crd-template" + } + ] + } + ] + } ]; const TEMPLATES = PLUGIN_TYPES.map( @@ -33,21 +46,21 @@ const TEMPLATES = PLUGIN_TYPES.map( const renameFiles = { _gitignore: ".gitignore", - _npmrc: ".npmrc", + _npmrc: ".npmrc" }; async function init() { const defaultTargetDir = "monokle-plugin"; let targetDir = formatTargetDir(argv._[0]); let template = argv.template || argv.t; - let projectName; + let pluginName; const hasTemplateArg = template !== undefined; const communityPath = path.join(cwd, ".community"); const isMonokleCommunityRepository = fs.existsSync(communityPath); const getProjectName = () => - targetDir === "." ? path.basename(path.resolve()) : projectName; + targetDir === "." ? path.basename(path.resolve()) : pluginName; let result = {}; @@ -56,13 +69,13 @@ async function init() { [ { type: targetDir ? null : "text", - name: "projectName", - message: reset("Project name:"), + name: "pluginName", + message: reset("Plugin name:"), initial: defaultTargetDir, onState: (state) => { - projectName = state.value ?? defaultTargetDir; + pluginName = state.value ?? defaultTargetDir; targetDir = formatTargetDir(state.value) || defaultTargetDir; - }, + } }, { type: () => (isValidPackageName(getProjectName()) ? null : "text"), @@ -70,7 +83,7 @@ async function init() { message: reset("Package name:"), initial: () => toValidPackageName(getProjectName()), validate: (dir) => - isValidPackageName(dir) || "Invalid package.json name", + isValidPackageName(dir) || "Invalid package.json name" }, { type: template && TEMPLATES.includes(template) ? null : "select", @@ -78,15 +91,15 @@ async function init() { message: typeof template === "string" && !TEMPLATES.includes(template) ? reset( - `"${template}" isn't a valid template. Please choose from below: ` - ) + `"${template}" isn't a valid template. Please choose from below: ` + ) : reset("Select a plugin type:"), initial: 0, choices: PLUGIN_TYPES.map((pluginTypes) => { const pluginTypeColor = pluginTypes.color; return { title: pluginTypeColor(pluginTypes.name), - value: pluginTypes, + value: pluginTypes }; }), onState: (state) => { @@ -95,7 +108,7 @@ async function init() { } targetDir = `${state.value.name}/${targetDir}`; - }, + } }, { type: (pluginType) => @@ -103,14 +116,32 @@ async function init() { name: "variant", message: reset("Select a variant:"), // @ts-ignore - choices: (framework) => - framework.variants.map((variant) => { + choices: (pluginType) => + pluginType.variants.map((variant) => { const variantColor = variant.color; return { title: variantColor(variant.name), - value: variant.name, + description: variant.description, + value: variant.name }; - }), + }) + }, + { + type: (variant, values) => { + return values.pluginType && variant && + values.pluginType.variants.find(elm => elm.name === variant) ? "select" : null; + }, + name: "variantTemplate", + message: reset("Select a template:"), + // @ts-ignore + choices: (variant, values) => + values.pluginType.variants.find(elm => elm.name === variant)?.templates.map(template => { + return { + title: template.name, + description: template.description, + value: template.path + }; + }) }, { type: () => @@ -120,7 +151,7 @@ async function init() { (targetDir === "." ? "Current directory" : `Target directory "${targetDir}"`) + - ` is not empty. Remove existing files and continue?`, + ` is not empty. Remove existing files and continue?` }, { type: (_, { overwrite } = {}) => { @@ -129,14 +160,14 @@ async function init() { } return null; }, - name: "overwriteChecker", - }, + name: "overwriteChecker" + } ], { onCancel: () => { throw new Error(red("✖") + " Operation cancelled"); - }, + } } ); } catch (cancelled) { @@ -145,7 +176,7 @@ async function init() { } // user choice associated with prompts - const { pluginType, overwrite, packageName, variant } = result; + const { pluginType, overwrite, packageName, variant, variantTemplate } = result; if (hasTemplateArg && isMonokleCommunityRepository) { if (template.startsWith("validation")) { @@ -162,14 +193,14 @@ async function init() { } // determine template - template = variant || pluginType || template; + template = variantTemplate ? path.join( "templates", variantTemplate ) : variant || pluginType || template; console.log(`\nScaffolding plugin in ${root}...`); const templateDir = path.resolve( fileURLToPath(import.meta.url), "..", - `template-${template}` + template ); const write = (file, content) => { @@ -296,7 +327,7 @@ function pkgFromUserAgent(userAgent) { const pkgSpecArr = pkgSpec.split("/"); return { name: pkgSpecArr[0], - version: pkgSpecArr[1], + version: pkgSpecArr[1] }; } diff --git a/packages/create-monokle-plugin/package.json b/packages/create-monokle-plugin/package.json index 088053886..e082b8c9d 100644 --- a/packages/create-monokle-plugin/package.json +++ b/packages/create-monokle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "create-monokle-plugin", - "version": "0.3.1", + "version": "0.4.0", "type": "module", "license": "MIT", "author": "Kubeshop", @@ -9,7 +9,7 @@ }, "files": [ "index.js", - "template-*" + "templates/**/*" ], "main": "index.js", "engines": { diff --git a/packages/create-monokle-plugin/template-validation-ts/README.md b/packages/create-monokle-plugin/template-validation-ts/README.md deleted file mode 100644 index 41397b638..000000000 --- a/packages/create-monokle-plugin/template-validation-ts/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Monokle custom validator - -Welcome to Monokle custom validation plugin. - -Developing a plugin has is build with developer experience in mind and has a short feedback loop. Read more below. - -## Development - -To start development you should enable the development server with `npm run dev`. - -Afterwards you can open [app.monokle.com](https://app.monokle.com) and open the validation pane in your favourite repository. A new validator labelled "development" will appear. - -You can now start editing code, the development server will automatically pick up code changes and forward it to the browser where Hot Module Replacement will give you the latest version of your code in real-time. You can play around with any of the resources in your project to make sure you got the validation right. - -### Generating type guard for CRDs - -The main use case for custom validators are adding validation to your custom resource definitions. To improve the developer experience, our tooling includes a small utility to generate types and type guards from CustomResourceDefinition resources. - -Simply drop your YAML file that defines the CRD into the _src/crds_ directory and run `npm run codegen` or `npm install` (it runs on a post-install hook as well). - -Example usage: - -```typescript -defineRule({ - validate({ resources } { - resources - .filter(r => isPrometheus(r.content)) - .forEach(prometheus => { - prometheus.content.spec; // this is now a fully typed object. - }) - } -}) -``` - -## Distribution - -Simply create a pull request to monokle-community-plugins and our pipelines will take care of everything! diff --git a/packages/create-monokle-plugin/template-validation-ts/src/plugin.ts b/packages/create-monokle-plugin/template-validation-ts/src/plugin.ts deleted file mode 100644 index bef3f8d64..000000000 --- a/packages/create-monokle-plugin/template-validation-ts/src/plugin.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { definePlugin } from "@monokle/plugin-toolkit"; -import { noEmptyAnnotations } from "./rules/1-example.js"; -import { noAdminApi } from "./rules/3-exampleCrd.js"; -import { noPortMismatch } from "./rules/2-exampleRelated.js"; -import { noLatestImage } from "./rules/4-examplePod.js"; - -export default definePlugin({ - id: "YCP", - name: "Your custom plugin", - description: "Welcome to your first plugin!", - rules: { - noEmptyAnnotations, - noPortMismatch, - noAdminApi, - noLatestImage, - }, -}); diff --git a/packages/create-monokle-plugin/template-validation-ts/src/rules/2-exampleRelated.ts b/packages/create-monokle-plugin/template-validation-ts/src/rules/2-exampleRelated.ts deleted file mode 100644 index 7538aaf90..000000000 --- a/packages/create-monokle-plugin/template-validation-ts/src/rules/2-exampleRelated.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { defineRule } from "@monokle/plugin-toolkit"; -import { isDeployment } from "../schemas/__generated__/deployment.apps.v1.js"; -import { isService } from "../schemas/__generated__/service.v1.js"; - -/** - * An advanced example which uses related resources - * - * @remark use `npm run codegen` to generate types. - */ -export const noPortMismatch = defineRule({ - id: 2, - description: "The target port should match any container port.", - help: "Change to target port to a port that matching a container's port.", - validate({ resources }, { getRelated, report }) { - resources.filter(isService).forEach((service) => { - const deployments = getRelated(service).filter(isDeployment); - - const validPorts = deployments.flatMap((d) => - d.spec?.template.spec?.containers.flatMap((c) => - c.ports?.flatMap((p) => p.containerPort) - ) - ); - - const servicePorts = service.spec?.ports ?? []; - servicePorts.forEach((port, index: number) => { - if (!validPorts.includes(Number(port.targetPort))) { - report(service, { path: `spec.ports.${index}.targetPort` }); - } - }); - }); - }, -}); diff --git a/packages/create-monokle-plugin/template-validation-ts/src/rules/4-examplePod.ts b/packages/create-monokle-plugin/template-validation-ts/src/rules/4-examplePod.ts deleted file mode 100644 index eb6ea191b..000000000 --- a/packages/create-monokle-plugin/template-validation-ts/src/rules/4-examplePod.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { defineRule } from "@monokle/plugin-toolkit"; -import { validatePodSpec } from "../utils.js"; - -/** - * Example validation of pod in depoyment, statefulset, job, etc. - * - * @remark use `npm run codegen` to build the types - */ -export const noLatestImage = defineRule({ - id: 4, - description: "Disallow images with the latest tag.", - fullDescription: - "The latest image makes it difficult to know which version is exactly running which might introduce subtle bugs or run a version that is vulnerable.", - help: "Pin the exact version of the image.", - validate({ resources }, { report }) { - validatePodSpec(resources, (resource, pod, prefix) => { - pod.initContainers?.forEach((container, index) => { - const valid = !container.image?.endsWith("latest"); - if (valid) return; - - report(resource, { - path: `${prefix}.initContainers.${index}.image`, - }); - }); - - pod.containers.forEach((container, index) => { - const valid = !container.image?.endsWith("latest"); - if (valid) return; - - report(resource, { - path: `${prefix}.containers.${index}.image`, - }); - }); - }); - }, -}); diff --git a/packages/create-monokle-plugin/template-validation-ts/src/utils.ts b/packages/create-monokle-plugin/template-validation-ts/src/utils.ts deleted file mode 100644 index ee7b70d7e..000000000 --- a/packages/create-monokle-plugin/template-validation-ts/src/utils.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { PodSpec } from "kubernetes-types/core/v1.js"; -import { isCronJob } from "./schemas/__generated__/cronjob.batch.v1.js"; -import { isDaemonSet } from "./schemas/__generated__/daemonset.apps.v1.js"; -import { isDeployment } from "./schemas/__generated__/deployment.apps.v1.js"; -import { isJob } from "./schemas/__generated__/job.batch.v1.js"; -import { isPod } from "./schemas/__generated__/pod.v1.js"; -import { isStatefulSet } from "./schemas/__generated__/statefulset.apps.v1.js"; - -export function validatePodSpec( - resources: any[], - validateFn: (resource: any, pod: PodSpec, prefix: string) => void -): void { - resources.forEach((resource) => { - if ( - isDeployment(resource) || - isStatefulSet(resource) || - isDaemonSet(resource) || - isJob(resource) - ) { - const pod = resource.spec?.template.spec; - if (!pod) return; - return validateFn(resource, pod, "spec.template.spec"); - } - - if (isCronJob(resource)) { - const pod = resource.spec?.jobTemplate.spec?.template.spec; - if (!pod) return; - return validateFn(resource, pod, "spec.jobTemplate.spec.template.spec"); - } - - if (isPod(resource)) { - const pod = resource.spec; - if (!pod) return; - return validateFn(resource, pod, "spec"); - } - }); -} diff --git a/packages/create-monokle-plugin/templates/validation-ts/basic-template/README.md b/packages/create-monokle-plugin/templates/validation-ts/basic-template/README.md new file mode 100644 index 000000000..d70d45b55 --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/basic-template/README.md @@ -0,0 +1,56 @@ +# Monokle Custom Validator + +Welcome to your Monokle custom validation plugin! + +Follow these steps to get going: + +- Update the generated `src/plugin.ts` file with correct metadata ([read more](#plugin-metadata)) +- Implement your rule(s) in the `src/rules` folder and make sure to add them to the `src/plugin.ts` file +- Optionally use Monokle Cloud to test your plugin ([see below](#local-development-with-monokle-cloud)) +- If you want to share your plugin with the community, fork and add it to the [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) + repository, and open a PR back to the repository for us to review and merge. +- Update this README as desired (if you plan to share the code/repo containing it). + +## Tips & Tricks + +### Local Development with Monokle Cloud + +To enable direct testing/debugging of your validators with Monokle Cloud, run + +``` +npm run dev +``` + +which will start a local development server that Monokle Cloud can connect to: + +- Open [app.monokle.com](https://app.monokle.com) and open the validation pane in your favourite repository. +- Enabled "Development Mode" at the bottom of the pane +- A new validator labelled "development" will appear. + +You can now start editing code; the local development server will automatically pick up code changes and forward +them to the browser where Hot Module Replacement will give you the latest version of your code in real-time. +You can play around with any of the resources in your project to make sure you got the validation right. + +### Generate Resources + +Put any CRDs you might want to use/validation in the `src/schemas/crds` folder (in JSON format) and run + +``` +npm run codegen +``` + +This will generate utility methods and types for each CRD into the `src/schemas/__generated__` folder, for you +to import/use in your validators. + +### Packaging + +To package your plugin into a single `plugin.js` file, run + +``` +npm run build +``` + +which will create a `dist/plugin.js` file in your repo. + +> NOTE: We will do all packaging/deployment for you if you submit your plugin to +the [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repository. diff --git a/packages/create-monokle-plugin/template-validation-ts/_gitignore b/packages/create-monokle-plugin/templates/validation-ts/basic-template/_gitignore similarity index 100% rename from packages/create-monokle-plugin/template-validation-ts/_gitignore rename to packages/create-monokle-plugin/templates/validation-ts/basic-template/_gitignore diff --git a/packages/create-monokle-plugin/template-validation-ts/package-lock.json b/packages/create-monokle-plugin/templates/validation-ts/basic-template/package-lock.json similarity index 99% rename from packages/create-monokle-plugin/template-validation-ts/package-lock.json rename to packages/create-monokle-plugin/templates/validation-ts/basic-template/package-lock.json index 30059a7f9..aa7b8732c 100644 --- a/packages/create-monokle-plugin/template-validation-ts/package-lock.json +++ b/packages/create-monokle-plugin/templates/validation-ts/basic-template/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@monokle/plugin-toolkit": "0.1.0" + "@monokle/plugin-toolkit": "^0.1.0" } }, "node_modules/@babel/code-frame": { diff --git a/packages/create-monokle-plugin/template-validation-ts/package.json b/packages/create-monokle-plugin/templates/validation-ts/basic-template/package.json similarity index 100% rename from packages/create-monokle-plugin/template-validation-ts/package.json rename to packages/create-monokle-plugin/templates/validation-ts/basic-template/package.json diff --git a/packages/create-monokle-plugin/templates/validation-ts/basic-template/src/plugin.ts b/packages/create-monokle-plugin/templates/validation-ts/basic-template/src/plugin.ts new file mode 100644 index 000000000..d508625a0 --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/basic-template/src/plugin.ts @@ -0,0 +1,12 @@ +import { definePlugin } from "@monokle/plugin-toolkit"; +import { noEmptyAnnotations } from "./rules/1-example.js"; + +export default definePlugin({ + id: "YCP", + name: "ycp", + displayName: "Your custom plugin", + description: "Welcome to your first plugin!", + rules: { + noEmptyAnnotations + }, +}); diff --git a/packages/create-monokle-plugin/template-validation-ts/src/rules/1-example.ts b/packages/create-monokle-plugin/templates/validation-ts/basic-template/src/rules/1-example.ts similarity index 90% rename from packages/create-monokle-plugin/template-validation-ts/src/rules/1-example.ts rename to packages/create-monokle-plugin/templates/validation-ts/basic-template/src/rules/1-example.ts index 9fca72dea..2acb1723f 100644 --- a/packages/create-monokle-plugin/template-validation-ts/src/rules/1-example.ts +++ b/packages/create-monokle-plugin/templates/validation-ts/basic-template/src/rules/1-example.ts @@ -1,7 +1,7 @@ import { defineRule } from "@monokle/plugin-toolkit"; /** - * A basic example. + * A basic example that checks if a resource has annotations */ export const noEmptyAnnotations = defineRule({ id: 1, diff --git a/packages/create-monokle-plugin/template-validation-ts/tsconfig.json b/packages/create-monokle-plugin/templates/validation-ts/basic-template/tsconfig.json similarity index 94% rename from packages/create-monokle-plugin/template-validation-ts/tsconfig.json rename to packages/create-monokle-plugin/templates/validation-ts/basic-template/tsconfig.json index 7cc6b644d..7512bbe16 100644 --- a/packages/create-monokle-plugin/template-validation-ts/tsconfig.json +++ b/packages/create-monokle-plugin/templates/validation-ts/basic-template/tsconfig.json @@ -16,5 +16,7 @@ "removeComments": false, "strict": true }, - "include": ["src"] + "include": [ + "src" + ] } diff --git a/packages/create-monokle-plugin/templates/validation-ts/crd-template/README.md b/packages/create-monokle-plugin/templates/validation-ts/crd-template/README.md new file mode 100644 index 000000000..39d910073 --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/crd-template/README.md @@ -0,0 +1,56 @@ +# Monokle Custom Validator + +Welcome to your Monokle custom validation plugin! + +Follow these steps to get going: + +- Update the generated `src/plugin.ts` file with correct metadata ([read more](#plugin-metadata)) +- Implement your rule(s) in the `src/rules` folder and make sure to add them to the `src/plugin.ts` file +- Optionally use Monokle Cloud to test your plugin ([see below](#local-development-with-monokle-cloud)) +- If you want to share your plugin with the community, fork and add it to the [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) + repository, and open a PR back to the repository for us to review and merge. +- Update this README as desired (if you plan to share the code/repo containing it). + +## Tips & Tricks + +### Local Development with Monokle Cloud + +To enable direct testing/debugging of your validators with Monokle Cloud, run + +``` +npm run dev +``` + +which will start a local development server that Monokle Cloud can connect to: + +- Open [app.monokle.com](https://app.monokle.com) and open the validation pane in your favourite repository. +- Enabled "Development Mode" at the bottom of the pane +- A new validator labelled "development" will appear. + +You can now start editing code; the local development server will automatically pick up code changes and forward +them to the browser where Hot Module Replacement will give you the latest version of your code in real-time. +You can play around with any of the resources in your project to make sure you got the validation right. + +### Generate Resources + +Put any CRDs you might want to use/validation in the `src/schemas/crds` folder (in JSON format) and run + +``` +npm run codegen +``` + +This will generate utility methods and types for each CRD into the `src/schemas/__generated__` folder, for you +to import/use in your validators. + +### Packaging + +To package your plugin into a single `plugin.js` file, run + +``` +npm run build +``` + +which will create a `dist/plugin.js` file in your repo. + +> NOTE: We will do all packaging/deployment for you if you submit your plugin to +the [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repository. diff --git a/packages/create-monokle-plugin/templates/validation-ts/crd-template/_gitignore b/packages/create-monokle-plugin/templates/validation-ts/crd-template/_gitignore new file mode 100644 index 000000000..3c47fb2c6 --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/crd-template/_gitignore @@ -0,0 +1,5 @@ +.DS_Store +build +dist +node_modules +**/__generated__/** diff --git a/packages/create-monokle-plugin/templates/validation-ts/crd-template/package-lock.json b/packages/create-monokle-plugin/templates/validation-ts/crd-template/package-lock.json new file mode 100644 index 000000000..aa7b8732c --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/crd-template/package-lock.json @@ -0,0 +1,2839 @@ +{ + "name": "monokle-custom-validator", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "monokle-custom-validator", + "version": "1.0.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@monokle/plugin-toolkit": "^0.1.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcherny/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-vmEmnJCfpkLdas++9OYg6riIezTYqTHpqUTODJzHLzs5UnXujbOJW9VwcVCnyo1mVRt32FRr23iXBx/sX8YbeQ==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@monokle/plugin-toolkit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@monokle/plugin-toolkit/-/plugin-toolkit-0.1.0.tgz", + "integrity": "sha512-ok8pwnPAOmX81MKt6yC5t6GuUnlHDMxMJ2wmf/4MkTj8mrIfS02y2+g/kb1va1/iT/Kb9cI1npkKj1bQ9ZlB1g==", + "dependencies": { + "@monokle/validation": "*", + "@rollup/plugin-json": "5.0.1", + "@rollup/plugin-node-resolve": "15.0.1", + "@rollup/plugin-typescript": "8.5.0", + "@types/connect": "3.4.35", + "@types/fs-extra": "9.0.13", + "@types/klaw-sync": "6.0.1", + "cac": "6.7.14", + "connect": "3.7.0", + "fs-extra": "10.1.0", + "json-schema-to-typescript": "11.0.2", + "klaw-sync": "6.0.0", + "kubernetes-types": "1.25.0", + "picocolors": "1.0.0", + "rollup": "3.2.3", + "rollup-plugin-terser": "7.0.2", + "tslib": "2.4.1", + "typescript": "4.8.4", + "yaml": "2.1.3" + }, + "bin": { + "monokle-plugin-toolkit": "dist/cli/main.cjs" + } + }, + "node_modules/@monokle/plugin-toolkit/node_modules/rollup": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.3.tgz", + "integrity": "sha512-qfadtkY5kl0F5e4dXVdj2D+GtOdifasXHFMiL1SMf9ADQDv5Eti6xReef9FKj+iQPR2pvtqWna57s/PjARY4fg==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@monokle/validation": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@monokle/validation/-/validation-0.9.1.tgz", + "integrity": "sha512-sd2FvdpVu6TxyS6Wypfhk9xFryDEFhFcXfOayBXpi9AQhKveTVhOtsaddjk1gE17Sgu9qUrxgbSwpIf4gszpFA==", + "dependencies": { + "@open-policy-agent/opa-wasm": "1.8.0", + "ajv": "6.12.6", + "change-case": "4.1.2", + "isomorphic-fetch": "3.0.0", + "lodash": "4.17.21", + "tiny-invariant": "1.2.0", + "yaml": "2.1.1", + "zod": "3.19.1" + } + }, + "node_modules/@monokle/validation/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@monokle/validation/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@monokle/validation/node_modules/yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@open-policy-agent/opa-wasm": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@open-policy-agent/opa-wasm/-/opa-wasm-1.8.0.tgz", + "integrity": "sha512-IFXh52ndKH5iWsB5ysWpjDxLtA5nUCMgalV7gbzW9VfjyDvu7Iq3G3wz3cXYtK1VWa94EeYi8oIrTrzzg33szQ==", + "dependencies": { + "sprintf-js": "^1.1.2", + "yaml": "^1.10.2" + } + }, + "node_modules/@open-policy-agent/opa-wasm/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-5.0.1.tgz", + "integrity": "sha512-QCwhZZLvM8nRcTHyR1vOgyTMiAnjiNj1ebD/BMRvbO1oc/z14lZH6PfxXeegee2B6mky/u9fia4fxRM4TqrUaw==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", + "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.0", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz", + "integrity": "sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-typescript/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@rollup/plugin-typescript/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/klaw-sync": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/klaw-sync/-/klaw-sync-6.0.1.tgz", + "integrity": "sha512-hqWJe0mMSxC5fiQjCJzziko2Xxh2HjDAPZNk7Zwv+Uo56XlViXR6p1RzjUCQvFvLd+IXEGeyVHTaAibrbyU1Rw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.188", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz", + "integrity": "sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "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==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", + "dependencies": { + "@types/glob": "^7.1.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^7.1.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-to-typescript": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-11.0.2.tgz", + "integrity": "sha512-XRyeXBJeo/IH4eTP5D1ptX78vCvH86nMDt2k3AxO28C3uYWEDmy4mgPyMpb8bLJ/pJMElOGuQbnKR5Y6NSh3QQ==", + "dependencies": { + "@bcherny/json-schema-ref-parser": "9.0.9", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.6.2" + }, + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kubernetes-types": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.25.0.tgz", + "integrity": "sha512-PVbOhw7Rd6yRLjvkaN/agqDLjEq9iwUPTvO+lrYVlcWyC2/Qm9grHL1O8oNTPFisuSamdYdTxtSpmmaKKO6VGg==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/zod": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", + "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@bcherny/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-vmEmnJCfpkLdas++9OYg6riIezTYqTHpqUTODJzHLzs5UnXujbOJW9VwcVCnyo1mVRt32FRr23iXBx/sX8YbeQ==", + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "@monokle/plugin-toolkit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@monokle/plugin-toolkit/-/plugin-toolkit-0.1.0.tgz", + "integrity": "sha512-ok8pwnPAOmX81MKt6yC5t6GuUnlHDMxMJ2wmf/4MkTj8mrIfS02y2+g/kb1va1/iT/Kb9cI1npkKj1bQ9ZlB1g==", + "requires": { + "@monokle/validation": "*", + "@rollup/plugin-json": "5.0.1", + "@rollup/plugin-node-resolve": "15.0.1", + "@rollup/plugin-typescript": "8.5.0", + "@types/connect": "3.4.35", + "@types/fs-extra": "9.0.13", + "@types/klaw-sync": "6.0.1", + "cac": "6.7.14", + "connect": "3.7.0", + "fs-extra": "10.1.0", + "json-schema-to-typescript": "11.0.2", + "klaw-sync": "6.0.0", + "kubernetes-types": "1.25.0", + "picocolors": "1.0.0", + "rollup": "3.2.3", + "rollup-plugin-terser": "7.0.2", + "tslib": "2.4.1", + "typescript": "4.8.4", + "yaml": "2.1.3" + }, + "dependencies": { + "rollup": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.2.3.tgz", + "integrity": "sha512-qfadtkY5kl0F5e4dXVdj2D+GtOdifasXHFMiL1SMf9ADQDv5Eti6xReef9FKj+iQPR2pvtqWna57s/PjARY4fg==", + "requires": { + "fsevents": "~2.3.2" + } + } + } + }, + "@monokle/validation": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@monokle/validation/-/validation-0.9.1.tgz", + "integrity": "sha512-sd2FvdpVu6TxyS6Wypfhk9xFryDEFhFcXfOayBXpi9AQhKveTVhOtsaddjk1gE17Sgu9qUrxgbSwpIf4gszpFA==", + "requires": { + "@open-policy-agent/opa-wasm": "1.8.0", + "ajv": "6.12.6", + "change-case": "4.1.2", + "isomorphic-fetch": "3.0.0", + "lodash": "4.17.21", + "tiny-invariant": "1.2.0", + "yaml": "2.1.1", + "zod": "3.19.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==" + } + } + }, + "@open-policy-agent/opa-wasm": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@open-policy-agent/opa-wasm/-/opa-wasm-1.8.0.tgz", + "integrity": "sha512-IFXh52ndKH5iWsB5ysWpjDxLtA5nUCMgalV7gbzW9VfjyDvu7Iq3G3wz3cXYtK1VWa94EeYi8oIrTrzzg33szQ==", + "requires": { + "sprintf-js": "^1.1.2", + "yaml": "^1.10.2" + }, + "dependencies": { + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + } + } + }, + "@rollup/plugin-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-5.0.1.tgz", + "integrity": "sha512-QCwhZZLvM8nRcTHyR1vOgyTMiAnjiNj1ebD/BMRvbO1oc/z14lZH6PfxXeegee2B6mky/u9fia4fxRM4TqrUaw==", + "requires": { + "@rollup/pluginutils": "^5.0.1" + } + }, + "@rollup/plugin-node-resolve": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", + "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.0", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, + "@rollup/plugin-typescript": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz", + "integrity": "sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + } + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/klaw-sync": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/klaw-sync/-/klaw-sync-6.0.1.tgz", + "integrity": "sha512-hqWJe0mMSxC5fiQjCJzziko2Xxh2HjDAPZNk7Zwv+Uo56XlViXR6p1RzjUCQvFvLd+IXEGeyVHTaAibrbyU1Rw==", + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.188", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz", + "integrity": "sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w==" + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==" + }, + "@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" + }, + "call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "requires": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", + "requires": { + "@types/glob": "^7.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "requires": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "requires": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-to-typescript": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-11.0.2.tgz", + "integrity": "sha512-XRyeXBJeo/IH4eTP5D1ptX78vCvH86nMDt2k3AxO28C3uYWEDmy4mgPyMpb8bLJ/pJMElOGuQbnKR5Y6NSh3QQ==", + "requires": { + "@bcherny/json-schema-ref-parser": "9.0.9", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.6.2" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "kubernetes-types": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.25.0.tgz", + "integrity": "sha512-PVbOhw7Rd6yRLjvkaN/agqDLjEq9iwUPTvO+lrYVlcWyC2/Qm9grHL1O8oNTPFisuSamdYdTxtSpmmaKKO6VGg==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "peer": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "terser": { + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==" + }, + "zod": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", + "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==" + } + } +} diff --git a/packages/create-monokle-plugin/templates/validation-ts/crd-template/package.json b/packages/create-monokle-plugin/templates/validation-ts/crd-template/package.json new file mode 100644 index 000000000..18d0b8b6a --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/crd-template/package.json @@ -0,0 +1,19 @@ +{ + "name": "monokle-custom-validator", + "author": "unknown", + "description": "Validates with custom rules.", + "license": "MIT", + "version": "1.0.0", + "main": "dist/plugin.js", + "type": "module", + "scripts": { + "postinstall": "npm run codegen", + "codegen": "monokle-plugin-toolkit codegen", + "dev": "monokle-plugin-toolkit dev", + "build": "monokle-plugin-toolkit build", + "debug": "monokle-plugin-toolkit build --debug" + }, + "dependencies": { + "@monokle/plugin-toolkit": "^0.1.0" + } +} diff --git a/packages/create-monokle-plugin/templates/validation-ts/crd-template/src/plugin.ts b/packages/create-monokle-plugin/templates/validation-ts/crd-template/src/plugin.ts new file mode 100644 index 000000000..9ca6809e0 --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/crd-template/src/plugin.ts @@ -0,0 +1,12 @@ +import { definePlugin } from "@monokle/plugin-toolkit"; +import { noAdminApi } from "./rules/1-exampleCrd.js"; + +export default definePlugin({ + id: "YCP", + name: "ycp", + displayName: "Sample CRD plugin", + description: "Welcome to your first plugin!", + rules: { + noAdminApi, + }, +}); diff --git a/packages/create-monokle-plugin/template-validation-ts/src/rules/3-exampleCrd.ts b/packages/create-monokle-plugin/templates/validation-ts/crd-template/src/rules/1-exampleCrd.ts similarity index 98% rename from packages/create-monokle-plugin/template-validation-ts/src/rules/3-exampleCrd.ts rename to packages/create-monokle-plugin/templates/validation-ts/crd-template/src/rules/1-exampleCrd.ts index 74b776547..c56f283f5 100644 --- a/packages/create-monokle-plugin/template-validation-ts/src/rules/3-exampleCrd.ts +++ b/packages/create-monokle-plugin/templates/validation-ts/crd-template/src/rules/1-exampleCrd.ts @@ -7,7 +7,7 @@ import { isPrometheus } from "../schemas/__generated__/prometheus.monitoring.cor * @remark use `npm run codegen` to build the types */ export const noAdminApi = defineRule({ - id: 3, + id: 1, description: "Disallow the admin API for Prometheus instances.", help: "Do not set enabledAdminAPI to true.", validate({ resources }, { report }) { diff --git a/packages/create-monokle-plugin/template-validation-ts/src/schemas/crds/prometheus.yaml b/packages/create-monokle-plugin/templates/validation-ts/crd-template/src/schemas/crds/prometheus.yaml similarity index 100% rename from packages/create-monokle-plugin/template-validation-ts/src/schemas/crds/prometheus.yaml rename to packages/create-monokle-plugin/templates/validation-ts/crd-template/src/schemas/crds/prometheus.yaml diff --git a/packages/create-monokle-plugin/templates/validation-ts/crd-template/tsconfig.json b/packages/create-monokle-plugin/templates/validation-ts/crd-template/tsconfig.json new file mode 100644 index 000000000..7512bbe16 --- /dev/null +++ b/packages/create-monokle-plugin/templates/validation-ts/crd-template/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "rootDir": "src", + "outDir": "build", + "lib": ["ESNext", "DOM"], + "module": "ESNext", + "target": "ESNext", + "moduleResolution": "NodeNext", + "allowSyntheticDefaultImports": true, + "declaration": false, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "pretty": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "removeComments": false, + "strict": true + }, + "include": [ + "src" + ] +} diff --git a/packages/validation/README.md b/packages/validation/README.md index 5794e7358..76574c2f1 100644 --- a/packages/validation/README.md +++ b/packages/validation/README.md @@ -16,53 +16,53 @@ Extensible, static Kubernetes analysis Monokle Validation is a TypeScript library to validate your Kubernetes resources. -**Key features** +### Key features - 🚀 Start in seconds with the user-friendly configuration. - ⚡️ Real-time validation through incremental runs. - ⚒ Extensible architecture with plugins. -**Core plugins** +### Core plugins - YAML Syntax validates that your manifests have correct YAML syntax. - Kubernetes Schema validates that your resources and CRDs are well-defined in the schema for their resource kind. - Resource links validates that reference to other Kubernetes resources are valid. - Open Policy agent validates security policies to reduce your attack surface. -**Community Plugins** +Learn more about each Core Plugin in the [Core Plugins Documentation](docs/core-plugins.md) + +### Community Plugins Check out our [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repo for plugins contributed by our community, and details on how to create your own. -**Try the CLI or Monokle Cloud now!** +### Try the CLI or Monokle Cloud now! -The [Monokle CLI](https://github.com/kubeshop/monokle-core/tree/update-readme/packages/cli) provides a convenient +The [Monokle CLI](https://github.com/kubeshop/monokle-core/tree/main/packages/cli) provides a convenient wrapper around this library. Use it to validate your resources in seconds: ```bash kustomize build . | monokle validate - ``` -Or [visit Monokle Cloud](https://app.monokle.com); a free web application where you can apply this validation +Or visit [Monokle Cloud](https://app.monokle.com); a free web application where you can apply this validation library directly on public GitHub repositories. ## Table of contents -- [Welcome to Monokle Validation](#welcome-to-monokle-validation) -- [Table of contents](#table-of-contents) - [Getting started](#getting-started) - [Configuration](#configuration) - [The validation response](#the-validation-response) - [Advanced usage](#advanced-usage) - [Preloading](#preloading) - [Incremental validation](#incremental-validation) - - [Community plugins](#community-plugins) + - [Community plugins](#using-community-plugins) - [Building user interfaces](#building-user-interfaces) - [Caveats](#caveats) ## Getting started -First install the validator: +First install the validator with npm: ``` npm install @monokle/validation @@ -75,8 +75,8 @@ const validator = createDefaultMonokleValidator(); await validator.validate({ resources: RESOURCES }); ``` -Monokle is extensible and has a rich plugin system. -You can configure and preload plugins as follows: +The Monokle validator is extensible and has a rich plugin system. You can configure and preload +plugins as follows: ```typescript const validator = createDefaultMonokleValidator(); @@ -94,8 +94,6 @@ await validator.validate({ resources }); You can customize the rules and settings of the Monokle Validator through an intuitive object. -[Learn more](https://github.com/kubeshop/monokle-core/blob/update-readme/packages/validation/docs/configuration.md) - ```yaml plugins: yaml-syntax: true @@ -110,6 +108,8 @@ settings: schemaVersion: v1.24.2 ``` +[Learn more](https://github.com/kubeshop/monokle-core/blob/main/packages/validation/docs/configuration.md) + ## The validation response The response uses [Static Analysis Results Interchange Format (SARIF)](https://docs.oasis-open.org/sarif/sarif/v2.1.0/csprd01/sarif-v2.1.0-csprd01.html). @@ -179,9 +179,11 @@ SARIF contains both metadata of the tool and the results of the validation. You ### Preloading -The plugins have to be initialized which might require heavy operations such as fetching large JSON schemas, AJV compilation, WASM initialization and more. +Each validation plugin has to be initialized which might require heavy operations such as fetching large +JSON schemas, AJV compilation, WASM initialization and more. -The `preload` API avoids a long first validation and is recommended in more interactive environments. It is idempotent so you can call it as often as you want without continuously reinstantiating the plugins. +The `preload` API avoids a long first validation and is recommended in more interactive environments. +It is idempotent so you can call it as often as you want without continuously reinstantiating the plugins. Example: @@ -217,7 +219,7 @@ await validator.validate({ await validator.clear(); ``` -### Community plugins +### Using Community plugins The Monokle Validator allows you to add custom plugins from [our community repository](https://github.com/kubeshop/monokle-community-plugins). All community plugins are thoroughly reviewed and we take care of loading the plugins for you. diff --git a/packages/validation/docs/configuration.md b/packages/validation/docs/configuration.md index a77744372..985bd2d68 100644 --- a/packages/validation/docs/configuration.md +++ b/packages/validation/docs/configuration.md @@ -1,22 +1,7 @@ -

- Monokle Logo -

+## Monokle Validation configuration -

-Shared configuration for consistent validation -

- -

- - - -

- -## Welcome to Monokle Validation configuration - -Our validator uses a shared configuration file. - -It gives a consistent experience no matter if you validate from the CLI, GitHub Action or either of our applications (desktop & web). +The monokle validator uses a shared configuration file providing a consistent experience no +matter if you validate from the CLI, GitHub Action or either of our applications (desktop & web). The configuration format is heavily inspired by ESLint and aims to be flexible and configurable for your use case. You can turn off every rule and run only with basic syntax validation or mix and match the bundled rules and your custom rules to fit the needs of your project. @@ -38,10 +23,8 @@ settings: schemaVersion: v1.24.2 ``` -## Table of content +## Table of contents -- [Welcome to Monokle Validation configuration](#welcome-to-monokle-validation-configuration) -- [Table of content](#table-of-content) - [Usage](#usage) - [Create your configuration file](#create-your-configuration-file) - [Enable/disable a plugin](#enabledisable-a-plugin) @@ -71,6 +54,9 @@ plugins: open-policy-agent: false ``` +Any additional plugins found in a `.monokle-plugins` folder below the cwd of where you are running the validator/CLI and +it will be available to configure and use as described under + ### Enable/disable a rule A `boolean` indicates whether the rule is enabled or disabled. @@ -106,148 +92,3 @@ settings: Below you can find an overview of all the plugins with their available settings. -## Core plugins - -There are four cores plugins: - -- Open Policy agent -- Kubernetes Schema -- Resource links -- YAML Syntax - -By default plugins are enabled and all rules are enabled as a warning. - -### Open Policy Agent - -A collection of security rules. - -Under the hood it compiles Rego policies into a WebAssembly module that handles the validation. A big shout out to the DefSec team at [Aqua Security](https://www.aquasec.com/) as full credit for these rules goes to them. You can find the source of their Rego policies [here](https://github.com/aquasecurity/defsec). - -There are no settings for this plugin. - -```yaml -plugins: - open-policy-agent: true -``` - -**Rules** - -| id | name | description | -| ------ | ------------------------------------------- | ------------------------------------------------------- | -| KSV001 | open-policy-agent/no-elevated-process | Disallow the process from elevating its privileges. | -| KSV002 | open-policy-agent/app-armor | Require a default AppArmor profile | -| KSV003 | open-policy-agent/drop-capabilities | Require default capabilities to be dropped | -| KSV005 | open-policy-agent/no-sys-admin | Disallow the SYS_ADMIN capability | -| KSV006 | open-policy-agent/no-mounted-docker-sock | Disallow mounteing the hostPath volume with docker.sock | -| KSV008 | open-policy-agent/no-host-ipc | Disallow access to host IPC namespace | -| KSV009 | open-policy-agent/no-host-network | Disallow access to host network | -| KSV010 | open-policy-agent/no-host-pid | Disallow access to host PID | -| KSV011 | open-policy-agent/cpu-limit | Require the CPU to be limited | -| KSV012 | open-policy-agent/run-as-non-root | Requires the container to runs as non root user | -| KSV013 | open-policy-agent/no-latest-image | Disallow images with the latest tag | -| KSV014 | open-policy-agent/no-writable-fs | Require a read-only root file system | -| KSV015 | open-policy-agent/cpu-request | Require the CPU to be requested | -| KSV016 | open-policy-agent/memory-request | Require the memory to be requested | -| KSV017 | open-policy-agent/no-privileged | Disallow the use of privileged containers | -| KSV018 | open-policy-agent/memory-limit | Require the memory to be limited | -| KSV020 | open-policy-agent/no-low-user-id | Disallow running with a low user ID | -| KSV021 | open-policy-agent/no-low-group-id | Disallow running with a low group ID | -| KSV023 | open-policy-agent/no-host-mounted-path | Disallow mounting hostPath volumes | -| KSV024 | open-policy-agent/no-host-port-access | Disallow accessing the host ports | -| KSV025 | open-policy-agent/no-selinux | Disallow custom SELinux options | -| KSV027 | open-policy-agent/no-proc-mount | Disallow setting proc masks | -| KSV028 | open-policy-agent/no-non-emphemeral-volumes | Disallow use of non-ephemeral volume types | -| KSV029 | open-policy-agent/no-root-group | Disallow setting runAsGroup to zero. | -| KSV030 | open-policy-agent/seccomp-profile | Require a Seccomp profile | - -### Kubernetes Schema - -Validates whether the Kubernetes resources comply with a JSON schema. - -There are no settings for this plugin. - -```yaml -plugins: - kubernetes-schema: true -settings: - kubernetes-schema: - schemaVersion: "v1.25.1" -``` - -| name | description | default | -| ------------- | ------------------------------------ | --------- | -| schemaVersion | The version of the Kubernetes schema | "v1.24.2" | - -**Rules** - -| id | name | description | -| ------ | --------------------------------- | -------------------------------------- | -| K8S001 | kubernetes-schema/schema-violated | The resource is formatted incorrectly. | - -### Resource Links - -Validates whether links/references between resources are valid - i.e. if the target -object exists or not. - -This plugin has two rules; one for standard link validation, and another -for optional link validation (disabled by default) - -For example - the configMapKeyRef below is set as optional; if the target -configMap does not exist this would be ignored by the validator, unless the -LNK002 rule is enabled. - -```yaml - env: - - name: SOME_VALUE - valueFrom: - configMapKeyRef: - name: some-configmap-name - key: some-key - optional: true -``` - -**Rules** - -| id | name | description | -|--------|------------------------------------------|----------------------------------| -| LNK001 | resource-links/no-missing-links | Disallow missing links. | -| LNK002 | resource-links/no-missing-optional-links | Disallow missing optional links. | - -### YAML Syntax - -Validate whether the resource uses proper YAML syntax. - -There are no settings for this plugin. - -```yaml -plugins: - yaml-syntax: true -``` - -**Rules** - -Generally you either want all of these to be enabled or disabled. - -| id | name | description | -| ------ | ------------------------------------- | --------------------------------------------- | -| YML001 | yaml-syntax/alias-props | The alias props are incorrect. | -| YML002 | yaml-syntax/no-bad-alias | The alias' format is incorrect. | -| YML003 | yaml-syntax/no-bad-directive | The directive is incorrect. | -| YML004 | yaml-syntax/no-bad-dq-escape | The double quotes are escaped incorrectly. | -| YML005 | yaml-syntax/no-bad-indent | The indentation is incorrect. | -| YML006 | yaml-syntax/no-bad-prop-order | The anchors and tags are used incorrectly. | -| YML007 | yaml-syntax/no-bad-scalar-start | The scalar is formatted incorrectly. | -| YML008 | yaml-syntax/no-block-as-implicit-key | The identation is incorrect. | -| YML009 | yaml-syntax/no-block-in-flow | Cannot use block within flow. | -| YML010 | yaml-syntax/no-duplicate-key | Cannot use duplicate keys. | -| YML011 | yaml-syntax/impossible | Something unexpected went wrong | -| YML012 | yaml-syntax/no-long-key | The key is longer than 1024 characters. | -| YML013 | yaml-syntax/no-missing-anchor | The anchor is missing. | -| YML014 | yaml-syntax/no-missing-char | A character is missing. | -| YML015 | yaml-syntax/no-multiline-implicit-key | Cannot use multiple lines with implicit keys. | -| YML016 | yaml-syntax/no-multiple-anchors | Cannot have multiple anchors. | -| YML017 | yaml-syntax/no-multiple-docs | Cannot parse this document. | -| YML018 | yaml-syntax/no-multiple-tags | Cannot use multiple tags. | -| YML019 | yaml-syntax/no-tab-as-indent | Cannot use tabs for identation. | -| YML020 | yaml-syntax/no-failed-tag-resolve | Cannot resolve the tag. | -| YML021 | yaml-syntax/no-unexpected-toke | The token was unexpected. | diff --git a/packages/validation/docs/core-plugins.md b/packages/validation/docs/core-plugins.md new file mode 100644 index 000000000..03f610c04 --- /dev/null +++ b/packages/validation/docs/core-plugins.md @@ -0,0 +1,145 @@ +## Core Validation plugins + +There are four cores plugins: + +- [Open Policy agent](#open-policy-agent) +- [Kubernetes Schema](#kubernetes-schema) +- [Resource links](#resource-links) +- [YAML Syntax](#yaml-syntax) + +All plugins are enabled by default and all rules are enabled as a warning. + +### Open Policy Agent + +A collection of security rules. + +Under the hood it compiles Rego policies into a WebAssembly module that handles the validation. A big shout out to the DefSec team at [Aqua Security](https://www.aquasec.com/) as full credit for these rules goes to them. You can find the source of their Rego policies [here](https://github.com/aquasecurity/defsec). + +There are no settings for this plugin. + +```yaml +plugins: + open-policy-agent: true +``` + +**Rules** + +| id | name | description | +| ------ | ------------------------------------------- | ------------------------------------------------------- | +| KSV001 | open-policy-agent/no-elevated-process | Disallow the process from elevating its privileges. | +| KSV002 | open-policy-agent/app-armor | Require a default AppArmor profile | +| KSV003 | open-policy-agent/drop-capabilities | Require default capabilities to be dropped | +| KSV005 | open-policy-agent/no-sys-admin | Disallow the SYS_ADMIN capability | +| KSV006 | open-policy-agent/no-mounted-docker-sock | Disallow mounteing the hostPath volume with docker.sock | +| KSV008 | open-policy-agent/no-host-ipc | Disallow access to host IPC namespace | +| KSV009 | open-policy-agent/no-host-network | Disallow access to host network | +| KSV010 | open-policy-agent/no-host-pid | Disallow access to host PID | +| KSV011 | open-policy-agent/cpu-limit | Require the CPU to be limited | +| KSV012 | open-policy-agent/run-as-non-root | Requires the container to runs as non root user | +| KSV013 | open-policy-agent/no-latest-image | Disallow images with the latest tag | +| KSV014 | open-policy-agent/no-writable-fs | Require a read-only root file system | +| KSV015 | open-policy-agent/cpu-request | Require the CPU to be requested | +| KSV016 | open-policy-agent/memory-request | Require the memory to be requested | +| KSV017 | open-policy-agent/no-privileged | Disallow the use of privileged containers | +| KSV018 | open-policy-agent/memory-limit | Require the memory to be limited | +| KSV020 | open-policy-agent/no-low-user-id | Disallow running with a low user ID | +| KSV021 | open-policy-agent/no-low-group-id | Disallow running with a low group ID | +| KSV023 | open-policy-agent/no-host-mounted-path | Disallow mounting hostPath volumes | +| KSV024 | open-policy-agent/no-host-port-access | Disallow accessing the host ports | +| KSV025 | open-policy-agent/no-selinux | Disallow custom SELinux options | +| KSV027 | open-policy-agent/no-proc-mount | Disallow setting proc masks | +| KSV028 | open-policy-agent/no-non-emphemeral-volumes | Disallow use of non-ephemeral volume types | +| KSV029 | open-policy-agent/no-root-group | Disallow setting runAsGroup to zero. | +| KSV030 | open-policy-agent/seccomp-profile | Require a Seccomp profile | + +### Kubernetes Schema + +Validates whether the Kubernetes resources comply with a JSON schema. + +There are no settings for this plugin. + +```yaml +plugins: + kubernetes-schema: true +settings: + kubernetes-schema: + schemaVersion: "v1.25.1" +``` + +| name | description | default | +| ------------- | ------------------------------------ | --------- | +| schemaVersion | The version of the Kubernetes schema | "v1.24.2" | + +**Rules** + +| id | name | description | +| ------ | --------------------------------- | -------------------------------------- | +| K8S001 | kubernetes-schema/schema-violated | The resource is formatted incorrectly. | + +### Resource Links + +Validates whether links/references between resources are valid - i.e. if the target +object exists or not. + +This plugin has two rules; one for standard link validation, and another +for optional link validation (disabled by default) + +For example - the configMapKeyRef below is set as optional; if the target +configMap does not exist this would be ignored by the validator, unless the +LNK002 rule is enabled. + +```yaml + env: + - name: SOME_VALUE + valueFrom: + configMapKeyRef: + name: some-configmap-name + key: some-key + optional: true +``` + +**Rules** + +| id | name | description | +|--------|------------------------------------------|----------------------------------| +| LNK001 | resource-links/no-missing-links | Disallow missing links. | +| LNK002 | resource-links/no-missing-optional-links | Disallow missing optional links. | + +### YAML Syntax + +Validate whether the resource uses proper YAML syntax. + +There are no settings for this plugin. + +```yaml +plugins: + yaml-syntax: true +``` + +**Rules** + +Generally you either want all of these to be enabled or disabled. + +| id | name | description | +| ------ | ------------------------------------- | --------------------------------------------- | +| YML001 | yaml-syntax/alias-props | The alias props are incorrect. | +| YML002 | yaml-syntax/no-bad-alias | The alias' format is incorrect. | +| YML003 | yaml-syntax/no-bad-directive | The directive is incorrect. | +| YML004 | yaml-syntax/no-bad-dq-escape | The double quotes are escaped incorrectly. | +| YML005 | yaml-syntax/no-bad-indent | The indentation is incorrect. | +| YML006 | yaml-syntax/no-bad-prop-order | The anchors and tags are used incorrectly. | +| YML007 | yaml-syntax/no-bad-scalar-start | The scalar is formatted incorrectly. | +| YML008 | yaml-syntax/no-block-as-implicit-key | The identation is incorrect. | +| YML009 | yaml-syntax/no-block-in-flow | Cannot use block within flow. | +| YML010 | yaml-syntax/no-duplicate-key | Cannot use duplicate keys. | +| YML011 | yaml-syntax/impossible | Something unexpected went wrong | +| YML012 | yaml-syntax/no-long-key | The key is longer than 1024 characters. | +| YML013 | yaml-syntax/no-missing-anchor | The anchor is missing. | +| YML014 | yaml-syntax/no-missing-char | A character is missing. | +| YML015 | yaml-syntax/no-multiline-implicit-key | Cannot use multiple lines with implicit keys. | +| YML016 | yaml-syntax/no-multiple-anchors | Cannot have multiple anchors. | +| YML017 | yaml-syntax/no-multiple-docs | Cannot parse this document. | +| YML018 | yaml-syntax/no-multiple-tags | Cannot use multiple tags. | +| YML019 | yaml-syntax/no-tab-as-indent | Cannot use tabs for identation. | +| YML020 | yaml-syntax/no-failed-tag-resolve | Cannot resolve the tag. | +| YML021 | yaml-syntax/no-unexpected-toke | The token was unexpected. | diff --git a/packages/validation/docs/custom-plugins.md b/packages/validation/docs/custom-plugins.md new file mode 100644 index 000000000..66cb5a209 --- /dev/null +++ b/packages/validation/docs/custom-plugins.md @@ -0,0 +1,96 @@ +# Custom Validation Plugins + +Monokle Validation plugins can currently be written in typescript and scaffolded using the +[create-monokle-plugin](../create-monokle-plugin) library. + +- [Getting Started](#getting-started) +- Tips & Tricks + - [Local Development with Monokle Cloud](#local-development-with-monokle-cloud) + - [Generate Resources & Typeguards](#generate-resources--typeguards) + - [Packaging](#packaging) + - [Sharing & Distribution](#sharing-and-distribution) + +Also have a look at +- [Plugin Metadata](plugin-metadata.md) to learn more about the metadata a plugin needs to expose +- [Plugin Examples](plugin-examples.md) to see a bunch of examples + +## Getting Started + +Follow these steps to get going with a custom plugin: + +- Use the create-monokle-plugin to scaffold your plugin +- Update the generated `src/plugin.ts` file with correct metadata ([read more](plugin-metadata.md)) +- Implement your rule(s) in the `src/rules` folder and make sure to add them to the `src/plugin.ts` file +- Optionally use Monokle Cloud to test your plugin ([see below](#local-development-with-monokle-cloud)) + +## Tips & Tricks + +### Local Development with Monokle Cloud + +To enable direct testing/debugging of your validators with Monokle Cloud, run + +``` +npm run dev +``` + +which will start a local development server that Monokle Cloud can connect to: + +- Open [app.monokle.com](https://app.monokle.com) and open the validation pane in your favourite repository. +- Enabled "Development Mode" at the bottom of the pane +- A new validator labelled "development" will appear. + +You can now start editing code; the local development server will automatically pick up code changes and forward +them to the browser where Hot Module Replacement will give you the latest version of your code in real-time. +You can play around with any of the resources in your project to make sure you got the validation right. + +### Generate Resources & Typeguards + +Put any CRDs you might want to use/validation in the `src/schemas/crds` folder (in JSON format) and run + +``` +npm run codegen +``` + +This will generate utility methods and types for each CRD into the `src/schemas/__generated__` folder, for you +to import/use in your validators. + +Example usage for code generated for the prometheus CRD: + +```typescript +defineRule({ + validate({ resources } { + resources + .filter(r => isPrometheus(r.content)) + .forEach(prometheus => { + prometheus.content.spec; // this is now a fully typed object. + }) + } +}) +``` + +### Packaging & Usage + +To package your plugin into a single `plugin.js` file, run + +``` +npm run build +``` + +which will create a `dist/plugin.js` file in your repo. + +Put this file in a `.monokle-plugins` folder below the cwd of where you are running the validator/CLI and +it will be available to configure and use as described under + + +### Sharing and Distribution + +If you want to share your plugin with the community, fork and add it to the +[Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) +repository, and open a PR back to the repository for us to review and merge. + + + + + + + diff --git a/packages/validation/docs/plugin-examples.md b/packages/validation/docs/plugin-examples.md new file mode 100644 index 000000000..9e65b2e83 --- /dev/null +++ b/packages/validation/docs/plugin-examples.md @@ -0,0 +1,137 @@ +# Validation Plugin Examples + +## Rule that checks for resources without any annotations + +```typescript +export const noEmptyAnnotations = defineRule({ + id: 1, + description: "Require annotations as metadata.", + help: "Add any annotation to the Kubernetes resource.", + validate({ resources }, { report }) { + resources.forEach((resource) => { + const annotations = Object.entries(resource.metadata?.annotations ?? {}); + const hasAnnotations = annotations.length > 0; + + if (!hasAnnotations) { + report(resource, { path: "metadata.annotations" }); + } + }); + }, +}); +``` + +## Rule that checks for Prometheus instances with the Admin API enabled + +```typescript +export const noAdminApi = defineRule({ + id: 3, + description: "Disallow the admin API for Prometheus instances.", + help: "Do not set enabledAdminAPI to true.", + validate({ resources }, { report }) { + resources.filter(isPrometheus).forEach((prometheus) => { + const valid = prometheus.spec.enableAdminAPI !== true; + if (valid) return; + report(prometheus, { path: "spec.enableAdminAPI" }); + }); + }, +}); +``` + +## Rule that checks for images using the latest tag + +```typescript +export const noLatestImage = defineRule({ + id: 4, + description: "Disallow images with the latest tag.", + fullDescription: + "The latest image makes it difficult to know which version is exactly running which might introduce subtle bugs or run a version that is vulnerable.", + help: "Pin the exact version of the image.", + validate({ resources }, { report }) { + validatePodSpec(resources, (resource, pod, prefix) => { + pod.initContainers?.forEach((container, index) => { + const valid = !container.image?.endsWith("latest"); + if (valid) return; + + report(resource, { + path: `${prefix}.initContainers.${index}.image`, + }); + }); + + pod.containers.forEach((container, index) => { + const valid = !container.image?.endsWith("latest"); + if (valid) return; + + report(resource, { + path: `${prefix}.containers.${index}.image`, + }); + }); + }); + }, +}); +``` + +Utility method used by the above to identify PodSpecs in different resource types: + +```typescript + +export function validatePodSpec( + resources: any[], + validateFn: (resource: any, pod: PodSpec, prefix: string) => void +): void { + resources.forEach((resource) => { + if ( + isDeployment(resource) || + isStatefulSet(resource) || + isDaemonSet(resource) || + isJob(resource) + ) { + const pod = resource.spec?.template.spec; + if (!pod) return; + return validateFn(resource, pod, "spec.template.spec"); + } + + if (isCronJob(resource)) { + const pod = resource.spec?.jobTemplate.spec?.template.spec; + if (!pod) return; + return validateFn(resource, pod, "spec.jobTemplate.spec.template.spec"); + } + + if (isPod(resource)) { + const pod = resource.spec; + if (!pod) return; + return validateFn(resource, pod, "spec"); + } + }); +} +``` + +## Rule that checks if Services are exposing correct ports + +```typescript +export const noPortMismatch = defineRule({ + id: 2, + description: "The target port should match any container port.", + help: "Change to target port to a port that matching a container's port.", + validate({ resources }, { getRelated, report }) { + resources.filter(isService).forEach((service) => { + const deployments = getRelated(service).filter(isDeployment); + + const validPorts = deployments.flatMap((d) => + d.spec?.template.spec?.containers.flatMap((c) => + c.ports?.flatMap((p) => p.containerPort) + ) + ); + + const servicePorts = service.spec?.ports ?? []; + servicePorts.forEach((port, index: number) => { + if (!validPorts.includes(Number(port.targetPort))) { + report(service, { path: `spec.ports.${index}.targetPort` }); + } + }); + }); + }, +}); +``` + + + diff --git a/packages/validation/docs/plugin-metadata.md b/packages/validation/docs/plugin-metadata.md new file mode 100644 index 000000000..b42ce9002 --- /dev/null +++ b/packages/validation/docs/plugin-metadata.md @@ -0,0 +1,84 @@ +# Validation Plugin Metadata + +Monokle Validation Plugins need to provide specific metadata for the validation package to use them in +the Monokle CLI and Monokle Cloud. + +## Plugin metadata + +To ensure correct usage/configuration of your plugin the following +properties should be set in a call to `definePlugin` + +- `id` : a unique (internal) identifier for your plugin +- `name` : a unique camel-case name that will be used as a prefix in configuration files to identify + rules in the plugin +- `displayName` : a user-friendly name for your plugin +- `description` : a user-friendly description of your plugin + +The below example is taken from the Argo Validation plugin in the Community Repository + +```typescript +export default definePlugin({ + id: "ARGO", + name: "argo", + displayName: "ArgoCD Validation plugin", + description: "Validation rules related to ArgoCD", + rules: { + appDestination, // defined in the example below + ... more rules ... + }, +}); +``` + +## Validator metadata + +Each validator needs to be defined with a call to `defineRule` and added to the `rules` object shown above. + +The following properties are required for `defineRule` + +- `id` : an internal id for your rule +- `description` : a text to show if this rule fails +- `help` : a text telling how to fix your errors for this rule + +Another example from the Argo Validation plugin: + +```typescript +// used in the example above +export const appDestination = defineRule({ + id: 2, + description: "Argo Application's destination are mutually exclusive", + help: "Either use 'server' or 'name', but not both.", + validate({ resources }, { report }) { + ... validator implementation ... + }); + }, +}); +``` + +## Usage in validator / CLI configuration + +Plugins need to be contributed to the Community Plugins repository to be directly usable with +the [Monokle CLI](https://github.com/kubeshop/monokle-core/tree/main/packages/cli) and Monokle Cloud. + +Once contributed you can simple use them by adding them to the `monokle.validation.yaml` file as follows: + +```yaml +plugins: + : true +rules: + /: "err" +``` + +The `rule-name` is generated from the actual rule property added to the plugin.ts by transforming it into +a lower cased string with dashes between words. + +For the above Argo examples the configuration is + +```yaml +# monokle.validation.yaml +plugins: + argo: true +rules: + argo/app-destination: "err" +``` + +Read more about the [Validator Configuration](configuration.md) From 74fbe787b2f1a3e438bd3866c5ead4f25dbbe1db Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 10:07:53 +0100 Subject: [PATCH 02/11] fix: docs update --- packages/cli/README.md | 2 +- packages/validation/docs/custom-plugins.md | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/cli/README.md b/packages/cli/README.md index c27c4c7d1..c1e83106e 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -123,7 +123,7 @@ settings: ### Custom validators -It is easy to extend the Monokle CLI with custom validators that can be shared with others using +It is easy to extend the Monokle CLI with [custom validators](../validation/docs/custom-plugins.md) that can be shared with others using our [Monokle Community Plugins][monokle-community-plugins] repository. ## GitHub Action diff --git a/packages/validation/docs/custom-plugins.md b/packages/validation/docs/custom-plugins.md index 66cb5a209..321246817 100644 --- a/packages/validation/docs/custom-plugins.md +++ b/packages/validation/docs/custom-plugins.md @@ -18,10 +18,12 @@ Also have a look at Follow these steps to get going with a custom plugin: -- Use the create-monokle-plugin to scaffold your plugin -- Update the generated `src/plugin.ts` file with correct metadata ([read more](plugin-metadata.md)) -- Implement your rule(s) in the `src/rules` folder and make sure to add them to the `src/plugin.ts` file -- Optionally use Monokle Cloud to test your plugin ([see below](#local-development-with-monokle-cloud)) +1. Use [create-monokle-plugin](../../create-monokle-plugin) to scaffold your plugin +2. Update the generated `src/plugin.ts` file with correct metadata - [read more](plugin-metadata.md) +3. Optionally add any CRDs that you might want to validate to the `src/schemas` folder and generate corresponding objects - [see below](#generate-resources--typeguards) +4. Implement your rule(s) in the generated `src/rules` folder and make sure to add them to the `definePlugin` call in the generated`src/plugin.ts` file +5. Optionally use Monokle Cloud to test your plugin ([see below](#local-development-with-monokle-cloud)) +6. Package and/or share your plugin in our [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repository. ## Tips & Tricks From 7a24f2b706791cf8b3c8e7f03bfcdb7fcf66551d Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 11:44:03 +0100 Subject: [PATCH 03/11] fix: added doc on implementing rules --- packages/cli/README.md | 6 +- packages/validation/docs/custom-plugins.md | 3 +- .../validation/docs/rule-implementation.md | 109 ++++++++++++++++++ .../src/validators/custom/config.ts | 2 +- 4 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 packages/validation/docs/rule-implementation.md diff --git a/packages/cli/README.md b/packages/cli/README.md index c1e83106e..9161863c2 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -12,7 +12,8 @@ Monokle CLI is a command-line interface for static analysis of Kubernetes resources. -Use it to prevent misconfigurations within Kustomize, Helm or default Kubernetes resources. The output is available as a SARIF file which you can upload to GitHub CodeScan. +Use it to prevent misconfigurations within Kustomize, Helm or default Kubernetes resources. The output is available as a SARIF file +which you can upload to GitHub CodeScan. Monokle CLI includes built-in validators for - YAML Syntax @@ -100,8 +101,7 @@ You can use `--help` to access help information directly from the CLI. The Monokle CLI looks for a Monokle Validation configuration file at `./monokle.validation.yaml`. You can change this by using the `--config` flag. -All rules are enabled by default and are -described in the [Monokle Validation configuration][monokle-validation-docs] documentation. +All rules are enabled by default and are described in the [Monokle Validation configuration][monokle-validation-docs] documentation. **Example** diff --git a/packages/validation/docs/custom-plugins.md b/packages/validation/docs/custom-plugins.md index 321246817..38eb92300 100644 --- a/packages/validation/docs/custom-plugins.md +++ b/packages/validation/docs/custom-plugins.md @@ -13,6 +13,7 @@ Monokle Validation plugins can currently be written in typescript and scaffolded Also have a look at - [Plugin Metadata](plugin-metadata.md) to learn more about the metadata a plugin needs to expose - [Plugin Examples](plugin-examples.md) to see a bunch of examples +- [Rule Implementation](rule-implementation.md) to learn how to implement rules ## Getting Started @@ -21,7 +22,7 @@ Follow these steps to get going with a custom plugin: 1. Use [create-monokle-plugin](../../create-monokle-plugin) to scaffold your plugin 2. Update the generated `src/plugin.ts` file with correct metadata - [read more](plugin-metadata.md) 3. Optionally add any CRDs that you might want to validate to the `src/schemas` folder and generate corresponding objects - [see below](#generate-resources--typeguards) -4. Implement your rule(s) in the generated `src/rules` folder and make sure to add them to the `definePlugin` call in the generated`src/plugin.ts` file +4. [Implement your rule(s)](rule-implementation.md) in the generated `src/rules` folder and make sure to add them to the `definePlugin` call in the generated`src/plugin.ts` file 5. Optionally use Monokle Cloud to test your plugin ([see below](#local-development-with-monokle-cloud)) 6. Package and/or share your plugin in our [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repository. diff --git a/packages/validation/docs/rule-implementation.md b/packages/validation/docs/rule-implementation.md new file mode 100644 index 000000000..1334de520 --- /dev/null +++ b/packages/validation/docs/rule-implementation.md @@ -0,0 +1,109 @@ +# Custom Rule Implementation + +Apart from providing rule metadata as described in [plugin metadata](plugin-metadata.md) each rule +needs to implement a `validate` method that is called for each resource to be validated. This method +takes two arguments: + +- a `RuleContext` object that provides metadata for the resource(s) to be validated +- a `RuleApi` object that provides helper methods for rule execution + +These are both defined in [config.ts](../src/validators/custom/config.ts). + +Let's have a look at these in more detail. + +## RuleContext + +The RuleContext contains the following properties: + +### `resources` + +A list of Resource objects that need to be (re)validated in the call to validate. This is defined as follows in +[types.ts](../src/common/types.ts): + +```typescript +export type Resource = { + id: string; + fileId: string; + filePath: string; + fileOffset: number; // Offset of this resource's startLine within the parent file. + name: string; + apiVersion: string; + kind: string; + namespace?: string; + content?: any; + text: string; + isSelected?: boolean; + refs?: ResourceRef[]; + range?: { + start: number; + length: number; + }; +}; +``` + +The most important properties during validation will (probably) be: + +- `name` : the name of the resource, for example "petstore-deployment" +- `kind` : the kind of resource, for example "Deployment" +- `apiVersion` : the apiVersion, for example "apps/v1" +- `metadata` : the metadata available in the resource (see example below) +- `content` : the entire resource object, giving you access to any property you might want to validate + +### `allResources` + +A list of all resources available to the validator, use this to resolve references, etc. + +### `settings` + +A custom settings object provided to the validator - for example `monokle.validation.yaml`: + +```yaml +plugins: + kubernetes-schema: true +settings: + kubernetes-schema: + schemaVersion: v1.24.2 +``` + +## RuleApi + +The RuleApi object provides the following methods: + +### `getRelated(resource: Resource): Resource[];` + +Returns all related resources of the given resource, using the `refs` property of the given Resource to resolve these. + +### `report(resource: Resource, args: ReportArgs)` + +Use this method to report a problem with the resource(s) being validated. ReportArgs takes two properties: + +- `path` : a path to the error, for example + - "metadata.annotations" for an incorrect annotation + - "spec.template.spec.containers.0.image" for an incorrect image in the first container of a Deployment. +- `message` : an optional message with additional context + +### `parse(resource: Resource): Document.Parsed` + +Returns an internally cached parsed YAML instance of the resource, this is for advanced use cases for now. + +## Example + +The below validate call extracts the `resources` and `report` properties from the provided arguments and then +iterates each resource, checking the `metadata` property for annotations and reporting an error if none found. + +```typescript +validate({ resources }, { report }){ + resources.forEach((resource) => { + // get annotations of resource + const annotations = Object.entries(resource.metadata?.annotations ?? {}); + + // were there any? + const hasAnnotations = annotations.length > 0; + + if (!hasAnnotations) { + // report error for this resource + report(resource, { path: "metadata.annotations" }); + } + }); +} +``` diff --git a/packages/validation/src/validators/custom/config.ts b/packages/validation/src/validators/custom/config.ts index afa76c711..0116192ff 100644 --- a/packages/validation/src/validators/custom/config.ts +++ b/packages/validation/src/validators/custom/config.ts @@ -128,7 +128,7 @@ export type RuleApi = { report(resource: Resource, args: ReportArgs): void; /** - * Returns a parsed YAML instance of the resource. + * Returns an internally cached parsed YAML instance of the resource. * * @remark this is for advanced use cases. */ From 015ed6fcf948865fbfb23972d7f73bd33c660fde Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 11:52:29 +0100 Subject: [PATCH 04/11] fix: added more links to validation README.md --- packages/validation/README.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/validation/README.md b/packages/validation/README.md index 76574c2f1..b01d8fb3e 100644 --- a/packages/validation/README.md +++ b/packages/validation/README.md @@ -12,17 +12,17 @@ Extensible, static Kubernetes analysis

-## Welcome to Monokle Validation +# Welcome to Monokle Validation Monokle Validation is a TypeScript library to validate your Kubernetes resources. -### Key features +## Key features -- 🚀 Start in seconds with the user-friendly configuration. +- 🚀 Start in seconds with the user-friendly configuration and powerful core plugins. - ⚡️ Real-time validation through incremental runs. -- ⚒ Extensible architecture with plugins. +- ⚒ Extensible architecture with custom plugins. -### Core plugins +## Core plugins - YAML Syntax validates that your manifests have correct YAML syntax. - Kubernetes Schema validates that your resources and CRDs are well-defined in the schema for their resource kind. @@ -31,12 +31,16 @@ Monokle Validation is a TypeScript library to validate your Kubernetes resources Learn more about each Core Plugin in the [Core Plugins Documentation](docs/core-plugins.md) -### Community Plugins +## Custom Plugins -Check out our [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repo for -plugins contributed by our community, and details on how to create your own. +Easily create your own validators in typescript - [Read More](docs/custom-plugins.md) -### Try the CLI or Monokle Cloud now! +## Community Plugins + +Share your custom validators in the [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repo, +or use any existing community validators as [described below](#using-community-plugins). + +## Validate from the CLI or Monokle Cloud The [Monokle CLI](https://github.com/kubeshop/monokle-core/tree/main/packages/cli) provides a convenient wrapper around this library. Use it to validate your resources in seconds: From 6c62e2cc8f49b3b18aaffeba8103d797752a19bc Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 11:55:26 +0100 Subject: [PATCH 05/11] fix: moving things around.. --- packages/validation/docs/custom-plugins.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/validation/docs/custom-plugins.md b/packages/validation/docs/custom-plugins.md index 38eb92300..91bebbde6 100644 --- a/packages/validation/docs/custom-plugins.md +++ b/packages/validation/docs/custom-plugins.md @@ -4,17 +4,15 @@ Monokle Validation plugins can currently be written in typescript and scaffolded [create-monokle-plugin](../create-monokle-plugin) library. - [Getting Started](#getting-started) +- Documentation + - [Plugin Metadata](plugin-metadata.md) describes the metadata a plugin needs to expose + - [Rule Implementation](rule-implementation.md) shows how to implement rules - Tips & Tricks - [Local Development with Monokle Cloud](#local-development-with-monokle-cloud) - [Generate Resources & Typeguards](#generate-resources--typeguards) - [Packaging](#packaging) - [Sharing & Distribution](#sharing-and-distribution) -Also have a look at -- [Plugin Metadata](plugin-metadata.md) to learn more about the metadata a plugin needs to expose -- [Plugin Examples](plugin-examples.md) to see a bunch of examples -- [Rule Implementation](rule-implementation.md) to learn how to implement rules - ## Getting Started Follow these steps to get going with a custom plugin: From 1752dee2e110aa5b4b87ba253028b841c97f0d0f Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 11:57:11 +0100 Subject: [PATCH 06/11] fix: doc fixes.. --- packages/validation/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/validation/README.md b/packages/validation/README.md index b01d8fb3e..77ae646c7 100644 --- a/packages/validation/README.md +++ b/packages/validation/README.md @@ -42,8 +42,7 @@ or use any existing community validators as [described below](#using-community-p ## Validate from the CLI or Monokle Cloud -The [Monokle CLI](https://github.com/kubeshop/monokle-core/tree/main/packages/cli) provides a convenient -wrapper around this library. Use it to validate your resources in seconds: +The [Monokle CLI](../cli) provides a convenient wrapper around this library. Use it to validate your resources in seconds: ```bash kustomize build . | monokle validate - From f6d19f3571734a29e07bb14b4e14b4550ed239e4 Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 12:20:19 +0100 Subject: [PATCH 07/11] fix: doc fixes.. --- packages/create-monokle-plugin/README.md | 24 ++++++++- packages/validation/docs/custom-plugins.md | 46 +++++++++--------- .../images/monokle-cloud-developer-mode.png | Bin 0 -> 263952 bytes 3 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 packages/validation/docs/images/monokle-cloud-developer-mode.png diff --git a/packages/create-monokle-plugin/README.md b/packages/create-monokle-plugin/README.md index 2895db66b..6b15329e1 100644 --- a/packages/create-monokle-plugin/README.md +++ b/packages/create-monokle-plugin/README.md @@ -11,10 +11,31 @@ Prerequisite: it's recommended to use NodeJs LTS or higher and NPM 7+. ### Interactive -``` +Running in interactive mode: + +```shell npm create monokle-plugin@latest ``` +will prompt for: + +```shell +✔ Plugin name: … my-validation-plugin +✔ Select a plugin type: › validation +✔ Select a variant: › validation-ts +✔ Select a template: › basic + +Scaffolding plugin in /Users/olensmar/WebstormProjects/monokle-core/packages/create-monokle-plugin/my-validation-plugin... + +Done. Now run: + + cd my-validation-plugin + npm install + npm run dev +``` + +Now you're all set to implement your [Custom Plugin](../validation/docs/custom-plugins.md) + ### Create a TypeScript validation plugin ``` @@ -31,7 +52,6 @@ example on how to get started with your own plugin. This project is a modified version of [create-vite](https://github.com/vitejs/vite/tree/main/packages/create-vite) and most credits go to them. -

Monokle Logo

diff --git a/packages/validation/docs/custom-plugins.md b/packages/validation/docs/custom-plugins.md index 91bebbde6..768923abd 100644 --- a/packages/validation/docs/custom-plugins.md +++ b/packages/validation/docs/custom-plugins.md @@ -26,24 +26,6 @@ Follow these steps to get going with a custom plugin: ## Tips & Tricks -### Local Development with Monokle Cloud - -To enable direct testing/debugging of your validators with Monokle Cloud, run - -``` -npm run dev -``` - -which will start a local development server that Monokle Cloud can connect to: - -- Open [app.monokle.com](https://app.monokle.com) and open the validation pane in your favourite repository. -- Enabled "Development Mode" at the bottom of the pane -- A new validator labelled "development" will appear. - -You can now start editing code; the local development server will automatically pick up code changes and forward -them to the browser where Hot Module Replacement will give you the latest version of your code in real-time. -You can play around with any of the resources in your project to make sure you got the validation right. - ### Generate Resources & Typeguards Put any CRDs you might want to use/validation in the `src/schemas/crds` folder (in JSON format) and run @@ -52,7 +34,7 @@ Put any CRDs you might want to use/validation in the `src/schemas/crds` folder ( npm run codegen ``` -This will generate utility methods and types for each CRD into the `src/schemas/__generated__` folder, for you +This will generate utility methods and types for each CRD into the `src/schemas/__generated__` folder, for you to import/use in your validators. Example usage for code generated for the prometheus CRD: @@ -69,6 +51,26 @@ defineRule({ }) ``` +### Local Development with Monokle Cloud + +To enable direct testing/debugging of your validators with Monokle Cloud, run + +``` +npm run dev +``` + +which will start a local development server that Monokle Cloud can connect to: + +- Open [app.monokle.com](https://app.monokle.com) and open the validation pane in your favourite repository. +- Enabled "Development Mode" at the bottom of the pane +- A new validator labelled "development" will appear. + +You can now start editing code; the local development server will automatically pick up code changes and forward +them to the browser where Hot Module Replacement will give you the latest version of your code in real-time. +You can play around with any of the resources in your project to make sure you got the validation right. + +![monokle-cloud-developer-mode.png](images/monokle-cloud-developer-mode.png) + ### Packaging & Usage To package your plugin into a single `plugin.js` file, run @@ -77,11 +79,7 @@ To package your plugin into a single `plugin.js` file, run npm run build ``` -which will create a `dist/plugin.js` file in your repo. - -Put this file in a `.monokle-plugins` folder below the cwd of where you are running the validator/CLI and -it will be available to configure and use as described under - +which will create a `dist/plugin.js` file in your repo. ### Sharing and Distribution diff --git a/packages/validation/docs/images/monokle-cloud-developer-mode.png b/packages/validation/docs/images/monokle-cloud-developer-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba50f83cc8918a60620386c5a824bb3ed2442a1 GIT binary patch literal 263952 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

ltQh@KpHS#o?o;R9`# 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 E2kndXRR910 literal 0 HcmV?d00001 From fc59c74840a9020ecf280edcc9620f7a94dc9b30 Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 12:21:46 +0100 Subject: [PATCH 08/11] fix: doc fixes.. --- packages/create-monokle-plugin/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/create-monokle-plugin/README.md b/packages/create-monokle-plugin/README.md index 6b15329e1..ac96eca0c 100644 --- a/packages/create-monokle-plugin/README.md +++ b/packages/create-monokle-plugin/README.md @@ -42,10 +42,10 @@ Now you're all set to implement your [Custom Plugin](../validation/docs/custom-p npm create monokle-plugin@latest my-validator -- --template validation-ts ``` -### Example +### Sharing plugins -Head over to the [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repo for an -example on how to get started with your own plugin. +Head over to the [Monokle Community Plugins](https://github.com/kubeshop/monokle-community-plugins) repo to see existing +community plugins and learn how you can create and share your own. ## Acknowledgements From f5ad2b213c3ba4815e4deb8330b9b32155b6071d Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 12:24:28 +0100 Subject: [PATCH 09/11] fix: doc fixes.. --- .../validation/docs/rule-implementation.md | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/packages/validation/docs/rule-implementation.md b/packages/validation/docs/rule-implementation.md index 1334de520..665ccce3e 100644 --- a/packages/validation/docs/rule-implementation.md +++ b/packages/validation/docs/rule-implementation.md @@ -1,7 +1,7 @@ # Custom Rule Implementation -Apart from providing rule metadata as described in [plugin metadata](plugin-metadata.md) each rule -needs to implement a `validate` method that is called for each resource to be validated. This method +Apart from providing rule metadata as described in [plugin metadata](plugin-metadata.md), each rule +needs to implement a `validate` method that will be called for each resource to be validated. This method takes two arguments: - a `RuleContext` object that provides metadata for the resource(s) to be validated @@ -9,7 +9,27 @@ takes two arguments: These are both defined in [config.ts](../src/validators/custom/config.ts). -Let's have a look at these in more detail. +For example, the below validate call extracts the `resources` and `report` properties from the provided arguments and then +iterates each resource, checking the `metadata` property for annotations and reporting an error if none found. + +```typescript +validate({ resources }, { report }){ + resources.forEach((resource) => { + // get annotations of resource + const annotations = Object.entries(resource.metadata?.annotations ?? {}); + + // were there any? + const hasAnnotations = annotations.length > 0; + + if (!hasAnnotations) { + // report error for this resource + report(resource, { path: "metadata.annotations" }); + } + }); +} +``` + +Let's have a look at the provided arguments in more detail. ## RuleContext @@ -85,25 +105,3 @@ Use this method to report a problem with the resource(s) being validated. Report ### `parse(resource: Resource): Document.Parsed` Returns an internally cached parsed YAML instance of the resource, this is for advanced use cases for now. - -## Example - -The below validate call extracts the `resources` and `report` properties from the provided arguments and then -iterates each resource, checking the `metadata` property for annotations and reporting an error if none found. - -```typescript -validate({ resources }, { report }){ - resources.forEach((resource) => { - // get annotations of resource - const annotations = Object.entries(resource.metadata?.annotations ?? {}); - - // were there any? - const hasAnnotations = annotations.length > 0; - - if (!hasAnnotations) { - // report error for this resource - report(resource, { path: "metadata.annotations" }); - } - }); -} -``` From df21a037c2d65e16724cf6f1961f9bc844bdb175 Mon Sep 17 00:00:00 2001 From: olensmar Date: Wed, 21 Dec 2022 15:55:54 +0100 Subject: [PATCH 10/11] fix: added the possibility to load custom plugins from a local folder --- package-lock.json | 2 +- .../custom/.monokle-plugins/argo-plugin.js | 1 + packages/cli/test/custom/argo-configmap.yaml | 7 +++ .../cli/test/custom/monokle.validation.yaml | 4 ++ packages/validation/docs/custom-plugins.md | 6 +- packages/validation/package.json | 2 +- packages/validation/src/MonokleValidator.ts | 61 +++++++++++++----- packages/validation/src/config/read.node.ts | 14 +++-- packages/validation/src/node.ts | 62 ++++++++----------- 9 files changed, 98 insertions(+), 61 deletions(-) create mode 100644 packages/cli/test/custom/.monokle-plugins/argo-plugin.js create mode 100644 packages/cli/test/custom/argo-configmap.yaml create mode 100644 packages/cli/test/custom/monokle.validation.yaml diff --git a/package-lock.json b/package-lock.json index 72f2f89ba..a7a301457 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26110,7 +26110,7 @@ }, "packages/validation": { "name": "@monokle/validation", - "version": "0.10.3", + "version": "0.11.0", "license": "MIT", "dependencies": { "@open-policy-agent/opa-wasm": "1.8.0", diff --git a/packages/cli/test/custom/.monokle-plugins/argo-plugin.js b/packages/cli/test/custom/.monokle-plugins/argo-plugin.js new file mode 100644 index 000000000..d6fe14d55 --- /dev/null +++ b/packages/cli/test/custom/.monokle-plugins/argo-plugin.js @@ -0,0 +1 @@ +const a=["argocd-cm","argocd-cmd-params-cm","argocd-rbac-cm","argocd-tls-certs-cm","argocd-ssh-known-hosts-cm"];function e(a){return"object"==typeof a&&"argoproj.io/v1alpha1"===a?.apiVersion&&"Application"===a?.kind}var o={id:"ARGO",name:"argo",displayName:"ArgoCD Validation plugin",description:"Validation rules related to ArgoCD",rules:{argoConfigMaps:{id:1,description:"Check that ArgoCD ConfigMaps have required label",help:"Add app.kubernetes.io/part-of: argocd label to this ConfigMap for ArgoCD to use it",validate({resources:e},{report:o}){e.filter((a=>function(a){return"object"==typeof a&&"v1"===a?.apiVersion&&"ConfigMap"===a?.kind}(a))).filter((e=>a.includes(e.metadata?.name))).forEach((a=>{"argocd"!==(a.metadata?.labels??{})["app.kubernetes.io/part-of"]&&o(a,{path:"metadata.labels"})}))}},appDestination:{id:2,description:"Argo Application's destination are mutually exclusive",help:"Either use 'server' or 'name', but not both.",validate({resources:a},{report:o}){a.filter(e).forEach((a=>{const e=void 0!==a.spec.destination.name,t=void 0!==a.spec.destination.server;!e&&t||e&&!t||o(a,{path:"spec.destination"})}))}}}};export{o as default}; diff --git a/packages/cli/test/custom/argo-configmap.yaml b/packages/cli/test/custom/argo-configmap.yaml new file mode 100644 index 000000000..0dbfa8898 --- /dev/null +++ b/packages/cli/test/custom/argo-configmap.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: argocd-cm + labels: + app.kubernetes.io/name: argocd-cm + app.kubernetes.io/part-of: argocds diff --git a/packages/cli/test/custom/monokle.validation.yaml b/packages/cli/test/custom/monokle.validation.yaml new file mode 100644 index 000000000..a544912cb --- /dev/null +++ b/packages/cli/test/custom/monokle.validation.yaml @@ -0,0 +1,4 @@ +plugins: + argo: true +rules: + argo/argo-config-maps: "warn" diff --git a/packages/validation/docs/custom-plugins.md b/packages/validation/docs/custom-plugins.md index 768923abd..2f647473f 100644 --- a/packages/validation/docs/custom-plugins.md +++ b/packages/validation/docs/custom-plugins.md @@ -79,7 +79,11 @@ To package your plugin into a single `plugin.js` file, run npm run build ``` -which will create a `dist/plugin.js` file in your repo. +which will create a `dist/plugin.js` file in your repo. + +Put this file in a `.monokle-plugins` folder below the cwd of where you are running the validator/CLI, rename it to +`-plugin.js` and it will be discovered and configurable as described +under [plugin configuration](configuration.md) ### Sharing and Distribution diff --git a/packages/validation/package.json b/packages/validation/package.json index 315b62721..5c443efd3 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "@monokle/validation", - "version": "0.10.3", + "version": "0.11.0", "description": "Kubernetes resource validation", "author": "Kubeshop", "license": "MIT", diff --git a/packages/validation/src/MonokleValidator.ts b/packages/validation/src/MonokleValidator.ts index 4ce6d721f..23f2c9054 100644 --- a/packages/validation/src/MonokleValidator.ts +++ b/packages/validation/src/MonokleValidator.ts @@ -8,19 +8,19 @@ import type { CustomSchema, Incremental, Plugin, - Resource, + Resource } from "./common/types.js"; import { Config, PluginMap } from "./config/parse.js"; import { PluginMetadataWithConfig, PluginName, RuleMetadataWithConfig, - Validator, + Validator } from "./types.js"; import { nextTick, throwIfAborted } from "./utils/abort.js"; import { extractSchema, - findDefaultVersion, + findDefaultVersion } from "./utils/customResourceDefinitions.js"; import { PluginLoadError } from "./utils/error.js"; import { isDefined } from "./utils/isDefined.js"; @@ -33,6 +33,8 @@ import { RemoteWasmLoader } from "./validators/open-policy-agent/index.js"; import { OpenPolicyAgentValidator } from "./validators/open-policy-agent/validator.js"; import { ResourceLinksValidator } from "./validators/resource-links/validator.js"; import { YamlValidator } from "./validators/yaml-syntax/validator.js"; +import * as fs from "fs"; +import path from "path"; export type PluginLoader = (name: string) => Promise; @@ -70,9 +72,7 @@ export function createExtensibleMonokleValidator( return new DevCustomValidator(parser); default: try { - const url = `https://plugins.monokle.com/validation/${pluginName}/latest.js`; - const customPlugin = await import(/* @vite-ignore */ url); - return new SimpleCustomValidator(customPlugin.default, parser); + return await loadExternalPlugin( pluginName, parser ); } catch (err) { throw new Error( err instanceof Error @@ -115,6 +115,33 @@ export function createDefaultPluginLoader( }; } +export async function loadExternalPlugin(pluginName: string, parser: ResourceParser) { + const filePath = path.join(process.cwd(), ".monokle-plugins", `${pluginName}-plugin.js`); + if (fs.existsSync(filePath)) { + const customPlugin = await import(/* @vite-ignore */ filePath ); + return new SimpleCustomValidator(customPlugin.default, parser); + } else { + const url = `https://plugins.monokle.com/validation/${pluginName}/latest.js`; + const customPlugin = await importWithDataUrl(url); + return new SimpleCustomValidator(customPlugin.default, parser); + } +} + + +async function importWithDataUrl(url: string) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Error fetching ${url}: ${response.statusText}`); + } + const source = await response.text(); + const buff = Buffer.from(source); + const encodedSource = buff.toString("base64"); + const dataUrl = `data:text/javascript;base64,${encodedSource}`; + + return await import(/* @vite-ignore */ dataUrl); +} + + /** * The plugins that will be loaded by default. */ @@ -122,7 +149,7 @@ const DEFAULT_PLUGIN_MAP = { "open-policy-agent": true, "resource-links": true, "yaml-syntax": true, - "kubernetes-schema": true, + "kubernetes-schema": true }; export class MonokleValidator implements Validator { @@ -310,7 +337,7 @@ export class MonokleValidator implements Validator { this.#plugins.map((p) => p.configure({ rules: config.rules, - settings: config.settings, + settings: config.settings }) ) ); @@ -331,10 +358,10 @@ export class MonokleValidator implements Validator { * Validates the resources. */ async validate({ - resources, - incremental, - abortSignal: externalAbortSignal, - }: { + resources, + incremental, + abortSignal: externalAbortSignal + }: { resources: Resource[]; incremental?: Incremental; abortSignal?: AbortSignal; @@ -370,7 +397,7 @@ export class MonokleValidator implements Validator { return { $schema: "https://json.schemastore.org/sarif-2.1.0.json", version: "2.1.0", - runs, + runs }; } @@ -399,7 +426,7 @@ export class MonokleValidator implements Validator { async registerCustomSchema(schema: CustomSchema) { if (!this.isPluginLoaded("kubernetes-schema")) { this.debug("Cannot register custom schema.", { - reason: "Kubernetes Schema plugin must be loaded.", + reason: "Kubernetes Schema plugin must be loaded." }); return; } @@ -407,7 +434,7 @@ export class MonokleValidator implements Validator { const key = `${schema.apiVersion}-${schema.kind}`; if (this.#customSchemas.has(key)) { this.debug("Cannot register custom schema.", { - reason: "The schema is already registered.", + reason: "The schema is already registered." }); return; } @@ -428,7 +455,7 @@ export class MonokleValidator implements Validator { async unregisterCustomSchema(schema: Omit) { if (!this.isPluginLoaded("kubernetes-schema")) { this.debug("Cannot unregister custom schema.", { - reason: "Kubernetes Schema plugin must be loaded.", + reason: "Kubernetes Schema plugin must be loaded." }); return; } @@ -436,7 +463,7 @@ export class MonokleValidator implements Validator { const key = `${schema.apiVersion}-${schema.kind}`; if (this.#customSchemas.has(key)) { this.debug("Cannot register custom schema.", { - reason: "The schema is not registered.", + reason: "The schema is not registered." }); return; } diff --git a/packages/validation/src/config/read.node.ts b/packages/validation/src/config/read.node.ts index 48b46e82b..91d5c8c1e 100644 --- a/packages/validation/src/config/read.node.ts +++ b/packages/validation/src/config/read.node.ts @@ -13,8 +13,14 @@ export async function readConfig( return undefined; } - const data = await fsp.readFile(path, "utf8"); - const content = YAML.parse(data); - const config = parseConfig(content as JsonObject); - return config; + try { + const data = await fsp.readFile(path, "utf8"); + const content = YAML.parse(data); + const config = parseConfig(content as JsonObject); + return config; + } + catch( err ){ + console.error( "Failed to read configuration from " + path); + return undefined; + } } diff --git a/packages/validation/src/node.ts b/packages/validation/src/node.ts index 7f96607c9..6e984e685 100644 --- a/packages/validation/src/node.ts +++ b/packages/validation/src/node.ts @@ -1,5 +1,5 @@ import { ResourceParser } from "./common/resourceParser.js"; -import { MonokleValidator } from "./MonokleValidator.js"; +import { loadExternalPlugin, MonokleValidator } from "./MonokleValidator.js"; import { SimpleCustomValidator } from "./validators/custom/simpleValidator.js"; import { SchemaLoader } from "./validators/kubernetes-schema/schemaLoader.js"; import { KubernetesSchemaValidator } from "./validators/kubernetes-schema/validator.js"; @@ -7,47 +7,35 @@ import { RemoteWasmLoader } from "./validators/open-policy-agent/index.js"; import { OpenPolicyAgentValidator } from "./validators/open-policy-agent/validator.js"; import { ResourceLinksValidator } from "./validators/resource-links/validator.js"; import { YamlValidator } from "./validators/yaml-syntax/validator.js"; +import fs from "fs"; +import * as path from "path"; + export function createExtensibleNodeMonokleValidator( parser: ResourceParser = new ResourceParser(), schemaLoader: SchemaLoader = new SchemaLoader() ) { return new MonokleValidator(async (pluginName: string) => { - switch (pluginName) { - case "open-policy-agent": - const wasmLoader = new RemoteWasmLoader(); - return new OpenPolicyAgentValidator(parser, wasmLoader); - case "resource-links": - return new ResourceLinksValidator(); - case "yaml-syntax": - return new YamlValidator(parser); - case "labels": - const labelPlugin = await import("./validators/labels/plugin.js"); - return new SimpleCustomValidator(labelPlugin.default, parser); - case "kubernetes-schema": - return new KubernetesSchemaValidator(parser, schemaLoader); - default: - try { - const url = `https://plugins.monokle.com/validation/${pluginName}/latest.js`; - const customPlugin = await importWithDataUrl(url); - return new SimpleCustomValidator(customPlugin.default, parser); - } catch (err) { - throw new Error("plugin_not_found"); - } + switch (pluginName) { + case "open-policy-agent": + const wasmLoader = new RemoteWasmLoader(); + return new OpenPolicyAgentValidator(parser, wasmLoader); + case "resource-links": + return new ResourceLinksValidator(); + case "yaml-syntax": + return new YamlValidator(parser); + case "labels": + const labelPlugin = await import("./validators/labels/plugin.js"); + return new SimpleCustomValidator(labelPlugin.default, parser); + case "kubernetes-schema": + return new KubernetesSchemaValidator(parser, schemaLoader); + default: + try { + return await loadExternalPlugin(pluginName, parser); + } catch (err) { + throw new Error(`plugin_not_found: $err`); + } + } } - }); -} - -async function importWithDataUrl(url: string) { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Error fetching ${url}: ${response.statusText}`); - } - const source = await response.text(); - const buff = Buffer.from(source); - const encodedSource = buff.toString("base64"); - const dataUrl = `data:text/javascript;base64,${encodedSource}`; - - const module = await import(/* @vite-ignore */ dataUrl); - return module; + ); } From c4ed02daa70ae8868989127f411c31f553a233a6 Mon Sep 17 00:00:00 2001 From: olensmar Date: Thu, 22 Dec 2022 08:14:52 +0100 Subject: [PATCH 11/11] fix: moved plugin-file loading to node-specific validator --- packages/validation/src/MonokleValidator.ts | 33 ++------------------- packages/validation/src/node.ts | 26 ++++++++++++++-- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/packages/validation/src/MonokleValidator.ts b/packages/validation/src/MonokleValidator.ts index 23f2c9054..e47450f4c 100644 --- a/packages/validation/src/MonokleValidator.ts +++ b/packages/validation/src/MonokleValidator.ts @@ -33,8 +33,6 @@ import { RemoteWasmLoader } from "./validators/open-policy-agent/index.js"; import { OpenPolicyAgentValidator } from "./validators/open-policy-agent/validator.js"; import { ResourceLinksValidator } from "./validators/resource-links/validator.js"; import { YamlValidator } from "./validators/yaml-syntax/validator.js"; -import * as fs from "fs"; -import path from "path"; export type PluginLoader = (name: string) => Promise; @@ -72,7 +70,9 @@ export function createExtensibleMonokleValidator( return new DevCustomValidator(parser); default: try { - return await loadExternalPlugin( pluginName, parser ); + const url = `https://plugins.monokle.com/validation/${pluginName}/latest.js`; + const customPlugin = await import(/* @vite-ignore */ url); + return new SimpleCustomValidator(customPlugin.default, parser); } catch (err) { throw new Error( err instanceof Error @@ -115,33 +115,6 @@ export function createDefaultPluginLoader( }; } -export async function loadExternalPlugin(pluginName: string, parser: ResourceParser) { - const filePath = path.join(process.cwd(), ".monokle-plugins", `${pluginName}-plugin.js`); - if (fs.existsSync(filePath)) { - const customPlugin = await import(/* @vite-ignore */ filePath ); - return new SimpleCustomValidator(customPlugin.default, parser); - } else { - const url = `https://plugins.monokle.com/validation/${pluginName}/latest.js`; - const customPlugin = await importWithDataUrl(url); - return new SimpleCustomValidator(customPlugin.default, parser); - } -} - - -async function importWithDataUrl(url: string) { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Error fetching ${url}: ${response.statusText}`); - } - const source = await response.text(); - const buff = Buffer.from(source); - const encodedSource = buff.toString("base64"); - const dataUrl = `data:text/javascript;base64,${encodedSource}`; - - return await import(/* @vite-ignore */ dataUrl); -} - - /** * The plugins that will be loaded by default. */ diff --git a/packages/validation/src/node.ts b/packages/validation/src/node.ts index 6e984e685..aa04c1187 100644 --- a/packages/validation/src/node.ts +++ b/packages/validation/src/node.ts @@ -1,5 +1,5 @@ import { ResourceParser } from "./common/resourceParser.js"; -import { loadExternalPlugin, MonokleValidator } from "./MonokleValidator.js"; +import { MonokleValidator } from "./MonokleValidator.js"; import { SimpleCustomValidator } from "./validators/custom/simpleValidator.js"; import { SchemaLoader } from "./validators/kubernetes-schema/schemaLoader.js"; import { KubernetesSchemaValidator } from "./validators/kubernetes-schema/validator.js"; @@ -10,7 +10,6 @@ import { YamlValidator } from "./validators/yaml-syntax/validator.js"; import fs from "fs"; import * as path from "path"; - export function createExtensibleNodeMonokleValidator( parser: ResourceParser = new ResourceParser(), schemaLoader: SchemaLoader = new SchemaLoader() @@ -31,7 +30,15 @@ export function createExtensibleNodeMonokleValidator( return new KubernetesSchemaValidator(parser, schemaLoader); default: try { - return await loadExternalPlugin(pluginName, parser); + const filePath = path.join(process.cwd(), ".monokle-plugins", `${pluginName}-plugin.js`); + if (fs.existsSync(filePath)) { + const customPlugin = await import(/* @vite-ignore */ filePath ); + return new SimpleCustomValidator(customPlugin.default, parser); + } else { + const url = `https://plugins.monokle.com/validation/${pluginName}/latest.js`; + const customPlugin = await importWithDataUrl(url); + return new SimpleCustomValidator(customPlugin.default, parser); + } } catch (err) { throw new Error(`plugin_not_found: $err`); } @@ -39,3 +46,16 @@ export function createExtensibleNodeMonokleValidator( } ); } + +async function importWithDataUrl(url: string) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Error fetching ${url}: ${response.statusText}`); + } + const source = await response.text(); + const buff = Buffer.from(source); + const encodedSource = buff.toString("base64"); + const dataUrl = `data:text/javascript;base64,${encodedSource}`; + + return await import(/* @vite-ignore */ dataUrl); +}