Skip to content

Commit e63ab54

Browse files
committed
support extending templates with include
1 parent 38976fa commit e63ab54

4 files changed

Lines changed: 160 additions & 43 deletions

File tree

src/create-commit.ts

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,7 @@ import fs from 'node:fs';
44
import { join } from 'node:path';
55

66
import type { Arguments, TreePart } from './types';
7-
8-
const templates: Record<string, string[]> = {
9-
'composite-action': ['action.{yml,yaml}', 'LICENSE'],
10-
'javascript-action': ['action.{yml,yaml}', 'dist/**', 'LICENSE'],
11-
};
12-
13-
const extractNames = (input: string) =>
14-
input
15-
.split('\n')
16-
.map(name => {
17-
const trimmed = name.trim();
18-
if (trimmed.endsWith('/')) return trimmed + '**';
19-
return trimmed;
20-
})
21-
.filter(name => name);
22-
23-
const getIncludePatterns = ({ template, include }: Pick<Arguments, 'include' | 'template'>) => {
24-
if (template) {
25-
if (!templates[template]) throw new Error(`'${template}' is not a valid template`);
26-
return templates[template];
27-
}
28-
29-
const list = extractNames(include);
30-
31-
if (list.length) return list;
32-
return ['**/*'];
33-
};
34-
35-
const getExcludePatterns = async (exclude: string) => {
36-
if (exclude) {
37-
return extractNames(exclude);
38-
}
39-
40-
if (!fs.existsSync('.gvrignore')) return [];
41-
42-
const ignoreFile = await fs.promises.readFile('.gvrignore', 'utf8');
43-
return extractNames(ignoreFile);
44-
};
7+
import { getExcludePatterns, getIncludePatterns } from './glob-patterns';
458

469
export const createCommit = async ({ template, include, exclude, version }: Arguments, octokit: Octokit): Promise<string> => {
4710
// Determine which files to include

src/glob-patterns.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import fs from 'node:fs';
2+
3+
import type { Arguments } from './types';
4+
5+
const templates: Record<string, string[]> = {
6+
'composite-action': ['action.{yml,yaml}', 'LICENSE'],
7+
'javascript-action': ['action.{yml,yaml}', 'dist/**', 'LICENSE'],
8+
};
9+
10+
const extractNames = (input: string) =>
11+
input
12+
.split('\n')
13+
.map(name => {
14+
const trimmed = name.trim();
15+
if (trimmed.endsWith('/')) return trimmed + '**';
16+
return trimmed;
17+
})
18+
.filter(name => name);
19+
20+
export const getIncludePatterns = ({ template, include }: Pick<Arguments, 'include' | 'template'>) => {
21+
const list = [];
22+
23+
if (template) {
24+
if (!templates[template]) throw new Error(`'${template}' is not a valid template`);
25+
list.push(...templates[template]);
26+
}
27+
28+
if (include) {
29+
list.push(...extractNames(include));
30+
}
31+
32+
33+
if (list.length) return list;
34+
return ['**/*'];
35+
};
36+
37+
export const getExcludePatterns = async (exclude: string) => {
38+
if (exclude) {
39+
return extractNames(exclude);
40+
}
41+
42+
if (!fs.existsSync('.gvrignore')) return [];
43+
44+
const ignoreFile = await fs.promises.readFile('.gvrignore', 'utf8');
45+
return extractNames(ignoreFile);
46+
};

test/glob-patterns.spec.ts

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { getIncludePatterns, getExcludePatterns } from '../src/glob-patterns';
2+
3+
jest.mock('node:fs', () => ({
4+
existsSync: jest.fn().mockReturnValue(false),
5+
}));
6+
7+
describe('glob patterns tests', () => {
8+
describe('getIncludePatterns tests', () => {
9+
it('returns a default pattern when neither template nor include are specified', () => {
10+
const args = { template: '', include: '' };
11+
12+
const result = getIncludePatterns(args);
13+
14+
expect(result).toEqual(['**/*']);
15+
});
16+
17+
it('returns a composite-action pattern when template is composite-action', () => {
18+
const args = { template: 'composite-action', include: '' };
19+
20+
const result = getIncludePatterns(args);
21+
22+
expect(result).toEqual(['action.{yml,yaml}', 'LICENSE']);
23+
});
24+
25+
it('returns a javascript-action pattern when template is javascript-action', () => {
26+
const args = { template: 'javascript-action', include: '' };
27+
28+
const result = getIncludePatterns(args);
29+
30+
expect(result).toEqual(['action.{yml,yaml}', 'dist/**', 'LICENSE']);
31+
});
32+
33+
it('throws an error when an invalid template is specified', () => {
34+
const args = { template: 'invalid-template', include: '' };
35+
36+
expect(() => getIncludePatterns(args)).toThrowError("'invalid-template' is not a valid template");
37+
});
38+
39+
it('returns a list of patterns when include is specified', () => {
40+
const args = {
41+
template: '',
42+
include: `
43+
README.md
44+
LICENSE
45+
46+
src/**
47+
dist/
48+
49+
!src/*.ts`,
50+
};
51+
52+
const result = getIncludePatterns(args);
53+
54+
expect(result).toEqual([
55+
'README.md',
56+
'LICENSE',
57+
'src/**',
58+
'dist/**',
59+
'!src/*.ts',
60+
]);
61+
});
62+
63+
it('extends the template with include patterns when both are specified', () => {
64+
const args = {
65+
template: 'javascript-action',
66+
include: `
67+
README.md
68+
!src/*.ts`,
69+
};
70+
71+
const result = getIncludePatterns(args);
72+
73+
expect(result).toEqual([
74+
'action.{yml,yaml}',
75+
'dist/**',
76+
'LICENSE',
77+
'README.md',
78+
'!src/*.ts',
79+
]);
80+
});
81+
});
82+
83+
describe('getExcludePatterns tests', () => {
84+
it('returns an empty array when no exclude is specified', async () => {
85+
const exclude = '';
86+
87+
const result = await getExcludePatterns(exclude);
88+
89+
expect(result).toEqual([]);
90+
});
91+
92+
it('returns a list of patterns when exclude is specified', async () => {
93+
const exclude = `
94+
README.md
95+
LICENSE
96+
97+
src/**
98+
dist/
99+
100+
!src/*.ts`;
101+
102+
const result = await getExcludePatterns(exclude);
103+
104+
expect(result).toEqual([
105+
'README.md',
106+
'LICENSE',
107+
'src/**',
108+
'dist/**',
109+
'!src/*.ts',
110+
]);
111+
});
112+
});
113+
});

test/version.spec.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)