@vltpkg/vsr 0.0.0-26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/DEPLOY.md +163 -0
  2. package/LICENSE +119 -0
  3. package/README.md +314 -0
  4. package/config.ts +221 -0
  5. package/drizzle.config.js +40 -0
  6. package/info/COMPARISONS.md +37 -0
  7. package/info/CONFIGURATION.md +143 -0
  8. package/info/CONTRIBUTING.md +32 -0
  9. package/info/DATABASE_SETUP.md +108 -0
  10. package/info/GRANULAR_ACCESS_TOKENS.md +160 -0
  11. package/info/PROJECT_STRUCTURE.md +291 -0
  12. package/info/ROADMAP.md +27 -0
  13. package/info/SUPPORT.md +39 -0
  14. package/info/TESTING.md +301 -0
  15. package/info/USER_SUPPORT.md +31 -0
  16. package/package.json +77 -0
  17. package/scripts/build-assets.js +31 -0
  18. package/scripts/build-bin.js +62 -0
  19. package/scripts/prepack.js +27 -0
  20. package/src/assets/public/images/bg.png +0 -0
  21. package/src/assets/public/images/clients/logo-bun.png +0 -0
  22. package/src/assets/public/images/clients/logo-deno.png +0 -0
  23. package/src/assets/public/images/clients/logo-npm.png +0 -0
  24. package/src/assets/public/images/clients/logo-pnpm.png +0 -0
  25. package/src/assets/public/images/clients/logo-vlt.png +0 -0
  26. package/src/assets/public/images/clients/logo-yarn.png +0 -0
  27. package/src/assets/public/images/favicon/apple-touch-icon.png +0 -0
  28. package/src/assets/public/images/favicon/favicon-96x96.png +0 -0
  29. package/src/assets/public/images/favicon/favicon.ico +0 -0
  30. package/src/assets/public/images/favicon/favicon.svg +3 -0
  31. package/src/assets/public/images/favicon/site.webmanifest +21 -0
  32. package/src/assets/public/images/favicon/web-app-manifest-192x192.png +0 -0
  33. package/src/assets/public/images/favicon/web-app-manifest-512x512.png +0 -0
  34. package/src/assets/public/styles/styles.css +231 -0
  35. package/src/bin/demo/package.json +6 -0
  36. package/src/bin/demo/vlt.json +1 -0
  37. package/src/bin/vsr.ts +484 -0
  38. package/src/db/client.ts +590 -0
  39. package/src/db/migrations/0000_faulty_ricochet.sql +14 -0
  40. package/src/db/migrations/0000_initial.sql +29 -0
  41. package/src/db/migrations/0001_uuid_validation.sql +35 -0
  42. package/src/db/migrations/0001_wealthy_magdalene.sql +7 -0
  43. package/src/db/migrations/drop.sql +3 -0
  44. package/src/db/migrations/meta/0000_snapshot.json +104 -0
  45. package/src/db/migrations/meta/0001_snapshot.json +155 -0
  46. package/src/db/migrations/meta/_journal.json +20 -0
  47. package/src/db/schema.ts +43 -0
  48. package/src/index.ts +434 -0
  49. package/src/middleware/config.ts +79 -0
  50. package/src/middleware/telemetry.ts +43 -0
  51. package/src/queue/index.ts +97 -0
  52. package/src/routes/access.ts +852 -0
  53. package/src/routes/docs.ts +63 -0
  54. package/src/routes/misc.ts +469 -0
  55. package/src/routes/packages.ts +2823 -0
  56. package/src/routes/ping.ts +39 -0
  57. package/src/routes/search.ts +131 -0
  58. package/src/routes/static.ts +74 -0
  59. package/src/routes/tokens.ts +259 -0
  60. package/src/routes/users.ts +68 -0
  61. package/src/utils/auth.ts +202 -0
  62. package/src/utils/cache.ts +587 -0
  63. package/src/utils/config.ts +50 -0
  64. package/src/utils/database.ts +69 -0
  65. package/src/utils/docs.ts +146 -0
  66. package/src/utils/packages.ts +453 -0
  67. package/src/utils/response.ts +125 -0
  68. package/src/utils/routes.ts +64 -0
  69. package/src/utils/spa.ts +52 -0
  70. package/src/utils/tracing.ts +52 -0
  71. package/src/utils/upstream.ts +172 -0
  72. package/test/access.test.ts +705 -0
  73. package/test/audit.test.ts +828 -0
  74. package/test/dashboard.test.ts +693 -0
  75. package/test/dist-tags.test.ts +678 -0
  76. package/test/manifest.test.ts +436 -0
  77. package/test/packument.test.ts +530 -0
  78. package/test/ping.test.ts +41 -0
  79. package/test/search.test.ts +472 -0
  80. package/test/setup.ts +130 -0
  81. package/test/static.test.ts +646 -0
  82. package/test/tokens.test.ts +389 -0
  83. package/test/utils/auth.test.ts +214 -0
  84. package/test/utils/packages.test.ts +235 -0
  85. package/test/utils/response.test.ts +184 -0
  86. package/test/whoami.test.ts +119 -0
  87. package/tsconfig.json +16 -0
  88. package/tsconfig.worker.json +3 -0
  89. package/typedoc.mjs +2 -0
  90. package/types.ts +598 -0
  91. package/vitest.config.ts +25 -0
  92. package/vlt.json.example +56 -0
  93. package/wrangler.json +65 -0
