@atproto/syntax 0.3.0 → 0.3.2
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/CHANGELOG.md +12 -0
- package/dist/aturi_validation.js +5 -5
- package/dist/aturi_validation.js.map +1 -1
- package/dist/did.js +6 -6
- package/dist/did.js.map +1 -1
- package/dist/handle.js +1 -1
- package/dist/handle.js.map +1 -1
- package/dist/nsid.js +2 -2
- package/dist/nsid.js.map +1 -1
- package/dist/recordkey.js +1 -1
- package/dist/recordkey.js.map +1 -1
- package/dist/tid.js +1 -1
- package/dist/tid.js.map +1 -1
- package/package.json +3 -3
- package/src/aturi_validation.ts +5 -5
- package/src/did.ts +7 -7
- package/src/handle.ts +1 -1
- package/src/nsid.ts +2 -2
- package/src/recordkey.ts +1 -1
- package/src/tid.ts +1 -1
- package/tests/aturi.test.ts +3 -3
- package/tests/datetime.test.ts +7 -7
- package/tests/did.test.ts +5 -5
- package/tests/handle.test.ts +6 -6
- package/tests/nsid.test.ts +6 -6
- package/tests/recordkey.test.ts +5 -5
- package/tests/tid.test.ts +5 -5
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.tests.tsbuildinfo +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atproto/syntax
|
|
2
2
|
|
|
3
|
+
## 0.3.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#3220](https://github.com/bluesky-social/atproto/pull/3220) [`61dc0d60e`](https://github.com/bluesky-social/atproto/commit/61dc0d60e19b88c6427a54c6d95a391b5f4da7bd) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Apply new linting rules regarding import order
|
|
8
|
+
|
|
9
|
+
## 0.3.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#2911](https://github.com/bluesky-social/atproto/pull/2911) [`bac9be2d3`](https://github.com/bluesky-social/atproto/commit/bac9be2d3ec904d1f984a871f43cf89aca17289d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Improve performances of did validation
|
|
14
|
+
|
|
3
15
|
## 0.3.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/dist/aturi_validation.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ensureValidAtUriRegex = exports.ensureValidAtUri = void 0;
|
|
4
|
-
const handle_1 = require("./handle");
|
|
5
4
|
const did_1 = require("./did");
|
|
5
|
+
const handle_1 = require("./handle");
|
|
6
6
|
const nsid_1 = require("./nsid");
|
|
7
7
|
// Human-readable constraints on ATURI:
|
|
8
8
|
// - following regular URLs, a 8KByte hard total length limit
|
|
@@ -30,7 +30,7 @@ const ensureValidAtUri = (uri) => {
|
|
|
30
30
|
throw new Error('Disallowed characters in ATURI (ASCII)');
|
|
31
31
|
}
|
|
32
32
|
const parts = uri.split('/');
|
|
33
|
-
if (parts.length >= 3 && (parts[0]
|
|
33
|
+
if (parts.length >= 3 && (parts[0] !== 'at:' || parts[1].length !== 0)) {
|
|
34
34
|
throw new Error('ATURI must start with "at://"');
|
|
35
35
|
}
|
|
36
36
|
if (parts.length < 3) {
|
|
@@ -48,7 +48,7 @@ const ensureValidAtUri = (uri) => {
|
|
|
48
48
|
throw new Error('ATURI authority must be a valid handle or DID');
|
|
49
49
|
}
|
|
50
50
|
if (parts.length >= 4) {
|
|
51
|
-
if (parts[3].length
|
|
51
|
+
if (parts[3].length === 0) {
|
|
52
52
|
throw new Error('ATURI can not have a slash after authority without a path segment');
|
|
53
53
|
}
|
|
54
54
|
try {
|
|
@@ -59,7 +59,7 @@ const ensureValidAtUri = (uri) => {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
if (parts.length >= 5) {
|
|
62
|
-
if (parts[4].length
|
|
62
|
+
if (parts[4].length === 0) {
|
|
63
63
|
throw new Error('ATURI can not have a slash after collection, unless record key is provided');
|
|
64
64
|
}
|
|
65
65
|
// would validate rkey here, but there are basically no constraints!
|
|
@@ -71,7 +71,7 @@ const ensureValidAtUri = (uri) => {
|
|
|
71
71
|
throw new Error('ATURI fragment must be non-empty and start with slash');
|
|
72
72
|
}
|
|
73
73
|
if (fragmentPart != null) {
|
|
74
|
-
if (fragmentPart.length
|
|
74
|
+
if (fragmentPart.length === 0 || fragmentPart[0] !== '/') {
|
|
75
75
|
throw new Error('ATURI fragment must be non-empty and start with slash');
|
|
76
76
|
}
|
|
77
77
|
// NOTE: enforcing *some* checks here for sanity. Eg, at least no whitespace
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aturi_validation.js","sourceRoot":"","sources":["../src/aturi_validation.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"aturi_validation.js","sourceRoot":"","sources":["../src/aturi_validation.ts"],"names":[],"mappings":"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"}
|
package/dist/did.js
CHANGED
|
@@ -15,18 +15,18 @@ exports.InvalidDidError = exports.ensureValidDidRegex = exports.ensureValidDid =
|
|
|
15
15
|
// - hard length limit of 8KBytes
|
|
16
16
|
// - not going to validate "percent encoding" here
|
|
17
17
|
const ensureValidDid = (did) => {
|
|
18
|
+
if (!did.startsWith('did:')) {
|
|
19
|
+
throw new InvalidDidError('DID requires "did:" prefix');
|
|
20
|
+
}
|
|
18
21
|
// check that all chars are boring ASCII
|
|
19
22
|
if (!/^[a-zA-Z0-9._:%-]*$/.test(did)) {
|
|
20
23
|
throw new InvalidDidError('Disallowed characters in DID (ASCII letters, digits, and a couple other characters only)');
|
|
21
24
|
}
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
25
|
+
const { length, 1: method } = did.split(':');
|
|
26
|
+
if (length < 3) {
|
|
24
27
|
throw new InvalidDidError('DID requires prefix, method, and method-specific content');
|
|
25
28
|
}
|
|
26
|
-
if (
|
|
27
|
-
throw new InvalidDidError('DID requires "did:" prefix');
|
|
28
|
-
}
|
|
29
|
-
if (!/^[a-z]+$/.test(parts[1])) {
|
|
29
|
+
if (!/^[a-z]+$/.test(method)) {
|
|
30
30
|
throw new InvalidDidError('DID method must be lower-case letters');
|
|
31
31
|
}
|
|
32
32
|
if (did.endsWith(':') || did.endsWith('%')) {
|
package/dist/did.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":";;;AAAA,8BAA8B;AAC9B,iEAAiE;AACjE,+CAA+C;AAC/C,2CAA2C;AAC3C,wEAAwE;AACxE,sFAAsF;AACtF,qFAAqF;AACrF,wHAAwH;AACxH,8GAA8G;AAC9G,6FAA6F;AAC7F,qGAAqG;AACrG,mCAAmC;AACnC,oDAAoD;AAC7C,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IAClD,
|
|
1
|
+
{"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":";;;AAAA,8BAA8B;AAC9B,iEAAiE;AACjE,+CAA+C;AAC/C,2CAA2C;AAC3C,wEAAwE;AACxE,sFAAsF;AACtF,qFAAqF;AACrF,wHAAwH;AACxH,8GAA8G;AAC9G,6FAA6F;AAC7F,qGAAqG;AACrG,mCAAmC;AACnC,oDAAoD;AAC7C,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IAClD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAA;IACzD,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,eAAe,CACvB,0FAA0F,CAC3F,CAAA;IACH,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CACvB,0DAA0D,CAC3D,CAAA;IACH,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CAAC,uCAAuC,CAAC,CAAA;IACpE,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,eAAe,CAAC,iCAAiC,CAAC,CAAA;IAC9D,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,eAAe,CAAC,kCAAkC,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC,CAAA;AA9BY,QAAA,cAAc,kBA8B1B;AAEM,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAQ,EAAE;IACvD,sEAAsE;IACtE,mDAAmD;IACnD,IAAI,CAAC,8CAA8C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,eAAe,CAAC,+BAA+B,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,eAAe,CAAC,kCAAkC,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC,CAAA;AAVY,QAAA,mBAAmB,uBAU/B;AAED,MAAa,eAAgB,SAAQ,KAAK;CAAG;AAA7C,0CAA6C"}
|
package/dist/handle.js
CHANGED
|
@@ -61,7 +61,7 @@ const ensureValidHandle = (handle) => {
|
|
|
61
61
|
if (l.endsWith('-') || l.startsWith('-')) {
|
|
62
62
|
throw new InvalidHandleError('Handle parts can not start or end with hyphens');
|
|
63
63
|
}
|
|
64
|
-
if (i + 1
|
|
64
|
+
if (i + 1 === labels.length && !/^[a-zA-Z]/.test(l)) {
|
|
65
65
|
throw new InvalidHandleError('Handle final component (TLD) must start with ASCII letter');
|
|
66
66
|
}
|
|
67
67
|
}
|
package/dist/handle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,gBAAgB,CAAA;AAE9C,yEAAyE;AACzE,+EAA+E;AAC/E,wBAAwB;AACxB,4EAA4E;AAC/D,QAAA,eAAe,GAAG;IAC7B,QAAQ;IACR,OAAO;IACP,UAAU;IACV,YAAY;IACZ,WAAW;IACX,UAAU;IACV,MAAM;IACN,uDAAuD;IACvD,QAAQ;IACR,sEAAsE;IACtE,qEAAqE;CACtE,CAAA;AAED,kCAAkC;AAClC,oCAAoC;AACpC,4EAA4E;AAC5E,6EAA6E;AAC7E,kBAAkB;AAClB,uEAAuE;AACvE,0CAA0C;AAC1C,0DAA0D;AAC1D,oDAAoD;AACpD,oFAAoF;AACpF,wDAAwD;AACxD,uEAAuE;AACvE,wBAAwB;AACxB,mEAAmE;AACnE,iDAAiD;AACjD,mDAAmD;AACnD,yEAAyE;AACzE,wCAAwC;AACxC,gCAAgC;AACzB,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAQ,EAAE;IACxD,wCAAwC;IACxC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,kBAAkB,CAC1B,+EAA+E,CAChF,CAAA;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,kBAAkB,CAAC,oCAAoC,CAAC,CAAA;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAkB,CAAC,wCAAwC,CAAC,CAAA;IACxE,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,CAAC,CAAA;QAC/D,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,kBAAkB,CAAC,qCAAqC,CAAC,CAAA;QACrE,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,kBAAkB,CAC1B,gDAAgD,CACjD,CAAA;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"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"}
|
package/dist/nsid.js
CHANGED
|
@@ -81,10 +81,10 @@ const ensureValidNsid = (nsid) => {
|
|
|
81
81
|
if (l.endsWith('-') || l.startsWith('-')) {
|
|
82
82
|
throw new InvalidNsidError('NSID parts can not start or end with hyphen');
|
|
83
83
|
}
|
|
84
|
-
if (/^[0-9]/.test(l) && i
|
|
84
|
+
if (/^[0-9]/.test(l) && i === 0) {
|
|
85
85
|
throw new InvalidNsidError('NSID first part may not start with a digit');
|
|
86
86
|
}
|
|
87
|
-
if (!/^[a-zA-Z]+$/.test(l) && i + 1
|
|
87
|
+
if (!/^[a-zA-Z]+$/.test(l) && i + 1 === labels.length) {
|
|
88
88
|
throw new InvalidNsidError('NSID name part must be only letters');
|
|
89
89
|
}
|
|
90
90
|
}
|
package/dist/nsid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nsid.js","sourceRoot":"","sources":["../src/nsid.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nsid.js","sourceRoot":"","sources":["../src/nsid.ts"],"names":[],"mappings":"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"}
|
package/dist/recordkey.js
CHANGED
|
@@ -9,7 +9,7 @@ const ensureValidRecordKey = (rkey) => {
|
|
|
9
9
|
if (!/^[a-zA-Z0-9_~.:-]{1,512}$/.test(rkey)) {
|
|
10
10
|
throw new InvalidRecordKeyError('record key syntax not valid (regex)');
|
|
11
11
|
}
|
|
12
|
-
if (rkey
|
|
12
|
+
if (rkey === '.' || rkey === '..')
|
|
13
13
|
throw new InvalidRecordKeyError('record key can not be "." or ".."');
|
|
14
14
|
};
|
|
15
15
|
exports.ensureValidRecordKey = ensureValidRecordKey;
|
package/dist/recordkey.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordkey.js","sourceRoot":"","sources":["../src/recordkey.ts"],"names":[],"mappings":";;;AAAO,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAQ,EAAE;IACzD,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,CAAA;IAC3E,CAAC;IACD,sEAAsE;IACtE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,qBAAqB,CAAC,qCAAqC,CAAC,CAAA;IACxE,CAAC;IACD,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"recordkey.js","sourceRoot":"","sources":["../src/recordkey.ts"],"names":[],"mappings":";;;AAAO,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAQ,EAAE;IACzD,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,CAAA;IAC3E,CAAC;IACD,sEAAsE;IACtE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,qBAAqB,CAAC,qCAAqC,CAAC,CAAA;IACxE,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;QAC/B,MAAM,IAAI,qBAAqB,CAAC,mCAAmC,CAAC,CAAA;AACxE,CAAC,CAAA;AAVY,QAAA,oBAAoB,wBAUhC;AAEM,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAW,EAAE;IACxD,IAAI,CAAC;QACH,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAXY,QAAA,gBAAgB,oBAW5B;AAED,MAAa,qBAAsB,SAAQ,KAAK;CAAG;AAAnD,sDAAmD"}
|
package/dist/tid.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.InvalidTidError = exports.isValidTid = exports.ensureValidTid = void 0;
|
|
4
4
|
const ensureValidTid = (tid) => {
|
|
5
|
-
if (tid.length
|
|
5
|
+
if (tid.length !== 13) {
|
|
6
6
|
throw new InvalidTidError('TID must be 13 characters');
|
|
7
7
|
}
|
|
8
8
|
// simple regex to enforce most constraints via just regex and length.
|
package/dist/tid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tid.js","sourceRoot":"","sources":["../src/tid.ts"],"names":[],"mappings":";;;AAAO,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IAClD,IAAI,GAAG,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"tid.js","sourceRoot":"","sources":["../src/tid.ts"],"names":[],"mappings":";;;AAAO,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IAClD,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CAAC,2BAA2B,CAAC,CAAA;IACxD,CAAC;IACD,sEAAsE;IACtE,IAAI,CAAC,4DAA4D,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,eAAe,CAAC,8BAA8B,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC,CAAA;AARY,QAAA,cAAc,kBAQ1B;AAEM,MAAM,UAAU,GAAG,CAAC,GAAW,EAAW,EAAE;IACjD,IAAI,CAAC;QACH,IAAA,sBAAc,EAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;YACnC,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAXY,QAAA,UAAU,cAWtB;AAED,MAAa,eAAgB,SAAQ,KAAK;CAAG;AAA7C,0CAA6C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/syntax",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Validation for atproto identifiers and formats: DID, handle, NSID, AT URI, etc",
|
|
6
6
|
"keywords": [
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
},
|
|
18
18
|
"main": "dist/index.js",
|
|
19
19
|
"types": "dist/index.d.ts",
|
|
20
|
-
"dependencies": {},
|
|
21
20
|
"devDependencies": {
|
|
22
|
-
"jest": "^28.1.2"
|
|
21
|
+
"jest": "^28.1.2",
|
|
22
|
+
"typescript": "^5.6.3"
|
|
23
23
|
},
|
|
24
24
|
"browser": {
|
|
25
25
|
"dns/promises": false
|
package/src/aturi_validation.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ensureValidHandle, ensureValidHandleRegex } from './handle'
|
|
2
1
|
import { ensureValidDid, ensureValidDidRegex } from './did'
|
|
2
|
+
import { ensureValidHandle, ensureValidHandleRegex } from './handle'
|
|
3
3
|
import { ensureValidNsid, ensureValidNsidRegex } from './nsid'
|
|
4
4
|
|
|
5
5
|
// Human-readable constraints on ATURI:
|
|
@@ -30,7 +30,7 @@ export const ensureValidAtUri = (uri: string) => {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
const parts = uri.split('/')
|
|
33
|
-
if (parts.length >= 3 && (parts[0]
|
|
33
|
+
if (parts.length >= 3 && (parts[0] !== 'at:' || parts[1].length !== 0)) {
|
|
34
34
|
throw new Error('ATURI must start with "at://"')
|
|
35
35
|
}
|
|
36
36
|
if (parts.length < 3) {
|
|
@@ -48,7 +48,7 @@ export const ensureValidAtUri = (uri: string) => {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
if (parts.length >= 4) {
|
|
51
|
-
if (parts[3].length
|
|
51
|
+
if (parts[3].length === 0) {
|
|
52
52
|
throw new Error(
|
|
53
53
|
'ATURI can not have a slash after authority without a path segment',
|
|
54
54
|
)
|
|
@@ -63,7 +63,7 @@ export const ensureValidAtUri = (uri: string) => {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
if (parts.length >= 5) {
|
|
66
|
-
if (parts[4].length
|
|
66
|
+
if (parts[4].length === 0) {
|
|
67
67
|
throw new Error(
|
|
68
68
|
'ATURI can not have a slash after collection, unless record key is provided',
|
|
69
69
|
)
|
|
@@ -82,7 +82,7 @@ export const ensureValidAtUri = (uri: string) => {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
if (fragmentPart != null) {
|
|
85
|
-
if (fragmentPart.length
|
|
85
|
+
if (fragmentPart.length === 0 || fragmentPart[0] !== '/') {
|
|
86
86
|
throw new Error('ATURI fragment must be non-empty and start with slash')
|
|
87
87
|
}
|
|
88
88
|
// NOTE: enforcing *some* checks here for sanity. Eg, at least no whitespace
|
package/src/did.ts
CHANGED
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
// - hard length limit of 8KBytes
|
|
13
13
|
// - not going to validate "percent encoding" here
|
|
14
14
|
export const ensureValidDid = (did: string): void => {
|
|
15
|
+
if (!did.startsWith('did:')) {
|
|
16
|
+
throw new InvalidDidError('DID requires "did:" prefix')
|
|
17
|
+
}
|
|
18
|
+
|
|
15
19
|
// check that all chars are boring ASCII
|
|
16
20
|
if (!/^[a-zA-Z0-9._:%-]*$/.test(did)) {
|
|
17
21
|
throw new InvalidDidError(
|
|
@@ -19,18 +23,14 @@ export const ensureValidDid = (did: string): void => {
|
|
|
19
23
|
)
|
|
20
24
|
}
|
|
21
25
|
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
26
|
+
const { length, 1: method } = did.split(':')
|
|
27
|
+
if (length < 3) {
|
|
24
28
|
throw new InvalidDidError(
|
|
25
29
|
'DID requires prefix, method, and method-specific content',
|
|
26
30
|
)
|
|
27
31
|
}
|
|
28
32
|
|
|
29
|
-
if (
|
|
30
|
-
throw new InvalidDidError('DID requires "did:" prefix')
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (!/^[a-z]+$/.test(parts[1])) {
|
|
33
|
+
if (!/^[a-z]+$/.test(method)) {
|
|
34
34
|
throw new InvalidDidError('DID method must be lower-case letters')
|
|
35
35
|
}
|
|
36
36
|
|
package/src/handle.ts
CHANGED
|
@@ -65,7 +65,7 @@ export const ensureValidHandle = (handle: string): void => {
|
|
|
65
65
|
'Handle parts can not start or end with hyphens',
|
|
66
66
|
)
|
|
67
67
|
}
|
|
68
|
-
if (i + 1
|
|
68
|
+
if (i + 1 === labels.length && !/^[a-zA-Z]/.test(l)) {
|
|
69
69
|
throw new InvalidHandleError(
|
|
70
70
|
'Handle final component (TLD) must start with ASCII letter',
|
|
71
71
|
)
|
package/src/nsid.ts
CHANGED
|
@@ -84,10 +84,10 @@ export const ensureValidNsid = (nsid: string): void => {
|
|
|
84
84
|
if (l.endsWith('-') || l.startsWith('-')) {
|
|
85
85
|
throw new InvalidNsidError('NSID parts can not start or end with hyphen')
|
|
86
86
|
}
|
|
87
|
-
if (/^[0-9]/.test(l) && i
|
|
87
|
+
if (/^[0-9]/.test(l) && i === 0) {
|
|
88
88
|
throw new InvalidNsidError('NSID first part may not start with a digit')
|
|
89
89
|
}
|
|
90
|
-
if (!/^[a-zA-Z]+$/.test(l) && i + 1
|
|
90
|
+
if (!/^[a-zA-Z]+$/.test(l) && i + 1 === labels.length) {
|
|
91
91
|
throw new InvalidNsidError('NSID name part must be only letters')
|
|
92
92
|
}
|
|
93
93
|
}
|
package/src/recordkey.ts
CHANGED
|
@@ -6,7 +6,7 @@ export const ensureValidRecordKey = (rkey: string): void => {
|
|
|
6
6
|
if (!/^[a-zA-Z0-9_~.:-]{1,512}$/.test(rkey)) {
|
|
7
7
|
throw new InvalidRecordKeyError('record key syntax not valid (regex)')
|
|
8
8
|
}
|
|
9
|
-
if (rkey
|
|
9
|
+
if (rkey === '.' || rkey === '..')
|
|
10
10
|
throw new InvalidRecordKeyError('record key can not be "." or ".."')
|
|
11
11
|
}
|
|
12
12
|
|
package/src/tid.ts
CHANGED
package/tests/aturi.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as readline from 'node:readline'
|
|
1
3
|
import { AtUri, ensureValidAtUri, ensureValidAtUriRegex } from '../src/index'
|
|
2
|
-
import * as readline from 'readline'
|
|
3
|
-
import * as fs from 'fs'
|
|
4
4
|
|
|
5
5
|
describe('At Uris', () => {
|
|
6
6
|
it('parses valid at uris', () => {
|
|
@@ -514,7 +514,7 @@ describe('AtUri validation', () => {
|
|
|
514
514
|
terminal: false,
|
|
515
515
|
})
|
|
516
516
|
lineReader.on('line', (line) => {
|
|
517
|
-
if (line.startsWith('#') || line.length
|
|
517
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
518
518
|
return
|
|
519
519
|
}
|
|
520
520
|
expectValid(line)
|
package/tests/datetime.test.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as readline from 'node:readline'
|
|
1
3
|
import {
|
|
2
|
-
|
|
4
|
+
InvalidDatetimeError,
|
|
3
5
|
ensureValidDatetime,
|
|
6
|
+
isValidDatetime,
|
|
4
7
|
normalizeDatetime,
|
|
5
8
|
normalizeDatetimeAlways,
|
|
6
|
-
InvalidDatetimeError,
|
|
7
9
|
} from '../src'
|
|
8
|
-
import * as readline from 'readline'
|
|
9
|
-
import * as fs from 'fs'
|
|
10
10
|
|
|
11
11
|
describe('datetime validation', () => {
|
|
12
12
|
const expectValid = (h: string) => {
|
|
@@ -26,7 +26,7 @@ describe('datetime validation', () => {
|
|
|
26
26
|
terminal: false,
|
|
27
27
|
})
|
|
28
28
|
lineReader.on('line', (line) => {
|
|
29
|
-
if (line.startsWith('#') || line.length
|
|
29
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
30
30
|
return
|
|
31
31
|
}
|
|
32
32
|
if (!isValidDatetime(line)) {
|
|
@@ -44,7 +44,7 @@ describe('datetime validation', () => {
|
|
|
44
44
|
terminal: false,
|
|
45
45
|
})
|
|
46
46
|
lineReader.on('line', (line) => {
|
|
47
|
-
if (line.startsWith('#') || line.length
|
|
47
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
48
48
|
return
|
|
49
49
|
}
|
|
50
50
|
expectInvalid(line)
|
|
@@ -59,7 +59,7 @@ describe('datetime validation', () => {
|
|
|
59
59
|
terminal: false,
|
|
60
60
|
})
|
|
61
61
|
lineReader.on('line', (line) => {
|
|
62
|
-
if (line.startsWith('#') || line.length
|
|
62
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
63
63
|
return
|
|
64
64
|
}
|
|
65
65
|
expectInvalid(line)
|
package/tests/did.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as readline from 'readline'
|
|
3
|
-
import
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as readline from 'node:readline'
|
|
3
|
+
import { InvalidDidError, ensureValidDid, ensureValidDidRegex } from '../src'
|
|
4
4
|
|
|
5
5
|
describe('DID permissive validation', () => {
|
|
6
6
|
const expectValid = (h: string) => {
|
|
@@ -75,7 +75,7 @@ describe('DID permissive validation', () => {
|
|
|
75
75
|
terminal: false,
|
|
76
76
|
})
|
|
77
77
|
lineReader.on('line', (line) => {
|
|
78
|
-
if (line.startsWith('#') || line.length
|
|
78
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
79
79
|
return
|
|
80
80
|
}
|
|
81
81
|
expectValid(line)
|
|
@@ -90,7 +90,7 @@ describe('DID permissive validation', () => {
|
|
|
90
90
|
terminal: false,
|
|
91
91
|
})
|
|
92
92
|
lineReader.on('line', (line) => {
|
|
93
|
-
if (line.startsWith('#') || line.length
|
|
93
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
94
94
|
return
|
|
95
95
|
}
|
|
96
96
|
expectInvalid(line)
|
package/tests/handle.test.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as readline from 'node:readline'
|
|
1
3
|
import {
|
|
4
|
+
InvalidHandleError,
|
|
2
5
|
ensureValidHandle,
|
|
3
|
-
normalizeAndEnsureValidHandle,
|
|
4
6
|
ensureValidHandleRegex,
|
|
5
|
-
|
|
7
|
+
normalizeAndEnsureValidHandle,
|
|
6
8
|
} from '../src'
|
|
7
|
-
import * as readline from 'readline'
|
|
8
|
-
import * as fs from 'fs'
|
|
9
9
|
|
|
10
10
|
describe('handle validation', () => {
|
|
11
11
|
const expectValid = (h: string) => {
|
|
@@ -201,7 +201,7 @@ describe('handle validation', () => {
|
|
|
201
201
|
terminal: false,
|
|
202
202
|
})
|
|
203
203
|
lineReader.on('line', (line) => {
|
|
204
|
-
if (line.startsWith('#') || line.length
|
|
204
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
205
205
|
return
|
|
206
206
|
}
|
|
207
207
|
expectValid(line)
|
|
@@ -216,7 +216,7 @@ describe('handle validation', () => {
|
|
|
216
216
|
terminal: false,
|
|
217
217
|
})
|
|
218
218
|
lineReader.on('line', (line) => {
|
|
219
|
-
if (line.startsWith('#') || line.length
|
|
219
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
220
220
|
return
|
|
221
221
|
}
|
|
222
222
|
expectInvalid(line)
|
package/tests/nsid.test.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as readline from 'node:readline'
|
|
1
3
|
import {
|
|
2
|
-
ensureValidNsid,
|
|
3
|
-
ensureValidNsidRegex,
|
|
4
4
|
InvalidNsidError,
|
|
5
5
|
NSID,
|
|
6
|
+
ensureValidNsid,
|
|
7
|
+
ensureValidNsidRegex,
|
|
6
8
|
} from '../src'
|
|
7
|
-
import * as readline from 'readline'
|
|
8
|
-
import * as fs from 'fs'
|
|
9
9
|
|
|
10
10
|
describe('NSID parsing & creation', () => {
|
|
11
11
|
it('parses valid NSIDs', () => {
|
|
@@ -134,7 +134,7 @@ describe('NSID validation', () => {
|
|
|
134
134
|
terminal: false,
|
|
135
135
|
})
|
|
136
136
|
lineReader.on('line', (line) => {
|
|
137
|
-
if (line.startsWith('#') || line.length
|
|
137
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
138
138
|
return
|
|
139
139
|
}
|
|
140
140
|
expectValid(line)
|
|
@@ -149,7 +149,7 @@ describe('NSID validation', () => {
|
|
|
149
149
|
terminal: false,
|
|
150
150
|
})
|
|
151
151
|
lineReader.on('line', (line) => {
|
|
152
|
-
if (line.startsWith('#') || line.length
|
|
152
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
153
153
|
return
|
|
154
154
|
}
|
|
155
155
|
expectInvalid(line)
|
package/tests/recordkey.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as readline from 'readline'
|
|
3
|
-
import
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as readline from 'node:readline'
|
|
3
|
+
import { InvalidRecordKeyError, ensureValidRecordKey } from '../src'
|
|
4
4
|
|
|
5
5
|
describe('recordkey validation', () => {
|
|
6
6
|
const expectValid = (r: string) => {
|
|
@@ -18,7 +18,7 @@ describe('recordkey validation', () => {
|
|
|
18
18
|
terminal: false,
|
|
19
19
|
})
|
|
20
20
|
lineReader.on('line', (line) => {
|
|
21
|
-
if (line.startsWith('#') || line.length
|
|
21
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
22
22
|
return
|
|
23
23
|
}
|
|
24
24
|
expectValid(line)
|
|
@@ -33,7 +33,7 @@ describe('recordkey validation', () => {
|
|
|
33
33
|
terminal: false,
|
|
34
34
|
})
|
|
35
35
|
lineReader.on('line', (line) => {
|
|
36
|
-
if (line.startsWith('#') || line.length
|
|
36
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
37
37
|
return
|
|
38
38
|
}
|
|
39
39
|
expectInvalid(line)
|
package/tests/tid.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as readline from 'readline'
|
|
3
|
-
import
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as readline from 'node:readline'
|
|
3
|
+
import { InvalidTidError, ensureValidTid } from '../src'
|
|
4
4
|
|
|
5
5
|
describe('tid validation', () => {
|
|
6
6
|
const expectValid = (t: string) => {
|
|
@@ -18,7 +18,7 @@ describe('tid validation', () => {
|
|
|
18
18
|
terminal: false,
|
|
19
19
|
})
|
|
20
20
|
lineReader.on('line', (line) => {
|
|
21
|
-
if (line.startsWith('#') || line.length
|
|
21
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
22
22
|
return
|
|
23
23
|
}
|
|
24
24
|
expectValid(line)
|
|
@@ -33,7 +33,7 @@ describe('tid validation', () => {
|
|
|
33
33
|
terminal: false,
|
|
34
34
|
})
|
|
35
35
|
lineReader.on('line', (line) => {
|
|
36
|
-
if (line.startsWith('#') || line.length
|
|
36
|
+
if (line.startsWith('#') || line.length === 0) {
|
|
37
37
|
return
|
|
38
38
|
}
|
|
39
39
|
expectInvalid(line)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["./src/aturi.ts","./src/aturi_validation.ts","./src/datetime.ts","./src/did.ts","./src/handle.ts","./src/index.ts","./src/nsid.ts","./src/recordkey.ts","./src/tid.ts"],"version":"5.6.3"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["./tests/aturi.test.ts","./tests/datetime.test.ts","./tests/did.test.ts","./tests/handle.test.ts","./tests/nsid.test.ts","./tests/recordkey.test.ts","./tests/tid.test.ts"],"version":"5.6.3"}
|