Vo Hoang Minh commited on
Commit
2f6eb56
·
1 Parent(s): 4ee0878
.gitignore CHANGED
@@ -1,45 +1,42 @@
1
- # Byte-compiled / optimized / DLL files
2
- __pycache__/
3
- *.py[cod]
4
- *$py.class
5
-
6
- /node_modules/
7
-
8
- # C extensions
9
- *.so
10
-
11
- # Distribution / packaging
12
- dist/
13
- build/
14
- *.egg-info/
15
-
16
- # Virtual environments
17
- venv/
18
- env/
19
- .env/
20
- .venv/
21
- ENV/
22
-
23
- # IDE specific files
24
- .idea/
25
- .vscode/
26
- *.swp
27
- *.swo
28
-
29
- # Jupyter Notebook
30
- .ipynb_checkpoints
31
-
32
- # Local development settings
33
- .env
34
- .env.local
35
 
36
- # pytest
37
- .pytest_cache/
38
- .coverage
39
- htmlcov/
40
 
41
- # mypy
42
- .mypy_cache/
43
 
44
- # Logs
45
- *.log
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+ # dependencies
4
+ /node_modules
5
+ /.pnp
6
+ .pnp.js
7
+
8
+ # testing
9
+ /coverage
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
+ # next.js
12
+ /.next/
13
+ /out/
 
14
 
15
+ # production
16
+ /build
17
 
18
+ # misc
19
+ .DS_Store
20
+ *.pem
21
+
22
+ # debug
23
+ npm-debug.log*
24
+ yarn-debug.log*
25
+ yarn-error.log*
26
+
27
+ # local env files
28
+ .env.local
29
+ .env.development.local
30
+ .env.test.local
31
+ .env.production.local
32
+
33
+ # vercel
34
+ .vercel
35
+
36
+ **/*.trace
37
+ **/*.zip
38
+ **/*.tar.gz
39
+ **/*.tgz
40
+ **/*.log
41
+ package-lock.json
42
+ **/*.bun
.vscode/settings.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ {
2
+ "python.analysis.autoImportCompletions": true
3
+ }
Dockerfile CHANGED
@@ -1,23 +1,63 @@
1
- FROM python:3.13-slim
2
 
 
 
 
3
 
4
- # Đặt biến môi trường
5
- ENV DISPLAY=:99
6
 
 
 
 
 
7
 
 
 
 
 
8
 
9
- WORKDIR /app
10
- COPY . /app
11
 
12
- ENV PLAYWRIGHT_BROWSERS_PATH=/tmp
 
 
 
13
 
14
- RUN chmod -R 777 /app
15
 
16
- RUN pip install playwright
17
- RUN python -m playwright install --with-deps --only-shell chromium
18
 
19
- RUN pip install -r requirements.txt
 
 
20
 
21
- # CMD ["uvicorn", "main:app", "--port", "8000", "--reload"]
22
- CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM ubuntu:20.04
2
 
3
+ # Install vnc, xvfb in order to create a 'fake' display and chrome
4
+ RUN export DEBIAN_FRONTEND=noninteractive
5
+ RUN export DISPLAY=0
6
 
7
+ RUN ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
 
8
 
9
+ RUN apt-get update &&\
10
+ apt-get install -y tzdata &&\
11
+ dpkg-reconfigure --frontend noninteractive tzdata &&\
12
+ apt-get install -y x11vnc xvfb zip wget curl psmisc supervisor gconf-service libasound2 libatk1.0-0 libatk-bridge2.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-bin libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils libgbm-dev nginx libcurl3-gnutls
13
 
14
+ RUN curl --silent --location https://deb.nodesource.com/setup_18.x | bash - &&\
15
+ apt-get -y -qq install nodejs &&\
16
+ apt-get -y -qq install build-essential &&\
17
+ fc-cache -f -v
18
 
19
+ RUN wget https://orbita-browser-linux.gologin.com/orbita-browser-latest.tar.gz -O /tmp/orbita-browser.tar.gz
 
20
 
21
+ # GOLOGIN INSTALL
22
+ RUN cd /tmp &&\
23
+ tar -xzf /tmp/orbita-browser.tar.gz -C /usr/bin &&\
24
+ rm -f /tmp/orbita-browser.tar.gz
25
 
26
+ RUN apt-get -qq clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
27
 
28
+ # WORKER INSTALL
 
29
 
30
+ COPY package.json /opt/orbita/package.json
31
+ RUN cd /opt/orbita &&\
32
+ npm install
33
 
 
 
34
 
35
+ # Add the browser user (orbita)
36
+ RUN groupadd -r orbita && useradd -r -g orbita -s/bin/bash -G audio,video,sudo -p $(echo 1 | openssl passwd -1 -stdin) orbita \
37
+ && mkdir -p /home/orbita/Downloads \
38
+ && chown -R orbita:orbita /home/orbita
39
+
40
+ RUN echo 'orbita ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
41
+
42
+ RUN mkdir -p /home/orbita/.gologin/browser
43
+ COPY fonts /home/orbita/.gologin/browser/fonts
44
+
45
+ RUN rm /etc/nginx/sites-enabled/default
46
+ COPY orbita.conf /etc/nginx/conf.d/orbita.conf
47
+ RUN chmod 777 /var/lib/nginx -R
48
+ RUN chmod 777 /var/log -R
49
+ RUN chmod 777 /run -R
50
+ #sudo orbita
51
+ RUN usermod -a -G sudo orbita
52
+
53
+ EXPOSE 3000
54
+
55
+ COPY index.js /opt/orbita/index.js
56
+ COPY entrypoint.sh /entrypoint.sh
57
+
58
+ RUN chmod 777 /entrypoint.sh \
59
+ && mkdir /tmp/.X11-unix \
60
+ && chmod 1777 /tmp/.X11-unix
61
+
62
+ USER orbita
63
+ ENTRYPOINT ["/entrypoint.sh"]
README.md CHANGED
@@ -5,7 +5,7 @@ colorFrom: red
5
  colorTo: purple
