mirror of
https://github.com/hanzoai/babel.git
synced 2026-09-24 16:56:45 +00:00
refactor: Shrink validator identifier size (#18084)
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
package.json
|
||||
packages/babel-helper-validator-identifier/data
|
||||
packages/babel-preset-env/data
|
||||
packages/babel-compat-data/data
|
||||
packages/babel-compat-data/scripts/data/overlapping-plugins.js
|
||||
|
||||
@@ -3,5 +3,4 @@ test
|
||||
*.log
|
||||
tsconfig.json
|
||||
tsconfig.tsbuildinfo
|
||||
data
|
||||
scripts
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
"\u00b7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1add\u1ae0-\u1aeb\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"
|
||||
@@ -1 +0,0 @@
|
||||
"\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088f\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5c\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdc-\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7dc\ua7f1-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"
|
||||
@@ -1 +0,0 @@
|
||||
[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,7,9,32,4,318,1,78,5,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,68,8,2,0,3,0,2,3,2,4,2,0,15,1,83,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,7,19,58,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,199,7,137,9,54,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,55,9,266,3,10,1,2,0,49,6,4,4,14,10,5350,0,7,14,11465,27,2343,9,87,9,39,4,60,6,26,9,535,9,470,0,2,54,8,3,82,0,12,1,19628,1,4178,9,519,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,245,1,2,9,233,0,3,0,8,1,6,0,475,6,110,6,6,9,4759,9,787719,239]
|
||||
@@ -1 +0,0 @@
|
||||
[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,7,25,39,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,39,27,10,22,251,41,7,1,17,5,57,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,31,9,2,0,3,0,2,37,2,0,26,0,2,0,45,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,200,32,32,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,24,43,261,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,26,3994,6,582,6842,29,1763,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,433,44,212,63,33,24,3,24,45,74,6,0,67,12,65,1,2,0,15,4,10,7381,42,31,98,114,8702,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,229,29,3,0,208,30,2,2,2,1,2,6,3,4,10,1,225,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4381,3,5773,3,7472,16,621,2467,541,1507,4938,6,8489]
|
||||
@@ -19,9 +19,23 @@
|
||||
},
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"imports": {
|
||||
"#identifier": {
|
||||
"babel-src": {
|
||||
"browser": "./src/identifier-browser.ts",
|
||||
"default": "./src/identifier.ts"
|
||||
},
|
||||
"types": "./lib/identifier.d.ts",
|
||||
"browser": "./lib/identifier-browser.js",
|
||||
"default": "./lib/identifier.js"
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@unicode/unicode-17.0.0": "^1.6.10",
|
||||
"charcodes": "^0.2.0"
|
||||
"@types/regenerate": "^1.4.0",
|
||||
"@unicode/unicode-16.0.0": "^1.6.17",
|
||||
"@unicode/unicode-17.0.0": "^1.6.17",
|
||||
"charcodes": "^0.2.0",
|
||||
"regenerate": "^1.4.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^22.18.0 || >=24.11.0"
|
||||
|
||||
@@ -2,47 +2,90 @@ import fs from "node:fs";
|
||||
// Always use the latest available version of Unicode!
|
||||
// https://tc39.github.io/ecma262/#sec-conformance
|
||||
import packageJson from "../package.json" with { type: "json" };
|
||||
import regenerate from "regenerate";
|
||||
import assert from "node:assert";
|
||||
|
||||
const unicodePackageNamePrefix = "@unicode/unicode-";
|
||||
const unicodePackageName = Object.keys(packageJson.devDependencies).find(name =>
|
||||
name.startsWith(unicodePackageNamePrefix)
|
||||
// Use findLast to ensure it returns the latest version of Unicode
|
||||
const unicodePackageName = Object.keys(packageJson.devDependencies).findLast(
|
||||
name => name.startsWith(unicodePackageNamePrefix)
|
||||
);
|
||||
|
||||
const start = (
|
||||
await import(`${unicodePackageName}/Binary_Property/ID_Start/code-points.js`)
|
||||
).default.filter(function (ch: number) {
|
||||
return ch > 0x7f;
|
||||
});
|
||||
let last = -1;
|
||||
const cont = (
|
||||
await import(
|
||||
`${unicodePackageName}/Binary_Property/ID_Continue/code-points.js`
|
||||
)
|
||||
).default.filter(function (ch: number) {
|
||||
return ch > 0x7f && search(start, ch, last + 1) === -1;
|
||||
});
|
||||
type UnicodeRange = {
|
||||
readonly begin: number;
|
||||
readonly end: number;
|
||||
};
|
||||
|
||||
function search(arr: number[], ch: number, starting: number) {
|
||||
for (let i = starting; arr[i] <= ch && i < arr.length; last = i++) {
|
||||
if (arr[i] === ch) return i;
|
||||
}
|
||||
return -1;
|
||||
import unicode16Start from "@unicode/unicode-16.0.0/Binary_Property/ID_Start/ranges.js";
|
||||
import unicode16Cont from "@unicode/unicode-16.0.0/Binary_Property/ID_Continue/ranges.js";
|
||||
|
||||
const start = (
|
||||
await import(`${unicodePackageName}/Binary_Property/ID_Start/ranges.js`)
|
||||
).default;
|
||||
const cont = (
|
||||
await import(`${unicodePackageName}/Binary_Property/ID_Continue/ranges.js`)
|
||||
).default;
|
||||
|
||||
function rangesToRegenerate(ranges: readonly UnicodeRange[]): regenerate {
|
||||
return ranges.reduce(
|
||||
(set: regenerate, { begin, end }: UnicodeRange) =>
|
||||
set.addRange(begin, end - 1),
|
||||
regenerate()
|
||||
);
|
||||
}
|
||||
|
||||
// The minimum Babel 8 required version of Node.js (22.18.0) supports Unicode 16
|
||||
const unicode16StartSet = rangesToRegenerate(unicode16Start).removeRange(
|
||||
0,
|
||||
0x7f
|
||||
);
|
||||
const unicode16ContSet = rangesToRegenerate(unicode16Cont).removeRange(0, 0x7f);
|
||||
|
||||
const unicodeLatestStartSet = rangesToRegenerate(start).removeRange(0, 0x7f);
|
||||
const unicodeLatestContSet = rangesToRegenerate(cont).removeRange(0, 0x7f);
|
||||
|
||||
// Check if the latest Unicode version has removed any characters from ID_Start or ID_Continue that were present in Unicode 16.0.0.
|
||||
// If so, we may have to add negative lookahead to the regexes in this package. In general this should not happen per Unicode stability policy.
|
||||
const incompatibleStartSet = unicode16StartSet
|
||||
.clone()
|
||||
.remove(unicodeLatestStartSet);
|
||||
const incompatibleContinueSet = unicode16ContSet
|
||||
.clone()
|
||||
.remove(unicodeLatestContSet);
|
||||
assert(
|
||||
incompatibleStartSet.toArray().length === 0,
|
||||
`${unicodePackageName} has removed some characters from ID_Start that were present in Unicode 16.0.0: ${incompatibleStartSet.toString()}`
|
||||
);
|
||||
assert(
|
||||
incompatibleContinueSet.toArray().length === 0,
|
||||
`${unicodePackageName} has removed some characters from ID_Continue that were present in Unicode 16.0.0: ${incompatibleContinueSet.toString()}`
|
||||
);
|
||||
|
||||
const startSet = unicodeLatestStartSet.clone().remove(unicode16StartSet);
|
||||
|
||||
const contSetWithoutStart = unicodeLatestContSet
|
||||
.clone()
|
||||
.remove(unicode16ContSet)
|
||||
.remove(startSet);
|
||||
|
||||
function esc(code: number) {
|
||||
if (code <= 0xff) return "\\x" + code.toString(16).padStart(2, "0");
|
||||
return "\\u" + code.toString(16).padStart(4, "0");
|
||||
}
|
||||
|
||||
function generate(chars: number[]) {
|
||||
type IdentifierRegexData = {
|
||||
bmp: string;
|
||||
supplementary: number[];
|
||||
};
|
||||
|
||||
function generate(regenerateSet: regenerate) {
|
||||
const supplementary = [];
|
||||
let re = "";
|
||||
for (let i = 0, at = 0x10000; i < chars.length; i++) {
|
||||
const from = chars[i];
|
||||
let to = from;
|
||||
while (i < chars.length - 1 && chars[i + 1] === to + 1) {
|
||||
i++;
|
||||
to++;
|
||||
}
|
||||
// @ts-expect-error access internal data property
|
||||
const ranges = regenerateSet.data;
|
||||
for (let i = 0, at = 0x10000; i < ranges.length; i += 2) {
|
||||
const from = ranges[i],
|
||||
to = ranges[i + 1] - 1;
|
||||
if (to <= 0xffff) {
|
||||
if (from === to) re += esc(from);
|
||||
else if (from + 1 === to) re += esc(from) + esc(to);
|
||||
@@ -55,22 +98,75 @@ function generate(chars: number[]) {
|
||||
return { bmp: re, supplementary };
|
||||
}
|
||||
|
||||
const startData = generate(start);
|
||||
const contData = generate(cont);
|
||||
function generateIdentifierRegex(
|
||||
isBrowser: boolean,
|
||||
startData: IdentifierRegexData,
|
||||
contData: IdentifierRegexData
|
||||
) {
|
||||
let result = "";
|
||||
result += `// Do not edit this file manually. It is generated by \`scripts/generate-identifier-regex.ts\`.
|
||||
/*
|
||||
Reason to disable eslint rules:
|
||||
- no-misleading-character-class: This rule is disabled because it will check if a combining mark (\\p{M}) is following a base character. It is possible that an identifier char is not following a base character.
|
||||
- regexp/no-misleading-unicode-character: The regexp plugin uses Intl.Segmenter to check whether a grapheme cluster can be represented by multiple code points and then report if there is such case. It is possible that two consecutive identifier chars may form a GC, but the intention here is to explicitly form a character set from the given character sets
|
||||
- regexp/no-obscure-range: The regexps in this file are soup of "obscure" Unicode characters.
|
||||
- regexp/use-ignore-case: This rule is disabled because if we used ignoreCase, the regex will depend on the runtime's Unicode support, which may cause different behavior in different environments.
|
||||
*/
|
||||
|
||||
/* eslint no-misleading-character-class: off, regexp/no-obscure-range: off, regexp/no-misleading-unicode-character: off, regexp/use-ignore-case: off */
|
||||
|
||||
// ## Character categories
|
||||
// Big ugly regular expressions that match characters in the ID_Start / ID_Continue
|
||||
// binary properties. These are only applied when a character is found
|
||||
// to actually have a code point larger than 0x80.
|
||||
// Generated by \`scripts/generate-identifier-regex.ts\`.
|
||||
`;
|
||||
if (isBrowser) {
|
||||
result += `/* prettier-ignore */
|
||||
const bmpIdentifierStartChars = "${startData.bmp}";
|
||||
/* prettier-ignore */
|
||||
const bmpIdentifierChars = "${contData.bmp}";
|
||||
export const bmpIdentifierStart = new RegExp(
|
||||
"[" + bmpIdentifierStartChars + "]",
|
||||
);
|
||||
export const bmpIdentifier = new RegExp(
|
||||
"[" + bmpIdentifierStartChars + bmpIdentifierChars + "]",
|
||||
);
|
||||
`;
|
||||
} else {
|
||||
result += `/* prettier-ignore */
|
||||
export const bmpIdentifierStart = /[\\p{ID_Start}${startData.bmp}]/u;
|
||||
/* prettier-ignore */
|
||||
export const bmpIdentifier = /[\\p{ID_Continue}${startData.bmp}${contData.bmp}]/u;
|
||||
`;
|
||||
}
|
||||
|
||||
result += `
|
||||
// These are a run-length and offset-encoded representation of the
|
||||
// >0xffff code points that are a valid part of identifiers. The
|
||||
// offset starts at 0x10000, and each pair of numbers represents an
|
||||
// offset to the next range, and then a size of the range. They were
|
||||
// generated by \`scripts/generate-identifier-regex.ts\`.
|
||||
/* prettier-ignore */
|
||||
export const supplementaryIdentifierStartCodes = ${JSON.stringify(startData.supplementary)};
|
||||
/* prettier-ignore */
|
||||
export const supplementaryIdentifierCodes = ${JSON.stringify(contData.supplementary)};
|
||||
`;
|
||||
return result;
|
||||
}
|
||||
|
||||
const startData = generate(startSet);
|
||||
const contData = generate(contSetWithoutStart);
|
||||
fs.writeFileSync(
|
||||
new URL("../data/bmp-identifier-start.json", import.meta.url),
|
||||
`"${startData.bmp}"`
|
||||
new URL("../src/identifier-regex.ts", import.meta.url),
|
||||
generateIdentifierRegex(false, startData, contData)
|
||||
);
|
||||
|
||||
const startDataBrowser = generate(unicodeLatestStartSet);
|
||||
const contDataBrowser = generate(
|
||||
unicodeLatestContSet.clone().remove(unicodeLatestStartSet)
|
||||
);
|
||||
fs.writeFileSync(
|
||||
new URL("../data/bmp-identifier-continue.json", import.meta.url),
|
||||
`"${contData.bmp}"`
|
||||
);
|
||||
fs.writeFileSync(
|
||||
new URL("../data/supplementary-identifier-start.json", import.meta.url),
|
||||
JSON.stringify(startData.supplementary)
|
||||
);
|
||||
fs.writeFileSync(
|
||||
new URL("../data/supplementary-identifier-continue.json", import.meta.url),
|
||||
JSON.stringify(contData.supplementary)
|
||||
new URL("../src/identifier-regex-browser.ts", import.meta.url),
|
||||
generateIdentifierRegex(true, startDataBrowser, contDataBrowser)
|
||||
);
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
import * as charCodes from "charcodes";
|
||||
import {
|
||||
bmpIdentifier,
|
||||
bmpIdentifierStart,
|
||||
supplementaryIdentifierCodes,
|
||||
supplementaryIdentifierStartCodes,
|
||||
} from "./identifier-regex-browser.ts";
|
||||
|
||||
// This has a complexity linear to the value of the code. The
|
||||
// assumption is that looking up supplementary identifier characters is
|
||||
// rare.
|
||||
function isInSupplementarySet(code: number, set: readonly number[]): boolean {
|
||||
let pos = 0x10000;
|
||||
for (let i = 0, length = set.length; i < length; i += 2) {
|
||||
pos += set[i];
|
||||
if (pos > code) return false;
|
||||
|
||||
pos += set[i + 1];
|
||||
if (pos >= code) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Test whether a given character code starts an identifier.
|
||||
|
||||
export function isIdentifierStart(code: number): boolean {
|
||||
if (code < charCodes.uppercaseA) return code === charCodes.dollarSign;
|
||||
if (code <= charCodes.uppercaseZ) return true;
|
||||
if (code < charCodes.lowercaseA) return code === charCodes.underscore;
|
||||
if (code <= charCodes.lowercaseZ) return true;
|
||||
if (code <= 0xffff) {
|
||||
return code >= 0xaa && bmpIdentifierStart.test(String.fromCharCode(code));
|
||||
}
|
||||
return isInSupplementarySet(code, supplementaryIdentifierStartCodes);
|
||||
}
|
||||
|
||||
// Test whether a given character is part of an identifier.
|
||||
|
||||
export function isIdentifierChar(code: number): boolean {
|
||||
if (code < charCodes.digit0) return code === charCodes.dollarSign;
|
||||
if (code < charCodes.colon) return true;
|
||||
if (code < charCodes.uppercaseA) return false;
|
||||
if (code <= charCodes.uppercaseZ) return true;
|
||||
if (code < charCodes.lowercaseA) return code === charCodes.underscore;
|
||||
if (code <= charCodes.lowercaseZ) return true;
|
||||
if (code <= 0xffff) {
|
||||
return code >= 0xaa && bmpIdentifier.test(String.fromCharCode(code));
|
||||
}
|
||||
return (
|
||||
isInSupplementarySet(code, supplementaryIdentifierStartCodes) ||
|
||||
isInSupplementarySet(code, supplementaryIdentifierCodes)
|
||||
);
|
||||
}
|
||||
|
||||
// Test whether a given string is a valid identifier name
|
||||
|
||||
export function isIdentifierName(name: string): boolean {
|
||||
let isFirst = true;
|
||||
for (let i = 0; i < name.length; i++) {
|
||||
// The implementation is based on
|
||||
// https://source.chromium.org/chromium/chromium/src/+/master:v8/src/builtins/builtins-string-gen.cc;l=1455;drc=221e331b49dfefadbc6fa40b0c68e6f97606d0b3;bpv=0;bpt=1
|
||||
// We reimplement `codePointAt` because `codePointAt` is a V8 builtin which is not inlined by TurboFan (as of M91)
|
||||
// since `name` is mostly ASCII, an inlined `charCodeAt` wins here
|
||||
let cp = name.charCodeAt(i);
|
||||
if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) {
|
||||
const trail = name.charCodeAt(++i);
|
||||
if ((trail & 0xfc00) === 0xdc00) {
|
||||
cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);
|
||||
}
|
||||
}
|
||||
if (isFirst) {
|
||||
isFirst = false;
|
||||
if (!isIdentifierStart(cp)) {
|
||||
return false;
|
||||
}
|
||||
} else if (!isIdentifierChar(cp)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return !isFirst;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
// Do not edit this file manually. It is generated by `scripts/generate-identifier-regex.ts`.
|
||||
/*
|
||||
Reason to disable eslint rules:
|
||||
- no-misleading-character-class: This rule is disabled because it will check if a combining mark (\p{M}) is following a base character. It is possible that an identifier char is not following a base character.
|
||||
- regexp/no-misleading-unicode-character: The regexp plugin uses Intl.Segmenter to check whether a grapheme cluster can be represented by multiple code points and then report if there is such case. It is possible that two consecutive identifier chars may form a GC, but the intention here is to explicitly form a character set from the given character sets
|
||||
- regexp/no-obscure-range: The regexps in this file are soup of "obscure" Unicode characters.
|
||||
- regexp/use-ignore-case: This rule is disabled because if we used ignoreCase, the regex will depend on the runtime's Unicode support, which may cause different behavior in different environments.
|
||||
*/
|
||||
|
||||
/* eslint no-misleading-character-class: off, regexp/no-obscure-range: off, regexp/no-misleading-unicode-character: off, regexp/use-ignore-case: off */
|
||||
|
||||
// ## Character categories
|
||||
// Big ugly regular expressions that match characters in the ID_Start / ID_Continue
|
||||
// binary properties. These are only applied when a character is found
|
||||
// to actually have a code point larger than 0x80.
|
||||
// Generated by `scripts/generate-identifier-regex.ts`.
|
||||
/* prettier-ignore */
|
||||
const bmpIdentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088f\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5c\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdc-\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7dc\ua7f1-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
|
||||
/* prettier-ignore */
|
||||
const bmpIdentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1add\u1ae0-\u1aeb\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
|
||||
export const bmpIdentifierStart = new RegExp(
|
||||
"[" + bmpIdentifierStartChars + "]",
|
||||
);
|
||||
export const bmpIdentifier = new RegExp(
|
||||
"[" + bmpIdentifierStartChars + bmpIdentifierChars + "]",
|
||||
);
|
||||
|
||||
// These are a run-length and offset-encoded representation of the
|
||||
// >0xffff code points that are a valid part of identifiers. The
|
||||
// offset starts at 0x10000, and each pair of numbers represents an
|
||||
// offset to the next range, and then a size of the range. They were
|
||||
// generated by `scripts/generate-identifier-regex.ts`.
|
||||
/* prettier-ignore */
|
||||
export const supplementaryIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,7,25,39,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,39,27,10,22,251,41,7,1,17,5,57,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,31,9,2,0,3,0,2,37,2,0,26,0,2,0,45,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,200,32,32,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,24,43,261,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,26,3994,6,582,6842,29,1763,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,433,44,212,63,33,24,3,24,45,74,6,0,67,12,65,1,2,0,15,4,10,7381,42,31,98,114,8702,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,229,29,3,0,208,30,2,2,2,1,2,6,3,4,10,1,225,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4381,3,5773,3,7472,16,621,2467,541,1507,4938,6,8489];
|
||||
/* prettier-ignore */
|
||||
export const supplementaryIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,7,9,32,4,318,1,78,5,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,68,8,2,0,3,0,2,3,2,4,2,0,15,1,83,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,7,19,58,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,199,7,137,9,54,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,55,9,266,3,10,1,2,0,49,6,4,4,14,10,5350,0,7,14,11465,27,2343,9,87,9,39,4,60,6,26,9,535,9,470,0,2,54,8,3,82,0,12,1,19628,1,4178,9,519,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,245,1,2,9,233,0,3,0,8,1,6,0,475,6,110,6,6,9,4759,9,787719,239];
|
||||
@@ -0,0 +1,30 @@
|
||||
// Do not edit this file manually. It is generated by `scripts/generate-identifier-regex.ts`.
|
||||
/*
|
||||
Reason to disable eslint rules:
|
||||
- no-misleading-character-class: This rule is disabled because it will check if a combining mark (\p{M}) is following a base character. It is possible that an identifier char is not following a base character.
|
||||
- regexp/no-misleading-unicode-character: The regexp plugin uses Intl.Segmenter to check whether a grapheme cluster can be represented by multiple code points and then report if there is such case. It is possible that two consecutive identifier chars may form a GC, but the intention here is to explicitly form a character set from the given character sets
|
||||
- regexp/no-obscure-range: The regexps in this file are soup of "obscure" Unicode characters.
|
||||
- regexp/use-ignore-case: This rule is disabled because if we used ignoreCase, the regex will depend on the runtime's Unicode support, which may cause different behavior in different environments.
|
||||
*/
|
||||
|
||||
/* eslint no-misleading-character-class: off, regexp/no-obscure-range: off, regexp/no-misleading-unicode-character: off, regexp/use-ignore-case: off */
|
||||
|
||||
// ## Character categories
|
||||
// Big ugly regular expressions that match characters in the ID_Start / ID_Continue
|
||||
// binary properties. These are only applied when a character is found
|
||||
// to actually have a code point larger than 0x80.
|
||||
// Generated by `scripts/generate-identifier-regex.ts`.
|
||||
/* prettier-ignore */
|
||||
export const bmpIdentifierStart = /[\p{ID_Start}\u088f\u0c5c\u0cdc\ua7ce\ua7cf\ua7d2\ua7d4\ua7f1]/u;
|
||||
/* prettier-ignore */
|
||||
export const bmpIdentifier = /[\p{ID_Continue}\u088f\u0c5c\u0cdc\ua7ce\ua7cf\ua7d2\ua7d4\ua7f1\u1acf-\u1add\u1ae0-\u1aeb]/u;
|
||||
|
||||
// These are a run-length and offset-encoded representation of the
|
||||
// >0xffff code points that are a valid part of identifiers. The
|
||||
// offset starts at 0x10000, and each pair of numbers represents an
|
||||
// offset to the next range, and then a size of the range. They were
|
||||
// generated by `scripts/generate-identifier-regex.ts`.
|
||||
/* prettier-ignore */
|
||||
export const supplementaryIdentifierStartCodes = [2368,25,1388,2,3817,43,20677,24,3,24,287,4,6146,7,1290,21,98,114,22734,30,2,2,2,1,2,6,3,4,10,1,53307,5,5987,11,21763,4297];
|
||||
/* prettier-ignore */
|
||||
export const supplementaryIdentifierCodes = [3834,1,3173,7,633,9,51450,0,3,0,8,1,6,0];
|
||||
@@ -1,28 +1,10 @@
|
||||
import * as charCodes from "charcodes";
|
||||
|
||||
// ## Character categories
|
||||
|
||||
// Big ugly regular expressions that match characters in the
|
||||
// whitespace, identifier, and identifier-start categories. These
|
||||
// are only applied when a character is found to actually have a
|
||||
// code point between 0x80 and 0xffff.
|
||||
// Generated by `scripts/generate-identifier-regex.ts`.
|
||||
|
||||
import bmpIdentifierStartChars from "../data/bmp-identifier-start.json" with { type: "json" };
|
||||
import bmpIdentifierChars from "../data/bmp-identifier-continue.json" with { type: "json" };
|
||||
|
||||
const bmpIdentifierStart = new RegExp("[" + bmpIdentifierStartChars + "]");
|
||||
const bmpIdentifier = new RegExp(
|
||||
"[" + bmpIdentifierStartChars + bmpIdentifierChars + "]",
|
||||
);
|
||||
|
||||
// These are a run-length and offset-encoded representation of the
|
||||
// >0xffff code points that are a valid part of identifiers. The
|
||||
// offset starts at 0x10000, and each pair of numbers represents an
|
||||
// offset to the next range, and then a size of the range. They were
|
||||
// generated by `scripts/generate-identifier-regex.ts`.
|
||||
import supplementaryIdentifierStartCodes from "../data/supplementary-identifier-start.json" with { type: "json" };
|
||||
import supplementaryIdentifierCodes from "../data/supplementary-identifier-continue.json" with { type: "json" };
|
||||
import {
|
||||
bmpIdentifier,
|
||||
bmpIdentifierStart,
|
||||
supplementaryIdentifierCodes,
|
||||
supplementaryIdentifierStartCodes,
|
||||
} from "./identifier-regex.ts";
|
||||
|
||||
// This has a complexity linear to the value of the code. The
|
||||
// assumption is that looking up supplementary identifier characters is
|
||||
@@ -49,7 +31,12 @@ export function isIdentifierStart(code: number): boolean {
|
||||
if (code <= 0xffff) {
|
||||
return code >= 0xaa && bmpIdentifierStart.test(String.fromCharCode(code));
|
||||
}
|
||||
return isInSupplementarySet(code, supplementaryIdentifierStartCodes);
|
||||
return (
|
||||
!isNaN(code) &&
|
||||
code <= 0x10ffff &&
|
||||
(bmpIdentifierStart.test(String.fromCodePoint(code)) ||
|
||||
isInSupplementarySet(code, supplementaryIdentifierStartCodes))
|
||||
);
|
||||
}
|
||||
|
||||
// Test whether a given character is part of an identifier.
|
||||
@@ -65,8 +52,11 @@ export function isIdentifierChar(code: number): boolean {
|
||||
return code >= 0xaa && bmpIdentifier.test(String.fromCharCode(code));
|
||||
}
|
||||
return (
|
||||
!isNaN(code) &&
|
||||
code <= 0x10ffff &&
|
||||
(bmpIdentifier.test(String.fromCodePoint(code)) ||
|
||||
isInSupplementarySet(code, supplementaryIdentifierStartCodes) ||
|
||||
isInSupplementarySet(code, supplementaryIdentifierCodes)
|
||||
isInSupplementarySet(code, supplementaryIdentifierCodes))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,8 @@ export {
|
||||
isIdentifierName,
|
||||
isIdentifierChar,
|
||||
isIdentifierStart,
|
||||
} from "./identifier.ts";
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
} from "#identifier";
|
||||
export {
|
||||
isReservedWord,
|
||||
isStrictBindOnlyReservedWord,
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
// eslint-disable-next-line jest/no-export
|
||||
export function describeIsIdentifierCharTests(isIdentifierCharImpl) {
|
||||
describe("isIdentifierChar", function () {
|
||||
it("returns false if provided codepoint is NaN", function () {
|
||||
expect(isIdentifierCharImpl(NaN)).toBe(false);
|
||||
});
|
||||
it("returns false if provided codepoint is larger than 0x10FFFF", function () {
|
||||
expect(isIdentifierCharImpl(0x110000)).toBe(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
// eslint-disable-next-line jest/no-export
|
||||
export function describeIsIdentifierNameTests(isIdentifierNameImpl) {
|
||||
describe("isIdentifierName", function () {
|
||||
it("returns false if provided string is empty", function () {
|
||||
expect(isIdentifierNameImpl("")).toBe(false);
|
||||
});
|
||||
it.each([
|
||||
"hello",
|
||||
"$",
|
||||
"ゆゆ式",
|
||||
"$20",
|
||||
"hello20",
|
||||
"_",
|
||||
"if",
|
||||
"_\u200c",
|
||||
"_\u200d",
|
||||
])(
|
||||
"returns true if provided string %p is an IdentifierName",
|
||||
function (word) {
|
||||
expect(isIdentifierNameImpl(word)).toBe(true);
|
||||
},
|
||||
);
|
||||
it.each(["+hello", "0$", "-ゆゆ式", "#_", "_#", "\ud800\ud800"])(
|
||||
"returns false if provided string %p is not an IdentifierName",
|
||||
function (word) {
|
||||
expect(isIdentifierNameImpl(word)).toBe(false);
|
||||
},
|
||||
);
|
||||
it("supports astral symbols", function () {
|
||||
expect(isIdentifierNameImpl("x\uDB40\uDDD5")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 17.0", () => {
|
||||
// BMP ID_Start
|
||||
expect(isIdentifierNameImpl("\u{0c5c}")).toBe(true);
|
||||
expect(isIdentifierNameImpl("_\u{0c5c}")).toBe(true);
|
||||
// BMP ID_Continue
|
||||
expect(isIdentifierNameImpl("_\u{1acf}")).toBe(true);
|
||||
|
||||
// SMP ID_Start
|
||||
expect(isIdentifierNameImpl("\u{10940}")).toBe(true);
|
||||
expect(isIdentifierNameImpl("_\u{10940}")).toBe(true);
|
||||
|
||||
// SMP ID_Continue
|
||||
expect(isIdentifierNameImpl("_\u{10efa}")).toBe(true);
|
||||
|
||||
// UTF16 encoding of U+10940 = D802 DD40
|
||||
expect(isIdentifierNameImpl("\uD802")).toBe(false);
|
||||
expect(isIdentifierNameImpl("_\uDD40")).toBe(false);
|
||||
});
|
||||
it("supports Unicode 16.0", () => {
|
||||
// BMP ID_Start
|
||||
expect(isIdentifierNameImpl("\u{1c89}")).toBe(true);
|
||||
expect(isIdentifierNameImpl("_\u{1c89}")).toBe(true);
|
||||
// BMP ID_Continue
|
||||
expect(isIdentifierNameImpl("_\u{0897}")).toBe(true);
|
||||
|
||||
// SMP ID_Start
|
||||
expect(isIdentifierNameImpl("\u{105c0}")).toBe(true);
|
||||
expect(isIdentifierNameImpl("_\u{105c0}")).toBe(true);
|
||||
|
||||
// SMP ID_Continue
|
||||
expect(isIdentifierNameImpl("_\u{10d40}")).toBe(true);
|
||||
|
||||
// UTF16 encoding of U+105c0 = D801 DDC0
|
||||
expect(isIdentifierNameImpl("\uD801")).toBe(false);
|
||||
expect(isIdentifierNameImpl("_\uDDC0")).toBe(false);
|
||||
});
|
||||
it("supports Unicode 15.1", () => {
|
||||
expect(isIdentifierNameImpl("\u{2ebf0}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 15", () => {
|
||||
expect(isIdentifierNameImpl("\u{1e030}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 14", () => {
|
||||
expect(isIdentifierNameImpl("\u{10f70}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 13", () => {
|
||||
expect(isIdentifierNameImpl("\u{30000}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 12", () => {
|
||||
expect(isIdentifierNameImpl("\u{10fe0}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 11", () => {
|
||||
expect(isIdentifierNameImpl("\u{10f00}")).toBe(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
// eslint-disable-next-line jest/no-export
|
||||
export function describeIsIdentifierStartTests(isIdentifierStartImpl) {
|
||||
describe("isIdentifierStart", function () {
|
||||
it("returns false if provided codepoint is NaN", function () {
|
||||
expect(isIdentifierStartImpl(NaN)).toBe(false);
|
||||
});
|
||||
it("returns false if provided codepoint is larger than 0x10FFFF", function () {
|
||||
expect(isIdentifierStartImpl(0x110000)).toBe(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import { isIdentifierName } from "../lib/identifier-browser.js";
|
||||
|
||||
import { describeIsIdentifierNameTests } from "./helpers/describe-is-identifier-name-tests.js";
|
||||
|
||||
describeIsIdentifierNameTests(isIdentifierName);
|
||||
|
||||
import { isIdentifierStart } from "../lib/identifier-browser.js";
|
||||
|
||||
import { describeIsIdentifierStartTests } from "./helpers/describe-is-identifier-start-tests.js";
|
||||
|
||||
describeIsIdentifierStartTests(isIdentifierStart);
|
||||
|
||||
import { isIdentifierChar } from "../lib/identifier-browser.js";
|
||||
|
||||
import { describeIsIdentifierCharTests } from "./helpers/describe-is-identifier-char-tests.js";
|
||||
|
||||
describeIsIdentifierCharTests(isIdentifierChar);
|
||||
@@ -1,56 +1,17 @@
|
||||
import { isIdentifierName } from "../lib/index.js";
|
||||
|
||||
describe("isIdentifierName", function () {
|
||||
it("returns false if provided string is empty", function () {
|
||||
expect(isIdentifierName("")).toBe(false);
|
||||
});
|
||||
it.each([
|
||||
"hello",
|
||||
"$",
|
||||
"ゆゆ式",
|
||||
"$20",
|
||||
"hello20",
|
||||
"_",
|
||||
"if",
|
||||
"_\u200c",
|
||||
"_\u200d",
|
||||
])(
|
||||
"returns true if provided string %p is an IdentifierName",
|
||||
function (word) {
|
||||
expect(isIdentifierName(word)).toBe(true);
|
||||
},
|
||||
);
|
||||
it.each(["+hello", "0$", "-ゆゆ式", "#_", "_#", "\ud800\ud800"])(
|
||||
"returns false if provided string %p is not an IdentifierName",
|
||||
function (word) {
|
||||
expect(isIdentifierName(word)).toBe(false);
|
||||
},
|
||||
);
|
||||
it("supports astral symbols", function () {
|
||||
expect(isIdentifierName("x\uDB40\uDDD5")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 17.0", () => {
|
||||
expect(isIdentifierName("\u{0c5c}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 16.0", () => {
|
||||
expect(isIdentifierName("\u{105c0}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 15.1", () => {
|
||||
expect(isIdentifierName("\u{2ebf0}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 15", () => {
|
||||
expect(isIdentifierName("\u{1e030}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 14", () => {
|
||||
expect(isIdentifierName("\u{10f70}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 13", () => {
|
||||
expect(isIdentifierName("\u{30000}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 12", () => {
|
||||
expect(isIdentifierName("\u{10fe0}")).toBe(true);
|
||||
});
|
||||
it("supports Unicode 11", () => {
|
||||
expect(isIdentifierName("\u{10f00}")).toBe(true);
|
||||
});
|
||||
});
|
||||
import { describeIsIdentifierNameTests } from "./helpers/describe-is-identifier-name-tests.js";
|
||||
|
||||
describeIsIdentifierNameTests(isIdentifierName);
|
||||
|
||||
import { isIdentifierStart } from "../lib/index.js";
|
||||
|
||||
import { describeIsIdentifierStartTests } from "./helpers/describe-is-identifier-start-tests.js";
|
||||
|
||||
describeIsIdentifierStartTests(isIdentifierStart);
|
||||
|
||||
import { isIdentifierChar } from "../lib/index.js";
|
||||
|
||||
import { describeIsIdentifierCharTests } from "./helpers/describe-is-identifier-char-tests.js";
|
||||
|
||||
describeIsIdentifierCharTests(isIdentifierChar);
|
||||
|
||||
@@ -13,7 +13,6 @@ const commonIgnore = [
|
||||
|
||||
const extraIgnore: Record<string, string[]> = {
|
||||
"babel-compat-data": ["build"],
|
||||
"babel-helper-validator-identifier": ["data"],
|
||||
"babel-node": ["data"],
|
||||
"babel-plugin-proposal-decorators": ["CONTRIB.md"],
|
||||
};
|
||||
|
||||
@@ -1137,8 +1137,11 @@ __metadata:
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@babel/helper-validator-identifier@workspace:packages/babel-helper-validator-identifier"
|
||||
dependencies:
|
||||
"@unicode/unicode-17.0.0": "npm:^1.6.10"
|
||||
"@types/regenerate": "npm:^1.4.0"
|
||||
"@unicode/unicode-16.0.0": "npm:^1.6.17"
|
||||
"@unicode/unicode-17.0.0": "npm:^1.6.17"
|
||||
charcodes: "npm:^0.2.0"
|
||||
regenerate: "npm:^1.4.0"
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
@@ -6127,6 +6130,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/regenerate@npm:^1.4.0":
|
||||
version: 1.4.3
|
||||
resolution: "@types/regenerate@npm:1.4.3"
|
||||
checksum: 10/66c972d0788a0a843b4fc7619a6218ef78483aaa5068b93a230a58435a77e0c71c400b639db9b96c341ca4706fe0cb4a92b686777dd0a9f6dcd556baa4bb674c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/resolve@npm:1.20.2":
|
||||
version: 1.20.2
|
||||
resolution: "@types/resolve@npm:1.20.2"
|
||||
@@ -6337,10 +6347,17 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@unicode/unicode-17.0.0@npm:^1.6.10":
|
||||
version: 1.6.16
|
||||
resolution: "@unicode/unicode-17.0.0@npm:1.6.16"
|
||||
checksum: 10/0a619c8ca4e2fd90e3aad7e783cf89ce2bc5b1873c90c5a6d6ebf5d0d2c0382a519d855a15daa56a3c214dface795e4e23418ffe0f25b19562454b9c24bb0b77
|
||||
"@unicode/unicode-16.0.0@npm:^1.6.17":
|
||||
version: 1.6.17
|
||||
resolution: "@unicode/unicode-16.0.0@npm:1.6.17"
|
||||
checksum: 10/dae9d06d3c9de3f29b068ad6481c810ea4a73baf244f4d5c47ed2d66b577cc9a67583a0cb8e244b0eaf699cedc174961d5ce816368f658cb96d0684f514c05eb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@unicode/unicode-17.0.0@npm:^1.6.17":
|
||||
version: 1.6.17
|
||||
resolution: "@unicode/unicode-17.0.0@npm:1.6.17"
|
||||
checksum: 10/ca7817c57fdc3f3f791f65c7abd2dfa3105e50e2d8018e0afe20185597abb3e1a96147ea9518c49ecb49482776c16babe81667d2ecac54a4122225cb66aad060
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -15066,7 +15083,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"regenerate@npm:^1.4.2":
|
||||
"regenerate@npm:^1.4.0, regenerate@npm:^1.4.2":
|
||||
version: 1.4.2
|
||||
resolution: "regenerate@npm:1.4.2"
|
||||
checksum: 10/dc6c95ae4b3ba6adbd7687cafac260eee4640318c7a95239d5ce847d9b9263979758389e862fe9c93d633b5792ea4ada5708df75885dc5aa05a309fa18140a87
|
||||
|
||||
Reference in New Issue
Block a user