@atproto/lexicon 0.4.3 β 0.4.5
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 +13 -0
- package/dist/validators/primitives.d.ts.map +1 -1
- package/dist/validators/primitives.js +34 -15
- package/dist/validators/primitives.js.map +1 -1
- package/package.json +2 -2
- package/src/validators/primitives.ts +42 -17
- package/tests/_scaffolds/lexicons.ts +18 -0
- package/tests/general.test.ts +186 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @atproto/lexicon
|
|
2
2
|
|
|
3
|
+
## 0.4.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`72eba67af`](https://github.com/bluesky-social/atproto/commit/72eba67af1af8320b5400bcb9319d5c3c8407d99), [`72eba67af`](https://github.com/bluesky-social/atproto/commit/72eba67af1af8320b5400bcb9319d5c3c8407d99)]:
|
|
8
|
+
- @atproto/common-web@0.3.2
|
|
9
|
+
|
|
10
|
+
## 0.4.4
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- [#3223](https://github.com/bluesky-social/atproto/pull/3223) [`9fd65ba0f`](https://github.com/bluesky-social/atproto/commit/9fd65ba0fa4caca59fd0e6156145e4c2618e3a95) Thanks [@gaearon](https://github.com/gaearon)! - Add fast paths that skip UTF8 encoding
|
|
15
|
+
|
|
3
16
|
## 0.4.3
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/validators/primitives.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EACL,WAAW,EAIX,gBAAgB,EAGjB,MAAM,UAAU,CAAA;AAEjB,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAoBlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CA+BlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAmElB;AAED,wBAAgB,MAAM,CACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/validators/primitives.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EACL,WAAW,EAIX,gBAAgB,EAGjB,MAAM,UAAU,CAAA;AAEjB,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAoBlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CA+BlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAmElB;AAED,wBAAgB,MAAM,CACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAsLlB;AAED,wBAAgB,KAAK,CACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAmClB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CASlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAUlB"}
|
|
@@ -179,22 +179,41 @@ function string(lexicons, path, def, value) {
|
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
181
|
// maxLength and minLength
|
|
182
|
-
if (typeof def.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
182
|
+
if (typeof def.minLength === 'number' || typeof def.maxLength === 'number') {
|
|
183
|
+
// If the JavaScript string length * 3 is below the maximum limit,
|
|
184
|
+
// its UTF8 length (which <= .length * 3) will also be below.
|
|
185
|
+
if (typeof def.minLength === 'number' && value.length * 3 < def.minLength) {
|
|
186
|
+
return {
|
|
187
|
+
success: false,
|
|
188
|
+
error: new types_1.ValidationError(`${path} must not be shorter than ${def.minLength} characters`),
|
|
189
|
+
};
|
|
191
190
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
191
|
+
// If the JavaScript string length * 3 is within the maximum limit,
|
|
192
|
+
// its UTF8 length (which <= .length * 3) will also be within.
|
|
193
|
+
// When there's no minimal length, this lets us skip the UTF8 length check.
|
|
194
|
+
let canSkipUtf8LenChecks = false;
|
|
195
|
+
if (typeof def.minLength === 'undefined' &&
|
|
196
|
+
typeof def.maxLength === 'number' &&
|
|
197
|
+
value.length * 3 <= def.maxLength) {
|
|
198
|
+
canSkipUtf8LenChecks = true;
|
|
199
|
+
}
|
|
200
|
+
if (!canSkipUtf8LenChecks) {
|
|
201
|
+
const len = (0, common_web_1.utf8Len)(value);
|
|
202
|
+
if (typeof def.maxLength === 'number') {
|
|
203
|
+
if (len > def.maxLength) {
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
error: new types_1.ValidationError(`${path} must not be longer than ${def.maxLength} characters`),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (typeof def.minLength === 'number') {
|
|
211
|
+
if (len < def.minLength) {
|
|
212
|
+
return {
|
|
213
|
+
success: false,
|
|
214
|
+
error: new types_1.ValidationError(`${path} must not be shorter than ${def.minLength} characters`),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
198
217
|
}
|
|
199
218
|
}
|
|
200
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/validators/primitives.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAcA,4BAyBC;AAED,0BAoCC;AAED,0BAwEC;AAED,
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/validators/primitives.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAcA,4BAyBC;AAED,0BAoCC;AAED,0BAwEC;AAED,wBA2LC;AAED,sBAwCC;AAED,0BAcC;AAED,0BAeC;AA/ZD,oDAA0D;AAC1D,0CAAsC;AAEtC,mDAAoC;AACpC,oCAQiB;AAEjB,SAAgB,QAAQ,CACtB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5C,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5C,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3C,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC1C,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5C,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5C;YACE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CAAC,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC;aACnE,CAAA;IACL,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CACrB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,GAAG,GAAG,GAAiB,CAAA;IAEvB,OAAO;IACP,MAAM,IAAI,GAAG,OAAO,KAAK,CAAA;IACzB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;QAC9C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,oBAAoB,CAAC;SACxD,CAAA;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,oBAAoB,CAAC;SACxD,CAAA;IACH,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,KAAK,EAAE,CAAC;aAC3D,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,OAAO,CACrB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,GAAG,GAAG,GAAiB,CAAA;IAEvB,OAAO;IACP,MAAM,IAAI,GAAG,OAAO,KAAK,CAAA;IACzB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;QAC9C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,qBAAqB,CAAC;SACzD,CAAA;IACH,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,qBAAqB,CAAC;SACzD,CAAA;IACH,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,KAAK,EAAE,CAAC;aAC3D,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO;IACP,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAe,CAAC,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,oBAAoB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CACjD;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,UAAU;IACV,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAK,KAAgB,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,4BAA4B,GAAG,CAAC,OAAO,EAAE,CACjD;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,UAAU;IACV,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAK,KAAgB,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAC9C;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,MAAM,CACpB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,GAAG,GAAG,GAAgB,CAAA;IAEtB,OAAO;IACP,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;QAC9C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,mBAAmB,CAAC;SACvD,CAAA;IACH,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,mBAAmB,CAAC;SACvD,CAAA;IACH,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,KAAK,EAAE,CAAC;aAC3D,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO;IACP,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAe,CAAC,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,oBAAoB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CACjD;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3E,kEAAkE;QAClE,6DAA6D;QAC7D,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;YAC1E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,6BAA6B,GAAG,CAAC,SAAS,aAAa,CAC/D;aACF,CAAA;QACH,CAAC;QAED,mEAAmE;QACnE,8DAA8D;QAC9D,2EAA2E;QAC3E,IAAI,oBAAoB,GAAG,KAAK,CAAA;QAChC,IACE,OAAO,GAAG,CAAC,SAAS,KAAK,WAAW;YACpC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;YACjC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS,EACjC,CAAC;YACD,oBAAoB,GAAG,IAAI,CAAA;QAC7B,CAAC;QAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAA,oBAAO,EAAC,KAAK,CAAC,CAAA;YAE1B,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACtC,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,4BAA4B,GAAG,CAAC,SAAS,aAAa,CAC9D;qBACF,CAAA;gBACH,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACtC,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,6BAA6B,GAAG,CAAC,SAAS,aAAa,CAC/D;qBACF,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IACE,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QACpC,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EACpC,CAAC;QACD,IAAI,sBAAsB,GAAG,KAAK,CAAA;QAClC,IAAI,sBAAsB,GAAG,KAAK,CAAA;QAElC,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACrC,wEAAwE;gBACxE,8DAA8D;gBAC9D,sBAAsB,GAAG,KAAK,CAAA;YAChC,CAAC;iBAAM,CAAC;gBACN,sBAAsB,GAAG,IAAI,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;gBACpC,uEAAuE;gBACvE,6DAA6D;gBAC7D,cAAc;gBACd,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,6BAA6B,GAAG,CAAC,YAAY,YAAY,CACjE;iBACF,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,sBAAsB,GAAG,IAAI,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,sBAAsB,IAAI,sBAAsB,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,IAAA,wBAAW,EAAC,KAAK,CAAC,CAAA;YAE9B,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACzC,IAAI,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;oBAC3B,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,4BAA4B,GAAG,CAAC,YAAY,YAAY,CAChE;qBACF,CAAA;gBACH,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACzC,IAAI,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;oBAC3B,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,6BAA6B,GAAG,CAAC,YAAY,YAAY,CACjE;qBACF,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACtC,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACjC,KAAK,QAAQ;gBACX,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACnC,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACjC,KAAK,QAAQ;gBACX,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACpC,KAAK,eAAe;gBAClB,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAC1C,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAClC,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACjC,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACtC,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACjC,KAAK,YAAY;gBACf,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,KAAK,CACnB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,GAAG,GAAG,GAAe,CAAA;IAErB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,uBAAuB,CAAC;SAC3D,CAAA;IACH,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,4BAA4B,GAAG,CAAC,SAAS,QAAQ,CACzD;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,6BAA6B,GAAG,CAAC,SAAS,QAAQ,CAC1D;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,OAAO,CACrB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,IAAI,SAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,gBAAgB,CAAC;SACpD,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,OAAO,CACrB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,OAAO;IACP,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,oBAAoB,CAAC;SACxD,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/lexicon",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "atproto Lexicon schema language library",
|
|
6
6
|
"keywords": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"iso-datestring-validator": "^2.2.2",
|
|
20
20
|
"multiformats": "^9.9.0",
|
|
21
21
|
"zod": "^3.23.8",
|
|
22
|
-
"@atproto/common-web": "^0.3.
|
|
22
|
+
"@atproto/common-web": "^0.3.2",
|
|
23
23
|
"@atproto/syntax": "^0.3.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
@@ -198,27 +198,52 @@ export function string(
|
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
// maxLength and minLength
|
|
201
|
-
if (typeof def.
|
|
202
|
-
|
|
201
|
+
if (typeof def.minLength === 'number' || typeof def.maxLength === 'number') {
|
|
202
|
+
// If the JavaScript string length * 3 is below the maximum limit,
|
|
203
|
+
// its UTF8 length (which <= .length * 3) will also be below.
|
|
204
|
+
if (typeof def.minLength === 'number' && value.length * 3 < def.minLength) {
|
|
205
|
+
return {
|
|
206
|
+
success: false,
|
|
207
|
+
error: new ValidationError(
|
|
208
|
+
`${path} must not be shorter than ${def.minLength} characters`,
|
|
209
|
+
),
|
|
210
|
+
}
|
|
211
|
+
}
|
|
203
212
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
// If the JavaScript string length * 3 is within the maximum limit,
|
|
214
|
+
// its UTF8 length (which <= .length * 3) will also be within.
|
|
215
|
+
// When there's no minimal length, this lets us skip the UTF8 length check.
|
|
216
|
+
let canSkipUtf8LenChecks = false
|
|
217
|
+
if (
|
|
218
|
+
typeof def.minLength === 'undefined' &&
|
|
219
|
+
typeof def.maxLength === 'number' &&
|
|
220
|
+
value.length * 3 <= def.maxLength
|
|
221
|
+
) {
|
|
222
|
+
canSkipUtf8LenChecks = true
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (!canSkipUtf8LenChecks) {
|
|
226
|
+
const len = utf8Len(value)
|
|
227
|
+
|
|
228
|
+
if (typeof def.maxLength === 'number') {
|
|
229
|
+
if (len > def.maxLength) {
|
|
230
|
+
return {
|
|
231
|
+
success: false,
|
|
232
|
+
error: new ValidationError(
|
|
233
|
+
`${path} must not be longer than ${def.maxLength} characters`,
|
|
234
|
+
),
|
|
235
|
+
}
|
|
211
236
|
}
|
|
212
237
|
}
|
|
213
|
-
}
|
|
214
238
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
239
|
+
if (typeof def.minLength === 'number') {
|
|
240
|
+
if (len < def.minLength) {
|
|
241
|
+
return {
|
|
242
|
+
success: false,
|
|
243
|
+
error: new ValidationError(
|
|
244
|
+
`${path} must not be shorter than ${def.minLength} characters`,
|
|
245
|
+
),
|
|
246
|
+
}
|
|
222
247
|
}
|
|
223
248
|
}
|
|
224
249
|
}
|
|
@@ -313,6 +313,24 @@ const lexicons: LexiconDoc[] = [
|
|
|
313
313
|
},
|
|
314
314
|
},
|
|
315
315
|
},
|
|
316
|
+
{
|
|
317
|
+
lexicon: 1,
|
|
318
|
+
id: 'com.example.stringLengthNoMinLength',
|
|
319
|
+
defs: {
|
|
320
|
+
main: {
|
|
321
|
+
type: 'record',
|
|
322
|
+
record: {
|
|
323
|
+
type: 'object',
|
|
324
|
+
properties: {
|
|
325
|
+
string: {
|
|
326
|
+
type: 'string',
|
|
327
|
+
maxLength: 4,
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
},
|
|
316
334
|
{
|
|
317
335
|
lexicon: 1,
|
|
318
336
|
id: 'com.example.stringLengthGrapheme',
|
package/tests/general.test.ts
CHANGED
|
@@ -567,26 +567,207 @@ describe('Record validation', () => {
|
|
|
567
567
|
})
|
|
568
568
|
|
|
569
569
|
it('Applies string length constraint', () => {
|
|
570
|
+
// Shorter than two UTF8 characters
|
|
571
|
+
expect(() =>
|
|
572
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
573
|
+
$type: 'com.example.stringLength',
|
|
574
|
+
string: '',
|
|
575
|
+
}),
|
|
576
|
+
).toThrow('Record/string must not be shorter than 2 characters')
|
|
577
|
+
expect(() =>
|
|
578
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
579
|
+
$type: 'com.example.stringLength',
|
|
580
|
+
string: 'a',
|
|
581
|
+
}),
|
|
582
|
+
).toThrow('Record/string must not be shorter than 2 characters')
|
|
583
|
+
|
|
584
|
+
// Two to four UTF8 characters
|
|
585
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
586
|
+
$type: 'com.example.stringLength',
|
|
587
|
+
string: 'ab',
|
|
588
|
+
})
|
|
589
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
590
|
+
$type: 'com.example.stringLength',
|
|
591
|
+
string: '\u0301', // Combining acute accent (2 bytes)
|
|
592
|
+
})
|
|
593
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
594
|
+
$type: 'com.example.stringLength',
|
|
595
|
+
string: 'a\u0301', // 'a' + combining acute accent (1 + 2 bytes = 3 bytes)
|
|
596
|
+
})
|
|
597
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
598
|
+
$type: 'com.example.stringLength',
|
|
599
|
+
string: 'aΓ©', // 'a' (1 byte) + 'Γ©' (2 bytes) = 3 bytes
|
|
600
|
+
})
|
|
601
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
602
|
+
$type: 'com.example.stringLength',
|
|
603
|
+
string: 'abc',
|
|
604
|
+
})
|
|
570
605
|
lex.assertValidRecord('com.example.stringLength', {
|
|
571
606
|
$type: 'com.example.stringLength',
|
|
572
|
-
string: '
|
|
607
|
+
string: 'δΈ', // CJK character (3 bytes)
|
|
573
608
|
})
|
|
609
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
610
|
+
$type: 'com.example.stringLength',
|
|
611
|
+
string: '\uD83D', // Unpaired high surrogate (3 bytes)
|
|
612
|
+
})
|
|
613
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
614
|
+
$type: 'com.example.stringLength',
|
|
615
|
+
string: 'abcd',
|
|
616
|
+
})
|
|
617
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
618
|
+
$type: 'com.example.stringLength',
|
|
619
|
+
string: 'éé', // 'é' + 'é' (2 + 2 bytes = 4 bytes)
|
|
620
|
+
})
|
|
621
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
622
|
+
$type: 'com.example.stringLength',
|
|
623
|
+
string: 'aaΓ©', // 1 + 1 + 2 = 4 bytes
|
|
624
|
+
})
|
|
625
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
626
|
+
$type: 'com.example.stringLength',
|
|
627
|
+
string: 'π', // 4 bytes
|
|
628
|
+
})
|
|
629
|
+
|
|
574
630
|
expect(() =>
|
|
575
631
|
lex.assertValidRecord('com.example.stringLength', {
|
|
576
632
|
$type: 'com.example.stringLength',
|
|
577
|
-
string: '
|
|
633
|
+
string: 'abcde',
|
|
578
634
|
}),
|
|
579
|
-
).toThrow('Record/string must not be
|
|
635
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
580
636
|
expect(() =>
|
|
581
637
|
lex.assertValidRecord('com.example.stringLength', {
|
|
582
638
|
$type: 'com.example.stringLength',
|
|
583
|
-
string: '
|
|
639
|
+
string: 'a\u0301\u0301', // 1 + (2 * 2) = 5 bytes
|
|
584
640
|
}),
|
|
585
641
|
).toThrow('Record/string must not be longer than 4 characters')
|
|
586
642
|
expect(() =>
|
|
587
643
|
lex.assertValidRecord('com.example.stringLength', {
|
|
588
644
|
$type: 'com.example.stringLength',
|
|
589
|
-
string: '
|
|
645
|
+
string: '\uD83D\uD83D', // Two unpaired high surrogates (3 * 2 = 6 bytes)
|
|
646
|
+
}),
|
|
647
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
648
|
+
expect(() =>
|
|
649
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
650
|
+
$type: 'com.example.stringLength',
|
|
651
|
+
string: 'ééé', // 2 + 2 + 2 bytes = 6 bytes
|
|
652
|
+
}),
|
|
653
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
654
|
+
expect(() =>
|
|
655
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
656
|
+
$type: 'com.example.stringLength',
|
|
657
|
+
string: 'πa', // 4 + 1 bytes = 5 bytes
|
|
658
|
+
}),
|
|
659
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
660
|
+
expect(() =>
|
|
661
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
662
|
+
$type: 'com.example.stringLength',
|
|
663
|
+
string: 'π¨π¨', // 4 + 4 = 8 bytes
|
|
664
|
+
}),
|
|
665
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
666
|
+
expect(() =>
|
|
667
|
+
lex.assertValidRecord('com.example.stringLength', {
|
|
668
|
+
$type: 'com.example.stringLength',
|
|
669
|
+
string: 'π¨βπ©βπ§βπ§', // 4 emojis Γ 4 bytes + 3 ZWJs Γ 3 bytes = 25 bytes
|
|
670
|
+
}),
|
|
671
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
672
|
+
})
|
|
673
|
+
|
|
674
|
+
it('Applies string length constraint (no minLength)', () => {
|
|
675
|
+
// Shorter than two UTF8 characters
|
|
676
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
677
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
678
|
+
string: '',
|
|
679
|
+
})
|
|
680
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
681
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
682
|
+
string: 'a',
|
|
683
|
+
})
|
|
684
|
+
|
|
685
|
+
// Two to four UTF8 characters
|
|
686
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
687
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
688
|
+
string: 'ab',
|
|
689
|
+
})
|
|
690
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
691
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
692
|
+
string: '\u0301', // Combining acute accent (2 bytes)
|
|
693
|
+
})
|
|
694
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
695
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
696
|
+
string: 'a\u0301', // 'a' + combining acute accent (1 + 2 bytes = 3 bytes)
|
|
697
|
+
})
|
|
698
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
699
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
700
|
+
string: 'aΓ©', // 'a' (1 byte) + 'Γ©' (2 bytes) = 3 bytes
|
|
701
|
+
})
|
|
702
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
703
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
704
|
+
string: 'abc',
|
|
705
|
+
})
|
|
706
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
707
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
708
|
+
string: 'δΈ', // CJK character (3 bytes)
|
|
709
|
+
})
|
|
710
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
711
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
712
|
+
string: '\uD83D', // Unpaired high surrogate (3 bytes)
|
|
713
|
+
})
|
|
714
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
715
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
716
|
+
string: 'abcd',
|
|
717
|
+
})
|
|
718
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
719
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
720
|
+
string: 'éé', // 'é' + 'é' (2 + 2 bytes = 4 bytes)
|
|
721
|
+
})
|
|
722
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
723
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
724
|
+
string: 'aaΓ©', // 1 + 1 + 2 = 4 bytes
|
|
725
|
+
})
|
|
726
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
727
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
728
|
+
string: 'π', // 4 bytes
|
|
729
|
+
})
|
|
730
|
+
|
|
731
|
+
expect(() =>
|
|
732
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
733
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
734
|
+
string: 'abcde',
|
|
735
|
+
}),
|
|
736
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
737
|
+
expect(() =>
|
|
738
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
739
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
740
|
+
string: 'a\u0301\u0301', // 1 + (2 * 2) = 5 bytes
|
|
741
|
+
}),
|
|
742
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
743
|
+
expect(() =>
|
|
744
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
745
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
746
|
+
string: '\uD83D\uD83D', // Two unpaired high surrogates (3 * 2 = 6 bytes)
|
|
747
|
+
}),
|
|
748
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
749
|
+
expect(() =>
|
|
750
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
751
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
752
|
+
string: 'ééé', // 2 + 2 + 2 bytes = 6 bytes
|
|
753
|
+
}),
|
|
754
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
755
|
+
expect(() =>
|
|
756
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
757
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
758
|
+
string: 'πa', // 4 + 1 bytes = 5 bytes
|
|
759
|
+
}),
|
|
760
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
761
|
+
expect(() =>
|
|
762
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
763
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
764
|
+
string: 'π¨π¨', // 4 + 4 = 8 bytes
|
|
765
|
+
}),
|
|
766
|
+
).toThrow('Record/string must not be longer than 4 characters')
|
|
767
|
+
expect(() =>
|
|
768
|
+
lex.assertValidRecord('com.example.stringLengthNoMinLength', {
|
|
769
|
+
$type: 'com.example.stringLengthNoMinLength',
|
|
770
|
+
string: 'π¨βπ©βπ§βπ§', // 4 emojis Γ 4 bytes + 3 ZWJs Γ 3 bytes = 25 bytes
|
|
590
771
|
}),
|
|
591
772
|
).toThrow('Record/string must not be longer than 4 characters')
|
|
592
773
|
})
|