viocha commited on
Commit
571c98a
·
1 Parent(s): 3aa06e5
Files changed (4) hide show
  1. .gitignore +132 -0
  2. app.js +36 -22
  3. package.json +1 -1
  4. pnpm-lock.yaml +588 -0
.gitignore ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Node template
2
+ # Logs
3
+ logs
4
+ *.log
5
+ npm-debug.log*
6
+ yarn-debug.log*
7
+ yarn-error.log*
8
+ lerna-debug.log*
9
+ .pnpm-debug.log*
10
+
11
+ # Diagnostic reports (https://nodejs.org/api/report.html)
12
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
13
+
14
+ # Runtime data
15
+ pids
16
+ *.pid
17
+ *.seed
18
+ *.pid.lock
19
+
20
+ # Directory for instrumented libs generated by jscoverage/JSCover
21
+ lib-cov
22
+
23
+ # Coverage directory used by tools like istanbul
24
+ coverage
25
+ *.lcov
26
+
27
+ # nyc test coverage
28
+ .nyc_output
29
+
30
+ # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
31
+ .grunt
32
+
33
+ # Bower dependency directory (https://bower.io/)
34
+ bower_components
35
+
36
+ # node-waf configuration
37
+ .lock-wscript
38
+
39
+ # Compiled binary addons (https://nodejs.org/api/addons.html)
40
+ build/Release
41
+
42
+ # Dependency directories
43
+ node_modules/
44
+ jspm_packages/
45
+
46
+ # Snowpack dependency directory (https://snowpack.dev/)
47
+ web_modules/
48
+
49
+ # TypeScript cache
50
+ *.tsbuildinfo
51
+
52
+ # Optional npm cache directory
53
+ .npm
54
+
55
+ # Optional eslint cache
56
+ .eslintcache
57
+
58
+ # Optional stylelint cache
59
+ .stylelintcache
60
+
61
+ # Microbundle cache
62
+ .rpt2_cache/
63
+ .rts2_cache_cjs/
64
+ .rts2_cache_es/
65
+ .rts2_cache_umd/
66
+
67
+ # Optional REPL history
68
+ .node_repl_history
69
+
70
+ # Output of 'npm pack'
71
+ *.tgz
72
+
73
+ # Yarn Integrity file
74
+ .yarn-integrity
75
+
76
+ # dotenv environment variable files
77
+ .env
78
+ .env.development.local
79
+ .env.test.local
80
+ .env.production.local
81
+ .env.local
82
+
83
+ # parcel-bundler cache (https://parceljs.org/)
84
+ .cache
85
+ .parcel-cache
86
+
87
+ # Next.js build output
88
+ .next
89
+ out
90
+
91
+ # Nuxt.js build / generate output
92
+ .nuxt
93
+ dist
94
+
95
+ # Gatsby files
96
+ .cache/
97
+ # Comment in the public line in if your project uses Gatsby and not Next.js
98
+ # https://nextjs.org/blog/next-9-1#public-directory-support
99
+ # public
100
+
101
+ # vuepress build output
102
+ .vuepress/dist
103
+
104
+ # vuepress v2.x temp and cache directory
105
+ .temp
106
+ .cache
107
+
108
+ # Docusaurus cache and generated files
109
+ .docusaurus
110
+
111
+ # Serverless directories
112
+ .serverless/
113
+
114
+ # FuseBox cache
115
+ .fusebox/
116
+
117
+ # DynamoDB Local files
118
+ .dynamodb/
119
+
120
+ # TernJS port file
121
+ .tern-port
122
+
123
+ # Stores VSCode versions used for testing VSCode extensions
124
+ .vscode-test
125
+
126
+ # yarn v2
127
+ .yarn/cache
128
+ .yarn/unplugged
129
+ .yarn/build-state.yml
130
+ .yarn/install-state.gz
131
+ .pnp.*
132
+
app.js CHANGED
@@ -4,13 +4,15 @@ import cors from 'cors';
4
  const app = express();
