@oari/jose 0.0.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.
- package/LICENSE.md +21 -0
- package/README.md +150 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/jwe/compact/decrypt.d.ts +43 -0
- package/dist/types/jwe/compact/encrypt.d.ts +76 -0
- package/dist/types/jwe/flattened/decrypt.d.ts +53 -0
- package/dist/types/jwe/flattened/encrypt.d.ts +95 -0
- package/dist/types/jwe/general/decrypt.d.ts +64 -0
- package/dist/types/jwe/general/encrypt.d.ts +89 -0
- package/dist/types/jwk/embedded.d.ts +31 -0
- package/dist/types/jwk/thumbprint.d.ts +60 -0
- package/dist/types/jwks/local.d.ts +90 -0
- package/dist/types/jwks/remote.d.ts +306 -0
- package/dist/types/jws/compact/sign.d.ts +47 -0
- package/dist/types/jws/compact/verify.d.ts +45 -0
- package/dist/types/jws/flattened/sign.d.ts +53 -0
- package/dist/types/jws/flattened/verify.d.ts +50 -0
- package/dist/types/jws/general/sign.d.ts +67 -0
- package/dist/types/jws/general/verify.d.ts +61 -0
- package/dist/types/jwt/decrypt.d.ts +51 -0
- package/dist/types/jwt/encrypt.d.ts +105 -0
- package/dist/types/jwt/sign.d.ts +140 -0
- package/dist/types/jwt/unsecured.d.ts +70 -0
- package/dist/types/jwt/verify.d.ts +124 -0
- package/dist/types/key/export.d.ts +59 -0
- package/dist/types/key/generate_key_pair.d.ts +64 -0
- package/dist/types/key/generate_secret.d.ts +42 -0
- package/dist/types/key/import.d.ts +146 -0
- package/dist/types/types.d.ts +869 -0
- package/dist/types/util/base64url.d.ts +9 -0
- package/dist/types/util/decode_jwt.d.ts +25 -0
- package/dist/types/util/decode_protected_header.d.ts +24 -0
- package/dist/types/util/errors.d.ts +488 -0
- package/dist/webapi/index.js +32 -0
- package/dist/webapi/jwe/compact/decrypt.js +27 -0
- package/dist/webapi/jwe/compact/encrypt.js +27 -0
- package/dist/webapi/jwe/flattened/decrypt.js +159 -0
- package/dist/webapi/jwe/flattened/encrypt.js +167 -0
- package/dist/webapi/jwe/general/decrypt.js +31 -0
- package/dist/webapi/jwe/general/encrypt.js +182 -0
- package/dist/webapi/jwk/embedded.js +17 -0
- package/dist/webapi/jwk/thumbprint.js +68 -0
- package/dist/webapi/jwks/local.js +119 -0
- package/dist/webapi/jwks/remote.js +179 -0
- package/dist/webapi/jws/compact/sign.js +18 -0
- package/dist/webapi/jws/compact/verify.js +21 -0
- package/dist/webapi/jws/flattened/sign.js +87 -0
- package/dist/webapi/jws/flattened/verify.js +110 -0
- package/dist/webapi/jws/general/sign.js +70 -0
- package/dist/webapi/jws/general/verify.js +24 -0
- package/dist/webapi/jwt/decrypt.js +23 -0
- package/dist/webapi/jwt/encrypt.js +101 -0
- package/dist/webapi/jwt/sign.js +52 -0
- package/dist/webapi/jwt/unsecured.js +63 -0
- package/dist/webapi/jwt/verify.js +15 -0
- package/dist/webapi/key/export.js +11 -0
- package/dist/webapi/key/generate_key_pair.js +97 -0
- package/dist/webapi/key/generate_secret.js +40 -0
- package/dist/webapi/key/import.js +57 -0
- package/dist/webapi/lib/aesgcmkw.js +15 -0
- package/dist/webapi/lib/aeskw.js +25 -0
- package/dist/webapi/lib/asn1.js +243 -0
- package/dist/webapi/lib/base64.js +22 -0
- package/dist/webapi/lib/buffer_utils.js +43 -0
- package/dist/webapi/lib/check_key_type.js +127 -0
- package/dist/webapi/lib/content_encryption.js +217 -0
- package/dist/webapi/lib/crypto_key.js +136 -0
- package/dist/webapi/lib/deflate.js +44 -0
- package/dist/webapi/lib/ecdhes.js +52 -0
- package/dist/webapi/lib/helpers.js +19 -0
- package/dist/webapi/lib/invalid_key_input.js +27 -0
- package/dist/webapi/lib/is_key_like.js +17 -0
- package/dist/webapi/lib/jwk_to_key.js +107 -0
- package/dist/webapi/lib/jwt_claims_set.js +238 -0
- package/dist/webapi/lib/key_management.js +186 -0
- package/dist/webapi/lib/key_to_jwk.js +31 -0
- package/dist/webapi/lib/normalize_key.js +166 -0
- package/dist/webapi/lib/pbes2kw.js +42 -0
- package/dist/webapi/lib/rsaes.js +24 -0
- package/dist/webapi/lib/signing.js +74 -0
- package/dist/webapi/lib/type_checks.js +41 -0
- package/dist/webapi/lib/validate_algorithms.js +10 -0
- package/dist/webapi/lib/validate_crit.js +33 -0
- package/dist/webapi/util/base64url.js +30 -0
- package/dist/webapi/util/decode_jwt.js +32 -0
- package/dist/webapi/util/decode_protected_header.js +34 -0
- package/dist/webapi/util/errors.js +99 -0
- package/package.json +195 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { decode as b64u } from './base64url.js';
|
|
2
|
+
import { decoder } from '../lib/buffer_utils.js';
|
|
3
|
+
import { isObject } from '../lib/type_checks.js';
|
|
4
|
+
export function decodeProtectedHeader(token) {
|
|
5
|
+
let protectedB64u;
|
|
6
|
+
if (typeof token === 'string') {
|
|
7
|
+
const parts = token.split('.');
|
|
8
|
+
if (parts.length === 3 || parts.length === 5) {
|
|
9
|
+
;
|
|
10
|
+
[protectedB64u] = parts;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
else if (typeof token === 'object' && token) {
|
|
14
|
+
if ('protected' in token) {
|
|
15
|
+
protectedB64u = token.protected;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
throw new TypeError('Token does not contain a Protected Header');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
if (typeof protectedB64u !== 'string' || !protectedB64u) {
|
|
23
|
+
throw new Error();
|
|
24
|
+
}
|
|
25
|
+
const result = JSON.parse(decoder.decode(b64u(protectedB64u)));
|
|
26
|
+
if (!isObject(result)) {
|
|
27
|
+
throw new Error();
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new TypeError('Invalid Token or Protected Header formatting');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export class JOSEError extends Error {
|
|
2
|
+
static code = 'ERR_JOSE_GENERIC';
|
|
3
|
+
code = 'ERR_JOSE_GENERIC';
|
|
4
|
+
constructor(message, options) {
|
|
5
|
+
super(message, options);
|
|
6
|
+
this.name = this.constructor.name;
|
|
7
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class JWTClaimValidationFailed extends JOSEError {
|
|
11
|
+
static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';
|
|
12
|
+
code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';
|
|
13
|
+
claim;
|
|
14
|
+
reason;
|
|
15
|
+
payload;
|
|
16
|
+
constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {
|
|
17
|
+
super(message, { cause: { claim, reason, payload } });
|
|
18
|
+
this.claim = claim;
|
|
19
|
+
this.reason = reason;
|
|
20
|
+
this.payload = payload;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class JWTExpired extends JOSEError {
|
|
24
|
+
static code = 'ERR_JWT_EXPIRED';
|
|
25
|
+
code = 'ERR_JWT_EXPIRED';
|
|
26
|
+
claim;
|
|
27
|
+
reason;
|
|
28
|
+
payload;
|
|
29
|
+
constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {
|
|
30
|
+
super(message, { cause: { claim, reason, payload } });
|
|
31
|
+
this.claim = claim;
|
|
32
|
+
this.reason = reason;
|
|
33
|
+
this.payload = payload;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class JOSEAlgNotAllowed extends JOSEError {
|
|
37
|
+
static code = 'ERR_JOSE_ALG_NOT_ALLOWED';
|
|
38
|
+
code = 'ERR_JOSE_ALG_NOT_ALLOWED';
|
|
39
|
+
}
|
|
40
|
+
export class JOSENotSupported extends JOSEError {
|
|
41
|
+
static code = 'ERR_JOSE_NOT_SUPPORTED';
|
|
42
|
+
code = 'ERR_JOSE_NOT_SUPPORTED';
|
|
43
|
+
}
|
|
44
|
+
export class JWEDecryptionFailed extends JOSEError {
|
|
45
|
+
static code = 'ERR_JWE_DECRYPTION_FAILED';
|
|
46
|
+
code = 'ERR_JWE_DECRYPTION_FAILED';
|
|
47
|
+
constructor(message = 'decryption operation failed', options) {
|
|
48
|
+
super(message, options);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class JWEInvalid extends JOSEError {
|
|
52
|
+
static code = 'ERR_JWE_INVALID';
|
|
53
|
+
code = 'ERR_JWE_INVALID';
|
|
54
|
+
}
|
|
55
|
+
export class JWSInvalid extends JOSEError {
|
|
56
|
+
static code = 'ERR_JWS_INVALID';
|
|
57
|
+
code = 'ERR_JWS_INVALID';
|
|
58
|
+
}
|
|
59
|
+
export class JWTInvalid extends JOSEError {
|
|
60
|
+
static code = 'ERR_JWT_INVALID';
|
|
61
|
+
code = 'ERR_JWT_INVALID';
|
|
62
|
+
}
|
|
63
|
+
export class JWKInvalid extends JOSEError {
|
|
64
|
+
static code = 'ERR_JWK_INVALID';
|
|
65
|
+
code = 'ERR_JWK_INVALID';
|
|
66
|
+
}
|
|
67
|
+
export class JWKSInvalid extends JOSEError {
|
|
68
|
+
static code = 'ERR_JWKS_INVALID';
|
|
69
|
+
code = 'ERR_JWKS_INVALID';
|
|
70
|
+
}
|
|
71
|
+
export class JWKSNoMatchingKey extends JOSEError {
|
|
72
|
+
static code = 'ERR_JWKS_NO_MATCHING_KEY';
|
|
73
|
+
code = 'ERR_JWKS_NO_MATCHING_KEY';
|
|
74
|
+
constructor(message = 'no applicable key found in the JSON Web Key Set', options) {
|
|
75
|
+
super(message, options);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export class JWKSMultipleMatchingKeys extends JOSEError {
|
|
79
|
+
[Symbol.asyncIterator];
|
|
80
|
+
static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';
|
|
81
|
+
code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';
|
|
82
|
+
constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {
|
|
83
|
+
super(message, options);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export class JWKSTimeout extends JOSEError {
|
|
87
|
+
static code = 'ERR_JWKS_TIMEOUT';
|
|
88
|
+
code = 'ERR_JWKS_TIMEOUT';
|
|
89
|
+
constructor(message = 'request timed out', options) {
|
|
90
|
+
super(message, options);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export class JWSSignatureVerificationFailed extends JOSEError {
|
|
94
|
+
static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';
|
|
95
|
+
code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';
|
|
96
|
+
constructor(message = 'signature verification failed', options) {
|
|
97
|
+
super(message, options);
|
|
98
|
+
}
|
|
99
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oari/jose",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"imports": {
|
|
7
|
+
"#dist": {
|
|
8
|
+
"types": "./dist/types/index.d.ts",
|
|
9
|
+
"default": "./dist/webapi/index.js"
|
|
10
|
+
},
|
|
11
|
+
"#dist/*": {
|
|
12
|
+
"types": "./dist/types/*.d.ts",
|
|
13
|
+
"default": "./dist/webapi/*.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/types/index.d.ts",
|
|
19
|
+
"default": "./dist/webapi/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./jwk/embedded": {
|
|
22
|
+
"types": "./dist/types/jwk/embedded.d.ts",
|
|
23
|
+
"default": "./dist/webapi/jwk/embedded.js"
|
|
24
|
+
},
|
|
25
|
+
"./jwk/thumbprint": {
|
|
26
|
+
"types": "./dist/types/jwk/thumbprint.d.ts",
|
|
27
|
+
"default": "./dist/webapi/jwk/thumbprint.js"
|
|
28
|
+
},
|
|
29
|
+
"./key/import": {
|
|
30
|
+
"types": "./dist/types/key/import.d.ts",
|
|
31
|
+
"default": "./dist/webapi/key/import.js"
|
|
32
|
+
},
|
|
33
|
+
"./key/export": {
|
|
34
|
+
"types": "./dist/types/key/export.d.ts",
|
|
35
|
+
"default": "./dist/webapi/key/export.js"
|
|
36
|
+
},
|
|
37
|
+
"./key/generate/keypair": {
|
|
38
|
+
"types": "./dist/types/key/generate_key_pair.d.ts",
|
|
39
|
+
"default": "./dist/webapi/key/generate_key_pair.js"
|
|
40
|
+
},
|
|
41
|
+
"./key/generate/secret": {
|
|
42
|
+
"types": "./dist/types/key/generate_secret.d.ts",
|
|
43
|
+
"default": "./dist/webapi/key/generate_secret.js"
|
|
44
|
+
},
|
|
45
|
+
"./jwks/remote": {
|
|
46
|
+
"types": "./dist/types/jwks/remote.d.ts",
|
|
47
|
+
"default": "./dist/webapi/jwks/remote.js"
|
|
48
|
+
},
|
|
49
|
+
"./jwks/local": {
|
|
50
|
+
"types": "./dist/types/jwks/local.d.ts",
|
|
51
|
+
"default": "./dist/webapi/jwks/local.js"
|
|
52
|
+
},
|
|
53
|
+
"./jwt/sign": {
|
|
54
|
+
"types": "./dist/types/jwt/sign.d.ts",
|
|
55
|
+
"default": "./dist/webapi/jwt/sign.js"
|
|
56
|
+
},
|
|
57
|
+
"./jwt/verify": {
|
|
58
|
+
"types": "./dist/types/jwt/verify.d.ts",
|
|
59
|
+
"default": "./dist/webapi/jwt/verify.js"
|
|
60
|
+
},
|
|
61
|
+
"./jwt/encrypt": {
|
|
62
|
+
"types": "./dist/types/jwt/encrypt.d.ts",
|
|
63
|
+
"default": "./dist/webapi/jwt/encrypt.js"
|
|
64
|
+
},
|
|
65
|
+
"./jwt/decrypt": {
|
|
66
|
+
"types": "./dist/types/jwt/decrypt.d.ts",
|
|
67
|
+
"default": "./dist/webapi/jwt/decrypt.js"
|
|
68
|
+
},
|
|
69
|
+
"./jwt/unsecured": {
|
|
70
|
+
"types": "./dist/types/jwt/unsecured.d.ts",
|
|
71
|
+
"default": "./dist/webapi/jwt/unsecured.js"
|
|
72
|
+
},
|
|
73
|
+
"./jwt/decode": {
|
|
74
|
+
"types": "./dist/types/util/decode_jwt.d.ts",
|
|
75
|
+
"default": "./dist/webapi/util/decode_jwt.js"
|
|
76
|
+
},
|
|
77
|
+
"./decode/protected_header": {
|
|
78
|
+
"types": "./dist/types/util/decode_protected_header.d.ts",
|
|
79
|
+
"default": "./dist/webapi/util/decode_protected_header.js"
|
|
80
|
+
},
|
|
81
|
+
"./jws/compact/sign": {
|
|
82
|
+
"types": "./dist/types/jws/compact/sign.d.ts",
|
|
83
|
+
"default": "./dist/webapi/jws/compact/sign.js"
|
|
84
|
+
},
|
|
85
|
+
"./jws/compact/verify": {
|
|
86
|
+
"types": "./dist/types/jws/compact/verify.d.ts",
|
|
87
|
+
"default": "./dist/webapi/jws/compact/verify.js"
|
|
88
|
+
},
|
|
89
|
+
"./jws/flattened/sign": {
|
|
90
|
+
"types": "./dist/types/jws/flattened/sign.d.ts",
|
|
91
|
+
"default": "./dist/webapi/jws/flattened/sign.js"
|
|
92
|
+
},
|
|
93
|
+
"./jws/flattened/verify": {
|
|
94
|
+
"types": "./dist/types/jws/flattened/verify.d.ts",
|
|
95
|
+
"default": "./dist/webapi/jws/flattened/verify.js"
|
|
96
|
+
},
|
|
97
|
+
"./jws/general/sign": {
|
|
98
|
+
"types": "./dist/types/jws/general/sign.d.ts",
|
|
99
|
+
"default": "./dist/webapi/jws/general/sign.js"
|
|
100
|
+
},
|
|
101
|
+
"./jws/general/verify": {
|
|
102
|
+
"types": "./dist/types/jws/general/verify.d.ts",
|
|
103
|
+
"default": "./dist/webapi/jws/general/verify.js"
|
|
104
|
+
},
|
|
105
|
+
"./jwe/compact/encrypt": {
|
|
106
|
+
"types": "./dist/types/jwe/compact/encrypt.d.ts",
|
|
107
|
+
"default": "./dist/webapi/jwe/compact/encrypt.js"
|
|
108
|
+
},
|
|
109
|
+
"./jwe/compact/decrypt": {
|
|
110
|
+
"types": "./dist/types/jwe/compact/decrypt.d.ts",
|
|
111
|
+
"default": "./dist/webapi/jwe/compact/decrypt.js"
|
|
112
|
+
},
|
|
113
|
+
"./jwe/flattened/encrypt": {
|
|
114
|
+
"types": "./dist/types/jwe/flattened/encrypt.d.ts",
|
|
115
|
+
"default": "./dist/webapi/jwe/flattened/encrypt.js"
|
|
116
|
+
},
|
|
117
|
+
"./jwe/flattened/decrypt": {
|
|
118
|
+
"types": "./dist/types/jwe/flattened/decrypt.d.ts",
|
|
119
|
+
"default": "./dist/webapi/jwe/flattened/decrypt.js"
|
|
120
|
+
},
|
|
121
|
+
"./jwe/general/encrypt": {
|
|
122
|
+
"types": "./dist/types/jwe/general/encrypt.d.ts",
|
|
123
|
+
"default": "./dist/webapi/jwe/general/encrypt.js"
|
|
124
|
+
},
|
|
125
|
+
"./jwe/general/decrypt": {
|
|
126
|
+
"types": "./dist/types/jwe/general/decrypt.d.ts",
|
|
127
|
+
"default": "./dist/webapi/jwe/general/decrypt.js"
|
|
128
|
+
},
|
|
129
|
+
"./errors": {
|
|
130
|
+
"types": "./dist/types/util/errors.d.ts",
|
|
131
|
+
"default": "./dist/webapi/util/errors.js"
|
|
132
|
+
},
|
|
133
|
+
"./base64url": {
|
|
134
|
+
"types": "./dist/types/util/base64url.d.ts",
|
|
135
|
+
"default": "./dist/webapi/util/base64url.js"
|
|
136
|
+
},
|
|
137
|
+
"./package.json": "./package.json"
|
|
138
|
+
},
|
|
139
|
+
"main": "./dist/webapi/index.js",
|
|
140
|
+
"types": "./dist/types/index.d.ts",
|
|
141
|
+
"files": [
|
|
142
|
+
"dist/webapi/**/*.js",
|
|
143
|
+
"dist/types/**/*.d.ts",
|
|
144
|
+
"!dist/**/*.bundle.js",
|
|
145
|
+
"!dist/**/*.umd.js",
|
|
146
|
+
"!dist/**/*.min.js",
|
|
147
|
+
"!dist/types/runtime/*",
|
|
148
|
+
"!dist/types/lib/*",
|
|
149
|
+
"!dist/deno/**/*"
|
|
150
|
+
],
|
|
151
|
+
"scripts": {
|
|
152
|
+
"build": "tsc",
|
|
153
|
+
"build-all": "run-s clear build build:*",
|
|
154
|
+
"build:bundle": "esbuild --bundle dist/webapi/index.js --format=esm --target=es2022 --outfile=dist/webapi/index.bundle.js",
|
|
155
|
+
"build:bundle-min": "esbuild --minify --bundle dist/webapi/index.js --format=esm --target=es2022 --outfile=dist/webapi/index.bundle.min.js",
|
|
156
|
+
"build:umd": "esbuild --bundle dist/webapi/index.js --format=iife --global-name=jose --target=es2022 --outfile=dist/webapi/index.umd.js && node tools/iife-to-umd.cjs dist/webapi/index.umd.js && esbuild --minify dist/webapi/index.umd.js --outfile=dist/webapi/index.umd.min.js",
|
|
157
|
+
"build:deno": "mkdir -p dist/deno && cp -R src/. dist/deno && find dist/deno -name '*.ts' -type f -print0 | xargs -0 sed -i.bak -e \"s/\\.js'/.ts'/g\" && npm run sedcleanup",
|
|
158
|
+
"build:types": "npm run build -- -p ./tsconfig/types.json && cd src && find . -name '*.d.ts' -maxdepth 2 -type f -exec rsync -R \"{}\" ../dist/types \\;",
|
|
159
|
+
"build:jsr": "npx --yes jsr publish --dry-run --allow-dirty",
|
|
160
|
+
"clear": "rm -Rf dist",
|
|
161
|
+
"sedcleanup": "find . -name '*.bak' -type f -print0 | xargs -0 rm -f",
|
|
162
|
+
"docs:generate": "typedoc",
|
|
163
|
+
"prepack": "npm run build-all",
|
|
164
|
+
"prepublishOnly": "npm run build-all",
|
|
165
|
+
"types:find": "find dist/types -name '*.d.ts' -type f -print0",
|
|
166
|
+
"test": "bash -c 'source .node_flags.sh && ava'",
|
|
167
|
+
"format": "prettier --log-level silent --write ./test ./tap ./src ./tools ./cookbook ./tsconfig",
|
|
168
|
+
"tap:browsers": "./tap/.browsers.sh",
|
|
169
|
+
"tap:bun": "./tap/.bun.sh",
|
|
170
|
+
"tap:deno": "./tap/.deno.sh",
|
|
171
|
+
"tap:electron": "./tap/.electron.sh",
|
|
172
|
+
"tap:node": "bash -c './tap/.node.sh'",
|
|
173
|
+
"tap:workerd": "./tap/.workerd.sh"
|
|
174
|
+
},
|
|
175
|
+
"devDependencies": {
|
|
176
|
+
"@playwright/test": "^1.60.0",
|
|
177
|
+
"@types/node": "^24.12.4",
|
|
178
|
+
"@types/qunit": "^2.19.14",
|
|
179
|
+
"ava": "^7.0.0",
|
|
180
|
+
"esbuild": "^0.28.0",
|
|
181
|
+
"npm-run-all2": "^9.0.0",
|
|
182
|
+
"patch-package": "^8.0.1",
|
|
183
|
+
"prettier": "^3.8.3",
|
|
184
|
+
"prettier-plugin-jsdoc": "^1.8.0",
|
|
185
|
+
"qunit": "^2.25.0",
|
|
186
|
+
"tar": "^7.5.15",
|
|
187
|
+
"timekeeper": "^2.3.1",
|
|
188
|
+
"ts-blank-space": "^0.9.0",
|
|
189
|
+
"typedoc": "^0.28.19",
|
|
190
|
+
"typedoc-plugin-markdown": "^4.11.0",
|
|
191
|
+
"typedoc-plugin-mdn-links": "^5.1.1",
|
|
192
|
+
"typescript": "^6.0.3",
|
|
193
|
+
"undici": "^7.25.0"
|
|
194
|
+
}
|
|
195
|
+
}
|