@public-ui/visual-tests 1.7.0-rc.8 → 1.7.0

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.
Files changed (61) hide show
  1. package/README.md +25 -140
  2. package/package.json +48 -45
  3. package/playwright.config.js +59 -0
  4. package/src/index.js +80 -0
  5. package/tests/axe-snapshots.spec.js +82 -0
  6. package/tests/sample-app.routes.js +387 -0
  7. package/tests/theme-snapshots.spec.js +70 -0
  8. package/src/index.ts +0 -33
  9. package/src/migrate/index.ts +0 -127
  10. package/src/migrate/runner/abstract-task.ts +0 -64
  11. package/src/migrate/runner/task-runner.ts +0 -163
  12. package/src/migrate/runner/tasks/common/GenericRenamePropertyTask.ts +0 -85
  13. package/src/migrate/runner/tasks/common/LabelExpertSlot.ts +0 -96
  14. package/src/migrate/runner/tasks/common/RemovePropertyNameTask.ts +0 -104
  15. package/src/migrate/runner/tasks/common/RenamePropertyNameTask.ts +0 -31
  16. package/src/migrate/runner/tasks/test/index.ts +0 -16
  17. package/src/migrate/runner/tasks/test/test-dummy.ts +0 -20
  18. package/src/migrate/runner/tasks/test/test-version-1.3.ts +0 -7
  19. package/src/migrate/runner/tasks/test/test-version-current.ts +0 -7
  20. package/src/migrate/runner/tasks/test/test-version-next-2.ts +0 -7
  21. package/src/migrate/runner/tasks/test/test-version-next-3.ts +0 -7
  22. package/src/migrate/runner/tasks/test/test-version-zero.ts +0 -7
  23. package/src/migrate/runner/tasks/v1/abbr.ts +0 -3
  24. package/src/migrate/runner/tasks/v1/accordion.ts +0 -3
  25. package/src/migrate/runner/tasks/v1/badge.ts +0 -6
  26. package/src/migrate/runner/tasks/v1/breadcrumb.ts +0 -3
  27. package/src/migrate/runner/tasks/v1/button-link.ts +0 -6
  28. package/src/migrate/runner/tasks/v1/button.ts +0 -8
  29. package/src/migrate/runner/tasks/v1/card.ts +0 -4
  30. package/src/migrate/runner/tasks/v1/details.ts +0 -3
  31. package/src/migrate/runner/tasks/v1/icon.ts +0 -5
  32. package/src/migrate/runner/tasks/v1/index.ts +0 -151
  33. package/src/migrate/runner/tasks/v1/input-checkbox.ts +0 -3
  34. package/src/migrate/runner/tasks/v1/input-color.ts +0 -3
  35. package/src/migrate/runner/tasks/v1/input-date.ts +0 -3
  36. package/src/migrate/runner/tasks/v1/input-email.ts +0 -3
  37. package/src/migrate/runner/tasks/v1/input-number.ts +0 -4
  38. package/src/migrate/runner/tasks/v1/input-radio.ts +0 -3
  39. package/src/migrate/runner/tasks/v1/input-range.ts +0 -3
  40. package/src/migrate/runner/tasks/v1/input-text.ts +0 -3
  41. package/src/migrate/runner/tasks/v1/link-button.ts +0 -15
  42. package/src/migrate/runner/tasks/v1/link-group.ts +0 -7
  43. package/src/migrate/runner/tasks/v1/link.ts +0 -15
  44. package/src/migrate/runner/tasks/v1/logo.ts +0 -3
  45. package/src/migrate/runner/tasks/v1/modal.ts +0 -3
  46. package/src/migrate/runner/tasks/v1/nav.ts +0 -7
  47. package/src/migrate/runner/tasks/v1/pagination.ts +0 -3
  48. package/src/migrate/runner/tasks/v1/progress.ts +0 -3
  49. package/src/migrate/runner/tasks/v1/quote.ts +0 -3
  50. package/src/migrate/runner/tasks/v1/select.ts +0 -4
  51. package/src/migrate/runner/tasks/v1/skip-nav.ts +0 -3
  52. package/src/migrate/runner/tasks/v1/span.ts +0 -3
  53. package/src/migrate/runner/tasks/v1/split-button.ts +0 -3
  54. package/src/migrate/runner/tasks/v1/table.ts +0 -3
  55. package/src/migrate/runner/tasks/v1/tabs.ts +0 -4
  56. package/src/migrate/runner/tasks/v1/toast.ts +0 -3
  57. package/src/migrate/runner/tasks/v1/version.ts +0 -3
  58. package/src/migrate/runner/types.ts +0 -2
  59. package/src/migrate/shares/reuse.ts +0 -182
  60. package/src/migrate/types.ts +0 -2
  61. package/src/types.ts +0 -23
