@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.
- package/dist/auth/index.d.ts +14 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +19 -5
- package/dist/bins/cedar.js +14 -0
- package/dist/bins/cfw.js +14 -0
- package/dist/bins/redwood.js +14 -0
- package/dist/bins/tsc.js +8 -0
- package/dist/cache/clients/RedisClient.d.ts.map +1 -1
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +8 -4
- package/dist/errors.d.ts +9 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +9 -2
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -19
- package/dist/logger/index.d.ts +7 -5
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +1 -1
- package/dist/runtime.d.ts +48 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +131 -0
- package/dist/signedTokens/index.d.ts +2 -0
- package/dist/signedTokens/index.d.ts.map +1 -0
- package/dist/signedTokens/index.js +1 -0
- package/dist/signedTokens/signedTokens.d.ts +99 -0
- package/dist/signedTokens/signedTokens.d.ts.map +1 -0
- package/dist/signedTokens/signedTokens.js +100 -0
- package/dist/transforms.d.ts +1 -0
- package/dist/transforms.d.ts.map +1 -1
- package/dist/transforms.js +82 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validations/validations.d.ts +21 -8
- package/dist/validations/validations.d.ts.map +1 -1
- package/dist/validations/validations.js +16 -14
- package/package.json +35 -46
- package/LICENSE +0 -21
- package/dist/cjs/auth/index.d.ts +0 -51
- package/dist/cjs/auth/index.d.ts.map +0 -1
- package/dist/cjs/auth/index.js +0 -129
- package/dist/cjs/auth/parseJWT.d.ts +0 -6
- package/dist/cjs/auth/parseJWT.d.ts.map +0 -1
- package/dist/cjs/auth/parseJWT.js +0 -57
- package/dist/cjs/auth/verifiers/base64Sha1Verifier.d.ts +0 -18
- package/dist/cjs/auth/verifiers/base64Sha1Verifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/base64Sha1Verifier.js +0 -77
- package/dist/cjs/auth/verifiers/base64Sha256Verifier.d.ts +0 -18
- package/dist/cjs/auth/verifiers/base64Sha256Verifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/base64Sha256Verifier.js +0 -77
- package/dist/cjs/auth/verifiers/common.d.ts +0 -112
- package/dist/cjs/auth/verifiers/common.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/common.js +0 -89
- package/dist/cjs/auth/verifiers/index.d.ts +0 -8
- package/dist/cjs/auth/verifiers/index.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/index.js +0 -39
- package/dist/cjs/auth/verifiers/jwtVerifier.d.ts +0 -18
- package/dist/cjs/auth/verifiers/jwtVerifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/jwtVerifier.js +0 -84
- package/dist/cjs/auth/verifiers/secretKeyVerifier.d.ts +0 -11
- package/dist/cjs/auth/verifiers/secretKeyVerifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/secretKeyVerifier.js +0 -43
- package/dist/cjs/auth/verifiers/sha1Verifier.d.ts +0 -17
- package/dist/cjs/auth/verifiers/sha1Verifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/sha1Verifier.js +0 -85
- package/dist/cjs/auth/verifiers/sha256Verifier.d.ts +0 -17
- package/dist/cjs/auth/verifiers/sha256Verifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/sha256Verifier.js +0 -85
- package/dist/cjs/auth/verifiers/skipVerifier.d.ts +0 -11
- package/dist/cjs/auth/verifiers/skipVerifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/skipVerifier.js +0 -40
- package/dist/cjs/auth/verifiers/timestampSchemeVerifier.d.ts +0 -14
- package/dist/cjs/auth/verifiers/timestampSchemeVerifier.d.ts.map +0 -1
- package/dist/cjs/auth/verifiers/timestampSchemeVerifier.js +0 -86
- package/dist/cjs/bins/cedar.d.ts +0 -9
- package/dist/cjs/bins/cedar.d.ts.map +0 -1
- package/dist/cjs/bins/cedar.js +0 -36
- package/dist/cjs/bins/cfw.d.ts +0 -3
- package/dist/cjs/bins/cfw.d.ts.map +0 -1
- package/dist/cjs/bins/cfw.js +0 -36
- package/dist/cjs/bins/redwood.d.ts +0 -9
- package/dist/cjs/bins/redwood.d.ts.map +0 -1
- package/dist/cjs/bins/redwood.js +0 -36
- package/dist/cjs/bins/tsc.d.ts +0 -3
- package/dist/cjs/bins/tsc.d.ts.map +0 -1
- package/dist/cjs/bins/tsc.js +0 -30
- package/dist/cjs/cache/clients/BaseClient.d.ts +0 -11
- package/dist/cjs/cache/clients/BaseClient.d.ts.map +0 -1
- package/dist/cjs/cache/clients/BaseClient.js +0 -31
- package/dist/cjs/cache/clients/InMemoryClient.d.ts +0 -31
- package/dist/cjs/cache/clients/InMemoryClient.d.ts.map +0 -1
- package/dist/cjs/cache/clients/InMemoryClient.js +0 -94
- package/dist/cjs/cache/clients/MemcachedClient.d.ts +0 -16
- package/dist/cjs/cache/clients/MemcachedClient.d.ts.map +0 -1
- package/dist/cjs/cache/clients/MemcachedClient.js +0 -79
- package/dist/cjs/cache/clients/RedisClient.d.ts +0 -20
- package/dist/cjs/cache/clients/RedisClient.d.ts.map +0 -1
- package/dist/cjs/cache/clients/RedisClient.js +0 -83
- package/dist/cjs/cache/errors.d.ts +0 -4
- package/dist/cjs/cache/errors.d.ts.map +0 -1
- package/dist/cjs/cache/errors.js +0 -33
- package/dist/cjs/cache/index.d.ts +0 -35
- package/dist/cjs/cache/index.d.ts.map +0 -1
- package/dist/cjs/cache/index.js +0 -171
- package/dist/cjs/cors.d.ts +0 -16
- package/dist/cjs/cors.d.ts.map +0 -1
- package/dist/cjs/cors.js +0 -93
- package/dist/cjs/errors.d.ts +0 -5
- package/dist/cjs/errors.d.ts.map +0 -1
- package/dist/cjs/errors.js +0 -38
- package/dist/cjs/event.d.ts +0 -3
- package/dist/cjs/event.d.ts.map +0 -1
- package/dist/cjs/event.js +0 -34
- package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts +0 -4
- package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts.map +0 -1
- package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.js +0 -72
- package/dist/cjs/index.d.ts +0 -15
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js +0 -70
- package/dist/cjs/logger/index.d.ts +0 -179
- package/dist/cjs/logger/index.d.ts.map +0 -1
- package/dist/cjs/logger/index.js +0 -195
- package/dist/cjs/package.json +0 -1
- package/dist/cjs/transforms.d.ts +0 -35
- package/dist/cjs/transforms.d.ts.map +0 -1
- package/dist/cjs/transforms.js +0 -98
- package/dist/cjs/types.d.ts +0 -25
- package/dist/cjs/types.d.ts.map +0 -1
- package/dist/cjs/types.js +0 -16
- package/dist/cjs/validations/errors.d.ts +0 -101
- package/dist/cjs/validations/errors.d.ts.map +0 -1
- package/dist/cjs/validations/errors.js +0 -298
- package/dist/cjs/validations/validations.d.ts +0 -222
- package/dist/cjs/validations/validations.d.ts.map +0 -1
- package/dist/cjs/validations/validations.js +0 -351
- package/dist/cjs/webhooks/index.d.ts +0 -77
- package/dist/cjs/webhooks/index.d.ts.map +0 -1
- 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
|
+
};
|
package/dist/transforms.d.ts
CHANGED
|
@@ -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
|
*
|
package/dist/transforms.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/transforms.js
CHANGED
|
@@ -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
|
};
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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,
|
|
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?:
|
|
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
|
|
199
|
-
*
|
|
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?:
|
|
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:
|
|
220
|
-
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: UniquenessValidatorOptions
|
|
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":"
|
|
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
|
|
227
|
-
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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/
|
|
68
|
-
"cedarjs": "./dist/
|
|
69
|
-
"cfw": "./dist/
|
|
70
|
-
"redwood": "./dist/
|
|
71
|
-
"rw": "./dist/
|
|
72
|
-
"tsc": "./dist/
|
|
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": "
|
|
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
|
|
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
|
|
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": "
|
|
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
|
-
"
|
|
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.
|
|
101
|
-
"@types/aws-lambda": "8.10.
|
|
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.
|
|
93
|
+
"concurrently": "9.2.4",
|
|
107
94
|
"memjs": "1.3.2",
|
|
108
|
-
"publint": "0.3.
|
|
109
|
-
"redis": "
|
|
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": "
|
|
100
|
+
"vitest": "4.1.11"
|
|
115
101
|
},
|
|
116
102
|
"peerDependencies": {
|
|
117
103
|
"memjs": "1.3.2",
|
|
118
|
-
"redis": "
|
|
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": "
|
|
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.
|