Skip to content

Commit 9efc8d7

Browse files
committed
AG-35605 Keep all files inside declarative rulesets for fast track review
Squashed commit of the following: commit 77c09bc Author: scripthunter7 <[email protected]> Date: Fri Jan 31 11:11:25 2025 +0100 revert agtree.tgz commit 3d79520 Author: scripthunter7 <[email protected]> Date: Fri Jan 31 11:11:05 2025 +0100 Add TODO comment to move storage mock to a separate file commit adb3239 Merge: 6f4e1c0 193e35c Author: scripthunter7 <[email protected]> Date: Thu Jan 30 21:18:53 2025 +0100 Merge branch 'master' into fix/AG-35605-rabased commit 6f4e1c0 Author: scripthunter7 <[email protected]> Date: Thu Jan 30 18:37:08 2025 +0100 update tgz files commit b0926d7 Author: scripthunter7 <[email protected]> Date: Thu Jan 30 14:41:28 2025 +0100 fix import commit e1fe2cc Merge: e174791 0922f9a Author: scripthunter7 <[email protected]> Date: Thu Jan 30 13:26:22 2025 +0100 Merge branch 'master' into fix/AG-35605-rabased commit e174791 Author: Slava Leleka <[email protected]> Date: Thu Jan 30 11:54:53 2025 +0300 Applied suggestion commit 7b493fc Author: Slava Leleka <[email protected]> Date: Thu Jan 30 11:54:48 2025 +0300 Applied suggestion commit fbb0634 Author: scripthunter7 <[email protected]> Date: Wed Jan 29 20:50:43 2025 +0100 update tgz files commit db70e6e Merge: 93b4a03 6faee5e Author: scripthunter7 <[email protected]> Date: Wed Jan 29 20:38:44 2025 +0100 Merge branch 'master' into fix/AG-35605-rabased commit 93b4a03 Author: scripthunter7 <[email protected]> Date: Wed Jan 29 16:44:58 2025 +0100 update tgz files commit bf571e7 Author: Dávid Tóta <[email protected]> Date: Tue Jan 28 13:51:14 2025 +0300 AG-35605 Embed filters.json Metadata into the Metadata Ruleset Squashed commit of the following: commit 0831734 Merge: e64d083 ade69de Author: scripthunter7 <[email protected]> Date: Tue Jan 28 11:27:22 2025 +0100 Merge branch 'fix/AG-35605-rabased' into fix/AG-35605-filters-metadata commit e64d083 Author: scripthunter7 <[email protected]> Date: Mon Jan 27 17:05:22 2025 +0100 Enhance MetadataRuleSet class with additional properties management and improved documentation commit 0d5626f Author: scripthunter7 <[email protected]> Date: Fri Jan 24 18:21:23 2025 +0100 changelog commit 694cad0 Merge: 96f6c17 0ecb552 Author: scripthunter7 <[email protected]> Date: Fri Jan 24 18:20:20 2025 +0100 Merge branch 'fix/AG-35605-rabased' into fix/AG-35605-filters-metadata commit 96f6c17 Author: scripthunter7 <[email protected]> Date: Fri Jan 24 17:02:16 2025 +0100 update zips commit 09c7659 Author: scripthunter7 <[email protected]> Date: Fri Jan 24 16:16:04 2025 +0100 fix comment commit e462d6f Author: scripthunter7 <[email protected]> Date: Fri Jan 24 16:08:16 2025 +0100 move filters.json metadata to metadata ruleset commit ade69de Author: Slava Leleka <[email protected]> Date: Mon Jan 27 23:35:41 2025 +0300 Applied suggestion commit fe8ebd8 Author: Slava Leleka <[email protected]> Date: Mon Jan 27 23:35:31 2025 +0300 Applied suggestion commit baa592b Author: scripthunter7 <[email protected]> Date: Fri Jan 24 22:57:22 2025 +0100 refactor: update IndexedDB imports to use named exports commit 0ecb552 Author: scripthunter7 <[email protected]> Date: Fri Jan 24 18:20:08 2025 +0100 restore commit f7cd501 Author: scripthunter7 <[email protected]> Date: Fri Jan 24 18:19:16 2025 +0100 remove empty lines commit 7b4d1c6 Author: scripthunter7 <[email protected]> Date: Fri Jan 24 18:18:29 2025 +0100 fix changelogs and versions commit 853b18e Author: scripthunter7 <[email protected]> Date: Fri Jan 24 18:09:12 2025 +0100 change tab to 4 spaces commit 8f14ac7 Author: scripthunter7 <[email protected]> Date: Fri Jan 24 11:15:32 2025 +0100 fix linter ... and 10 more commits
1 parent 193e35c commit 9efc8d7