@@ -0,0 +1,387 @@
1
+ export const ROUTES = new Map();
2
+
3
+ /**
4
+ * Actually we support the following options:
5
+ *
6
+ * Details: https://playwright.dev/docs/api/class-pageassertions#page-assertions-to-have-screenshot-1
7
+ * - fullPage: boolean (Default: true)
8
+ * - maxDiffPixelRatio: number (Default: undefined)
9
+ * - maxDiffPixels: number (Default: undefined)
10
+ * - threshold: number (Default: undefined)
11
+ * - timeout: number (Default: 0)
12
+ *
13
+ * To set the viewport size, use the following options:
14
+ * - viewportSize: { width, height } (Default: 800x600)
15
+ *
16
+ */
17
+
18
+ ROUTES.set('handout/basic', {
19
+ viewportSize: {
20
+ width: 1920,
21
+ height: 1280,
22
+ },
23
+ waitForTimeout: 500,
24
+ });
25
+ ROUTES.set('abbr/basic', {
26
+ axe: {
27
+ skipFailures: false,
28
+ },
29
+ });
30
+ ROUTES.set('accordion/basic', null);
31
+ ROUTES.set('accordion/header', {
32
+ axe: {
33
+ skipFailures: false,
34
+ },
35
+ });
36
+ ROUTES.set('accordion/headlines', {
37
+ axe: {
38
+ skipFailures: false,
39
+ },
40
+ });
41
+ ROUTES.set('accordion/list', {
42
+ axe: {
43
+ skipFailures: false,
44
+ },
45
+ });
46
+ ROUTES.set('alert/basic', {
47
+ axe: {
48
+ skipFailures: false,
49
+ },
50
+ });
51
+ ROUTES.set('alert/card-msg', {
52
+ axe: {
53
+ skipFailures: false,
54
+ },
55
+ });
56
+ ROUTES.set('alert/html', {
57
+ axe: {
58
+ skipFailures: false,
59
+ },
60
+ });
61
+ ROUTES.set('avatar/basic', {
62
+ axe: {
63
+ skipFailures: false,
64
+ },
65
+ });
66
+ ROUTES.set('badge/basic', null);
67
+ ROUTES.set('badge/button', null);
68
+ ROUTES.set('breadcrumb/basic', {
69
+ axe: {
70
+ skipFailures: false,
71
+ },
72
+ });
73
+ ROUTES.set('button-group/basic', {
74
+ axe: {
75
+ skipFailures: false,
76
+ },
77
+ });
78
+ ROUTES.set('button-link/basic', {
79
+ axe: {
80
+ skipFailures: false,
81
+ },
82
+ });
83
+ ROUTES.set('button-link/icons', {
84
+ axe: {
85
+ skipFailures: false,
86
+ },
87
+ });
88
+ ROUTES.set('button-link/image', {
89
+ axe: {
90
+ skipFailures: false,
91
+ },
92
+ });
93
+ ROUTES.set('button/basic', {
94
+ axe: {
95
+ skipFailures: false,
96
+ },
97
+ });
98
+ ROUTES.set('button/hide-label', {
99
+ axe: {
100
+ skipFailures: false,
101
+ },
102
+ });
103
+ ROUTES.set('button/icons', {
104
+ axe: {
105
+ skipFailures: false,
106
+ },
107
+ });
108
+ ROUTES.set('button/width', {
109
+ axe: {
110
+ skipFailures: false,
111
+ },
112
+ });
113
+ ROUTES.set('card/basic', {
114
+ axe: {
115
+ skipFailures: false,
116
+ },
117
+ });
118
+ ROUTES.set('card/confirm', {
119
+ axe: {
120
+ skipFailures: false,
121
+ },
122
+ });
123
+ ROUTES.set('card/flex', {
124
+ axe: {
125
+ skipFailures: false,
126
+ },
127
+ });
128
+ ROUTES.set('card/selection', {
129
+ axe: {
130
+ skipFailures: false,
131
+ },
132
+ });
133
+ ROUTES.set('details/basic', {
134
+ axe: {
135
+ skipFailures: false,
136
+ },
137
+ });
138
+ ROUTES.set('heading/badge', {
139
+ axe: {
140
+ skipFailures: false,
141
+ },
142
+ });
143
+ ROUTES.set('heading/basic', {
144
+ axe: {
145
+ skipFailures: false,
146
+ },
147
+ });
148
+ ROUTES.set('heading/paragraph', {
149
+ axe: {
150
+ skipFailures: false,
151
+ },
152
+ });
153
+ ROUTES.set('icon/basic', {
154
+ axe: {
155
+ skipFailures: false,
156
+ },
157
+ });
158
+ ROUTES.set('image/basic', {
159
+ axe: {
160
+ skipFailures: false,
161
+ },
162
+ });
163
+ ROUTES.set('indented-text/basic', {
164
+ axe: {
165
+ skipFailures: false,
166
+ },
167
+ });
168
+ ROUTES.set('input-checkbox/basic', null);
169
+ ROUTES.set('input-checkbox/button', null);
170
+ ROUTES.set('input-checkbox/switch', null);
171
+ ROUTES.set('input-color/basic', null);
172
+ ROUTES.set('input-date/basic', null);
173
+ ROUTES.set('input-email/basic', null);
174
+ ROUTES.set('input-file/basic', null);
175
+ ROUTES.set('input-number/basic', null);
176
+ ROUTES.set('input-password/basic', null);
177
+ ROUTES.set('input-password/show-password', null);
178
+ ROUTES.set('input-radio/basic', null);
179
+ ROUTES.set('input-radio/horizontal', null);
180
+ ROUTES.set('input-radio/select', null);
181
+ ROUTES.set('input-range/basic', null);
182
+ ROUTES.set('input-text/basic', null);
183
+ ROUTES.set('input-text/blur', null);
184
+ ROUTES.set('input-text/focus', null);
185
+ ROUTES.set('kolibri/animated', {
186
+ axe: {
187
+ skipFailures: false,
188
+ },
189
+ });
190
+ ROUTES.set('kolibri/basic', {
191
+ axe: {
192
+ skipFailures: false,
193
+ },
194
+ });
195
+ ROUTES.set('kolibri/no-label', {
196
+ axe: {
197
+ skipFailures: false,
198
+ },
199
+ });
200
+ ROUTES.set('link-button/basic', {
201
+ axe: {
202
+ skipFailures: false,
203
+ },
204
+ });
205
+ ROUTES.set('link-group/basic', {
206
+ axe: {
207
+ skipFailures: false,
208
+ },
209
+ });
210
+ ROUTES.set('link-group/horizontal', {
211
+ axe: {
212
+ skipFailures: false,
213
+ },
214
+ });
215
+ ROUTES.set('link/basic', {
216
+ axe: {
217
+ skipFailures: false,
218
+ },
219
+ });
220
+ ROUTES.set('link/icons', {
221
+ axe: {
222
+ skipFailures: false,
223
+ },
224
+ });
225
+ ROUTES.set('link/image', {
226
+ axe: {
227
+ skipFailures: false,
228
+ },
229
+ });
230
+ ROUTES.set('link/target', {
231
+ axe: {
232
+ skipFailures: false,
233
+ },
234
+ });
235
+ ROUTES.set('logo/basic', {
236
+ axe: {
237
+ skipFailures: false,
238
+ },
239
+ });
240
+ ROUTES.set('modal/basic', {
241
+ axe: {
242
+ skipFailures: false,
243
+ },
244
+ });
245
+ ROUTES.set('nav/active', {
246
+ axe: {
247
+ skipFailures: false,
248
+ },
249
+ });
250
+ ROUTES.set('nav/aria-current', {
251
+ axe: {
252
+ skipFailures: false,
253
+ },
254
+ });
255
+ ROUTES.set('nav/basic', null);
256
+ ROUTES.set('nav/horizontal', {
257
+ axe: {
258
+ skipFailures: false,
259
+ },
260
+ });
261
+ ROUTES.set('pagination/basic', {
262
+ axe: {
263
+ skipFailures: false,
264
+ },
265
+ });
266
+ ROUTES.set('popover/basic', {
267
+ axe: {
268
+ skipFailures: false,
269
+ },
270
+ });
271
+ ROUTES.set('progress/basic', {
272
+ axe: {
273
+ skipFailures: false,
274
+ },
275
+ });
276
+ ROUTES.set('quote/basic', {
277
+ axe: {
278
+ skipFailures: false,
279
+ },
280
+ });
281
+ ROUTES.set('quote/block', {
282
+ axe: {
283
+ skipFailures: false,
284
+ },
285
+ });
286
+ ROUTES.set('select/basic', null);
287
+ ROUTES.set('skip-nav/basic', {
288
+ axe: {
289
+ skipFailures: false,
290
+ },
291
+ });
292
+ ROUTES.set('spin/basic', {
293
+ axe: {
294
+ skipFailures: false,
295
+ },
296
+ });
297
+ ROUTES.set('spin/custom', {
298
+ axe: {
299
+ skipFailures: false,
300
+ },
301
+ });
302
+ ROUTES.set('spin/cycle', {
303
+ axe: {
304
+ skipFailures: false,
305
+ },
306
+ });
307
+ ROUTES.set('split-button/basic', {
308
+ axe: {
309
+ skipFailures: false,
310
+ },
311
+ });
312
+ ROUTES.set('table/badge-size', {
313
+ axe: {
314
+ skipFailures: false,
315
+ },
316
+ });
317
+ ROUTES.set('table/render-cell', {
318
+ axe: {
319
+ skipFailures: false,
320
+ },
321
+ });
322
+ ROUTES.set('table/sort-data', {
323
+ axe: {
324
+ skipFailures: false,
325
+ },
326
+ });
327
+ ROUTES.set('tabs/basic', {
328
+ axe: {
329
+ skipFailures: false,
330
+ },
331
+ });
332
+ ROUTES.set('tabs/icons-only', {
333
+ axe: {
334
+ skipFailures: false,
335
+ },
336
+ });
337
+ ROUTES.set('textarea/adjust-height', {
338
+ axe: {
339
+ skipFailures: false,
340
+ },
341
+ });
342
+ ROUTES.set('textarea/basic', null);
343
+ ROUTES.set('textarea/disabled', {
344
+ axe: {
345
+ skipFailures: false,
346
+ },
347
+ });
348
+ ROUTES.set('textarea/placeholder', {
349
+ axe: {
350
+ skipFailures: false,
351
+ },
352
+ });
353
+ ROUTES.set('textarea/readonly', {
354
+ axe: {
355
+ skipFailures: false,
356
+ },
357
+ });
358
+ ROUTES.set('textarea/resize', {
359
+ axe: {
360
+ skipFailures: false,
361
+ },
362
+ });
363
+ ROUTES.set('textarea/rows', {
364
+ axe: {
365
+ skipFailures: false,
366
+ },
367
+ });
368
+ ROUTES.set('textarea/with-counter', {
369
+ axe: {
370
+ skipFailures: false,
371
+ },
372
+ });
373
+ ROUTES.set('toast/basic', {
374
+ axe: {
375
+ skipFailures: false,
376
+ },
377
+ });
378
+ ROUTES.set('version/basic', {
379
+ axe: {
380
+ skipFailures: false,
381
+ },
382
+ });
383
+ ROUTES.set('version/context', {
384
+ axe: {
385
+ skipFailures: false,
386
+ },
387
+ });
@@ -0,0 +1,70 @@
1
+ import { test, expect } from '@playwright/test';
2
+ import { ROUTES } from './sample-app.routes.js';
3
+
4
+ // https://github.com/microsoft/playwright/issues/7575#issuecomment-1288164474
5
+ export const configureSnapshotPath =
6
+ () =>
7
+ // eslint-disable-next-line no-empty-pattern
8
+ ({}, testInfo) => {
9
+ const originalSnapshotPath = testInfo.snapshotPath;
10
+ testInfo.snapshotPath = (snapshotName) => {
11
+ const result = originalSnapshotPath
12
+ .apply(testInfo, [snapshotName])
13
+
14
+ // Remove browser name from snapshot name
15
+ // .replace('-chromium', '')
16
+ // .replace('-firefox', '')
17
+
18
+ // Remove os name from snapshot name
19
+ // .replace('-darwin', '')
20
+ // .replace('-linux', '')
21
+ // .replace('-windows', '')
22
+
23
+ // Remove test counter from snapshot name
24
+ .replace('-1-', '-')
25
+
26
+ // Make different snapshot folder for different themes
27
+ .replace('theme-snapshots.spec.js', `theme-${process.env.THEME_EXPORT.toLocaleLowerCase()}`)
28
+ .replace('-snapshots', '');
29
+ return result;
30
+ };
31
+ };
32
+
33
+ test.beforeEach(configureSnapshotPath());
34
+
35
+ // https://playwright.dev/docs/emulation
36
+ test.use({
37
+ colorScheme: 'light',
38
+ locale: 'de-DE',
39
+ isMobile: false,
40
+ timezoneId: 'Europe/Berlin',
41
+ viewport: {
42
+ width: 800,
43
+ height: 0,
44
+ },
45
+ });
46
+
47
+ /**
48
+ * @todo stabilize and re-enable test
49
+ */
50
+ const blocklist = [];
51
+
52
+ ROUTES.forEach((options, route) => {
53
+ if (blocklist.includes(route)) {
54
+ return;
55
+ }
56
+ test(`snapshot for ${route}`, async ({ page }) => {
57
+ await page.goto(`/#${route}?hideMenus`, { waitUntil: 'networkidle' });
58
+ if (options?.viewportSize) {
59
+ await page.setViewportSize(options.viewportSize);
60
+ }
61
+ if (options?.waitForTimeout) {
62
+ await page.waitForTimeout(options.waitForTimeout);
63
+ }
64
+ await expect(page).toHaveScreenshot({
65
+ fullPage: true,
66
+ maxDiffPixelRatio: 0.025,
67
+ ...options,
68
+ });
69
+ });
70
+ });
package/src/index.ts DELETED
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { Command } from 'commander';
4
- import gradient from 'gradient-string';
5
-
6
- import migrate from './migrate';
7
- import { getVersionOfPublicUiKoliBriCli } from './migrate/shares/reuse';
8
-
9
- const versionOfPublicUiKoliBriCli = getVersionOfPublicUiKoliBriCli();
10
-
11
- const banner = gradient.atlas.multiline(
12
- `
13
- ,--. ,--. ,--. ,--. ,-----. ,--.
14
- | .' / ,---. | | \`--' | |) /_ ,--.--. \`--'
15
- | . ' | .-. | | | ,--. | .-. \\ | .--' ,--.
16
- | |\\ \\ | '-' | | | | | | '--' / | | | |
17
- \`--' \`--´ \`---´ \`--' \`--' \`------´ \`--' \`--'
18
- 🚹 The accessible HTML-Standard | 👉 https://public-ui.github.io | ${versionOfPublicUiKoliBriCli}
19
- `,
20
- {
21
- interpolation: 'hsv',
22
- },
23
- );
24
- console.log(banner);
25
-
26
- const program = new Command();
27
-
28
- program.name('kolibri').description('CLI for executing some helpful commands for KoliBri projects.').version(versionOfPublicUiKoliBriCli);
29
-
30
- // Add commands
31
- migrate(program);
32
-
33
- program.parse();
@@ -1,127 +0,0 @@
1
- import { exec } from 'child_process';
2
- import { Command, Option } from 'commander';
3
- import fs from 'fs';
4
- import path from 'path';
5
-
6
- import { Configuration } from '../types';
7
- import { TaskRunner } from './runner/task-runner';
8
- import { testTasks } from './runner/tasks/test';
9
- import { v1Tasks } from './runner/tasks/v1';
10
- import {
11
- getContentOfProjectPkgJson,
12
- getPackageManagerInstallCommand,
13
- getVersionOfPublicUiComponents,
14
- getVersionOfPublicUiKoliBriCli,
15
- logAndCreateError,
16
- MODIFIED_FILES,
17
- setRemoveMode,
18
- } from './shares/reuse';
19
- import { REMOVE_MODE, RemoveMode } from './types';
20
-
21
- type MigrateOption = {
22
- ignoreUncommittedChanges: boolean;
23
- removeMode: RemoveMode;
24
- testTasks: boolean;
25
- };
26
-
27
- /**
28
- * This function is used to register the migrate command.
29
- * @param {Command} program The program object to register the command
30
- */
31
- export default function (program: Command): void {
32
- program
33
- .command('migrate')
34
- .description('This command migrates KoliBri code to the current version.')
35
- .argument('[string]', 'Source code folder to migrate', 'src')
36
- .addOption(new Option('--ignore-uncommitted-changes', 'Allows execution with uncommitted changes').default(false))
37
- .addOption(new Option('--remove-mode <mode>', 'Prefix property name or delete property').choices(REMOVE_MODE).default('prefix'))
38
- .addOption(new Option('--test-tasks', 'Run additional test tasks').default(false).hideHelp())
39
- .action((baseDir: string, options: MigrateOption) => {
40
- exec('git status --porcelain', (err, stdout) => {
41
- if (err) {
42
- console.error(`exec error: ${err.message}`);
43
- return;
44
- }
45
-
46
- if (!options.ignoreUncommittedChanges && stdout) {
47
- throw logAndCreateError('There are uncommitted changes');
48
- }
49
-
50
- setRemoveMode(options.removeMode);
51
-
52
- const versionOfPublicUiComponents = getVersionOfPublicUiComponents();
53
- const versionOfPublicUiKoliBriCli = getVersionOfPublicUiKoliBriCli();
54
-
55
- console.log(`
56
- Current version of @public-ui/components: ${versionOfPublicUiComponents}
57
- Source folder to migrate: ${baseDir}
58
- `);
59
-
60
- const configFile = path.resolve(process.cwd(), '.kolibri.config.json');
61
- let config: Configuration = {};
62
- if (fs.existsSync(configFile)) {
63
- try {
64
- config = JSON.parse(fs.readFileSync(configFile, 'utf8')) as Configuration;
65
- } catch (e) {
66
- // ignore
67
- }
68
- }
69
-
70
- const runner = new TaskRunner(baseDir, versionOfPublicUiKoliBriCli, versionOfPublicUiComponents, config);
71
- runner.registerTasks(v1Tasks);
72
-
73
- if (options.testTasks) {
74
- runner.registerTasks(testTasks);
75
- }
76
-
77
- let version = versionOfPublicUiComponents;
78
-
79
- /**
80
- * Runs the task runner in a loop until all tasks are completed.
81
- */
82
- function runLoop() {
83
- runner.run();
84
- if (version !== runner.getPendingMinVersion()) {
85
- version = runner.getPendingMinVersion();
86
- let packageJson = getContentOfProjectPkgJson();
87
- packageJson = packageJson.replace(/"(@public-ui\/[^"]+)":\s*".*"/g, `"$1": "${version}"`);
88
- fs.writeFileSync(path.resolve(process.cwd(), 'package.json'), packageJson);
89
- runner.setProjectVersion(version);
90
-
91
- console.log(`- Update @public-ui/* to version ${version}`);
92
- exec(getPackageManagerInstallCommand(), (err) => {
93
- if (err) {
94
- console.error(`exec error: ${err.message}`);
95
- return;
96
- }
97
- runLoop();
98
- });
99
- } else {
100
- console.log(`
101
- Status of all executed Tasks:`);
102
-
103
- const status = runner.getStatus(true);
104
- fs.writeFileSync(configFile, JSON.stringify(status.config, null, 2));
105
-
106
- console.log(`
107
- Modified files: ${MODIFIED_FILES.size}`);
108
- MODIFIED_FILES.forEach((file) => {
109
- console.log(`- ${file}`);
110
- });
111
-
112
- console.log(`
113
- After the code migration has gone through, the code formatting may no longer be as desired. Therefore, please reformat your code afterwards if necessary.
114
-
115
- Afterwards, it may be that functions or themes in newer major versions have changed or are no longer included. This should be checked finally and corrected manually if necessary.
116
-
117
- Is anything wrong, you can reset the migration with "git reset --hard HEAD~1" or by discarding the affected files. For more information read the troubleshooting section in the README.`);
118
- }
119
- }
120
-
121
- const status = runner.getStatus();
122
- console.log(`
123
- Execute ${status.total} registered tasks...`);
124
- runLoop();
125
- });
126
- });
127
- }
@@ -1,64 +0,0 @@
1
- import semver from 'semver';
2
-
3
- import { FILE_EXTENSIONS, FileExtension } from '../../types';
4
- import { logAndCreateError } from '../shares/reuse';
5
- import { TaskStatus } from './types';
6
-
7
- export type TaskOptions = {
8
- dependentTasks?: AbstractTask[];
9
- description?: string;
10
- };
11
-
12
- export abstract class AbstractTask {
13
- private status: TaskStatus = 'pending';
14
-
15
- protected static readonly instances: Map<string, AbstractTask> = new Map();
16
-
17
- protected readonly description?: string;
18
-
19
- protected constructor(
20
- protected readonly identifier: string,
21
- protected readonly title: string,
22
- protected readonly extensions: FileExtension[],
23
- protected readonly versionRange: string,
24
- protected readonly dependentTasks: AbstractTask[] = [],
25
- options: TaskOptions = {},
26
- ) {
27
- this.description = options.description;
28
- this.extensions = this.extensions.filter((ext) => FILE_EXTENSIONS.includes(ext));
29
-
30
- if (!semver.validRange(this.versionRange)) {
31
- throw logAndCreateError(`[${this.identifier}] Invalid semver range version: ${this.versionRange}`);
32
- }
33
- }
34
-
35
- public getDependentTasks(): AbstractTask[] {
36
- return this.dependentTasks;
37
- }
38
-
39
- public getDescription(): string | undefined {
40
- return this.description;
41
- }
42
-
43
- public getIdentifier(): string {
44
- return this.identifier;
45
- }
46
-
47
- public setStatus(status: TaskStatus): void {
48
- this.status = status;
49
- }
50
-
51
- public getStatus(): TaskStatus {
52
- return this.status;
53
- }
54
-
55
- public getTitle(): string {
56
- return this.title;
57
- }
58
-
59
- public getVersionRange(): string {
60
- return this.versionRange;
61
- }
62
-
63
- public abstract run(baseDir: string): void;
64
- }