@cedarjs/api 9.0.0-canary.1784 → 9.0.0-canary.3124

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.
Files changed (137) hide show
  1. package/dist/auth/index.d.ts +14 -1
  2. package/dist/auth/index.d.ts.map +1 -1
  3. package/dist/auth/index.js +19 -5
  4. package/dist/bins/cedar.js +14 -0
  5. package/dist/bins/cfw.js +14 -0
  6. package/dist/bins/redwood.js +14 -0
  7. package/dist/bins/tsc.js +8 -0
  8. package/dist/cache/clients/RedisClient.d.ts.map +1 -1
  9. package/dist/cache/index.d.ts.map +1 -1
  10. package/dist/cache/index.js +8 -4
  11. package/dist/errors.d.ts +9 -1
  12. package/dist/errors.d.ts.map +1 -1
  13. package/dist/errors.js +9 -2
  14. package/dist/index.d.ts +5 -4
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +5 -19
  17. package/dist/logger/index.d.ts +7 -5
  18. package/dist/logger/index.d.ts.map +1 -1
  19. package/dist/logger/index.js +1 -1
  20. package/dist/runtime.d.ts +48 -0
  21. package/dist/runtime.d.ts.map +1 -0
  22. package/dist/runtime.js +131 -0
  23. package/dist/signedTokens/index.d.ts +2 -0
  24. package/dist/signedTokens/index.d.ts.map +1 -0
  25. package/dist/signedTokens/index.js +1 -0
  26. package/dist/signedTokens/signedTokens.d.ts +99 -0
  27. package/dist/signedTokens/signedTokens.d.ts.map +1 -0
  28. package/dist/signedTokens/signedTokens.js +100 -0
  29. package/dist/transforms.d.ts +1 -0
  30. package/dist/transforms.d.ts.map +1 -1
  31. package/dist/transforms.js +82 -1
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/validations/validations.d.ts +21 -8
  34. package/dist/validations/validations.d.ts.map +1 -1
  35. package/dist/validations/validations.js +16 -14
  36. package/package.json +35 -46
  37. package/LICENSE +0 -21
  38. package/dist/cjs/auth/index.d.ts +0 -51
  39. package/dist/cjs/auth/index.d.ts.map +0 -1
  40. package/dist/cjs/auth/index.js +0 -129
  41. package/dist/cjs/auth/parseJWT.d.ts +0 -6
  42. package/dist/cjs/auth/parseJWT.d.ts.map +0 -1
  43. package/dist/cjs/auth/parseJWT.js +0 -57
  44. package/dist/cjs/auth/verifiers/base64Sha1Verifier.d.ts +0 -18
  45. package/dist/cjs/auth/verifiers/base64Sha1Verifier.d.ts.map +0 -1
  46. package/dist/cjs/auth/verifiers/base64Sha1Verifier.js +0 -77
  47. package/dist/cjs/auth/verifiers/base64Sha256Verifier.d.ts +0 -18
  48. package/dist/cjs/auth/verifiers/base64Sha256Verifier.d.ts.map +0 -1
  49. package/dist/cjs/auth/verifiers/base64Sha256Verifier.js +0 -77
  50. package/dist/cjs/auth/verifiers/common.d.ts +0 -112
  51. package/dist/cjs/auth/verifiers/common.d.ts.map +0 -1
  52. package/dist/cjs/auth/verifiers/common.js +0 -89
  53. package/dist/cjs/auth/verifiers/index.d.ts +0 -8
  54. package/dist/cjs/auth/verifiers/index.d.ts.map +0 -1
  55. package/dist/cjs/auth/verifiers/index.js +0 -39
  56. package/dist/cjs/auth/verifiers/jwtVerifier.d.ts +0 -18
  57. package/dist/cjs/auth/verifiers/jwtVerifier.d.ts.map +0 -1
  58. package/dist/cjs/auth/verifiers/jwtVerifier.js +0 -84
  59. package/dist/cjs/auth/verifiers/secretKeyVerifier.d.ts +0 -11
  60. package/dist/cjs/auth/verifiers/secretKeyVerifier.d.ts.map +0 -1
  61. package/dist/cjs/auth/verifiers/secretKeyVerifier.js +0 -43
  62. package/dist/cjs/auth/verifiers/sha1Verifier.d.ts +0 -17
  63. package/dist/cjs/auth/verifiers/sha1Verifier.d.ts.map +0 -1
  64. package/dist/cjs/auth/verifiers/sha1Verifier.js +0 -85
  65. package/dist/cjs/auth/verifiers/sha256Verifier.d.ts +0 -17
  66. package/dist/cjs/auth/verifiers/sha256Verifier.d.ts.map +0 -1
  67. package/dist/cjs/auth/verifiers/sha256Verifier.js +0 -85
  68. package/dist/cjs/auth/verifiers/skipVerifier.d.ts +0 -11
  69. package/dist/cjs/auth/verifiers/skipVerifier.d.ts.map +0 -1
  70. package/dist/cjs/auth/verifiers/skipVerifier.js +0 -40
  71. package/dist/cjs/auth/verifiers/timestampSchemeVerifier.d.ts +0 -14
  72. package/dist/cjs/auth/verifiers/timestampSchemeVerifier.d.ts.map +0 -1
  73. package/dist/cjs/auth/verifiers/timestampSchemeVerifier.js +0 -86
  74. package/dist/cjs/bins/cedar.d.ts +0 -9
  75. package/dist/cjs/bins/cedar.d.ts.map +0 -1
  76. package/dist/cjs/bins/cedar.js +0 -36
  77. package/dist/cjs/bins/cfw.d.ts +0 -3
  78. package/dist/cjs/bins/cfw.d.ts.map +0 -1
  79. package/dist/cjs/bins/cfw.js +0 -36
  80. package/dist/cjs/bins/redwood.d.ts +0 -9
  81. package/dist/cjs/bins/redwood.d.ts.map +0 -1
  82. package/dist/cjs/bins/redwood.js +0 -36
  83. package/dist/cjs/bins/tsc.d.ts +0 -3
  84. package/dist/cjs/bins/tsc.d.ts.map +0 -1
  85. package/dist/cjs/bins/tsc.js +0 -30
  86. package/dist/cjs/cache/clients/BaseClient.d.ts +0 -11
  87. package/dist/cjs/cache/clients/BaseClient.d.ts.map +0 -1
  88. package/dist/cjs/cache/clients/BaseClient.js +0 -31
  89. package/dist/cjs/cache/clients/InMemoryClient.d.ts +0 -31
  90. package/dist/cjs/cache/clients/InMemoryClient.d.ts.map +0 -1
  91. package/dist/cjs/cache/clients/InMemoryClient.js +0 -94
  92. package/dist/cjs/cache/clients/MemcachedClient.d.ts +0 -16
  93. package/dist/cjs/cache/clients/MemcachedClient.d.ts.map +0 -1
  94. package/dist/cjs/cache/clients/MemcachedClient.js +0 -79
  95. package/dist/cjs/cache/clients/RedisClient.d.ts +0 -20
  96. package/dist/cjs/cache/clients/RedisClient.d.ts.map +0 -1
  97. package/dist/cjs/cache/clients/RedisClient.js +0 -83
  98. package/dist/cjs/cache/errors.d.ts +0 -4
  99. package/dist/cjs/cache/errors.d.ts.map +0 -1
  100. package/dist/cjs/cache/errors.js +0 -33
  101. package/dist/cjs/cache/index.d.ts +0 -35
  102. package/dist/cjs/cache/index.d.ts.map +0 -1
  103. package/dist/cjs/cache/index.js +0 -171
  104. package/dist/cjs/cors.d.ts +0 -16
  105. package/dist/cjs/cors.d.ts.map +0 -1
  106. package/dist/cjs/cors.js +0 -93
  107. package/dist/cjs/errors.d.ts +0 -5
  108. package/dist/cjs/errors.d.ts.map +0 -1
  109. package/dist/cjs/errors.js +0 -38
  110. package/dist/cjs/event.d.ts +0 -3
  111. package/dist/cjs/event.d.ts.map +0 -1
  112. package/dist/cjs/event.js +0 -34
  113. package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts +0 -4
  114. package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts.map +0 -1
  115. package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.js +0 -72
  116. package/dist/cjs/index.d.ts +0 -15
  117. package/dist/cjs/index.d.ts.map +0 -1
  118. package/dist/cjs/index.js +0 -70
  119. package/dist/cjs/logger/index.d.ts +0 -179
  120. package/dist/cjs/logger/index.d.ts.map +0 -1
  121. package/dist/cjs/logger/index.js +0 -195
  122. package/dist/cjs/package.json +0 -1
  123. package/dist/cjs/transforms.d.ts +0 -35
  124. package/dist/cjs/transforms.d.ts.map +0 -1
  125. package/dist/cjs/transforms.js +0 -98
  126. package/dist/cjs/types.d.ts +0 -25
  127. package/dist/cjs/types.d.ts.map +0 -1
  128. package/dist/cjs/types.js +0 -16
  129. package/dist/cjs/validations/errors.d.ts +0 -101
  130. package/dist/cjs/validations/errors.d.ts.map +0 -1
  131. package/dist/cjs/validations/errors.js +0 -298
  132. package/dist/cjs/validations/validations.d.ts +0 -222
  133. package/dist/cjs/validations/validations.d.ts.map +0 -1
  134. package/dist/cjs/validations/validations.js +0 -351
  135. package/dist/cjs/webhooks/index.d.ts +0 -77
  136. package/dist/cjs/webhooks/index.d.ts.map +0 -1
  137. package/dist/cjs/webhooks/index.js +0 -102