6
  sdk: docker
7
  pinned: false
8
- app_port: 8000
9
  ---
10
 
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
5
  colorTo: purple
6
  sdk: docker
7
  pinned: false
8
+ app_port: 3000
9
  ---
10
 
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.mjs CHANGED
@@ -1,31 +1,118 @@
1
- import { chromium } from "playwright"; // Sử dụng import thay vì require
 
 
 
 
 
2
 
3
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
 
 
4
 
5
- (async () => {
6
- // Khởi động trình duyệt Chromium
7
- const browser = await chromium.launch({
8
- executablePath:
9
- "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
10
- headless: false,
11
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
- const page = await browser.newPage();
 
 
 
 
 
14
 
15
- await page.goto("https://chat.zalo.me/", {
16
- waitUntil: "domcontentloaded",
17
- });
 
 
18
 
19
- // Đợi cho đến khi phần tử có class là "zalo-chat" xuất hiện
20
- await page.waitForSelector(".qrcode", {
21
- visible: true,
22
- });
23
 
24
- const title = await page.title();
25
- console.log("Tiêu đề trang:", title);
 
 
 
 
 
 
26
 
27
- await page.screenshot({ path: "screenshot.png" });
 
28
 
29
- await sleep(20000);
30
- await browser.close();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  })();
 
1
+ /**
2
+ * @typedef {import('playwright').Page} Page
3
+ * @typedef {import('playwright').Browser} Browser
4
+ */
5
+ import { chromium } from "playwright-extra";
6
+ import stealth from "puppeteer-extra-plugin-stealth";
7
 
8
+ import { log } from "./logging.mjs";
9
+ import fs from "fs";
10
+ chromium.use(stealth())
11
 
12
+ const STORAGE_PATH = "./auth.json";
13
+
14
+ const sleep = (s) => new Promise((resolve) => setTimeout(resolve, s * 1000));
15
+
16
+ class ZaloBot {
17
+ /** @type {Browser | null} */
18
+ browser = null;
19
+ /** @type {Page | null} */
20
+ page = null;
21
+
22
+ async init() {
23
+ log.info("🚀 Launching browser...");
24
+ this.browser = await chromium.launch({
25
+ executablePath:
26
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
27
+ headless: false,
28
+ });
29
+
30
+ const context = await this.browser.newContext({
31
+ storageState: fs.existsSync(STORAGE_PATH) ? STORAGE_PATH : undefined,
32
+ });
33
+
34
+ this.page = await context.newPage(); // Trả về page thay vì lưu toàn cục
35
+ return this.page;
36
+ }
37
+
38
+ /**
39
+ * Kiểm tra và chờ đăng nhập Zalo
40
+ * @param {Page} page - Trang web cần kiểm tra đăng nhập
41
+ */
42
+ async ensureLogin(page = this.page) {
43
+ log.info("🔄 Checking login...");
44
+ await page.goto("https://chat.zalo.me/", { waitUntil: "domcontentloaded" });
45
 
46
+ await sleep(8);
47
+ if (page.url().startsWith("https://chat.zalo.me")) {
48
+ log.info(`page url: ${page.url()}`);
49
+ log.info("✅ Already logged in!");
50
+ return true;
51
+ }
52
 
53
+ log.info("📷 QR Code detected, waiting...");
54
+ await page.waitForURL("https://chat.zalo.me/", {
55
+ waitUntil: "domcontentloaded",
56
+ timeout: 30000,
57
+ });
58
 
59
+ log.info(" Login successful!");
60
+ await this.saveSession(page);
61
+ }
 
62
 
63
+ async testDetect() {
64
+ const testSites = [
65
+ "https://bot.sannysoft.com/", // Kiểm tra bot detection
66
+ "https://abrahamjuliot.github.io/creepjs/", // Xem fingerprint
67
+ "https://browserleaks.com/webgl", // Test WebGL detection
68
+ "https://pixelscan.net/", // Kiểm tra fingerprint toàn diện
69
+ "https://www.whatismybrowser.com/detect/are-you-bot", // Kiểm tra bot đơn giản
70
+ ];
71
 
72
+ let ctx = await this.browser.newContext();
73
+ const pages = await Promise.all(testSites.map(() => ctx.newPage()));
74
 
75
+ testSites.forEach(async (url, i) => {
76
+ console.log(`🕵️ Testing: ${url}`);
77
+ await pages[i].goto(url);
78
+ });
79
+
80
+ await sleep(100);
81
+ console.log("✅ Opened all test sites!");
82
+ }
83
+
84
+ /** Chạy toàn bộ bot */
85
+ async run() {
86
+ const page = await this.init();
87
+ await this.ensureLogin(page);
88
+ await page.screenshot({ path: "screenshot.png" });
89
+
90
+ await this.saveSession(page);
91
+ await sleep(60);
92
+ }
93
+ async saveSession(page) {
94
+ log.info("💾 Saving session...");
95
+ await page.context().storageState({ path: STORAGE_PATH });
96
+ log.info("✅ Session saved!");
97
+ }
98
+
99
+ async close() {
100
+ if (this.browser) {
101
+ await this.browser.close();
102
+ log.info("🛑 Browser closed!");
103
+ }
104
+ }
105
+ }
106
+
107
+ // Main function to handle errors
108
+ (async () => {
109
+ let bot = new ZaloBot();
110
+ try {
111
+ await bot.init();
112
+ await bot.testDetect();
113
+ } catch (err) {
114
+ log.error(err);
115
+ } finally {
116
+ await bot.close();
117
+ }
118
  })();
bun.lockb ADDED
Binary file (4.15 kB). View file
 
entrypoint.sh ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ mkdir ~/.vnc
4
+ DISPLAY=:0
5
+ export DISPLAY=:0
6
+ echo $SCREEN_WIDTH
7
+ echo $SCREEN_HEIGHT
8
+ echo `echo $SCREEN_WIDTH`x`echo $SCREEN_HEIGHT`x16
9
+
10
+ cd /opt/orbita
11
+ Xvfb $DISPLAY -screen 0 `echo $SCREEN_WIDTH`x`echo $SCREEN_HEIGHT`x16 &
12
+ sleep 3
13
+ x11vnc -storepasswd 12345678 ~/.vnc/passwd
14
+ x11vnc -display $DISPLAY -bg -forever -usepw -quiet -rfbport 5901 -xkb
15
+ /usr/sbin/nginx -c /etc/nginx/nginx.conf
16
+ node index.js
index.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const GoLogin = require('gologin')
2
+
3
+ const SCREEN_WIDTH = process.env.SCREEN_WIDTH;
4
+ const SCREEN_HEIGHT = process.env.SCREEN_HEIGHT;
5
+
6
+ const gologinParams = {
7
+ token: process.env.TOKEN,
8
+ profile_id: process.env.PROFILE_ID,
9
+ remote_debugging_port: 3500,
10
+ executablePath: '/usr/bin/orbita-browser/chrome',
11
+ extra_params: ['--start-maximized', '--disable-dev-shm-usage', '--no-sandbox', '--no-zygote', '--window-position=0,0', `--window-size=${SCREEN_WIDTH},${SCREEN_HEIGHT}`],
12
+ };
13
+
14
+ const GL = new GoLogin(gologinParams);
15
+ console.log(gologinParams)
16
+
17
+ function checkBrowser(){
18
+ console.log('working port', 3000, 'profile', process.env.PROFILE_ID)
19
+ }
20
+
21
+ async function startBrowser(){
22
+ const wsUrl = await GL.start({
23
+ uploadCookiesToServer: true,
24
+ autoUpdateBrowser: false,
25
+ });
26
+ setInterval(checkBrowser, 1000);
27
+ }
28
+
29
+ startBrowser();
logging.mjs ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import pino from "pino";
2
+
3
+ export const log = pino({
4
+ level: "info",
5
+ transport: {
6
+ target: "pino-pretty",
7
+ options: { colorize: true },
8
+ },
9
+ });
main.py CHANGED
@@ -103,6 +103,8 @@ async def browse(
103
 
104
  await page.wait_for_selector(".qrcode", timeout=10000)
105
 
 
 
106
  path = SS_DIR / f"{uuid.uuid4()}.png"
107
  await page.screenshot(path=str(path))
108
  return FileResponse(str(path), media_type="image/png")
 
103
 
104
  await page.wait_for_selector(".qrcode", timeout=10000)
105
 
106
+ await asyncio.sleep(2)
107
+
108
  path = SS_DIR / f"{uuid.uuid4()}.png"
109
  await page.screenshot(path=str(path))
110
  return FileResponse(str(path), media_type="image/png")
orbita.conf ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ server {
2
+ listen 3000 default_server;
3
+
4
+ server_name _;
5
+
6
+ location /json {
7
+ proxy_pass http://127.0.0.1:3500;
8
+ proxy_http_version 1.1;
9
+ proxy_set_header X-Real-IP $server_addr;
10
+ proxy_set_header X-Forwarded-for $server_addr;
11
+ proxy_set_header Host '127.0.0.1';
12
+ }
13
+
14
+ location /devtools {
15
+ proxy_pass http://127.0.0.1:3500;
16
+ proxy_http_version 1.1;
17
+ proxy_set_header Upgrade $http_upgrade;
18
+ proxy_set_header Connection "upgrade";
19
+ proxy_set_header X-Real-IP $server_addr;
20
+ proxy_set_header X-Forwarded-for $server_addr;
21
+ proxy_set_header Host '127.0.0.1';
22
+ }
23
+ }
package.json CHANGED
@@ -1,16 +1,21 @@
1
  {
2
- "name": "her",
3
- "version": "1.0.0",
4
- "description": "",
5
- "main": "index.js",
6
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
 
8
  },
9
- "keywords": [],
10
- "author": "",
11
- "license": "ISC",
12
- "packageManager": "pnpm@10.6.1",
13
  "dependencies": {
14
- "playwright": "^1.51.1"
15
- }
16
- }
 
 
 
 
 
 
 
 
 
 
 
1
  {
2
+ "name": "app",
3
+ "version": "1.0.50",
 
 
4
  "scripts": {
5
+ "test": "echo \"Error: no test specified\" && exit 1",
6
+ "dev": "bun run --watch src/index.ts"
7
  },
 
 
 
 
8
  "dependencies": {
9
+ "elysia": "latest",
10
+ "pino": "^9.6.0",
11
+ "pino-pretty": "^13.0.0",
12
+ "playwright": "^1.51.1",
13
+ "playwright-extra": "^4.3.6",
14
+ "playwright-extra-plugin-stealth": "^0.0.1",
15
+ "puppeteer-extra-plugin-stealth": "^2.11.2"
16
+ },
17
+ "devDependencies": {
18
+ "bun-types": "latest"
19
+ },
20
+ "module": "src/index.js"
21
+ }
pnpm-lock.yaml CHANGED
@@ -8,36 +8,678 @@ importers:
8
 
9
  .:
10
  dependencies:
 
 
 
 
 
 
 
 
 
11
  playwright:
12
  specifier: ^1.51.1
13
  version: 1.51.1
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
  packages:
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  fsevents@2.3.2:
18
  resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
19
  engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
20
  os: [darwin]
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  playwright-core@1.51.1:
23
  resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==}
24
  engines: {node: '>=18'}
25
  hasBin: true
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  playwright@1.51.1:
28
  resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==}
