@schemavaults/auth-common 0.22.8 → 0.22.11

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.
@@ -1,7 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import { passwordSchema } from './password_requirements';
3
+ import { normalizedEmailSchema } from './normalize-email';
3
4
  export const emailCredentialsSchema = z.object({
4
- email: z.string().email(),
5
+ email: normalizedEmailSchema,
5
6
  password: passwordSchema
6
7
  }).required({
7
8
  email: true,
@@ -1 +1 @@
1
- {"version":3,"file":"email_credentials.js","sourceRoot":"","sources":["../../src/credentials/email_credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IACzB,QAAQ,EAAE,cAAc;CACzB,CAAC,CAAC,QAAQ,CAAC;IACV,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"email_credentials.js","sourceRoot":"","sources":["../../src/credentials/email_credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,qBAAqB;IAC5B,QAAQ,EAAE,cAAc;CACzB,CAAC,CAAC,QAAQ,CAAC;IACV,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC,MAAM,EAAE,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { passwordSchema } from './password_requirements';
2
+ export { normalizeEmail, normalizedEmailSchema } from './normalize-email';
2
3
  export { emailCredentialsSchema, type EmailCredentials } from './email_credentials';
3
4
  export { emailRegistrationCredentialsSchema, type EmailRegistrationCredentials } from './register_credentials';
@@ -1,4 +1,5 @@
1
1
  export { passwordSchema } from './password_requirements';
2
+ export { normalizeEmail, normalizedEmailSchema } from './normalize-email';
2
3
  export { emailCredentialsSchema } from './email_credentials';
3
4
  export { emailRegistrationCredentialsSchema } from './register_credentials';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAyB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,kCAAkC,EAAqC,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAyB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,kCAAkC,EAAqC,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Canonical form of an email address for storage and comparison: trimmed
4
+ * and lowercased. RFC 5321 technically allows a case-sensitive local part,
5
+ * but mainstream mail providers treat addresses case-insensitively, and
6
+ * treating case-variants as distinct accounts would let one mailbox
7
+ * register multiple times (e.g. `user@example.com` vs `User@example.com`).
8
+ */
9
+ export declare function normalizeEmail(email: string): string;
10
+ /**
11
+ * Email schema that normalizes (trims + lowercases) at parse time, so any
12
+ * payload validated with it carries the canonical form of the address.
13
+ */
14
+ export declare const normalizedEmailSchema: z.ZodString;
15
+ export default normalizeEmail;
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Canonical form of an email address for storage and comparison: trimmed
4
+ * and lowercased. RFC 5321 technically allows a case-sensitive local part,
5
+ * but mainstream mail providers treat addresses case-insensitively, and
6
+ * treating case-variants as distinct accounts would let one mailbox
7
+ * register multiple times (e.g. `user@example.com` vs `User@example.com`).
8
+ */
9
+ export function normalizeEmail(email) {
10
+ return email.trim().toLowerCase();
11
+ }
12
+ /**
13
+ * Email schema that normalizes (trims + lowercases) at parse time, so any
14
+ * payload validated with it carries the canonical form of the address.
15
+ */
16
+ export const normalizedEmailSchema = z.string().trim().toLowerCase().email();
17
+ export default normalizeEmail;
18
+ //# sourceMappingURL=normalize-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-email.js","sourceRoot":"","sources":["../../src/credentials/normalize-email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;AAE7E,eAAe,cAAc,CAAC"}
package/dist/index.d.ts CHANGED
@@ -35,6 +35,7 @@ export { authorizeClientApplicationFormType } from "./authorize-client-applicati
35
35
  export { paginationOptionsSchema, DEFAULT_PAGINATION_PAGE_INDEX, DEFAULT_PAGINATION_PAGE_SIZE, isValidPaginationOptions, } from "./pagination";
36
36
  export type { PaginationOptions } from "./pagination";
37
37
  export { timingSafeStringEqual } from "./timing-safe-string-equal";
38
+ export { sanitizeNextHref, MAX_NEXT_HREF_LENGTH, } from "./sanitize-next-href";
38
39
  export { isOriginInAllowedList } from "./cors";
39
40
  export { oauth2StateSchema, OAUTH2_STATE_VSCHAR_REGEX, parseOAuth2State, OAuth2StateValidationError, } from "./oauth2-state-schema";
40
41
  export type { OAuth2State } from "./oauth2-state-schema";
package/dist/index.js CHANGED
@@ -24,6 +24,7 @@ export { determineRefreshTokenCookieSameSiteValue } from "./determineRefreshToke
24
24
  export { authorizeClientApplicationFormType } from "./authorize-client-application-form-type";
25
25
  export { paginationOptionsSchema, DEFAULT_PAGINATION_PAGE_INDEX, DEFAULT_PAGINATION_PAGE_SIZE, isValidPaginationOptions, } from "./pagination";
26
26
  export { timingSafeStringEqual } from "./timing-safe-string-equal";
27
+ export { sanitizeNextHref, MAX_NEXT_HREF_LENGTH, } from "./sanitize-next-href";
27
28
  export { isOriginInAllowedList } from "./cors";
28
29
  export { oauth2StateSchema, OAUTH2_STATE_VSCHAR_REGEX, parseOAuth2State, OAuth2StateValidationError, } from "./oauth2-state-schema";
29
30
  export { createAuthorizationCodePOSTBodySchema, createRefreshTokenPOSTBodySchema, } from "./auth_acquire_tokens_grant_types";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,mCAAmC,EACnC,qCAAqC,GACtC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAE5D,cAAc,eAAe,CAAC;AAG9B,mBAAmB;AACnB,cAAc,cAAc,CAAC;AAM7B,cAAc,cAAc,CAAC;AAG7B,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EACL,wBAAwB,EACxB,qCAAqC,EACrC,mCAAmC,EACnC,+BAA+B,EAC/B,wCAAwC,EACxC,wBAAwB,EACxB,uBAAuB,GAOxB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,OAAO,CAAC;AACtB,OAAO,EACL,+BAA+B,EAE/B,6CAA6C,GAE9C,MAAM,yBAAyB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAChB,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,2CAA2C,EAC3C,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,iCAAiC,EACjC,kCAAkC,EAClC,4BAA4B,EAC5B,+BAA+B,EAC/B,oCAAoC,EACpC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,GACzC,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AAEtG,OAAO,EAAE,kCAAkC,EAAE,MAAM,0CAA0C,CAAC;AAE9F,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qCAAqC,EACrC,gCAAgC,GACjC,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,mCAAmC,EACnC,qCAAqC,GACtC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAE5D,cAAc,eAAe,CAAC;AAG9B,mBAAmB;AACnB,cAAc,cAAc,CAAC;AAM7B,cAAc,cAAc,CAAC;AAG7B,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EACL,wBAAwB,EACxB,qCAAqC,EACrC,mCAAmC,EACnC,+BAA+B,EAC/B,wCAAwC,EACxC,wBAAwB,EACxB,uBAAuB,GAOxB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,OAAO,CAAC;AACtB,OAAO,EACL,+BAA+B,EAE/B,6CAA6C,GAE9C,MAAM,yBAAyB,CAAC;AAEjC,cAAc,mCAAmC,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,gBAAgB,EAChB,gCAAgC,EAChC,yCAAyC,EACzC,kCAAkC,EAClC,2CAA2C,EAC3C,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,iCAAiC,EACjC,kCAAkC,EAClC,4BAA4B,EAC5B,+BAA+B,EAC/B,oCAAoC,EACpC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,GACzC,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AAEtG,OAAO,EAAE,kCAAkC,EAAE,MAAM,0CAA0C,CAAC;AAE9F,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qCAAqC,EACrC,gCAAgC,GACjC,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Maximum accepted `next_href` length. Generous enough for deep paths
3
+ * with query strings while keeping the value log- and cookie-safe.
4
+ */
5
+ export declare const MAX_NEXT_HREF_LENGTH: 2048;
6
+ /**
7
+ * @name sanitizeNextHref
8
+ * @description Validate a post-login redirect target from an untrusted
9
+ * source (query param, form field). Returns the normalized same-origin
10
+ * path (`pathname + search + hash`) when the value is a safe internal
11
+ * absolute-path reference, or `null` when it is absent or unsafe.
12
+ * Callers should treat `null` as "use the default destination".
13
+ */
14
+ export declare function sanitizeNextHref(value: unknown): string | null;
15
+ export default sanitizeNextHref;
@@ -0,0 +1,71 @@
1
+ // The `next_href` parameter carries the URL a user was trying to reach
2
+ // when an auth route guard bounced them to the login page, so that the
3
+ // post-login redirect can return them to it. Because the value round-trips
4
+ // through a user-controlled query string, it is an open-redirect vector
5
+ // unless it is strictly confined to a same-origin path.
6
+ //
7
+ // This sanitizer accepts only an absolute-path reference (RFC 3986
8
+ // §4.2: begins with "/" but not "//") and returns the normalized
9
+ // `pathname + search + hash`. Everything else — absolute URLs,
10
+ // protocol-relative URLs ("//evil.example"), backslash variants
11
+ // ("/\evil.example", which browsers treat as "//"), control characters,
12
+ // or values a URL parser resolves off-origin — is rejected with `null`
13
+ // so callers can fall back to their default destination.
14
+ /**
15
+ * Maximum accepted `next_href` length. Generous enough for deep paths
16
+ * with query strings while keeping the value log- and cookie-safe.
17
+ */
18
+ export const MAX_NEXT_HREF_LENGTH = 2048;
19
+ // Sentinel base origin used to resolve the candidate path. If the
20
+ // parsed result escapes this origin, the value was not a plain path.
21
+ const SANITIZE_BASE_ORIGIN = "https://next-href.invalid";
22
+ // eslint-disable-next-line no-control-regex
23
+ const CONTROL_CHARS_REGEX = /[\u0000-\u001f\u007f]/;
24
+ /**
25
+ * @name sanitizeNextHref
26
+ * @description Validate a post-login redirect target from an untrusted
27
+ * source (query param, form field). Returns the normalized same-origin
28
+ * path (`pathname + search + hash`) when the value is a safe internal
29
+ * absolute-path reference, or `null` when it is absent or unsafe.
30
+ * Callers should treat `null` as "use the default destination".
31
+ */
32
+ export function sanitizeNextHref(value) {
33
+ if (typeof value !== "string") {
34
+ return null;
35
+ }
36
+ if (value.length === 0 || value.length > MAX_NEXT_HREF_LENGTH) {
37
+ return null;
38
+ }
39
+ // Must be an absolute-path reference: "/..." but never "//..." (a
40
+ // protocol-relative URL) nor "/\..." (browser-normalized to "//").
41
+ if (!value.startsWith("/")) {
42
+ return null;
43
+ }
44
+ if (value.startsWith("//") || value.startsWith("/\\")) {
45
+ return null;
46
+ }
47
+ if (CONTROL_CHARS_REGEX.test(value)) {
48
+ return null;
49
+ }
50
+ let parsed;
51
+ try {
52
+ parsed = new URL(value, SANITIZE_BASE_ORIGIN);
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ // A plain path resolved against the sentinel base must stay on the
58
+ // sentinel origin; anything else smuggled in a scheme or authority.
59
+ if (parsed.origin !== SANITIZE_BASE_ORIGIN) {
60
+ return null;
61
+ }
62
+ // Defense-in-depth: reject if normalization still yields a
63
+ // protocol-relative shape (e.g. via backslash tricks the guards
64
+ // above didn't anticipate).
65
+ if (parsed.pathname.startsWith("//")) {
66
+ return null;
67
+ }
68
+ return `${parsed.pathname}${parsed.search}${parsed.hash}`;
69
+ }
70
+ export default sanitizeNextHref;
71
+ //# sourceMappingURL=sanitize-next-href.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-next-href.js","sourceRoot":"","sources":["../src/sanitize-next-href.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,uEAAuE;AACvE,2EAA2E;AAC3E,wEAAwE;AACxE,wDAAwD;AACxD,EAAE;AACF,mEAAmE;AACnE,iEAAiE;AACjE,+DAA+D;AAC/D,gEAAgE;AAChE,wEAAwE;AACxE,uEAAuE;AACvE,yDAAyD;AAEzD;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAa,CAAC;AAElD,kEAAkE;AAClE,qEAAqE;AACrE,MAAM,oBAAoB,GAAG,2BAAoC,CAAC;AAElE,4CAA4C;AAC5C,MAAM,mBAAmB,GAAW,uBAAuB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,kEAAkE;IAClE,mEAAmE;IACnE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,2DAA2D;IAC3D,gEAAgE;IAChE,4BAA4B;IAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,eAAe,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@schemavaults/auth-common",
3
3
  "description": "Types and utility functions for authentication and authorization",
4
- "version": "0.22.8",
4
+ "version": "0.22.11",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
7
7
  "repository": {