File tree

79 files changed

+4476
-444
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+4476
-444
lines changed

packages/adguard-api-mv3/.eslintrc.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module.exports = {
6161
'jsdoc/tag-lines': 'off',
6262
'jsdoc/require-throws': 'error',
6363
'jsdoc/check-tag-names': ['error', {
64-
definedTags: ['jest-environment'],
64+
definedTags: ['jest-environment', 'note'],
6565
}],
6666
'jsdoc/require-jsdoc': [
6767
'error',
@@ -87,5 +87,6 @@ module.exports = {
8787
],
8888
'jsdoc/require-description-complete-sentence': ['error'],
8989
'jsdoc/require-returns': ['error'],
90+
'jsdoc/no-defaults': 'off',
9091
},
9192
};

packages/adguard-api-mv3/src/background/main.ts

+9-15
Original file line numberDiff line numberDiff line change
@@ -160,29 +160,23 @@ export class AdguardApi {
160160
allowlist = this.configuration.allowlist;
161161
}
162162

163-
const userrules: TsWebExtensionConfiguration['userrules'] = {
164-
filterList: [],
165-
rawFilterList: '',
166-
conversionMap: {},
167-
sourceMap: {},
168-
trusted: true,
169-
};
163+
const userrules: TsWebExtensionConfiguration['userrules'] = Object.assign(
164+
FilterListPreprocessor.createEmptyPreprocessedFilterList(),
165+
{ trusted: true },
166+
);
170167

171168
if (this.configuration.rules) {
172169
Object.assign(userrules, FilterListPreprocessor.preprocess(this.configuration.rules.join(LF)));
173170
}
174171

175-
const quickFixesRules: TsWebExtensionConfiguration['quickFixesRules'] = {
176-
filterList: [],
177-
sourceMap: {},
178-
rawFilterList: '',
179-
conversionMap: {},
180-
trusted: true,
181-
};
172+
const quickFixesRules: TsWebExtensionConfiguration['quickFixesRules'] = Object.assign(
173+
FilterListPreprocessor.createEmptyPreprocessedFilterList(),
174+
{ trusted: true },
175+
);
182176

