util: opt to escape quotes for input list

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax
2023-02-18 01:02:56 +01:00
parent 4d9d62d542
commit 44b1545abd
2 changed files with 29 additions and 14 deletions

View File

@@ -69,16 +69,22 @@ describe('getInputList', () => {
it('multiline and ignoring comma correctly', async () => { it('multiline and ignoring comma correctly', async () => {
setInput('cache-from', 'user/app:cache\ntype=local,src=path/to/dir'); setInput('cache-from', 'user/app:cache\ntype=local,src=path/to/dir');
const res = Util.getInputList('cache-from', true); const res = Util.getInputList('cache-from', {ignoreComma: true});
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']); expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
}); });
it('different new lines and ignoring comma correctly', async () => { it('different new lines and ignoring comma correctly', async () => {
setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir'); setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir');
const res = Util.getInputList('cache-from', true); const res = Util.getInputList('cache-from', {ignoreComma: true});
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']); expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
}); });
it('escape surrounding quotes', async () => {
setInput('platforms', 'linux/amd64\n"linux/arm64,linux/arm/v7"');
const res = Util.getInputList('platforms', {escapeQuotes: true});
expect(res).toEqual(['linux/amd64', 'linux/arm64', 'linux/arm/v7']);
});
it('multiline values', async () => { it('multiline values', async () => {
setInput( setInput(
'secrets', 'secrets',
@@ -88,7 +94,7 @@ bbbbbbb
ccccccccc" ccccccccc"
FOO=bar` FOO=bar`
); );
const res = Util.getInputList('secrets', true); const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([ expect(res).toEqual([
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
`MYSECRET=aaaaaaaa `MYSECRET=aaaaaaaa
@@ -111,7 +117,7 @@ FOO=bar
bbbb bbbb
ccc"` ccc"`
); );
const res = Util.getInputList('secrets', true); const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([ expect(res).toEqual([
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
`MYSECRET=aaaaaaaa `MYSECRET=aaaaaaaa
@@ -134,7 +140,7 @@ bbbbbbb
ccccccccc ccccccccc
FOO=bar` FOO=bar`
); );
const res = Util.getInputList('secrets', true); const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual(['GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'MYSECRET=aaaaaaaa', 'bbbbbbb', 'ccccccccc', 'FOO=bar']); expect(res).toEqual(['GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'MYSECRET=aaaaaaaa', 'bbbbbbb', 'ccccccccc', 'FOO=bar']);
}); });
@@ -145,7 +151,7 @@ FOO=bar`
`"GPG_KEY=${pgp}" `"GPG_KEY=${pgp}"
FOO=bar` FOO=bar`
); );
const res = Util.getInputList('secrets', true); const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([`GPG_KEY=${pgp}`, 'FOO=bar']); expect(res).toEqual([`GPG_KEY=${pgp}`, 'FOO=bar']);
}); });
@@ -158,7 +164,7 @@ bbbb""bbb
ccccccccc" ccccccccc"
FOO=bar` FOO=bar`
); );
const res = Util.getInputList('secrets', true); const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([ expect(res).toEqual([
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
`MYSECRET=aaaaaaaa `MYSECRET=aaaaaaaa

View File

@@ -17,8 +17,13 @@
import * as core from '@actions/core'; import * as core from '@actions/core';
import {parse} from 'csv-parse/sync'; import {parse} from 'csv-parse/sync';
export interface InputListOpts {
ignoreComma?: boolean;
escapeQuotes?: boolean;
}
export class Util { export class Util {
public static getInputList(name: string, ignoreComma?: boolean): string[] { public static getInputList(name: string, opts?: InputListOpts): string[] {
const res: Array<string> = []; const res: Array<string> = [];
const items = core.getInput(name); const items = core.getInput(name);
@@ -31,18 +36,22 @@ export class Util {
relaxQuotes: true, relaxQuotes: true,
comment: '#', comment: '#',
relaxColumnCount: true, relaxColumnCount: true,
skipEmptyLines: true skipEmptyLines: true,
quote: opts?.escapeQuotes ?? `"`
}); });
for (const record of records as Array<string[]>) { for (const record of records as Array<string[]>) {
if (record.length == 1) { if (record.length == 1) {
res.push(record[0]); if (opts?.ignoreComma) {
continue; res.push(record[0]);
} else if (!ignoreComma) { } else {
res.push(...record[0].split(','));
}
} else if (!opts?.ignoreComma) {
res.push(...record); res.push(...record);
continue; } else {
res.push(record.join(','));
} }
res.push(record.join(','));
} }
return res.filter(item => item).map(pat => pat.trim()); return res.filter(item => item).map(pat => pat.trim());