5
  const PORT = process.env.PORT || 7860;
6
 
7
- // --- CORS 详细配置 (最终正确版本) ---
 
8
 
 
 
9
  const corsOptions = {
10
  origin: '*',
11
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
12
  allowedHeaders: ['Content-Type', 'Authorization'],
13
- // 只需暴露非 CORS 安全列表中的自定义头
14
  exposedHeaders: ['X-Custom-Header-Test'],
15
  credentials: false,
16
  maxAge: 86400,
@@ -32,21 +34,8 @@ app.get('/api', (req, res) => {
32
  });
33
  });
34
 
 
35
  app.get('/', (req, res) => {
36
- const origin = `${req.protocol}://${req.get('host')}`;
37
- // 在 fetch 代码中可以同时获取 Content-Length 和 X-Custom-Header-Test
38
- const fetchCode = `fetch('${origin}/api')
39
- .then(response => {
40
- console.log('Status:', response.status);
41
- // 'Content-Length' 是安全头,默认可访问
42
- console.log('Content-Length:', response.headers.get('Content-Length'));
43
- // 'X-Custom-Header-Test' 是非安全头,因已暴露,所以也可访问
44
- console.log('Custom Header "X-Custom-Header-Test":', response.headers.get('X-Custom-Header-Test'));
45
- return response.json();
46
- })
47
- .then(data => console.log('Data:', data))
48
- .catch(error => console.error('Error:', error));`;
49
-
50
  res.send(`
51
  <!DOCTYPE html>
52
  <html lang="en">
@@ -59,7 +48,7 @@ app.get('/', (req, res) => {
59
  .container { max-width: 800px; margin: auto; background: white; padding: 2em; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.05); }
60
  h1 { color: #1f2937; }
61
  p { font-size: 1.1em; }
62
- pre { background-color: #f3f4f6; padding: 1.5em; border-radius: 8px; white-space: pre-wrap; word-wrap: break-word; }
63
  code { font-family: "Courier New", Courier, monospace; font-size: 1.1em; }
64
  .copy-notice { font-size: 0.9em; color: #6b7280; margin-top: 1em; text-align: center; }
65
  </style>
@@ -67,13 +56,38 @@ app.get('/', (req, res) => {
67
  <body>
68
  <div class="container">
69
  <h1>Express.js 应用已部署</h1>
70
- <p>CORS 策略已正确配置。请复制以下代码到浏览器开发者工具中进行测试,它将同时读取一个安全头 (Content-Length) 和一个已暴露的自定义头 (X-Custom-Header-Test)。</p>
71
- <pre><code id="fetch-code">${fetchCode}</code></pre>
72
  <p class="copy-notice">点击上面的代码块即可复制。</p>
73
  </div>
 
74
  <script>
75
- document.getElementById('fetch-code').parentElement.addEventListener('click', function() {
76
- navigator.clipboard.writeText(document.getElementById('fetch-code').innerText).then(() => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  alert('代码已复制到剪贴板!');
78
  }).catch(err => {
79
  console.error('无法复制: ', err);
@@ -86,5 +100,5 @@ app.get('/', (req, res) => {
86
  });
87
 
88
  app.listen(PORT, () => {
89
- console.log(`Server is running on port ${PORT}`);
90
  });
 
4
  const app = express();
5
  const PORT = process.env.PORT || 7860;
6
 
7
+ // 'trust proxy' 在这个方案中不再是必需的,但保留它对于部署在反向代理后的应用仍是良好实践。
8
+ app.set('trust proxy', 1);
9
 
10
+ // --- CORS 配置 ---
11
+ // 保持之前的健壮配置
12
  const corsOptions = {
13
  origin: '*',
14
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
15
  allowedHeaders: ['Content-Type', 'Authorization'],
 
16
  exposedHeaders: ['X-Custom-Header-Test'],
17
  credentials: false,
18
  maxAge: 86400,
 
34
  });
35
  });
36
 
37
+ // 根路由,返回一个静态 HTML 骨架,由客户端 JS 填充内容
38
  app.get('/', (req, res) => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  res.send(`
40
  <!DOCTYPE html>
41
  <html lang="en">
 
48
  .container { max-width: 800px; margin: auto; background: white; padding: 2em; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.05); }
49
  h1 { color: #1f2937; }
50
  p { font-size: 1.1em; }
51
+ pre { background-color: #f3f4f6; padding: 1.5em; border-radius: 8px; white-space: pre-wrap; word-wrap: break-word; min-height: 150px; }
52
  code { font-family: "Courier New", Courier, monospace; font-size: 1.1em; }
53
  .copy-notice { font-size: 0.9em; color: #6b7280; margin-top: 1em; text-align: center; }
54
  </style>
 
56
  <body>
57
  <div class="container">
58
  <h1>Express.js 应用已部署</h1>
59
+ <p>请复制以下由浏览器动态生成的 <code>fetch</code> 代码到开发者工具中进行测试:</p>
60
+ <pre><code id="fetch-code"><!-- 代码将由 JS 动态填充于此 --></code></pre>
61
  <p class="copy-notice">点击上面的代码块即可复制。</p>
62
  </div>
63
+
64
  <script>
65
+ // 在页面加载完成后执行
66
+ document.addEventListener('DOMContentLoaded', () => {
67
+ const codeElement = document.getElementById('fetch-code');
68
+
69
+ // 1. 由客户端 JS 直接、准确地获取 origin
70
+ const origin = window.location.origin;
71
+
72
+ // 2. 在客户端构建代码字符串
73
+ const fetchCode = \`fetch('\${origin}/api')
74
+ .then(response => {
75
+ console.log('Status:', response.status);
76
+ console.log('Content-Length:', response.headers.get('Content-Length'));
77
+ console.log('Custom Header "X-Custom-Header-Test":', response.headers.get('X-Custom-Header-Test'));
78
+ return response.json();
79
+ })
80
+ .then(data => console.log('Data:', data))
81
+ .catch(error => console.error('Error:', error));\`;
82
+
83
+ // 3. 将生成的代码注入到 HTML 中
84
+ codeElement.textContent = fetchCode;
85
+ });
86
+
87
+ // 复制功能保持不变
88
+ document.querySelector('pre').addEventListener('click', function() {
89
+ const codeToCopy = document.getElementById('fetch-code').innerText;
90
+ navigator.clipboard.writeText(codeToCopy).then(() => {
91
  alert('代码已复制到剪贴板!');
92
  }).catch(err => {
93
  console.error('无法复制: ', err);
 
100
  });
101
 
102
  app.listen(PORT, () => {
103
+ console.log(`Server is running at http://localhost:${PORT}`)
104
  });
package.json CHANGED
@@ -9,6 +9,6 @@
9
  },
10
  "dependencies": {
11
  "cors": "^2.8.5",
12
- "express": "^4.18.2"
13
  }
14
  }
 
9
  },
10
  "dependencies": {
11
  "cors": "^2.8.5",
12
+ "express": "^5.1.0"
13
  }
14
  }
pnpm-lock.yaml ADDED
@@ -0,0 +1,588 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ lockfileVersion: '9.0'
2
+
3
+ settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+ importers:
8
+
9
+ .:
10
+ dependencies:
11
+ cors:
12
+ specifier: ^2.8.5
13
+ version: 2.8.5
14
+ express:
15
+ specifier: ^5.1.0
16
+ version: 5.1.0
17
+
18
+ packages:
19
+
20
21
+ resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
22
+ engines: {node: '>= 0.6'}
23
+
24
25
+ resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
26
+ engines: {node: '>=18'}
27
+
28
29
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
30
+ engines: {node: '>= 0.8'}
31
+
32
33
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
34
+ engines: {node: '>= 0.4'}
35
+
36
37
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
38
+ engines: {node: '>= 0.4'}
39
+
40
41
+ resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
42
+ engines: {node: '>= 0.6'}
43
+
44
45
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
46
+ engines: {node: '>= 0.6'}
47
+
48
49
+ resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
50
+ engines: {node: '>=6.6.0'}
51
+
52
53
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
54
+ engines: {node: '>= 0.6'}
55
+
56
57
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
58
+ engines: {node: '>= 0.10'}
59
+
60
61
+ resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
62
+ engines: {node: '>=6.0'}
63
+ peerDependencies:
64
+ supports-color: '*'
65
+ peerDependenciesMeta:
66
+ supports-color:
67
+ optional: true
68
+
69
70
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
71
+ engines: {node: '>= 0.8'}
72
+
73
74
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
75
+ engines: {node: '>= 0.4'}
76
+
77
78
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
79
+
80
81
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
82
+ engines: {node: '>= 0.8'}
83
+
84
85
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
86
+ engines: {node: '>= 0.4'}
87
+
88
89
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
90
+ engines: {node: '>= 0.4'}
91
+
92
93
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
94
+ engines: {node: '>= 0.4'}
95
+
96
97
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
98
+
99
100
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
101
+ engines: {node: '>= 0.6'}
102
+
103
104
+ resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
105
+ engines: {node: '>= 18'}
106
+
107
108
+ resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
109
+ engines: {node: '>= 0.8'}
110
+
111
112
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
113
+ engines: {node: '>= 0.6'}
114
+
115
116
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
117
+ engines: {node: '>= 0.8'}
118
+
119
120
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
121
+
122
123
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
124
+ engines: {node: '>= 0.4'}
125
+
126
127
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
128
+ engines: {node: '>= 0.4'}
129
+
130
131
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
132
+ engines: {node: '>= 0.4'}
133
+
134
135
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
136
+ engines: {node: '>= 0.4'}
137
+
138
139
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
140
+ engines: {node: '>= 0.4'}
141
+
142
143
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
144
+ engines: {node: '>= 0.8'}
145
+
146
147
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
148
+ engines: {node: '>=0.10.0'}
149
+
150
151
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
152
+
153
154
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
155
+ engines: {node: '>= 0.10'}
156
+
157
158
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
159
+
160
161
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
162
+ engines: {node: '>= 0.4'}
163
+
164
165
+ resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
166
+ engines: {node: '>= 0.8'}
167
+
168
169
+ resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
170
+ engines: {node: '>=18'}
171
+
172
173
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
174
+ engines: {node: '>= 0.6'}
175
+
176
177
+ resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
178
+ engines: {node: '>= 0.6'}
179
+
180
181
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
182
+
183
184
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
185
+ engines: {node: '>= 0.6'}
186
+
187
188
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
189
+ engines: {node: '>=0.10.0'}
190
+
191
192
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
193
+ engines: {node: '>= 0.4'}
194
+
195
196
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
197
+ engines: {node: '>= 0.8'}
198
+
199
200
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
201
+
202
203
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
204
+ engines: {node: '>= 0.8'}
205
+
206
207
+ resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
208
+ engines: {node: '>=16'}
209
+
210
211
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
212
+ engines: {node: '>= 0.10'}
213
+
214
215
+ resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
216
+ engines: {node: '>=0.6'}
217
+
218
219
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
220
+ engines: {node: '>= 0.6'}
221
+
222
223
+ resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
224
+ engines: {node: '>= 0.8'}
225
+
226
227
+ resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
228
+ engines: {node: '>= 18'}
229
+
230
231
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
232
+
233
234
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
235
+
236
237
+ resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
238
+ engines: {node: '>= 18'}
239
+
240
241
+ resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
242
+ engines: {node: '>= 18'}
243
+
244
245
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
246
+
247
248
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
249
+ engines: {node: '>= 0.4'}
250
+
251
252
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
253
+ engines: {node: '>= 0.4'}
254
+
255
256
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
257
+ engines: {node: '>= 0.4'}
258
+
259
260
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
261
+ engines: {node: '>= 0.4'}
262
+
263
264
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
265
+ engines: {node: '>= 0.8'}
266
+
267
268
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
269
+ engines: {node: '>=0.6'}
270
+
271
272
+ resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
273
+ engines: {node: '>= 0.6'}
274
+
275
276
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
277
+ engines: {node: '>= 0.8'}
278
+
279
280
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
281
+ engines: {node: '>= 0.8'}
282
+
283
284
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
285
+
286
+ snapshots:
287
+
288
289
+ dependencies:
290
+ mime-types: 3.0.1
291
+ negotiator: 1.0.0
292
+
293
294
+ dependencies:
295
+ bytes: 3.1.2
296
+ content-type: 1.0.5
297
+ debug: 4.4.1
298
+ http-errors: 2.0.0
299
+ iconv-lite: 0.6.3
300
+ on-finished: 2.4.1
301
+ qs: 6.14.0
302
+ raw-body: 3.0.0
303
+ type-is: 2.0.1
304
+ transitivePeerDependencies:
305
+ - supports-color
306
+
307
308
+
309
310
+ dependencies:
311
+ es-errors: 1.3.0
312
+ function-bind: 1.1.2
313
+
314
315
+ dependencies:
316
+ call-bind-apply-helpers: 1.0.2
317
+ get-intrinsic: 1.3.0
318
+
319
320
+ dependencies:
321
+ safe-buffer: 5.2.1
322
+
323
324
+
325
326
+
327
328
+
329
330
+ dependencies:
331
+ object-assign: 4.1.1
332
+ vary: 1.1.2
333
+
334
335
+ dependencies:
336
+ ms: 2.1.3
337
+
338
339
+
340
341
+ dependencies:
342
+ call-bind-apply-helpers: 1.0.2
343
+ es-errors: 1.3.0
344
+ gopd: 1.2.0
345
+
346
347
+
348
349
+
350
351
+
352
353
+
354
355
+ dependencies:
356
+ es-errors: 1.3.0
357
+
358
359
+
360
361
+
362
363
+ dependencies:
364
+ accepts: 2.0.0
365
+ body-parser: 2.2.0
366
+ content-disposition: 1.0.0
367
+ content-type: 1.0.5
368
+ cookie: 0.7.1
369
+ cookie-signature: 1.2.2
370
+ debug: 4.4.1
371
+ encodeurl: 2.0.0
372
+ escape-html: 1.0.3
373
+ etag: 1.8.1
374
+ finalhandler: 2.1.0
375
+ fresh: 2.0.0
376
+ http-errors: 2.0.0
377
+ merge-descriptors: 2.0.0
378
+ mime-types: 3.0.1
379
+ on-finished: 2.4.1
380
+ once: 1.4.0
381
+ parseurl: 1.3.3
382
+ proxy-addr: 2.0.7
383
+ qs: 6.14.0
384
+ range-parser: 1.2.1
385
+ router: 2.2.0
386
+ send: 1.2.0
387
+ serve-static: 2.2.0
388
+ statuses: 2.0.1
389
+ type-is: 2.0.1
390
+ vary: 1.1.2
391
+ transitivePeerDependencies:
392
+ - supports-color
393
+
394
395
+ dependencies:
396
+ debug: 4.4.1
397
+ encodeurl: 2.0.0
398
+ escape-html: 1.0.3
399
+ on-finished: 2.4.1
400
+ parseurl: 1.3.3
401
+ statuses: 2.0.1
402
+ transitivePeerDependencies:
403
+ - supports-color
404
+
405
406
+
407
408
+
409
410
+
411
412
+ dependencies:
413
+ call-bind-apply-helpers: 1.0.2
414
+ es-define-property: 1.0.1
415
+ es-errors: 1.3.0
416
+ es-object-atoms: 1.1.1
417
+ function-bind: 1.1.2
418
+ get-proto: 1.0.1
419
+ gopd: 1.2.0
420
+ has-symbols: 1.1.0
421
+ hasown: 2.0.2
422
+ math-intrinsics: 1.1.0
423
+
424
425
+ dependencies:
426
+ dunder-proto: 1.0.1
427
+ es-object-atoms: 1.1.1
428
+
429
430
+
431
432
+
433
434
+ dependencies:
435
+ function-bind: 1.1.2
436
+
437
438
+ dependencies:
439
+ depd: 2.0.0
440
+ inherits: 2.0.4
441
+ setprototypeof: 1.2.0
442
+ statuses: 2.0.1
443
+ toidentifier: 1.0.1
444
+
445
446
+ dependencies:
447
+ safer-buffer: 2.1.2
448
+
449
450
+
451
452
+
453
454
+
455
456
+
457
458
+
459
460
+
461
462
+
463
464
+ dependencies:
465
+ mime-db: 1.54.0
466
+
467
468
+
469
470
+
471
472
+
473
474
+
475
476
+ dependencies:
477
+ ee-first: 1.1.1
478
+
479
480
+ dependencies:
481
+ wrappy: 1.0.2
482
+
483
484
+
485
486
+
487
488
+ dependencies:
489
+ forwarded: 0.2.0
490
+ ipaddr.js: 1.9.1
491
+
492
493
+ dependencies:
494
+ side-channel: 1.1.0
495
+
496
497
+
498
499
+ dependencies:
500
+ bytes: 3.1.2
501
+ http-errors: 2.0.0
502
+ iconv-lite: 0.6.3
503
+ unpipe: 1.0.0
504
+
505
506
+ dependencies:
507
+ debug: 4.4.1
508
+ depd: 2.0.0
509
+ is-promise: 4.0.0
510
+ parseurl: 1.3.3
511
+ path-to-regexp: 8.2.0
512
+ transitivePeerDependencies:
513
+ - supports-color
514
+
515
516
+
517
518
+
519
520
+ dependencies:
521
+ debug: 4.4.1
522
+ encodeurl: 2.0.0
523
+ escape-html: 1.0.3
524
+ etag: 1.8.1
525
+ fresh: 2.0.0
526
+ http-errors: 2.0.0
527
+ mime-types: 3.0.1
528
+ ms: 2.1.3
529
+ on-finished: 2.4.1
530
+ range-parser: 1.2.1
531
+ statuses: 2.0.1
532
+ transitivePeerDependencies:
533
+ - supports-color
534
+
535
536
+ dependencies:
537
+ encodeurl: 2.0.0
538
+ escape-html: 1.0.3
539
+ parseurl: 1.3.3
540
+ send: 1.2.0
541
+ transitivePeerDependencies:
542
+ - supports-color
543
+
544
545
+
546
547
+ dependencies:
548
+ es-errors: 1.3.0
549
+ object-inspect: 1.13.4
550
+
551
552
+ dependencies:
553
+ call-bound: 1.0.4
554
+ es-errors: 1.3.0
555
+ get-intrinsic: 1.3.0
556
+ object-inspect: 1.13.4
557
+
558
559
+ dependencies:
560
+ call-bound: 1.0.4
561
+ es-errors: 1.3.0
562
+ get-intrinsic: 1.3.0
563
+ object-inspect: 1.13.4
564
+ side-channel-map: 1.0.1
565
+
566
567
+ dependencies:
568
+ es-errors: 1.3.0
569
+ object-inspect: 1.13.4
570
+ side-channel-list: 1.0.0
571
+ side-channel-map: 1.0.1
572
+ side-channel-weakmap: 1.0.2
573
+
574
575
+
576
577
+
578
579
+ dependencies:
580
+ content-type: 1.0.5
581
+ media-typer: 1.1.0
582
+ mime-types: 3.0.1
583
+
584
585
+
586
587
+
588