@shware/security 3.1.0 → 3.2.0

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 (39) hide show
  1. package/dist/auth/index.cjs +14 -10
  2. package/dist/auth/index.cjs.map +1 -1
  3. package/dist/auth/index.mjs +14 -10
  4. package/dist/auth/index.mjs.map +1 -1
  5. package/dist/email/schema.cjs.map +1 -1
  6. package/dist/oauth2/client.cjs.map +1 -1
  7. package/dist/oauth2/provider/apple-client-secret.cjs +46 -0
  8. package/dist/oauth2/provider/apple-client-secret.cjs.map +1 -0
  9. package/dist/oauth2/provider/apple-client-secret.d.cts +28 -0
  10. package/dist/oauth2/provider/apple-client-secret.d.cts.map +1 -0
  11. package/dist/oauth2/provider/apple-client-secret.d.mts +28 -0
  12. package/dist/oauth2/provider/apple-client-secret.d.mts.map +1 -0
  13. package/dist/oauth2/provider/apple-client-secret.mjs +45 -0
  14. package/dist/oauth2/provider/apple-client-secret.mjs.map +1 -0
  15. package/dist/oauth2/provider/common.cjs +2 -1
  16. package/dist/oauth2/provider/common.cjs.map +1 -1
  17. package/dist/oauth2/provider/common.mjs +2 -1
  18. package/dist/oauth2/provider/common.mjs.map +1 -1
  19. package/dist/oauth2/provider/index.cjs +2 -0
  20. package/dist/oauth2/provider/index.d.cts +2 -1
  21. package/dist/oauth2/provider/index.d.mts +2 -1
  22. package/dist/oauth2/provider/index.mjs +2 -1
  23. package/dist/session/db.cjs.map +1 -1
  24. package/dist/session/map-session.cjs +1 -1
  25. package/dist/session/map-session.cjs.map +1 -1
  26. package/dist/session/map-session.mjs +1 -1
  27. package/dist/session/map-session.mjs.map +1 -1
  28. package/dist/session/redis.cjs +1 -1
  29. package/dist/session/redis.cjs.map +1 -1
  30. package/dist/session/redis.mjs +1 -1
  31. package/dist/session/redis.mjs.map +1 -1
  32. package/dist/utils/http.cjs.map +1 -1
  33. package/dist/utils/timing.cjs +1 -1
  34. package/dist/utils/timing.cjs.map +1 -1
  35. package/dist/utils/timing.mjs +1 -1
  36. package/dist/utils/timing.mjs.map +1 -1
  37. package/dist/utils/valid.cjs.map +1 -1
  38. package/dist/utils/valid.mjs.map +1 -1
  39. package/package.json +8 -8
@@ -35,7 +35,7 @@ function timing({ enabled, crossOrigin }) {
35
35
  const metric = description ? `${name};dur=${dur};desc="${description}"` : `${name};dur=${dur}`;
36
36
  headers.push(metric);
37
37
  } else {
38
- const metric = value ? `${name};desc="${value}"` : `${name}`;
38
+ const metric = value ? `${name};desc="${value}"` : name;
39
39
  headers.push(metric);
40
40
  }
41
41
  },