29
  engines: {node: '>=18'}
30
  hasBin: true
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  snapshots:
33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  fsevents@2.3.2:
35
  optional: true
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  playwright-core@1.51.1: {}
38
 
 
 
 
 
 
 
 
 
 
 
 
39
  playwright@1.51.1:
40
  dependencies:
41
  playwright-core: 1.51.1
42
  optionalDependencies:
43
  fsevents: 2.3.2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  .:
10
  dependencies:
11
+ elysia:
12
+ specifier: latest
13
+ version: 1.2.25(@sinclair/typebox@0.34.31)
14
+ pino:
15
+ specifier: ^9.6.0
16
+ version: 9.6.0
17
+ pino-pretty:
18
+ specifier: ^13.0.0
19
+ version: 13.0.0
20
  playwright:
21
  specifier: ^1.51.1
22
  version: 1.51.1
23
+ playwright-extra:
24
+ specifier: ^4.3.6
25
+ version: 4.3.6(playwright-core@1.51.1)(playwright@1.51.1)
26
+ playwright-extra-plugin-stealth:
27
+ specifier: ^0.0.1
28
+ version: 0.0.1
29
+ puppeteer-extra-plugin-stealth:
30
+ specifier: ^2.11.2
31
+ version: 2.11.2(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1))
32
+ devDependencies:
33
+ bun-types:
34
+ specifier: latest
35
+ version: 1.2.7
36
 
