webext-schema 5.1.9 → 5.1.11

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.
package/README.md CHANGED
@@ -9,13 +9,13 @@ Stubbed browser API is also available.
9
9
 
10
10
  ## Install
11
11
 
12
- ```
12
+ ```console
13
13
  npm i webext-schema
14
14
  ```
15
15
 
16
16
  ## Usage
17
17
 
18
- ```
18
+ ```javascript
19
19
  import { Schema } from 'webext-schema';
20
20
 
21
21
  const schema = new Schema();
@@ -28,7 +28,7 @@ const schema = new Schema();
28
28
 
29
29
  Both arguments are optional.
30
30
 
31
- ```
31
+ ```javascript
32
32
  const schema = new Schema("central", {
33
33
  useFakeTimers: true,
34
34
  useFakeServer: true,
@@ -40,13 +40,13 @@ const schema = new Schema("central", {
40
40
  "central", "beta", "release", "esr" for WebExtensions, and "mail" for MailExtensions are available.
41
41
  Channel defaults to "beta".
42
42
 
43
- ```
43
+ ```javascript
44
44
  const schema = new Schema("central");
45
45
  ```
46
46
 
47
47
  Also, you can set it afterwards.
48
48
 
49
- ```
49
+ ```javascript
50
50
  const schema = new Schema();
51
51
  schema.channel = "central";
52
52
  ```
@@ -59,12 +59,12 @@ schema.channel = "central";
59
59
  Get the schema for the specific API.
60
60
  Argument can be either an API name or a file name.
61
61
 
62
- ```
62
+ ```javascript
63
63
  const schema = new Schema().get("browserAction");
64
64
  // [{namespace: "browserAction", events: [...], ...}]
65
65
  ```
66
66
 
67
- ```
67
+ ```javascript
68
68
  const schema = new Schema().get("browser_action.json");
69
69
  // [{namespace: "browserAction", events: [...], ...}]
70
70
  ```
@@ -76,7 +76,7 @@ const schema = new Schema().get("browser_action.json");
76
76
  Get all schemas as a single object.
77
77
  Note that the key of the object is the file name and the value is the schema.
78
78
 
79
- ```
79
+ ```javascript
80
80
  const schema = new Schema().getAll();
81
81
  // {"alarms.json": [{...}], "bookmarks.json": [{...}], ...}
82
82
  ```
@@ -87,7 +87,7 @@ const schema = new Schema().getAll();
87
87
 
88
88
  Get the list of schema files.
89
89
 
90
- ```
90
+ ```javascript
91
91
  const list = new Schema().list();
92
92
  // ["alarms.json", "bookmarks.json", ...]
