diff --git a/__tests__/meta.test.ts b/__tests__/meta.test.ts index 5b1efff..573a888 100644 --- a/__tests__/meta.test.ts +++ b/__tests__/meta.test.ts @@ -76,6 +76,27 @@ describe('isRawStatement', () => { }); }); +describe('global expressions', () => { + test('throws for unknown global expression', async () => { + process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', 'event_push_master.env'))); + const toolkit = new Toolkit(); + const repo = await toolkit.github.repoData(); + const context = await getContext(ContextSource.workflow, toolkit); + + expect(() => { + new Meta( + { + ...getInputs(), + images: ['user/app'], + tags: [`type=raw,value=latest,enable={{is_prerelease}}`] + }, + context, + repo + ); + }).toThrow('{{is_prerelease}} is not a valid global expression'); + }); +}); + const tagsLabelsTest = async (name: string, envFile: string, inputs: Inputs, exVersion: Version, exTags: Array, exLabels: Array, exAnnotations: Array | undefined) => { process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile))); const toolkit = new Toolkit(); diff --git a/src/meta.ts b/src/meta.ts index 33c0d3e..c07e054 100644 --- a/src/meta.ts +++ b/src/meta.ts @@ -400,7 +400,7 @@ export class Meta { const context = this.context; const currentDate = this.date; const commitDate = this.context.commitDate; - return handlebars.compile(val)({ + const globalExp = { branch: function () { if (!/^refs\/heads\//.test(context.ref)) { return ''; @@ -480,7 +480,19 @@ export class Meta { }); return m.tz(tz).format(format); } - }); + }; + const expressions = Object.keys(globalExp); + const template = handlebars.parseWithoutProcessing(val); + for (const node of template.body) { + const statement = node as {type: string; path?: {type: string; original: string}}; + if (statement.type !== 'MustacheStatement' || statement.path?.type !== 'PathExpression') { + continue; + } + if (!expressions.includes(statement.path.original)) { + throw new Error(`{{${statement.path.original}}} is not a valid global expression`); + } + } + return handlebars.compile(val)(globalExp); } private getImageNames(): Array {