183177
return {
184178
filtersPath: this.configuration.assetsPath,
185-
ruleSetsPath: this.configuration.assetsPath + AdguardApi.DECLARATIVE_RULES_PATH,
179+
ruleSetsPath: `${this.configuration.assetsPath}${AdguardApi.DECLARATIVE_RULES_PATH}`,
186180
customFilters: [],
187181
// This is needed only for filters developers.
188182
declarativeLogEnabled: false,

packages/agtree/test/matchers/check-conversion.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* @file Custom Jest matcher to check proper rule conversion
33
*/
4-
import { z } from 'zod';
4+
import * as z from 'zod';
55

66
import { type BaseConverter } from '../../src/converter/base-interfaces/base-converter';
77
import { RuleParser } from '../../src/parser/rule-parser';

packages/dnr-rulesets/CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
- [BREAKING] `unsafeRulesCount` in ruleset metadata to specify the number of unsafe rules in the ruleset.
1313

14+
### Changed
15+
16+
- Updated `@adguard/tsurlfilter` to `3.2.0-alpha.0`.
17+
18+
### Removed
19+
20+
- Text files from the build result. Now only JSON files are generated and they are including all the necessary data.
21+
- `filters.json` from the build result. We embedded it to the metadata ruleset.
22+
1423
## [1.2.20240930132036] - 2024-09-30
1524

1625
### Added
14.9 MB
Binary file not shown.

packages/dnr-rulesets/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@adguard/dnr-rulesets",
3-
"version": "1.3.0",
3+
"version": "2.0.0",
44
"description": "Utility to create AdGuard DNR rulesets for mv3 extensions",
55
"files": [
66
"dist/**/*"

packages/dnr-rulesets/tasks/build.ts

+46-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { convertFilters } from '@adguard/tsurlfilter/cli';
2+
import { METADATA_RULESET_ID, MetadataRuleSet } from '@adguard/tsurlfilter/es/declarative-converter';
3+
import { getRuleSetPath } from '@adguard/tsurlfilter/es/declarative-converter-utils';
24
import axios from 'axios';
35
import fs from 'fs';
46
import { ensureDir } from 'fs-extra';
@@ -9,7 +11,6 @@ import {
911
BASE_DIR,
1012
DEST_RULE_SETS_DIR,
1113
FILTERS_DIR,
12-
FILTERS_METADATA_FILE_NAME,
1314
FILTERS_METADATA_I18N_FILE_NAME,
1415
FILTERS_URL,
1516
QUICK_FIXES_FILTER_ID,
@@ -67,18 +68,13 @@ const downloadFilter = async (filter: FilterDTO, filtersDir: string) => {
6768
/**
6869
* Downloads filters from the server and saves them to the specified directory.
6970
*
70-
* @returns Promise that resolves when all filters are downloaded.
71+
* @returns Promise that resolves the filters metadata.
7172
*/
72-
const startDownload = async (): Promise<void> => {
73+
const startDownload = async (): Promise<Metadata> => {
7374
await ensureDir(FILTERS_DIR);
7475

7576
const metadata = await getMetadata();
7677

77-
await fs.promises.writeFile(
78-
path.join(FILTERS_DIR, FILTERS_METADATA_FILE_NAME),
79-
JSON.stringify(metadata, null, '\t'),
80-
);
81-
8278
const i18nMetadata = await getI18nMetadata();
8379

8480
await fs.promises.writeFile(
@@ -88,6 +84,27 @@ const startDownload = async (): Promise<void> => {
8884

8985
const filters = await getUrlsOfFiltersResources(metadata);
9086
await Promise.all(filters.map((filter) => downloadFilter(filter, FILTERS_DIR)));
87+
88+
return metadata;
89+
};
90+
91+
/**
92+
* Writes metadata to the metadata ruleset.
93+
*
94+
* @param metadata Metadata to write.
95+
*
96+
* @returns Promise that resolves when metadata is written.
97+
*/
98+
const writeMetadataFilesToMetadataRuleset = async (metadata: Metadata): Promise<void> => {
99+
await ensureDir(DEST_RULE_SETS_DIR);
100+
101+
const metadataRuleSetPath = getRuleSetPath(METADATA_RULESET_ID, DEST_RULE_SETS_DIR);
102+
const rawMetadataRuleSet = await fs.promises.readFile(metadataRuleSetPath, 'utf-8');
103+
const metadataRuleSet = MetadataRuleSet.deserialize(rawMetadataRuleSet);
104+
105+
metadataRuleSet.setAdditionalProperty('metadata', metadata);
106+
107+
await fs.promises.writeFile(metadataRuleSetPath, metadataRuleSet.serialize());
91108
};
92109

93110
/**
@@ -102,6 +119,22 @@ const createTxt = async (): Promise<void> => {
102119
);
103120
};
104121

122+
/**
123+
* Removes all txt files from the specified directory.
124+
* Used as a cleanup step after filters conversion to remove unnecessary txt files.
125+
*
126+
* @param dir Directory with txt files.
127+
* @returns Promise that resolves when all txt files are removed.
128+
*/
129+
const removeTxtFiles = async (dir: string): Promise<void> => {
130+
const files = await fs.promises.readdir(dir);
131+
const txtFiles = files.filter((file) => file.endsWith('.txt'));
132+
133+
await Promise.all(
134+
txtFiles.map((file) => fs.promises.unlink(path.join(dir, file))),
135+
);
136+
};
137+
105138
/**
106139
* Compiles rules to declarative json
107140
* Actually for each rule set entry in manifest's declarative_net_request:
@@ -117,7 +150,7 @@ const createTxt = async (): Promise<void> => {
117150
* we should find corresponding text file in resources, and then convert and save json to path specified in the manifest
118151
*/
119152
const build = async (): Promise<void> => {
120-
await startDownload();
153+
const metadata = await startDownload();
121154
await convertFilters(
122155
FILTERS_DIR,
123156
RESOURCES_DIR,
@@ -128,6 +161,10 @@ const build = async (): Promise<void> => {
128161
},
129162
);
130163

164+
await writeMetadataFilesToMetadataRuleset(metadata);
165+
166+
await removeTxtFiles(FILTERS_DIR);
167+
131168
await createTxt();
132169
};
133170

packages/dnr-rulesets/tasks/validate.ts

+70-12
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1+
import { type ByteRange } from '@adguard/tsurlfilter';
2+
import {
3+
METADATA_RULESET_ID,
4+
MetadataRuleSet,
5+
RuleSetByteRangeCategory,
6+
} from '@adguard/tsurlfilter/es/declarative-converter';
7+
import { extractRuleSetId, getRuleSetId, getRuleSetPath } from '@adguard/tsurlfilter/es/declarative-converter-utils';
18
import fs from 'fs';
29
import path from 'path';
310

411
import { version } from '../package.json';
512
import { DEST_RULE_SETS_DIR } from './constants';
613

7-
// TODO: import METADATA_FILENAME from tsurlfilter/declarative-converter
8-
// and resolve transpile issue related to its import
9-
const METADATA_FILENAME = 'metadata.json';
10-
1114
/**
1215
* File name where old validator data is stored.
1316
*/
@@ -35,6 +38,42 @@ type RulesetIdsAndMetadataKeys = {
3538
rulesetMetadataKeys: string[];
3639
};
3740

41+
/**
42+
* Retrieves metadata ruleset.
43+
*
44+
* @param destDir Directory with declarative rulesets.
45+
*
46+
* @returns Metadata ruleset.
47+
*
48+
* @throws Error if metadata ruleset is not found.
49+
*/
50+
const getMetadataRuleset = (destDir: string): MetadataRuleSet => {
51+
const metadataRuleSetPath = getRuleSetPath(METADATA_RULESET_ID, destDir);
52+
53+
if (!fs.existsSync(metadataRuleSetPath)) {
54+
throw new Error(`Metadata ruleset not found at ${metadataRuleSetPath}`);
55+
}
56+
57+
const metadataRulesetContent = fs.readFileSync(metadataRuleSetPath, { encoding: 'utf-8' });
58+
59+
return MetadataRuleSet.deserialize(metadataRulesetContent);
60+
};
61+
62+
/**
63+
* Node.js specific function that reads the specified range of bytes from the file.
64+
*
65+
* @param filePath Path to the file.
66+
* @param range Range of bytes to read.
67+
*
68+
* @returns Buffer with the read data.
69+
*/
70+
const readFileRange = async (filePath: string, range: ByteRange): Promise<Buffer> => {
71+
const file = await fs.promises.open(filePath, 'r');
72+
const buffer = Buffer.alloc(range.end - range.start + 1);
73+
await file.read(buffer, 0, buffer.length, range.start);
74+
return buffer;
75+
};
76+
3877
/**
3978
* Retrieves data needed for rulesets validation — rulesets ids and metadata keys.
4079
*
@@ -44,24 +83,43 @@ type RulesetIdsAndMetadataKeys = {
4483
*/
4584
const getValidatorData = async (destDir: string): Promise<RulesetIdsAndMetadataKeys> => {
4685
const rulesetIds: number[] = [];
47-
const rulesetMetadataKeys = [];
86+
const rulesetMetadataKeys: string[] = [];
87+
88+
const metadataRuleSet = getMetadataRuleset(destDir);
4889

4990
const destDirItems = await fs.promises.readdir(destDir, { withFileTypes: true });
5091

5192
const destDirSubdirectories = destDirItems.filter((item) => item.isDirectory());
5293

5394
destDirSubdirectories.forEach((item) => {
54-
// TODO: import and use const later instead of 'ruleset_' — RULESET_NAME_PREFIX
55-
// or use RuleSetsLoaderApi.getRuleSetId()
56-
const id = item.name.replace('ruleset_', '');
57-
rulesetIds.push(Number(id));
95+
const id = extractRuleSetId(item.name);
96+
97+
if (id === null) {
98+
throw new Error(`Cannot extract ruleset id from ${item.name}`);
99+
}
100+
101+
// Skip metadata ruleset, because its a special ruleset
102+
if (id === METADATA_RULESET_ID) {
103+
return;
104+
}
105+
106+
rulesetIds.push(id);
58107
});
59108

60-
const rulesetMetadata = path.join(destDir, destDirSubdirectories[0].name, METADATA_FILENAME);
61-
const rulesetMetadataContent = await fs.promises.readFile(rulesetMetadata, { encoding: 'utf-8' });
109+
const metadataByteRange = metadataRuleSet.getByteRange(
110+
getRuleSetId(rulesetIds[0]),
111+
RuleSetByteRangeCategory.DeclarativeMetadata,
112+
);
113+
114+
const metadataBuffer = await readFileRange(
115+
getRuleSetPath(rulesetIds[0], destDir),
116+
metadataByteRange,
117+
);
118+
119+
const rulesetMetadata = metadataBuffer.toString('utf-8');
62120

63121
try {
64-
const parsedRulesetMetadata = JSON.parse(rulesetMetadataContent);
122+
const parsedRulesetMetadata = JSON.parse(rulesetMetadata);
65123
rulesetMetadataKeys.push(...Object.keys(parsedRulesetMetadata));
66124
} catch (e: unknown) {
67125
console.error(`Error parsing metadata file ${rulesetMetadata} due to ${e}`);

packages/examples/adguard-api-mv3/tsconfig.eslint.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
"include": [
44
"extension/**/*.ts",
55
"scripts/**/*.ts",
6-
".eslintrc.js",
6+
".eslintrc.cjs",
77
]
88
}

packages/examples/tswebextension-mv3/extension/src/background/index.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,12 @@ const startIfNeed = async () => {
153153
}
154154
}
155155

156-
await tsWebExtension.initStorage();
156+
try {
157+
await tsWebExtension.initStorage();
158+
} catch (e) {
159+
// TODO: Investigate why we got "Storage is already initialized" error
160+
console.error('Failed to init storage', e);
161+
}
157162

158163
if (isStarted) {
159164
await tsWebExtension.start(config);

packages/examples/tswebextension-mv3/scripts/constants.ts

+9-14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Configuration } from '@adguard/tswebextension/mv3';
2+
import { FilterListPreprocessor } from '@adguard/tsurlfilter';
23
import { LogLevel } from '@adguard/logger';
34

45
// TODO: can be used as common for examples/tswebextension-mv2 as well
@@ -11,20 +12,14 @@ export const DEFAULT_EXTENSION_CONFIG: Configuration = {
1112
logLevel: LogLevel.Debug,
1213
customFilters: [],
1314
allowlist: [],
14-
userrules: {
15-
filterList: [],
16-
sourceMap: {},
17-
rawFilterList: '',
18-
conversionMap: {},
19-
trusted: true,
20-
},
21-
quickFixesRules: {
22-
filterList: [],
23-
sourceMap: {},
24-
rawFilterList: '',
25-
conversionMap: {},
26-
trusted: true,
27-
},
15+
userrules: Object.assign(
16+
FilterListPreprocessor.createEmptyPreprocessedFilterList(),
17+
{ trusted: true },
18+
),
19+
quickFixesRules: Object.assign(
20+
FilterListPreprocessor.createEmptyPreprocessedFilterList(),
21+
{ trusted: true },
22+
),
2823
verbose: true,
2924
filtersPath: 'filters',
3025
ruleSetsPath: 'filters/declarative',

packages/tsurlfilter/.eslintrc.cjs

+10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module.exports = {
1111
'import',
1212
'import-newlines',
1313
'@typescript-eslint',
14+
'jsdoc',
1415
],
1516
extends: [
1617
'airbnb-base',
@@ -37,6 +38,15 @@ module.exports = {
3738
'@typescript-eslint/interface-name-prefix': 'off',
3839
'arrow-body-style': 'off',
3940

41+
'jsdoc/check-tag-names': [
42+
'warn',
43+
{
44+
// Define additional tags
45+
// https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-tag-names.md#definedtags
46+
definedTags: ['note'],
47+
},
48+
],
49+
4050
// Force proper import and export of types
4151
'@typescript-eslint/consistent-type-imports': [
4252
'error',

0 commit comments

Comments
 (0)