@uruhalushia/rule-converter-napi 0.1.3 → 0.2.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 (4) hide show
  1. package/README.md +97 -46
  2. package/index.d.ts +63 -47
  3. package/index.js +17 -10
  4. package/package.json +13 -13
package/README.md CHANGED
@@ -14,10 +14,14 @@ pnpm --dir napi build
14
14
  ```js
15
15
  import { writeFileSync } from 'node:fs'
16
16
  import {
17
- convertPayloadStringToMrs,
18
- convertPayloadStringToString,
19
- convertFileToBuffer,
20
- convertFileToPath,
17
+ fileToBuf,
18
+ listAsnNumbers,
19
+ listGeoipCountries,
20
+ listGeoipDatCountries,
21
+ listGeositeCodes,
22
+ matchFile,
23
+ strToBuf,
24
+ strToStr,
21
25
  } from '@uruhalushia/rule-converter-napi'
22
26
 
23
27
  const payload = `
@@ -27,7 +31,7 @@ payload:
27
31
  - IP-CIDR,192.168.1.0/24,no-resolve
28
32
  `
29
33
 
30
- const result = convertPayloadStringToMrs(payload, {
34
+ const mrs = strToBuf(payload, {
31
35
  inputTarget: 'mihomo',
32
36
  inputFormat: 'yaml',
33
37
  inputBehavior: 'classical',
@@ -36,11 +40,9 @@ const result = convertPayloadStringToMrs(payload, {
36
40
  outputBehavior: 'domain',
37
41
  })
38
42
 
39
- for (const output of result.outputs) {
40
- writeFileSync(`${output.behavior}.mrs`, output.bytes)
41
- }
43
+ writeFileSync('domain.mrs', mrs.outputs.domain)
42
44
 
43
- const text = convertPayloadStringToString(payload, {
45
+ const text = strToStr(payload, {
44
46
  inputTarget: 'mihomo',
45
47
  inputFormat: 'yaml',
46
48
  inputBehavior: 'classical',
@@ -49,71 +51,120 @@ const text = convertPayloadStringToString(payload, {
49
51
  outputBehavior: 'classical',
50
52
  })
51
53
 
52
- console.log(text.outputs[0].text)
54
+ console.log(text.outputs.classical)
53
55
 
54
- const srs = convertFileToBuffer('rules.yaml', {
56
+ const srs = fileToBuf('rules.yaml', {
55
57
  outputTarget: 'sing-box',
56
58
  outputFormat: 'srs',
57
59
  outputBehavior: 'classical',
58
60
  })
59
61
 
60
- writeFileSync('rules.srs', srs.outputs[0].buffer)
62
+ writeFileSync('classical.srs', srs.outputs.classical)
61
63
 
62
- const written = convertFileToPath('rules.yaml', 'dist/rules.list', {
64
+ const geoip = fileToBuf('country.mmdb', {
65
+ inputTarget: 'geoip',
63
66
  outputTarget: 'general',
64
- outputFormat: 'ruleset',
65
- outputBehavior: 'classical',
67
+ outputFormat: 'ipset',
68
+ countries: ['cn'],
66
69
  })
67
70
 
68
- console.log(written.outputs)
69
- ```
71
+ writeFileSync('cn.list', geoip.outputs.cn)
72
+
73
+ const singDb = fileToBuf('country.mmdb', {
74
+ inputTarget: 'geoip',
75
+ outputTarget: 'geoip',
76
+ outputFormat: 'sing-db',
77
+ })
78
+
79
+ writeFileSync('country.sing.db', singDb.outputs.db)
70
80
 
71
- Multiple files can be merged by passing a path array, a directory path, or a final-component `*` wildcard:
81
+ console.log(listGeoipCountries('country.mmdb'))
82
+ console.log(listGeoipDatCountries('geoip.dat'))
83
+ console.log(listGeositeCodes('geosite.dat'))
84
+ console.log(listAsnNumbers('GeoLite2-ASN.mmdb'))
85
+ ```
72
86
 
73
87
  ```js