@@ -0,0 +1,301 @@
1
+ # VSR Registry Tests
2
+
3
+ This directory contains comprehensive tests for the VSR (vlt-specific
4
+ registry) covering all endpoints and functionality.
5
+
6
+ ## Test Structure
7
+
8
+ The test suite uses a hybrid approach combining both mocked and real
9
+ Cloudflare Workers environments for optimal coverage and performance.
10
+
11
+ ### Core Package Tests
12
+
13
+ #### `manifest.test.ts`
14
+
15
+ **Package manifest endpoint tests** covering both local/private
16
+ packages and upstream registry public packages.
17
+
18
+ **Covers:**
19
+
20
+ - Local package manifests (packuments, versions, tarballs)
21
+ - Upstream registry manifests (NPM, JSR, Custom)
22
+ - Version-specific requests and semver handling
23
+ - Error handling for invalid packages and versions
24
+ - Response structure validation
25
+
26
+ #### `packaument.test.ts`
27
+
28
+ **Package packument endpoint tests** for full package information
29
+ including all versions and metadata.
30
+
31
+ **Covers:**
32
+
33
+ - Local/private package packuments
34
+ - Upstream public package packuments (NPM, JSR, Custom)
35
+ - Version range filtering and semver queries
36
+ - Response structure validation (name, dist-tags, versions, time)
37
+ - Error handling and special package names
38
+ - Performance and caching behavior
39
+
40
+ ### Utility Endpoint Tests
41
+
42
+ #### `ping.test.ts`
43
+
44
+ **Health check endpoint tests** for both root and upstream registries.
45
+
46
+ **Covers:**
47
+
48
+ - Root registry ping (`/-/ping`)
49
+ - Upstream registry ping (`/{upstream}/-/ping`)
50
+ - NPM compatibility headers
51
+ - Response format validation
52
+
53
+ #### `whoami.test.ts`
54
+
55
+ **User identity endpoint tests** for authentication and user
56
+ information.
57
+
58
+ **Covers:**
59
+
60
+ - Root registry whoami (`/-/whoami`)
61
+ - Upstream registry whoami (`/{upstream}/-/whoami`)
62
+ - Authentication behavior (authenticated vs unauthenticated)
63
+ - Response format consistency
64
+ - Error handling for invalid tokens
65
+
66
+ #### `search.test.ts`
67
+
68
+ **Package search endpoint tests** for finding packages across
69
+ registries.
70
+
71
+ **Covers:**
72
+
73
+ - Root registry search (`/-/search`)
74
+ - Upstream registry search (`/{upstream}/-/search`)
75
+ - Query parameter handling (text, size, from, quality, popularity,
76
+ maintenance)
77
+ - Search response structure and pagination
78
+ - Legacy API redirects (`/-/v1/search`)
79
+ - Error handling and performance limits
80
+
81
+ ### Management Endpoint Tests
82
+
83
+ #### `tokens.test.ts`
84
+
85
+ **Token management endpoint tests** for authentication token CRUD
86
+ operations.
87
+
88
+ **Covers:**
89
+
90
+ - Token listing (`GET /-/tokens`)
91
+ - Token creation (`POST /-/tokens`)
92
+ - Token updates (`PUT /-/tokens`)
93
+ - Token deletion (`DELETE /-/tokens/{token}`)
94
+ - Upstream token management
95
+ - Authentication and authorization
96
+ - Request validation and error handling
97
+
98
+ #### `access.test.ts`
99
+
100
+ **Access control endpoint tests** for package permissions and
101
+ collaborator management.
102
+
103
+ **Covers:**
104
+
105
+ - Package access status (`/-/package/{pkg}/access`)
106
+ - Collaborator management
107
+ (`/-/package/{pkg}/collaborators/{username}`)
108
+ - Scoped package access control
109
+ - Package list access (`/-/package/list`)
110
+ - Authentication and authorization levels
111
+ - Permission validation
112
+
113
+ #### `dist-tags.test.ts`
114
+
115
+ **Distribution tags endpoint tests** for package version tagging.
116
+
117
+ **Covers:**
118
+
119
+ - Dist-tag retrieval (`/-/package/{pkg}/dist-tags`)
120
+ - Dist-tag creation/updates (`PUT /-/package/{pkg}/dist-tags/{tag}`)
121
+ - Dist-tag deletion (`DELETE /-/package/{pkg}/dist-tags/{tag}`)
122
+ - Semver validation and tag name validation
123
+ - Authentication and ownership checks
124
+ - Complete dist-tag lifecycle operations
125
+
126
+ ### Security and Audit Tests
127
+
128
+ #### `audit.test.ts`
129
+
130
+ **Security audit endpoint tests** for vulnerability scanning.
131
+
132
+ **Covers:**
133
+
134
+ - Root registry audit (`/-/npm/audit`)
135
+ - Upstream registry audit (`/{upstream}/-/npm/audit`)
136
+ - Package lock format support (v1, v2, v3)
137
+ - Dependency tree validation
138
+ - Legacy API redirects
139
+ - Request validation and error handling
140
+ - Audit implementation status
141
+
142
+ ### Infrastructure Tests
143
+
144
+ #### `static.test.ts`
145
+
146
+ **Static asset endpoint tests** for web interface and public files.
147
+
148
+ **Covers:**
149
+
150
+ - Public assets (`/public/*`)
151
+ - Special files (`/favicon.ico`, `/robots.txt`, `/manifest.json`)
152
+ - Content-type headers for different file types
153
+ - Cache control and compression
154
+ - Security considerations (directory traversal prevention)
155
+ - Performance optimization (range requests, conditional requests)
156
+
157
+ #### `dashboard.test.ts`
158
+
159
+ **Dashboard endpoint tests** for daemon-mode web interface data.
160
+
161
+ **Covers:**
162
+
163
+ - Dashboard configuration (`/dashboard.json`)
164
+ - Application data (`/app-data.json`)
165
+ - Daemon enable/disable behavior
166
+ - Data structure validation
167
+ - Feature flag integration
168
+ - Performance and concurrent request handling
169
+
170
+ ## Testing Approach
171
+
172
+ ### Hybrid Testing Strategy
173
+
174
+ The test suite uses two complementary approaches:
175
+
176
+ 1. **Mocked Environment Tests** (`app.request()` with `mockEnv`)
177
+ - Used for complex endpoints (manifest, packument, search, tokens,
178
+ access, etc.)
179
+ - Fast execution with comprehensive mocking
180
+ - Reliable and deterministic results
181
+ - Covers edge cases and error conditions
182
+
183
+ 2. **Real Cloudflare Workers Tests** (`SELF.fetch()` with real
184
+ bindings)
185
+ - Used for simple endpoints (ping, whoami)
186
+ - Real database and environment integration
187
+ - End-to-end validation with actual Workers runtime
188
+ - Configured via `@cloudflare/vitest-pool-workers`
189
+
190
+ ### Mock Environment Structure
191
+
192
+ ```typescript
193
+ const mockEnv = {
194
+ DB: {
195
+ // Minimal D1 interface with Drizzle ORM compatibility
196
+ prepare: () => ({ bind: () => ({ get, all, run, raw }) }),
197
+ batch: () => Promise.resolve([]),
198
+ exec: () => Promise.resolve(),
199
+ },
200
+ BUCKET: { get, put, delete },
201
+ KV: { get, put, delete },
202
+ // Additional bindings as needed
203
+ }
204
+ ```
205
+
206
+ ## Running Tests
207
+
208
+ ```bash
209
+ # Run all tests
210
+ pnpm test
211
+
212
+ # Run specific test files
213
+ pnpm test test/manifest.test.ts
214
+ pnpm test test/tokens.test.ts
215
+ pnpm test test/search.test.ts
216
+
217
+ # Run tests in watch mode
218
+ pnpm test --watch
219
+
220
+ # Run tests with coverage
221
+ pnpm test --coverage
222
+
223
+ # Run linting
224
+ pnpm lint
225
+ ```
226
+
227
+ ## Test Results
228
+
229
+ Current test coverage includes **8 comprehensive test files** with
230
+ **300+ individual tests**:
231
+
232
+ - ✅ **manifest.test.ts** - 33 tests (Package manifests)
233
+ - ✅ **packaument.test.ts** - 40 tests (Package packuments)
234
+ - ✅ **ping.test.ts** - 5 tests (Health checks)
235
+ - ✅ **whoami.test.ts** - 10 tests (User identity)
236
+ - ✅ **search.test.ts** - 50+ tests (Package search)
237
+ - ✅ **tokens.test.ts** - 40+ tests (Token management)
238
+ - ✅ **access.test.ts** - 60+ tests (Access control)
239
+ - ✅ **dist-tags.test.ts** - 50+ tests (Distribution tags)
240
+ - ✅ **audit.test.ts** - 40+ tests (Security audits)
241
+ - ✅ **static.test.ts** - 60+ tests (Static assets)
242
+ - ✅ **dashboard.test.ts** - 40+ tests (Dashboard data)
243
+
244
+ ## Key Features Tested
245
+
246
+ ### NPM Registry Compatibility
247
+
248
+ - Full npm client compatibility for all utility endpoints
249
+ - Proper HTTP status codes and response formats
250
+ - Legacy API redirect support
251
+ - Semver validation and handling
252
+
253
+ ### Multi-Registry Support
254
+
255
+ - Root/local registry functionality
256
+ - Upstream registry proxying (NPM, JSR, Custom)
257
+ - Registry-specific endpoint behavior
258
+ - Upstream configuration validation
259
+
260
+ ### Security and Authentication
261
+
262
+ - Token-based authentication
263
+ - Package access control and permissions
264
+ - Collaborator management
265
+ - Security audit functionality
266
+ - Input validation and sanitization
267
+
268
+ ### Performance and Reliability
269
+
270
+ - Response time validation
271
+ - Concurrent request handling
272
+ - Error handling and edge cases
273
+ - Cache control and optimization
274
+ - Resource limits and validation
275
+
276
+ ## Configuration
277
+
278
+ Tests are configured in `vitest.config.ts` with:
279
+
280
+ - **Cloudflare Workers pool** for real environment testing
281
+ - **30-second timeout** for upstream requests
282
+ - **Real bindings setup** in `test/setup.ts`
283
+ - **Database schema creation** for isolated test environments
284
+ - **Environment variable configuration**
285
+
286
+ ## Future Improvements
287
+
288
+ 1. **Enhanced Integration Testing**
289
+ - More real Cloudflare Workers tests as the framework matures
290
+ - End-to-end workflow testing
291
+ - Performance benchmarking
292
+
293
+ 2. **Advanced Test Scenarios**
294
+ - Load testing for high-traffic scenarios
295
+ - Chaos engineering for resilience testing
296
+ - Cross-registry interaction testing
297
+
298
+ 3. **Test Automation**
299
+ - Automated test generation for new endpoints
300
+ - Contract testing for API compatibility
301
+ - Visual regression testing for web interface
@@ -0,0 +1,31 @@
1
+ # Support
2
+
3
+ ## News
4
+
5
+ - Home: <https://vlt.sh>
6
+ - Blog: <https://blog.vlt.sh/>
7
+
8
+ ## Official Documentation
9
+
10
+ - CLI: <https://docs.vlt.sh/cli>
11
+ - VSR: <https://docs.vlt.sh/registry>
12
+
13
+ ## Social Media
14
+
15
+ - GitHub: <https://github.com/vltpkg>
16
+ - Linkedin: <https://www.linkedin.com/company/vltpkg/>
17
+ - Bluesky: <https://bsky.app/profile/vlt.sh>
18
+ - Twitter: <https://x.com/vltpkg>
19
+ - Discord: <https://discord.gg/vltpkg>
20
+ - Youtube: <https://www.youtube.com/@vltpkg>
21
+
22
+ ## Public Calendar
23
+
24
+ - gCal:
25
+ <https://calendar.google.com/calendar/embed?src=c_ee5f7f2a875caac1c7a90183d7faf31f2fe0e22b94aca147f005bfb3e0c7e072%40group.calendar.google.com>
26
+ - iCal:
27
+ <https://calendar.google.com/calendar/ical/c_ee5f7f2a875caac1c7a90183d7faf31f2fe0e22b94aca147f005bfb3e0c7e072%40group.calendar.google.com/public/basic.ics>
28
+
29
+ ## More
30
+
31
+ - Package Managers Benchmarks: <https://benchmarks.vlt.sh>
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@vltpkg/vsr",
3
+ "version": "0.0.0-26",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/vltpkg/vltpkg.git",
7
+ "directory": "src/registry"
8
+ },
9
+ "author": "vlt technology inc. <support@vlt.sh> (http://vlt.sh)",
10
+ "bin": "./dist/bin/vsr.js",
11
+ "dependencies": {
12
+ "@hono/sentry": "^1.2.2",
13
+ "@hono/zod-openapi": "^0.19.10",
14
+ "@libsql/client": "^0.15.14",
15
+ "@scalar/hono-api-reference": "^0.9.16",
16
+ "drizzle-orm": "^0.44.5",
17
+ "hono": "^4.9.5",
18
+ "minargs": "^2.1.0",
19
+ "path-scurry": "^2.0.0",
20
+ "semver": "^7.7.2",
21
+ "validate-npm-package-name": "6.0.2",
22
+ "wrangler": "^4.33.1",
23
+ "zod": "^3.25.76",
24
+ "@vltpkg/package-info": "0.0.0-26",
25
+ "@vltpkg/server": "0.0.0-26",
26
+ "@vltpkg/vlt-json": "0.0.0-26",
27
+ "@vltpkg/package-json": "0.0.0-26"
28
+ },
29
+ "devDependencies": {
30
+ "@cloudflare/vitest-pool-workers": "^0.8.68",
31
+ "@cloudflare/workers-types": "^4.20250829.0",
32
+ "@types/node": "^22.17.2",
33
+ "@types/validate-npm-package-name": "^4.0.2",
34
+ "chokidar-cli": "^3.0.0",
35
+ "drizzle-kit": "^0.31.4",
36
+ "esbuild": "^0.25.9",
37
+ "eslint": "^9.34.0",
38
+ "typedoc": "~0.27.9",
39
+ "typescript": "5.7.3",
40
+ "typescript-eslint": "^8.40.0",
41
+ "vitest": "^3.2.4",
42
+ "@vltpkg/gui": "0.0.0-26"
43
+ },
44
+ "license": "FSL-1.1-MIT",
45
+ "engines": {
46
+ "node": ">=22"
47
+ },
48
+ "type": "module",
49
+ "scripts": {
50
+ "build": "pnpm build:dist && pnpm build:assets && pnpm build:worker && pnpm build:bin",
51
+ "build:assets": "node scripts/build-assets.js",
52
+ "build:bin": "node scripts/build-bin.js",
53
+ "build:dist": "node -e \"const fs=require('fs'); fs.rmSync('./dist', {recursive: true, force: true}); fs.mkdirSync('./dist/assets/public', {recursive: true});\"",
54
+ "build:worker": "npx wrangler deploy --dry-run --outdir dist",
55
+ "db:drop": "npx wrangler d1 execute vsr-local-database --file=src/db/migrations/drop.sql --local --persist-to=local-store --no-remote && node -e \"const fs=require('fs'); fs.rmSync('local-store',{recursive:true,force:true}); fs.rmSync('.wrangler',{recursive:true,force:true});\"",
56
+ "db:generate": "drizzle-kit generate",
57
+ "db:migrate": "drizzle-kit migrate",
58
+ "db:push": "drizzle-kit push",
59
+ "db:setup": "npx wrangler d1 execute vsr-local-database --file=src/db/migrations/0000_initial.sql --local --persist-to=local-store --no-remote && npx wrangler d1 execute vsr-local-database --file=src/db/migrations/0001_wealthy_magdalene.sql --local --persist-to=local-store --no-remote",
60
+ "db:studio": "drizzle-kit studio --port 4985",
61
+ "deploy": "pnpm build && npx wrangler deploy",
62
+ "format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
63
+ "format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
64
+ "lint": "eslint . --fix",
65
+ "lint:check": "eslint .",
66
+ "serve:build": "pnpm --silent build && node ./dist/bin/vsr.js --debug --daemon=false",
67
+ "serve:build:daemon": "pnpm --silent build && node ./dist/bin/vsr.js --debug --daemon=true",
68
+ "serve:death": "echo \"Killing wrangler dev processes...\" && (pkill -f 'wrangler.*dev' || true) && sleep 1 && (pids=$(lsof -ti :1337 2>/dev/null; lsof -ti :3000 2>/dev/null) && [ -n \"$pids\" ] && echo \"Force killing remaining processes: $pids\" && kill -9 $pids || echo \"No remaining processes found\") && echo \"Done.\"",
69
+ "serve:watch": "chokidar './src/**/*' -c 'pnpm serve:death && pnpm serve:build'",
70
+ "snap": "vitest --no-watch -u",
71
+ "pretest": "pnpm build",
72
+ "test": "vitest --no-watch",
73
+ "posttest": "tsc --noEmit",
74
+ "typecheck": "tsc --noEmit",
75
+ "typecheck:worker": "tsc -p tsconfig.worker.json --noEmit"
76
+ }
77
+ }
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { mkdir, cp } from 'fs/promises'
4
+
5
+ async function main() {
6
+ console.log('Building assets...')
7
+
8
+ // Copy source assets to dist/assets
9
+ console.log('Copying src/assets to dist/assets...')
10
+ await mkdir('./dist/assets', { recursive: true })
11
+ await cp('./src/assets', './dist/assets', { recursive: true })
12
+
13
+ // Copy GUI assets to dist/assets/public
14
+ console.log('Copying @vltpkg/gui dist to dist/assets/public...')
15
+ await mkdir('./dist/assets/public', { recursive: true })
16
+ await cp(
17
+ './node_modules/@vltpkg/gui/dist',
18
+ './dist/assets/public',
19
+ { recursive: true },
20
+ )
21
+ }
22
+
23
+ main()
24
+ .then(() => {
25
+ console.log('Assets build completed successfully')
26
+ })
27
+ .catch(error => {
28
+ console.error('Assets build failed:')
29
+ console.error(error)
30
+ process.exit(1)
31
+ })
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { mkdir, cp } from 'fs/promises'
4
+ import { resolve, join } from 'path'
5
+ import { spawn } from 'child_process'
6
+
7
+ /**
8
+ * Run a command and return a promise
9
+ * @param {string} command - Command to run
10
+ * @param {string[]} args - Command arguments
11
+ * @returns {Promise<void>}
12
+ */
13
+ async function runCommand(command, args = []) {
14
+ return new Promise((resolve, reject) => {
15
+ const child = spawn(command, args, {
16
+ stdio: 'inherit',
17
+ shell: true,
18
+ })
19
+
20
+ child.on('close', code => {
21
+ if (code === 0) {
22
+ resolve()
23
+ } else {
24
+ reject(new Error(`Command failed with exit code ${code}`))
25
+ }
26
+ })
27
+
28
+ child.on('error', reject)
29
+ })
30
+ }
31
+
32
+ async function main() {
33
+ console.log('Building bin...')
34
+
35
+ // Copy demo directory
36
+ console.log('Copying src/bin/demo to dist/bin/demo...')
37
+ await mkdir('./dist/bin/demo', { recursive: true })
38
+ await cp('./src/bin/demo', './dist/bin/demo', { recursive: true })
39
+
40
+ // Build the VSR binary with esbuild
41
+ console.log('Building VSR binary with esbuild...')
42
+ await runCommand(
43
+ resolve(process.cwd(), 'node_modules/.bin/esbuild'),
44
+ [
45
+ join('./src/bin/vsr.ts'),
46
+ `--outfile=${join('./dist/bin/vsr.js')}`,
47
+ '--packages=external',
48
+ '--platform=node',
49
+ '--format=esm',
50
+ ],
51
+ )
52
+ }
53
+
54
+ main()
55
+ .then(() => {
56
+ console.log('Bin build completed successfully')
57
+ })
58
+ .catch(error => {
59
+ console.error('Bin build failed:')
60
+ console.error(error)
61
+ process.exit(1)
62
+ })
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { writeFile, readFile, cp } from 'fs/promises'
4
+
5
+ async function main() {
6
+ console.log('Prepacking...')
7
+
8
+ const pkg = JSON.parse(await readFile('./package.json', 'utf8'))
9
+
10
+ delete pkg.publishConfig
11
+ delete pkg.scripts
12
+ delete pkg.devDependencies
13
+ pkg.bin = './bin/vsr.js'
14
+
15
+ await writeFile('./dist/package.json', JSON.stringify(pkg, null, 2))
16
+
17
+ await cp('./README.md', './dist/README.md')
18
+ }
19
+
20
+ main()
21
+ .then(() => {
22
+ console.log('Prepacked successfully')
23
+ })
24
+ .catch(error => {
25
+ console.error('Prepacking failed:', error)
26
+ process.exit(1)
27
+ })
Binary file
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1171" height="1171" viewBox="0 0 1171 1171"><image width="1171" height="1171" xlink:href="data:image/png;base64,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"></image><style>@media (prefers-color-scheme: light) { :root { filter: none; } }
2
+ @media (prefers-color-scheme: dark) { :root { filter: none; } }
3
+ </style></svg>