@@ -0,0 +1,99 @@
1
+ import type { SignOptions } from 'jsonwebtoken';
2
+ /**
3
+ * Name of the environment variable that holds the default secret used to
4
+ * sign and verify tokens when no `secret` option is passed.
5
+ */
6
+ export declare const SIGNED_TOKEN_SECRET_ENV_VAR = "SIGNED_TOKEN_SECRET";
7
+ /**
8
+ * Machine-readable reason a `SignedTokenError` was thrown. Use it to tell an
9
+ * expired link apart from a tampered one without matching on the message.
10
+ */
11
+ export type SignedTokenErrorCode = 'MISSING_SECRET' | 'MISSING_PURPOSE' | 'MISSING_TOKEN' | 'SIGN_FAILED' | 'INVALID' | 'EXPIRED' | 'PURPOSE_MISMATCH';
12
+ /**
13
+ * Thrown by `createSignedToken` and `verifySignedToken` whenever a token
14
+ * cannot be created or cannot be trusted. Verification never returns `null`
15
+ * or `false` for a bad token; it always throws so a missing check cannot
16
+ * silently pass.
17
+ */
18
+ export declare class SignedTokenError extends Error {
19
+ code: SignedTokenErrorCode;
20
+ constructor(code: SignedTokenErrorCode, message: string, cause?: unknown);
21
+ }
22
+ /**
23
+ * How long a token stays valid. A number is a count of seconds. A string is
24
+ * a duration such as `'10m'`, `'2h'`, or `'7 days'`.
25
+ */
26
+ export type SignedTokenExpiresIn = NonNullable<SignOptions['expiresIn']>;
27
+ export interface CreateSignedTokenOptions<TPayload extends object> {
28
+ /**
29
+ * The claims to carry inside the token. Serialized as JSON, so only
30
+ * JSON-compatible values survive the round trip (a `Date` comes back as a
31
+ * string).
32
+ */
33
+ payload: TPayload;
34
+ /**
35
+ * What the token is for, such as `'google-oauth-state'` or
36
+ * `'email-confirmation'`. A token only verifies when the same purpose is
37
+ * passed to `verifySignedToken`, so a token minted for one flow cannot be
38
+ * replayed in another.
39
+ */
40
+ purpose: string;
41
+ /** How long the token stays valid. See `SignedTokenExpiresIn`. */
42
+ expiresIn: SignedTokenExpiresIn;
43
+ /**
44
+ * The secret to sign with. Defaults to the `SIGNED_TOKEN_SECRET`
45
+ * environment variable. There is no built-in fallback: when neither is set
46
+ * a `SignedTokenError` with code `MISSING_SECRET` is thrown.
47
+ */
48
+ secret?: string;
49
+ }
50
+ export interface VerifySignedTokenOptions {
51
+ /** The purpose the token must have been created with. */
52
+ purpose: string;
53
+ /**
54
+ * The secret to verify with. Defaults to the `SIGNED_TOKEN_SECRET`
55
+ * environment variable. There is no built-in fallback: when neither is set
56
+ * a `SignedTokenError` with code `MISSING_SECRET` is thrown.
57
+ */
58
+ secret?: string;
59
+ }
60
+ /**
61
+ * Creates a compact, URL-safe token that carries `payload`, is bound to
62
+ * `purpose`, expires after `expiresIn`, and is signed so it can only have
63
+ * come from this application.
64
+ *
65
+ * Use it wherever a value has to leave the server and come back untouched:
66
+ * OAuth `state`, email confirmation and password-set links, unsubscribe
67
+ * links, or short-lived capability tokens.
68
+ *
69
+ * @example
70
+ *
71
+ * const state = createSignedToken({
72
+ * payload: { organizationId, userId },
73
+ * purpose: 'google-oauth-state',
74
+ * expiresIn: '10m',
75
+ * })
76
+ */
77
+ export declare function createSignedToken<TPayload extends object>({ payload, purpose, expiresIn, secret, }: CreateSignedTokenOptions<TPayload>): string;
78
+ /**
79
+ * Verifies a token created by `createSignedToken` and returns its payload.
80
+ *
81
+ * Throws a `SignedTokenError` when the token is missing, was signed with a
82
+ * different secret, has been tampered with, has expired, or was created for
83
+ * a different `purpose`. The error's `code` says which.
84
+ *
85
+ * The token argument accepts `null` and `undefined` on purpose so a value
86
+ * read straight from a query string or a header can be passed in as-is. A
87
+ * missing token is a verification failure, never a skipped check.
88
+ *
89
+ * @example
90
+ *
91
+ * const { organizationId, userId } = verifySignedToken<{
92
+ * organizationId: string
93
+ * userId: string
94
+ * }>(event.queryStringParameters?.state, {
95
+ * purpose: 'google-oauth-state',
96
+ * })
97
+ */
98
+ export declare function verifySignedToken<TPayload extends object = Record<string, unknown>>(token: string | null | undefined, { purpose, secret }: VerifySignedTokenOptions): TPayload;
99
+ //# sourceMappingURL=signedTokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signedTokens.d.ts","sourceRoot":"","sources":["../../src/signedTokens/signedTokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C;;;GAGG;AACH,eAAO,MAAM,2BAA2B,wBAAwB,CAAA;AAEhE;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAC5B,gBAAgB,GAChB,iBAAiB,GACjB,eAAe,GACf,aAAa,GACb,SAAS,GACT,SAAS,GACT,kBAAkB,CAAA;AAEtB;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,oBAAoB,CAAA;gBAEd,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAKzE;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAA;AAExE,MAAM,WAAW,wBAAwB,CAAC,QAAQ,SAAS,MAAM;IAC/D;;;;OAIG;IACH,OAAO,EAAE,QAAQ,CAAA;IACjB;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,SAAS,EAAE,oBAAoB,CAAA;IAC/B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAiED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,SAAS,MAAM,EAAE,EACzD,OAAO,EACP,OAAO,EACP,SAAS,EACT,MAAM,GACP,EAAE,wBAAwB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAkB7C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEjD,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,wBAAwB,GAC5C,QAAQ,CA2CV"}
@@ -0,0 +1,100 @@
1
+ import jwt from "jsonwebtoken";
2
+ const SIGNED_TOKEN_SECRET_ENV_VAR = "SIGNED_TOKEN_SECRET";
3
+ class SignedTokenError extends Error {
4
+ code;
5
+ constructor(code, message, cause) {
6
+ super(message, cause === void 0 ? void 0 : { cause });
7
+ this.name = "SignedTokenError";
8
+ this.code = code;
9
+ }
10
+ }
11
+ const ALGORITHM = "HS256";
12
+ function resolveSecret(secret, action) {
13
+ const resolved = secret ?? process.env[SIGNED_TOKEN_SECRET_ENV_VAR];
14
+ if (typeof resolved === "string" && resolved.length > 0) {
15
+ return resolved;
16
+ }
17
+ throw new SignedTokenError(
18
+ "MISSING_SECRET",
19
+ `Cannot ${action} a signed token because no secret is configured. Set the ${SIGNED_TOKEN_SECRET_ENV_VAR} environment variable (generate a value with \`yarn cedar generate secret\`), or pass the \`secret\` option explicitly.`
20
+ );
21
+ }
22
+ function assertPurpose(purpose) {
23
+ if (typeof purpose === "string" && purpose.length > 0) {
24
+ return;
25
+ }
26
+ throw new SignedTokenError(
27
+ "MISSING_PURPOSE",
28
+ "A signed token needs a non-empty `purpose` string, such as 'google-oauth-state' or 'email-confirmation'. The purpose is what stops a token created for one flow from verifying in another."
29
+ );
30
+ }
31
+ function isSignedTokenClaims(claims) {
32
+ if (typeof claims !== "object" || claims === null) {
33
+ return false;
34
+ }
35
+ if (!("payload" in claims) || !("purpose" in claims) || !("exp" in claims)) {
36
+ return false;
37
+ }
38
+ return typeof claims.payload === "object" && claims.payload !== null && typeof claims.purpose === "string" && typeof claims.exp === "number";
39
+ }
40
+ function createSignedToken({
41
+ payload,
42
+ purpose,
43
+ expiresIn,
44
+ secret
45
+ }) {
46
+ assertPurpose(purpose);
47
+ const resolvedSecret = resolveSecret(secret, "create");
48
+ try {
49
+ return jwt.sign({ payload, purpose }, resolvedSecret, {
50
+ algorithm: ALGORITHM,
51
+ expiresIn
52
+ });
53
+ } catch (e) {
54
+ const message = e instanceof Error ? e.message : String(e);
55
+ throw new SignedTokenError(
56
+ "SIGN_FAILED",
57
+ `Could not create signed token: ${message}`,
58
+ e
59
+ );
60
+ }
61
+ }
62
+ function verifySignedToken(token, { purpose, secret }) {
63
+ assertPurpose(purpose);
64
+ const resolvedSecret = resolveSecret(secret, "verify");
65
+ if (typeof token !== "string" || token.length === 0) {
66
+ throw new SignedTokenError("MISSING_TOKEN", "No signed token was provided.");
67
+ }
68
+ let claims;
69
+ try {
70
+ claims = jwt.verify(token, resolvedSecret, { algorithms: [ALGORITHM] });
71
+ } catch (e) {
72
+ if (e instanceof jwt.TokenExpiredError) {
73
+ throw new SignedTokenError("EXPIRED", "The signed token has expired.", e);
74
+ }
75
+ throw new SignedTokenError(
76
+ "INVALID",
77
+ "The signed token is invalid or was not created by this application.",
78
+ e
79
+ );
80
+ }
81
+ if (!isSignedTokenClaims(claims)) {
82
+ throw new SignedTokenError(
83
+ "INVALID",
84
+ "The signed token is invalid or was not created by this application."
85
+ );
86
+ }
87
+ if (claims.purpose !== purpose) {
88
+ throw new SignedTokenError(
89
+ "PURPOSE_MISMATCH",
90
+ `The signed token was created for purpose '${claims.purpose}' but was verified with purpose '${purpose}'.`
91
+ );
92
+ }
93
+ return claims.payload;
94
+ }
95
+ export {
96
+ SIGNED_TOKEN_SECRET_ENV_VAR,
97
+ SignedTokenError,
98
+ createSignedToken,
99
+ verifySignedToken
100
+ };
@@ -17,6 +17,7 @@ export declare const parseLambdaEventBody: (event: APIGatewayProxyEvent) => any;
17
17
  * see readme here: https://github.com/ardatan/whatwg-node/tree/master/packages/server#aws-lambda