74
- convertFileToPath(['/path/rules-a.yaml', '/path/rules-b.yaml'], 'dist/ad.mrs', {
75
- outputTarget: 'mihomo',
76
- outputFormat: 'mrs',
77
- outputBehavior: 'domain',
88
+ const match = matchFile('rules.list', 'ads.example.com', {
89
+ inputTarget: 'general',
90
+ inputFormat: 'text',
91
+ inputBehavior: 'classical',
78
92
  })
93
+ console.log(match.matched, match.rules)
94
+
95
+ const route = matchFile('config.yaml', 'github.com')
96
+ console.log(route.matched, route.rules)
79
97
  ```
80
98
 
99
+ `outputs` is a name-keyed object. Rule output keys are usually behavior names such as `domain`, `ip`, or `classical`. DB export keys are country codes, ASN numbers, or `db` for a generated database.
100
+
81
101
  ## API
82
102
 
83
- - `convertPayloadToMrs(payload, options?)`: accepts `Uint8Array` and returns generated MRS files in memory.
84
- - `convertPayloadStringToMrs(payload, options?)`: accepts a string and returns generated MRS files in memory.
85
- - `convertFileToMrs(input, options?)`: reads one file, directory, wildcard, or path array and returns generated MRS files in memory.
86
- - `convertPayloadToBuffer(payload, options?)`: accepts `Uint8Array` and returns generated files as Node.js `Buffer` objects in memory.
87
- - `convertPayloadStringToBuffer(payload, options?)`: accepts a string and returns generated files as Node.js `Buffer` objects in memory.
88
- - `convertFileToBuffer(input, options?)`: reads one file, directory, wildcard, or path array and returns generated files as Node.js `Buffer` objects in memory.
89
- - `convertPayloadToString(payload, options?)`: accepts `Uint8Array` and returns generated text output as strings.
90
- - `convertPayloadStringToString(payload, options?)`: accepts a string and returns generated text output as strings.
91
- - `convertFileToString(input, options?)`: reads one file, directory, wildcard, or path array and returns generated text output as strings.
92
- - `convertFileToPath(input, output, options?)`: writes converted outputs to disk.
103
+ - `bufToBuf(input, options?)`: converts a `Uint8Array` payload and returns byte outputs.
104
+ - `strToBuf(input, options?)`: converts a string payload and returns byte outputs.
105
+ - `fileToBuf(input, options?)`: converts one input file path and returns byte outputs.
106
+ - `bufToStr(input, options?)`: converts a `Uint8Array` payload and returns UTF-8 text outputs.
107
+ - `strToStr(input, options?)`: converts a string payload and returns UTF-8 text outputs.
108
+ - `fileToStr(input, options?)`: converts one input file path and returns UTF-8 text outputs.
109
+ - `listGeoipCountries(input)`: reads a GeoIP MMDB file path and returns sorted country codes.
110
+ - `listGeoipCountriesFromBuffer(input)`: reads GeoIP MMDB bytes and returns sorted country codes.
111
+ - `listGeoipDatCountries(input)` / `listGeoipDatCountriesFromBuffer(input)`: reads V2Ray `geoip.dat` and returns sorted country codes.
112
+ - `listGeositeCodes(input)` / `listGeositeCodesFromBuffer(input)`: reads V2Ray `geosite.dat` and returns sorted site codes.
113
+ - `listAsnNumbers(input)`: reads an ASN MMDB file path and returns sorted ASN numbers.
114
+ - `listAsnNumbersFromBuffer(input)`: reads ASN MMDB bytes and returns sorted ASN numbers.
115
+ - `matchBuf(input, query, options?)` / `matchStr(input, query, options?)` / `matchFile(input, query, options?)`: matches a domain or IP against rules and returns `{ matched, query, kind, rules }`. Mihomo config input is supported for provider `path`, `file://`, and HTTP(S) `url`. HTTP providers are downloaded into memory for matching.
93
116
 
94
117
  ```ts
95
- interface ConvertOptions {
96
- inputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box'
97
- inputFormat?: 'yaml' | 'mrs' | 'text' | 'json' | 'srs'
118
+ interface AnyConvertOptions {
119
+ inputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box' | 'geoip' | 'geosite' | 'asn'
120
+ inputFormat?: 'yaml' | 'mrs' | 'text' | 'json' | 'srs' | 'domainset' | 'ruleset' | 'ipset' | 'mmdb' | 'sing-db' | 'metadb' | 'dat'
98
121
  inputBehavior?: 'auto' | 'domain' | 'ip' | 'classical'
99
- outputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box'
100
- outputFormat?: 'mrs' | 'text' | 'yaml' | 'json' | 'srs' | 'domainset' | 'ruleset' | 'ipset'
101
- outputBehavior?: 'domain' | 'ip' | 'classical'
122
+ outputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box' | 'geoip' | 'geosite' | 'asn'
123
+ outputFormat?: 'mrs' | 'text' | 'yaml' | 'json' | 'srs' | 'domainset' | 'ruleset' | 'ipset' | 'mmdb' | 'sing-db' | 'metadb' | 'dat'
124
+ outputBehavior?: 'auto' | 'domain' | 'ip' | 'classical'
125
+ countries?: string[]
126
+ codes?: string[]
127
+ asns?: number[]
128
+ split?: boolean
129
+ country?: string
130
+ code?: string
131
+ asn?: number
132
+ }
133
+
134
+ interface AnyBufferResult {
135
+ kind: 'rules' | 'db'
136
+ outputs: Record<string, Uint8Array>
137
+ info: Record<string, AnyOutputInfo>
138
+ skipped: SkippedRule[]
139
+ }
140
+
141
+ interface AnyStringResult {
142
+ kind: 'rules' | 'db'
143
+ outputs: Record<string, string>
144
+ info: Record<string, AnyOutputInfo>
145
+ skipped: SkippedRule[]
102
146
  }
103
147
  ```
104
148
 
105
149
  Defaults:
106
150
 
107
- - `inputTarget`: auto-detected
151
+ - `inputTarget`: auto-detected rule input unless set to `geoip`, `geosite`, or `asn`
108
152
  - `inputFormat`: auto-detected
109
153
  - `inputBehavior`: `auto`
110
- - `outputTarget`: `mihomo`
111
- - `outputFormat`: `mrs`
112
- - `outputBehavior`: `domain`
113
-
114
- mihomo MRS output supports only `domain` and `ip`. sing-box JSON/SRS is available with `outputTarget: 'sing-box'` and `outputFormat: 'json' | 'srs'`.
115
-
116
- String output supports text formats only: `text`, `yaml`, `json`, `domainset`, `ruleset`, and `ipset`. Use the buffer functions for binary `mrs` and `srs` output.
154
+ - `outputTarget`: `mihomo` for rule input, `general` for DB-to-rules export, or the same DB target for DB conversion
155
+ - `outputFormat`: `mrs` for rule input, `ipset` for DB-to-rules export, or `mmdb` for DB conversion
156
+ - `outputBehavior`: selected from the target/format default
157
+ - `split`: `true` for DB-to-rules export
158
+
159
+ DB conversions use the same functions as rule conversions:
160
+
161
+ - `inputTarget: 'geoip'`, `outputTarget: 'general' | 'mihomo' | 'egern' | 'sing-box'` exports GeoIP contents as rule sets.
162
+ - `inputTarget: 'asn'`, `outputTarget: 'general' | 'mihomo' | 'egern' | 'sing-box'` exports ASN contents as rule sets.
163
+ - `inputTarget: 'geoip'`, `outputTarget: 'geoip'` converts GeoIP DB bytes between `mmdb`, `sing-db`, `metadb`, and V2Ray `dat`.
164
+ - `inputTarget: 'geosite'`, `outputTarget: 'general' | 'mihomo' | 'egern' | 'sing-box'` exports V2Ray `geosite.dat` as rule sets.
165
+ - `inputTarget: 'geosite'`, `outputTarget: 'geosite'` filters or normalizes V2Ray `geosite.dat`; geosite DB only supports `dat`.
166
+ - `inputTarget: 'asn'`, `outputTarget: 'asn'` normalizes ASN MMDB bytes. ASN DB output only supports `mmdb`.
167
+ - Rule input can build DB output with `outputTarget: 'geoip'` plus `country`, `outputTarget: 'geosite'` plus `code`, or `outputTarget: 'asn'` plus `asn`.
117
168
 
118
169
  `mihomo + text/yaml + domain` uses mihomo/Clash domain wildcard syntax such as `+.example.com`; `general + domainset + domain` uses domain-set syntax where `.example.com` means the domain itself and all subdomains.
119
170
 
package/index.d.ts CHANGED
@@ -1,65 +1,82 @@
1
1
  /* auto-generated by NAPI-RS */
2
2
  /* eslint-disable */
3
- export interface ConvertBufferOutput {
4
- behavior: 'domain' | 'ip'
3
+ export interface AnyBufferResult {
4
+ kind: 'rules' | 'db'
5
+ outputs: Record<string, Uint8Array>
6
+ info: Record<string, AnyOutputInfo>
7
+ skipped: Array<SkippedRule>
8
+ }
9
+
10
+ export interface AnyConvertOptions {
11
+ inputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box' | 'geoip' | 'geosite' | 'asn'
12
+ inputFormat?: 'yaml' | 'mrs' | 'text' | 'json' | 'srs' | 'domainset' | 'ruleset' | 'ipset' | 'mmdb' | 'sing-db' | 'metadb' | 'dat'
13
+ inputBehavior?: 'auto' | 'domain' | 'ip' | 'classical'
14
+ outputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box' | 'geoip' | 'geosite' | 'asn'
15
+ outputFormat?: 'mrs' | 'text' | 'yaml' | 'json' | 'srs' | 'domainset' | 'ruleset' | 'ipset' | 'mmdb' | 'sing-db' | 'metadb' | 'dat'
16
+ outputBehavior?: 'auto' | 'domain' | 'ip' | 'classical'
17
+ countries?: Array<string>
18
+ codes?: Array<string>
19
+ asns?: Array<number>
20
+ split?: boolean
21
+ country?: string
22
+ code?: string
23
+ asn?: number
24
+ }
25
+
26
+ export interface AnyOutputInfo {
27
+ behavior?: string
28
+ format: string
5
29
  count: number
6
- buffer: Uint8Array
7
30
  }
8
31
 
9
- export interface ConvertBufferResult {
10
- outputs: Array<ConvertBufferOutput>
32
+ export interface AnyStringResult {
33
+ kind: 'rules' | 'db'
34
+ outputs: Record<string, string>
35
+ info: Record<string, AnyOutputInfo>
11
36
  skipped: Array<SkippedRule>
12
37
  }
13
38
 
14
- export declare function convertFileToBuffer(input: string | string[], options?: ConvertOptions | undefined | null): ConvertBufferResult
39
+ export declare function bufToBuf(input: Uint8Array, options?: AnyConvertOptions | undefined | null): AnyBufferResult
15
40
 
16
- export declare function convertFileToMrs(input: string | string[], options?: ConvertOptions | undefined | null): ConvertResult
41
+ export declare function bufToStr(input: Uint8Array, options?: AnyConvertOptions | undefined | null): AnyStringResult
17
42
 
18
- export declare function convertFileToPath(input: string | string[], output: string, options?: ConvertOptions | undefined | null): WriteResult
43
+ export declare function fileToBuf(input: string, options?: AnyConvertOptions | undefined | null): AnyBufferResult
19
44
 
20
- export declare function convertFileToString(input: string | string[], options?: ConvertOptions | undefined | null): ConvertStringResult
45
+ export declare function fileToStr(input: string, options?: AnyConvertOptions | undefined | null): AnyStringResult
21
46
 
22
- export interface ConvertOptions {
23
- inputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box'
24
- inputFormat?: 'yaml' | 'mrs' | 'text' | 'json' | 'srs'
25
- inputBehavior?: 'auto' | 'domain' | 'ip' | 'classical'
26
- outputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box'
27
- outputFormat?: 'mrs' | 'text' | 'yaml' | 'json' | 'srs' | 'domainset' | 'ruleset' | 'ipset'
28
- outputBehavior?: 'auto' | 'domain' | 'ip' | 'classical'
29
- }
47
+ export declare function listAsnNumbers(input: string): Array<number>
30
48
 
31
- export interface ConvertOutput {
32
- behavior: 'domain' | 'ip'
33
- count: number
34
- bytes: Uint8Array
35
- }
49
+ export declare function listAsnNumbersFromBuffer(input: Uint8Array): Array<number>
36
50
 
37
- export declare function convertPayloadStringToBuffer(payload: string, options?: ConvertOptions | undefined | null): ConvertBufferResult
51
+ export declare function listGeoipCountries(input: string): Array<string>
38
52
 
39
- export declare function convertPayloadStringToMrs(payload: string, options?: ConvertOptions | undefined | null): ConvertResult
53
+ export declare function listGeoipCountriesFromBuffer(input: Uint8Array): Array<string>
40
54
 
41
- export declare function convertPayloadStringToString(payload: string, options?: ConvertOptions | undefined | null): ConvertStringResult
55
+ export declare function listGeoipDatCountries(input: string): Array<string>
42
56
 
43
- export declare function convertPayloadToBuffer(payload: Uint8Array, options?: ConvertOptions | undefined | null): ConvertBufferResult
57
+ export declare function listGeoipDatCountriesFromBuffer(input: Uint8Array): Array<string>
44
58
 
45
- export declare function convertPayloadToMrs(payload: Uint8Array, options?: ConvertOptions | undefined | null): ConvertResult
59
+ export declare function listGeositeCodes(input: string): Array<string>
46
60
 
47
- export declare function convertPayloadToString(payload: Uint8Array, options?: ConvertOptions | undefined | null): ConvertStringResult
61
+ export declare function listGeositeCodesFromBuffer(input: Uint8Array): Array<string>
48
62
 
49
- export interface ConvertResult {
50
- outputs: Array<ConvertOutput>
51
- skipped: Array<SkippedRule>
63
+
64
+ export interface MatchOptions {
65
+ inputTarget?: 'mihomo' | 'general' | 'egern' | 'sing-box'
66
+ inputFormat?: 'yaml' | 'mrs' | 'text' | 'json' | 'srs' | 'domainset' | 'ruleset' | 'ipset'
67
+ inputBehavior?: 'auto' | 'domain' | 'ip' | 'classical'
52
68
  }
53
69
 
54
- export interface ConvertStringOutput {
55
- behavior: 'domain' | 'ip'
56
- count: number
57
- text: string
70
+ export interface MatchRule {
71
+ behavior: string
72
+ rule: string
58
73
  }
59
74
 
60
- export interface ConvertStringResult {
61
- outputs: Array<ConvertStringOutput>
62
- skipped: Array<SkippedRule>
75
+ export interface MatchResult {
76
+ matched: boolean
77
+ query: string
78
+ kind: string
79
+ rules: Array<MatchRule>
63
80
  }
64
81
 
65
82
  export interface SkippedRule {
@@ -67,13 +84,12 @@ export interface SkippedRule {
67
84
  reason: string
68
85
  }
69
86
 
70
- export interface WriteResult {
71
- outputs: Array<WrittenOutput>
72
- skipped: Array<SkippedRule>
73
- }
87
+ export declare function strToBuf(input: string, options?: AnyConvertOptions | undefined | null): AnyBufferResult
74
88
 
75
- export interface WrittenOutput {
76
- behavior: 'domain' | 'ip'
77
- count: number
78
- path: string
79
- }
89
+ export declare function strToStr(input: string, options?: AnyConvertOptions | undefined | null): AnyStringResult
90
+
91
+ export declare function matchBuf(input: Uint8Array, query: string, options?: MatchOptions | undefined | null): MatchResult
92
+
93
+ export declare function matchStr(input: string, query: string, options?: MatchOptions | undefined | null): MatchResult
94
+
95
+ export declare function matchFile(input: string, query: string, options?: MatchOptions | undefined | null): MatchResult
package/index.js CHANGED
@@ -92,13 +92,20 @@ if (!nativeBinding) {
92
92
  }
93
93
 
94
94
  export default nativeBinding
95
- export const convertPayloadToMrs = nativeBinding.convertPayloadToMrs
96
- export const convertPayloadStringToMrs = nativeBinding.convertPayloadStringToMrs
97
- export const convertPayloadToBuffer = nativeBinding.convertPayloadToBuffer
98
- export const convertPayloadStringToBuffer = nativeBinding.convertPayloadStringToBuffer
99
- export const convertPayloadToString = nativeBinding.convertPayloadToString
100
- export const convertPayloadStringToString = nativeBinding.convertPayloadStringToString
101
- export const convertFileToMrs = nativeBinding.convertFileToMrs
102
- export const convertFileToBuffer = nativeBinding.convertFileToBuffer
103
- export const convertFileToString = nativeBinding.convertFileToString
104
- export const convertFileToPath = nativeBinding.convertFileToPath
95
+ export const bufToBuf = nativeBinding.bufToBuf
96
+ export const strToBuf = nativeBinding.strToBuf
97
+ export const fileToBuf = nativeBinding.fileToBuf
98
+ export const bufToStr = nativeBinding.bufToStr
99
+ export const strToStr = nativeBinding.strToStr
100
+ export const fileToStr = nativeBinding.fileToStr
101
+ export const listGeoipCountries = nativeBinding.listGeoipCountries
102
+ export const listGeoipCountriesFromBuffer = nativeBinding.listGeoipCountriesFromBuffer
103
+ export const listGeoipDatCountries = nativeBinding.listGeoipDatCountries
104
+ export const listGeoipDatCountriesFromBuffer = nativeBinding.listGeoipDatCountriesFromBuffer
105
+ export const listGeositeCodes = nativeBinding.listGeositeCodes
106
+ export const listGeositeCodesFromBuffer = nativeBinding.listGeositeCodesFromBuffer
107
+ export const listAsnNumbers = nativeBinding.listAsnNumbers
108
+ export const listAsnNumbersFromBuffer = nativeBinding.listAsnNumbersFromBuffer
109
+ export const matchBuf = nativeBinding.matchBuf
110
+ export const matchStr = nativeBinding.matchStr
111
+ export const matchFile = nativeBinding.matchFile
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uruhalushia/rule-converter-napi",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "Node.js bindings for converting mihomo, sing-box, Egern, and generic rule sets.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -51,17 +51,17 @@
51
51
  "@napi-rs/cli": "^3"
52
52
  },
53
53
  "optionalDependencies": {
54
- "@uruhalushia/rule-converter-napi-linux-x64-gnu": "0.1.3",
55
- "@uruhalushia/rule-converter-napi-linux-arm64-gnu": "0.1.3",
56
- "@uruhalushia/rule-converter-napi-linux-riscv64-gnu": "0.1.3",
57
- "@uruhalushia/rule-converter-napi-linux-loong64-gnu": "0.1.3",
58
- "@uruhalushia/rule-converter-napi-linux-x64-musl": "0.1.3",
59
- "@uruhalushia/rule-converter-napi-linux-arm64-musl": "0.1.3",
60
- "@uruhalushia/rule-converter-napi-linux-riscv64-musl": "0.1.3",
61
- "@uruhalushia/rule-converter-napi-linux-loong64-musl": "0.1.3",
62
- "@uruhalushia/rule-converter-napi-darwin-x64": "0.1.3",
63
- "@uruhalushia/rule-converter-napi-darwin-arm64": "0.1.3",
64
- "@uruhalushia/rule-converter-napi-win32-x64-msvc": "0.1.3",
65
- "@uruhalushia/rule-converter-napi-win32-arm64-msvc": "0.1.3"
54
+ "@uruhalushia/rule-converter-napi-linux-x64-gnu": "0.2.0",
55
+ "@uruhalushia/rule-converter-napi-linux-arm64-gnu": "0.2.0",
56
+ "@uruhalushia/rule-converter-napi-linux-riscv64-gnu": "0.2.0",
57
+ "@uruhalushia/rule-converter-napi-linux-loong64-gnu": "0.2.0",
58
+ "@uruhalushia/rule-converter-napi-linux-x64-musl": "0.2.0",
59
+ "@uruhalushia/rule-converter-napi-linux-arm64-musl": "0.2.0",
60
+ "@uruhalushia/rule-converter-napi-linux-riscv64-musl": "0.2.0",
61
+ "@uruhalushia/rule-converter-napi-linux-loong64-musl": "0.2.0",
62
+ "@uruhalushia/rule-converter-napi-darwin-x64": "0.2.0",
63
+ "@uruhalushia/rule-converter-napi-darwin-arm64": "0.2.0",
64
+ "@uruhalushia/rule-converter-napi-win32-x64-msvc": "0.2.0",
65
+ "@uruhalushia/rule-converter-napi-win32-arm64-msvc": "0.2.0"
66
66
  }
67
67
  }