tldts-utils 6.1.81
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/LICENSE +13 -0
- package/README.md +3 -0
- package/bin/update.js +7 -0
- package/dist/cjs/index.js +698 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/src/builders/hashes.js +186 -0
- package/dist/cjs/src/builders/hashes.js.map +1 -0
- package/dist/cjs/src/builders/trie.js +155 -0
- package/dist/cjs/src/builders/trie.js.map +1 -0
- package/dist/cjs/src/find-base-dir.js +13 -0
- package/dist/cjs/src/find-base-dir.js.map +1 -0
- package/dist/cjs/src/list.js +11 -0
- package/dist/cjs/src/list.js.map +1 -0
- package/dist/cjs/src/parser.js +63 -0
- package/dist/cjs/src/parser.js.map +1 -0
- package/dist/cjs/src/update.js +23 -0
- package/dist/cjs/src/update.js.map +1 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/es6/index.js +4 -0
- package/dist/es6/index.js.map +1 -0
- package/dist/es6/src/builders/hashes.js +184 -0
- package/dist/es6/src/builders/hashes.js.map +1 -0
- package/dist/es6/src/builders/trie.js +153 -0
- package/dist/es6/src/builders/trie.js.map +1 -0
- package/dist/es6/src/find-base-dir.js +10 -0
- package/dist/es6/src/find-base-dir.js.map +1 -0
- package/dist/es6/src/list.js +8 -0
- package/dist/es6/src/list.js.map +1 -0
- package/dist/es6/src/parser.js +61 -0
- package/dist/es6/src/parser.js.map +1 -0
- package/dist/es6/src/update.js +20 -0
- package/dist/es6/src/update.js.map +1 -0
- package/dist/es6/tsconfig.bundle.tsbuildinfo +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/src/builders/hashes.d.ts +90 -0
- package/dist/types/src/builders/trie.d.ts +28 -0
- package/dist/types/src/find-base-dir.d.ts +1 -0
- package/dist/types/src/list.d.ts +1 -0
- package/dist/types/src/parser.d.ts +12 -0
- package/dist/types/src/update.d.ts +1 -0
- package/index.ts +4 -0
- package/package.json +56 -0
- package/src/builders/hashes.ts +201 -0
- package/src/builders/trie.ts +216 -0
- package/src/find-base-dir.ts +11 -0
- package/src/list.ts +8 -0
- package/src/parser.ts +75 -0
- package/src/update.ts +36 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../../node_modules/typescript/lib/lib.es5.d.ts","../../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../../node_modules/typescript/lib/lib.dom.d.ts","../../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../../node_modules/typescript/lib/lib.es2017.full.d.ts","../../src/find-base-dir.ts","../../src/list.ts","../../../../node_modules/@types/punycode/index.d.ts","../../src/parser.ts","../../src/builders/hashes.ts","../../src/builders/trie.ts","../../src/update.ts","../../index.ts","../../../../node_modules/@types/chai/index.d.ts","../../../../node_modules/@types/command-line-args/index.d.ts","../../../../node_modules/@types/command-line-usage/index.d.ts","../../../../node_modules/@types/estree/index.d.ts","../../../../node_modules/@types/minimatch/index.d.ts","../../../../node_modules/@types/minimist/index.d.ts","../../../../node_modules/@types/mocha/index.d.ts","../../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../../node_modules/@types/node/compatibility/index.d.ts","../../../../node_modules/@types/node/globals.typedarray.d.ts","../../../../node_modules/@types/node/buffer.buffer.d.ts","../../../../node_modules/buffer/index.d.ts","../../../../node_modules/undici-types/header.d.ts","../../../../node_modules/undici-types/readable.d.ts","../../../../node_modules/undici-types/file.d.ts","../../../../node_modules/undici-types/fetch.d.ts","../../../../node_modules/undici-types/formdata.d.ts","../../../../node_modules/undici-types/connector.d.ts","../../../../node_modules/undici-types/client.d.ts","../../../../node_modules/undici-types/errors.d.ts","../../../../node_modules/undici-types/dispatcher.d.ts","../../../../node_modules/undici-types/global-dispatcher.d.ts","../../../../node_modules/undici-types/global-origin.d.ts","../../../../node_modules/undici-types/pool-stats.d.ts","../../../../node_modules/undici-types/pool.d.ts","../../../../node_modules/undici-types/handlers.d.ts","../../../../node_modules/undici-types/balanced-pool.d.ts","../../../../node_modules/undici-types/agent.d.ts","../../../../node_modules/undici-types/mock-interceptor.d.ts","../../../../node_modules/undici-types/mock-agent.d.ts","../../../../node_modules/undici-types/mock-client.d.ts","../../../../node_modules/undici-types/mock-pool.d.ts","../../../../node_modules/undici-types/mock-errors.d.ts","../../../../node_modules/undici-types/proxy-agent.d.ts","../../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../../node_modules/undici-types/retry-handler.d.ts","../../../../node_modules/undici-types/retry-agent.d.ts","../../../../node_modules/undici-types/api.d.ts","../../../../node_modules/undici-types/interceptors.d.ts","../../../../node_modules/undici-types/util.d.ts","../../../../node_modules/undici-types/cookies.d.ts","../../../../node_modules/undici-types/patch.d.ts","../../../../node_modules/undici-types/websocket.d.ts","../../../../node_modules/undici-types/eventsource.d.ts","../../../../node_modules/undici-types/filereader.d.ts","../../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../../node_modules/undici-types/content-type.d.ts","../../../../node_modules/undici-types/cache.d.ts","../../../../node_modules/undici-types/index.d.ts","../../../../node_modules/@types/node/globals.d.ts","../../../../node_modules/@types/node/assert.d.ts","../../../../node_modules/@types/node/assert/strict.d.ts","../../../../node_modules/@types/node/async_hooks.d.ts","../../../../node_modules/@types/node/buffer.d.ts","../../../../node_modules/@types/node/child_process.d.ts","../../../../node_modules/@types/node/cluster.d.ts","../../../../node_modules/@types/node/console.d.ts","../../../../node_modules/@types/node/constants.d.ts","../../../../node_modules/@types/node/crypto.d.ts","../../../../node_modules/@types/node/dgram.d.ts","../../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../../node_modules/@types/node/dns.d.ts","../../../../node_modules/@types/node/dns/promises.d.ts","../../../../node_modules/@types/node/domain.d.ts","../../../../node_modules/@types/node/dom-events.d.ts","../../../../node_modules/@types/node/events.d.ts","../../../../node_modules/@types/node/fs.d.ts","../../../../node_modules/@types/node/fs/promises.d.ts","../../../../node_modules/@types/node/http.d.ts","../../../../node_modules/@types/node/http2.d.ts","../../../../node_modules/@types/node/https.d.ts","../../../../node_modules/@types/node/inspector.d.ts","../../../../node_modules/@types/node/module.d.ts","../../../../node_modules/@types/node/net.d.ts","../../../../node_modules/@types/node/os.d.ts","../../../../node_modules/@types/node/path.d.ts","../../../../node_modules/@types/node/perf_hooks.d.ts","../../../../node_modules/@types/node/process.d.ts","../../../../node_modules/@types/node/punycode.d.ts","../../../../node_modules/@types/node/querystring.d.ts","../../../../node_modules/@types/node/readline.d.ts","../../../../node_modules/@types/node/readline/promises.d.ts","../../../../node_modules/@types/node/repl.d.ts","../../../../node_modules/@types/node/sea.d.ts","../../../../node_modules/@types/node/sqlite.d.ts","../../../../node_modules/@types/node/stream.d.ts","../../../../node_modules/@types/node/stream/promises.d.ts","../../../../node_modules/@types/node/stream/consumers.d.ts","../../../../node_modules/@types/node/stream/web.d.ts","../../../../node_modules/@types/node/string_decoder.d.ts","../../../../node_modules/@types/node/test.d.ts","../../../../node_modules/@types/node/timers.d.ts","../../../../node_modules/@types/node/timers/promises.d.ts","../../../../node_modules/@types/node/tls.d.ts","../../../../node_modules/@types/node/trace_events.d.ts","../../../../node_modules/@types/node/tty.d.ts","../../../../node_modules/@types/node/url.d.ts","../../../../node_modules/@types/node/util.d.ts","../../../../node_modules/@types/node/v8.d.ts","../../../../node_modules/@types/node/vm.d.ts","../../../../node_modules/@types/node/wasi.d.ts","../../../../node_modules/@types/node/worker_threads.d.ts","../../../../node_modules/@types/node/zlib.d.ts","../../../../node_modules/@types/node/index.d.ts","../../../../node_modules/@types/normalize-package-data/index.d.ts","../../../../node_modules/@types/parse-json/index.d.ts","../../../../node_modules/@types/resolve/index.d.ts"],"fileIdsList":[[71,114],[71,111,114],[71,113,114],[114],[71,114,119,149],[71,114,115,120,126,127,134,146,157],[71,114,115,116,126,134],[66,67,68,71,114],[71,114,117,158],[71,114,118,119,127,135],[71,114,119,146,154],[71,114,120,122,126,134],[71,113,114,121],[71,114,122,123],[71,114,126],[71,114,124,126],[71,113,114,126],[71,114,126,127,128,146,157],[71,114,126,127,128,141,146,149],[71,109,114,162],[71,109,114,122,126,129,134,146,157],[71,114,126,127,129,130,134,146,154,157],[71,114,129,131,146,154,157],[69,70,71,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[71,114,126,132],[71,114,133,157],[71,114,122,126,134,146],[71,114,135],[71,114,136],[71,113,114,137],[71,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[71,114,139],[71,114,140],[71,114,126,141,142],[71,114,141,143,158,160],[71,114,126,146,147,148,149],[71,114,146,148],[71,114,146,147],[71,114,149],[71,114,150],[71,111,114,146],[71,114,126,152,153],[71,114,152,153],[71,114,119,134,146,154],[71,114,155],[71,114,134,156],[71,114,129,140,157],[71,114,119,158],[71,114,146,159],[71,114,133,160],[71,114,161],[71,114,119,126,128,137,146,157,160,162],[71,114,146,163],[71,81,85,114,157],[71,81,114,146,157],[71,76,114],[71,78,81,114,154,157],[71,114,134,154],[71,114,164],[71,76,114,164],[71,78,81,114,134,157],[71,73,74,77,80,114,126,146,157],[71,81,88,114],[71,73,79,114],[71,81,102,103,114],[71,77,81,114,149,157,164],[71,102,114,164],[71,75,76,114,164],[71,81,114],[71,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,114],[71,81,96,114],[71,81,88,89,114],[71,79,81,89,90,114],[71,80,114],[71,73,76,81,114],[71,81,85,89,90,114],[71,85,114],[71,79,81,84,114,157],[71,73,78,81,88,114],[71,114,146],[71,76,81,102,114,162,164],[52,54,57,71,114],[54,71,114],[71,114,127,136],[51,71,114,127],[53,71,114],[51,52,55,56,71,114,127]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1d242d5c24cf285c88bc4fb93c5ff903de8319064e282986edeb6247ba028d5e","impliedFormat":1},"9071b1c70de2551dd2b81cc2251b3f49ed86d5bb129f0d0b84439b58ad2a688a","790581648acfc0943af12052b9c987a3af0526112d0a2675e167da9e041f122e",{"version":"2ccea88888048bbfcacbc9531a5596ea48a3e7dcd0a25f531a81bb717903ba4f","impliedFormat":1},"b410611b6049abb2949353f6007b3399f7b0cc68d14362b9f032cbc0dfd9d61b","9ba7ed5c56a912e5452ab38f888b3e583404836ddce3c0a2dd5fb0fb9a9a4931","754b8cc29920cddbef51d8794c1012cd0816a841d5aed9d93737f734df623552","85b5746c7ddd5b0bff3a65495f4ab0d4317319bc492577c34a9860bf1b5cfe0b","e328b6004fec2205792a6cd31e029ffb3e757a5fbb4bbb86ed4f4c4011c92193",{"version":"eef204f061321360559bd19235ea32a9d55b3ec22a362cc78d14ef50d4db4490","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b7206ca5f2f6eeaac6daa285664f424e0b728f3e31937da89deb8696c5f1dbc","impliedFormat":1},{"version":"53dd92e141efe47b413a058f3fbcc6e40a84f5afdde16f45de550a476da25d98","impliedFormat":1},{"version":"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","impliedFormat":1},{"version":"8841e2aa774b89bd23302dede20663306dc1b9902431ac64b24be8b8d0e3f649","impliedFormat":1},{"version":"fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","impliedFormat":1},{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true,"impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"13af9e8fb6757946c48117315866177b95e554d1e773577bb6ca6e40083b6d73","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"d2bc987ae352271d0d615a420dcf98cc886aa16b87fb2b569358c1fe0ca0773d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f0539c58717cbc8b73acb29f9e992ab5ff20adba5f9b57130691c7f9b186a4d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"53eac70430b30089a3a1959d8306b0f9cfaf0de75224b68ef25243e0b5ad1ca3","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"86956cc2eb9dd371d6fab493d326a574afedebf76eef3fa7833b8e0d9b52d6f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ff5a53a58e756d2661b73ba60ffe274231a4432d21f7a2d0d9e4f6aa99f4283","impliedFormat":1},{"version":"1e289f30a48126935a5d408a91129a13a59c9b0f8c007a816f9f16ef821e144e","impliedFormat":1},{"version":"2ea254f944dfe131df1264d1fb96e4b1f7d110195b21f1f5dbb68fdd394e5518","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"b11cb909327c874a4e81bfb390bf0d231e5bf9439052689ab80ba8afa50da17b","affectsGlobalScope":true,"impliedFormat":1},{"version":"23459c1915878a7c1e86e8bdb9c187cddd3aea105b8b1dfce512f093c969bc7e","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"5f6f1d54779d0b9ed152b0516b0958cd34889764c1190434bbf18e7a8bb884cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"f7b1df115dbd1b8522cba4f404a9f4fdcd5169e2137129187ffeee9d287e4fd1","impliedFormat":1},{"version":"b52d379b4939681f3781d1cfd5b2c3cbb35e7e76f2425172e165782f8a08228c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"745c4240220559bd340c8aeb6e3c5270a709d3565e934dc22a69c304703956bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"993985beef40c7d113f6dd8f0ba26eed63028b691fbfeb6a5b63f26408dd2c6d","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb094bb347d7df3380299eb69836c2c8758626ecf45917577707c03cf816b6f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"b02784111b3fc9c38590cd4339ff8718f9329a6f4d3fd66e9744a1dcd1d7e191","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"916be7d770b0ae0406be9486ac12eb9825f21514961dd050594c4b250617d5a8","impliedFormat":1},{"version":"8baa5d0febc68db886c40bf341e5c90dc215a90cd64552e47e8184be6b7e3358","impliedFormat":1}],"root":[51,52,[54,58]],"options":{"composite":false,"declaration":false,"declarationDir":"../..","declarationMap":false,"module":5,"noFallthroughCasesInSwitch":true,"noImplicitReturns":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","sourceMap":true,"strict":true,"target":4},"referencedMap":[[59,1],[60,1],[61,1],[62,1],[63,1],[64,1],[65,1],[111,2],[112,2],[113,3],[71,4],[114,5],[115,6],[116,7],[66,1],[69,8],[67,1],[68,1],[117,9],[118,10],[119,11],[120,12],[121,13],[122,14],[123,14],[125,15],[124,16],[126,17],[127,18],[128,19],[110,20],[70,1],[129,21],[130,22],[131,23],[164,24],[132,25],[133,26],[134,27],[135,28],[136,29],[137,30],[138,31],[139,32],[140,33],[141,34],[142,34],[143,35],[144,1],[145,1],[146,36],[148,37],[147,38],[149,39],[150,40],[151,41],[152,42],[153,43],[154,44],[155,45],[156,46],[157,47],[158,48],[159,49],[160,50],[161,51],[162,52],[163,53],[165,1],[166,1],[53,1],[167,1],[72,1],[48,1],[49,1],[8,1],[9,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[23,1],[4,1],[24,1],[50,1],[28,1],[25,1],[26,1],[27,1],[29,1],[30,1],[31,1],[5,1],[32,1],[33,1],[34,1],[35,1],[6,1],[39,1],[36,1],[37,1],[38,1],[40,1],[7,1],[41,1],[46,1],[47,1],[42,1],[43,1],[44,1],[45,1],[1,1],[11,1],[10,1],[88,54],[98,55],[87,54],[108,56],[79,57],[78,58],[107,59],[101,60],[106,61],[81,62],[95,63],[80,64],[104,65],[76,66],[75,59],[105,67],[77,68],[82,69],[83,1],[86,69],[73,1],[109,70],[99,71],[90,72],[91,73],[93,74],[89,75],[92,76],[102,59],[84,77],[85,78],[94,79],[74,80],[97,71],[96,69],[100,1],[103,81],[58,82],[55,83],[56,83],[51,84],[52,85],[54,86],[57,87]],"version":"5.7.3"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This builder implements a probabilistic data-structure to store the public
|
|
3
|
+
* suffixes from Mozilla's 'publicsuffix' project. The goals are:
|
|
4
|
+
*
|
|
5
|
+
* 1. Allow storing the parsed rules in a very compact form (<30KB)
|
|
6
|
+
* 2. Allow super fast load time with no parsing required (typed array)
|
|
7
|
+
* 2. Super fast lookup times (~2M+ per second)
|
|
8
|
+
*
|
|
9
|
+
* These are achieved by hashing each available suffix as a 32bits number and
|
|
10
|
+
* storing them in a typed array which is bundled in the library itself. This
|
|
11
|
+
* way the only cost of loading the rules is paid by the JavaScript engine
|
|
12
|
+
* loading the source and the size of the rules is ~29KB. Matching is also
|
|
13
|
+
* extremely fast, at around 2M+ lookups per second.
|
|
14
|
+
*
|
|
15
|
+
* **WARNING**: The drawback of this structure is that, because we use hashes of
|
|
16
|
+
* suffixes instead of their initial values, there can be collisions (think
|
|
17
|
+
* bloom filters). Some future work involves estimating the probability of
|
|
18
|
+
* collisions. Only use this structure if you are fine with this limitation and
|
|
19
|
+
* need the most compact/fast data structure available.
|
|
20
|
+
*
|
|
21
|
+
* Data Structure
|
|
22
|
+
* ==============
|
|
23
|
+
*
|
|
24
|
+
* The basic idea behind the packed hashes structure is that suffixes will be
|
|
25
|
+
* grouped by number of labels then hashed to 32bits integers using a fast
|
|
26
|
+
* hashing function. For examples:
|
|
27
|
+
*
|
|
28
|
+
* 1 label:
|
|
29
|
+
* com -> hash(com)
|
|
30
|
+
* fr -> hash(fr)
|
|
31
|
+
* gov -> hash(gov)
|
|
32
|
+
* 2 labels:
|
|
33
|
+
* co.uk -> hash(co.uk)
|
|
34
|
+
*
|
|
35
|
+
* Then the hashes are organized in a typed array from least number of labels to
|
|
36
|
+
* most number of labels, and in each section, hashes are sorted so that we can
|
|
37
|
+
* perform lookups using a binary search:
|
|
38
|
+
*
|
|
39
|
+
* |#1 length|suffix 1|suffix 2|...|#2 length|suffix 1|suffix 2|...|...
|
|
40
|
+
* ^ ^ number of suffixes with 2 labels
|
|
41
|
+
* | number of suffix with 1 label
|
|
42
|
+
*
|
|
43
|
+
* In the example above:
|
|
44
|
+
*
|
|
45
|
+
* 3|hash(com)|hash(fr)|hash(gov)|1|hash(co.uk)
|
|
46
|
+
* ^ ^ we have on suffix with 2 labels (co.uk)
|
|
47
|
+
* | we have 3 suffixes with one label
|
|
48
|
+
*
|
|
49
|
+
* In practice, the data-structure is slightly more complex as we have to handle
|
|
50
|
+
* the ICANN and PRIVATE sections of the list separately (which allows to pick
|
|
51
|
+
* one or the other at runtime; or both, which is the default) as well as
|
|
52
|
+
* wildcards and exceptions rules. The structure looks more like:
|
|
53
|
+
*
|
|
54
|
+
* |icann exceptions|private exceptions|icann wildcards|private wildcards|icann rules|private rules
|
|
55
|
+
*
|
|
56
|
+
* Still ordered from least number of labels to most number of labels. This
|
|
57
|
+
* allows the matching to be a forward progression from beginning to end,
|
|
58
|
+
* potentially skipping some sections (e.g.: private) by just incrementing the
|
|
59
|
+
* index.
|
|
60
|
+
*
|
|
61
|
+
* Finding a Match
|
|
62
|
+
* ===============
|
|
63
|
+
*
|
|
64
|
+
* Finding a match can be done efficiently, without any string copy and by a
|
|
65
|
+
* single pass over the input (from end to beginning). The algorithm is as
|
|
66
|
+
* follows:
|
|
67
|
+
*
|
|
68
|
+
* - For each character `c` in hostname, from end to start:
|
|
69
|
+
* 1. If `c` is '.' then we reached the end of a label:
|
|
70
|
+
* * Use a binary search in the section containing suffixes of the same
|
|
71
|
+
* size as our current label to check if our hash is there.
|
|
72
|
+
* * Move forward to the next section by incrementing the index by the
|
|
73
|
+
* number of suffixes in this section.
|
|
74
|
+
* 2. Update the hash with the current character
|
|
75
|
+
*
|
|
76
|
+
* This does not account for wildcards and exceptions, but explains the general
|
|
77
|
+
* idea of the matching algorithm. Have a look at the source bellow for more
|
|
78
|
+
* details.
|
|
79
|
+
*
|
|
80
|
+
* Some nice properties of this algorithm:
|
|
81
|
+
* 1. Pretty straight-forward implementation
|
|
82
|
+
* 2. Matching is always going forward in the array
|
|
83
|
+
* 3. Sections can be skipped by just incrementing the index
|
|
84
|
+
* 4. Hash can be computed on-the-fly from end to start without any string copy
|
|
85
|
+
*/
|
|
86
|
+
/**
|
|
87
|
+
* Build packed typed array given the raw public list as a string.
|
|
88
|
+
*/
|
|
89
|
+
declare const _default: (body: string) => Uint32Array<ArrayBuffer>;
|
|
90
|
+
export default _default;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This builder implements a fast and compact DAWG data-structure (a.k.a.:
|
|
3
|
+
* direct acyclic word graph, with suffix and prefix compression of the
|
|
4
|
+
* top-level domains) using JavaScript Objects. It is a good trade-off between
|
|
5
|
+
* correctness, speed and space. This is much faster then using a linear scan
|
|
6
|
+
* over all the rules, but slightly slower than the probabilistic
|
|
7
|
+
* data-structure implemented in `bin/builders/hashes.js`.
|
|
8
|
+
*
|
|
9
|
+
* Here is a simple example:
|
|
10
|
+
*
|
|
11
|
+
* co.uk
|
|
12
|
+
* gov.uk
|
|
13
|
+
* fr
|
|
14
|
+
*
|
|
15
|
+
* <root>
|
|
16
|
+
* |_ uk
|
|
17
|
+
* |_ co *
|
|
18
|
+
* |_ gov *
|
|
19
|
+
* |_ fr *
|
|
20
|
+
*
|
|
21
|
+
* Finding a match is then a matter of iterating on labels of a hostname
|
|
22
|
+
* backward and following the branches of the Trie. Whenever we find a terminal
|
|
23
|
+
* node (indicated with a '*' above), we consider this a match.
|
|
24
|
+
*/
|
|
25
|
+
declare const _default: (body: string, { includePrivate }: {
|
|
26
|
+
includePrivate: boolean;
|
|
27
|
+
}) => string;
|
|
28
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (target: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface IRule {
|
|
2
|
+
isException: boolean;
|
|
3
|
+
isIcann: boolean;
|
|
4
|
+
isNormal: boolean;
|
|
5
|
+
isWildcard: boolean;
|
|
6
|
+
rule: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parse public suffix list and invoke callback on each rule.
|
|
10
|
+
*/
|
|
11
|
+
declare const _default: (body: string, cb: (_: IRule) => void) => void;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (): void;
|
package/index.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tldts-utils",
|
|
3
|
+
"version": "6.1.81",
|
|
4
|
+
"description": "tldts internal utils (internal module)",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Rémi Berson"
|
|
7
|
+
},
|
|
8
|
+
"contributors": [
|
|
9
|
+
"Rémi Berson <remi.berson@pm.me>"
|
|
10
|
+
],
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"homepage": "https://github.com/remusao/tldts#readme",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/remusao/tldts/issues"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+ssh://git@github.com/remusao/tldts.git"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"src",
|
|
26
|
+
"index.ts"
|
|
27
|
+
],
|
|
28
|
+
"bin": {
|
|
29
|
+
"tldts-update-internal": "bin/update.js"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"clean": "rimraf dist",
|
|
33
|
+
"build": "tsc --build ./tsconfig.json",
|
|
34
|
+
"bundle": "tsc --build ./tsconfig.bundle.json && rollup --config ./rollup.config.ts --configPlugin typescript",
|
|
35
|
+
"prepack": "yarn run bundle",
|
|
36
|
+
"test": "nyc mocha --config ../../.mocharc.cjs"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"punycode": "^2.3.1"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
43
|
+
"@rollup/plugin-typescript": "^12.1.0",
|
|
44
|
+
"@types/chai": "^4.2.11",
|
|
45
|
+
"@types/mocha": "^10.0.0",
|
|
46
|
+
"@types/node": "^22.0.0",
|
|
47
|
+
"@types/punycode": "^2.1.3",
|
|
48
|
+
"chai": "^4.4.1",
|
|
49
|
+
"nyc": "^17.0.0",
|
|
50
|
+
"rimraf": "^5.0.1",
|
|
51
|
+
"rollup": "^4.1.0",
|
|
52
|
+
"rollup-plugin-sourcemaps": "^0.6.1",
|
|
53
|
+
"typescript": "^5.0.4"
|
|
54
|
+
},
|
|
55
|
+
"gitHead": "f0e968e7153e0188122278318305941caffc73d7"
|
|
56
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This builder implements a probabilistic data-structure to store the public
|
|
3
|
+
* suffixes from Mozilla's 'publicsuffix' project. The goals are:
|
|
4
|
+
*
|
|
5
|
+
* 1. Allow storing the parsed rules in a very compact form (<30KB)
|
|
6
|
+
* 2. Allow super fast load time with no parsing required (typed array)
|
|
7
|
+
* 2. Super fast lookup times (~2M+ per second)
|
|
8
|
+
*
|
|
9
|
+
* These are achieved by hashing each available suffix as a 32bits number and
|
|
10
|
+
* storing them in a typed array which is bundled in the library itself. This
|
|
11
|
+
* way the only cost of loading the rules is paid by the JavaScript engine
|
|
12
|
+
* loading the source and the size of the rules is ~29KB. Matching is also
|
|
13
|
+
* extremely fast, at around 2M+ lookups per second.
|
|
14
|
+
*
|
|
15
|
+
* **WARNING**: The drawback of this structure is that, because we use hashes of
|
|
16
|
+
* suffixes instead of their initial values, there can be collisions (think
|
|
17
|
+
* bloom filters). Some future work involves estimating the probability of
|
|
18
|
+
* collisions. Only use this structure if you are fine with this limitation and
|
|
19
|
+
* need the most compact/fast data structure available.
|
|
20
|
+
*
|
|
21
|
+
* Data Structure
|
|
22
|
+
* ==============
|
|
23
|
+
*
|
|
24
|
+
* The basic idea behind the packed hashes structure is that suffixes will be
|
|
25
|
+
* grouped by number of labels then hashed to 32bits integers using a fast
|
|
26
|
+
* hashing function. For examples:
|
|
27
|
+
*
|
|
28
|
+
* 1 label:
|
|
29
|
+
* com -> hash(com)
|
|
30
|
+
* fr -> hash(fr)
|
|
31
|
+
* gov -> hash(gov)
|
|
32
|
+
* 2 labels:
|
|
33
|
+
* co.uk -> hash(co.uk)
|
|
34
|
+
*
|
|
35
|
+
* Then the hashes are organized in a typed array from least number of labels to
|
|
36
|
+
* most number of labels, and in each section, hashes are sorted so that we can
|
|
37
|
+
* perform lookups using a binary search:
|
|
38
|
+
*
|
|
39
|
+
* |#1 length|suffix 1|suffix 2|...|#2 length|suffix 1|suffix 2|...|...
|
|
40
|
+
* ^ ^ number of suffixes with 2 labels
|
|
41
|
+
* | number of suffix with 1 label
|
|
42
|
+
*
|
|
43
|
+
* In the example above:
|
|
44
|
+
*
|
|
45
|
+
* 3|hash(com)|hash(fr)|hash(gov)|1|hash(co.uk)
|
|
46
|
+
* ^ ^ we have on suffix with 2 labels (co.uk)
|
|
47
|
+
* | we have 3 suffixes with one label
|
|
48
|
+
*
|
|
49
|
+
* In practice, the data-structure is slightly more complex as we have to handle
|
|
50
|
+
* the ICANN and PRIVATE sections of the list separately (which allows to pick
|
|
51
|
+
* one or the other at runtime; or both, which is the default) as well as
|
|
52
|
+
* wildcards and exceptions rules. The structure looks more like:
|
|
53
|
+
*
|
|
54
|
+
* |icann exceptions|private exceptions|icann wildcards|private wildcards|icann rules|private rules
|
|
55
|
+
*
|
|
56
|
+
* Still ordered from least number of labels to most number of labels. This
|
|
57
|
+
* allows the matching to be a forward progression from beginning to end,
|
|
58
|
+
* potentially skipping some sections (e.g.: private) by just incrementing the
|
|
59
|
+
* index.
|
|
60
|
+
*
|
|
61
|
+
* Finding a Match
|
|
62
|
+
* ===============
|
|
63
|
+
*
|
|
64
|
+
* Finding a match can be done efficiently, without any string copy and by a
|
|
65
|
+
* single pass over the input (from end to beginning). The algorithm is as
|
|
66
|
+
* follows:
|
|
67
|
+
*
|
|
68
|
+
* - For each character `c` in hostname, from end to start:
|
|
69
|
+
* 1. If `c` is '.' then we reached the end of a label:
|
|
70
|
+
* * Use a binary search in the section containing suffixes of the same
|
|
71
|
+
* size as our current label to check if our hash is there.
|
|
72
|
+
* * Move forward to the next section by incrementing the index by the
|
|
73
|
+
* number of suffixes in this section.
|
|
74
|
+
* 2. Update the hash with the current character
|
|
75
|
+
*
|
|
76
|
+
* This does not account for wildcards and exceptions, but explains the general
|
|
77
|
+
* idea of the matching algorithm. Have a look at the source bellow for more
|
|
78
|
+
* details.
|
|
79
|
+
*
|
|
80
|
+
* Some nice properties of this algorithm:
|
|
81
|
+
* 1. Pretty straight-forward implementation
|
|
82
|
+
* 2. Matching is always going forward in the array
|
|
83
|
+
* 3. Sections can be skipped by just incrementing the index
|
|
84
|
+
* 4. Hash can be computed on-the-fly from end to start without any string copy
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
import parse from '../parser';
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Compute 32 bits hash of `str` backward.
|
|
91
|
+
*/
|
|
92
|
+
function fastHash(str: string): number {
|
|
93
|
+
let hash = 5381;
|
|
94
|
+
for (let j = str.length - 1; j >= 0; j -= 1) {
|
|
95
|
+
hash = (hash * 33) ^ str.charCodeAt(j);
|
|
96
|
+
}
|
|
97
|
+
return hash >>> 0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
interface IRules {
|
|
101
|
+
icann: number[][];
|
|
102
|
+
priv: number[][];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Build packed typed array given the raw public list as a string.
|
|
107
|
+
*/
|
|
108
|
+
export default (body: string) => {
|
|
109
|
+
const rules: IRules = {
|
|
110
|
+
icann: [],
|
|
111
|
+
priv: [],
|
|
112
|
+
};
|
|
113
|
+
const wildcards: IRules = {
|
|
114
|
+
icann: [],
|
|
115
|
+
priv: [],
|
|
116
|
+
};
|
|
117
|
+
const exceptions: IRules = {
|
|
118
|
+
icann: [],
|
|
119
|
+
priv: [],
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// Keep track of maximum number of labels seen in a given rule. This allows us
|
|
123
|
+
// to make sure that all sections of the typed array (wildcards, exceptions
|
|
124
|
+
// and normal rules) have the same size and we do not need to check that while
|
|
125
|
+
// matching.
|
|
126
|
+
let maximumNumberOfLabels = 0;
|
|
127
|
+
|
|
128
|
+
// Iterate on public suffix rules
|
|
129
|
+
parse(body, ({ rule, isIcann, isException, isWildcard, isNormal }) => {
|
|
130
|
+
// Select correct section to insert the rule
|
|
131
|
+
let hashesPerLabels = null;
|
|
132
|
+
if (isException) {
|
|
133
|
+
hashesPerLabels = isIcann ? exceptions.icann : exceptions.priv;
|
|
134
|
+
} else if (isWildcard) {
|
|
135
|
+
hashesPerLabels = isIcann ? wildcards.icann : wildcards.priv;
|
|
136
|
+
// eslint-disable-next-line no-param-reassign
|
|
137
|
+
rule = rule.slice(2);
|
|
138
|
+
} else if (isNormal) {
|
|
139
|
+
hashesPerLabels = isIcann ? rules.icann : rules.priv;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (hashesPerLabels === null) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Count number of labels in this suffix
|
|
147
|
+
const numberOfLabels = rule.split('.').length;
|
|
148
|
+
|
|
149
|
+
// Experimentally, we start ignoring suffixes with only one label since the
|
|
150
|
+
// fallback to '*' will yield the same result. This helps reduce the size of
|
|
151
|
+
// the bundle further and speed-up matching. One potential side-effect is
|
|
152
|
+
// that we might not accurately return the information about if a suffix is
|
|
153
|
+
// from the ICANN or PRIVATE section.
|
|
154
|
+
if (
|
|
155
|
+
numberOfLabels === 1 &&
|
|
156
|
+
(hashesPerLabels === rules.icann || hashesPerLabels === rules.priv)
|
|
157
|
+
) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
maximumNumberOfLabels = Math.max(maximumNumberOfLabels, numberOfLabels);
|
|
162
|
+
let hashesForLabel = hashesPerLabels[numberOfLabels];
|
|
163
|
+
if (hashesForLabel === undefined) {
|
|
164
|
+
hashesForLabel = [];
|
|
165
|
+
hashesPerLabels[numberOfLabels] = hashesForLabel;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
hashesForLabel.push(fastHash(rule));
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Pack everything together
|
|
172
|
+
const chunks: number[][] = [];
|
|
173
|
+
const pushHashes = (hashes: number[] = []) => {
|
|
174
|
+
chunks.push([
|
|
175
|
+
hashes.length,
|
|
176
|
+
...hashes.sort((a, b) => {
|
|
177
|
+
if (a < b) {
|
|
178
|
+
return -1;
|
|
179
|
+
}
|
|
180
|
+
if (a > b) {
|
|
181
|
+
return 1;
|
|
182
|
+
}
|
|
183
|
+
return 0;
|
|
184
|
+
}),
|
|
185
|
+
]);
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
for (let label = 1; label <= maximumNumberOfLabels; label += 1) {
|
|
189
|
+
pushHashes(exceptions.icann[label]);
|
|
190
|
+
pushHashes(exceptions.priv[label]);
|
|
191
|
+
pushHashes(wildcards.icann[label]);
|
|
192
|
+
pushHashes(wildcards.priv[label]);
|
|
193
|
+
pushHashes(rules.icann[label]);
|
|
194
|
+
pushHashes(rules.priv[label]);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return new Uint32Array([
|
|
198
|
+
maximumNumberOfLabels,
|
|
199
|
+
...([] as number[]).concat(...chunks),
|
|
200
|
+
]);
|
|
201
|
+
};
|