@fedify/vocab-runtime 2.3.0-dev.1069 → 2.3.0-dev.1099
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/deno.json +4 -3
- package/dist/{chunk-CKQMccvm.cjs → chunk-M78iaK0I.cjs} +1 -0
- package/dist/jsonld.cjs +3 -2
- package/dist/jsonld.d.cts +1 -0
- package/dist/jsonld.d.ts +1 -0
- package/dist/jsonld.js +1 -0
- package/dist/mod.cjs +4325 -4359
- package/dist/mod.d.cts +1 -0
- package/dist/mod.d.ts +1 -0
- package/dist/mod.js +4322 -4356
- package/dist/temporal.cjs +60 -0
- package/dist/temporal.d.cts +54 -0
- package/dist/temporal.d.ts +54 -0
- package/dist/temporal.js +58 -0
- package/dist/tests/{chunk-Do9eywBl.cjs → chunk-C2EiDwsr.cjs} +1 -1
- package/dist/tests/decimal.test.cjs +4 -4
- package/dist/tests/decimal.test.mjs +3 -3
- package/dist/tests/docloader-CjraMMLV.cjs +4543 -0
- package/dist/tests/docloader-svYZTdwU.mjs +4531 -0
- package/dist/tests/docloader.test.cjs +4 -4
- package/dist/tests/docloader.test.mjs +3 -3
- package/dist/tests/internal/multicodec.test.cjs +1 -1
- package/dist/tests/{key-BeTHFQJK.mjs → key-CrrK9mYh.mjs} +1 -1
- package/dist/tests/{key-DTTIntwb.cjs → key-pMmqUKuo.cjs} +2 -2
- package/dist/tests/key.test.cjs +3 -3
- package/dist/tests/key.test.mjs +2 -2
- package/dist/tests/langstr.test.cjs +2 -2
- package/dist/tests/link.test.cjs +1 -1
- package/dist/tests/multibase/multibase.test.cjs +2 -2
- package/dist/tests/multibase/multibase.test.mjs +1 -1
- package/dist/tests/{multibase-BgU9XRf7.mjs → multibase-B4bvakyA.mjs} +3 -0
- package/dist/tests/{multibase-F7LtMMsK.cjs → multibase-Bz_UUDtL.cjs} +5 -2
- package/dist/tests/{request-CARANH2d.mjs → request-Bpm2JArn.mjs} +1 -1
- package/dist/tests/{request-D3V3yzXZ.cjs → request-DzaqEN3w.cjs} +3 -3
- package/dist/tests/request.test.cjs +3 -3
- package/dist/tests/request.test.mjs +1 -1
- package/dist/tests/temporal.test.cjs +134 -0
- package/dist/tests/temporal.test.d.cts +1 -0
- package/dist/tests/temporal.test.d.mts +1 -0
- package/dist/tests/temporal.test.mjs +134 -0
- package/dist/tests/{url-Cj9-Ycue.cjs → url-CEmGms8t.cjs} +1 -1
- package/dist/tests/url.test.cjs +2 -2
- package/package.json +17 -6
- package/src/temporal.test.ts +121 -0
- package/src/temporal.ts +74 -0
- package/tsdown.config.ts +6 -3
- package/dist/tests/docloader-CJ2-f1JD.cjs +0 -4581
- package/dist/tests/docloader-CYy6F-CT.mjs +0 -4569
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
2
|
-
const require_docloader = require("./docloader-
|
|
3
|
-
const require_request = require("./request-
|
|
4
|
-
const require_url = require("./url-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_docloader = require("./docloader-CjraMMLV.cjs");
|
|
3
|
+
const require_request = require("./request-DzaqEN3w.cjs");
|
|
4
|
+
const require_url = require("./url-CEmGms8t.cjs");
|
|
5
5
|
let node_assert = require("node:assert");
|
|
6
6
|
let node_test = require("node:test");
|
|
7
7
|
//#region ../../node_modules/.pnpm/glob-to-regexp@0.4.1/node_modules/glob-to-regexp/index.js
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as preloadedContexts, t as getDocumentLoader } from "./docloader-
|
|
2
|
-
import { t as FetchError } from "./request-
|
|
1
|
+
import { n as preloadedContexts, t as getDocumentLoader } from "./docloader-svYZTdwU.mjs";
|
|
2
|
+
import { t as FetchError } from "./request-Bpm2JArn.mjs";
|
|
3
3
|
import { t as UrlError } from "./url-BzGwIxB4.mjs";
|
|
4
4
|
import { deepStrictEqual, ok, rejects } from "node:assert";
|
|
5
5
|
import { test } from "node:test";
|
|
@@ -10,7 +10,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
10
10
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
11
11
|
var __getProtoOf = Object.getPrototypeOf;
|
|
12
12
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
13
|
-
var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
13
|
+
var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
|
|
14
14
|
var __copyProps = (to, from, except, desc) => {
|
|
15
15
|
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
16
16
|
key = keys[i];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as getMulticodecPrefix, r as removeMulticodecPrefix, t as addMulticodecPrefix } from "./multicodec-CyFp54fI.mjs";
|
|
2
|
-
import { n as encodeMultibase, t as decodeMultibase } from "./multibase-
|
|
2
|
+
import { n as encodeMultibase, t as decodeMultibase } from "./multibase-B4bvakyA.mjs";
|
|
3
3
|
import { Integer, Sequence } from "asn1js";
|
|
4
4
|
import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
|
|
5
5
|
import { decodeBase64Url } from "byte-encodings/base64url";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require("./chunk-
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
const require_multicodec = require("./multicodec-CxGVGa91.cjs");
|
|
3
|
-
const require_multibase = require("./multibase-
|
|
3
|
+
const require_multibase = require("./multibase-Bz_UUDtL.cjs");
|
|
4
4
|
let asn1js = require("asn1js");
|
|
5
5
|
let byte_encodings_base64 = require("byte-encodings/base64");
|
|
6
6
|
let byte_encodings_base64url = require("byte-encodings/base64url");
|
package/dist/tests/key.test.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require("./chunk-
|
|
2
|
-
const require_key = require("./key-
|
|
3
|
-
const require_multibase = require("./multibase-
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_key = require("./key-pMmqUKuo.cjs");
|
|
3
|
+
const require_multibase = require("./multibase-Bz_UUDtL.cjs");
|
|
4
4
|
let node_assert = require("node:assert");
|
|
5
5
|
let node_test = require("node:test");
|
|
6
6
|
//#region src/key.test.ts
|
package/dist/tests/key.test.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as importPkcs1, c as importJwk, i as importPem, n as exportSpki, o as importSpki, r as importMultibaseKey, s as exportJwk, t as exportMultibaseKey } from "./key-
|
|
2
|
-
import { n as encodeMultibase } from "./multibase-
|
|
1
|
+
import { a as importPkcs1, c as importJwk, i as importPem, n as exportSpki, o as importSpki, r as importMultibaseKey, s as exportJwk, t as exportMultibaseKey } from "./key-CrrK9mYh.mjs";
|
|
2
|
+
import { n as encodeMultibase } from "./multibase-B4bvakyA.mjs";
|
|
3
3
|
import { deepStrictEqual, rejects } from "node:assert";
|
|
4
4
|
import { test } from "node:test";
|
|
5
5
|
//#region src/key.test.ts
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
const require_langstr = require("./langstr-CbAxaeEZ.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
let node_util = require("node:util");
|
|
6
|
-
node_util = require_chunk.__toESM(node_util);
|
|
6
|
+
node_util = require_chunk.__toESM(node_util, 1);
|
|
7
7
|
//#region src/langstr.test.ts
|
|
8
8
|
(0, node_test.test)("new LanguageString()", () => {
|
|
9
9
|
const langStr = new require_langstr.LanguageString("Hello", "en");
|
package/dist/tests/link.test.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require("../chunk-
|
|
2
|
-
const require_multibase = require("../multibase-
|
|
1
|
+
require("../chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_multibase = require("../multibase-Bz_UUDtL.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
//#region src/multibase/multibase.test.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as decodeText, i as names, n as encodeMultibase, o as encodeText, r as codes, t as decodeMultibase } from "../multibase-
|
|
1
|
+
import { a as decodeText, i as names, n as encodeMultibase, o as encodeText, r as codes, t as decodeMultibase } from "../multibase-B4bvakyA.mjs";
|
|
2
2
|
import { deepStrictEqual } from "node:assert";
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
//#region src/multibase/multibase.test.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
let _multiformats_base_x = require("@multiformats/base-x");
|
|
3
|
-
_multiformats_base_x = require_chunk.__toESM(_multiformats_base_x);
|
|
3
|
+
_multiformats_base_x = require_chunk.__toESM(_multiformats_base_x, 1);
|
|
4
4
|
//#region src/multibase/util.ts
|
|
5
5
|
const textDecoder = new TextDecoder();
|
|
6
6
|
const decodeText = (bytes) => textDecoder.decode(bytes);
|
|
@@ -21,6 +21,9 @@ function concat(arrs, length) {
|
|
|
21
21
|
* Class to encode/decode in the supported Bases
|
|
22
22
|
*/
|
|
23
23
|
var Base = class {
|
|
24
|
+
name;
|
|
25
|
+
code;
|
|
26
|
+
alphabet;
|
|
24
27
|
codeBuf;
|
|
25
28
|
codec;
|
|
26
29
|
constructor(name, code, factory, alphabet) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
let node_process = require("node:process");
|
|
3
|
-
node_process = require_chunk.__toESM(node_process);
|
|
3
|
+
node_process = require_chunk.__toESM(node_process, 1);
|
|
4
4
|
//#region deno.json
|
|
5
5
|
var name = "@fedify/vocab-runtime";
|
|
6
|
-
var version = "2.3.0-dev.
|
|
6
|
+
var version = "2.3.0-dev.1099+fafcfa78";
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/request.ts
|
|
9
9
|
/**
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
2
|
-
const require_request = require("./request-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_request = require("./request-DzaqEN3w.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
let node_process = require("node:process");
|
|
6
|
-
node_process = require_chunk.__toESM(node_process);
|
|
6
|
+
node_process = require_chunk.__toESM(node_process, 1);
|
|
7
7
|
//#region src/request.test.ts
|
|
8
8
|
(0, node_test.test)("getUserAgent()", () => {
|
|
9
9
|
if ("Deno" in globalThis) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as version, r as getUserAgent } from "./request-
|
|
1
|
+
import { o as version, r as getUserAgent } from "./request-Bpm2JArn.mjs";
|
|
2
2
|
import { deepStrictEqual } from "node:assert";
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
import process from "node:process";
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
let node_assert = require("node:assert");
|
|
3
|
+
let node_test = require("node:test");
|
|
4
|
+
let _js_temporal_polyfill = require("@js-temporal/polyfill");
|
|
5
|
+
//#region src/temporal.ts
|
|
6
|
+
/**
|
|
7
|
+
* Type guards for `Temporal` namespace objects.
|
|
8
|
+
*
|
|
9
|
+
* Fedify accepts both runtime polyfills (e.g. `@js-temporal/polyfill`,
|
|
10
|
+
* `temporal-polyfill`) and the host's native `Temporal` implementation
|
|
11
|
+
* (Node.js 26+, Bun, Deno). The guards below rely on `Symbol.toStringTag`,
|
|
12
|
+
* which is mandated by the Temporal specification, so they accept any
|
|
13
|
+
* spec-conformant implementation regardless of which class produced the
|
|
14
|
+
* value.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Checks whether the given value is a `Temporal.Instant` object, regardless
|
|
20
|
+
* of whether it came from a polyfill or the host's native implementation.
|
|
21
|
+
*
|
|
22
|
+
* The guard verifies the spec-mandated `Symbol.toStringTag`, that the
|
|
23
|
+
* `epochNanoseconds` accessor exposes a `bigint`, and that `toString` is
|
|
24
|
+
* not the default inherited from `Object.prototype`. Together they reject
|
|
25
|
+
* bare objects whose tag was set to `"Temporal.Instant"` without exposing
|
|
26
|
+
* the rest of the shape; the `toString` check in particular prevents a
|
|
27
|
+
* spoof from reaching the JSON-LD serializer (which calls `toString()`)
|
|
28
|
+
* and emitting `"[object Temporal.Instant]"` instead of an RFC 3339
|
|
29
|
+
* timestamp.
|
|
30
|
+
*
|
|
31
|
+
* @param value The value to test.
|
|
32
|
+
* @returns `true` if the value reports `Temporal.Instant` via
|
|
33
|
+
* `Symbol.toStringTag`, exposes a `bigint`-valued
|
|
34
|
+
* `epochNanoseconds`, and overrides `toString`; `false` otherwise.
|
|
35
|
+
*/
|
|
36
|
+
function isTemporalInstant(value) {
|
|
37
|
+
return typeof value === "object" && value !== null && Object.prototype.toString.call(value) === "[object Temporal.Instant]" && "epochNanoseconds" in value && typeof value.epochNanoseconds === "bigint" && "toString" in value && typeof value.toString === "function" && value.toString !== Object.prototype.toString;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks whether the given value is a `Temporal.Duration` object, regardless
|
|
41
|
+
* of whether it came from a polyfill or the host's native implementation.
|
|
42
|
+
*
|
|
43
|
+
* The guard verifies the spec-mandated `Symbol.toStringTag`, that the
|
|
44
|
+
* `sign` accessor returns one of the three spec-valid values (`-1`, `0`,
|
|
45
|
+
* or `1`), and that `toString` is not the default inherited from
|
|
46
|
+
* `Object.prototype`. Together they reject bare objects whose tag was set
|
|
47
|
+
* to `"Temporal.Duration"` without exposing the rest of the shape; the
|
|
48
|
+
* `toString` check in particular prevents a spoof from reaching the
|
|
49
|
+
* JSON-LD serializer (which calls `toString()`) and emitting
|
|
50
|
+
* `"[object Temporal.Duration]"` instead of an ISO 8601 duration.
|
|
51
|
+
*
|
|
52
|
+
* @param value The value to test.
|
|
53
|
+
* @returns `true` if the value reports `Temporal.Duration` via
|
|
54
|
+
* `Symbol.toStringTag`, exposes a `sign` of `-1`, `0`, or `1`,
|
|
55
|
+
* and overrides `toString`; `false` otherwise.
|
|
56
|
+
*/
|
|
57
|
+
function isTemporalDuration(value) {
|
|
58
|
+
return typeof value === "object" && value !== null && Object.prototype.toString.call(value) === "[object Temporal.Duration]" && "sign" in value && (value.sign === -1 || value.sign === 0 || value.sign === 1) && "toString" in value && typeof value.toString === "function" && value.toString !== Object.prototype.toString;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/temporal.test.ts
|
|
62
|
+
(0, node_test.test)("isTemporalInstant() accepts polyfill instances", () => {
|
|
63
|
+
(0, node_assert.strictEqual)(isTemporalInstant(_js_temporal_polyfill.Temporal.Instant.from("2026-05-14T00:00:00Z")), true);
|
|
64
|
+
});
|
|
65
|
+
(0, node_test.test)("isTemporalInstant() accepts spec-compliant non-polyfill objects", () => {
|
|
66
|
+
(0, node_assert.strictEqual)(isTemporalInstant(Object.create(null, {
|
|
67
|
+
[Symbol.toStringTag]: { value: "Temporal.Instant" },
|
|
68
|
+
epochNanoseconds: { value: 0n },
|
|
69
|
+
toString: { value: () => "1970-01-01T00:00:00Z" }
|
|
70
|
+
})), true);
|
|
71
|
+
});
|
|
72
|
+
(0, node_test.test)("isTemporalInstant() rejects unrelated values", () => {
|
|
73
|
+
(0, node_assert.strictEqual)(isTemporalInstant(null), false);
|
|
74
|
+
(0, node_assert.strictEqual)(isTemporalInstant(void 0), false);
|
|
75
|
+
(0, node_assert.strictEqual)(isTemporalInstant("2026-05-14T00:00:00Z"), false);
|
|
76
|
+
(0, node_assert.strictEqual)(isTemporalInstant(/* @__PURE__ */ new Date()), false);
|
|
77
|
+
(0, node_assert.strictEqual)(isTemporalInstant(_js_temporal_polyfill.Temporal.Duration.from({ seconds: 1 })), false);
|
|
78
|
+
});
|
|
79
|
+
(0, node_test.test)("isTemporalInstant() rejects bare objects tagged but missing shape", () => {
|
|
80
|
+
(0, node_assert.strictEqual)(isTemporalInstant(Object.create(null, { [Symbol.toStringTag]: { value: "Temporal.Instant" } })), false);
|
|
81
|
+
});
|
|
82
|
+
(0, node_test.test)("isTemporalInstant() rejects non-bigint epochNanoseconds", () => {
|
|
83
|
+
(0, node_assert.strictEqual)(isTemporalInstant(Object.create(null, {
|
|
84
|
+
[Symbol.toStringTag]: { value: "Temporal.Instant" },
|
|
85
|
+
epochNanoseconds: { value: 0 },
|
|
86
|
+
toString: { value: () => "1970-01-01T00:00:00Z" }
|
|
87
|
+
})), false);
|
|
88
|
+
});
|
|
89
|
+
(0, node_test.test)("isTemporalInstant() rejects default Object.prototype.toString", () => {
|
|
90
|
+
(0, node_assert.strictEqual)(isTemporalInstant({
|
|
91
|
+
[Symbol.toStringTag]: "Temporal.Instant",
|
|
92
|
+
epochNanoseconds: 0n
|
|
93
|
+
}), false);
|
|
94
|
+
});
|
|
95
|
+
(0, node_test.test)("isTemporalDuration() accepts polyfill instances", () => {
|
|
96
|
+
(0, node_assert.strictEqual)(isTemporalDuration(_js_temporal_polyfill.Temporal.Duration.from({ hours: 1 })), true);
|
|
97
|
+
});
|
|
98
|
+
(0, node_test.test)("isTemporalDuration() accepts spec-compliant non-polyfill objects", () => {
|
|
99
|
+
(0, node_assert.strictEqual)(isTemporalDuration(Object.create(null, {
|
|
100
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
101
|
+
sign: { value: 0 },
|
|
102
|
+
toString: { value: () => "PT0S" }
|
|
103
|
+
})), true);
|
|
104
|
+
});
|
|
105
|
+
(0, node_test.test)("isTemporalDuration() rejects unrelated values", () => {
|
|
106
|
+
(0, node_assert.strictEqual)(isTemporalDuration(null), false);
|
|
107
|
+
(0, node_assert.strictEqual)(isTemporalDuration(void 0), false);
|
|
108
|
+
(0, node_assert.strictEqual)(isTemporalDuration("PT1H"), false);
|
|
109
|
+
(0, node_assert.strictEqual)(isTemporalDuration(_js_temporal_polyfill.Temporal.Instant.from("2026-05-14T00:00:00Z")), false);
|
|
110
|
+
});
|
|
111
|
+
(0, node_test.test)("isTemporalDuration() rejects bare objects tagged but missing shape", () => {
|
|
112
|
+
(0, node_assert.strictEqual)(isTemporalDuration(Object.create(null, { [Symbol.toStringTag]: { value: "Temporal.Duration" } })), false);
|
|
113
|
+
});
|
|
114
|
+
(0, node_test.test)("isTemporalDuration() rejects non-number sign", () => {
|
|
115
|
+
(0, node_assert.strictEqual)(isTemporalDuration(Object.create(null, {
|
|
116
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
117
|
+
sign: { value: "0" },
|
|
118
|
+
toString: { value: () => "PT0S" }
|
|
119
|
+
})), false);
|
|
120
|
+
});
|
|
121
|
+
(0, node_test.test)("isTemporalDuration() rejects out-of-range sign values", () => {
|
|
122
|
+
(0, node_assert.strictEqual)(isTemporalDuration(Object.create(null, {
|
|
123
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
124
|
+
sign: { value: 42 },
|
|
125
|
+
toString: { value: () => "PT42S" }
|
|
126
|
+
})), false);
|
|
127
|
+
});
|
|
128
|
+
(0, node_test.test)("isTemporalDuration() rejects default Object.prototype.toString", () => {
|
|
129
|
+
(0, node_assert.strictEqual)(isTemporalDuration({
|
|
130
|
+
[Symbol.toStringTag]: "Temporal.Duration",
|
|
131
|
+
sign: 0
|
|
132
|
+
}), false);
|
|
133
|
+
});
|
|
134
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { strictEqual } from "node:assert";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
4
|
+
//#region src/temporal.ts
|
|
5
|
+
/**
|
|
6
|
+
* Type guards for `Temporal` namespace objects.
|
|
7
|
+
*
|
|
8
|
+
* Fedify accepts both runtime polyfills (e.g. `@js-temporal/polyfill`,
|
|
9
|
+
* `temporal-polyfill`) and the host's native `Temporal` implementation
|
|
10
|
+
* (Node.js 26+, Bun, Deno). The guards below rely on `Symbol.toStringTag`,
|
|
11
|
+
* which is mandated by the Temporal specification, so they accept any
|
|
12
|
+
* spec-conformant implementation regardless of which class produced the
|
|
13
|
+
* value.
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Checks whether the given value is a `Temporal.Instant` object, regardless
|
|
19
|
+
* of whether it came from a polyfill or the host's native implementation.
|
|
20
|
+
*
|
|
21
|
+
* The guard verifies the spec-mandated `Symbol.toStringTag`, that the
|
|
22
|
+
* `epochNanoseconds` accessor exposes a `bigint`, and that `toString` is
|
|
23
|
+
* not the default inherited from `Object.prototype`. Together they reject
|
|
24
|
+
* bare objects whose tag was set to `"Temporal.Instant"` without exposing
|
|
25
|
+
* the rest of the shape; the `toString` check in particular prevents a
|
|
26
|
+
* spoof from reaching the JSON-LD serializer (which calls `toString()`)
|
|
27
|
+
* and emitting `"[object Temporal.Instant]"` instead of an RFC 3339
|
|
28
|
+
* timestamp.
|
|
29
|
+
*
|
|
30
|
+
* @param value The value to test.
|
|
31
|
+
* @returns `true` if the value reports `Temporal.Instant` via
|
|
32
|
+
* `Symbol.toStringTag`, exposes a `bigint`-valued
|
|
33
|
+
* `epochNanoseconds`, and overrides `toString`; `false` otherwise.
|
|
34
|
+
*/
|
|
35
|
+
function isTemporalInstant(value) {
|
|
36
|
+
return typeof value === "object" && value !== null && Object.prototype.toString.call(value) === "[object Temporal.Instant]" && "epochNanoseconds" in value && typeof value.epochNanoseconds === "bigint" && "toString" in value && typeof value.toString === "function" && value.toString !== Object.prototype.toString;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Checks whether the given value is a `Temporal.Duration` object, regardless
|
|
40
|
+
* of whether it came from a polyfill or the host's native implementation.
|
|
41
|
+
*
|
|
42
|
+
* The guard verifies the spec-mandated `Symbol.toStringTag`, that the
|
|
43
|
+
* `sign` accessor returns one of the three spec-valid values (`-1`, `0`,
|
|
44
|
+
* or `1`), and that `toString` is not the default inherited from
|
|
45
|
+
* `Object.prototype`. Together they reject bare objects whose tag was set
|
|
46
|
+
* to `"Temporal.Duration"` without exposing the rest of the shape; the
|
|
47
|
+
* `toString` check in particular prevents a spoof from reaching the
|
|
48
|
+
* JSON-LD serializer (which calls `toString()`) and emitting
|
|
49
|
+
* `"[object Temporal.Duration]"` instead of an ISO 8601 duration.
|
|
50
|
+
*
|
|
51
|
+
* @param value The value to test.
|
|
52
|
+
* @returns `true` if the value reports `Temporal.Duration` via
|
|
53
|
+
* `Symbol.toStringTag`, exposes a `sign` of `-1`, `0`, or `1`,
|
|
54
|
+
* and overrides `toString`; `false` otherwise.
|
|
55
|
+
*/
|
|
56
|
+
function isTemporalDuration(value) {
|
|
57
|
+
return typeof value === "object" && value !== null && Object.prototype.toString.call(value) === "[object Temporal.Duration]" && "sign" in value && (value.sign === -1 || value.sign === 0 || value.sign === 1) && "toString" in value && typeof value.toString === "function" && value.toString !== Object.prototype.toString;
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
//#region src/temporal.test.ts
|
|
61
|
+
test("isTemporalInstant() accepts polyfill instances", () => {
|
|
62
|
+
strictEqual(isTemporalInstant(Temporal.Instant.from("2026-05-14T00:00:00Z")), true);
|
|
63
|
+
});
|
|
64
|
+
test("isTemporalInstant() accepts spec-compliant non-polyfill objects", () => {
|
|
65
|
+
strictEqual(isTemporalInstant(Object.create(null, {
|
|
66
|
+
[Symbol.toStringTag]: { value: "Temporal.Instant" },
|
|
67
|
+
epochNanoseconds: { value: 0n },
|
|
68
|
+
toString: { value: () => "1970-01-01T00:00:00Z" }
|
|
69
|
+
})), true);
|
|
70
|
+
});
|
|
71
|
+
test("isTemporalInstant() rejects unrelated values", () => {
|
|
72
|
+
strictEqual(isTemporalInstant(null), false);
|
|
73
|
+
strictEqual(isTemporalInstant(void 0), false);
|
|
74
|
+
strictEqual(isTemporalInstant("2026-05-14T00:00:00Z"), false);
|
|
75
|
+
strictEqual(isTemporalInstant(/* @__PURE__ */ new Date()), false);
|
|
76
|
+
strictEqual(isTemporalInstant(Temporal.Duration.from({ seconds: 1 })), false);
|
|
77
|
+
});
|
|
78
|
+
test("isTemporalInstant() rejects bare objects tagged but missing shape", () => {
|
|
79
|
+
strictEqual(isTemporalInstant(Object.create(null, { [Symbol.toStringTag]: { value: "Temporal.Instant" } })), false);
|
|
80
|
+
});
|
|
81
|
+
test("isTemporalInstant() rejects non-bigint epochNanoseconds", () => {
|
|
82
|
+
strictEqual(isTemporalInstant(Object.create(null, {
|
|
83
|
+
[Symbol.toStringTag]: { value: "Temporal.Instant" },
|
|
84
|
+
epochNanoseconds: { value: 0 },
|
|
85
|
+
toString: { value: () => "1970-01-01T00:00:00Z" }
|
|
86
|
+
})), false);
|
|
87
|
+
});
|
|
88
|
+
test("isTemporalInstant() rejects default Object.prototype.toString", () => {
|
|
89
|
+
strictEqual(isTemporalInstant({
|
|
90
|
+
[Symbol.toStringTag]: "Temporal.Instant",
|
|
91
|
+
epochNanoseconds: 0n
|
|
92
|
+
}), false);
|
|
93
|
+
});
|
|
94
|
+
test("isTemporalDuration() accepts polyfill instances", () => {
|
|
95
|
+
strictEqual(isTemporalDuration(Temporal.Duration.from({ hours: 1 })), true);
|
|
96
|
+
});
|
|
97
|
+
test("isTemporalDuration() accepts spec-compliant non-polyfill objects", () => {
|
|
98
|
+
strictEqual(isTemporalDuration(Object.create(null, {
|
|
99
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
100
|
+
sign: { value: 0 },
|
|
101
|
+
toString: { value: () => "PT0S" }
|
|
102
|
+
})), true);
|
|
103
|
+
});
|
|
104
|
+
test("isTemporalDuration() rejects unrelated values", () => {
|
|
105
|
+
strictEqual(isTemporalDuration(null), false);
|
|
106
|
+
strictEqual(isTemporalDuration(void 0), false);
|
|
107
|
+
strictEqual(isTemporalDuration("PT1H"), false);
|
|
108
|
+
strictEqual(isTemporalDuration(Temporal.Instant.from("2026-05-14T00:00:00Z")), false);
|
|
109
|
+
});
|
|
110
|
+
test("isTemporalDuration() rejects bare objects tagged but missing shape", () => {
|
|
111
|
+
strictEqual(isTemporalDuration(Object.create(null, { [Symbol.toStringTag]: { value: "Temporal.Duration" } })), false);
|
|
112
|
+
});
|
|
113
|
+
test("isTemporalDuration() rejects non-number sign", () => {
|
|
114
|
+
strictEqual(isTemporalDuration(Object.create(null, {
|
|
115
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
116
|
+
sign: { value: "0" },
|
|
117
|
+
toString: { value: () => "PT0S" }
|
|
118
|
+
})), false);
|
|
119
|
+
});
|
|
120
|
+
test("isTemporalDuration() rejects out-of-range sign values", () => {
|
|
121
|
+
strictEqual(isTemporalDuration(Object.create(null, {
|
|
122
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
123
|
+
sign: { value: 42 },
|
|
124
|
+
toString: { value: () => "PT42S" }
|
|
125
|
+
})), false);
|
|
126
|
+
});
|
|
127
|
+
test("isTemporalDuration() rejects default Object.prototype.toString", () => {
|
|
128
|
+
strictEqual(isTemporalDuration({
|
|
129
|
+
[Symbol.toStringTag]: "Temporal.Duration",
|
|
130
|
+
sign: 0
|
|
131
|
+
}), false);
|
|
132
|
+
});
|
|
133
|
+
//#endregion
|
|
134
|
+
export {};
|
package/dist/tests/url.test.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require("./chunk-
|
|
2
|
-
const require_url = require("./url-
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_url = require("./url-CEmGms8t.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
//#region src/url.test.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/vocab-runtime",
|
|
3
|
-
"version": "2.3.0-dev.
|
|
3
|
+
"version": "2.3.0-dev.1099+fafcfa78",
|
|
4
4
|
"homepage": "https://fedify.dev/",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -45,6 +45,16 @@
|
|
|
45
45
|
"require": "./dist/jsonld.cjs",
|
|
46
46
|
"default": "./dist/jsonld.js"
|
|
47
47
|
},
|
|
48
|
+
"./temporal": {
|
|
49
|
+
"types": {
|
|
50
|
+
"import": "./dist/temporal.d.ts",
|
|
51
|
+
"require": "./dist/temporal.d.cts",
|
|
52
|
+
"default": "./dist/temporal.d.ts"
|
|
53
|
+
},
|
|
54
|
+
"import": "./dist/temporal.js",
|
|
55
|
+
"require": "./dist/temporal.cjs",
|
|
56
|
+
"default": "./dist/temporal.js"
|
|
57
|
+
},
|
|
48
58
|
"./package.json": "./package.json"
|
|
49
59
|
},
|
|
50
60
|
"keywords": [
|
|
@@ -61,14 +71,15 @@
|
|
|
61
71
|
"devDependencies": {
|
|
62
72
|
"@types/node": "^24.2.1",
|
|
63
73
|
"fetch-mock": "^12.5.4",
|
|
64
|
-
"tsdown": "^0.
|
|
65
|
-
"typescript": "^
|
|
74
|
+
"tsdown": "^0.22.0",
|
|
75
|
+
"typescript": "^6.0.0"
|
|
66
76
|
},
|
|
67
77
|
"dependencies": {
|
|
68
|
-
"@
|
|
78
|
+
"@js-temporal/polyfill": "^0.5.1",
|
|
79
|
+
"@logtape/logtape": "^2.0.7",
|
|
69
80
|
"@multiformats/base-x": "^4.0.1",
|
|
70
|
-
"@opentelemetry/api": "^1.9.
|
|
71
|
-
"asn1js": "^3.0.
|
|
81
|
+
"@opentelemetry/api": "^1.9.1",
|
|
82
|
+
"asn1js": "^3.0.10",
|
|
72
83
|
"byte-encodings": "^1.0.11",
|
|
73
84
|
"jsonld": "^9.0.0",
|
|
74
85
|
"pkijs": "^3.3.3"
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { strictEqual } from "node:assert";
|
|
3
|
+
import { test } from "node:test";
|
|
4
|
+
import { isTemporalDuration, isTemporalInstant } from "./temporal.ts";
|
|
5
|
+
|
|
6
|
+
test("isTemporalInstant() accepts polyfill instances", () => {
|
|
7
|
+
strictEqual(
|
|
8
|
+
isTemporalInstant(Temporal.Instant.from("2026-05-14T00:00:00Z")),
|
|
9
|
+
true,
|
|
10
|
+
);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test("isTemporalInstant() accepts spec-compliant non-polyfill objects", () => {
|
|
14
|
+
// Mimics the shape of a native `Temporal.Instant` from a host that does
|
|
15
|
+
// not share class identity with the bundled polyfill.
|
|
16
|
+
const nativeLike = Object.create(null, {
|
|
17
|
+
[Symbol.toStringTag]: { value: "Temporal.Instant" },
|
|
18
|
+
epochNanoseconds: { value: 0n },
|
|
19
|
+
toString: { value: () => "1970-01-01T00:00:00Z" },
|
|
20
|
+
});
|
|
21
|
+
strictEqual(isTemporalInstant(nativeLike), true);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("isTemporalInstant() rejects unrelated values", () => {
|
|
25
|
+
strictEqual(isTemporalInstant(null), false);
|
|
26
|
+
strictEqual(isTemporalInstant(undefined), false);
|
|
27
|
+
strictEqual(isTemporalInstant("2026-05-14T00:00:00Z"), false);
|
|
28
|
+
strictEqual(isTemporalInstant(new Date()), false);
|
|
29
|
+
strictEqual(
|
|
30
|
+
isTemporalInstant(Temporal.Duration.from({ seconds: 1 })),
|
|
31
|
+
false,
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("isTemporalInstant() rejects bare objects tagged but missing shape", () => {
|
|
36
|
+
const decoy = Object.create(null, {
|
|
37
|
+
[Symbol.toStringTag]: { value: "Temporal.Instant" },
|
|
38
|
+
});
|
|
39
|
+
strictEqual(isTemporalInstant(decoy), false);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("isTemporalInstant() rejects non-bigint epochNanoseconds", () => {
|
|
43
|
+
const decoy = Object.create(null, {
|
|
44
|
+
[Symbol.toStringTag]: { value: "Temporal.Instant" },
|
|
45
|
+
epochNanoseconds: { value: 0 },
|
|
46
|
+
toString: { value: () => "1970-01-01T00:00:00Z" },
|
|
47
|
+
});
|
|
48
|
+
strictEqual(isTemporalInstant(decoy), false);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("isTemporalInstant() rejects default Object.prototype.toString", () => {
|
|
52
|
+
// A plain object inherits `toString` from `Object.prototype`, so calling
|
|
53
|
+
// it would produce `"[object Temporal.Instant]"` instead of an RFC 3339
|
|
54
|
+
// timestamp. The guard must reject these to keep the serializer honest.
|
|
55
|
+
const decoy = {
|
|
56
|
+
[Symbol.toStringTag]: "Temporal.Instant",
|
|
57
|
+
epochNanoseconds: 0n,
|
|
58
|
+
};
|
|
59
|
+
strictEqual(isTemporalInstant(decoy), false);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("isTemporalDuration() accepts polyfill instances", () => {
|
|
63
|
+
strictEqual(
|
|
64
|
+
isTemporalDuration(Temporal.Duration.from({ hours: 1 })),
|
|
65
|
+
true,
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("isTemporalDuration() accepts spec-compliant non-polyfill objects", () => {
|
|
70
|
+
const nativeLike = Object.create(null, {
|
|
71
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
72
|
+
sign: { value: 0 },
|
|
73
|
+
toString: { value: () => "PT0S" },
|
|
74
|
+
});
|
|
75
|
+
strictEqual(isTemporalDuration(nativeLike), true);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("isTemporalDuration() rejects unrelated values", () => {
|
|
79
|
+
strictEqual(isTemporalDuration(null), false);
|
|
80
|
+
strictEqual(isTemporalDuration(undefined), false);
|
|
81
|
+
strictEqual(isTemporalDuration("PT1H"), false);
|
|
82
|
+
strictEqual(
|
|
83
|
+
isTemporalDuration(Temporal.Instant.from("2026-05-14T00:00:00Z")),
|
|
84
|
+
false,
|
|
85
|
+
);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("isTemporalDuration() rejects bare objects tagged but missing shape", () => {
|
|
89
|
+
const decoy = Object.create(null, {
|
|
90
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
91
|
+
});
|
|
92
|
+
strictEqual(isTemporalDuration(decoy), false);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("isTemporalDuration() rejects non-number sign", () => {
|
|
96
|
+
const decoy = Object.create(null, {
|
|
97
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
98
|
+
sign: { value: "0" },
|
|
99
|
+
toString: { value: () => "PT0S" },
|
|
100
|
+
});
|
|
101
|
+
strictEqual(isTemporalDuration(decoy), false);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test("isTemporalDuration() rejects out-of-range sign values", () => {
|
|
105
|
+
// Real Temporal.Duration#sign is `-1 | 0 | 1` per spec, so anything else
|
|
106
|
+
// (here, 42) must be rejected even though it is a number.
|
|
107
|
+
const decoy = Object.create(null, {
|
|
108
|
+
[Symbol.toStringTag]: { value: "Temporal.Duration" },
|
|
109
|
+
sign: { value: 42 },
|
|
110
|
+
toString: { value: () => "PT42S" },
|
|
111
|
+
});
|
|
112
|
+
strictEqual(isTemporalDuration(decoy), false);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("isTemporalDuration() rejects default Object.prototype.toString", () => {
|
|
116
|
+
const decoy = {
|
|
117
|
+
[Symbol.toStringTag]: "Temporal.Duration",
|
|
118
|
+
sign: 0,
|
|
119
|
+
};
|
|
120
|
+
strictEqual(isTemporalDuration(decoy), false);
|
|
121
|
+
});
|