purl 1.0.0 → 1.1.0

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.
data/purl-types.json CHANGED
@@ -5,19 +5,49 @@
5
5
  "last_updated": "2025-07-24",
6
6
  "types": {
7
7
  "alpm": {
8
- "description": "Arch Linux and other users of the libalpm/pacman package manager"
8
+ "description": "Arch Linux and other users of the libalpm/pacman package manager",
9
+ "default_registry": null,
10
+ "examples": [
11
+ "pkg:alpm/arch/pacman@6.0.2-5?distro=arch",
12
+ "pkg:alpm/arch/curl@7.87.0-2?distro=arch",
13
+ "pkg:alpm/arch/systemd@252.4-2?distro=arch"
14
+ ]
9
15
  },
10
16
  "apk": {
11
- "description": "APK-based packages"
17
+ "description": "APK-based packages",
18
+ "default_registry": null,
19
+ "examples": [
20
+ "pkg:apk/alpine/curl@7.83.0-r0?distro=alpine-3.16",
21
+ "pkg:apk/alpine/busybox@1.35.0-r17?distro=alpine-3.16",
22
+ "pkg:apk/alpine/musl@1.2.3-r0?distro=alpine-3.16"
23
+ ]
12
24
  },
13
25
  "bitbucket": {
14
- "description": "Bitbucket-based packages"
26
+ "description": "Bitbucket-based packages",
27
+ "default_registry": "https://bitbucket.org",
28
+ "examples": [
29
+ "pkg:bitbucket/atlassian/python-bitbucket@0.1.0",
30
+ "pkg:bitbucket/birkenfeld/pygments-main@2.13.0",
31
+ "pkg:bitbucket/pygame/pygame@2.1.2"
32
+ ]
15
33
  },
16
34
  "bitnami": {
17
- "description": "Bitnami-based packages"
35
+ "description": "Bitnami-based packages",
36
+ "default_registry": "https://downloads.bitnami.com/files/stacksmith",
37
+ "examples": [
38
+ "pkg:bitnami/wordpress@6.1.1-0",
39
+ "pkg:bitnami/mysql@8.0.31-0",
40
+ "pkg:bitnami/apache@2.4.54-0"
41
+ ]
18
42
  },
19
43
  "cargo": {
20
44
  "description": "Rust packages",
45
+ "default_registry": "https://crates.io",
46
+ "examples": [
47
+ "pkg:cargo/rand@0.7.2",
48
+ "pkg:cargo/clap@4.0.32",
49
+ "pkg:cargo/serde@1.0.152"
50
+ ],
21
51
  "registry_config": {
22
52
  "base_url": "https://crates.io/crates",
23
53
  "route_patterns": [
@@ -32,11 +62,18 @@
32
62
  },
33
63
  "cocoapods": {
34
64
  "description": "CocoaPods",
65
+ "default_registry": "https://cdn.cocoapods.org/",
66
+ "examples": [
67
+ "pkg:cocoapods/Alamofire@5.6.4",
68
+ "pkg:cocoapods/SwiftyJSON@5.0.1",
69
+ "pkg:cocoapods/AFNetworking@4.0.1"
70
+ ],
35
71
  "registry_config": {
36
72
  "base_url": "https://cocoapods.org/pods",
37
73
  "route_patterns": [
38
74
  "https://cocoapods.org/pods/:name"
39
75
  ],
76
+ "reverse_regex": "^https://cocoapods\\.org/pods/([^/?#]+)",
40
77
  "components": {
41
78
  "namespace": false,
42
79
  "version_in_url": false
@@ -45,11 +82,18 @@
45
82
  },
46
83
  "composer": {
47
84
  "description": "Composer PHP packages",
85
+ "default_registry": "https://packagist.org",
86
+ "examples": [
87
+ "pkg:composer/symfony/console@6.1.7",
88
+ "pkg:composer/laravel/framework@9.42.2",
89
+ "pkg:composer/phpunit/phpunit@9.5.27"
90
+ ],
48
91
  "registry_config": {
49
92
  "base_url": "https://packagist.org/packages",
50
93
  "route_patterns": [
51
94
  "https://packagist.org/packages/:namespace/:name"
52
95
  ],
96
+ "reverse_regex": "^https://packagist\\.org/packages/([^/?#]+)/([^/?#]+)",
53
97
  "components": {
54
98
  "namespace": true,
55
99
  "namespace_required": true,
@@ -58,15 +102,28 @@
58
102
  }
59
103
  },
60
104
  "conan": {
61
- "description": "Conan C/C++ packages"
105
+ "description": "Conan C/C++ packages",
106
+ "default_registry": "https://center.conan.io",
107
+ "examples": [
108
+ "pkg:conan/boost@1.80.0",
109
+ "pkg:conan/openssl@1.1.1s",
110
+ "pkg:conan/zlib@1.2.13"
111
+ ]
62
112
  },
63
113
  "conda": {
64
114
  "description": "Conda packages",
115
+ "default_registry": "https://repo.anaconda.com",
116
+ "examples": [
117
+ "pkg:conda/numpy@1.24.1",
118
+ "pkg:conda/pandas@1.5.2",
119
+ "pkg:conda/matplotlib@3.6.2"
120
+ ],
65
121
  "registry_config": {
66
122
  "base_url": "https://anaconda.org/conda-forge",
67
123
  "route_patterns": [
68
124
  "https://anaconda.org/conda-forge/:name"
69
125
  ],
126
+ "reverse_regex": "^https://anaconda\\.org/conda-forge/([^/?#]+)",
70
127
  "components": {
71
128
  "namespace": false,
72
129
  "version_in_url": false
@@ -75,11 +132,18 @@
75
132
  },
76
133
  "cpan": {
77
134
  "description": "CPAN Perl packages",
135
+ "default_registry": "https://www.cpan.org/",
136
+ "examples": [
137
+ "pkg:cpan/Moose@2.2014",
138
+ "pkg:cpan/DBI@1.643",
139
+ "pkg:cpan/Catalyst-Runtime@5.90128"
140
+ ],
78
141
  "registry_config": {
79
142
  "base_url": "https://metacpan.org/dist",
80
143
  "route_patterns": [
81
144
  "https://metacpan.org/dist/:name"
82
145
  ],
146
+ "reverse_regex": "^https://metacpan\\.org/dist/([^/?#]+)",
83
147
  "components": {
84
148
  "namespace": false,
85
149
  "version_in_url": false
@@ -87,16 +151,40 @@
87
151
  }
88
152
  },
89
153
  "cran": {
90
- "description": "CRAN R packages"
154
+ "description": "CRAN R packages",
155
+ "default_registry": "https://cran.r-project.org",
156
+ "examples": [
157
+ "pkg:cran/ggplot2@3.4.0",
158
+ "pkg:cran/dplyr@1.0.10",
159
+ "pkg:cran/devtools@2.4.5"
160
+ ]
91
161
  },
92
162
  "deb": {
93
- "description": "Debian, Debian derivatives, and Ubuntu packages"
163
+ "description": "Debian, Debian derivatives, and Ubuntu packages",
164
+ "default_registry": null,
165
+ "examples": [
166
+ "pkg:deb/debian/curl@7.74.0-1.3+deb11u3?distro=debian-11",
167
+ "pkg:deb/ubuntu/nginx@1.18.0-0ubuntu1.4?distro=ubuntu-20.04",
168
+ "pkg:deb/debian/git@1:2.30.2-1+deb11u2?distro=debian-11"
169
+ ]
94
170
  },
95
171
  "docker": {
96
- "description": "Docker images"
172
+ "description": "Docker images",
173
+ "default_registry": "https://hub.docker.com",
174
+ "examples": [
175
+ "pkg:docker/nginx@1.21.6",
176
+ "pkg:docker/ubuntu@20.04",
177
+ "pkg:docker/node@18.12.1"
178
+ ]
97
179
  },
98
180
  "gem": {
99
181
  "description": "RubyGems",
182
+ "default_registry": "https://rubygems.org",
183
+ "examples": [
184
+ "pkg:gem/ruby-advisory-db-check@0.12.4",
185
+ "pkg:gem/rails@7.0.4",
186
+ "pkg:gem/bundler@2.3.26"
187
+ ],
100
188
  "registry_config": {
101
189
  "base_url": "https://rubygems.org/gems",
102
190
  "route_patterns": [
@@ -112,13 +200,30 @@
112
200
  }
113
201
  },
114
202
  "generic": {
115
- "description": "Plain packages that do not fit anywhere else"
203
+ "description": "Plain packages that do not fit anywhere else",
204
+ "default_registry": null,
205
+ "examples": [
206
+ "pkg:generic/bitwardeninc/mobile@2023.1.0",
207
+ "pkg:generic/curl@7.80.0?distro=fedora-35",
208
+ "pkg:generic/openssl@1.1.1q"
209
+ ]
116
210
  },
117
211
  "github": {
118
- "description": "GitHub-based packages"
212
+ "description": "GitHub-based packages",
213
+ "default_registry": "https://github.com",
214
+ "examples": [
215
+ "pkg:github/torvalds/linux@6.1",
216
+ "pkg:github/microsoft/vscode@1.74.2",
217
+ "pkg:github/npm/cli@9.2.0"
218
+ ]
119
219
  },
120
220
  "golang": {
121
221
  "description": "Go packages",
222
+ "default_registry": null,
223
+ "examples": [
224
+ "pkg:golang/google.golang.org/genproto#googleapis/api/annotations",
225
+ "pkg:golang/github.com/gorilla/mux@v1.8.0"
226
+ ],
122
227
  "registry_config": {
123
228
  "base_url": "https://pkg.go.dev",
124
229
  "route_patterns": [
@@ -135,6 +240,12 @@
135
240
  },
136
241
  "hackage": {
137
242
  "description": "Haskell packages",
243
+ "default_registry": "https://hackage.haskell.org",
244
+ "examples": [
245
+ "pkg:hackage/aeson@2.1.1.0",
246
+ "pkg:hackage/lens@5.2",
247
+ "pkg:hackage/mtl@2.2.2"
248
+ ],
138
249
  "registry_config": {
139
250
  "base_url": "https://hackage.haskell.org/package",
140
251
  "route_patterns": [
@@ -151,11 +262,18 @@
151
262
  },
152
263
  "hex": {
153
264
  "description": "Hex packages",
265
+ "default_registry": "https://repo.hex.pm",
266
+ "examples": [
267
+ "pkg:hex/phoenix@1.6.15",
268
+ "pkg:hex/ecto@3.9.4",
269
+ "pkg:hex/plug@1.14.0"
270
+ ],
154
271
  "registry_config": {
155
272
  "base_url": "https://hex.pm/packages",
156
273
  "route_patterns": [
157
274
  "https://hex.pm/packages/:name"
158
275
  ],
276
+ "reverse_regex": "^https://hex\\.pm/packages/([^/?#]+)",
159
277
  "components": {
160
278
  "namespace": false,
161
279
  "version_in_url": false
@@ -163,13 +281,31 @@
163
281
  }
164
282
  },
165
283
  "huggingface": {
166
- "description": "Hugging Face ML models"
284
+ "description": "Hugging Face ML models",
285
+ "default_registry": "https://huggingface.co",
286
+ "examples": [
287
+ "pkg:huggingface/transformers@4.25.1",
288
+ "pkg:huggingface/tokenizers@0.13.2",
289
+ "pkg:huggingface/datasets@2.7.1"
290
+ ]
167
291
  },
168
292
  "luarocks": {
169
- "description": "Lua packages installed with LuaRocks"
293
+ "description": "Lua packages installed with LuaRocks",
294
+ "default_registry": "https://luarocks.org",
295
+ "examples": [
296
+ "pkg:luarocks/luasocket@3.0.0-1",
297
+ "pkg:luarocks/lfs@1.8.0-1",
298
+ "pkg:luarocks/lua-cjson@2.1.0-1"
299
+ ]
170
300
  },
171
301
  "maven": {
172
302
  "description": "Maven JARs and related artifacts",
303
+ "default_registry": "https://repo.maven.apache.org/maven2",
304
+ "examples": [
305
+ "pkg:maven/org.apache.commons/commons-lang3@3.12.0",
306
+ "pkg:maven/junit/junit@4.13.2",
307
+ "pkg:maven/org.springframework/spring-core@5.3.23"
308
+ ],
173
309
  "registry_config": {
174
310
  "base_url": "https://mvnrepository.com/artifact",
175
311
  "route_patterns": [
@@ -186,10 +322,22 @@
186
322
  }
187
323
  },
188
324
  "mlflow": {
189
- "description": "MLflow ML models"
325
+ "description": "MLflow ML models",
326
+ "default_registry": null,
327
+ "examples": [
328
+ "pkg:mlflow/model/sklearn-iris@1.0.0",
329
+ "pkg:mlflow/model/pytorch-mnist@2.1.0",
330
+ "pkg:mlflow/model/tensorflow-classification@1.5.0"
331
+ ]
190
332
  },
191
333
  "npm": {
192
334
  "description": "Node NPM packages",
335
+ "default_registry": "https://registry.npmjs.org",
336
+ "examples": [
337
+ "pkg:npm/@babel/core@7.20.0",
338
+ "pkg:npm/lodash@4.17.21",
339
+ "pkg:npm/react@18.2.0"
340
+ ],
193
341
  "registry_config": {
194
342
  "base_url": "https://www.npmjs.com/package",
195
343
  "route_patterns": [
@@ -210,12 +358,19 @@
210
358
  },
211
359
  "nuget": {
212
360
  "description": "NuGet .NET packages",
361
+ "default_registry": "https://www.nuget.org",
362
+ "examples": [
363
+ "pkg:nuget/Newtonsoft.Json@13.0.1",
364
+ "pkg:nuget/EntityFramework@6.4.4",
365
+ "pkg:nuget/Microsoft.AspNetCore@6.0.13"
366
+ ],
213
367
  "registry_config": {
214
368
  "base_url": "https://www.nuget.org/packages",
215
369
  "route_patterns": [
216
370
  "https://www.nuget.org/packages/:name",
217
371
  "https://www.nuget.org/packages/:name/:version"
218
372
  ],
373
+ "reverse_regex": "^https://(?:www\\.)?nuget\\.org/packages/([^/?#]+)(?:/([^/?#]+))?",
219
374
  "components": {
220
375
  "namespace": false,
221
376
  "version_in_url": true,
@@ -224,15 +379,28 @@
224
379
  }
225
380
  },
226
381
  "oci": {
227
- "description": "Artifacts stored in registries that conform to OCI Distribution Specification"
382
+ "description": "Artifacts stored in registries that conform to OCI Distribution Specification",
383
+ "default_registry": null,
384
+ "examples": [
385
+ "pkg:oci/hello-world@sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042",
386
+ "pkg:oci/nginx@1.21.6",
387
+ "pkg:oci/ubuntu@20.04"
388
+ ]
228
389
  },
229
390
  "pub": {
230
391
  "description": "Dart and Flutter packages",
392
+ "default_registry": "https://pub.dartlang.org",
393
+ "examples": [
394
+ "pkg:pub/http@0.13.5",
395
+ "pkg:pub/flutter@3.3.10",
396
+ "pkg:pub/provider@6.0.5"
397
+ ],
231
398
  "registry_config": {
232
399
  "base_url": "https://pub.dev/packages",
233
400
  "route_patterns": [
234
401
  "https://pub.dev/packages/:name"
235
402
  ],
403
+ "reverse_regex": "^https://pub\\.dev/packages/([^/?#]+)",
236
404
  "components": {
237
405
  "namespace": false,
238
406
  "version_in_url": false
@@ -241,6 +409,12 @@
241
409
  },
242
410
  "pypi": {
243
411
  "description": "Python packages",
412
+ "default_registry": "https://pypi.org",
413
+ "examples": [
414
+ "pkg:pypi/django@4.1.4",
415
+ "pkg:pypi/requests@2.28.1",
416
+ "pkg:pypi/numpy@1.24.1"
417
+ ],
244
418
  "registry_config": {
245
419
  "base_url": "https://pypi.org/project",
246
420
  "route_patterns": [
@@ -257,21 +431,45 @@
257
431
  }
258
432
  },
259
433
  "qpkg": {
260
- "description": "QNX packages"
434
+ "description": "QNX packages",
435
+ "default_registry": null,
436
+ "examples": [
437
+ "pkg:qpkg/qnx/libc@7.1.0",
438
+ "pkg:qpkg/qnx/procnto-smp@7.1.0",
439
+ "pkg:qpkg/qnx/ph@7.1.0"
440
+ ]
261
441
  },
262
442
  "rpm": {
263
- "description": "RPMs"
443
+ "description": "RPMs",
444
+ "default_registry": null,
445
+ "examples": [
446
+ "pkg:rpm/fedora/curl@7.87.0-1.fc37?distro=fedora-37",
447
+ "pkg:rpm/centos/httpd@2.4.51-7.el8_5?distro=centos-8",
448
+ "pkg:rpm/opensuse/git@2.38.1-1.1?distro=opensuse-tumbleweed"
449
+ ]
264
450
  },
265
451
  "swid": {
266
- "description": "Software Identification (SWID) tags"
452
+ "description": "Software Identification (SWID) tags",
453
+ "default_registry": null,
454
+ "examples": [
455
+ "pkg:swid/microsoft.com/Microsoft%20Office@16.0.12345.67890",
456
+ "pkg:swid/adobe.com/Photoshop@23.1.0",
457
+ "pkg:swid/oracle.com/Java%20SE@8u351"
458
+ ]
267
459
  },
268
460
  "swift": {
269
461
  "description": "Swift packages",
462
+ "default_registry": null,
463
+ "examples": [
464
+ "pkg:swift/github.com/Alamofire/Alamofire@5.6.4",
465
+ "pkg:swift/github.com/apple/swift-package-manager@1.7.0"
466
+ ],
270
467
  "registry_config": {
271
468
  "base_url": "https://swiftpackageindex.com",
272
469
  "route_patterns": [
273
470
  "https://swiftpackageindex.com/:namespace/:name"
274
471
  ],
472
+ "reverse_regex": "^https://swiftpackageindex\\.com/([^/?#]+)/([^/?#]+)",
275
473
  "components": {
276
474
  "namespace": true,
277
475
  "namespace_required": true,
@@ -281,6 +479,11 @@
281
479
  },
282
480
  "deno": {
283
481
  "description": "Deno packages",
482
+ "default_registry": null,
483
+ "examples": [
484
+ "pkg:deno/oak@12.0.0",
485
+ "pkg:deno/std@0.177.0#http/server"
486
+ ],
284
487
  "registry_config": {
285
488
  "base_url": "https://deno.land/x",
286
489
  "route_patterns": [
@@ -297,6 +500,11 @@
297
500
  },
298
501
  "homebrew": {
299
502
  "description": "Homebrew packages",
503
+ "default_registry": null,
504
+ "examples": [
505
+ "pkg:homebrew/wget@1.21.3",
506
+ "pkg:homebrew/node@19.6.0"
507
+ ],
300
508
  "registry_config": {
301
509
  "base_url": "https://formulae.brew.sh/formula",
302
510
  "route_patterns": [
@@ -311,11 +519,17 @@
311
519
  },
312
520
  "bioconductor": {
313
521
  "description": "Bioconductor packages",
522
+ "default_registry": null,
523
+ "examples": [
524
+ "pkg:bioconductor/IRanges@2.28.0",
525
+ "pkg:bioconductor/GenomicRanges@1.46.1"
526
+ ],
314
527
  "registry_config": {
315
528
  "base_url": "https://bioconductor.org/packages",
316
529
  "route_patterns": [
317
530
  "https://bioconductor.org/packages/:name"
318
531
  ],
532
+ "reverse_regex": "^https://bioconductor\\.org/packages/([^/?#]+)",
319
533
  "components": {
320
534
  "namespace": false,
321
535
  "version_in_url": false
@@ -324,12 +538,18 @@
324
538
  },
325
539
  "clojars": {
326
540
  "description": "Clojars packages",
541
+ "default_registry": null,
542
+ "examples": [
543
+ "pkg:clojars/org.clojure/clojure@1.11.1",
544
+ "pkg:clojars/ring/ring-core@1.9.5"
545
+ ],
327
546
  "registry_config": {
328
547
  "base_url": "https://clojars.org",
329
548
  "route_patterns": [
330
549
  "https://clojars.org/:namespace/:name",
331
550
  "https://clojars.org/:name"
332
551
  ],
552
+ "reverse_regex": "^https://clojars\\.org/(?:([^/?#]+)/)?([^/?#]+)",
333
553
  "components": {
334
554
  "namespace": true,
335
555
  "namespace_required": false,
@@ -339,6 +559,11 @@
339
559
  },
340
560
  "elm": {
341
561
  "description": "Elm packages",
562
+ "default_registry": null,
563
+ "examples": [
564
+ "pkg:elm/elm/http@2.0.0",
565
+ "pkg:elm/elm-community/json-extra@4.3.0"
566
+ ],
342
567
  "registry_config": {
343
568
  "base_url": "https://package.elm-lang.org/packages",
344
569
  "route_patterns": [
@@ -0,0 +1,154 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+ "$id": "./schemas/purl-types.schema.json",
4
+ "title": "PURL Types Configuration Schema",
5
+ "description": "JSON schema for PURL types and registry URL patterns configuration",
6
+ "type": "object",
7
+ "required": ["version", "description", "source", "last_updated", "types"],
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "format": "uri",
12
+ "description": "JSON Schema reference for this document"
13
+ },
14
+ "version": {
15
+ "type": "string",
16
+ "description": "Version of the configuration format",
17
+ "pattern": "^\\d+\\.\\d+\\.\\d+$"
18
+ },
19
+ "description": {
20
+ "type": "string",
21
+ "description": "Description of the configuration file purpose"
22
+ },
23
+ "source": {
24
+ "type": "string",
25
+ "format": "uri",
26
+ "description": "Source URL for the PURL specification"
27
+ },
28
+ "last_updated": {
29
+ "type": "string",
30
+ "format": "date",
31
+ "description": "Date when the configuration was last updated"
32
+ },
33
+ "types": {
34
+ "type": "object",
35
+ "description": "Map of PURL type names to their configurations",
36
+ "patternProperties": {
37
+ "^[a-z][a-z0-9]*$": {
38
+ "$ref": "#/definitions/purlType"
39
+ }
40
+ },
41
+ "additionalProperties": false
42
+ }
43
+ },
44
+ "additionalProperties": false,
45
+ "definitions": {
46
+ "purlType": {
47
+ "type": "object",
48
+ "required": ["description", "default_registry"],
49
+ "properties": {
50
+ "description": {
51
+ "type": "string",
52
+ "description": "Human-readable description of the package type"
53
+ },
54
+ "default_registry": {
55
+ "oneOf": [
56
+ {
57
+ "type": "string",
58
+ "format": "uri",
59
+ "description": "Default registry URL for this package type"
60
+ },
61
+ {
62
+ "type": "null",
63
+ "description": "No default registry for this package type"
64
+ }
65
+ ]
66
+ },
67
+ "examples": {
68
+ "type": "array",
69
+ "description": "Array of example PURL strings for this type",
70
+ "items": {
71
+ "type": "string",
72
+ "pattern": "^pkg:[a-z][a-z0-9]*/"
73
+ },
74
+ "uniqueItems": true
75
+ },
76
+ "registry_config": {
77
+ "$ref": "#/definitions/registryConfig"
78
+ }
79
+ },
80
+ "additionalProperties": false
81
+ },
82
+ "registryConfig": {
83
+ "type": "object",
84
+ "description": "Configuration for registry URL generation and parsing",
85
+ "properties": {
86
+ "base_url": {
87
+ "type": "string",
88
+ "format": "uri",
89
+ "description": "Base URL for registry operations"
90
+ },
91
+ "route_patterns": {
92
+ "type": "array",
93
+ "description": "Array of URL pattern templates for this registry",
94
+ "items": {
95
+ "type": "string",
96
+ "format": "uri-template"
97
+ },
98
+ "minItems": 1
99
+ },
100
+ "reverse_regex": {
101
+ "type": "string",
102
+ "description": "Regular expression for parsing registry URLs back to PURLs"
103
+ },
104
+ "components": {
105
+ "$ref": "#/definitions/componentConfig"
106
+ }
107
+ },
108
+ "additionalProperties": false
109
+ },
110
+ "componentConfig": {
111
+ "type": "object",
112
+ "description": "Configuration for PURL component handling",
113
+ "properties": {
114
+ "namespace": {
115
+ "type": "boolean",
116
+ "description": "Whether this type supports namespaces"
117
+ },
118
+ "namespace_required": {
119
+ "type": "boolean",
120
+ "description": "Whether namespace is required for this type"
121
+ },
122
+ "namespace_prefix": {
123
+ "type": "string",
124
+ "description": "Prefix character for namespaces (e.g., '@' for npm)"
125
+ },
126
+ "version_in_url": {
127
+ "type": "boolean",
128
+ "description": "Whether version can be included in registry URLs"
129
+ },
130
+ "version_path": {
131
+ "type": "string",
132
+ "description": "Path separator for version in URLs"
133
+ },
134
+ "version_prefix": {
135
+ "type": "string",
136
+ "description": "Prefix character for version in URLs (e.g., '@' for deno)"
137
+ },
138
+ "version_separator": {
139
+ "type": "string",
140
+ "description": "Separator character for version (e.g., '-' for hackage)"
141
+ },
142
+ "trailing_slash": {
143
+ "type": "boolean",
144
+ "description": "Whether URLs require trailing slash"
145
+ },
146
+ "default_version": {
147
+ "type": "string",
148
+ "description": "Default version string to use when none specified"
149
+ }
150
+ },
151
+ "additionalProperties": false
152
+ }
153
+ }
154
+ }