37
  packages:
38
 
39
+ '@sinclair/typebox@0.34.31':
40
+ resolution: {integrity: sha512-qQ71T9DsITbX3dVCrcBERbs11YuSMg3wZPnT472JhqhWGPdiLgyvihJXU8m+ADJtJvRdjATIiACJD22dEknBrQ==}
41
+
42
+ '@types/debug@4.1.12':
43
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
44
+
45
+ '@types/ms@2.1.0':
46
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
47
+
48
+ '@types/node@22.13.14':
49
+ resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==}
50
+
51
+ '@types/ws@8.18.0':
52
+ resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==}
53
+
54
+ arr-union@3.1.0:
55
+ resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
56
+ engines: {node: '>=0.10.0'}
57
+
58
+ atomic-sleep@1.0.0:
59
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
60
+ engines: {node: '>=8.0.0'}
61
+
62
+ balanced-match@1.0.2:
63
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
64
+
65
+ brace-expansion@1.1.11:
66
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
67
+
68
+ bun-types@1.2.7:
69
+ resolution: {integrity: sha512-P4hHhk7kjF99acXqKvltyuMQ2kf/rzIw3ylEDpCxDS9Xa0X0Yp/gJu/vDCucmWpiur5qJ0lwB2bWzOXa2GlHqA==}
70
+
71
+ clone-deep@0.2.4:
72
+ resolution: {integrity: sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==}
73
+ engines: {node: '>=0.10.0'}
74
+
75
+ colorette@2.0.20:
76
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
77
+
78
+ concat-map@0.0.1:
79
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
80
+
81
+ cookie@1.0.2:
82
+ resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
83
+ engines: {node: '>=18'}
84
+
85
+ dateformat@4.6.3:
86
+ resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
87
+
88
+ debug@4.4.0:
89
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
90
+ engines: {node: '>=6.0'}
91
+ peerDependencies:
92
+ supports-color: '*'
93
+ peerDependenciesMeta:
94
+ supports-color:
95
+ optional: true
96
+
97
+ deepmerge@4.3.1:
98
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
99
+ engines: {node: '>=0.10.0'}
100
+
101
+ elysia@1.2.25:
102
+ resolution: {integrity: sha512-WsdQpORJvb4uszzeqYT0lg97knw1iBW1NTzJ1Jm57tiHg+DfAotlWXYbjmvQ039ssV0fYELDHinLLoUazZkEHg==}
103
+ peerDependencies:
104
+ '@sinclair/typebox': '>= 0.34.0'
105
+ openapi-types: '>= 12.0.0'
106
+ typescript: '>= 5.0.0'
107
+ peerDependenciesMeta:
108
+ openapi-types:
109
+ optional: true
110
+ typescript:
111
+ optional: true
112
+
113
+ end-of-stream@1.4.4:
114
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
115
+
116
+ fast-copy@3.0.2:
117
+ resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==}
118
+
119
+ fast-redact@3.5.0:
120
+ resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
121
+ engines: {node: '>=6'}
122
+
123
+ fast-safe-stringify@2.1.1:
124
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
125
+
126
+ for-in@0.1.8:
127
+ resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==}
128
+ engines: {node: '>=0.10.0'}
129
+
130
+ for-in@1.0.2:
131
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
132
+ engines: {node: '>=0.10.0'}
133
+
134
+ for-own@0.1.5:
135
+ resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==}
136
+ engines: {node: '>=0.10.0'}
137
+
138
+ fs-extra@10.1.0:
139
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
140
+ engines: {node: '>=12'}
141
+
142
+ fs.realpath@1.0.0:
143
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
144
+
145
  fsevents@2.3.2:
146
  resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
147
  engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
148
  os: [darwin]
149
 
