@backstage/cli-module-config 0.1.4-next.1 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @backstage/cli-module-config
2
2
 
3
+ ## 0.1.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 60d2b50: The `--strict` flag for `config:check` now treats TypeScript configuration schema errors as fatal. The same flag is now also available for `config:schema`.
8
+ - Updated dependencies
9
+ - @backstage/config-loader@1.11.1
10
+
11
+ ## 0.1.4
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies
16
+ - @backstage/config-loader@1.11.0
17
+ - @backstage/cli-common@0.3.0
18
+ - @backstage/cli-node@0.3.4
19
+
3
20
  ## 0.1.4-next.1
4
21
 
5
22
  ### Patch Changes
@@ -9,7 +9,7 @@ var configLoader = require('@backstage/config-loader');
9
9
 
10
10
  var schema = async ({ args, info }) => {
11
11
  const {
12
- flags: { merge, format, package: pkg }
12
+ flags: { merge, format, package: pkg, strict }
13
13
  } = cleye.cli(
14
14
  {
15
15
  name: info.usage,
@@ -20,6 +20,10 @@ var schema = async ({ args, info }) => {
20
20
  merge: {
21
21
  type: Boolean,
22
22
  description: "Merge all schemas into a single schema"
23
+ },
24
+ strict: {
25
+ type: Boolean,
26
+ description: "Treat TypeScript configuration schema errors as fatal"
23
27
  }
24
28
  }
25
29
  },
@@ -29,7 +33,8 @@ var schema = async ({ args, info }) => {
29
33
  const { schema } = await config.loadCliConfig({
30
34
  args: [],
31
35
  fromPackage: pkg,
32
- mockEnv: true
36
+ mockEnv: true,
37
+ strict
33
38
  });
34
39
  let configSchema;
35
40
  if (merge) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.cjs.js","sources":["../../src/commands/schema.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cli } from 'cleye';\nimport type { JSONSchema7 as JSONSchema } from 'json-schema';\nimport { stringify as stringifyYaml } from 'yaml';\nimport { loadCliConfig } from '../lib/config';\nimport { JsonObject } from '@backstage/types';\nimport { mergeConfigSchemas } from '@backstage/config-loader';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { merge, format, package: pkg },\n } = cli(\n {\n name: info.usage,\n booleanFlagNegation: true,\n flags: {\n package: { type: String, description: 'Package to print schema for' },\n format: { type: String, description: 'Output format (yaml or json)' },\n merge: {\n type: Boolean,\n description: 'Merge all schemas into a single schema',\n },\n },\n },\n undefined,\n args,\n );\n\n const { schema } = await loadCliConfig({\n args: [],\n fromPackage: pkg,\n mockEnv: true,\n });\n\n let configSchema: JsonObject | JSONSchema;\n if (merge) {\n configSchema = mergeConfigSchemas(\n (schema.serialize().schemas as JsonObject[]).map(\n _ => _.value as JSONSchema,\n ),\n );\n configSchema.title = 'Application Configuration Schema';\n configSchema.description =\n 'This is the schema describing the structure of the app-config.yaml configuration file.';\n } else {\n configSchema = schema.serialize();\n }\n\n if (format === 'json') {\n process.stdout.write(`${JSON.stringify(configSchema, null, 2)}\\n`);\n } else {\n process.stdout.write(`${stringifyYaml(configSchema)}\\n`);\n }\n};\n"],"names":["cli","loadCliConfig","mergeConfigSchemas","stringifyYaml"],"mappings":";;;;;;;;;AAwBA,aAAe,OAAO,EAAE,IAAA,EAAM,IAAA,EAAK,KAAyB;AAC1D,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,GAAA;AAAI,GACvC,GAAIA,SAAA;AAAA,IACF;AAAA,MACE,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,mBAAA,EAAqB,IAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAa,6BAAA,EAA8B;AAAA,QACpE,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAa,8BAAA,EAA+B;AAAA,QACpE,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf;AACF,KACF;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAMC,oBAAA,CAAc;AAAA,IACrC,MAAM,EAAC;AAAA,IACP,WAAA,EAAa,GAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,YAAA,GAAeC,+BAAA;AAAA,MACZ,MAAA,CAAO,SAAA,EAAU,CAAE,OAAA,CAAyB,GAAA;AAAA,QAC3C,OAAK,CAAA,CAAE;AAAA;AACT,KACF;AACA,IAAA,YAAA,CAAa,KAAA,GAAQ,kCAAA;AACrB,IAAA,YAAA,CAAa,WAAA,GACX,wFAAA;AAAA,EACJ,CAAA,MAAO;AACL,IAAA,YAAA,GAAe,OAAO,SAAA,EAAU;AAAA,EAClC;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AAAA,EACnE,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGC,cAAA,CAAc,YAAY,CAAC;AAAA,CAAI,CAAA;AAAA,EACzD;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"schema.cjs.js","sources":["../../src/commands/schema.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { cli } from 'cleye';\nimport type { JSONSchema7 as JSONSchema } from 'json-schema';\nimport { stringify as stringifyYaml } from 'yaml';\nimport { loadCliConfig } from '../lib/config';\nimport { JsonObject } from '@backstage/types';\nimport { mergeConfigSchemas } from '@backstage/config-loader';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { merge, format, package: pkg, strict },\n } = cli(\n {\n name: info.usage,\n booleanFlagNegation: true,\n flags: {\n package: { type: String, description: 'Package to print schema for' },\n format: { type: String, description: 'Output format (yaml or json)' },\n merge: {\n type: Boolean,\n description: 'Merge all schemas into a single schema',\n },\n strict: {\n type: Boolean,\n description: 'Treat TypeScript configuration schema errors as fatal',\n },\n },\n },\n undefined,\n args,\n );\n\n const { schema } = await loadCliConfig({\n args: [],\n fromPackage: pkg,\n mockEnv: true,\n strict,\n });\n\n let configSchema: JsonObject | JSONSchema;\n if (merge) {\n configSchema = mergeConfigSchemas(\n (schema.serialize().schemas as JsonObject[]).map(\n _ => _.value as JSONSchema,\n ),\n );\n configSchema.title = 'Application Configuration Schema';\n configSchema.description =\n 'This is the schema describing the structure of the app-config.yaml configuration file.';\n } else {\n configSchema = schema.serialize();\n }\n\n if (format === 'json') {\n process.stdout.write(`${JSON.stringify(configSchema, null, 2)}\\n`);\n } else {\n process.stdout.write(`${stringifyYaml(configSchema)}\\n`);\n }\n};\n"],"names":["cli","loadCliConfig","mergeConfigSchemas","stringifyYaml"],"mappings":";;;;;;;;;AAwBA,aAAe,OAAO,EAAE,IAAA,EAAM,IAAA,EAAK,KAAyB;AAC1D,EAAA,MAAM;AAAA,IACJ,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,KAAK,MAAA;AAAO,GAC/C,GAAIA,SAAA;AAAA,IACF;AAAA,MACE,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,mBAAA,EAAqB,IAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAa,6BAAA,EAA8B;AAAA,QACpE,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAa,8BAAA,EAA+B;AAAA,QACpE,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf;AACF,KACF;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAMC,oBAAA,CAAc;AAAA,IACrC,MAAM,EAAC;AAAA,IACP,WAAA,EAAa,GAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT;AAAA,GACD,CAAA;AAED,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,YAAA,GAAeC,+BAAA;AAAA,MACZ,MAAA,CAAO,SAAA,EAAU,CAAE,OAAA,CAAyB,GAAA;AAAA,QAC3C,OAAK,CAAA,CAAE;AAAA;AACT,KACF;AACA,IAAA,YAAA,CAAa,KAAA,GAAQ,kCAAA;AACrB,IAAA,YAAA,CAAa,WAAA,GACX,wFAAA;AAAA,EACJ,CAAA,MAAO;AACL,IAAA,YAAA,GAAe,OAAO,SAAA,EAAU;AAAA,EAClC;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AAAA,EACnE,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGC,cAAA,CAAc,YAAY,CAAC;AAAA,CAAI,CAAA;AAAA,EACzD;AACF,CAAA;;;;"}
