@bsv/dpp-profiles 0.3.0-beta.1

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 (96) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +64 -0
  3. package/dist/applicability.d.ts +96 -0
  4. package/dist/applicability.d.ts.map +1 -0
  5. package/dist/applicability.js +181 -0
  6. package/dist/applicability.js.map +1 -0
  7. package/dist/combinations.d.ts +30 -0
  8. package/dist/combinations.d.ts.map +1 -0
  9. package/dist/combinations.js +103 -0
  10. package/dist/combinations.js.map +1 -0
  11. package/dist/evidence-shapes.d.ts +198 -0
  12. package/dist/evidence-shapes.d.ts.map +1 -0
  13. package/dist/evidence-shapes.js +123 -0
  14. package/dist/evidence-shapes.js.map +1 -0
  15. package/dist/gs1-epc-binary.d.ts +81 -0
  16. package/dist/gs1-epc-binary.d.ts.map +1 -0
  17. package/dist/gs1-epc-binary.js +252 -0
  18. package/dist/gs1-epc-binary.js.map +1 -0
  19. package/dist/gs1-resolution.d.ts +392 -0
  20. package/dist/gs1-resolution.d.ts.map +1 -0
  21. package/dist/gs1-resolution.js +696 -0
  22. package/dist/gs1-resolution.js.map +1 -0
  23. package/dist/identifiers.d.ts +57 -0
  24. package/dist/identifiers.d.ts.map +1 -0
  25. package/dist/identifiers.js +117 -0
  26. package/dist/identifiers.js.map +1 -0
  27. package/dist/index.d.ts +235 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +124 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/manifest-v2.d.ts +87 -0
  32. package/dist/manifest-v2.d.ts.map +1 -0
  33. package/dist/manifest-v2.js +31 -0
  34. package/dist/manifest-v2.js.map +1 -0
  35. package/dist/mapping.d.ts +84 -0
  36. package/dist/mapping.d.ts.map +1 -0
  37. package/dist/mapping.js +88 -0
  38. package/dist/mapping.js.map +1 -0
  39. package/dist/projections.d.ts +233 -0
  40. package/dist/projections.d.ts.map +1 -0
  41. package/dist/projections.js +466 -0
  42. package/dist/projections.js.map +1 -0
  43. package/frozen.json +42 -0
  44. package/generated/consumer/battery-v2.json +2248 -0
  45. package/generated/consumer/battery-v3.json +4354 -0
  46. package/generated/consumer/general-v1.json +9 -0
  47. package/generated/consumer/general-v2.json +714 -0
  48. package/generated/consumer/textile-v1.json +101 -0
  49. package/generated/consumer/textile-v2.json +1033 -0
  50. package/generated/consumer/textile-v3.json +2011 -0
  51. package/generated/index.json +86 -0
  52. package/generated/mapping/battery@2.md +116 -0
  53. package/generated/mapping/battery@3.md +130 -0
  54. package/generated/mapping/general@2.md +50 -0
  55. package/generated/mapping/textile@2.md +61 -0
  56. package/generated/mapping/textile@3.md +73 -0
  57. package/generated/payload-schema/battery@2.public.schema.json +609 -0
  58. package/generated/payload-schema/battery@2.restricted.schema.json +377 -0
  59. package/generated/payload-schema/battery@3.public.schema.json +1364 -0
  60. package/generated/payload-schema/battery@3.restricted.schema.json +1097 -0
  61. package/generated/payload-schema/general@1.public.schema.json +37 -0
  62. package/generated/payload-schema/general@1.restricted.schema.json +9 -0
  63. package/generated/payload-schema/general@2.public.schema.json +352 -0
  64. package/generated/payload-schema/general@2.restricted.schema.json +52 -0
  65. package/generated/payload-schema/textile@1.public.schema.json +82 -0
  66. package/generated/payload-schema/textile@1.restricted.schema.json +22 -0
  67. package/generated/payload-schema/textile@2.public.schema.json +464 -0
  68. package/generated/payload-schema/textile@2.restricted.schema.json +78 -0
  69. package/generated/payload-schema/textile@3.public.schema.json +1299 -0
  70. package/generated/payload-schema/textile@3.restricted.schema.json +78 -0
  71. package/manifests/battery@2.json +4047 -0
  72. package/manifests/battery@3.json +6164 -0
  73. package/manifests/exchange/untp-0.7.0-jose@1.json +191 -0
  74. package/manifests/exchange/vc-di-ecdsa-rdfc-2019@1.json +74 -0
  75. package/manifests/exchange/vsc-draft-compat@0.1.0.json +64 -0
  76. package/manifests/general@1.json +148 -0
  77. package/manifests/general@2.json +1266 -0
  78. package/manifests/interoperability/epcis-json@1.json +69 -0
  79. package/manifests/interoperability/epcis-vsc@1.json +64 -0
  80. package/manifests/interoperability/gs1-digital-link@1.json +71 -0
  81. package/manifests/operator/federated-operators@1.json +54 -0
  82. package/manifests/operator/single-operator@1.json +52 -0
  83. package/manifests/textile@1.json +383 -0
  84. package/manifests/textile@2.json +1682 -0
  85. package/manifests/textile@3.json +2763 -0
  86. package/package.json +59 -0
  87. package/schemas/exchange-profile.schema.json +134 -0
  88. package/schemas/gs1/NOTICE.md +11 -0
  89. package/schemas/gs1/resolver-description-file-schema-1.2.0.json +124 -0
  90. package/schemas/gs1/resolver-linkset-context-1.2.1.jsonld +39 -0
  91. package/schemas/gs1/resolver-linkset-schema-1.2.1.json +96 -0
  92. package/schemas/interoperability-profile.schema.json +347 -0
  93. package/schemas/operator-profile.schema.json +108 -0
  94. package/schemas/product-identity.schema.json +45 -0
  95. package/schemas/profile-manifest-v2.schema.json +1087 -0
  96. package/schemas/profile-manifest.schema.json +291 -0
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@bsv/dpp-profiles",
3
+ "version": "0.3.0-beta.1",
4
+ "description": "Experimental prerelease: Canonical DPP industry, exchange, operator and interoperability profiles: immutable manifests, generated payload schemas and consumer documents, lifecycle mapping, GS1 identifier and discovery helpers, applicability evaluation and deterministic passport projection",
5
+ "license": "SEE LICENSE IN LICENSE",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./manifests/*": "./manifests/*",
15
+ "./schemas/*": "./schemas/*",
16
+ "./generated/*": "./generated/*",
17
+ "./frozen.json": "./frozen.json"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "manifests",
22
+ "schemas",
23
+ "generated",
24
+ "frozen.json",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.json && node scripts/build.mjs",
30
+ "generate": "node scripts/build.mjs",
31
+ "refreeze": "node scripts/build.mjs --refreeze",
32
+ "typecheck": "tsc -p tsconfig.json --noEmit",
33
+ "test": "vitest run"
34
+ },
35
+ "dependencies": {
36
+ "canonicalize": "4.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@bsv/dpp-core": "0.3.0-beta.1",
40
+ "@bsv/sdk": "2.4.2",
41
+ "ajv": "8.20.0",
42
+ "ajv-formats": "3.0.1",
43
+ "typescript": "^5.9.3",
44
+ "vitest": "4.1.11"
45
+ },
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git+https://github.com/bsv-blockchain/dpp.git",
49
+ "directory": "packages/dpp-profiles"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "registry": "https://registry.npmjs.org/",
54
+ "tag": "next"
55
+ },
56
+ "engines": {
57
+ "node": ">=22"
58
+ }
59
+ }
@@ -0,0 +1,134 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://bsv-blockchain.github.io/dpp/profiles/schemas/exchange-profile.schema.json",
4
+ "title": "DPP exchange profile manifest, version 1",
5
+ "description": "One credential representation beside the native record (spec/exchange.md section 2): its format, data model, pinned artefacts, proof suites, native evidence extension, anchoring rule, mappings and explicit unsupported items. An artefact without a digest is recorded as not retrieved and supports no claim.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["manifestVersion", "id", "version", "profile", "kind", "status", "title", "representation", "mediaType", "dataModel", "artefacts", "proofSuites", "anchoring", "nativeEvidenceExtension", "mappings", "unsupported", "sourceRefs"],
9
+ "properties": {
10
+ "manifestVersion": { "const": "1" },
11
+ "id": { "type": "string", "pattern": "^[a-z][a-z0-9.-]*$" },
12
+ "version": { "type": "string", "pattern": "^[0-9][0-9a-z.-]*$" },
13
+ "profile": { "type": "string", "pattern": "^[a-z][a-z0-9.-]*@[0-9][0-9a-z.-]*$" },
14
+ "kind": { "const": "exchange" },
15
+ "status": { "enum": ["proposed", "current", "superseded"] },
16
+ "title": { "type": "string", "minLength": 1 },
17
+ "description": { "type": "string" },
18
+ "representation": { "type": "string", "minLength": 1, "description": "The representation identifier a reader dispatches on." },
19
+ "mediaType": { "type": "string", "minLength": 1 },
20
+ "dataModel": { "type": "string", "minLength": 1 },
21
+ "specification": { "type": "string", "description": "Where in spec/ the representation's byte contract is defined." },
22
+ "artefacts": {
23
+ "type": "array",
24
+ "items": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["id", "kind", "uri", "version", "retrieval"],
28
+ "properties": {
29
+ "id": { "type": "string" },
30
+ "kind": { "enum": ["json-schema", "jsonld-context", "vocabulary", "specification"] },
31
+ "uri": { "type": "string" },
32
+ "version": { "type": "string" },
33
+ "digest": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
34
+ "retrieval": { "enum": ["pinned", "not-retrieved", "unavailable", "owned"], "description": "pinned: digest computed over retrieved bytes. not-retrieved: documented location, no bytes fetched yet. unavailable: the upstream location does not serve it. owned: published by this repository." },
35
+ "licence": { "type": "string" },
36
+ "notes": { "type": "string" }
37
+ },
38
+ "allOf": [
39
+ { "if": { "properties": { "retrieval": { "const": "pinned" } } }, "then": { "properties": { "digest": { "type": "string" } }, "required": ["digest"] } }
40
+ ]
41
+ }
42
+ },
43
+ "proofSuites": {
44
+ "type": "array",
45
+ "minItems": 1,
46
+ "items": {
47
+ "type": "object",
48
+ "additionalProperties": false,
49
+ "required": ["id", "support"],
50
+ "properties": {
51
+ "id": { "type": "string", "description": "For example ES256K, ES256, Ed25519Signature2020, bbs-2023, ecdsa-jcs-2019." },
52
+ "support": { "enum": ["issue-and-verify", "verify-only", "optional-dedicated-key", "not-supported"] },
53
+ "keyRule": { "type": "string", "description": "How the signing key relates to the issuer and to the BSV actor, and what it must never be derived from." },
54
+ "consumerMustConfirm": { "type": "boolean" },
55
+ "notes": { "type": "string" }
56
+ }
57
+ }
58
+ },
59
+ "anchoring": {
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": ["format", "bytesCommitted", "attestationIdRule", "subjectRule"],
63
+ "properties": {
64
+ "format": { "const": "bsv-attestation-anchor-v1" },
65
+ "bytesCommitted": { "type": "string" },
66
+ "attestationIdRule": { "type": "string" },
67
+ "subjectRule": { "type": "string" },
68
+ "attestationType": { "type": "string" }
69
+ }
70
+ },
71
+ "nativeEvidenceExtension": {
72
+ "type": "object",
73
+ "additionalProperties": false,
74
+ "required": ["schema", "version", "carried"],
75
+ "properties": {
76
+ "schema": { "type": "string" },
77
+ "version": { "type": "string" },
78
+ "carried": { "enum": ["required", "optional", "not-applicable"] },
79
+ "notes": { "type": "string" }
80
+ }
81
+ },
82
+ "mappings": {
83
+ "type": "array",
84
+ "items": {
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "required": ["nativeOperation", "externalEvent", "requires", "withoutEvidence"],
88
+ "properties": {
89
+ "nativeOperation": { "enum": ["ACTIVATE", "SOLD", "RESOLD", "REPAIRED", "RECYCLED", "EDIT", "TRANSFER"] },
90
+ "externalEvent": { "type": "string" },
91
+ "requires": { "type": "string" },
92
+ "withoutEvidence": { "enum": ["insufficient-data", "unsupported", "transformed"] }
93
+ }
94
+ }
95
+ },
96
+ "storage": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "description": "The four artefacts of spec/exchange.md section 3, named so a consumer implements them separately.",
100
+ "required": ["nativeClaim", "originalSecured", "decoded", "projection"],
101
+ "properties": {
102
+ "nativeClaim": { "type": "string" },
103
+ "originalSecured": { "type": "string" },
104
+ "decoded": { "type": "string" },
105
+ "projection": { "type": "string" }
106
+ }
107
+ },
108
+ "unsupported": {
109
+ "type": "array",
110
+ "items": {
111
+ "type": "object",
112
+ "additionalProperties": false,
113
+ "required": ["id", "reason"],
114
+ "properties": { "id": { "type": "string" }, "reason": { "type": "string" } }
115
+ }
116
+ },
117
+ "sourceRefs": {
118
+ "type": "array",
119
+ "items": {
120
+ "type": "object",
121
+ "additionalProperties": false,
122
+ "required": ["id", "name", "use"],
123
+ "properties": {
124
+ "id": { "type": "string" },
125
+ "name": { "type": "string" },
126
+ "reference": { "type": "string" },
127
+ "version": { "type": "string" },
128
+ "attribution": { "type": "string" },
129
+ "use": { "type": "string" }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,11 @@
1
+ # GS1-Conformant Resolver artefacts
2
+
3
+ The linkset schema, resolver description file schema and linkset context of the GS1-Conformant Resolver standard, retrieved unchanged from ref.gs1.org on 6 September 2026 and carried here so a resolver descriptor and a linkset can be validated against the published bytes without a network fetch. GS1 is the publisher and rights holder; the files are used under GS1's terms for its published standards artefacts (https://ref.gs1.org/standards/resolver/) and are not part of this repository's licence.
4
+
5
+ | File | Source URI | SHA-256 | Bytes |
6
+ | --- | --- | --- | --- |
7
+ | resolver-linkset-schema-1.2.1.json | https://ref.gs1.org/standards/resolver/1.2.1/linkset-schema | d2e23510f17558c29f9d1baf9e112a70df42efd6557a49dc9a317048973669f2 | 4696 |
8
+ | resolver-description-file-schema-1.2.0.json | https://ref.gs1.org/standards/resolver/1.2.0/description-file-schema | 99d505c7aa2004cde3277651e8db0e019eab61d2746b2631ddab3fec8a13617e | 3593 |
9
+ | resolver-linkset-context-1.2.1.jsonld | https://ref.gs1.org/standards/resolver/1.2.1/linkset-context | 05792d010165fa6f28cc9cc3463cc1668f522ac75c26abe5b2877ec4a37b1312 | 838 |
10
+
11
+ A test holds each file to its digest.
@@ -0,0 +1,124 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://ref.gs1.org/standards/resolver/1.2.0/description-file-schema",
4
+ "description": "The JSON schema for a conformant GS1 resolver description file to be placed at /.well-known/gs1resolver",
5
+ "type": "object",
6
+ "properties": {
7
+ "resolverRoot": {
8
+ "description": "The root URL of the resolver",
9
+ "type": "string",
10
+ "format": "uri"
11
+ },
12
+ "supportedPrimaryKeys": {
13
+ "description": "An array of primary keys supported by the resolver, provided as their numeric AI. The value 'all' indicates that all GS1 primary identification keys are supported",
14
+ "type": "array",
15
+ "items": {
16
+ "type": "string",
17
+ "enum": ["all", "01", "8006", "8013", "8010", "410", "411", "412", "413", "414", "415", "417", "8017", "8018", "255", "00", "253", "401", "402", "8003", "8004"]
18
+ }
19
+ },
20
+ "name": {
21
+ "description": "The name of the resolver",
22
+ "type": "string"
23
+ },
24
+ "supportedLinkType": {
25
+ "type": "array",
26
+ "items": {
27
+ "properties": {
28
+ "namespace": {
29
+ "description": "A namespace URI recognised by the resolver",
30
+ "type": "string",
31
+ "format": "uri"
32
+ },
33
+ "prefix": {
34
+ "description": "The prefix assigned to this URI for use in CURIEs, including the colon",
35
+ "type": "string",
36
+ "pattern": "^[a-zA-Z_][A-Za-z0-9_-]*?:$"
37
+ }
38
+ }
39
+ }
40
+ },
41
+ "linkTypeDefaultCanBeLinkset": {
42
+ "description": "Boolean flag stating whether the resolver supports the option to make 'linkset' the default linkType.",
43
+ "type": "boolean",
44
+ "default": false
45
+ },
46
+ "supportedContextValuesEnumerated": {
47
+ "description": "Enumerated list of values for context supported by this resolver",
48
+ "type": "array",
49
+ "items": {
50
+ "type": "string"
51
+ }
52
+ },
53
+ "supportedContextValuesExternal": {
54
+ "description": "External lists of supported values for context recognised by this resolver",
55
+ "type": "array",
56
+ "items": {
57
+ "type": "object",
58
+ "properties": {
59
+ "nameOfList": {
60
+ "description": "The name of the list of values",
61
+ "type": "string"
62
+ },
63
+ "url": {
64
+ "description": "The URL of the external list",
65
+ "type": "string",
66
+ "format": "uri"
67
+ }
68
+ }
69
+ }
70
+ },
71
+ "contact": {
72
+ "description": "Contact details for the resolver operator, uses VCard",
73
+ "type": "object",
74
+ "properties": {
75
+ "fn": {
76
+ "description": "Full name",
77
+ "type": "string"
78
+ },
79
+ "hasAddress": {
80
+ "description": "Address info for the resolver operator",
81
+ "type": "object",
82
+ "properties": {
83
+ "streetAddress": {
84
+ "description": "Street address of hte operator",
85
+ "type": "string"
86
+ },
87
+ "locality": {
88
+ "description": "locality of the operator",
89
+ "type": "string"
90
+ },
91
+ "region": {
92
+ "description": "region of the operator",
93
+ "type": "string"
94
+ },
95
+ "postal-code": {
96
+ "decription": "post code of the operator",
97
+ "type": "string"
98
+ }
99
+ }
100
+ }
101
+ },
102
+ "hasTelephone": {
103
+ "description": "A contact telephone number",
104
+ "type": "string",
105
+ "format": "uri"
106
+ }
107
+ },
108
+ "extensionProfile": {
109
+ "description": "A link to a document that describes any extended key=value pairs supported by the resolver and/or an additional supported compression/decompression capability",
110
+ "type": "string",
111
+ "format": "uri"
112
+ },
113
+
114
+ "jsonLdContextLocation": {
115
+ "description": "The location of the JSON-LD context file referenced when serving linksets as JSON",
116
+ "type": "string",
117
+ "format": "uri"
118
+ }
119
+
120
+
121
+ },
122
+ "required": ["resolverRoot", "supportedPrimaryKeys"]
123
+ }
124
+
@@ -0,0 +1,39 @@
1
+ {
2
+ "@context": {
3
+ "schema": "https://schema.org/",
4
+ "gs1": "http://gs1.org/voc/",
5
+ "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
6
+ "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
7
+ "owl": "http://www.w3.org/2002/07/owl#",
8
+ "dcterms": "http://purl.org/dc/terms/",
9
+ "xsd": "http://www.w3.org/2001/XMLSchema#",
10
+ "skos": "http://www.w3.org/2004/02/skos/core#",
11
+ "gs1:value": {
12
+ "@type": "xsd:float"
13
+ },
14
+ "@protected": true,
15
+ "href": "@id",
16
+ "hreflang": {
17
+ "@id": "dcterms:language",
18
+ "@container": "@set"
19
+ },
20
+ "title": {
21
+ "@id": "dcterms:title"
22
+ },
23
+ "title*": {
24
+ "@id": "dcterms:title",
25
+ "@container": "@set"
26
+ },
27
+ "type": {
28
+ "@id": "dcterms:format"
29
+ },
30
+ "modified": {
31
+ "@id": "dcterms:modified"
32
+ },
33
+ "itemDescription": {
34
+ "@id": "rdfs:comment"
35
+ },
36
+ "linkset": "@nest",
37
+ "anchor": "@id"
38
+ }
39
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "@id": "https://ref.gs1.org/standards/resolver/linkset-schema",
4
+ "title": "JSON schema for linksets as defined in RFC 9264",
5
+ "type": "object",
6
+ "properties": {
7
+ "linkset": {
8
+ "description": "The linkset",
9
+ "type": "array",
10
+ "items": {
11
+ "type": "object",
12
+ "properties": {
13
+ "anchor": {
14
+ "description": "The URL at the root of the linkset, a.k.a the link context",
15
+ "type": "string",
16
+ "pattern": "^https?:\/\/[a-zA-z0-9./]+"
17
+ },
18
+ "itemDescription": {
19
+ "name": "Item description",
20
+ "description": "A description of the item. There are no restrictions on this so that, for example, it does not have to be a product's name. This has been deprecated in favour of description.",
21
+ "type": "string"
22
+ },
23
+ "description": {
24
+ "name": "Description",
25
+ "description": "A description of the item. There are no restrictions on this so that, for example, it does not have to be a product's name. Preferred alternative to itemDescription which has been deprecated",
26
+ "type": "string"
27
+ }
28
+ },
29
+ "patternProperties": {
30
+ "(?!(anchor|itemDescription|description))^([a-z-]+$)|(^https?:\/\/[a-zA-z0-9./]+$)": {
31
+ "title": "Link object schema",
32
+ "description": "The schema for each link context object for each link relation",
33
+ "type": "array",
34
+ "items": {
35
+ "type": "object",
36
+ "properties": {
37
+ "href": {
38
+ "name": "href",
39
+ "description": "The target URL",
40
+ "type": "string",
41
+ "pattern": "^https?:\/\/[a-zA-z0-9./]+"
42
+ },
43
+ "title": {
44
+ "title": "title",
45
+ "description": "A human-readable title for the link",
46
+ "type": "string"
47
+ },
48
+ "hreflang": {
49
+ "name": "hreflang",
50
+ "description": "The human language(s) of the target resource",
51
+ "type": "array",
52
+ "items": {
53
+ "type": "string",
54
+ "pattern": "(^\\w{2}$)|(^\\w{2}-\\w{2}$)"
55
+ }
56
+ },
57
+ "type": {
58
+ "name": "Type",
59
+ "description": "The content type (MIME type) of the target resource",
60
+ "type": "string",
61
+ "pattern": "\\w+/[-+.\\w]+"
62
+ },
63
+ "context": {
64
+ "name":"Context",
65
+ "description":"Any additional descriptor for the link, typically a geography or jurisdiction in which the link applies",
66
+ "type":"array"
67
+ },
68
+ "fwqs" : {
69
+ "name":"Forward query strings",
70
+ "type": "boolean"
71
+ },
72
+ "public" : {
73
+ "name":"Link can be shared publicly",
74
+ "type": "boolean"
75
+ }
76
+ },
77
+ "required": [
78
+ "href",
79
+ "title"
80
+ ],
81
+ "additionalProperties": false
82
+ }
83
+ }
84
+ },
85
+ "required": [
86
+ "anchor"
87
+ ],
88
+ "additionalProperties": false
89
+ }
90
+ }
91
+ },
92
+ "required": [
93
+ "linkset"
94
+ ],
95
+ "additionalProperties": false
96
+ }