150
+ glob@7.2.3:
151
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
152
+ deprecated: Glob versions prior to v9 are no longer supported
153
+
154
+ graceful-fs@4.2.11:
155
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
156
+
157
+ help-me@5.0.0:
158
+ resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==}
159
+
160
+ inflight@1.0.6:
161
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
162
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
163
+
164
+ inherits@2.0.4:
165
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
166
+
167
+ is-buffer@1.1.6:
168
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
169
+
170
+ is-extendable@0.1.1:
171
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
172
+ engines: {node: '>=0.10.0'}
173
+
174
+ is-plain-object@2.0.4:
175
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
176
+ engines: {node: '>=0.10.0'}
177
+
178
+ isobject@3.0.1:
179
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
180
+ engines: {node: '>=0.10.0'}
181
+
182
+ joycon@3.1.1:
183
+ resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
184
+ engines: {node: '>=10'}
185
+
186
+ jsonfile@6.1.0:
187
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
188
+
189
+ kind-of@2.0.1:
190
+ resolution: {integrity: sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==}
191
+ engines: {node: '>=0.10.0'}
192
+
193
+ kind-of@3.2.2:
194
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
195
+ engines: {node: '>=0.10.0'}
196
+
197
+ lazy-cache@0.2.7:
198
+ resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==}
199
+ engines: {node: '>=0.10.0'}
200
+
201
+ lazy-cache@1.0.4:
202
+ resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==}
203
+ engines: {node: '>=0.10.0'}
204
+
205
+ memoirist@0.3.0:
206
+ resolution: {integrity: sha512-wR+4chMgVPq+T6OOsk40u9Wlpw1Pjx66NMNiYxCQQ4EUJ7jDs3D9kTCeKdBOkvAiqXlHLVJlvYL01PvIJ1MPNg==}
207
+
208
+ merge-deep@3.0.3:
209
+ resolution: {integrity: sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==}
210
+ engines: {node: '>=0.10.0'}
211
+
212
+ minimatch@3.1.2:
213
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
214
+
215
+ minimist@1.2.8:
216
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
217
+
218
+ mixin-object@2.0.1:
219
+ resolution: {integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==}
220
+ engines: {node: '>=0.10.0'}
221
+
222
+ ms@2.1.3:
223
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
224
+
225
+ on-exit-leak-free@2.1.2:
226
+ resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
227
+ engines: {node: '>=14.0.0'}
228
+
229
+ once@1.4.0:
230
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
231
+
232
+ path-is-absolute@1.0.1:
233
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
234
+ engines: {node: '>=0.10.0'}
235
+
236
+ pino-abstract-transport@2.0.0:
237
+ resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
238
+
239
+ pino-pretty@13.0.0:
240
+ resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==}
241
+ hasBin: true
242
+
243
+ pino-std-serializers@7.0.0:
244
+ resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==}
245
+
246
+ pino@9.6.0:
247
+ resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==}
248
+ hasBin: true
249
+
250
  playwright-core@1.51.1:
251
  resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==}
252
  engines: {node: '>=18'}
253
  hasBin: true
254
 
255
+ playwright-extra-plugin-stealth@0.0.1:
256
+ resolution: {integrity: sha512-eI0Ujf4MXbcupzlVEXaaOnb+Exjt1sFi7t/3KxIA5pVww+WRAXRWdhqTz0glX62jJq2YM8fLu+GyvULpjTpZrw==}
257
+
258
+ playwright-extra@4.3.6:
259
+ resolution: {integrity: sha512-q2rVtcE8V8K3vPVF1zny4pvwZveHLH8KBuVU2MoE3Jw4OKVoBWsHI9CH9zPydovHHOCDxjGN2Vg+2m644q3ijA==}
260
+ engines: {node: '>=12'}
261
+ peerDependencies:
262
+ playwright: '*'
263
+ playwright-core: '*'
264
+ peerDependenciesMeta:
265
+ playwright:
266
+ optional: true
267
+ playwright-core:
268
+ optional: true
269
+
270
  playwright@1.51.1:
271
  resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==}
272
  engines: {node: '>=18'}
273
  hasBin: true
274
 
275
+ process-warning@4.0.1:
276
+ resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==}
277
+
278
+ pump@3.0.2:
279
+ resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
280
+
281
+ puppeteer-extra-plugin-stealth@2.11.2:
282
+ resolution: {integrity: sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ==}
283
+ engines: {node: '>=8'}
284
+ peerDependencies:
285
+ playwright-extra: '*'
286
+ puppeteer-extra: '*'
287
+ peerDependenciesMeta:
288
+ playwright-extra:
289
+ optional: true
290
+ puppeteer-extra:
291
+ optional: true
292
+
293
+ puppeteer-extra-plugin-user-data-dir@2.4.1:
294
+ resolution: {integrity: sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g==}
295
+ engines: {node: '>=8'}
296
+ peerDependencies:
297
+ playwright-extra: '*'
298
+ puppeteer-extra: '*'
299
+ peerDependenciesMeta:
300
+ playwright-extra:
301
+ optional: true
302
+ puppeteer-extra:
303
+ optional: true
304
+
305
+ puppeteer-extra-plugin-user-preferences@2.4.1:
306
+ resolution: {integrity: sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A==}
307
+ engines: {node: '>=8'}
308
+ peerDependencies:
309
+ playwright-extra: '*'
310
+ puppeteer-extra: '*'
311
+ peerDependenciesMeta:
312
+ playwright-extra:
313
+ optional: true
314
+ puppeteer-extra:
315
+ optional: true
316
+
317
+ puppeteer-extra-plugin@3.2.3:
318
+ resolution: {integrity: sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q==}
319
+ engines: {node: '>=9.11.2'}
320
+ peerDependencies:
321
+ playwright-extra: '*'
322
+ puppeteer-extra: '*'
323
+ peerDependenciesMeta:
324
+ playwright-extra:
325
+ optional: true
326
+ puppeteer-extra:
327
+ optional: true
328
+
329
+ quick-format-unescaped@4.0.4:
330
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
331
+
332
+ real-require@0.2.0:
333
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
334
+ engines: {node: '>= 12.13.0'}
335
+
336
+ rimraf@3.0.2:
337
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
338
+ deprecated: Rimraf versions prior to v4 are no longer supported
339
+ hasBin: true
340
+
341
+ safe-stable-stringify@2.5.0:
342
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
343
+ engines: {node: '>=10'}
344
+
345
+ secure-json-parse@2.7.0:
346
+ resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
347
+
348
+ shallow-clone@0.1.2:
349
+ resolution: {integrity: sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==}
350
+ engines: {node: '>=0.10.0'}
351
+
352
+ sonic-boom@4.2.0:
353
+ resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==}
354
+
355
+ split2@4.2.0:
356
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
357
+ engines: {node: '>= 10.x'}
358
+
359
+ strip-json-comments@3.1.1:
360
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
361
+ engines: {node: '>=8'}
362
+
363
+ thread-stream@3.1.0:
364
+ resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
365
+
366
+ undici-types@6.20.0:
367
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
368
+
369
+ universalify@2.0.1:
370
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
371
+ engines: {node: '>= 10.0.0'}
372
+
373
+ wrappy@1.0.2:
374
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
375
+
376
  snapshots:
