Skip to content

Commit 73876c5

Browse files
authored
feat(core): allow keep var syntax in yaml via escaping character (#262)
* feat: allow envvar syntax in yaml to be retained via escaping chars * test on apisix 3.12 * prevent conflict
1 parent 1189c43 commit 73876c5

3 files changed

Lines changed: 20 additions & 6 deletions

File tree

.github/workflows/e2e.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ jobs:
2323
- 3.9.1
2424
- 3.10.0
2525
- 3.11.0
26+
- 3.12.0
2627
env:
2728
BACKEND_APISIX_VERSION: ${{ matrix.version }}
2829
BACKEND_APISIX_IMAGE: ${{ matrix.version }}-debian

apps/cli/src/command/utils.spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ describe('CLI utils', () => {
267267
},
268268
],
269269
},
270+
{
271+
name: 'Test escape \\${NAME}',
272+
},
270273
],
271274
consumers: [
272275
{
@@ -322,6 +325,9 @@ describe('CLI utils', () => {
322325
name: 'Test name',
323326
routes: [{ name: 'Test name', uris: ['/test/name'] }],
324327
},
328+
{
329+
name: 'Test escape ${NAME}',
330+
},
325331
],
326332
ssls: [
327333
{

apps/cli/src/command/utils.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,21 @@ export const recursiveReplaceEnvVars = (
284284
dataSource = process.env,
285285
): ADCSDK.Configuration => {
286286
const envVarRegex = /\$\{(\w+)\}/g;
287+
const escapedVarRegex = /\\\$\{(\w+)\}/g;
288+
const placeholder = '__ESCAPED_ENV_VAR_PLACEHOLDER__';
287289
const replaceValue = (value: unknown): unknown => {
288-
if (typeof value === 'string')
289-
return value.replace(
290-
envVarRegex,
291-
(_, envVar) => dataSource?.[envVar] || '',
292-
);
290+
if (typeof value !== 'string') return value;
293291

294-
return value;
292+
const escaped = value.replace(escapedVarRegex, (_, envVar) => {
293+
return `${placeholder}${envVar}${placeholder}`;
294+
});
295+
const replaced = escaped.replace(envVarRegex, (_, envVar) => {
296+
return dataSource?.[envVar] || '';
297+
});
298+
return replaced.replace(
299+
new RegExp(`${placeholder}(\\w+)${placeholder}`, 'g'),
300+
(_, envVar) => `\${${envVar}}`,
301+
);
295302
};
296303

297304
const recurseReplace = (value: unknown): unknown =>

0 commit comments

Comments
 (0)