@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.
- package/DEPLOY.md +163 -0
- package/LICENSE +119 -0
- package/README.md +314 -0
- package/config.ts +221 -0
- package/drizzle.config.js +40 -0
- package/info/COMPARISONS.md +37 -0
- package/info/CONFIGURATION.md +143 -0
- package/info/CONTRIBUTING.md +32 -0
- package/info/DATABASE_SETUP.md +108 -0
- package/info/GRANULAR_ACCESS_TOKENS.md +160 -0
- package/info/PROJECT_STRUCTURE.md +291 -0
- package/info/ROADMAP.md +27 -0
- package/info/SUPPORT.md +39 -0
- package/info/TESTING.md +301 -0
- package/info/USER_SUPPORT.md +31 -0
- package/package.json +77 -0
- package/scripts/build-assets.js +31 -0
- package/scripts/build-bin.js +62 -0
- package/scripts/prepack.js +27 -0
- package/src/assets/public/images/bg.png +0 -0
- package/src/assets/public/images/clients/logo-bun.png +0 -0
- package/src/assets/public/images/clients/logo-deno.png +0 -0
- package/src/assets/public/images/clients/logo-npm.png +0 -0
- package/src/assets/public/images/clients/logo-pnpm.png +0 -0
- package/src/assets/public/images/clients/logo-vlt.png +0 -0
- package/src/assets/public/images/clients/logo-yarn.png +0 -0
- package/src/assets/public/images/favicon/apple-touch-icon.png +0 -0
- package/src/assets/public/images/favicon/favicon-96x96.png +0 -0
- package/src/assets/public/images/favicon/favicon.ico +0 -0
- package/src/assets/public/images/favicon/favicon.svg +3 -0
- package/src/assets/public/images/favicon/site.webmanifest +21 -0
- package/src/assets/public/images/favicon/web-app-manifest-192x192.png +0 -0
- package/src/assets/public/images/favicon/web-app-manifest-512x512.png +0 -0
- package/src/assets/public/styles/styles.css +231 -0
- package/src/bin/demo/package.json +6 -0
- package/src/bin/demo/vlt.json +1 -0
- package/src/bin/vsr.ts +484 -0
- package/src/db/client.ts +590 -0
- package/src/db/migrations/0000_faulty_ricochet.sql +14 -0
- package/src/db/migrations/0000_initial.sql +29 -0
- package/src/db/migrations/0001_uuid_validation.sql +35 -0
- package/src/db/migrations/0001_wealthy_magdalene.sql +7 -0
- package/src/db/migrations/drop.sql +3 -0
- package/src/db/migrations/meta/0000_snapshot.json +104 -0
- package/src/db/migrations/meta/0001_snapshot.json +155 -0
- package/src/db/migrations/meta/_journal.json +20 -0
- package/src/db/schema.ts +43 -0
- package/src/index.ts +434 -0
- package/src/middleware/config.ts +79 -0
- package/src/middleware/telemetry.ts +43 -0
- package/src/queue/index.ts +97 -0
- package/src/routes/access.ts +852 -0
- package/src/routes/docs.ts +63 -0
- package/src/routes/misc.ts +469 -0
- package/src/routes/packages.ts +2823 -0
- package/src/routes/ping.ts +39 -0
- package/src/routes/search.ts +131 -0
- package/src/routes/static.ts +74 -0
- package/src/routes/tokens.ts +259 -0
- package/src/routes/users.ts +68 -0
- package/src/utils/auth.ts +202 -0
- package/src/utils/cache.ts +587 -0
- package/src/utils/config.ts +50 -0
- package/src/utils/database.ts +69 -0
- package/src/utils/docs.ts +146 -0
- package/src/utils/packages.ts +453 -0
- package/src/utils/response.ts +125 -0
- package/src/utils/routes.ts +64 -0
- package/src/utils/spa.ts +52 -0
- package/src/utils/tracing.ts +52 -0
- package/src/utils/upstream.ts +172 -0
- package/test/access.test.ts +705 -0
- package/test/audit.test.ts +828 -0
- package/test/dashboard.test.ts +693 -0
- package/test/dist-tags.test.ts +678 -0
- package/test/manifest.test.ts +436 -0
- package/test/packument.test.ts +530 -0
- package/test/ping.test.ts +41 -0
- package/test/search.test.ts +472 -0
- package/test/setup.ts +130 -0
- package/test/static.test.ts +646 -0
- package/test/tokens.test.ts +389 -0
- package/test/utils/auth.test.ts +214 -0
- package/test/utils/packages.test.ts +235 -0
- package/test/utils/response.test.ts +184 -0
- package/test/whoami.test.ts +119 -0
- package/tsconfig.json +16 -0
- package/tsconfig.worker.json +3 -0
- package/typedoc.mjs +2 -0
- package/types.ts +598 -0
- package/vitest.config.ts +25 -0
- package/vlt.json.example +56 -0
- package/wrangler.json +65 -0
package/info/TESTING.md
ADDED
|
@@ -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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
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>
|