From: Lady Date: Mon, 29 May 2023 20:11:45 +0000 (-0700) Subject: Add `::iriSpace` and use it in I·R·I handling X-Git-Url: https://git.ladys.computer/Etiquette/commitdiff_plain/6365487166d73a75e1c66b7c8d5683ac46741ed2?ds=inline Add `::iriSpace` and use it in I·R·I handling This can be recorded as a VoID property and is necessary for converting I·R·I’s back into their identifiers. --- diff --git a/model.js b/model.js index 6963a16..48e6813 100644 --- a/model.js +++ b/model.js @@ -239,15 +239,19 @@ class Tag { * generating the value of `TagSystem::Tag`. It isn’t possible to * access this function in its unbound form from outside this module. * + * ☡ This function throws if the I·R·I is not in the `.iriSpace` of + * the `TagSystem` associated with this constructor. + * * ※ If the I·R·I is not recognized, this function returns `null`. */ static fromIRI(system, storage, iri) { const name = `${iri}`; - const prefix = - `https://${system.authorityName}/tag:${system.taggingEntity}:`; + const prefix = `${system.iriSpace}`; if (!name.startsWith(prefix)) { // The I·R·I does not begin with the expected prefix. - return null; + throw new RangeError( + `I·R·I did not begin with the expected prefix: ${iri}`, + ); } else { // The I·R·I begins with the expected prefix. const identifier = name.substring(prefix.length); @@ -298,7 +302,7 @@ class Tag { if (!tagName.startsWith(tagPrefix)) { // The Tag U·R·I does not begin with the expected prefix. throw new RangeError( - `Tag U·R·I did not begin with the expected prefix: ${tagName}`, + `Tag U·R·I did not begin with the expected prefix: ${tagURI}`, ); } else { // The I·R·I begins with the expected prefix. @@ -973,10 +977,13 @@ class Tag { /** Returns the I·R·I for this `Tag`. */ get iri() { - const tagURI = this.tagURI; - return tagURI == null - ? null - : `https://${this.authorityName}/${tagURI}`; + const { identifier, iriSpace } = this; + return identifier == null ? null : `${iriSpace}${identifier}`; + } + + /** Returns the I·R·I space for this `Tag`. */ + get iriSpace() { + return this.#system.iriSpace; } /** Returns the kind of this `Tag`. */ @@ -1700,7 +1707,14 @@ export class TagSystem { /** Returns the I·R·I for this `TagSystem`. */ get iri() { - return `https://${this.authorityName}/${this.tagURI}`; + return `${this.iriSpace}${this.identifier}`; + } + + /** + * Returns the prefix used for I·R·I’s of `Tag`s in this `TagSystem`. + */ + get iriSpace() { + return `https://${this.authorityName}/tag:${this.taggingEntity}:`; } /** Returns the Tag U·R·I for this `TagSystem`. */ diff --git a/model.test.js b/model.test.js index 7190830..15a2f54 100644 --- a/model.test.js +++ b/model.test.js @@ -186,8 +186,8 @@ describe("TagSystem", () => { ); }); - it("[[Call]] returns null if passed an invalid I·R·I", () => { - assertStrictEquals(Tag.fromIRI(`bad iri`), null); + it("[[Call]] throws if passed an invalid I·R·I", () => { + assertThrows(() => {Tag.fromIRI(`bad iri`)}); }); }); @@ -233,11 +233,11 @@ describe("TagSystem", () => { it("[[Call]] returns null if no tag with the given Tag U·R·I has been persisted", () => { assertStrictEquals( - Tag.fromIRI(`tag:${system.taggingEntity}:`), + Tag.fromTagURI(`tag:${system.taggingEntity}:`), null, ); assertStrictEquals( - Tag.fromIRI(`tag:${system.taggingEntity}:000-0000`), + Tag.fromTagURI(`tag:${system.taggingEntity}:000-0000`), null, ); }); @@ -763,6 +763,8 @@ describe("TagSystem", () => { // `::iri` is tested by a `.fromIRI`. + // `::iriSpace` is tested by a `.fromIRI`. + // `::kind` is tested by the constructor. describe("::narrowerTags", () => { @@ -1028,6 +1030,25 @@ describe("TagSystem", () => { }); }); + describe("::iriSpace", () => { + it("[[Get]] returns the I·R·I space", () => { + const system = new TagSystem("etaoin.example", "1972-12-31"); + assertStrictEquals( + system.iriSpace, + "https://etaoin.example/tag:etaoin.example,1972-12-31:", + ); + const system2 = new TagSystem( + "etaoin.example", + "1972-12-31", + "etaoin", + ); + assertStrictEquals( + system2.iriSpace, + "https://etaoin.example/tag:etaoin.example,1972-12-31:", + ); + }); + }); + describe("::tagURI", () => { it("[[Get]] returns the Tag U·R·I", () => { const system = new TagSystem("etaoin.example", "1972-12-31");