@@ -1 +1 @@
1
- {"version":3,"file":"timing.cjs","names":[],"sources":["../../src/utils/timing.ts"],"sourcesContent":["interface Timer {\n description?: string;\n start: number;\n}\n\ninterface Options {\n enabled: boolean;\n crossOrigin?: string;\n}\n\nexport function timing({ enabled, crossOrigin }: Options) {\n let start = performance.now();\n const headers: string[] = [];\n const timers = new Map<string, Timer>();\n\n return {\n startTime: (name: Lowercase<string>, description?: string) => {\n timers.set(name, { description, start: performance.now() });\n },\n endTime: (name: Lowercase<string>, precision?: number) => {\n const timer = timers.get(name);\n if (!timer) {\n console.warn(`timing: ${name} not found`);\n return;\n }\n const { start, description } = timer;\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n timers.delete(name);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n },\n mark: (name: Lowercase<string>, description?: string, precision?: number) => {\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n start = performance.now();\n },\n setMetric: (\n name: Lowercase<string>,\n value: number | string | undefined,\n description?: string,\n precision?: number\n ) => {\n if (typeof value === 'number') {\n const dur = value.toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n } else {\n const metric = value ? `${name};desc=\"${value}\"` : `${name}`;\n headers.push(metric);\n }\n },\n setTiming: (response: Response) => {\n if (!enabled) return;\n response.headers.append('Server-Timing', headers.join(','));\n response.headers.append('Timing-Allow-Origin', crossOrigin ?? '*');\n },\n };\n}\n"],"mappings":";;AAUA,SAAgB,OAAO,EAAE,SAAS,eAAwB;CACxD,IAAI,QAAQ,YAAY,IAAI;CAC5B,MAAM,UAAoB,CAAC;CAC3B,MAAM,yBAAS,IAAI,IAAmB;CAEtC,OAAO;EACL,YAAY,MAAyB,gBAAyB;GAC5D,OAAO,IAAI,MAAM;IAAE;IAAa,OAAO,YAAY,IAAI;GAAE,CAAC;EAC5D;EACA,UAAU,MAAyB,cAAuB;GACxD,MAAM,QAAQ,OAAO,IAAI,IAAI;GAC7B,IAAI,CAAC,OAAO;IACV,QAAQ,KAAK,WAAW,KAAK,WAAW;IACxC;GACF;GACA,MAAM,EAAE,OAAO,gBAAgB;GAC/B,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,OAAO,OAAO,IAAI;GAClB,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;EACrB;EACA,OAAO,MAAyB,aAAsB,cAAuB;GAC3E,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;GACnB,QAAQ,YAAY,IAAI;EAC1B;EACA,YACE,MACA,OACA,aACA,cACG;GACH,IAAI,OAAO,UAAU,UAAU;IAC7B,MAAM,MAAM,MAAM,QAAQ,aAAa,CAAC;IACxC,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;IACnB,QAAQ,KAAK,MAAM;GACrB,OAAO;IACL,MAAM,SAAS,QAAQ,GAAG,KAAK,SAAS,MAAM,KAAK,GAAG;IACtD,QAAQ,KAAK,MAAM;GACrB;EACF;EACA,YAAY,aAAuB;GACjC,IAAI,CAAC,SAAS;GACd,SAAS,QAAQ,OAAO,iBAAiB,QAAQ,KAAK,GAAG,CAAC;GAC1D,SAAS,QAAQ,OAAO,uBAAuB,eAAe,GAAG;EACnE;CACF;AACF"}
1
+ {"version":3,"file":"timing.cjs","names":[],"sources":["../../src/utils/timing.ts"],"sourcesContent":["interface Timer {\n description?: string;\n start: number;\n}\n\ninterface Options {\n enabled: boolean;\n crossOrigin?: string;\n}\n\nexport function timing({ enabled, crossOrigin }: Options) {\n let start = performance.now();\n const headers: string[] = [];\n const timers = new Map<string, Timer>();\n\n return {\n startTime: (name: Lowercase<string>, description?: string) => {\n timers.set(name, { description, start: performance.now() });\n },\n endTime: (name: Lowercase<string>, precision?: number) => {\n const timer = timers.get(name);\n if (!timer) {\n console.warn(`timing: ${name} not found`);\n return;\n }\n const { start, description } = timer;\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n timers.delete(name);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n },\n mark: (name: Lowercase<string>, description?: string, precision?: number) => {\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n start = performance.now();\n },\n setMetric: (\n name: Lowercase<string>,\n value: number | string | undefined,\n description?: string,\n precision?: number\n ) => {\n if (typeof value === 'number') {\n const dur = value.toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n } else {\n const metric = value ? `${name};desc=\"${value}\"` : name;\n headers.push(metric);\n }\n },\n setTiming: (response: Response) => {\n if (!enabled) return;\n response.headers.append('Server-Timing', headers.join(','));\n response.headers.append('Timing-Allow-Origin', crossOrigin ?? '*');\n },\n };\n}\n"],"mappings":";;AAUA,SAAgB,OAAO,EAAE,SAAS,eAAwB;CACxD,IAAI,QAAQ,YAAY,IAAI;CAC5B,MAAM,UAAoB,CAAC;CAC3B,MAAM,yBAAS,IAAI,IAAmB;CAEtC,OAAO;EACL,YAAY,MAAyB,gBAAyB;GAC5D,OAAO,IAAI,MAAM;IAAE;IAAa,OAAO,YAAY,IAAI;GAAE,CAAC;EAC5D;EACA,UAAU,MAAyB,cAAuB;GACxD,MAAM,QAAQ,OAAO,IAAI,IAAI;GAC7B,IAAI,CAAC,OAAO;IACV,QAAQ,KAAK,WAAW,KAAK,WAAW;IACxC;GACF;GACA,MAAM,EAAE,OAAO,gBAAgB;GAC/B,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,OAAO,OAAO,IAAI;GAClB,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;EACrB;EACA,OAAO,MAAyB,aAAsB,cAAuB;GAC3E,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;GACnB,QAAQ,YAAY,IAAI;EAC1B;EACA,YACE,MACA,OACA,aACA,cACG;GACH,IAAI,OAAO,UAAU,UAAU;IAC7B,MAAM,MAAM,MAAM,QAAQ,aAAa,CAAC;IACxC,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;IACnB,QAAQ,KAAK,MAAM;GACrB,OAAO;IACL,MAAM,SAAS,QAAQ,GAAG,KAAK,SAAS,MAAM,KAAK;IACnD,QAAQ,KAAK,MAAM;GACrB;EACF;EACA,YAAY,aAAuB;GACjC,IAAI,CAAC,SAAS;GACd,SAAS,QAAQ,OAAO,iBAAiB,QAAQ,KAAK,GAAG,CAAC;GAC1D,SAAS,QAAQ,OAAO,uBAAuB,eAAe,GAAG;EACnE;CACF;AACF"}
@@ -34,7 +34,7 @@ function timing({ enabled, crossOrigin }) {
34
34
  const metric = description ? `${name};dur=${dur};desc="${description}"` : `${name};dur=${dur}`;
35
35
  headers.push(metric);
36
36
  } else {
37
- const metric = value ? `${name};desc="${value}"` : `${name}`;
37
+ const metric = value ? `${name};desc="${value}"` : name;
38
38
  headers.push(metric);
39
39
  }
