yaGeey commited on
Commit
e03fdb8
·
0 Parent(s):
Files changed (6) hide show
  1. .dockerignore +3 -0
  2. .gitignore +3 -0
  3. Dockerfile +7 -0
  4. index.js +81 -0
  5. package-lock.json +885 -0
  6. package.json +18 -0
.dockerignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ node_modules
2
+ .git
3
+ .env
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ node_modules
2
+ .git
3
+ .env
Dockerfile ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ FROM mcr.microsoft.com/playwright:v1.50.0-noble
2
+ WORKDIR /app
3
+ COPY package*.json ./
4
+ RUN npm install
5
+ COPY . .
6
+ EXPOSE 3000
7
+ CMD ["node", "index.js"]
index.js ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express from 'express'
2
+ import { chromium } from 'playwright'
3
+ import 'dotenv/config'
4
+ const app = express()
5
+ const PORT = process.env.PORT || 3000
6
+
7
+ let tokenObj = null
8
+
9
+ app.get('/', (req, res) => {
10
+ res.send('alive')
11
+ })
12
+
13
+ app.get('/token', async (req, res) => {
14
+ if (req.headers['authorization'] !== process.env.API_SECRET) {
15
+ return res.status(403).json({ error: 'Wrong Secret Key' })
16
+ }
17
+
18
+ if (tokenObj && tokenObj.accessTokenExpirationTimestampMs > Date.now()) {
19
+ console.log('Returning cached token')
20
+ return res.json(tokenObj)
21
+ }
22
+
23
+ let browser = null
24
+ try {
25
+ browser = await chromium.launch({
26
+ headless: true,
27
+ args: ['--disable-dev-shm-usage'],
28
+ })
29
+
30
+ const context = await browser.newContext()
31
+
32
+ await context.addCookies([
33
+ {
34
+ name: 'sp_dc',
35
+ value: process.env.SP_DC,
36
+ domain: '.spotify.com',
37
+ path: '/',
38
+ httpOnly: true,
39
+ secure: true,
40
+ sameSite: 'None',
41
+ },
42
+ {
43
+ name: 'sp_key',
44
+ value: process.env.SP_KEY,
45
+ domain: '.spotify.com',
46
+ path: '/',
47
+ httpOnly: false,
48
+ secure: true,
49
+ sameSite: 'None',
50
+ },
51
+ ])
52
+
53
+ const page = await context.newPage()
54
+
55
+ const [tokenResponse] = await Promise.all([
56
+ page.waitForResponse(async (response) => {
57
+ const url = response.url()
58
+ if (url.includes('token') && response.status() === 200) {
59
+ const json = await response.json().catch(() => null)
60
+ return json && json.accessToken
61
+ }
62
+ return false
63
+ }),
64
+ page.goto('https://open.spotify.com/', { waitUntil: 'domcontentloaded' }),
65
+ ])
66
+ const data = await tokenResponse.json()
67
+
68
+ console.log('Token obtained successfully')
69
+ tokenObj = data
70
+ res.json(data)
71
+ } catch (error) {
72
+ console.error('Error:', error.message)
73
+ res.status(500).json({ error: 'Failed to get token', details: error.message })
74
+ } finally {
75
+ if (browser) await browser.close()
76
+ }
77
+ })
78
+
79
+ app.listen(PORT, () => {
80
+ console.log(`Server running on port ${PORT}`)
81
+ })
package-lock.json ADDED
@@ -0,0 +1,885 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "spotify-token-server",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "spotify-token-server",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "dotenv": "^17.2.4",
13
+ "express": "^5.2.1",
14
+ "playwright": "^1.58.2"
15
+ }
16
+ },
17
+ "node_modules/accepts": {
18
+ "version": "2.0.0",
19
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
20
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
21
+ "license": "MIT",
22
+ "dependencies": {
23
+ "mime-types": "^3.0.0",
24
+ "negotiator": "^1.0.0"
25
+ },
26
+ "engines": {
27
+ "node": ">= 0.6"
28
+ }
29
+ },
30
+ "node_modules/body-parser": {
31
+ "version": "2.2.2",
32
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
33
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "bytes": "^3.1.2",
37
+ "content-type": "^1.0.5",
38
+ "debug": "^4.4.3",
39
+ "http-errors": "^2.0.0",
40
+ "iconv-lite": "^0.7.0",
41
+ "on-finished": "^2.4.1",
42
+ "qs": "^6.14.1",
43
+ "raw-body": "^3.0.1",
44
+ "type-is": "^2.0.1"
45
+ },
46
+ "engines": {
47
+ "node": ">=18"
48
+ },
49
+ "funding": {
50
+ "type": "opencollective",
51
+ "url": "https://opencollective.com/express"
52
+ }
53
+ },
54
+ "node_modules/bytes": {
55
+ "version": "3.1.2",
56
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
57
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
58
+ "license": "MIT",
59
+ "engines": {
60
+ "node": ">= 0.8"
61
+ }
62
+ },
63
+ "node_modules/call-bind-apply-helpers": {
64
+ "version": "1.0.2",
65
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
66
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
67
+ "license": "MIT",
68
+ "dependencies": {
69
+ "es-errors": "^1.3.0",
70
+ "function-bind": "^1.1.2"
71
+ },
72
+ "engines": {
73
+ "node": ">= 0.4"
74
+ }
75
+ },
76
+ "node_modules/call-bound": {
77
+ "version": "1.0.4",
78
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
79
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
80
+ "license": "MIT",
81
+ "dependencies": {
82
+ "call-bind-apply-helpers": "^1.0.2",
83
+ "get-intrinsic": "^1.3.0"
84
+ },
85
+ "engines": {
86
+ "node": ">= 0.4"
87
+ },
88
+ "funding": {
89
+ "url": "https://github.com/sponsors/ljharb"
90
+ }
91
+ },
92
+ "node_modules/content-disposition": {
93
+ "version": "1.0.1",
94
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
95
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
96
+ "license": "MIT",
97
+ "engines": {
98
+ "node": ">=18"
99
+ },
100
+ "funding": {
101
+ "type": "opencollective",
102
+ "url": "https://opencollective.com/express"
103
+ }
104
+ },
105
+ "node_modules/content-type": {
106
+ "version": "1.0.5",
107
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
108
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
109
+ "license": "MIT",
110
+ "engines": {
111
+ "node": ">= 0.6"
112
+ }
113
+ },
114
+ "node_modules/cookie": {
115
+ "version": "0.7.2",
116
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
117
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
118
+ "license": "MIT",
119
+ "engines": {
120
+ "node": ">= 0.6"
121
+ }
122
+ },
123
+ "node_modules/cookie-signature": {
124
+ "version": "1.2.2",
125
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
126
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
127
+ "license": "MIT",
128
+ "engines": {
129
+ "node": ">=6.6.0"
130
+ }
131
+ },
132
+ "node_modules/debug": {
133
+ "version": "4.4.3",
134
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
135
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
136
+ "license": "MIT",
137
+ "dependencies": {
138
+ "ms": "^2.1.3"
139
+ },
140
+ "engines": {
141
+ "node": ">=6.0"
142
+ },
143
+ "peerDependenciesMeta": {
144
+ "supports-color": {
145
+ "optional": true
146
+ }
147
+ }
148
+ },
149
+ "node_modules/depd": {
150
+ "version": "2.0.0",
151
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
152
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
153
+ "license": "MIT",
154
+ "engines": {
155
+ "node": ">= 0.8"
156
+ }
157
+ },
158
+ "node_modules/dotenv": {
159
+ "version": "17.2.4",
160
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz",
161
+ "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==",
162
+ "license": "BSD-2-Clause",
163
+ "engines": {
164
+ "node": ">=12"
165
+ },
166
+ "funding": {
167
+ "url": "https://dotenvx.com"
168
+ }
169
+ },
170
+ "node_modules/dunder-proto": {
171
+ "version": "1.0.1",
172
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
173
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
174
+ "license": "MIT",
175
+ "dependencies": {
176
+ "call-bind-apply-helpers": "^1.0.1",
177
+ "es-errors": "^1.3.0",
178
+ "gopd": "^1.2.0"
179
+ },
180
+ "engines": {
181
+ "node": ">= 0.4"
182
+ }
183
+ },
184
+ "node_modules/ee-first": {
185
+ "version": "1.1.1",
186
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
187
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
188
+ "license": "MIT"
189
+ },
190
+ "node_modules/encodeurl": {
191
+ "version": "2.0.0",
192
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
193
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
194
+ "license": "MIT",
195
+ "engines": {
196
+ "node": ">= 0.8"
197
+ }
198
+ },
199
+ "node_modules/es-define-property": {
200
+ "version": "1.0.1",
201
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
202
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
203
+ "license": "MIT",
204
+ "engines": {
205
+ "node": ">= 0.4"
206
+ }
207
+ },
208
+ "node_modules/es-errors": {
209
+ "version": "1.3.0",
210
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
211
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
212
+ "license": "MIT",
213
+ "engines": {
214
+ "node": ">= 0.4"
215
+ }
216
+ },
217
+ "node_modules/es-object-atoms": {
218
+ "version": "1.1.1",
219
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
220
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
221
+ "license": "MIT",
222
+ "dependencies": {
223
+ "es-errors": "^1.3.0"
224
+ },
225
+ "engines": {
226
+ "node": ">= 0.4"
227
+ }
228
+ },
229
+ "node_modules/escape-html": {
230
+ "version": "1.0.3",
231
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
232
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
233
+ "license": "MIT"
234
+ },
235
+ "node_modules/etag": {
236
+ "version": "1.8.1",
237
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
238
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
239
+ "license": "MIT",
240
+ "engines": {
241
+ "node": ">= 0.6"
242
+ }
243
+ },
244
+ "node_modules/express": {
245
+ "version": "5.2.1",
246
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
247
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
248
+ "license": "MIT",
249
+ "dependencies": {
250
+ "accepts": "^2.0.0",
251
+ "body-parser": "^2.2.1",
252
+ "content-disposition": "^1.0.0",
253
+ "content-type": "^1.0.5",
254
+ "cookie": "^0.7.1",
255
+ "cookie-signature": "^1.2.1",
256
+ "debug": "^4.4.0",
257
+ "depd": "^2.0.0",
258
+ "encodeurl": "^2.0.0",
259
+ "escape-html": "^1.0.3",
260
+ "etag": "^1.8.1",
261
+ "finalhandler": "^2.1.0",
262
+ "fresh": "^2.0.0",
263
+ "http-errors": "^2.0.0",
264
+ "merge-descriptors": "^2.0.0",
265
+ "mime-types": "^3.0.0",
266
+ "on-finished": "^2.4.1",
267
+ "once": "^1.4.0",
268
+ "parseurl": "^1.3.3",
269
+ "proxy-addr": "^2.0.7",
270
+ "qs": "^6.14.0",
271
+ "range-parser": "^1.2.1",
272
+ "router": "^2.2.0",
273
+ "send": "^1.1.0",
274
+ "serve-static": "^2.2.0",
275
+ "statuses": "^2.0.1",
276
+ "type-is": "^2.0.1",
277
+ "vary": "^1.1.2"
278
+ },
279
+ "engines": {
280
+ "node": ">= 18"
281
+ },
282
+ "funding": {
283
+ "type": "opencollective",
284
+ "url": "https://opencollective.com/express"
285
+ }
286
+ },
287
+ "node_modules/finalhandler": {
288
+ "version": "2.1.1",
289
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
290
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
291
+ "license": "MIT",
292
+ "dependencies": {
293
+ "debug": "^4.4.0",
294
+ "encodeurl": "^2.0.0",
295
+ "escape-html": "^1.0.3",
296
+ "on-finished": "^2.4.1",
297
+ "parseurl": "^1.3.3",
298
+ "statuses": "^2.0.1"
299
+ },
300
+ "engines": {
301
+ "node": ">= 18.0.0"
302
+ },
303
+ "funding": {
304
+ "type": "opencollective",
305
+ "url": "https://opencollective.com/express"
306
+ }
307
+ },
308
+ "node_modules/forwarded": {
309
+ "version": "0.2.0",
310
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
311
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
312
+ "license": "MIT",
313
+ "engines": {
314
+ "node": ">= 0.6"
315
+ }
316
+ },
317
+ "node_modules/fresh": {
318
+ "version": "2.0.0",
319
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
320
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
321
+ "license": "MIT",
322
+ "engines": {
323
+ "node": ">= 0.8"
324
+ }
325
+ },
326
+ "node_modules/fsevents": {
327
+ "version": "2.3.2",
328
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
329
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
330
+ "hasInstallScript": true,
331
+ "license": "MIT",
332
+ "optional": true,
333
+ "os": [
334
+ "darwin"
335
+ ],
336
+ "engines": {
337
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
338
+ }
339
+ },
340
+ "node_modules/function-bind": {
341
+ "version": "1.1.2",
342
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
343
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
344
+ "license": "MIT",
345
+ "funding": {
346
+ "url": "https://github.com/sponsors/ljharb"
347
+ }
348
+ },
349
+ "node_modules/get-intrinsic": {
350
+ "version": "1.3.0",
351
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
352
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
353
+ "license": "MIT",
354
+ "dependencies": {
355
+ "call-bind-apply-helpers": "^1.0.2",
356
+ "es-define-property": "^1.0.1",
357
+ "es-errors": "^1.3.0",
358
+ "es-object-atoms": "^1.1.1",
359
+ "function-bind": "^1.1.2",
360
+ "get-proto": "^1.0.1",
361
+ "gopd": "^1.2.0",
362
+ "has-symbols": "^1.1.0",
363
+ "hasown": "^2.0.2",
364
+ "math-intrinsics": "^1.1.0"
365
+ },
366
+ "engines": {
367
+ "node": ">= 0.4"
368
+ },
369
+ "funding": {
370
+ "url": "https://github.com/sponsors/ljharb"
371
+ }
372
+ },
373
+ "node_modules/get-proto": {
374
+ "version": "1.0.1",
375
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
376
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
377
+ "license": "MIT",
378
+ "dependencies": {
379
+ "dunder-proto": "^1.0.1",
380
+ "es-object-atoms": "^1.0.0"
381
+ },
382
+ "engines": {
383
+ "node": ">= 0.4"
384
+ }
385
+ },
386
+ "node_modules/gopd": {
387
+ "version": "1.2.0",
388
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
389
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
390
+ "license": "MIT",
391
+ "engines": {
392
+ "node": ">= 0.4"
393
+ },
394
+ "funding": {
395
+ "url": "https://github.com/sponsors/ljharb"
396
+ }
397
+ },
398
+ "node_modules/has-symbols": {
399
+ "version": "1.1.0",
400
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
401
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
402
+ "license": "MIT",
403
+ "engines": {
404
+ "node": ">= 0.4"
405
+ },
406
+ "funding": {
407
+ "url": "https://github.com/sponsors/ljharb"
408
+ }
409
+ },
410
+ "node_modules/hasown": {
411
+ "version": "2.0.2",
412
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
413
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
414
+ "license": "MIT",
415
+ "dependencies": {
416
+ "function-bind": "^1.1.2"
417
+ },
418
+ "engines": {
419
+ "node": ">= 0.4"
420
+ }
421
+ },
422
+ "node_modules/http-errors": {
423
+ "version": "2.0.1",
424
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
425
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
426
+ "license": "MIT",
427
+ "dependencies": {
428
+ "depd": "~2.0.0",
429
+ "inherits": "~2.0.4",
430
+ "setprototypeof": "~1.2.0",
431
+ "statuses": "~2.0.2",
432
+ "toidentifier": "~1.0.1"
433
+ },
434
+ "engines": {
435
+ "node": ">= 0.8"
436
+ },
437
+ "funding": {
438
+ "type": "opencollective",
439
+ "url": "https://opencollective.com/express"
440
+ }
441
+ },
442
+ "node_modules/iconv-lite": {
443
+ "version": "0.7.2",
444
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
445
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
446
+ "license": "MIT",
447
+ "dependencies": {
448
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
449
+ },
450
+ "engines": {
451
+ "node": ">=0.10.0"
452
+ },
453
+ "funding": {
454
+ "type": "opencollective",
455
+ "url": "https://opencollective.com/express"
456
+ }
457
+ },
458
+ "node_modules/inherits": {
459
+ "version": "2.0.4",
460
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
461
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
462
+ "license": "ISC"
463
+ },
464
+ "node_modules/ipaddr.js": {
465
+ "version": "1.9.1",
466
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
467
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
468
+ "license": "MIT",
469
+ "engines": {
470
+ "node": ">= 0.10"
471
+ }
472
+ },
473
+ "node_modules/is-promise": {
474
+ "version": "4.0.0",
475
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
476
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
477
+ "license": "MIT"
478
+ },
479
+ "node_modules/math-intrinsics": {
480
+ "version": "1.1.0",
481
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
482
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
483
+ "license": "MIT",
484
+ "engines": {
485
+ "node": ">= 0.4"
486
+ }
487
+ },
488
+ "node_modules/media-typer": {
489
+ "version": "1.1.0",
490
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
491
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
492
+ "license": "MIT",
493
+ "engines": {
494
+ "node": ">= 0.8"
495
+ }
496
+ },
497
+ "node_modules/merge-descriptors": {
498
+ "version": "2.0.0",
499
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
500
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
501
+ "license": "MIT",
502
+ "engines": {
503
+ "node": ">=18"
504
+ },
505
+ "funding": {
506
+ "url": "https://github.com/sponsors/sindresorhus"
507
+ }
508
+ },
509
+ "node_modules/mime-db": {
510
+ "version": "1.54.0",
511
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
512
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
513
+ "license": "MIT",
514
+ "engines": {
515
+ "node": ">= 0.6"
516
+ }
517
+ },
518
+ "node_modules/mime-types": {
519
+ "version": "3.0.2",
520
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
521
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
522
+ "license": "MIT",
523
+ "dependencies": {
524
+ "mime-db": "^1.54.0"
525
+ },
526
+ "engines": {
527
+ "node": ">=18"
528
+ },
529
+ "funding": {
530
+ "type": "opencollective",
531
+ "url": "https://opencollective.com/express"
532
+ }
533
+ },
534
+ "node_modules/ms": {
535
+ "version": "2.1.3",
536
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
537
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
538
+ "license": "MIT"
539
+ },
540
+ "node_modules/negotiator": {
541
+ "version": "1.0.0",
542
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
543
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
544
+ "license": "MIT",
545
+ "engines": {
546
+ "node": ">= 0.6"
547
+ }
548
+ },
549
+ "node_modules/object-inspect": {
550
+ "version": "1.13.4",
551
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
552
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
553
+ "license": "MIT",
554
+ "engines": {
555
+ "node": ">= 0.4"
556
+ },
557
+ "funding": {
558
+ "url": "https://github.com/sponsors/ljharb"
559
+ }
560
+ },
561
+ "node_modules/on-finished": {
562
+ "version": "2.4.1",
563
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
564
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
565
+ "license": "MIT",
566
+ "dependencies": {
567
+ "ee-first": "1.1.1"
568
+ },
569
+ "engines": {
570
+ "node": ">= 0.8"
571
+ }
572
+ },
573
+ "node_modules/once": {
574
+ "version": "1.4.0",
575
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
576
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
577
+ "license": "ISC",
578
+ "dependencies": {
579
+ "wrappy": "1"
580
+ }
581
+ },
582
+ "node_modules/parseurl": {
583
+ "version": "1.3.3",
584
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
585
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
586
+ "license": "MIT",
587
+ "engines": {
588
+ "node": ">= 0.8"
589
+ }
590
+ },
591
+ "node_modules/path-to-regexp": {
592
+ "version": "8.3.0",
593
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
594
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
595
+ "license": "MIT",
596
+ "funding": {
597
+ "type": "opencollective",
598
+ "url": "https://opencollective.com/express"
599
+ }
600
+ },
601
+ "node_modules/playwright": {
602
+ "version": "1.58.2",
603
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz",
604
+ "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==",
605
+ "license": "Apache-2.0",
606
+ "dependencies": {
607
+ "playwright-core": "1.58.2"
608
+ },
609
+ "bin": {
610
+ "playwright": "cli.js"
611
+ },
612
+ "engines": {
613
+ "node": ">=18"
614
+ },
615
+ "optionalDependencies": {
616
+ "fsevents": "2.3.2"
617
+ }
618
+ },
619
+ "node_modules/playwright-core": {
620
+ "version": "1.58.2",
621
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz",
622
+ "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==",
623
+ "license": "Apache-2.0",
624
+ "bin": {
625
+ "playwright-core": "cli.js"
626
+ },
627
+ "engines": {
628
+ "node": ">=18"
629
+ }
630
+ },
631
+ "node_modules/proxy-addr": {
632
+ "version": "2.0.7",
633
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
634
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
635
+ "license": "MIT",
636
+ "dependencies": {
637
+ "forwarded": "0.2.0",
638
+ "ipaddr.js": "1.9.1"
639
+ },
640
+ "engines": {
641
+ "node": ">= 0.10"
642
+ }
643
+ },
644
+ "node_modules/qs": {
645
+ "version": "6.14.2",
646
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
647
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
648
+ "license": "BSD-3-Clause",
649
+ "dependencies": {
650
+ "side-channel": "^1.1.0"
651
+ },
652
+ "engines": {
653
+ "node": ">=0.6"
654
+ },
655
+ "funding": {
656
+ "url": "https://github.com/sponsors/ljharb"
657
+ }
658
+ },
659
+ "node_modules/range-parser": {
660
+ "version": "1.2.1",
661
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
662
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
663
+ "license": "MIT",
664
+ "engines": {
665
+ "node": ">= 0.6"
666
+ }
667
+ },
668
+ "node_modules/raw-body": {
669
+ "version": "3.0.2",
670
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
671
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
672
+ "license": "MIT",
673
+ "dependencies": {
674
+ "bytes": "~3.1.2",
675
+ "http-errors": "~2.0.1",
676
+ "iconv-lite": "~0.7.0",
677
+ "unpipe": "~1.0.0"
678
+ },
679
+ "engines": {
680
+ "node": ">= 0.10"
681
+ }
682
+ },
683
+ "node_modules/router": {
684
+ "version": "2.2.0",
685
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
686
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
687
+ "license": "MIT",
688
+ "dependencies": {
689
+ "debug": "^4.4.0",
690
+ "depd": "^2.0.0",
691
+ "is-promise": "^4.0.0",
692
+ "parseurl": "^1.3.3",
693
+ "path-to-regexp": "^8.0.0"
694
+ },
695
+ "engines": {
696
+ "node": ">= 18"
697
+ }
698
+ },
699
+ "node_modules/safer-buffer": {
700
+ "version": "2.1.2",
701
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
702
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
703
+ "license": "MIT"
704
+ },
705
+ "node_modules/send": {
706
+ "version": "1.2.1",
707
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
708
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
709
+ "license": "MIT",
710
+ "dependencies": {
711
+ "debug": "^4.4.3",
712
+ "encodeurl": "^2.0.0",
713
+ "escape-html": "^1.0.3",
714
+ "etag": "^1.8.1",
715
+ "fresh": "^2.0.0",
716
+ "http-errors": "^2.0.1",
717
+ "mime-types": "^3.0.2",
718
+ "ms": "^2.1.3",
719
+ "on-finished": "^2.4.1",
720
+ "range-parser": "^1.2.1",
721
+ "statuses": "^2.0.2"
722
+ },
723
+ "engines": {
724
+ "node": ">= 18"
725
+ },
726
+ "funding": {
727
+ "type": "opencollective",
728
+ "url": "https://opencollective.com/express"
729
+ }
730
+ },
731
+ "node_modules/serve-static": {
732
+ "version": "2.2.1",
733
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
734
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
735
+ "license": "MIT",
736
+ "dependencies": {
737
+ "encodeurl": "^2.0.0",
738
+ "escape-html": "^1.0.3",
739
+ "parseurl": "^1.3.3",
740
+ "send": "^1.2.0"
741
+ },
742
+ "engines": {
743
+ "node": ">= 18"
744
+ },
745
+ "funding": {
746
+ "type": "opencollective",
747
+ "url": "https://opencollective.com/express"
748
+ }
749
+ },
750
+ "node_modules/setprototypeof": {
751
+ "version": "1.2.0",
752
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
753
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
754
+ "license": "ISC"
755
+ },
756
+ "node_modules/side-channel": {
757
+ "version": "1.1.0",
758
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
759
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
760
+ "license": "MIT",
761
+ "dependencies": {
762
+ "es-errors": "^1.3.0",
763
+ "object-inspect": "^1.13.3",
764
+ "side-channel-list": "^1.0.0",
765
+ "side-channel-map": "^1.0.1",
766
+ "side-channel-weakmap": "^1.0.2"
767
+ },
768
+ "engines": {
769
+ "node": ">= 0.4"
770
+ },
771
+ "funding": {
772
+ "url": "https://github.com/sponsors/ljharb"
773
+ }
774
+ },
775
+ "node_modules/side-channel-list": {
776
+ "version": "1.0.0",
777
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
778
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
779
+ "license": "MIT",
780
+ "dependencies": {
781
+ "es-errors": "^1.3.0",
782
+ "object-inspect": "^1.13.3"
783
+ },
784
+ "engines": {
785
+ "node": ">= 0.4"
786
+ },
787
+ "funding": {
788
+ "url": "https://github.com/sponsors/ljharb"
789
+ }
790
+ },
791
+ "node_modules/side-channel-map": {
792
+ "version": "1.0.1",
793
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
794
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
795
+ "license": "MIT",
796
+ "dependencies": {
797
+ "call-bound": "^1.0.2",
798
+ "es-errors": "^1.3.0",
799
+ "get-intrinsic": "^1.2.5",
800
+ "object-inspect": "^1.13.3"
801
+ },
802
+ "engines": {
803
+ "node": ">= 0.4"
804
+ },
805
+ "funding": {
806
+ "url": "https://github.com/sponsors/ljharb"
807
+ }
808
+ },
809
+ "node_modules/side-channel-weakmap": {
810
+ "version": "1.0.2",
811
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
812
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
813
+ "license": "MIT",
814
+ "dependencies": {
815
+ "call-bound": "^1.0.2",
816
+ "es-errors": "^1.3.0",
817
+ "get-intrinsic": "^1.2.5",
818
+ "object-inspect": "^1.13.3",
819
+ "side-channel-map": "^1.0.1"
820
+ },
821
+ "engines": {
822
+ "node": ">= 0.4"
823
+ },
824
+ "funding": {
825
+ "url": "https://github.com/sponsors/ljharb"
826
+ }
827
+ },
828
+ "node_modules/statuses": {
829
+ "version": "2.0.2",
830
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
831
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
832
+ "license": "MIT",
833
+ "engines": {
834
+ "node": ">= 0.8"
835
+ }
836
+ },
837
+ "node_modules/toidentifier": {
838
+ "version": "1.0.1",
839
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
840
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
841
+ "license": "MIT",
842
+ "engines": {
843
+ "node": ">=0.6"
844
+ }
845
+ },
846
+ "node_modules/type-is": {
847
+ "version": "2.0.1",
848
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
849
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
850
+ "license": "MIT",
851
+ "dependencies": {
852
+ "content-type": "^1.0.5",
853
+ "media-typer": "^1.1.0",
854
+ "mime-types": "^3.0.0"
855
+ },
856
+ "engines": {
857
+ "node": ">= 0.6"
858
+ }
859
+ },
860
+ "node_modules/unpipe": {
861
+ "version": "1.0.0",
862
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
863
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
864
+ "license": "MIT",
865
+ "engines": {
866
+ "node": ">= 0.8"
867
+ }
868
+ },
869
+ "node_modules/vary": {
870
+ "version": "1.1.2",
871
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
872
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
873
+ "license": "MIT",
874
+ "engines": {
875
+ "node": ">= 0.8"
876
+ }
877
+ },
878
+ "node_modules/wrappy": {
879
+ "version": "1.0.2",
880
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
881
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
882
+ "license": "ISC"
883
+ }
884
+ }
885
+ }
package.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "spotify-token-server",
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
+ "type": "module",
13
+ "dependencies": {
14
+ "dotenv": "^17.2.4",
15
+ "express": "^5.2.1",
16
+ "playwright": "^1.58.2"
17
+ }
18
+ }