377
 
378
+ '@sinclair/typebox@0.34.31': {}
379
+
380
+ '@types/debug@4.1.12':
381
+ dependencies:
382
+ '@types/ms': 2.1.0
383
+
384
+ '@types/ms@2.1.0': {}
385
+
386
+ '@types/node@22.13.14':
387
+ dependencies:
388
+ undici-types: 6.20.0
389
+
390
+ '@types/ws@8.18.0':
391
+ dependencies:
392
+ '@types/node': 22.13.14
393
+
394
+ arr-union@3.1.0: {}
395
+
396
+ atomic-sleep@1.0.0: {}
397
+
398
+ balanced-match@1.0.2: {}
399
+
400
+ brace-expansion@1.1.11:
401
+ dependencies:
402
+ balanced-match: 1.0.2
403
+ concat-map: 0.0.1
404
+
405
+ bun-types@1.2.7:
406
+ dependencies:
407
+ '@types/node': 22.13.14
408
+ '@types/ws': 8.18.0
409
+
410
+ clone-deep@0.2.4:
411
+ dependencies:
412
+ for-own: 0.1.5
413
+ is-plain-object: 2.0.4
414
+ kind-of: 3.2.2
415
+ lazy-cache: 1.0.4
416
+ shallow-clone: 0.1.2
417
+
418
+ colorette@2.0.20: {}
419
+
420
+ concat-map@0.0.1: {}
421
+
422
+ cookie@1.0.2: {}
423
+
424
+ dateformat@4.6.3: {}
425
+
426
+ debug@4.4.0:
427
+ dependencies:
428
+ ms: 2.1.3
429
+
430
+ deepmerge@4.3.1: {}
431
+
432
+ elysia@1.2.25(@sinclair/typebox@0.34.31):
433
+ dependencies:
434
+ '@sinclair/typebox': 0.34.31
435
+ cookie: 1.0.2
436
+ memoirist: 0.3.0
437
+
438
+ end-of-stream@1.4.4:
439
+ dependencies:
440
+ once: 1.4.0
441
+
442
+ fast-copy@3.0.2: {}
443
+
444
+ fast-redact@3.5.0: {}
445
+
446
+ fast-safe-stringify@2.1.1: {}
447
+
448
+ for-in@0.1.8: {}
449
+
450
+ for-in@1.0.2: {}
451
+
452
+ for-own@0.1.5:
453
+ dependencies:
454
+ for-in: 1.0.2
455
+
456
+ fs-extra@10.1.0:
457
+ dependencies:
458
+ graceful-fs: 4.2.11
459
+ jsonfile: 6.1.0
460
+ universalify: 2.0.1
461
+
462
+ fs.realpath@1.0.0: {}
463
+
464
  fsevents@2.3.2:
465
  optional: true
466
 
467
+ glob@7.2.3:
468
+ dependencies:
469
+ fs.realpath: 1.0.0
470
+ inflight: 1.0.6
471
+ inherits: 2.0.4
472
+ minimatch: 3.1.2
473
+ once: 1.4.0
474
+ path-is-absolute: 1.0.1
475
+
476
+ graceful-fs@4.2.11: {}
477
+
478
+ help-me@5.0.0: {}
479
+
480
+ inflight@1.0.6:
481
+ dependencies:
482
+ once: 1.4.0
483
+ wrappy: 1.0.2
484
+
485
+ inherits@2.0.4: {}
486
+
487
+ is-buffer@1.1.6: {}
488
+
489
+ is-extendable@0.1.1: {}
490
+
491
+ is-plain-object@2.0.4:
492
+ dependencies:
493
+ isobject: 3.0.1
494
+
495
+ isobject@3.0.1: {}
496
+
497
+ joycon@3.1.1: {}
498
+
499
+ jsonfile@6.1.0:
500
+ dependencies:
501
+ universalify: 2.0.1
502
+ optionalDependencies:
503
+ graceful-fs: 4.2.11
504
+
505
+ kind-of@2.0.1:
506
+ dependencies:
507
+ is-buffer: 1.1.6
508
+
509
+ kind-of@3.2.2:
510
+ dependencies:
511
+ is-buffer: 1.1.6
512
+
513
+ lazy-cache@0.2.7: {}
514
+
515
+ lazy-cache@1.0.4: {}
516
+
517
+ memoirist@0.3.0: {}
518
+
519
+ merge-deep@3.0.3:
520
+ dependencies:
521
+ arr-union: 3.1.0
522
+ clone-deep: 0.2.4
523
+ kind-of: 3.2.2
524
+
525
+ minimatch@3.1.2:
526
+ dependencies:
527
+ brace-expansion: 1.1.11
528
+
529
+ minimist@1.2.8: {}
530
+
531
+ mixin-object@2.0.1:
532
+ dependencies:
533
+ for-in: 0.1.8
534
+ is-extendable: 0.1.1
535
+
536
+ ms@2.1.3: {}
537
+
538
+ on-exit-leak-free@2.1.2: {}
539
+
540
+ once@1.4.0:
541
+ dependencies:
542
+ wrappy: 1.0.2
543
+
544
+ path-is-absolute@1.0.1: {}
545
+
546
+ pino-abstract-transport@2.0.0:
547
+ dependencies:
548
+ split2: 4.2.0
549
+
550
+ pino-pretty@13.0.0:
551
+ dependencies:
552
+ colorette: 2.0.20
553
+ dateformat: 4.6.3
554
+ fast-copy: 3.0.2
555
+ fast-safe-stringify: 2.1.1
556
+ help-me: 5.0.0
557
+ joycon: 3.1.1
558
+ minimist: 1.2.8
559
+ on-exit-leak-free: 2.1.2
560
+ pino-abstract-transport: 2.0.0
561
+ pump: 3.0.2
562
+ secure-json-parse: 2.7.0
563
+ sonic-boom: 4.2.0
564
+ strip-json-comments: 3.1.1
565
+
566
+ pino-std-serializers@7.0.0: {}
567
+
568
+ pino@9.6.0:
569
+ dependencies:
570
+ atomic-sleep: 1.0.0
571
+ fast-redact: 3.5.0
572
+ on-exit-leak-free: 2.1.2
573
+ pino-abstract-transport: 2.0.0
574
+ pino-std-serializers: 7.0.0
575
+ process-warning: 4.0.1
576
+ quick-format-unescaped: 4.0.4
577
+ real-require: 0.2.0
578
+ safe-stable-stringify: 2.5.0
579
+ sonic-boom: 4.2.0
580
+ thread-stream: 3.1.0
581
+
582
  playwright-core@1.51.1: {}