93
93
  ```
@@ -105,18 +105,18 @@ Creates stubbed browser API.
105
105
 
106
106
  See [Sinon.JS](https://sinonjs.org/) for details of sinon.sandbox.
107
107
 
108
- ```
108
+ ```javascript
109
109
  const browser = new Schema().mock();
110
110
 
111
111
  // example of mocking runtime.connect()
112
- const mockConnect = browser.runtime.connect.callsFake(({name}) => {
112
+ const mockConnect = browser.runtime.connect.callsFake(({ name }) => {
113
113
  const port = Object.assign({}, browser.runtime.Port);
114
114
  port.name = name;
115
115
  return port;
116
116
  });
117
117
 
118
- const port1 = mockConnect({name: "foo"});
119
- const port2 = mockConnect({name: "bar"});
118
+ const port1 = mockConnect({ name: "foo" });
119
+ const port2 = mockConnect({ name: "bar" });
120
120
  assert.strictEqual(port1.name, "foo");
121
121
  assert.isFunction(port1.onDisconnect.addListener);
122
122
  assert.strictEqual(port2.name, "bar");
package/package.json CHANGED
@@ -14,29 +14,29 @@
14
14
  "types": "types/index.d.ts",
15
15
  "dependencies": {
16
16
  "@types/firefox-webext-browser": "^111.0.0",
17
- "@types/node": "^18.14.6",
17
+ "@types/node": "^18.15.10",
18
18
  "@types/sinon": "^10.0.13",
19
19
  "camelize": "^1.0.1",
20
20
  "commander": "^10.0.0",
21
21
  "decamelize": "^6.0.0",
22
22
  "json5": "^2.2.3",
23
- "sinon": "^15.0.1"
23
+ "sinon": "^15.0.3"
24
24
  },
25
25
  "devDependencies": {
26
26
  "c8": "^7.13.0",
27
27
  "chai": "^4.3.7",
28
- "eslint": "^8.35.0",
28
+ "eslint": "^8.36.0",
29
29
  "eslint-config-standard": "^17.0.0",
30
30
  "eslint-plugin-import": "^2.27.5",
31
- "eslint-plugin-jsdoc": "^40.0.1",
31
+ "eslint-plugin-jsdoc": "^40.1.0",
32
32
  "eslint-plugin-node": "^11.1.0",
33
33
  "eslint-plugin-promise": "^6.1.1",
34
- "eslint-plugin-regexp": "^1.12.0",
34
+ "eslint-plugin-regexp": "^1.13.0",
35
35
  "eslint-plugin-unicorn": "^46.0.0",
36
36
  "mocha": "^10.2.0",
37
37
  "npm-run-all": "^4.1.5",
38
- "typescript": "^4.9.5",
39
- "undici": "^5.20.0"
38
+ "typescript": "^5.0.2",
39
+ "undici": "^5.21.0"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "npm run tsc && npm run lint && npm run test",
@@ -56,5 +56,5 @@
56
56
  "update-mail": "node index update --channel=mail -i",
57
57
  "update-release": "node index update --channel=release -i"
58
58
  },
59
- "version": "5.1.9"
59
+ "version": "5.1.11"
60
60
  }
@@ -9721,13 +9721,24 @@
9721
9721
  }
9722
9722
  ]
9723
9723
  },
9724
+ {
9725
+ "$extend": "OptionalPermission",
9726
+ "choices": [
9727
+ {
9728
+ "type": "string",
9729
+ "enum": [
9730
+ "declarativeNetRequestFeedback"
9731
+ ],
9732
+ "min_manifest_version": 3
9733
+ }
9734
+ ]
9735
+ },
9724
9736
  {
9725
9737
  "$extend": "PermissionNoPrompt",
9726
9738
  "choices": [
9727
9739
  {
9728
9740
  "type": "string",
9729
9741
  "enum": [
9730
- "declarativeNetRequestFeedback",
9731
9742
  "declarativeNetRequestWithHostAccess"
9732
9743
  ],
9733
9744
  "min_manifest_version": 3
@@ -9811,6 +9822,15 @@
9811
9822
  "other"
9812
9823
  ]
9813
9824
  },
9825
+ {
9826
+ "id": "UnsupportedRegexReason",
9827
+ "type": "string",
9828
+ "description": "Describes the reason why a given regular expression isn't supported.",
9829
+ "enum": [
9830
+ "syntaxError",
9831
+ "memoryLimitExceeded"
9832
+ ]
9833
+ },
9814
9834
  {
9815
9835
  "id": "MatchedRule",
9816
9836
  "type": "object",
@@ -10093,7 +10113,7 @@
10093
10113
  "regexSubstitution": {
10094
10114
  "type": "string",
10095
10115
  "optional": true,
10096
- "description": "TODO with regexFilter + Substitution pattern for rules which specify a 'regexFilter'."
10116
+ "description": "Substitution pattern for rules which specify a 'regexFilter'. The first match of regexFilter within the url will be replaced with this pattern. Within regexSubstitution, backslash-escaped digits (\\1 to \\9) can be used to insert the corresponding capture groups. \\0 refers to the entire matching text."
10097
10117
  }
10098
10118
  }
10099
10119
  },
@@ -10349,6 +10369,57 @@
10349
10369
  }
10350
10370
  ]
10351
10371
  },
10372
+ {
10373
+ "name": "isRegexSupported",
10374
+ "type": "function",
10375
+ "description": "Checks if the given regular expression will be supported as a 'regexFilter' rule condition.",
10376
+ "async": "callback",
10377
+ "parameters": [
10378
+ {
10379
+ "name": "regexOptions",
10380
+ "type": "object",
10381
+ "properties": {
10382
+ "regex": {
10383
+ "type": "string",
10384
+ "description": "The regular expresson to check."
10385
+ },
10386
+ "isCaseSensitive": {
10387
+ "type": "boolean",
10388
+ "optional": true,
10389
+ "description": "Whether the 'regex' specified is case sensitive.",
10390
+ "default": false
10391
+ },
10392
+ "requireCapturing": {
10393
+ "type": "boolean",
10394
+ "optional": true,
10395
+ "description": "Whether the 'regex' specified requires capturing. Capturing is only required for redirect rules which specify a 'regexSubstition' action.",
10396
+ "default": false
10397
+ }
10398
+ }
10399
+ },
10400
+ {
10401
+ "name": "callback",
10402
+ "type": "function",
10403
+ "parameters": [
10404
+ {
10405
+ "name": "result",
10406
+ "type": "object",
10407
+ "properties": {
10408
+ "isSupported": {
10409
+ "type": "boolean",
10410
+ "description": "Whether the given regex is supported"
10411
+ },
10412
+ "reason": {
10413
+ "$ref": "UnsupportedRegexReason",
10414
+ "optional": true,
10415
+ "description": "Specifies the reason why the regular expression is not supported. Only provided if 'isSupported' is false."
10416
+ }
10417
+ }
10418
+ }
10419
+ ]
10420
+ }
10421
+ ]
10422
+ },
10352
10423
  {
10353
10424
  "name": "testMatchOutcome",
10354
10425
  "type": "function",
@@ -10447,6 +10518,10 @@
10447
10518
  "type": "number",
10448
10519
  "description": "The maximum number of dynamic and session rules an extension can add. NOTE: in the Firefox we are enforcing this limit to the session and dynamic rules count separately, instead of enforcing it to the rules count for both combined as the Chrome implementation does."
10449
10520
  },
10521
+ "MAX_NUMBER_OF_REGEX_RULES": {
10522
+ "type": "number",
10523
+ "description": "The maximum number of regular expression rules that an extension can add. This limit is evaluated separately for the set of session rules, dynamic rules and those specified in the rule_resources file."
10524
+ },
10450
10525
  "SESSION_RULESET_ID": {
10451
10526
  "type": "string",
10452
10527
  "value": "_session",
@@ -12415,7 +12490,7 @@
12415
12490
  "mainthreadio",
12416
12491
  "fileio",
12417
12492
  "fileioall",
12418
- "noiostacks",
12493
+ "nomarkerstacks",
12419
12494
  "screenshots",
12420
12495
  "seqstyle",
12421
12496
  "stackwalk",
@@ -13572,6 +13647,14 @@
13572
13647
  "$ref": "ExtensionURL"
13573
13648
  }
13574
13649
  },
13650
+ "type": {
13651
+ "optional": true,
13652
+ "type": "string",
13653
+ "enum": [
13654
+ "module",
13655
+ "classic"
13656
+ ]
13657
+ },
13575
13658
  "persistent": {
13576
13659
  "optional": true,
13577
13660
  "type": "boolean",
@@ -20148,6 +20231,26 @@
20148
20231
  },
20149
20232
  "description": "list of reasons that cause the request to be considered weak, if state is \"weak\"",
20150
20233
  "optional": true
20234
+ },
20235
+ "usedEch": {
20236
+ "type": "boolean",
20237
+ "description": "True if the TLS connection used Encrypted Client Hello.",
20238
+ "optional": true
20239
+ },
20240
+ "usedDelegatedCredentials": {
20241
+ "type": "boolean",
20242
+ "description": "True if the TLS connection used Delegated Credentials.",
20243
+ "optional": true
20244
+ },
20245
+ "usedOcsp": {
20246
+ "type": "boolean",
20247
+ "description": "True if the TLS connection made OCSP requests.",
20248
+ "optional": true
20249
+ },
20250
+ "usedPrivateDns": {
20251
+ "type": "boolean",
20252
+ "description": "True if the TLS connection used a privacy-preserving DNS transport like DNS-over-HTTPS.",
20253
+ "optional": true
20151
20254
  }
20152
20255
  }
20153
20256
  },
@@ -9822,6 +9822,15 @@
9822
9822
  "other"
9823
9823
  ]
9824
9824
  },
9825
+ {
9826
+ "id": "UnsupportedRegexReason",
9827
+ "type": "string",
9828
+ "description": "Describes the reason why a given regular expression isn't supported.",
9829
+ "enum": [
9830
+ "syntaxError",
9831
+ "memoryLimitExceeded"
9832
+ ]
9833
+ },
9825
9834
  {
9826
9835
  "id": "MatchedRule",
9827
9836
  "type": "object",
@@ -10104,7 +10113,7 @@
10104
10113
  "regexSubstitution": {
10105
10114
  "type": "string",
10106
10115
  "optional": true,
10107
- "description": "TODO with regexFilter + Substitution pattern for rules which specify a 'regexFilter'."
10116
+ "description": "Substitution pattern for rules which specify a 'regexFilter'. The first match of regexFilter within the url will be replaced with this pattern. Within regexSubstitution, backslash-escaped digits (\\1 to \\9) can be used to insert the corresponding capture groups. \\0 refers to the entire matching text."
10108
10117
  }
10109
10118
  }
10110
10119
  },
@@ -10360,6 +10369,57 @@
10360
10369
  }
10361
10370
  ]
10362
10371
  },
10372
+ {
10373
+ "name": "isRegexSupported",
10374
+ "type": "function",
10375
+ "description": "Checks if the given regular expression will be supported as a 'regexFilter' rule condition.",
10376
+ "async": "callback",
10377
+ "parameters": [
10378
+ {
10379
+ "name": "regexOptions",
10380
+ "type": "object",
10381
+ "properties": {
10382
+ "regex": {
10383
+ "type": "string",
10384
+ "description": "The regular expresson to check."
10385
+ },
10386
+ "isCaseSensitive": {
10387
+ "type": "boolean",
10388
+ "optional": true,
10389
+ "description": "Whether the 'regex' specified is case sensitive.",
10390
+ "default": false
10391
+ },
10392
+ "requireCapturing": {
10393
+ "type": "boolean",
10394
+ "optional": true,
10395
+ "description": "Whether the 'regex' specified requires capturing. Capturing is only required for redirect rules which specify a 'regexSubstition' action.",
10396
+ "default": false
10397
+ }
10398
+ }
10399
+ },
10400
+ {
10401
+ "name": "callback",
10402
+ "type": "function",
10403
+ "parameters": [
10404
+ {
10405
+ "name": "result",
10406
+ "type": "object",
10407
+ "properties": {
10408
+ "isSupported": {
10409
+ "type": "boolean",
10410
+ "description": "Whether the given regex is supported"
10411
+ },
10412
+ "reason": {
10413
+ "$ref": "UnsupportedRegexReason",
10414
+ "optional": true,
10415
+ "description": "Specifies the reason why the regular expression is not supported. Only provided if 'isSupported' is false."
10416
+ }
10417
+ }
10418
+ }
10419
+ ]
10420
+ }
10421
+ ]
10422
+ },
10363
10423
  {
10364
10424
  "name": "testMatchOutcome",
10365
10425
  "type": "function",
@@ -10458,6 +10518,10 @@
10458
10518
  "type": "number",
10459
10519
  "description": "The maximum number of dynamic and session rules an extension can add. NOTE: in the Firefox we are enforcing this limit to the session and dynamic rules count separately, instead of enforcing it to the rules count for both combined as the Chrome implementation does."
10460
10520
  },
10521
+ "MAX_NUMBER_OF_REGEX_RULES": {
10522
+ "type": "number",
10523
+ "description": "The maximum number of regular expression rules that an extension can add. This limit is evaluated separately for the set of session rules, dynamic rules and those specified in the rule_resources file."
10524
+ },
10461
10525
  "SESSION_RULESET_ID": {
10462
10526
  "type": "string",
10463
10527
  "value": "_session",
@@ -4087,7 +4087,7 @@
4087
4087
  "default": false
4088
4088
  },
4089
4089
  "default_area": {
4090
- "description": "Defines the location the action button will appear. The default location is <value>maintoolbar</value>.",
4090
+ "description": "Defines the location the action button will appear. This will always behave like <value>maintoolbar</value>. The <value>tabstoolbar</value> area should no longer be used.",
4091
4091
  "type": "string",
4092
4092
  "enum": [
4093
4093
  "maintoolbar",
@@ -4109,6 +4109,26 @@
4109
4109
  "normal"
4110
4110
  ],
4111
4111
  "optional": true
4112
+ },
4113
+ "allowed_spaces": {
4114
+ "description": "Defines the spaces, in which the action button can appear in the toolbar of the normal Thunderbird window. Defaults to only allowing the action in the <value>mail</value> space. The <value>default</value> space is for tabs that don't belong to any space. If this is an empty array, the action button is shown in all spaces.",
4115
+ "type": "array",
4116
+ "items": {
4117
+ "type": "string",
4118
+ "enum": [
4119
+ "mail",
4120
+ "addressbook",
4121
+ "calendar",
4122
+ "tasks",
4123
+ "chat",
4124
+ "settings",
4125
+ "default"
4126
+ ]
4127
+ },
4128
+ "default": [
4129
+ "mail"
4130
+ ],
4131
+ "optional": true
4112
4132
  }
4113
4133
  }
4114
4134
  },
@@ -4359,7 +4379,8 @@
4359
4379
  "parameters": [
4360
4380
  {
4361
4381
  "name": "result",
4362
- "type": "string"
4382
+ "type": "string",
4383
+ "optional": true
4363
4384
  }
4364
4385
  ]
4365
4386
  }
@@ -4664,7 +4685,7 @@
4664
4685
  {
4665
4686
  "name": "enable",
4666
4687
  "type": "function",
4667
- "description": "Enables the action button for a tab. By default, an action button is enabled.",
4688
+ "description": "Enables the action button for a specific tab (if a ``tabId`` is provided), or for all tabs which do not have a custom enable state. Once the enable state of a tab has been updated individually, all further changes to its state have to be done individually as well. By default, an action button is enabled.",
4668
4689
  "async": "callback",
4669
4690
  "parameters": [
4670
4691
  {
@@ -4685,7 +4706,7 @@
4685
4706
  {
4686
4707
  "name": "disable",
4687
4708
  "type": "function",
4688
- "description": "Disables the action button for a tab.",
4709
+ "description": "Disables the action button for a specific tab (if a ``tabId`` is provided), or for all tabs which do not have a custom enable state. Once the enable state of a tab has been updated individually, all further changes to its state have to be done individually as well.",
4689
4710
  "async": "callback",
4690
4711
  "parameters": [
4691
4712
  {
@@ -4743,7 +4764,6 @@
4743
4764
  {
4744
4765
  "name": "openPopup",
4745
4766
  "type": "function",
4746
- "requireUserInput": true,
4747
4767
  "description": "Opens the action's popup window in the active window.",
4748
4768
  "async": true,
4749
4769
  "parameters": []
@@ -6801,7 +6821,8 @@
6801
6821
  "parameters": [
6802
6822
  {
6803
6823
  "name": "result",
6804
- "type": "string"
6824
+ "type": "string",
6825
+ "optional": true
6805
6826
  }
6806
6827
  ]
6807
6828
  }
@@ -9449,7 +9470,7 @@
9449
9470
  "window"
9450
9471
  ],
9451
9472
  "optional": true,
9452
- "description": "Where to open the message. If not specified, the users preference is honoured. Ignored for external messages, which are always opened in a new window."
9473
+ "description": "Where to open the message. If not specified, the users preference is honoured."
9453
9474
  },
9454
9475
  "active": {
9455
9476
  "type": "boolean",
@@ -9766,7 +9787,8 @@
9766
9787
  "parameters": [
9767
9788
  {
9768
9789
  "name": "result",
9769
- "type": "string"
9790
+ "type": "string",
9791
+ "optional": true
9770
9792
  }
9771
9793
  ]
9772
9794
  }
@@ -1,4 +1,4 @@
1
1
  export function cleanDirectory(cmdOpts?: object): void;
2
2
  export function parseCommand(args: any[]): void;
3
3
  export { commander };
4
- import { program as commander } from "commander";
4
+ import { program as commander } from 'commander';
@@ -23,4 +23,4 @@ export class Schema {
23
23
  mock(): object;
24
24
  #private;
25
25
  }
26
- import sinon from "sinon";
26
+ import sinon from 'sinon';