@backstage/config-loader 1.10.3 → 1.10.4

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,13 @@
1
1
  # @backstage/config-loader
2
2
 
3
+ ## 1.10.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 018b3c1: Allow colon to be used as config key.
8
+ - Updated dependencies
9
+ - @backstage/config@1.3.4
10
+
3
11
  ## 1.10.3
4
12
 
5
13
  ### Patch Changes
@@ -28,7 +28,7 @@ class EnvConfigSource {
28
28
  }
29
29
  }
30
30
  const ENV_PREFIX = "APP_CONFIG_";
31
- const CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i;
31
+ const CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_:][a-z0-9]+)*$/i;
32
32
  function readEnvConfig(env) {
33
33
  let data = void 0;
34
34
  for (const [name, value] of Object.entries(env)) {
@@ -1 +1 @@
1
- {"version":3,"file":"EnvConfigSource.cjs.js","sources":["../../src/sources/EnvConfigSource.ts"],"sourcesContent":["/*\n * Copyright 2023 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 { AppConfig } from '@backstage/config';\nimport { assertError } from '@backstage/errors';\nimport { JsonObject } from '@backstage/types';\nimport { AsyncConfigSourceGenerator, ConfigSource } from './types';\n\n/**\n * Options for {@link EnvConfigSource.create}.\n *\n * @public\n */\nexport interface EnvConfigSourceOptions {\n /**\n * The environment variables to use, defaults to `process.env`.\n */\n env?: Record<string, string | undefined>;\n}\n\n/**\n * A config source that reads configuration from the environment.\n *\n * @remarks\n *\n * Only environment variables prefixed with APP_CONFIG_ will be considered.\n *\n * For each variable, the prefix will be removed, and rest of the key will\n * be split by '_'. Each part will then be used as keys to build up a nested\n * config object structure. The treatment of the entire environment variable\n * is case-sensitive.\n *\n * The value of the variable should be JSON serialized, as it will be parsed\n * and the type will be kept intact. For example \"true\" and true are treated\n * differently, as well as \"42\" and 42.\n *\n * For example, to set the config app.title to \"My Title\", use the following:\n *\n * APP_CONFIG_app_title='\"My Title\"'\n *\n * @public\n */\nexport class EnvConfigSource implements ConfigSource {\n /**\n * Creates a new config source that reads from the environment.\n *\n * @param options - Options for the config source.\n * @returns A new config source that reads from the environment.\n */\n static create(options: EnvConfigSourceOptions): ConfigSource {\n return new EnvConfigSource(options?.env ?? process.env);\n }\n\n private constructor(\n private readonly env: { [name: string]: string | undefined },\n ) {}\n\n async *readConfigData(): AsyncConfigSourceGenerator {\n const configs = readEnvConfig(this.env);\n yield { configs };\n return;\n }\n\n toString() {\n const keys = Object.keys(this.env).filter(key =>\n key.startsWith('APP_CONFIG_'),\n );\n return `EnvConfigSource{count=${keys.length}}`;\n }\n}\n\nconst ENV_PREFIX = 'APP_CONFIG_';\n\n// Update the same pattern in config package if this is changed\nconst CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i;\n\n/**\n * Read runtime configuration from the environment.\n *\n * @remarks\n *\n * Only environment variables prefixed with APP_CONFIG_ will be considered.\n *\n * For each variable, the prefix will be removed, and rest of the key will\n * be split by '_'. Each part will then be used as keys to build up a nested\n * config object structure. The treatment of the entire environment variable\n * is case-sensitive.\n *\n * The value of the variable should be JSON serialized, as it will be parsed\n * and the type will be kept intact. For example \"true\" and true are treated\n * differently, as well as \"42\" and 42.\n *\n * For example, to set the config app.title to \"My Title\", use the following:\n *\n * APP_CONFIG_app_title='\"My Title\"'\n *\n * @public\n * @deprecated Use {@link EnvConfigSource} instead\n */\nexport function readEnvConfig(env: {\n [name: string]: string | undefined;\n}): AppConfig[] {\n let data: JsonObject | undefined = undefined;\n\n for (const [name, value] of Object.entries(env)) {\n if (!value) {\n continue;\n }\n if (name.startsWith(ENV_PREFIX)) {\n const key = name.replace(ENV_PREFIX, '');\n const keyParts = key.split('_');\n\n let obj = (data = data ?? {});\n for (const [index, part] of keyParts.entries()) {\n if (!CONFIG_KEY_PART_PATTERN.test(part)) {\n throw new TypeError(`Invalid env config key '${key}'`);\n }\n if (index < keyParts.length - 1) {\n obj = (obj[part] = obj[part] ?? {}) as JsonObject;\n if (typeof obj !== 'object' || Array.isArray(obj)) {\n const subKey = keyParts.slice(0, index + 1).join('_');\n throw new TypeError(\n `Could not nest config for key '${key}' under existing value '${subKey}'`,\n );\n }\n } else {\n if (part in obj) {\n throw new TypeError(\n `Refusing to override existing config at key '${key}'`,\n );\n }\n try {\n const [, parsedValue] = safeJsonParse(value);\n if (parsedValue === null) {\n throw new Error('value may not be null');\n }\n obj[part] = parsedValue;\n } catch (error) {\n throw new TypeError(\n `Failed to parse JSON-serialized config value for key '${key}', ${error}`,\n );\n }\n }\n }\n }\n }\n\n return data ? [{ data, context: 'env' }] : [];\n}\n\nfunction safeJsonParse(str: string): [Error | null, any] {\n try {\n return [null, JSON.parse(str)];\n } catch (err) {\n assertError(err);\n return [err, str];\n }\n}\n"],"names":["assertError"],"mappings":"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"}
1
+ {"version":3,"file":"EnvConfigSource.cjs.js","sources":["../../src/sources/EnvConfigSource.ts"],"sourcesContent":["/*\n * Copyright 2023 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 { AppConfig } from '@backstage/config';\nimport { assertError } from '@backstage/errors';\nimport { JsonObject } from '@backstage/types';\nimport { AsyncConfigSourceGenerator, ConfigSource } from './types';\n\n/**\n * Options for {@link EnvConfigSource.create}.\n *\n * @public\n */\nexport interface EnvConfigSourceOptions {\n /**\n * The environment variables to use, defaults to `process.env`.\n */\n env?: Record<string, string | undefined>;\n}\n\n/**\n * A config source that reads configuration from the environment.\n *\n * @remarks\n *\n * Only environment variables prefixed with APP_CONFIG_ will be considered.\n *\n * For each variable, the prefix will be removed, and rest of the key will\n * be split by '_'. Each part will then be used as keys to build up a nested\n * config object structure. The treatment of the entire environment variable\n * is case-sensitive.\n *\n * The value of the variable should be JSON serialized, as it will be parsed\n * and the type will be kept intact. For example \"true\" and true are treated\n * differently, as well as \"42\" and 42.\n *\n * For example, to set the config app.title to \"My Title\", use the following:\n *\n * APP_CONFIG_app_title='\"My Title\"'\n *\n * @public\n */\nexport class EnvConfigSource implements ConfigSource {\n /**\n * Creates a new config source that reads from the environment.\n *\n * @param options - Options for the config source.\n * @returns A new config source that reads from the environment.\n */\n static create(options: EnvConfigSourceOptions): ConfigSource {\n return new EnvConfigSource(options?.env ?? process.env);\n }\n\n private constructor(\n private readonly env: { [name: string]: string | undefined },\n ) {}\n\n async *readConfigData(): AsyncConfigSourceGenerator {\n const configs = readEnvConfig(this.env);\n yield { configs };\n return;\n }\n\n toString() {\n const keys = Object.keys(this.env).filter(key =>\n key.startsWith('APP_CONFIG_'),\n );\n return `EnvConfigSource{count=${keys.length}}`;\n }\n}\n\nconst ENV_PREFIX = 'APP_CONFIG_';\n\n// Update the same pattern in config package if this is changed\nconst CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_:][a-z0-9]+)*$/i;\n\n/**\n * Read runtime configuration from the environment.\n *\n * @remarks\n *\n * Only environment variables prefixed with APP_CONFIG_ will be considered.\n *\n * For each variable, the prefix will be removed, and rest of the key will\n * be split by '_'. Each part will then be used as keys to build up a nested\n * config object structure. The treatment of the entire environment variable\n * is case-sensitive.\n *\n * The value of the variable should be JSON serialized, as it will be parsed\n * and the type will be kept intact. For example \"true\" and true are treated\n * differently, as well as \"42\" and 42.\n *\n * For example, to set the config app.title to \"My Title\", use the following:\n *\n * APP_CONFIG_app_title='\"My Title\"'\n *\n * @public\n * @deprecated Use {@link EnvConfigSource} instead\n */\nexport function readEnvConfig(env: {\n [name: string]: string | undefined;\n}): AppConfig[] {\n let data: JsonObject | undefined = undefined;\n\n for (const [name, value] of Object.entries(env)) {\n if (!value) {\n continue;\n }\n if (name.startsWith(ENV_PREFIX)) {\n const key = name.replace(ENV_PREFIX, '');\n const keyParts = key.split('_');\n\n let obj = (data = data ?? {});\n for (const [index, part] of keyParts.entries()) {\n if (!CONFIG_KEY_PART_PATTERN.test(part)) {\n throw new TypeError(`Invalid env config key '${key}'`);\n }\n if (index < keyParts.length - 1) {\n obj = (obj[part] = obj[part] ?? {}) as JsonObject;\n if (typeof obj !== 'object' || Array.isArray(obj)) {\n const subKey = keyParts.slice(0, index + 1).join('_');\n throw new TypeError(\n `Could not nest config for key '${key}' under existing value '${subKey}'`,\n );\n }\n } else {\n if (part in obj) {\n throw new TypeError(\n `Refusing to override existing config at key '${key}'`,\n );\n }\n try {\n const [, parsedValue] = safeJsonParse(value);\n if (parsedValue === null) {\n throw new Error('value may not be null');\n }\n obj[part] = parsedValue;\n } catch (error) {\n throw new TypeError(\n `Failed to parse JSON-serialized config value for key '${key}', ${error}`,\n );\n }\n }\n }\n }\n }\n\n return data ? [{ data, context: 'env' }] : [];\n}\n\nfunction safeJsonParse(str: string): [Error | null, any] {\n try {\n return [null, JSON.parse(str)];\n } catch (err) {\n assertError(err);\n return [err, str];\n }\n}\n"],"names":["assertError"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/config-loader",
3
- "version": "1.10.3",
3
+ "version": "1.10.4",
4
4
  "description": "Config loading functionality used by Backstage backend, and CLI",
5
5
  "backstage": {
6
6
  "role": "node-library"
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@backstage/cli-common": "^0.1.15",
40
- "@backstage/config": "^1.3.3",
40
+ "@backstage/config": "^1.3.4",
41
41
  "@backstage/errors": "^1.2.7",
42
42
  "@backstage/types": "^1.2.2",
43
43
  "@types/json-schema": "^7.0.6",
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "devDependencies": {
56
56
  "@backstage/backend-test-utils": "^1.9.0",
57
- "@backstage/cli": "^0.34.2",
57
+ "@backstage/cli": "^0.34.3",
58
58
  "@types/json-schema-merge-allof": "^0.6.0",
59
59
  "@types/minimist": "^1.2.5",
60
60
  "msw": "^1.0.0",