583
 
584
+ playwright-extra-plugin-stealth@0.0.1: {}
585
+
586
+ playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1):
587
+ dependencies:
588
+ debug: 4.4.0
589
+ optionalDependencies:
590
+ playwright: 1.51.1
591
+ playwright-core: 1.51.1
592
+ transitivePeerDependencies:
593
+ - supports-color
594
+
595
  playwright@1.51.1:
596
  dependencies:
597
  playwright-core: 1.51.1
598
  optionalDependencies:
599
  fsevents: 2.3.2
600
+
601
+ process-warning@4.0.1: {}
602
+
603
+ pump@3.0.2:
604
+ dependencies:
605
+ end-of-stream: 1.4.4
606
+ once: 1.4.0
607
+
608
+ puppeteer-extra-plugin-stealth@2.11.2(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1)):
609
+ dependencies:
610
+ debug: 4.4.0
611
+ puppeteer-extra-plugin: 3.2.3(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1))
612
+ puppeteer-extra-plugin-user-preferences: 2.4.1(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1))
613
+ optionalDependencies:
614
+ playwright-extra: 4.3.6(playwright-core@1.51.1)(playwright@1.51.1)
615
+ transitivePeerDependencies:
616
+ - supports-color
617
+
618
+ puppeteer-extra-plugin-user-data-dir@2.4.1(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1)):
619
+ dependencies:
620
+ debug: 4.4.0
621
+ fs-extra: 10.1.0
622
+ puppeteer-extra-plugin: 3.2.3(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1))
623
+ rimraf: 3.0.2
624
+ optionalDependencies:
625
+ playwright-extra: 4.3.6(playwright-core@1.51.1)(playwright@1.51.1)
626
+ transitivePeerDependencies:
627
+ - supports-color
628
+
629
+ puppeteer-extra-plugin-user-preferences@2.4.1(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1)):
630
+ dependencies:
631
+ debug: 4.4.0
632
+ deepmerge: 4.3.1
633
+ puppeteer-extra-plugin: 3.2.3(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1))
634
+ puppeteer-extra-plugin-user-data-dir: 2.4.1(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1))
635
+ optionalDependencies:
636
+ playwright-extra: 4.3.6(playwright-core@1.51.1)(playwright@1.51.1)
637
+ transitivePeerDependencies:
638
+ - supports-color
639
+
640
+ puppeteer-extra-plugin@3.2.3(playwright-extra@4.3.6(playwright-core@1.51.1)(playwright@1.51.1)):
641
+ dependencies:
642
+ '@types/debug': 4.1.12
643
+ debug: 4.4.0
644
+ merge-deep: 3.0.3
645
+ optionalDependencies:
646
+ playwright-extra: 4.3.6(playwright-core@1.51.1)(playwright@1.51.1)
647
+ transitivePeerDependencies:
648
+ - supports-color
649
+
650
+ quick-format-unescaped@4.0.4: {}
651
+
652
+ real-require@0.2.0: {}
653
+
654
+ rimraf@3.0.2:
655
+ dependencies:
656
+ glob: 7.2.3
657
+
658
+ safe-stable-stringify@2.5.0: {}
659
+
660
+ secure-json-parse@2.7.0: {}
661
+
662
+ shallow-clone@0.1.2:
663
+ dependencies:
664
+ is-extendable: 0.1.1
665
+ kind-of: 2.0.1
666
+ lazy-cache: 0.2.7
667
+ mixin-object: 2.0.1
668
+
669
+ sonic-boom@4.2.0:
670
+ dependencies:
671
+ atomic-sleep: 1.0.0
672
+
673
+ split2@4.2.0: {}
674
+
675
+ strip-json-comments@3.1.1: {}
676
+
677
+ thread-stream@3.1.0:
678
+ dependencies:
679
+ real-require: 0.2.0
680
+
681
+ undici-types@6.20.0: {}
682
+
683
+ universalify@2.0.1: {}
684
+
685
+ wrappy@1.0.2: {}
screenshot.png DELETED
Binary file (65.8 kB)
 
screenshots/facf039b-8c09-4990-bae8-04194d222f10.png DELETED
Binary file (5.5 kB)
 