18
18
  */
19
19
  export declare const parseFetchEventBody: (event: Request) => Promise<any>;
20
+ export declare const requestToBaseEvent: (request: Request) => Promise<APIGatewayProxyEvent>;
20
21
  export declare const isFetchApiRequest: (event: Request | APIGatewayProxyEvent) => event is Request;
21
22
  /**
22
23
  *
@@ -1 +1 @@
1
- {"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAKtD,MAAM,WAAW,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACzD,QAAQ,EAAE,KAAK,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,GAAG,CAAA;CACX;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,oBAAoB,QAU/D,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAU,OAAO,OAAO,iBAQvD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,OAAO,OAAO,GAAG,oBAAoB,KACpC,KAAK,IAAI,OAcX,CAAA;AAaD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,oBAAoB,GAAG,OAAO,GACpC,OAAO,CAAC,cAAc,CAAC,CAkBzB;AAID;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,0CAcvE,CAAA"}
1
+ {"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAKtD,MAAM,WAAW,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACzD,QAAQ,EAAE,KAAK,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,GAAG,CAAA;CACX;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,oBAAoB,QAU/D,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAU,OAAO,OAAO,iBAQvD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,SAAS,OAAO,KACf,OAAO,CAAC,oBAAoB,CAgE9B,CAAA;AAoCD,eAAO,MAAM,iBAAiB,GAC5B,OAAO,OAAO,GAAG,oBAAoB,KACpC,KAAK,IAAI,OAcX,CAAA;AAaD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,oBAAoB,GAAG,OAAO,GACpC,OAAO,CAAC,cAAc,CAAC,CAkBzB;AAID;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,0CAcvE,CAAA"}
@@ -16,6 +16,86 @@ const parseFetchEventBody = async (event) => {
16
16
  const body = await event.text();
17
17
  return body ? JSON.parse(body) : {};
18
18
  };
19
+ const requestToBaseEvent = async (request) => {
20
+ const url = new URL(request.url);
21
+ const bodyText = await request.clone().text();
22
+ const queryStringParameters = {};
23
+ url.searchParams.forEach((value, key) => {
24
+ queryStringParameters[key] = value;
25
+ });
26
+ const headers = Object.fromEntries(request.headers.entries());
27
+ if (!headers["x-forwarded-proto"]) {
28
+ headers["x-forwarded-proto"] = url.protocol.replace(":", "");
29
+ }
30
+ const event = {
31
+ headers,
32
+ body: bodyText || null,
33
+ httpMethod: request.method,
34
+ path: url.pathname,
35
+ queryStringParameters,
36
+ isBase64Encoded: false,
37
+ multiValueHeaders: toMultiValueHeaders(request.headers),
38
+ multiValueQueryStringParameters: toMultiValueQueryStringParameters(url),
39
+ pathParameters: null,
40
+ stageVariables: null,
41
+ resource: url.pathname,
42
+ requestContext: {
43
+ accountId: "cedar",
44
+ apiId: "cedar",
45
+ authorizer: void 0,
46
+ protocol: "HTTP/1.1",
47
+ identity: {
48
+ accessKey: null,
49
+ accountId: null,
50
+ apiKey: null,
51
+ apiKeyId: null,
52
+ caller: null,
53
+ clientCert: null,
54
+ cognitoAuthenticationProvider: null,
55
+ cognitoAuthenticationType: null,
56
+ cognitoIdentityId: null,
57
+ cognitoIdentityPoolId: null,
58
+ principalOrgId: null,
59
+ sourceIp: "",
60
+ user: null,
61
+ userAgent: request.headers.get("user-agent"),
62
+ userArn: null
63
+ },
64
+ path: url.pathname,
65
+ stage: "",
66
+ requestId: "cedar-request",
67
+ requestTimeEpoch: Date.now(),
68
+ resourceId: "cedar",
69
+ resourcePath: url.pathname,
70
+ httpMethod: request.method
71
+ }
72
+ };
73
+ return event;
74
+ };
75
+ function toMultiValueHeaders(headers) {
76
+ const values = /* @__PURE__ */ new Map();
77
+ for (const [name, value] of headers.entries()) {
78
+ const existing = values.get(name) ?? [];
79
+ existing.push(value);
80
+ values.set(name, existing);
81
+ }
82
+ if (values.size === 0) {
83
+ return {};
84
+ }
85
+ return Object.fromEntries(values.entries());
86
+ }
87
+ function toMultiValueQueryStringParameters(url) {
88
+ const values = /* @__PURE__ */ new Map();
89
+ for (const [name, value] of url.searchParams.entries()) {
90
+ const existing = values.get(name) ?? [];
91
+ existing.push(value);
92
+ values.set(name, existing);
93
+ }
94
+ if (values.size === 0) {
95
+ return null;
96
+ }
97
+ return Object.fromEntries(values.entries());
98
+ }
19
99
  const isFetchApiRequest = (event) => {
20
100
  if (event.constructor.name === "Request" || event.constructor.name === PonyfillRequest.name) {
21
101
  return true;
@@ -66,5 +146,6 @@ export {
66
146
  normalizeRequest,
67
147
  parseFetchEventBody,
68
148
  parseLambdaEventBody,
69
- removeNulls
149
+ removeNulls,
150
+ requestToBaseEvent
70
151
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,aAAa,CAAA;AAEvC;;;;GAIG;AAEH,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1D,KAAK,aAAa,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAA;AAG7D,KAAK,iCAAiC,CACpC,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;AAGvC,KAAK,2CAA2C,CAC9C,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB;KACD,CAAC,IAAI,MAAM,iCAAiC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAC1D,iCAAiC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GACnD,IAAI;CACT,CAAA;AAGD,KAAK,iCAAiC,CACpC,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;AAGvC,KAAK,mBAAmB,CACtB,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB,2CAA2C,CAAC,OAAO,EAAE,IAAI,CAAC,GAC5D,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAE9B,MAAM,MAAM,qBAAqB,CAAC,CAAC,EAAE,gBAAgB,IAAI;KAEtD,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,gBAAgB,GAC9C,GAAG,GACH,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC;CAC7D,GAAG;KAED,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,gBAAgB,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;CAC1E,CAAA;AAID,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,EACtB,gBAAgB,IACd,CAAC,CAAC,OAAO,CACX,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,GACzE,iCAAiC,CAC/B,OAAO,EACP,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAC9C,CACJ,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,aAAa,CAAA;AAEvC;;;;GAIG;AAEH,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1D,KAAK,aAAa,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAA;AAG7D,KAAK,iCAAiC,CACpC,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;AAGvC,KAAK,2CAA2C,CAC9C,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB;KACD,CAAC,IAAI,MAAM,iCAAiC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAC5D,iCAAiC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;CAC7D,CAAA;AAGD,KAAK,iCAAiC,CACpC,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;AAGvC,KAAK,mBAAmB,CACtB,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,IACpB,2CAA2C,CAAC,OAAO,EAAE,IAAI,CAAC,GAC5D,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAE9B,MAAM,MAAM,qBAAqB,CAAC,CAAC,EAAE,gBAAgB,IAAI;KAGrD,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,gBAAgB,GAAG,GAAG,GAAG,KAAK,CAChE,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACpD,GAAG;KAED,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,gBAAgB,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;CAC1E,CAAA;AAID,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,SAAS,EACzB,IAAI,SAAS,SAAS,EACtB,gBAAgB,IACd,CAAC,CAAC,OAAO,CACX,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,GACzE,iCAAiC,CAC/B,OAAO,EACP,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAC9C,CACJ,CAAA"}
@@ -1,4 +1,3 @@
1
- import { PrismaClient } from '@prisma/client';
2
1
  type WithOptionalMessage<T = Record<string, unknown>> = T & {
3
2
  /**
4
3
  * A message to be shown if the validation fails.
@@ -134,9 +133,21 @@ interface CustomValidatorOptions extends WithOptionalMessage {
134
133
  */
135
134
  with: () => void;
136
135
  }
137
- interface UniquenessValidatorOptions extends WithOptionalMessage {
138
- db?: PrismaClient;
136
+ interface UniquenessValidatorOptions<TDb extends UniquenessDb = UniquenessDb> extends WithOptionalMessage {
137
+ db?: TDb;
139
138
  }
139
+ type UniquenessWhere = Record<'AND' | 'NOT', Record<string, unknown>[]>;
140
+ export type UniquenessTransactionClient = Record<string, {
141
+ findFirst: (args: {
142
+ where: UniquenessWhere;
143
+ }) => Promise<unknown>;
144
+ }>;
145
+ interface UniquenessDb {
146
+ $transaction: (...args: any[]) => Promise<any>;
147
+ }
148
+ type TxClientOf<TDb extends UniquenessDb> = TDb extends {
149
+ $transaction: (callback: (tx: infer TTx) => any, ...args: any[]) => any;
150
+ } ? TTx : never;
140
151
  interface ValidationRecipe {
141
152
  /**
142
153
  * Requires that a field NOT be present, meaning it must be `null` or `undefined`.
@@ -195,8 +206,10 @@ interface ValidationRecipe {
195
206
  */
196
207
  presence?: boolean | PresenceValidatorOptions;
197
208
  /**
198
- * Run a custom validation function which should either throw or return nothing.
199
- * If the function throws an error, the error message will be used as the validation error associated with the field.
209
+ * Run a custom validation function which should either throw or return
210
+ * nothing.
211
+ * If the function throws an error, the error message will be used as the
212
+ * validation error associated with the field.
200
213
  */
201
214
  custom?: CustomValidatorOptions;
202
215
  }
@@ -210,13 +223,13 @@ interface ValidationWithMessagesRecipe extends ValidationRecipe {
210
223
  length?: WithRequiredMessage<LengthValidatorOptions>;
211
224
  numericality?: WithRequiredMessage<NumericalityValidatorOptions>;
212
225
  presence?: WithRequiredMessage<PresenceValidatorOptions>;
213
- custom?: WithRequiredMessage<CustomValidatorOptions>;
226
+ custom?: CustomValidatorOptions;
214
227
  }
215
228
  export declare function validate(value: unknown, labelOrRecipe: ValidationWithMessagesRecipe, recipe?: never): void;
216
229
  export declare function validate(value: unknown, labelOrRecipe: string, recipe: ValidationRecipe): void;
217
230
  export declare const validateWithSync: (func: () => void) => void;
218
231
  export declare const validateWith: (func: () => Promise<any>) => Promise<void>;
219
- export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: (tx: PrismaClient) => Promise<any>, callback: never): Promise<any>;
220
- export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: UniquenessValidatorOptions, callback?: (tx: PrismaClient) => Promise<any>): Promise<any>;
232
+ export declare function validateUniqueness<TDb extends UniquenessDb = UniquenessDb>(model: string, fields: Record<string, unknown>, optionsOrCallback: (tx: TxClientOf<TDb>) => Promise<any>, callback?: never): Promise<any>;
233
+ export declare function validateUniqueness<TDb extends UniquenessDb = UniquenessDb>(model: string, fields: Record<string, unknown>, optionsOrCallback: UniquenessValidatorOptions<TDb>, callback?: (tx: TxClientOf<TDb>) => Promise<any>): Promise<any>;
221
234
  export {};
222
235
  //# sourceMappingURL=validations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/validations/validations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/validations/validations.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { PrismaClient } from "@prisma/client";
2
1
  import pascalcase from "pascalcase";
3
2
  import * as ValidationErrors from "./errors.js";
4
3
  const VALIDATORS = {
@@ -223,9 +222,8 @@ const fieldsToString = (fields) => {
223
222
  return output.join(", ");
224
223
  };
225
224
  const validationError = (type, name, options, substitutions = {}) => {
226
- const errorClassName = `${pascalcase(
227
- type
228
- )}ValidationError`;
225
+ const pascalType = pascalcase(type);
226
+ const errorClassName = `${pascalType}ValidationError`;
229
227
  const ErrorClass = ValidationErrors[errorClassName];
230
228
  const errorMessage = typeof options === "object" ? options.message : void 0;
231
229
  throw new ErrorClass(name, errorMessage, substitutions);
@@ -243,9 +241,11 @@ function validate(value, labelOrRecipe, recipe) {
243
241
  if (typeof labelOrRecipe === "object") {
244
242
  label = "";
245
243
  validationRecipe = labelOrRecipe;
246
- } else {
244
+ } else if (recipe) {
247
245
  label = labelOrRecipe;
248
246
  validationRecipe = recipe;
247
+ } else {
248
+ throw new Error("invalid options");
249
249
  }
250
250
  for (const [validator, options] of Object.entries(validationRecipe)) {
251
251
  if (typeof options === "undefined") {
@@ -274,19 +274,21 @@ async function validateUniqueness(model, fields, optionsOrCallback, callback) {
274
274
  const { $self, $scope, ...rest } = fields;
275
275
  let options = {};
276
276
  let validCallback;
277
- let db = null;
278
277
  if (typeof optionsOrCallback === "function") {
279
278
  validCallback = optionsOrCallback;
280
- } else {
279
+ } else if (callback) {
281
280
  options = optionsOrCallback;
282
281
  validCallback = callback;
283
- }
284
- if (options.db) {
285
- const { db: customDb, ...restOptions } = options;
286
- options = restOptions;
287
- db = customDb;
288
282
  } else {
289
- db = new PrismaClient();
283
+ throw new Error("validateUniqueness requires a callback function");
284
+ }
285
+ const { db: _db, ...restOptions } = options;
286
+ const db = options.db;
287
+ options = restOptions;
288
+ if (!db) {
289
+ throw new Error(
290
+ "validateUniqueness could not resolve a Prisma `db` instance. Pass `{ db }` in options, or ensure `src/lib/db` exports `db`"
291
+ );
290
292
  }
291
293
  const where = {
292
294
  AND: [rest],
@@ -301,7 +303,7 @@ async function validateUniqueness(model, fields, optionsOrCallback, callback) {
301
303
  return await db.$transaction(async (tx) => {
302
304
  const found = await tx[model].findFirst({ where });
303
305
  if (found) {
304
- validationError("uniqueness", fieldsToString(fields), options);
306
+ validationError("uniqueness", fieldsToString(rest), options);
305
307
  }
306
308
  return validCallback(tx);
307
309
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cedarjs/api",
3
- "version": "9.0.0-canary.1784+baa47810a",
3
+ "version": "9.0.0-canary.3124",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/cedarjs/cedar.git",
@@ -10,112 +10,98 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
- "import": {
13
+ "default": {
14
14
  "types": "./dist/index.d.ts",
15
15
  "default": "./dist/index.js"
16
- },
17
- "require": {
18
- "types": "./dist/cjs/index.d.ts",
19
- "default": "./dist/cjs/index.js"
20
16
  }
21
17
  },
22
18
  "./package.json": "./package.json",
19
+ "./runtime": {
20
+ "default": {
21
+ "types": "./dist/runtime.d.ts",
22
+ "default": "./dist/runtime.js"
23
+ }
24
+ },
23
25
  "./auth": {
24
- "import": {
26
+ "default": {
25
27
  "types": "./dist/auth/index.d.ts",
26
28
  "default": "./dist/auth/index.js"
27
- },
28
- "require": {
29
- "types": "./dist/cjs/auth/index.d.ts",
30
- "default": "./dist/cjs/auth/index.js"
31
29
  }
32
30
  },
33
31
  "./cache": {
34
- "import": {
32
+ "default": {
35
33
  "types": "./dist/cache/index.d.ts",
36
34
  "default": "./dist/cache/index.js"
37
- },
38
- "require": {
39
- "types": "./dist/cjs/cache/index.d.ts",
40
- "default": "./dist/cjs/cache/index.js"
41
35
  }
42
36
  },
43
37
  "./logger": {
44
- "import": {
38
+ "default": {
45
39
  "types": "./dist/logger/index.d.ts",
46
40
  "default": "./dist/logger/index.js"
47
- },
48
- "require": {
49
- "types": "./dist/cjs/logger/index.d.ts",
50
- "default": "./dist/cjs/logger/index.js"
51
41
  }
52
42
  },
53
43
  "./webhooks": {
54
- "import": {
44
+ "default": {
55
45
  "types": "./dist/webhooks/index.d.ts",
56
46
  "default": "./dist/webhooks/index.js"
57
- },
58
- "require": {
59
- "types": "./dist/cjs/webhooks/index.d.ts",
60
- "default": "./dist/cjs/webhooks/index.js"
61
47
  }
62
48
  }
63
49
  },
64
50
  "main": "./dist/index.js",
65
51
  "types": "./dist/index.d.ts",
66
52
  "bin": {
67
- "cedar": "./dist/cjs/bins/cedar.js",
68
- "cedarjs": "./dist/cjs/bins/cedar.js",
69
- "cfw": "./dist/cjs/bins/cfw.js",
70
- "redwood": "./dist/cjs/bins/redwood.js",
71
- "rw": "./dist/cjs/bins/redwood.js",
72
- "tsc": "./dist/cjs/bins/tsc.js"
53
+ "cedar": "./dist/bins/cedar.js",
54
+ "cedarjs": "./dist/bins/cedar.js",
55
+ "cfw": "./dist/bins/cfw.js",
56
+ "redwood": "./dist/bins/redwood.js",
57
+ "rw": "./dist/bins/redwood.js",
58
+ "tsc": "./dist/bins/tsc.js"
73
59
  },
74
60
  "files": [
75
61
  "dist/",
76
62
  "package.json"
77
63
  ],
78
64
  "scripts": {
79
- "build": "tsx ./build.mts && yarn build:types",
65
+ "build": "node ./build.mts && yarn build:types",
80
66
  "build:pack": "yarn pack -o cedarjs-api.tgz",
81
- "build:types": "tsc --build --verbose ./tsconfig.build.json ./tsconfig.cjs.json",
67
+ "build:types": "tsc --build --verbose ./tsconfig.build.json",
82
68
  "build:watch": "nodemon --watch src --ext \"js,jsx,ts,tsx\" --ignore dist --exec \"yarn build\"",
83
- "check:attw": "yarn rw-fwtools-attw",
69
+ "check:attw": "yarn cedar-fwtools-attw",
84
70
  "check:package": "concurrently npm:check:attw yarn:publint",
85
71
  "prepublishOnly": "NODE_ENV=production yarn build",
86
72
  "test": "vitest run",
87
73
  "test:watch": "vitest watch"
88
74
  },
89
75
  "dependencies": {
90
- "@prisma/client": "6.19.2",
76
+ "@prisma/client": "7.10.0",
91
77
  "@whatwg-node/fetch": "0.10.13",
92
78
  "cookie": "1.1.1",
93
79
  "humanize-string": "2.1.0",
94
80
  "jsonwebtoken": "9.0.3",
95
81
  "pascalcase": "1.0.0",
96
- "pino": "9.7.0",
82
+ "picoquery": "2.5.0",
83
+ "pino": "10.3.1",
97
84
  "title-case": "3.0.3"
98
85
  },
99
86
  "devDependencies": {
100
- "@cedarjs/framework-tools": "9.0.0-canary.1784",
101
- "@types/aws-lambda": "8.10.160",
87
+ "@cedarjs/framework-tools": "9.0.0-canary.3124",
88
+ "@types/aws-lambda": "8.10.163",
102
89
  "@types/jsonwebtoken": "9.0.10",
103
90
  "@types/memjs": "1",
104
91
  "@types/pascalcase": "1.0.3",
105
92
  "@types/split2": "4.2.3",
106
- "concurrently": "9.2.1",
93
+ "concurrently": "9.2.4",
107
94
  "memjs": "1.3.2",
108
- "publint": "0.3.17",
109
- "redis": "5.10.0",
95
+ "publint": "0.3.24",
96
+ "redis": "6.2.1",
110
97
  "split2": "4.2.0",
111
98
  "ts-toolbelt": "9.6.0",
112
- "tsx": "4.21.0",
113
99
  "typescript": "5.9.3",
114
- "vitest": "3.2.4"
100
+ "vitest": "4.1.11"
115
101
  },
116
102
  "peerDependencies": {
117
103
  "memjs": "1.3.2",
118
- "redis": "5.10.0"
104
+ "redis": "6.2.1"
119
105
  },
120
106
  "peerDependenciesMeta": {
121
107
  "memjs": {
@@ -125,8 +111,11 @@
125
111
  "optional": true
126
112
  }
127
113
  },
114
+ "engines": {
115
+ "node": ">=24"
116
+ },
128
117
  "publishConfig": {
129
118
  "access": "public"
130
119
  },
131
- "gitHead": "baa47810a7defb73de27fdf513b815d679509b5e"
120
+ "gitHead": "3905ed045508b861b495f8d5630d76c7a157d8f1"
132
121
  }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Cedar
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.