improving pipelines

This commit is contained in:
ivanch committed 2026-10-10 23:25:06 -03:00
1 parent b9159cf61f
commit 032d2a100a
4 files changed
+39 -4

No files matched your search

+3
View File
@@ -32,6 +32,9 @@ jobs:
- name: Install JS dependencies
run: npm ci
- name: Type check
run: npm run typecheck
- name: Run build
run: |
bash scripts/prepare_release.sh
+3
View File
@@ -30,6 +30,9 @@ jobs:
- name: Install JS dependencies
run: npm ci
- name: Type check
run: npm run typecheck
- name: Run build
run: |
bash scripts/prepare_release.sh
+30 -3
View File
@@ -42,13 +42,13 @@ globalThis.localStorage = {
globalThis.window = { chrome: { storage: { local: {
get: (keys, callback) => {
chromeReads++;
callback(Object.fromEntries(keys.map(key => [key, chromeStorage.get(key)])));
callback(keys === null ? Object.fromEntries(chromeStorage) : Object.fromEntries(keys.map(key => [key, chromeStorage.get(key)])));
},
set: (values, callback) => {
Object.entries(values).forEach(([key, value]) => chromeStorage.set(key, value));
callback();
},
remove: (key, callback) => { chromeStorage.delete(key); callback(); },
remove: (keys, callback) => { [keys].flat().forEach(key => chromeStorage.delete(key)); callback(); },
} } } };
globalThis.FileReader = class {
readAsDataURL(blob) {
@@ -59,10 +59,12 @@ globalThis.FileReader = class {
});
}
};
const [{ ConfigurationService, DEFAULT_CONFIG, normalizeConfig, normalizeCategories }, icons, { default: ping }] = await Promise.all([
const [{ ConfigurationService, DEFAULT_CONFIG, normalizeConfig, normalizeCategories }, icons, { default: ping }, { normalizeWebsiteUrl }, { pruneCachedIconsFromChromeStorageLocal }] = await Promise.all([
loadModule('components/services/ConfigurationService.ts'),
loadModule('components/utils/iconService.ts'),
loadModule('components/utils/jsping.ts'),
loadModule('components/utils/urlUtils.ts'),
loadModule('components/utils/StorageLocalManager.ts'),
]);
const file = value => new File([JSON.stringify(value)], 'config.json', { type: 'application/json' });
const iconUrl = name => `https://www.google.com/s2/favicons?domain=${name}.com&sz=128`;
@@ -88,6 +90,31 @@ await test('malformed stored data recovers without shared defaults or unsafe pol
assert.deepEqual(ConfigurationService.loadUserWallpapers(), []);
});
await test('website URLs, clock fonts, and wallpaper frequency are normalized', async () => {
assert.equal(normalizeWebsiteUrl('github.com'), 'https://github.com/');
assert.equal(normalizeWebsiteUrl('localhost:8080/app'), 'https://localhost:8080/app');
assert.equal(normalizeWebsiteUrl('mailto:me@example.com'), 'mailto:me@example.com');
assert.equal(normalizeWebsiteUrl('javascript:alert(1)'), null);
assert.equal(normalizeWebsiteUrl('data:text/html,hi'), null);
assert.equal(normalizeWebsiteUrl(' '), null);
const websites = normalizeCategories([{ id: 'c', name: 'Group', websites: [
{ id: 'a', name: 'Bad', url: 'javascript:alert(1)' },
{ id: 'b', name: 'Bare', url: 'example.com' },
] }])[0].websites;
assert.deepEqual(websites.map(website => website.url), ['https://example.com/']);
assert.equal(normalizeConfig({ clock: { font: `'Orbitron', sans-serif` } }).clock.font, 'Helvetica');
assert.equal(normalizeConfig({ clock: { font: 'monospace' } }).clock.font, 'monospace');
assert.equal(normalizeConfig({ wallpaperFrequency: '2d' }).wallpaperFrequency, '48h');
assert.equal(normalizeConfig({ wallpaperFrequency: 'weekly' }).wallpaperFrequency, '24h');
chromeStorage.clear();
chromeStorage.set(`vision-start:icon:${encodeURIComponent(iconUrl('keep'))}`, 'data:image/png;base64,a');
chromeStorage.set(`vision-start:icon:${encodeURIComponent(iconUrl('drop'))}`, 'data:image/png;base64,b');
chromeStorage.set('My Wallpaper', 'data:image/png;base64,c');
assert.equal(await pruneCachedIconsFromChromeStorageLocal([iconUrl('keep')]), 1);
assert.deepEqual([...chromeStorage.keys()].sort(), ['My Wallpaper', `vision-start:icon:${encodeURIComponent(iconUrl('keep'))}`].sort());
chromeStorage.clear();
});
await test('imports validate before writing, roll back failures, and preserve omitted settings', async () => {
await assert.rejects(ConfigurationService.importConfig({ size: 10 * 1024 * 1024 + 1, text: () => assert.fail('Oversized files must not be read into memory') }), /10MB/);
storage.clear();
+3 -1
View File
@@ -1 +1,3 @@
wget https://raw.githubusercontent.com/homarr-labs/dashboard-icons/refs/heads/main/metadata.json -O public/icon-metadata.json
#!/bin/sh
set -eu
wget -q https://raw.githubusercontent.com/homarr-labs/dashboard-icons/refs/heads/main/metadata.json -O public/icon-metadata.json