src/index.ts ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Elysia } from 'elysia';
2
+ import { chromium, Browser, BrowserContext, Page } from 'playwright';
3
+ import { randomUUID } from 'crypto';
4
+ import fs from 'fs/promises';
5
+ import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import { Worker } from 'worker_threads';
8
+ import { addStealth } from 'puppeteer-extra-plugin-stealth';
9
+
10
+ const __dirname: string = path.dirname(fileURLToPath(import.meta.url));
11
+ const app = new Elysia();
12
+ const PORT: number = 3000;
13
+ const MAX_IDLE_TIME: number = 600 * 1000; // 600s = 10 phút
14
+ const BROWSER_SESSIONS: Record<string, { browser: Browser; lastUsed: number }> = {};
15
+ const SCREENSHOT_DIR: string = path.join(__dirname, 'screenshots');
16
+ await fs.mkdir(SCREENSHOT_DIR, { recursive: true });
17
+
18
+ async function createBrowser(): Promise<Browser> {
19
+ return await chromium.launch({
20
+ headless: true,
21
+ args: [
22
+ '--no-sandbox',
23
+ '--disable-dev-shm-usage',
24
+ '--disable-blink-features=AutomationControlled',
25
+ '--disable-web-security',
26
+ '--disable-features=IsolateOrigins,site-per-process'
27
+ ]
28
+ });
29
+ }
30
+
31
+ async function getBrowser(userId: string): Promise<Browser> {
32
+ const now: number = Date.now();
33
+ if (!BROWSER_SESSIONS[userId] || now - BROWSER_SESSIONS[userId].lastUsed > MAX_IDLE_TIME) {
34
+ if (BROWSER_SESSIONS[userId]) {
35
+ await BROWSER_SESSIONS[userId].browser.close();
36
+ }
37
+ BROWSER_SESSIONS[userId] = {
38
+ browser: await createBrowser(),
39
+ lastUsed: now
40
+ };
41
+ }
42
+ BROWSER_SESSIONS[userId].lastUsed = now;
43
+ return BROWSER_SESSIONS[userId].browser;
44
+ }
45
+
46
+ app.get('/browse', async ({ query, set }) => {
47
+ const { url, user_id: userId, proxy }: { url?: string; user_id?: string; proxy?: string } = query;
48
+ if (!url || !userId) {
49
+ set.status = 400;
50
+ return { error: 'Missing parameters' };
51
+ }
52
+
53
+ try {
54
+ const browser: Browser = await getBrowser(userId);
55
+ const contextOptions: Record<string, any> = {};
56
+ if (proxy) {
57
+ contextOptions.proxy = { server: proxy };
58
+ }
59
+ const context: BrowserContext = await browser.newContext(contextOptions);
60
+ const page: Page = await context.newPage();
61
+
62
+ await addStealth(page); // Áp dụng stealth mode để tránh detection
63
+
64
+ await page.goto(url, { timeout: 30000, waitUntil: 'domcontentloaded' });
65
+ await page.waitForSelector('.qrcode', { timeout: 10000 });
66
+ await new Promise(resolve => setTimeout(resolve, 2000));
67
+
68
+ const screenshotPath: string = path.join(SCREENSHOT_DIR, `${randomUUID()}.png`);
69
+ await page.screenshot({ path: screenshotPath });
70
+ await context.close();
71
+
72
+ return new Response(await fs.readFile(screenshotPath), { headers: { 'Content-Type': 'image/png' } });
73
+ } catch (error) {
74
+ console.error('⚠ Error:', error);
75
+ set.status = 500;
76
+ return { error: 'Failed' };
77
+ }
78
+ });
79
+
80
+ // Chạy cleanupBrowsers trong worker thread
81
+ const worker = new Worker(path.join(__dirname, 'worker.js'));
82
+ worker.on('error', (err) => console.error('Worker Error:', err));
83
+ worker.on('exit', (code) => console.log(`Cleanup worker exited with code ${code}`));
84
+
85
+ app.listen(PORT, () => {
86
+ console.log(`🚀 Server running on http://localhost:${PORT}`);
87
+ });
start.sh ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ export SCREEN_WIDTH=1920
2
+ export SCREEN_HEIGHT=1080
3
+ export PROFILE_ID=yU0Pr0f1leiD
4
+ export TOKEN=yU0token
5
+ docker run -e SCREEN_WIDTH=$SCREEN_WIDTH -e SCREEN_HEIGHT=$SCREEN_HEIGHT -e PROFILE_ID=$PROFILE_ID -e TOKEN=$TOKEN --rm -ti -p 5901:5901 -p 3000:3000 --name orbita-browser orbita-docker:latest
tsconfig.json ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ /* Visit https://aka.ms/tsconfig to read more about this file */
4
+
5
+ /* Projects */
6
+ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
7
+ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
8
+ // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
9
+ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
10
+ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
11
+ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
12
+
13
+ /* Language and Environment */
14
+ "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
15
+ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
16
+ // "jsx": "preserve", /* Specify what JSX code is generated. */
17
+ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
18
+ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
19
+ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
20
+ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
21
+ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
22
+ // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
23
+ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
24
+ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
25
+ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
26
+
27
+ /* Modules */
28
+ "module": "ES2022", /* Specify what module code is generated. */
29
+ // "rootDir": "./", /* Specify the root folder within your source files. */
30
+ "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
31
+ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
32
+ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
33
+ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
34
+ // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
35
+ "types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */
36
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
37
+ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
38
+ // "resolveJsonModule": true, /* Enable importing .json files. */
39
+ // "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
40
+
41
+ /* JavaScript Support */
42
+ // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
43
+ // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
44
+ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
45
+
46
+ /* Emit */
47
+ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
48
+ // "declarationMap": true, /* Create sourcemaps for d.ts files. */
49
+ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
50
+ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
51
+ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
52
+ // "outDir": "./", /* Specify an output folder for all emitted files. */
53
+ // "removeComments": true, /* Disable emitting comments. */
54
+ // "noEmit": true, /* Disable emitting files from a compilation. */
55
+ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
56
+ // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
57
+ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
58
+ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
59
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
60
+ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
61
+ // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
62
+ // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
63
+ // "newLine": "crlf", /* Set the newline character for emitting files. */
64
+ // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
65
+ // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
66
+ // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
67
+ // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
68
+ // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
69
+ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
70
+
71
+ /* Interop Constraints */
72
+ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
73
+ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
74
+ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
75
+ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
76
+ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
77
+
78
+ /* Type Checking */
79
+ "strict": true, /* Enable all strict type-checking options. */
80
+ // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
81
+ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
82
+ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
83
+ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
84
+ // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
85
+ // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
86
+ // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
87
+ // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
88
+ // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
89
+ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
90
+ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
91
+ // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
92
+ // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
93
+ // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
94
+ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
95
+ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
96
+ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
97
+ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
98
+
99
+ /* Completeness */
100
+ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
101
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
102
+ }
103
+ }