Преглед изворни кода

refactor: enable modern regex syntax via babel

tophf пре 3 година
родитељ
комит
a6f8e61c65
7 измењених фајлова са 178 додато и 46 уклоњено
  1. 1 0
      .babelrc.js
  2. 4 1
      .eslintrc.js
  3. 1 0
      package.json
  4. 32 24
      src/background/utils/requests-core.js
  5. 14 17
      src/background/utils/tab-redirector.js
  6. 16 3
      src/common/util.js
  7. 110 1
      yarn.lock

+ 1 - 0
.babelrc.js

@@ -19,5 +19,6 @@ module.exports = {
   plugins: [
     './scripts/babel-plugin-safe-bind.js',
     ['@babel/plugin-transform-for-of', { assumeArray: true }],
+    ['transform-modern-regexp', { useRe: true }],
   ],
 };

+ 4 - 1
.eslintrc.js

@@ -13,7 +13,10 @@ const FILES_SHARED = [
   'src/common/consts.js',
 ];
 
-const GLOBALS_COMMON = getGlobals('src/common/safe-globals.js');
+const GLOBALS_COMMON = {
+  ...getGlobals('src/common/safe-globals.js'),
+  re: false, // transform-modern-regexp with useRe option
+};
 const GLOBALS_INJECTED = getGlobals(`src/injected/safe-globals-injected.js`);
 const GLOBALS_CONTENT = {
   INIT_FUNC_NAME: false,

+ 1 - 0
package.json

@@ -35,6 +35,7 @@
     "@types/chrome": "^0.0.191",
     "@types/firefox-webext-browser": "94.0.1",
     "amo-upload": "^0.2.0",
+    "babel-plugin-transform-modern-regexp": "^0.0.6",
     "cross-env": "^7.0.3",
     "cross-spawn": "^7.0.3",
     "del": "^6.1.1",

+ 32 - 24
src/background/utils/requests-core.js

@@ -24,28 +24,34 @@ export const VM_VERIFY = getUniqId('VM-Verify');
 /** @type {Object<string,VMHttpRequest>} */
 export const requests = { __proto__: null };
 export const verify = { __proto__: null };
-export const FORBIDDEN_HEADER_RE = new RegExp(`^(proxy-|sec-|${[
-  'user-agent',
-  // https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
-  // https://cs.chromium.org/?q=file:cc+symbol:IsForbiddenHeader%5Cb
-  'accept-(charset|encoding)',
-  'access-control-request-(headers|method)',
-  'connection',
-  'content-length',
-  'cookie2?',
-  'date',
-  'dnt',
-  'expect',
-  'host',
-  'keep-alive',
-  'origin',
-  'referer',
-  'te',
-  'trailer',
-  'transfer-encoding',
-  'upgrade',
-  'via',
-].join('|')})$`, 'i');
+export const FORBIDDEN_HEADER_RE = re`/
+^(
+  # prefix matches
+  proxy-|
+  sec-
+)|^(
+  # whole name matches
+  user-agent|
+  # https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
+  # https://cs.chromium.org/?q=file:cc+symbol:IsForbiddenHeader%5Cb
+  accept-(charset|encoding)|
+  access-control-request-(headers|method)|
+  connection|
+  content-length|
+  cookie2?|
+  date|
+  dnt|
+  expect|
+  host|
+  keep-alive|
+  origin|
+  referer|
+  te|
+  trailer|
+  transfer-encoding|
+  upgrade|
+  via
+)$/ix`;
 /** @type chrome.webRequest.RequestFilter */
 const API_FILTER = {
   urls: ['<all_urls>'],
@@ -62,8 +68,10 @@ const isSendable = header => !isVmVerify(header)
   && !(/^origin$/i.test(header.name) && header.value === extensionOrigin);
 const isSendableAnon = header => isSendable(header) && isNotCookie(header);
 const SET_COOKIE_RE = /^set-cookie2?$/i;
-const SET_COOKIE_VALUE_RE = /^\s*(?:__(Secure|Host)-)?([^=\s]+)\s*=\s*(")?([!#-+\--:<-[\]-~]*)\3(.*)/;
-const SET_COOKIE_ATTR_RE = /\s*;?\s*(\w+)(?:=(")?([!#-+\--:<-[\]-~]*)\2)?/y;
+const SET_COOKIE_VALUE_RE = re`
+  /^\s*  (?:__(Secure|Host)-)?  ([^=\s]+)  \s*=\s*  (")?  ([!#-+\--:<-[\]-~]*)  \3(.*)  /x`;
+const SET_COOKIE_ATTR_RE = re`
+  /\s*  ;?\s*  (\w+)  (?:= (")?  ([!#-+\--:<-[\]-~]*)  \2)?  /xy`;
 const SAME_SITE_MAP = {
   strict: 'strict',
   lax: 'lax',

+ 14 - 17
src/background/utils/tab-redirector.js

@@ -37,23 +37,20 @@ Object.assign(commands, {
   },
 });
 
-const whitelistRe = new RegExp(`^https://(${
-  [
-    'greasyfork\\.org/scripts/%/code/',
-    'openuserjs\\.org/install/%/',
-    'github\\.com/%/%/raw/%/',
-    'github\\.com/%/%/releases/%/download/',
-    'raw\\.githubusercontent\\.com(/%){3}/',
-    'gist\\.github\\.com/.*?/',
-  ].join('|')
-})%?\\.user\\.js([?#]|$)`.replace(/%/g, '[^/]*'));
-const blacklistRe = new RegExp(`^https://(${
-  [
-    '(gist\\.)?github\\.com',
-    'greasyfork\\.org',
-    'openuserjs\\.org',
-  ].join('|')
-})/`);
+const whitelistRe = re`/^https:\/\/(
+  greasyfork\.org\/scripts\/[^/]*\/code|
+  openuserjs\.org\/install\/[^/]*|
+  github\.com\/[^/]*\/[^/]*\/(
+    raw\/[^/]*|
+    releases\/[^/]*\/download
+  )|
+  raw\.githubusercontent\.com(\/[^/]*){3}|
+  gist\.github\.com\/.*?
+)\/[^/]*?\.user\.js  ([?#]|$)  /ix`;
+const blacklistRe = re`/^https?:\/\/(
+  (gist\\.)?github\\.com|
+  (greasyfork|openuserjs)\\.org
+)\//ix`;
 const resolveVirtualUrl = url => (
   `${extensionRoot}options/index.html#scripts/${+url.split('#')[1]}`
 );

+ 16 - 3
src/common/util.js

@@ -263,9 +263,22 @@ const FORCED_ACCEPT = {
   'greasyfork.org': 'application/javascript, text/plain, text/css',
 };
 
-export const isDataUri = url => /^data:/.test(url);
-export const isRemote = url => url
-  && !(/^(file:\/\/|data:|https?:\/\/([^@/]*@)?(localhost|127\.0\.0\.1|(192\.168|172\.16|10\.0)\.[0-9]+\.[0-9]+|\[(::1|(fe80|fc00)::[.:0-9a-f]+)\]|.+\.(test|example|invalid|localhost))(:[0-9]+|\/|$))/i.test(url));
+const isLocalUrlRe = re`/^(
+  file:\/\/|
+  data:|
+  https?:\/\/
+    ([^@/]*@)?
+    (
+      localhost|
+      127\.0\.0\.1|
+      (192\.168|172\.16|10\.0)\.\d+\.\d+|
+      \[(::1|(fe80|fc00)::[.:0-9a-f]+)]|
+      [^/:]+\.(test|example|invalid|localhost)
+    )
+    (:\d+|\/|$)
+)/ix`;
+export const isDataUri = url => /^data:/i.test(url);
+export const isRemote = url => url && !isLocalUrlRe.test(decodeURI(url));
 
 /** @typedef {{
   url: string,

+ 110 - 1
yarn.lock

@@ -2329,6 +2329,13 @@ babel-plugin-syntax-object-rest-spread@^6.8.0:
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
   integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
 
+babel-plugin-transform-modern-regexp@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-modern-regexp/-/babel-plugin-transform-modern-regexp-0.0.6.tgz#010be0b62e4695a2006bd8ddb3ae0f5e5b0fc067"
+  integrity sha512-DCCahkmEpqKDrHMKs/Cd6La4AQLnjoPwJAolzDIuLHkI8SFZLyleUwLfsUGxKMV9iJnsPtY0YWd1RpAbv2YFLg==
+  dependencies:
+    regexp-tree "^0.0.85"
+
 babel-plugin-transform-object-rest-spread@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
@@ -2782,6 +2789,11 @@ camelcase@^3.0.0:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
   integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
 
+camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+  integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==
+
 camelcase@^5.0.0, camelcase@^5.3.1:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@@ -2931,6 +2943,16 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
+cli-table3@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
+  integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==
+  dependencies:
+    object-assign "^4.1.0"
+    string-width "^2.1.1"
+  optionalDependencies:
+    colors "^1.1.2"
+
 cli-width@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
@@ -3119,6 +3141,11 @@ color@^4.2.3:
     color-convert "^2.0.1"
     color-string "^1.9.0"
 
+colors@^1.1.2:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+  integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
 combined-stream@^1.0.8:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -3408,6 +3435,15 @@ [email protected], cross-spawn@^6.0.0, cross-spawn@^6.0.5:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
+cross-spawn@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
 cross-spawn@^7.0.0, cross-spawn@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
@@ -4698,6 +4734,19 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
     md5.js "^1.3.4"
     safe-buffer "^5.1.1"
 
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
 execa@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
@@ -5317,6 +5366,11 @@ get-package-type@^0.1.0:
   resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
   integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
 
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+  integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==
+
 get-stream@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@@ -7141,7 +7195,7 @@ lower-case@^2.0.1:
   dependencies:
     tslib "^1.10.0"
 
-lru-cache@^4.1.2:
+lru-cache@^4.0.1, lru-cache@^4.1.2:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
   integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
@@ -7238,6 +7292,13 @@ [email protected]:
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
   integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
 
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  integrity sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==
+  dependencies:
+    mimic-fn "^1.0.0"
+
 mem@^4.0.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
@@ -7383,6 +7444,11 @@ mime@^2.4.4:
   resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
   integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
 
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+  integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
 mimic-fn@^2.0.0, mimic-fn@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -8059,6 +8125,15 @@ os-locale@^1.4.0:
   dependencies:
     lcid "^1.0.0"
 
+os-locale@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
 os-locale@^3.0.0, os-locale@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
@@ -9738,6 +9813,15 @@ regex-not@^1.0.0, regex-not@^1.0.2:
     extend-shallow "^3.0.2"
     safe-regex "^1.1.0"
 
+regexp-tree@^0.0.85:
+  version "0.0.85"
+  resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.0.85.tgz#278ef1946084e9ddd84b26e69828aab69e3c3186"
+  integrity sha512-KkuweOhL1M00EHljLhq2lARpLoazdKd0BpkfOZKcO55lWhRqeRCIPSPGf9osgMPj1l/0v37FaqDwa9Ks1W+92A==
+  dependencies:
+    cli-table3 "^0.5.0"
+    colors "^1.1.2"
+    yargs "^10.0.3"
+
 regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
@@ -12407,6 +12491,13 @@ yargs-parser@^5.0.0:
   dependencies:
     camelcase "^3.0.0"
 
+yargs-parser@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+  integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
+  dependencies:
+    camelcase "^4.1.0"
+
 [email protected]:
   version "12.0.5"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
@@ -12442,6 +12533,24 @@ [email protected]:
     y18n "^4.0.0"
     yargs-parser "^13.1.0"
 
+yargs@^10.0.3:
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+  integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.1.0"
+
 yargs@^7.1.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"