@@ -32,7 +32,8 @@ async function loadCliConfig(options) {
32
32
  dependencies: localPackageNames,
33
33
  // Include the package.json in the project root if it exists
34
34
  packagePaths: [cliCommon.targetPaths.resolveRoot("package.json")],
35
- noUndeclaredProperties: options.strict
35
+ noUndeclaredProperties: options.strict,
36
+ onSchemaError: options.strict ? void 0 : (error) => console.warn(error.message)
36
37
  });
37
38
  const source = configLoader.ConfigSources.default({
38
39
  allowMissingDefaultConfig: true,
@@ -1 +1 @@
1
- {"version":3,"file":"config.cjs.js","sources":["../../src/lib/config.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConfigSources, loadConfigSchema } from '@backstage/config-loader';\nimport { AppConfig, ConfigReader } from '@backstage/config';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport { getPackages } from '@manypkg/get-packages';\nimport { PackageGraph } from '@backstage/cli-node';\nimport { resolve as resolvePath } from 'node:path';\n\ntype Options = {\n args: string[];\n targetDir?: string;\n fromPackage?: string;\n mockEnv?: boolean;\n withDeprecatedKeys?: boolean;\n fullVisibility?: boolean;\n strict?: boolean;\n};\n\nexport async function loadCliConfig(options: Options) {\n const targetDir = options.targetDir ?? targetPaths.dir;\n\n // Consider all packages in the monorepo when loading in config\n const { packages } = await getPackages(targetDir);\n\n let localPackageNames;\n if (options.fromPackage) {\n if (packages.length) {\n const graph = PackageGraph.fromPackages(packages);\n localPackageNames = Array.from(\n graph.collectPackageNames([options.fromPackage], node => {\n // Workaround for Backstage main repo only, since the CLI has some artificial devDependencies\n if (node.name === '@backstage/cli') {\n return undefined;\n }\n return node.localDependencies.keys();\n }),\n );\n } else {\n // No packages: it means that it's not a monorepo (e.g. standalone plugin)\n localPackageNames = [options.fromPackage];\n }\n } else {\n localPackageNames = packages.map(p => p.packageJson.name);\n }\n\n const schema = await loadConfigSchema({\n dependencies: localPackageNames,\n // Include the package.json in the project root if it exists\n packagePaths: [targetPaths.resolveRoot('package.json')],\n noUndeclaredProperties: options.strict,\n });\n\n const source = ConfigSources.default({\n allowMissingDefaultConfig: true,\n substitutionFunc: options.mockEnv\n ? async name => process.env[name] || 'x'\n : undefined,\n rootDir: targetPaths.rootDir,\n argv: options.args.flatMap(t => ['--config', resolvePath(targetDir, t)]),\n });\n\n const appConfigs = await new Promise<AppConfig[]>((resolve, reject) => {\n async function readConfig() {\n let loaded = false;\n try {\n const abortController = new AbortController();\n for await (const { configs } of source.readConfigData({\n signal: abortController.signal,\n })) {\n resolve(configs);\n loaded = true;\n abortController.abort();\n }\n } catch (error) {\n if (!loaded) {\n reject(error);\n }\n }\n }\n readConfig();\n });\n\n const configurationLoadedMessage = appConfigs.length\n ? `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`\n : `No configuration files found, running without config`;\n\n // printing to stderr to not clobber stdout in case the cli command\n // outputs structured data (e.g. as config:schema does)\n process.stderr.write(`${configurationLoadedMessage}\\n`);\n\n try {\n const frontendAppConfigs = schema.process(appConfigs, {\n visibility: options.fullVisibility\n ? ['frontend', 'backend', 'secret']\n : ['frontend'],\n withDeprecatedKeys: options.withDeprecatedKeys,\n ignoreSchemaErrors: !options.strict,\n });\n const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs);\n\n const fullConfig = ConfigReader.fromConfigs(appConfigs);\n\n return {\n schema,\n appConfigs,\n frontendConfig,\n frontendAppConfigs,\n fullConfig,\n };\n } catch (error) {\n const maybeSchemaError = error as Error & { messages?: string[] };\n if (maybeSchemaError.messages) {\n const messages = maybeSchemaError.messages.join('\\n ');\n throw new Error(`Configuration does not match schema\\n\\n ${messages}`);\n }\n throw error;\n }\n}\n"],"names":["targetPaths","getPackages","PackageGraph","loadConfigSchema","ConfigSources","resolvePath","ConfigReader"],"mappings":"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"}
1
+ {"version":3,"file":"config.cjs.js","sources":["../../src/lib/config.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConfigSources, loadConfigSchema } from '@backstage/config-loader';\nimport { AppConfig, ConfigReader } from '@backstage/config';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport { getPackages } from '@manypkg/get-packages';\nimport { PackageGraph } from '@backstage/cli-node';\nimport { resolve as resolvePath } from 'node:path';\n\ntype Options = {\n args: string[];\n targetDir?: string;\n fromPackage?: string;\n mockEnv?: boolean;\n withDeprecatedKeys?: boolean;\n fullVisibility?: boolean;\n strict?: boolean;\n};\n\nexport async function loadCliConfig(options: Options) {\n const targetDir = options.targetDir ?? targetPaths.dir;\n\n // Consider all packages in the monorepo when loading in config\n const { packages } = await getPackages(targetDir);\n\n let localPackageNames;\n if (options.fromPackage) {\n if (packages.length) {\n const graph = PackageGraph.fromPackages(packages);\n localPackageNames = Array.from(\n graph.collectPackageNames([options.fromPackage], node => {\n // Workaround for Backstage main repo only, since the CLI has some artificial devDependencies\n if (node.name === '@backstage/cli') {\n return undefined;\n }\n return node.localDependencies.keys();\n }),\n );\n } else {\n // No packages: it means that it's not a monorepo (e.g. standalone plugin)\n localPackageNames = [options.fromPackage];\n }\n } else {\n localPackageNames = packages.map(p => p.packageJson.name);\n }\n\n const schema = await loadConfigSchema({\n dependencies: localPackageNames,\n // Include the package.json in the project root if it exists\n packagePaths: [targetPaths.resolveRoot('package.json')],\n noUndeclaredProperties: options.strict,\n onSchemaError: options.strict\n ? undefined\n : error => console.warn(error.message),\n });\n\n const source = ConfigSources.default({\n allowMissingDefaultConfig: true,\n substitutionFunc: options.mockEnv\n ? async name => process.env[name] || 'x'\n : undefined,\n rootDir: targetPaths.rootDir,\n argv: options.args.flatMap(t => ['--config', resolvePath(targetDir, t)]),\n });\n\n const appConfigs = await new Promise<AppConfig[]>((resolve, reject) => {\n async function readConfig() {\n let loaded = false;\n try {\n const abortController = new AbortController();\n for await (const { configs } of source.readConfigData({\n signal: abortController.signal,\n })) {\n resolve(configs);\n loaded = true;\n abortController.abort();\n }\n } catch (error) {\n if (!loaded) {\n reject(error);\n }\n }\n }\n readConfig();\n });\n\n const configurationLoadedMessage = appConfigs.length\n ? `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`\n : `No configuration files found, running without config`;\n\n // printing to stderr to not clobber stdout in case the cli command\n // outputs structured data (e.g. as config:schema does)\n process.stderr.write(`${configurationLoadedMessage}\\n`);\n\n try {\n const frontendAppConfigs = schema.process(appConfigs, {\n visibility: options.fullVisibility\n ? ['frontend', 'backend', 'secret']\n : ['frontend'],\n withDeprecatedKeys: options.withDeprecatedKeys,\n ignoreSchemaErrors: !options.strict,\n });\n const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs);\n\n const fullConfig = ConfigReader.fromConfigs(appConfigs);\n\n return {\n schema,\n appConfigs,\n frontendConfig,\n frontendAppConfigs,\n fullConfig,\n };\n } catch (error) {\n const maybeSchemaError = error as Error & { messages?: string[] };\n if (maybeSchemaError.messages) {\n const messages = maybeSchemaError.messages.join('\\n ');\n throw new Error(`Configuration does not match schema\\n\\n ${messages}`);\n }\n throw error;\n }\n}\n"],"names":["targetPaths","getPackages","PackageGraph","loadConfigSchema","ConfigSources","resolvePath","ConfigReader"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@backstage/cli-module-config";
6
- var version = "0.1.4-next.1";
6
+ var version = "0.1.5";
7
7
  var description = "CLI module for Backstage CLI";
8
8
  var backstage = {
9
9
  role: "cli-module"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/cli-module-config",
3
- "version": "0.1.4-next.1",
3
+ "version": "0.1.5",
4
4
  "description": "CLI module for Backstage CLI",
5
5
  "backstage": {
6
6
  "role": "cli-module"
@@ -33,11 +33,11 @@
33
33
  "test": "backstage-cli package test"
34
34
  },
35
35
  "dependencies": {
36
- "@backstage/cli-common": "0.3.0-next.0",
37
- "@backstage/cli-node": "0.3.4-next.0",
38
- "@backstage/config": "1.3.8",
39
- "@backstage/config-loader": "1.11.0-next.2",
40
- "@backstage/types": "1.2.2",
36
+ "@backstage/cli-common": "^0.3.0",
37
+ "@backstage/cli-node": "^0.3.4",
38
+ "@backstage/config": "^1.3.8",
39
+ "@backstage/config-loader": "^1.11.1",
40
+ "@backstage/types": "^1.2.2",
41
41
  "@manypkg/get-packages": "^1.1.3",
42
42
  "chalk": "^4.0.0",
43
43
  "cleye": "^2.6.0",
@@ -45,7 +45,7 @@
45
45
  "yaml": "^2.0.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@backstage/cli": "0.36.4-next.2",
48
+ "@backstage/cli": "^0.36.4",
49
49
  "@types/json-schema": "^7.0.6"
50
50
  },
51
51
  "typesVersions": {