40
40
  },
@@ -1 +1 @@
1
- {"version":3,"file":"timing.mjs","names":[],"sources":["../../src/utils/timing.ts"],"sourcesContent":["interface Timer {\n description?: string;\n start: number;\n}\n\ninterface Options {\n enabled: boolean;\n crossOrigin?: string;\n}\n\nexport function timing({ enabled, crossOrigin }: Options) {\n let start = performance.now();\n const headers: string[] = [];\n const timers = new Map<string, Timer>();\n\n return {\n startTime: (name: Lowercase<string>, description?: string) => {\n timers.set(name, { description, start: performance.now() });\n },\n endTime: (name: Lowercase<string>, precision?: number) => {\n const timer = timers.get(name);\n if (!timer) {\n console.warn(`timing: ${name} not found`);\n return;\n }\n const { start, description } = timer;\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n timers.delete(name);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n },\n mark: (name: Lowercase<string>, description?: string, precision?: number) => {\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n start = performance.now();\n },\n setMetric: (\n name: Lowercase<string>,\n value: number | string | undefined,\n description?: string,\n precision?: number\n ) => {\n if (typeof value === 'number') {\n const dur = value.toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n } else {\n const metric = value ? `${name};desc=\"${value}\"` : `${name}`;\n headers.push(metric);\n }\n },\n setTiming: (response: Response) => {\n if (!enabled) return;\n response.headers.append('Server-Timing', headers.join(','));\n response.headers.append('Timing-Allow-Origin', crossOrigin ?? '*');\n },\n };\n}\n"],"mappings":";AAUA,SAAgB,OAAO,EAAE,SAAS,eAAwB;CACxD,IAAI,QAAQ,YAAY,IAAI;CAC5B,MAAM,UAAoB,CAAC;CAC3B,MAAM,yBAAS,IAAI,IAAmB;CAEtC,OAAO;EACL,YAAY,MAAyB,gBAAyB;GAC5D,OAAO,IAAI,MAAM;IAAE;IAAa,OAAO,YAAY,IAAI;GAAE,CAAC;EAC5D;EACA,UAAU,MAAyB,cAAuB;GACxD,MAAM,QAAQ,OAAO,IAAI,IAAI;GAC7B,IAAI,CAAC,OAAO;IACV,QAAQ,KAAK,WAAW,KAAK,WAAW;IACxC;GACF;GACA,MAAM,EAAE,OAAO,gBAAgB;GAC/B,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,OAAO,OAAO,IAAI;GAClB,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;EACrB;EACA,OAAO,MAAyB,aAAsB,cAAuB;GAC3E,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;GACnB,QAAQ,YAAY,IAAI;EAC1B;EACA,YACE,MACA,OACA,aACA,cACG;GACH,IAAI,OAAO,UAAU,UAAU;IAC7B,MAAM,MAAM,MAAM,QAAQ,aAAa,CAAC;IACxC,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;IACnB,QAAQ,KAAK,MAAM;GACrB,OAAO;IACL,MAAM,SAAS,QAAQ,GAAG,KAAK,SAAS,MAAM,KAAK,GAAG;IACtD,QAAQ,KAAK,MAAM;GACrB;EACF;EACA,YAAY,aAAuB;GACjC,IAAI,CAAC,SAAS;GACd,SAAS,QAAQ,OAAO,iBAAiB,QAAQ,KAAK,GAAG,CAAC;GAC1D,SAAS,QAAQ,OAAO,uBAAuB,eAAe,GAAG;EACnE;CACF;AACF"}
1
+ {"version":3,"file":"timing.mjs","names":[],"sources":["../../src/utils/timing.ts"],"sourcesContent":["interface Timer {\n description?: string;\n start: number;\n}\n\ninterface Options {\n enabled: boolean;\n crossOrigin?: string;\n}\n\nexport function timing({ enabled, crossOrigin }: Options) {\n let start = performance.now();\n const headers: string[] = [];\n const timers = new Map<string, Timer>();\n\n return {\n startTime: (name: Lowercase<string>, description?: string) => {\n timers.set(name, { description, start: performance.now() });\n },\n endTime: (name: Lowercase<string>, precision?: number) => {\n const timer = timers.get(name);\n if (!timer) {\n console.warn(`timing: ${name} not found`);\n return;\n }\n const { start, description } = timer;\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n timers.delete(name);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n },\n mark: (name: Lowercase<string>, description?: string, precision?: number) => {\n const dur = (performance.now() - start).toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n start = performance.now();\n },\n setMetric: (\n name: Lowercase<string>,\n value: number | string | undefined,\n description?: string,\n precision?: number\n ) => {\n if (typeof value === 'number') {\n const dur = value.toFixed(precision ?? 1);\n const metric = description\n ? `${name};dur=${dur};desc=\"${description}\"`\n : `${name};dur=${dur}`;\n headers.push(metric);\n } else {\n const metric = value ? `${name};desc=\"${value}\"` : name;\n headers.push(metric);\n }\n },\n setTiming: (response: Response) => {\n if (!enabled) return;\n response.headers.append('Server-Timing', headers.join(','));\n response.headers.append('Timing-Allow-Origin', crossOrigin ?? '*');\n },\n };\n}\n"],"mappings":";AAUA,SAAgB,OAAO,EAAE,SAAS,eAAwB;CACxD,IAAI,QAAQ,YAAY,IAAI;CAC5B,MAAM,UAAoB,CAAC;CAC3B,MAAM,yBAAS,IAAI,IAAmB;CAEtC,OAAO;EACL,YAAY,MAAyB,gBAAyB;GAC5D,OAAO,IAAI,MAAM;IAAE;IAAa,OAAO,YAAY,IAAI;GAAE,CAAC;EAC5D;EACA,UAAU,MAAyB,cAAuB;GACxD,MAAM,QAAQ,OAAO,IAAI,IAAI;GAC7B,IAAI,CAAC,OAAO;IACV,QAAQ,KAAK,WAAW,KAAK,WAAW;IACxC;GACF;GACA,MAAM,EAAE,OAAO,gBAAgB;GAC/B,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,OAAO,OAAO,IAAI;GAClB,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;EACrB;EACA,OAAO,MAAyB,aAAsB,cAAuB;GAC3E,MAAM,OAAO,YAAY,IAAI,IAAI,MAAA,CAAO,QAAQ,aAAa,CAAC;GAC9D,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;GACnB,QAAQ,KAAK,MAAM;GACnB,QAAQ,YAAY,IAAI;EAC1B;EACA,YACE,MACA,OACA,aACA,cACG;GACH,IAAI,OAAO,UAAU,UAAU;IAC7B,MAAM,MAAM,MAAM,QAAQ,aAAa,CAAC;IACxC,MAAM,SAAS,cACX,GAAG,KAAK,OAAO,IAAI,SAAS,YAAY,KACxC,GAAG,KAAK,OAAO;IACnB,QAAQ,KAAK,MAAM;GACrB,OAAO;IACL,MAAM,SAAS,QAAQ,GAAG,KAAK,SAAS,MAAM,KAAK;IACnD,QAAQ,KAAK,MAAM;GACrB;EACF;EACA,YAAY,aAAuB;GACjC,IAAI,CAAC,SAAS;GACd,SAAS,QAAQ,OAAO,iBAAiB,QAAQ,KAAK,GAAG,CAAC;GAC1D,SAAS,QAAQ,OAAO,uBAAuB,eAAe,GAAG;EACnE;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"valid.cjs","names":[],"sources":["../../src/utils/valid.ts"],"sourcesContent":["import type { ZodType, output } from 'zod';\nimport type { ZodMiniType, output as outputMini } from 'zod/mini';\n\ntype ErrorBody = {\n error: {\n code: number;\n status: string;\n message: string;\n details: unknown[];\n };\n};\n\nexport function invalidArgument(reason: string): ErrorBody {\n return {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid verification code',\n details: [{ '@type': 'type.googleapis.com/google.rpc.ErrorInfo', reason }],\n },\n };\n}\n\ntype Result<S extends ZodType | ZodMiniType> =\n | { error: null; data: S extends ZodType ? output<S> : outputMini<S> }\n | { error: ErrorBody; data: null };\n\nexport function valid<S extends ZodType | ZodMiniType>(schema: S, json: unknown): Result<S> {\n const result = schema.safeParse(json);\n if (result.success) {\n return {\n error: null,\n data: result.data as S extends ZodType ? output<S> : outputMini<S>,\n };\n }\n\n const fieldViolations = result.error.issues.map(({ code, path, message }) => ({\n field: path.join('.'),\n description: message,\n reason: code.toUpperCase(),\n localizedMessage: { locale: 'en-US', message: message },\n }));\n\n const error = {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid request',\n details: [{ '@type': 'type.googleapis.com/google.rpc.BadRequest', fieldViolations }],\n },\n };\n\n return { error, data: null };\n}\n\nexport async function verifyTurnstileToken(secret: string, token: string) {\n const response = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ secret, response: token }),\n });\n\n const data = (await response.json()) as { success: boolean };\n if (data.success) return { error: null };\n return { error: invalidArgument('TURNSTILE_VERIFICATION_FAILED') };\n}\n"],"mappings":";;AAYA,SAAgB,gBAAgB,QAA2B;CACzD,OAAO,EACL,OAAO;EACL,MAAM;EACN,QAAQ;EACR,SAAS;EACT,SAAS,CAAC;GAAE,SAAS;GAA4C;EAAO,CAAC;CAC3E,EACF;AACF;AAMA,SAAgB,MAAuC,QAAW,MAA0B;CAC1F,MAAM,SAAS,OAAO,UAAU,IAAI;CACpC,IAAI,OAAO,SACT,OAAO;EACL,OAAO;EACP,MAAM,OAAO;CACf;CAmBF,OAAO;EAAE,OAAA,EARP,OAAO;GACL,MAAM;GACN,QAAQ;GACR,SAAS;GACT,SAAS,CAAC;IAAE,SAAS;IAA6C,iBAZ9C,OAAO,MAAM,OAAO,KAAK,EAAE,MAAM,MAAM,eAAe;KAC5E,OAAO,KAAK,KAAK,GAAG;KACpB,aAAa;KACb,QAAQ,KAAK,YAAY;KACzB,kBAAkB;MAAE,QAAQ;MAAkB;KAAQ;IACxD,EAOoF;GAAE,CAAC;EACrF,EAGW;EAAG,MAAM;CAAK;AAC7B;AAEA,eAAsB,qBAAqB,QAAgB,OAAe;CAQxE,KAAI,OADgB,MANG,MAAM,6DAA6D;EACxF,QAAQ;EACR,SAAS,EAAE,gBAAgB,oCAAoC;EAC/D,MAAM,IAAI,gBAAgB;GAAE;GAAQ,UAAU;EAAM,CAAC;CACvD,CAAC,EAAA,CAE4B,KAAK,EAAA,CACzB,SAAS,OAAO,EAAE,OAAO,KAAK;CACvC,OAAO,EAAE,OAAO,gBAAgB,+BAA+B,EAAE;AACnE"}
1
+ {"version":3,"file":"valid.cjs","names":[],"sources":["../../src/utils/valid.ts"],"sourcesContent":["import type { ZodType, output } from 'zod';\nimport type { ZodMiniType, output as outputMini } from 'zod/mini';\n\ntype ErrorBody = {\n error: {\n code: number;\n status: string;\n message: string;\n details: unknown[];\n };\n};\n\nexport function invalidArgument(reason: string): ErrorBody {\n return {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid verification code',\n details: [{ '@type': 'type.googleapis.com/google.rpc.ErrorInfo', reason }],\n },\n };\n}\n\ntype Result<S extends ZodType | ZodMiniType> =\n | { error: null; data: S extends ZodType ? output<S> : outputMini<S> }\n | { error: ErrorBody; data: null };\n\nexport function valid<S extends ZodType | ZodMiniType>(schema: S, json: unknown): Result<S> {\n const result = schema.safeParse(json);\n if (result.success) {\n return {\n error: null,\n data: result.data as S extends ZodType ? output<S> : outputMini<S>,\n };\n }\n\n const fieldViolations = result.error.issues.map(({ code, path, message }) => ({\n field: path.join('.'),\n description: message,\n reason: code.toUpperCase(),\n localizedMessage: { locale: 'en-US', message },\n }));\n\n const error = {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid request',\n details: [{ '@type': 'type.googleapis.com/google.rpc.BadRequest', fieldViolations }],\n },\n };\n\n return { error, data: null };\n}\n\nexport async function verifyTurnstileToken(secret: string, token: string) {\n const response = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ secret, response: token }),\n });\n\n const data = (await response.json()) as { success: boolean };\n if (data.success) return { error: null };\n return { error: invalidArgument('TURNSTILE_VERIFICATION_FAILED') };\n}\n"],"mappings":";;AAYA,SAAgB,gBAAgB,QAA2B;CACzD,OAAO,EACL,OAAO;EACL,MAAM;EACN,QAAQ;EACR,SAAS;EACT,SAAS,CAAC;GAAE,SAAS;GAA4C;EAAO,CAAC;CAC3E,EACF;AACF;AAMA,SAAgB,MAAuC,QAAW,MAA0B;CAC1F,MAAM,SAAS,OAAO,UAAU,IAAI;CACpC,IAAI,OAAO,SACT,OAAO;EACL,OAAO;EACP,MAAM,OAAO;CACf;CAmBF,OAAO;EAAE,OAAA,EARP,OAAO;GACL,MAAM;GACN,QAAQ;GACR,SAAS;GACT,SAAS,CAAC;IAAE,SAAS;IAA6C,iBAZ9C,OAAO,MAAM,OAAO,KAAK,EAAE,MAAM,MAAM,eAAe;KAC5E,OAAO,KAAK,KAAK,GAAG;KACpB,aAAa;KACb,QAAQ,KAAK,YAAY;KACzB,kBAAkB;MAAE,QAAQ;MAAS;KAAQ;IAC/C,EAOoF;GAAE,CAAC;EACrF,EAGW;EAAG,MAAM;CAAK;AAC7B;AAEA,eAAsB,qBAAqB,QAAgB,OAAe;CAQxE,KAAI,OADgB,MANG,MAAM,6DAA6D;EACxF,QAAQ;EACR,SAAS,EAAE,gBAAgB,oCAAoC;EAC/D,MAAM,IAAI,gBAAgB;GAAE;GAAQ,UAAU;EAAM,CAAC;CACvD,CAAC,EAAA,CAE4B,KAAK,EAAA,CACzB,SAAS,OAAO,EAAE,OAAO,KAAK;CACvC,OAAO,EAAE,OAAO,gBAAgB,+BAA+B,EAAE;AACnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"valid.mjs","names":[],"sources":["../../src/utils/valid.ts"],"sourcesContent":["import type { ZodType, output } from 'zod';\nimport type { ZodMiniType, output as outputMini } from 'zod/mini';\n\ntype ErrorBody = {\n error: {\n code: number;\n status: string;\n message: string;\n details: unknown[];\n };\n};\n\nexport function invalidArgument(reason: string): ErrorBody {\n return {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid verification code',\n details: [{ '@type': 'type.googleapis.com/google.rpc.ErrorInfo', reason }],\n },\n };\n}\n\ntype Result<S extends ZodType | ZodMiniType> =\n | { error: null; data: S extends ZodType ? output<S> : outputMini<S> }\n | { error: ErrorBody; data: null };\n\nexport function valid<S extends ZodType | ZodMiniType>(schema: S, json: unknown): Result<S> {\n const result = schema.safeParse(json);\n if (result.success) {\n return {\n error: null,\n data: result.data as S extends ZodType ? output<S> : outputMini<S>,\n };\n }\n\n const fieldViolations = result.error.issues.map(({ code, path, message }) => ({\n field: path.join('.'),\n description: message,\n reason: code.toUpperCase(),\n localizedMessage: { locale: 'en-US', message: message },\n }));\n\n const error = {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid request',\n details: [{ '@type': 'type.googleapis.com/google.rpc.BadRequest', fieldViolations }],\n },\n };\n\n return { error, data: null };\n}\n\nexport async function verifyTurnstileToken(secret: string, token: string) {\n const response = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ secret, response: token }),\n });\n\n const data = (await response.json()) as { success: boolean };\n if (data.success) return { error: null };\n return { error: invalidArgument('TURNSTILE_VERIFICATION_FAILED') };\n}\n"],"mappings":";AAYA,SAAgB,gBAAgB,QAA2B;CACzD,OAAO,EACL,OAAO;EACL,MAAM;EACN,QAAQ;EACR,SAAS;EACT,SAAS,CAAC;GAAE,SAAS;GAA4C;EAAO,CAAC;CAC3E,EACF;AACF;AAMA,SAAgB,MAAuC,QAAW,MAA0B;CAC1F,MAAM,SAAS,OAAO,UAAU,IAAI;CACpC,IAAI,OAAO,SACT,OAAO;EACL,OAAO;EACP,MAAM,OAAO;CACf;CAmBF,OAAO;EAAE,OAAA,EARP,OAAO;GACL,MAAM;GACN,QAAQ;GACR,SAAS;GACT,SAAS,CAAC;IAAE,SAAS;IAA6C,iBAZ9C,OAAO,MAAM,OAAO,KAAK,EAAE,MAAM,MAAM,eAAe;KAC5E,OAAO,KAAK,KAAK,GAAG;KACpB,aAAa;KACb,QAAQ,KAAK,YAAY;KACzB,kBAAkB;MAAE,QAAQ;MAAkB;KAAQ;IACxD,EAOoF;GAAE,CAAC;EACrF,EAGW;EAAG,MAAM;CAAK;AAC7B;AAEA,eAAsB,qBAAqB,QAAgB,OAAe;CAQxE,KAAI,OADgB,MANG,MAAM,6DAA6D;EACxF,QAAQ;EACR,SAAS,EAAE,gBAAgB,oCAAoC;EAC/D,MAAM,IAAI,gBAAgB;GAAE;GAAQ,UAAU;EAAM,CAAC;CACvD,CAAC,EAAA,CAE4B,KAAK,EAAA,CACzB,SAAS,OAAO,EAAE,OAAO,KAAK;CACvC,OAAO,EAAE,OAAO,gBAAgB,+BAA+B,EAAE;AACnE"}
1
+ {"version":3,"file":"valid.mjs","names":[],"sources":["../../src/utils/valid.ts"],"sourcesContent":["import type { ZodType, output } from 'zod';\nimport type { ZodMiniType, output as outputMini } from 'zod/mini';\n\ntype ErrorBody = {\n error: {\n code: number;\n status: string;\n message: string;\n details: unknown[];\n };\n};\n\nexport function invalidArgument(reason: string): ErrorBody {\n return {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid verification code',\n details: [{ '@type': 'type.googleapis.com/google.rpc.ErrorInfo', reason }],\n },\n };\n}\n\ntype Result<S extends ZodType | ZodMiniType> =\n | { error: null; data: S extends ZodType ? output<S> : outputMini<S> }\n | { error: ErrorBody; data: null };\n\nexport function valid<S extends ZodType | ZodMiniType>(schema: S, json: unknown): Result<S> {\n const result = schema.safeParse(json);\n if (result.success) {\n return {\n error: null,\n data: result.data as S extends ZodType ? output<S> : outputMini<S>,\n };\n }\n\n const fieldViolations = result.error.issues.map(({ code, path, message }) => ({\n field: path.join('.'),\n description: message,\n reason: code.toUpperCase(),\n localizedMessage: { locale: 'en-US', message },\n }));\n\n const error = {\n error: {\n code: 400,\n status: 'INVALID_ARGUMENT',\n message: 'Invalid request',\n details: [{ '@type': 'type.googleapis.com/google.rpc.BadRequest', fieldViolations }],\n },\n };\n\n return { error, data: null };\n}\n\nexport async function verifyTurnstileToken(secret: string, token: string) {\n const response = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ secret, response: token }),\n });\n\n const data = (await response.json()) as { success: boolean };\n if (data.success) return { error: null };\n return { error: invalidArgument('TURNSTILE_VERIFICATION_FAILED') };\n}\n"],"mappings":";AAYA,SAAgB,gBAAgB,QAA2B;CACzD,OAAO,EACL,OAAO;EACL,MAAM;EACN,QAAQ;EACR,SAAS;EACT,SAAS,CAAC;GAAE,SAAS;GAA4C;EAAO,CAAC;CAC3E,EACF;AACF;AAMA,SAAgB,MAAuC,QAAW,MAA0B;CAC1F,MAAM,SAAS,OAAO,UAAU,IAAI;CACpC,IAAI,OAAO,SACT,OAAO;EACL,OAAO;EACP,MAAM,OAAO;CACf;CAmBF,OAAO;EAAE,OAAA,EARP,OAAO;GACL,MAAM;GACN,QAAQ;GACR,SAAS;GACT,SAAS,CAAC;IAAE,SAAS;IAA6C,iBAZ9C,OAAO,MAAM,OAAO,KAAK,EAAE,MAAM,MAAM,eAAe;KAC5E,OAAO,KAAK,KAAK,GAAG;KACpB,aAAa;KACb,QAAQ,KAAK,YAAY;KACzB,kBAAkB;MAAE,QAAQ;MAAS;KAAQ;IAC/C,EAOoF;GAAE,CAAC;EACrF,EAGW;EAAG,MAAM;CAAK;AAC7B;AAEA,eAAsB,qBAAqB,QAAgB,OAAe;CAQxE,KAAI,OADgB,MANG,MAAM,6DAA6D;EACxF,QAAQ;EACR,SAAS,EAAE,gBAAgB,oCAAoC;EAC/D,MAAM,IAAI,gBAAgB;GAAE;GAAQ,UAAU;EAAM,CAAC;CACvD,CAAC,EAAA,CAE4B,KAAK,EAAA,CACzB,SAAS,OAAO,EAAE,OAAO,KAAK;CACvC,OAAO,EAAE,OAAO,gBAAgB,+BAA+B,EAAE;AACnE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shware/security",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,20 +36,20 @@
36
36
  "access": "public"
37
37
  },
38
38
  "dependencies": {
39
+ "@shware/utils": "^1.6.1",
39
40
  "cookie": "^2.0.1",
40
41
  "ioredis": "^6.0.0",
41
- "jose": "^6.2.7",
42
+ "jose": "^6.2.10",
42
43
  "path-to-regexp": "^8.4.2",
43
- "uuid": "^14.0.1",
44
- "zod": "^4.4.3",
45
- "@shware/utils": "^1.5.2"
44
+ "uuid": "^14.0.2",
45
+ "zod": "^4.4.3"
46
46
  },
47
47
  "devDependencies": {
48
- "@types/node": "^26.1.2",
48
+ "@repo/typescript-config": "0.0.0",
49
+ "@types/node": "^26.3.0",
49
50
  "ts-node": "^10.9.2",
50
51
  "typescript": "7.0.2",
51
- "vitest": "^4.1.10",
52
- "@repo/typescript-config": "0.0.0"
52
+ "vitest": "^4.1.11"
53
53
  },
54
54
  "scripts": {
55
55
  "dev": "tsc --watch",