gemi 0.42.2 → 0.43.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 (148) hide show
  1. package/dist/app/index.js +1 -1
  2. package/dist/bin/gemi.js +392 -70
  3. package/dist/bin/gemi.js.map +15 -12
  4. package/dist/broadcasting/index.js +1 -1
  5. package/dist/bun/plugin.js +1 -1
  6. package/dist/bun/preload.js +1 -1
  7. package/dist/{chunk-522q81af.js → chunk-20376aj6.js} +3 -3
  8. package/dist/{chunk-522q81af.js.map → chunk-20376aj6.js.map} +1 -1
  9. package/dist/{chunk-wa84ybnt.js → chunk-25d4feyv.js} +22 -22
  10. package/dist/{chunk-wa84ybnt.js.map → chunk-25d4feyv.js.map} +8 -6
  11. package/dist/{chunk-qyn10pv7.js → chunk-32ct42e2.js} +1 -1
  12. package/dist/{chunk-cx38xsyf.js → chunk-3xqyzegw.js} +2 -2
  13. package/dist/{chunk-cx38xsyf.js.map → chunk-3xqyzegw.js.map} +1 -1
  14. package/dist/{chunk-358x9aca.js → chunk-5kx4hw7c.js} +2 -2
  15. package/dist/{chunk-358x9aca.js.map → chunk-5kx4hw7c.js.map} +1 -1
  16. package/dist/{chunk-cwq1vdcb.js → chunk-6gtmkbh0.js} +2 -2
  17. package/dist/{chunk-cwq1vdcb.js.map → chunk-6gtmkbh0.js.map} +1 -1
  18. package/dist/{chunk-z9vdcpqr.js → chunk-87keq057.js} +2 -2
  19. package/dist/{chunk-z9vdcpqr.js.map → chunk-87keq057.js.map} +1 -1
  20. package/dist/{chunk-ayjtdck4.js → chunk-8b461343.js} +2 -2
  21. package/dist/{chunk-ayjtdck4.js.map → chunk-8b461343.js.map} +1 -1
  22. package/dist/{chunk-0pjn1a5d.js → chunk-9cw39se2.js} +2 -2
  23. package/dist/{chunk-0pjn1a5d.js.map → chunk-9cw39se2.js.map} +1 -1
  24. package/dist/{chunk-b3qebxqh.js → chunk-9r2k5ykk.js} +2 -2
  25. package/dist/{chunk-b3qebxqh.js.map → chunk-9r2k5ykk.js.map} +1 -1
  26. package/dist/{chunk-8cqkdzyh.js → chunk-9s3te5pa.js} +3 -3
  27. package/dist/{chunk-8cqkdzyh.js.map → chunk-9s3te5pa.js.map} +1 -1
  28. package/dist/{chunk-9byxbqnn.js → chunk-bsfbba90.js} +2 -2
  29. package/dist/{chunk-9byxbqnn.js.map → chunk-bsfbba90.js.map} +1 -1
  30. package/dist/{chunk-8mgsjrcc.js → chunk-cbvq4keh.js} +2 -2
  31. package/dist/{chunk-8mgsjrcc.js.map → chunk-cbvq4keh.js.map} +1 -1
  32. package/dist/{chunk-xpk460d1.js → chunk-drbqadx7.js} +1 -1
  33. package/dist/{chunk-akbepc3f.js → chunk-errq965d.js} +3 -3
  34. package/dist/{chunk-akbepc3f.js.map → chunk-errq965d.js.map} +1 -1
  35. package/dist/chunk-fk9xtngd.js +4 -0
  36. package/dist/chunk-fk9xtngd.js.map +33 -0
  37. package/dist/{chunk-ratbccpg.js → chunk-fvtfwssb.js} +2 -2
  38. package/dist/{chunk-ratbccpg.js.map → chunk-fvtfwssb.js.map} +1 -1
  39. package/dist/{chunk-shpca068.js → chunk-gv4v6qsg.js} +2 -2
  40. package/dist/{chunk-shpca068.js.map → chunk-gv4v6qsg.js.map} +1 -1
  41. package/dist/chunk-h4rd3cwd.js +6 -0
  42. package/dist/{chunk-m1t1f3s5.js.map → chunk-h4rd3cwd.js.map} +2 -2
  43. package/dist/{chunk-pygcsw1f.js → chunk-h509r9s3.js} +2 -2
  44. package/dist/{chunk-pygcsw1f.js.map → chunk-h509r9s3.js.map} +1 -1
  45. package/dist/{chunk-54wqarj8.js → chunk-j3x1fffh.js} +1 -1
  46. package/dist/{chunk-pfaq2mer.js → chunk-jvcbdxtq.js} +2 -2
  47. package/dist/{chunk-pfaq2mer.js.map → chunk-jvcbdxtq.js.map} +1 -1
  48. package/dist/{chunk-1kmbs8cd.js → chunk-kkdtznm5.js} +2 -2
  49. package/dist/{chunk-1kmbs8cd.js.map → chunk-kkdtznm5.js.map} +1 -1
  50. package/dist/{chunk-qeq8hv3t.js → chunk-knrx23te.js} +2 -2
  51. package/dist/{chunk-qeq8hv3t.js.map → chunk-knrx23te.js.map} +1 -1
  52. package/dist/{chunk-gsvzrj5r.js → chunk-m359awjw.js} +2 -2
  53. package/dist/{chunk-gsvzrj5r.js.map → chunk-m359awjw.js.map} +1 -1
  54. package/dist/{chunk-rrwtgt86.js → chunk-mfwbdztp.js} +2 -2
  55. package/dist/{chunk-rrwtgt86.js.map → chunk-mfwbdztp.js.map} +1 -1
  56. package/dist/{chunk-syaxsp9y.js → chunk-ngnrytfh.js} +2 -2
  57. package/dist/{chunk-syaxsp9y.js.map → chunk-ngnrytfh.js.map} +1 -1
  58. package/dist/{chunk-pr3pvtmh.js → chunk-nhyc69tx.js} +2 -2
  59. package/dist/{chunk-pr3pvtmh.js.map → chunk-nhyc69tx.js.map} +1 -1
  60. package/dist/{chunk-pxcv9ccp.js → chunk-nx8t65g3.js} +2 -2
  61. package/dist/{chunk-pxcv9ccp.js.map → chunk-nx8t65g3.js.map} +1 -1
  62. package/dist/chunk-q8haepmm.js +79 -0
  63. package/dist/{chunk-pjgfvdr6.js.map → chunk-q8haepmm.js.map} +5 -5
  64. package/dist/{chunk-hzw2y2rz.js → chunk-qy3aczt9.js} +2 -2
  65. package/dist/{chunk-hzw2y2rz.js.map → chunk-qy3aczt9.js.map} +1 -1
  66. package/dist/{chunk-zaa3yt2w.js → chunk-s49529x2.js} +2 -2
  67. package/dist/{chunk-zaa3yt2w.js.map → chunk-s49529x2.js.map} +1 -1
  68. package/dist/{chunk-qzemjynx.js → chunk-sdj112nj.js} +2 -2
  69. package/dist/{chunk-qzemjynx.js.map → chunk-sdj112nj.js.map} +1 -1
  70. package/dist/{chunk-bfnh3gwv.js → chunk-sdx8r2qb.js} +2 -2
  71. package/dist/{chunk-bfnh3gwv.js.map → chunk-sdx8r2qb.js.map} +1 -1
  72. package/dist/chunk-tatd75jn.js +5 -0
  73. package/dist/{chunk-tb8yy4rf.js.map → chunk-tatd75jn.js.map} +1 -1
  74. package/dist/{chunk-sbmg0hfr.js → chunk-ty3q916e.js} +3 -3
  75. package/dist/{chunk-sbmg0hfr.js.map → chunk-ty3q916e.js.map} +1 -1
  76. package/dist/{chunk-22pr1w8v.js → chunk-w7czqgx2.js} +2 -2
  77. package/dist/{chunk-22pr1w8v.js.map → chunk-w7czqgx2.js.map} +1 -1
  78. package/dist/chunk-whj1a3vr.js +5 -0
  79. package/dist/chunk-whj1a3vr.js.map +15 -0
  80. package/dist/{chunk-n78kxce1.js → chunk-wrp2v923.js} +2 -2
  81. package/dist/{chunk-n78kxce1.js.map → chunk-wrp2v923.js.map} +1 -1
  82. package/dist/{chunk-x3vy6dbw.js → chunk-x2cq1qp8.js} +2 -2
  83. package/dist/{chunk-x3vy6dbw.js.map → chunk-x2cq1qp8.js.map} +1 -1
  84. package/dist/{chunk-v3agzap3.js → chunk-yrtvjmrj.js} +1 -1
  85. package/dist/{chunk-q0y425d3.js → chunk-ytr22fm4.js} +2 -2
  86. package/dist/{chunk-q0y425d3.js.map → chunk-ytr22fm4.js.map} +1 -1
  87. package/dist/{chunk-81yxskss.js → chunk-ywhazhqt.js} +2 -2
  88. package/dist/{chunk-81yxskss.js.map → chunk-ywhazhqt.js.map} +1 -1
  89. package/dist/config/index.js +1 -1
  90. package/dist/email/index.js +2 -2
  91. package/dist/email/index.js.map +1 -1
  92. package/dist/facades/FileStorage.d.ts +14 -1
  93. package/dist/facades/FileStorage.d.ts.map +1 -1
  94. package/dist/facades/index.js +2 -2
  95. package/dist/facades/index.js.map +1 -1
  96. package/dist/http/ApiRouter.d.ts +41 -1
  97. package/dist/http/ApiRouter.d.ts.map +1 -1
  98. package/dist/http/HttpRequest.d.ts +7 -0
  99. package/dist/http/HttpRequest.d.ts.map +1 -1
  100. package/dist/http/ViewRouter.d.ts.map +1 -1
  101. package/dist/http/contentDisposition.d.ts +9 -0
  102. package/dist/http/contentDisposition.d.ts.map +1 -0
  103. package/dist/http/createStreamResponse.d.ts +38 -0
  104. package/dist/http/createStreamResponse.d.ts.map +1 -0
  105. package/dist/http/errors.d.ts +16 -0
  106. package/dist/http/errors.d.ts.map +1 -1
  107. package/dist/http/index.d.ts +3 -1
  108. package/dist/http/index.d.ts.map +1 -1
  109. package/dist/http/index.js +2 -2
  110. package/dist/http/index.js.map +1 -1
  111. package/dist/http/range.d.ts +63 -0
  112. package/dist/http/range.d.ts.map +1 -0
  113. package/dist/http/requestContext.d.ts +11 -0
  114. package/dist/http/requestContext.d.ts.map +1 -1
  115. package/dist/i18n/index.js +1 -1
  116. package/dist/kernel/index.js +2 -2
  117. package/dist/kernel/index.js.map +1 -1
  118. package/dist/server/index.js +2 -2
  119. package/dist/server/index.js.map +1 -1
  120. package/dist/services/file-storage/drivers/AzureBlobDriver.d.ts +78 -0
  121. package/dist/services/file-storage/drivers/AzureBlobDriver.d.ts.map +1 -0
  122. package/dist/services/file-storage/drivers/FileStorageDriver.d.ts +17 -1
  123. package/dist/services/file-storage/drivers/FileStorageDriver.d.ts.map +1 -1
  124. package/dist/services/file-storage/drivers/FileSystemDriver.d.ts +3 -1
  125. package/dist/services/file-storage/drivers/FileSystemDriver.d.ts.map +1 -1
  126. package/dist/services/file-storage/drivers/S3Driver.d.ts +3 -1
  127. package/dist/services/file-storage/drivers/S3Driver.d.ts.map +1 -1
  128. package/dist/services/file-storage/drivers/types.d.ts +45 -0
  129. package/dist/services/file-storage/drivers/types.d.ts.map +1 -1
  130. package/dist/services/index.d.ts +4 -1
  131. package/dist/services/index.d.ts.map +1 -1
  132. package/dist/services/index.js +2 -2
  133. package/dist/services/index.js.map +1 -1
  134. package/dist/services/router/ApiRouterServiceContainer.d.ts +5 -0
  135. package/dist/services/router/ApiRouterServiceContainer.d.ts.map +1 -1
  136. package/dist/services/router/createFlatApiRoutes.d.ts.map +1 -1
  137. package/package.json +7 -1
  138. package/dist/chunk-m1t1f3s5.js +0 -6
  139. package/dist/chunk-n1xpxhm0.js +0 -5
  140. package/dist/chunk-n1xpxhm0.js.map +0 -13
  141. package/dist/chunk-pjgfvdr6.js +0 -79
  142. package/dist/chunk-tb8yy4rf.js +0 -5
  143. package/dist/chunk-yeqwzeq7.js +0 -4
  144. package/dist/chunk-yeqwzeq7.js.map +0 -32
  145. /package/dist/{chunk-qyn10pv7.js.map → chunk-32ct42e2.js.map} +0 -0
  146. /package/dist/{chunk-xpk460d1.js.map → chunk-drbqadx7.js.map} +0 -0
  147. /package/dist/{chunk-54wqarj8.js.map → chunk-j3x1fffh.js.map} +0 -0
  148. /package/dist/{chunk-v3agzap3.js.map → chunk-yrtvjmrj.js.map} +0 -0
@@ -0,0 +1,63 @@
1
+ /**
2
+ * RFC 7233 byte-range parsing and resolution.
3
+ *
4
+ * Deliberately dependency-free: the file storage drivers import `ByteRange`
5
+ * from here, and drivers otherwise import nothing out of `http/`.
6
+ */
7
+ /**
8
+ * A parsed but *unresolved* `Range` header. The suffix form carries no absolute
9
+ * offsets — resolving it needs the total size of the object.
10
+ */
11
+ export type ByteRange = {
12
+ kind: "offset";
13
+ start: number;
14
+ end: number | null;
15
+ } | {
16
+ kind: "suffix";
17
+ suffixLength: number;
18
+ };
19
+ /** Absolute, inclusive, clamped-to-the-object byte offsets. */
20
+ export type ResolvedRange = {
21
+ start: number;
22
+ end: number;
23
+ length: number;
24
+ };
25
+ /** A parsed response `Content-Range` of the `bytes S-E/TOTAL` form. */
26
+ export type ContentRange = {
27
+ start: number;
28
+ end: number;
29
+ total: number;
30
+ };
31
+ /**
32
+ * Parses a request `Range` header.
33
+ *
34
+ * Returns `null` for anything we cannot or will not serve as a partial
35
+ * response. That is not an error path: RFC 7233 §3.1 requires a recipient to
36
+ * ignore a `Range` it does not understand, and §4.1 lets a server ignore one it
37
+ * does. Every `null` here means "serve the complete representation with 200".
38
+ *
39
+ * Only a single range is supported — we never emit `multipart/byteranges`, so a
40
+ * multi-range request is ignored rather than partially honoured.
41
+ */
42
+ export declare function parseRangeHeader(header: string | null | undefined): ByteRange | null;
43
+ /**
44
+ * Resolves a parsed range against a known total size.
45
+ *
46
+ * Returns `null` when the range is unsatisfiable, which the caller must turn
47
+ * into a 416 rather than a full response.
48
+ */
49
+ export declare function resolveRange(range: ByteRange, total: number): ResolvedRange | null;
50
+ /** Renders a range back into a `Range` request header for a storage backend. */
51
+ export declare function toRangeHeaderValue(range: ByteRange): string;
52
+ /**
53
+ * Parses a response `Content-Range`. Storage backends report the authoritative
54
+ * total size of the object here on a ranged read, which is what lets a driver
55
+ * answer a range without a second round trip for the size.
56
+ *
57
+ * The unsatisfied form used on a 416 has no offsets and returns `null`.
58
+ */
59
+ export declare function parseContentRange(value: string | null | undefined): ContentRange | null;
60
+ export declare function formatContentRange(start: number, end: number, total: number): string;
61
+ /** The `Content-Range` of a 416: no offsets, just the current total size. */
62
+ export declare function formatUnsatisfiedContentRange(total: number): string;
63
+ //# sourceMappingURL=range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../http/range.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAYzE;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,SAAS,GAAG,IAAI,CA0DlB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI,CA8BtB;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAO3D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,YAAY,GAAG,IAAI,CAerB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE"}
@@ -1,5 +1,6 @@
1
1
  import type { HttpRequest } from "./HttpRequest";
2
2
  import { Metadata } from "./Metadata";
3
+ import type { ByteRange } from "./range";
3
4
  export interface CreateCookieOptions {
4
5
  maxAge?: number;
5
6
  expires?: Date;
@@ -21,6 +22,16 @@ declare class Store {
21
22
  csrfHmac: string | null;
22
23
  locale: string | null;
23
24
  metadata: Metadata;
25
+ /**
26
+ * The parsed `Range` of the in-flight request, picked up by
27
+ * `FileStorage.read()` so a range reaches the storage backend without every
28
+ * handler having to thread it through by hand.
29
+ *
30
+ * Only populated inside a `this.stream()` route, and cleared once that route
31
+ * returns: a `FileStorage.read()` in an ordinary handler must never start
32
+ * silently returning partial bytes.
33
+ */
34
+ rangeRequest: ByteRange | null;
24
35
  constructor(req: HttpRequest);
25
36
  setLocale(locale: string): void;
26
37
  renderMeta(): {
@@ -1 +1 @@
1
- {"version":3,"file":"requestContext.d.ts","sourceRoot":"","sources":["../../http/requestContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,UAelC;AAID,cAAM,KAAK;IAUU,GAAG,EAAE,WAAW;IATnC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACjC,OAAO,EAAE,OAAO,CAAiB;IACjC,mBAAmB,mCAA0C;IAC7D,oBAAoB,YAAiB,OAAO,CAAC,GAAG,CAAC,EAAI;IACrD,IAAI,EAAE,GAAG,CAAQ;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,QAAQ,WAAkB;gBAEP,GAAG,EAAE,WAAW;IAEnC,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,UAAU;;;;;IAIV,WAAW,CAAC,IAAI,EAAE,MAAM;IAIxB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;IAIxE,YAAY,CAAC,IAAI,EAAE,MAAM;IAIzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAItC,OAAO,CAAC,IAAI,EAAE,GAAG;IAIjB,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;IAIrC,OAAO;CAOR;AAED,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ;IAIf,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;IAI5C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;CAGxD"}
1
+ {"version":3,"file":"requestContext.d.ts","sourceRoot":"","sources":["../../http/requestContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,UAelC;AAID,cAAM,KAAK;IAoBU,GAAG,EAAE,WAAW;IAnBnC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACjC,OAAO,EAAE,OAAO,CAAiB;IACjC,mBAAmB,mCAA0C;IAC7D,oBAAoB,YAAiB,OAAO,CAAC,GAAG,CAAC,EAAI;IACrD,IAAI,EAAE,GAAG,CAAQ;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,QAAQ,WAAkB;IAC1B;;;;;;;;OAQG;IACH,YAAY,EAAE,SAAS,GAAG,IAAI,CAAQ;gBAEnB,GAAG,EAAE,WAAW;IAEnC,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,UAAU;;;;;IAIV,WAAW,CAAC,IAAI,EAAE,MAAM;IAIxB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;IAIxE,YAAY,CAAC,IAAI,EAAE,MAAM;IAIzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAItC,OAAO,CAAC,IAAI,EAAE,GAAG;IAIjB,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;IAIrC,OAAO;CAOR;AAED,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ;IAIf,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;IAI5C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;CAGxD"}
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{q as x}from"../chunk-pygcsw1f.js";import{u as S}from"../chunk-pjgfvdr6.js";import"../chunk-yeqwzeq7.js";import"../chunk-sbmg0hfr.js";import"../chunk-n1xpxhm0.js";import"../chunk-bfnh3gwv.js";import"../chunk-cwq1vdcb.js";import{createElement as $,Fragment as e,isValidElement as b}from"react";function y(r,n){let s=Object.values(n).some((o)=>typeof o==="function"&&b(o(""))),g=/{{([^{}]+?)(?::([^{}\[\]]+?))?(?:\[(.*?)\])?}}/g;if(!s)return r.replace(g,(f,d,t,w)=>{let P=d.includes(":")?d.split(":")[0]:d,i=n[P];if(i===void 0)return f;if(typeof i==="function"){let U=i(w!==void 0?w:"");if(b(U))throw Error("JSX returned in string context");return String(U)}if(t)switch(t.toLowerCase()){case"number":return Number(i).toString();case"string":return String(i);case"boolean":return Boolean(i).toString();default:return String(i)}return String(i)});else{let o=[],f=0,d=null;while((d=g.exec(r))!==null){let[t,w,P,i]=d,c=d.index,U=w.includes(":")?w.split(":")[0]:w;if(c>f)o.push(r.substring(f,c));let T=n[U];if(T===void 0)o.push(t);else if(typeof T==="function"){let K=T(i!==void 0?i:"");o.push(K)}else if(P)switch(P.toLowerCase()){case"number":o.push(Number(T).toString());break;case"string":o.push(String(T));break;case"boolean":o.push(Boolean(T).toString());break;default:o.push(String(T))}else o.push(String(T));f=c+t.length}if(f<r.length)o.push(r.substring(f));return $(e,{},...o)}}class R{name;dictionary;constructor(r,n){this.name=r;this.dictionary=n}reference(r){if(typeof window<"u")throw Error("Cannot use reference in the browser");if(!this.dictionary?.[r])throw Error(`Translation not found for ${String(r)}`);return this.dictionary[r]}render(r,...n){let{locale:s=S.locale(),params:g}={params:{},...n[0]};if(typeof window<"u")throw Error("Cannot use render in the browser");if(!this.dictionary?.[r]?.[s])throw Error(`Translation not found for ${String(r)} in ${String(s)}`);return y(this.dictionary[r][s],g??{})}static create(r,n){return new R(r,n)}static text(r,...n){let{locale:s=S.locale(),params:g}={params:{},...n?.[0]};if(!r?.[s])throw Error(`Translation not found for ${String(s)}`);return y(r[s],g??{})}}export{x as I18nServiceProvider,R as Dictionary};
2
+ import{q as x}from"../chunk-h509r9s3.js";import{u as S}from"../chunk-q8haepmm.js";import"../chunk-fk9xtngd.js";import"../chunk-ty3q916e.js";import"../chunk-whj1a3vr.js";import"../chunk-sdx8r2qb.js";import"../chunk-6gtmkbh0.js";import{createElement as $,Fragment as e,isValidElement as b}from"react";function y(r,n){let s=Object.values(n).some((o)=>typeof o==="function"&&b(o(""))),g=/{{([^{}]+?)(?::([^{}\[\]]+?))?(?:\[(.*?)\])?}}/g;if(!s)return r.replace(g,(f,d,t,w)=>{let P=d.includes(":")?d.split(":")[0]:d,i=n[P];if(i===void 0)return f;if(typeof i==="function"){let U=i(w!==void 0?w:"");if(b(U))throw Error("JSX returned in string context");return String(U)}if(t)switch(t.toLowerCase()){case"number":return Number(i).toString();case"string":return String(i);case"boolean":return Boolean(i).toString();default:return String(i)}return String(i)});else{let o=[],f=0,d=null;while((d=g.exec(r))!==null){let[t,w,P,i]=d,c=d.index,U=w.includes(":")?w.split(":")[0]:w;if(c>f)o.push(r.substring(f,c));let T=n[U];if(T===void 0)o.push(t);else if(typeof T==="function"){let K=T(i!==void 0?i:"");o.push(K)}else if(P)switch(P.toLowerCase()){case"number":o.push(Number(T).toString());break;case"string":o.push(String(T));break;case"boolean":o.push(Boolean(T).toString());break;default:o.push(String(T))}else o.push(String(T));f=c+t.length}if(f<r.length)o.push(r.substring(f));return $(e,{},...o)}}class R{name;dictionary;constructor(r,n){this.name=r;this.dictionary=n}reference(r){if(typeof window<"u")throw Error("Cannot use reference in the browser");if(!this.dictionary?.[r])throw Error(`Translation not found for ${String(r)}`);return this.dictionary[r]}render(r,...n){let{locale:s=S.locale(),params:g}={params:{},...n[0]};if(typeof window<"u")throw Error("Cannot use render in the browser");if(!this.dictionary?.[r]?.[s])throw Error(`Translation not found for ${String(r)} in ${String(s)}`);return y(this.dictionary[r][s],g??{})}static create(r,n){return new R(r,n)}static text(r,...n){let{locale:s=S.locale(),params:g}={params:{},...n?.[0]};if(!r?.[s])throw Error(`Translation not found for ${String(s)}`);return y(r[s],g??{})}}export{x as I18nServiceProvider,R as Dictionary};
3
3
 
4
4
  //# debugId=1491F33D6E4F53A164756E2164756E21
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{q as y}from"../chunk-pygcsw1f.js";import{r as z}from"../chunk-tb8yy4rf.js";import{A as X,E as Y,G as N,H as Z,I as $,K as J,M as K,N as V,s as Q,v as W}from"../chunk-pjgfvdr6.js";import{Z as p,ca as H,ga as L}from"../chunk-yeqwzeq7.js";import{la as T}from"../chunk-sbmg0hfr.js";import{Aa as u,Ea as m,Ia as C,Ka as c,La as E,oa as A,pa as R,ta as S,wa as d,xa as h,ya as k,za as I}from"../chunk-wa84ybnt.js";import"../chunk-qeq8hv3t.js";import"../chunk-522q81af.js";import"../chunk-syaxsp9y.js";import"../chunk-8cqkdzyh.js";import"../chunk-hzw2y2rz.js";import"../chunk-q0y425d3.js";import"../chunk-1kmbs8cd.js";import"../chunk-zaa3yt2w.js";import"../chunk-358x9aca.js";import"../chunk-pxcv9ccp.js";import"../chunk-qzemjynx.js";import"../chunk-shpca068.js";import{Kb as _}from"../chunk-b3qebxqh.js";import{Pb as B}from"../chunk-n1xpxhm0.js";import{Qb as G,Rb as O}from"../chunk-bfnh3gwv.js";import"../chunk-cwq1vdcb.js";class q extends O{service;static _name="CronServiceContainer";constructor(x){super();this.service=x;if(this.service.jobs.length===0)return;let P=globalThis.__gemiCronJobs??=new Map,f=async(w)=>{return await this.service.kernel.waitForBoot.call(this.service.kernel),await this.service.kernel.run.call(this.service.kernel,w)};for(let w of this.service.jobs){let U=new w;if(!U.name){console.error(`Cron job must have a name. Job: ${JSON.stringify(U)}`);continue}if(!U.cron){console.error(`Cron job must have an expression. Job: ${U.name}`);continue}P.get(U.name)?.stop();let l=Bun.cron(U.cron,()=>f(async()=>{try{await U.onTick.call(U)}catch(M){console.error(`Error executing cron job ${U.name}:`,M)}try{await U.callback.call(U)}catch(M){console.error(`Error in cron job ${U.name}:`,M)}try{await U.onComplete.call(U)}catch(M){console.error(`Error completing cron job ${U.name}:`,M)}}));P.set(U.name,l)}}}class D extends B{id=crypto.randomUUID();boot(){}}class F extends B{services=new Map;boot(){}}class j{emailServiceProvider=d;authenticationServiceProvider=N;middlewareServiceProvider=p;i18nServiceProvider=y;fileStorageServiceProvider=A;apiRouterServiceProvider=R;viewRouterServiceProvider=k;rateLimiterServiceProvider=S;broadcastingsServiceProvider=h;loggingServiceProvider=I;queueServiceProvider=u;imageServiceProvider=m;cronServiceProvider=C;kernelIdServiceProvider=D;redisServiceProvider=c;services={};booted=!1;boot(){this.services={[z._name]:new z(new this.emailServiceProvider),[H._name]:new H(new this.authenticationServiceProvider),[$._name]:new $(new this.middlewareServiceProvider),[T._name]:new T(new this.i18nServiceProvider),[W._name]:new W(new this.fileStorageServiceProvider),[V._name]:new V(new this.apiRouterServiceProvider),[K._name]:new K(new this.viewRouterServiceProvider),[L._name]:new L(new this.rateLimiterServiceProvider),[Q._name]:new Q(new this.broadcastingsServiceProvider),[X._name]:new X(new this.loggingServiceProvider),[_._name]:new _(new this.queueServiceProvider),[Z._name]:new Z(new this.imageServiceProvider),[q._name]:new q(new this.cronServiceProvider(this)),[J._name]:new J(new this.kernelIdServiceProvider),[Y._name]:new Y(new this.redisServiceProvider),[E._name]:new E(new F)},this.booted=!0}run(x){let P=this.services;return G.run(P,x)}destroy(){for(let x of Object.keys(this.services))delete this.services[x];G.disable()}async waitForBoot(){if(!this.booted)await new Promise((x)=>{while(!this.booted)setTimeout(()=>{if(this.booted)x()},10)})}}class v{prisma;constructor(x){this.prisma=x}async findUserByVerificationToken(x){return await this.prisma.user.findFirst({where:{verificationToken:x}})}async verifyUser(x){return await this.prisma.user.update({where:{email:x},data:{emailVerifiedAt:new Date}})}async createSessionV2(x){return await this.prisma.session.create({data:x,include:{user:{select:{password:!1,id:!0,email:!0,globalRole:!0,name:!0,locale:!0,publicId:!0,accounts:{select:{id:!0,publicId:!0,organization:!0,organizationRole:!0}}}}}})}async createSession(x){return await this.prisma.session.create({data:x,include:{user:!0}})}async createUser(x){return await this.prisma.user.create({data:x,omit:{password:!0}})}async deleteSession(x){return await this.prisma.session.deleteMany({where:{token:x.token}})}async findUserByEmailAddress(x,P){if(P)return await this.prisma.user.findUnique({where:{email:x,emailVerifiedAt:{not:null}}});return await this.prisma.user.findUnique({where:{email:x}})}async findSession(x){if(!x.token)return null;try{return await this.prisma.session.findUnique({where:{token:x.token},include:{user:{select:{password:!1,id:!0,email:!0,globalRole:!0,name:!0,locale:!0,publicId:!0,accounts:{select:{id:!0,publicId:!0,organization:!0,organizationRole:!0}}}}}})}catch(P){return console.log(P),null}}async updateSession(x){return await this.prisma.session.update({where:{token:x.token},data:{expiresAt:x.expiresAt},include:{user:{select:{id:!0,password:!1,email:!0,globalRole:!0,name:!0,locale:!0,publicId:!0,accounts:{select:{id:!0,publicId:!0,organization:!0,organizationRole:!0}},organization:!0}}}})}async updateUserPassword(x){return await this.prisma.user.update({where:{id:x.id},data:{password:x.password}})}async createPasswordResetToken(x){return await this.prisma.passwordResetToken.create({data:{user:{connect:{id:x.user.id}},token:x.token}})}async findPasswordResetToken(x){let{token:P}=x;return await this.prisma.passwordResetToken.findUnique({where:{token:P},include:{user:!0}})}async deleteAllUserSessions(x){return await this.prisma.session.deleteMany({where:{userId:x}})}async deletePasswordResetToken(x){let{token:P}=x;return await this.prisma.passwordResetToken.delete({where:{token:P}})}async createAccount(x){return await this.prisma.account.create({data:{organizationId:x.organizationId,organizationRole:x.organizationRole,userId:x.userId}})}async deleteInvitationById(x){return await this.prisma.organizationInvitation.delete({where:{publicId:x}})}async findInvitation(x,P){return await this.prisma.organizationInvitation.findFirst({where:{publicId:x,email:P}})}async createMagicLinkToken(x){return await this.prisma.magicLinkToken.create({data:{email:x.email,token:x.token,pin:x.pin}})}async findUserMagicLinkToken(x){let{token:P,pin:f,email:w}=x;if(P)return this.prisma.magicLinkToken.findUnique({where:{token_email:{email:w,token:P}}});else return await this.prisma.magicLinkToken.findUnique({where:{pin_email:{email:w,pin:f}}})}async deleteMagicLinkToken(x){return await this.prisma.magicLinkToken.deleteMany({where:{email:x}})}async createSocialAccount(x){return await this.prisma.socialAccount.create({data:x})}}export{v as PrismaAuthenticationAdapter,j as Kernel,N as AuthenticationServiceProvider};
2
+ import{q as y}from"../chunk-h509r9s3.js";import{r as z}from"../chunk-tatd75jn.js";import{A as X,E as Y,G as N,H as Z,I as $,K as J,M as K,N as V,s as Q,v as W}from"../chunk-q8haepmm.js";import{$ as p,ba as H,fa as L}from"../chunk-fk9xtngd.js";import{ka as T}from"../chunk-ty3q916e.js";import{Aa as u,Ea as m,Ia as C,Ka as c,La as E,na as A,oa as R,ta as S,wa as d,xa as h,ya as k,za as I}from"../chunk-25d4feyv.js";import"../chunk-knrx23te.js";import"../chunk-20376aj6.js";import"../chunk-ngnrytfh.js";import"../chunk-9s3te5pa.js";import"../chunk-qy3aczt9.js";import"../chunk-ytr22fm4.js";import"../chunk-kkdtznm5.js";import"../chunk-s49529x2.js";import"../chunk-5kx4hw7c.js";import"../chunk-nx8t65g3.js";import"../chunk-sdj112nj.js";import"../chunk-gv4v6qsg.js";import{Kb as _}from"../chunk-9r2k5ykk.js";import{_b as B}from"../chunk-whj1a3vr.js";import{$b as G,ac as O}from"../chunk-sdx8r2qb.js";import"../chunk-6gtmkbh0.js";class q extends O{service;static _name="CronServiceContainer";constructor(x){super();this.service=x;if(this.service.jobs.length===0)return;let P=globalThis.__gemiCronJobs??=new Map,f=async(w)=>{return await this.service.kernel.waitForBoot.call(this.service.kernel),await this.service.kernel.run.call(this.service.kernel,w)};for(let w of this.service.jobs){let U=new w;if(!U.name){console.error(`Cron job must have a name. Job: ${JSON.stringify(U)}`);continue}if(!U.cron){console.error(`Cron job must have an expression. Job: ${U.name}`);continue}P.get(U.name)?.stop();let l=Bun.cron(U.cron,()=>f(async()=>{try{await U.onTick.call(U)}catch(M){console.error(`Error executing cron job ${U.name}:`,M)}try{await U.callback.call(U)}catch(M){console.error(`Error in cron job ${U.name}:`,M)}try{await U.onComplete.call(U)}catch(M){console.error(`Error completing cron job ${U.name}:`,M)}}));P.set(U.name,l)}}}class D extends B{id=crypto.randomUUID();boot(){}}class F extends B{services=new Map;boot(){}}class j{emailServiceProvider=d;authenticationServiceProvider=N;middlewareServiceProvider=p;i18nServiceProvider=y;fileStorageServiceProvider=A;apiRouterServiceProvider=R;viewRouterServiceProvider=k;rateLimiterServiceProvider=S;broadcastingsServiceProvider=h;loggingServiceProvider=I;queueServiceProvider=u;imageServiceProvider=m;cronServiceProvider=C;kernelIdServiceProvider=D;redisServiceProvider=c;services={};booted=!1;boot(){this.services={[z._name]:new z(new this.emailServiceProvider),[H._name]:new H(new this.authenticationServiceProvider),[$._name]:new $(new this.middlewareServiceProvider),[T._name]:new T(new this.i18nServiceProvider),[W._name]:new W(new this.fileStorageServiceProvider),[V._name]:new V(new this.apiRouterServiceProvider),[K._name]:new K(new this.viewRouterServiceProvider),[L._name]:new L(new this.rateLimiterServiceProvider),[Q._name]:new Q(new this.broadcastingsServiceProvider),[X._name]:new X(new this.loggingServiceProvider),[_._name]:new _(new this.queueServiceProvider),[Z._name]:new Z(new this.imageServiceProvider),[q._name]:new q(new this.cronServiceProvider(this)),[J._name]:new J(new this.kernelIdServiceProvider),[Y._name]:new Y(new this.redisServiceProvider),[E._name]:new E(new F)},this.booted=!0}run(x){let P=this.services;return G.run(P,x)}destroy(){for(let x of Object.keys(this.services))delete this.services[x];G.disable()}async waitForBoot(){if(!this.booted)await new Promise((x)=>{while(!this.booted)setTimeout(()=>{if(this.booted)x()},10)})}}class v{prisma;constructor(x){this.prisma=x}async findUserByVerificationToken(x){return await this.prisma.user.findFirst({where:{verificationToken:x}})}async verifyUser(x){return await this.prisma.user.update({where:{email:x},data:{emailVerifiedAt:new Date}})}async createSessionV2(x){return await this.prisma.session.create({data:x,include:{user:{select:{password:!1,id:!0,email:!0,globalRole:!0,name:!0,locale:!0,publicId:!0,accounts:{select:{id:!0,publicId:!0,organization:!0,organizationRole:!0}}}}}})}async createSession(x){return await this.prisma.session.create({data:x,include:{user:!0}})}async createUser(x){return await this.prisma.user.create({data:x,omit:{password:!0}})}async deleteSession(x){return await this.prisma.session.deleteMany({where:{token:x.token}})}async findUserByEmailAddress(x,P){if(P)return await this.prisma.user.findUnique({where:{email:x,emailVerifiedAt:{not:null}}});return await this.prisma.user.findUnique({where:{email:x}})}async findSession(x){if(!x.token)return null;try{return await this.prisma.session.findUnique({where:{token:x.token},include:{user:{select:{password:!1,id:!0,email:!0,globalRole:!0,name:!0,locale:!0,publicId:!0,accounts:{select:{id:!0,publicId:!0,organization:!0,organizationRole:!0}}}}}})}catch(P){return console.log(P),null}}async updateSession(x){return await this.prisma.session.update({where:{token:x.token},data:{expiresAt:x.expiresAt},include:{user:{select:{id:!0,password:!1,email:!0,globalRole:!0,name:!0,locale:!0,publicId:!0,accounts:{select:{id:!0,publicId:!0,organization:!0,organizationRole:!0}},organization:!0}}}})}async updateUserPassword(x){return await this.prisma.user.update({where:{id:x.id},data:{password:x.password}})}async createPasswordResetToken(x){return await this.prisma.passwordResetToken.create({data:{user:{connect:{id:x.user.id}},token:x.token}})}async findPasswordResetToken(x){let{token:P}=x;return await this.prisma.passwordResetToken.findUnique({where:{token:P},include:{user:!0}})}async deleteAllUserSessions(x){return await this.prisma.session.deleteMany({where:{userId:x}})}async deletePasswordResetToken(x){let{token:P}=x;return await this.prisma.passwordResetToken.delete({where:{token:P}})}async createAccount(x){return await this.prisma.account.create({data:{organizationId:x.organizationId,organizationRole:x.organizationRole,userId:x.userId}})}async deleteInvitationById(x){return await this.prisma.organizationInvitation.delete({where:{publicId:x}})}async findInvitation(x,P){return await this.prisma.organizationInvitation.findFirst({where:{publicId:x,email:P}})}async createMagicLinkToken(x){return await this.prisma.magicLinkToken.create({data:{email:x.email,token:x.token,pin:x.pin}})}async findUserMagicLinkToken(x){let{token:P,pin:f,email:w}=x;if(P)return this.prisma.magicLinkToken.findUnique({where:{token_email:{email:w,token:P}}});else return await this.prisma.magicLinkToken.findUnique({where:{pin_email:{email:w,pin:f}}})}async deleteMagicLinkToken(x){return await this.prisma.magicLinkToken.deleteMany({where:{email:x}})}async createSocialAccount(x){return await this.prisma.socialAccount.create({data:x})}}export{v as PrismaAuthenticationAdapter,j as Kernel,N as AuthenticationServiceProvider};
3
3
 
4
- //# debugId=795799A0D37328F564756E2164756E21
4
+ //# debugId=4C9A3D295A07FEA264756E2164756E21
@@ -9,6 +9,6 @@
9
9
  "import type {\n User,\n CreateSessionArgs,\n DeleteSessionArgs,\n SessionWithUser,\n CreateUserArgs,\n FindSessionArgs,\n UpdateSessionArgs,\n IAuthenticationAdapter,\n CreatePasswordResetTokenArgs,\n PasswordResetToken,\n FindPasswordResetTokenArgs,\n DeletePasswordResetTokenArgs,\n CreateAccountArgs,\n CreateSocialAccountArgs,\n} from \"./types\";\n\nexport class PrismaAuthenticationAdapter implements IAuthenticationAdapter {\n constructor(protected prisma: any) {}\n\n async findUserByVerificationToken(token: string): Promise<User | null> {\n return await this.prisma.user.findFirst({\n where: { verificationToken: token },\n });\n }\n\n async verifyUser(email: string): Promise<User> {\n return await this.prisma.user.update({\n where: { email },\n data: { emailVerifiedAt: new Date() },\n });\n }\n\n async createSessionV2(args: CreateSessionArgs): Promise<SessionWithUser> {\n return await this.prisma.session.create({\n data: args,\n include: {\n user: {\n select: {\n password: false,\n id: true,\n email: true,\n globalRole: true,\n name: true,\n locale: true,\n publicId: true,\n accounts: {\n select: {\n id: true,\n publicId: true,\n organization: true,\n organizationRole: true,\n },\n },\n },\n },\n },\n });\n }\n\n async createSession(args: CreateSessionArgs): Promise<SessionWithUser> {\n return await this.prisma.session.create({\n data: args,\n include: { user: true },\n });\n }\n\n async createUser(args: CreateUserArgs): Promise<User> {\n return await this.prisma.user.create({\n data: args,\n omit: { password: true },\n });\n }\n\n async deleteSession(args: DeleteSessionArgs): Promise<void> {\n return await this.prisma.session.deleteMany({\n where: { token: args.token },\n });\n }\n\n async findUserByEmailAddress(email: string, verify: boolean): Promise<User> {\n if (verify) {\n return await this.prisma.user.findUnique({\n where: { email, emailVerifiedAt: { not: null } },\n });\n }\n\n const user = await this.prisma.user.findUnique({\n where: { email },\n });\n\n return user;\n }\n\n async findSession(args: FindSessionArgs): Promise<SessionWithUser | null> {\n if (!args.token) return null;\n try {\n const session = await this.prisma.session.findUnique({\n where: {\n token: args.token,\n // userAgent:\n // process.env.NODE_ENV === \"development\" ? \"local\" : args.userAgent,\n },\n include: {\n user: {\n select: {\n password: false,\n id: true,\n email: true,\n globalRole: true,\n name: true,\n locale: true,\n publicId: true,\n accounts: {\n select: {\n id: true,\n publicId: true,\n organization: true,\n organizationRole: true,\n },\n },\n },\n },\n },\n });\n\n return session;\n } catch (err) {\n console.log(err);\n return null;\n }\n }\n\n async updateSession(\n args: UpdateSessionArgs,\n ): Promise<SessionWithUser | null> {\n return await this.prisma.session.update({\n where: { token: args.token },\n data: { expiresAt: args.expiresAt },\n include: {\n user: {\n select: {\n id: true,\n password: false,\n email: true,\n globalRole: true,\n name: true,\n locale: true,\n publicId: true,\n accounts: {\n select: {\n id: true,\n publicId: true,\n organization: true,\n organizationRole: true,\n },\n },\n organization: true,\n },\n },\n },\n });\n }\n\n async updateUserPassword(args: {\n id: number;\n password: string;\n }): Promise<User> {\n return await this.prisma.user.update({\n where: { id: args.id },\n data: { password: args.password },\n });\n }\n\n async createPasswordResetToken(args: CreatePasswordResetTokenArgs) {\n return await this.prisma.passwordResetToken.create({\n data: {\n user: { connect: { id: args.user.id } },\n token: args.token,\n },\n });\n }\n\n async findPasswordResetToken(\n args: FindPasswordResetTokenArgs,\n ): Promise<PasswordResetToken | null> {\n const { token } = args;\n return await this.prisma.passwordResetToken.findUnique({\n where: { token },\n include: { user: true },\n });\n }\n\n async deleteAllUserSessions(userId: number) {\n return await this.prisma.session.deleteMany({ where: { userId } });\n }\n\n async deletePasswordResetToken(args: DeletePasswordResetTokenArgs) {\n const { token } = args;\n return await this.prisma.passwordResetToken.delete({ where: { token } });\n }\n\n async createAccount(args: CreateAccountArgs) {\n return await this.prisma.account.create({\n data: {\n organizationId: args.organizationId,\n organizationRole: args.organizationRole,\n userId: args.userId,\n },\n });\n }\n\n async deleteInvitationById(invitationId: string) {\n return await this.prisma.organizationInvitation.delete({\n where: { publicId: invitationId },\n });\n }\n\n async findInvitation(invitationId: string, email: string) {\n return await this.prisma.organizationInvitation.findFirst({\n where: { publicId: invitationId, email },\n });\n }\n\n async createMagicLinkToken(args: {\n email: string;\n token: string;\n pin: string;\n }) {\n return await this.prisma.magicLinkToken.create({\n data: {\n email: args.email,\n token: args.token,\n pin: args.pin,\n },\n });\n }\n\n async findUserMagicLinkToken(args: {\n email: string;\n token?: string;\n pin?: string;\n }) {\n const { token, pin, email } = args;\n\n if (token) {\n return this.prisma.magicLinkToken.findUnique({\n where: {\n token_email: {\n email,\n token,\n },\n },\n });\n } else {\n return await this.prisma.magicLinkToken.findUnique({\n where: {\n pin_email: {\n email,\n pin,\n },\n },\n });\n }\n }\n\n async deleteMagicLinkToken(email: string) {\n return await this.prisma.magicLinkToken.deleteMany({\n where: { email },\n });\n }\n\n async createSocialAccount(args: CreateSocialAccountArgs) {\n return await this.prisma.socialAccount.create({\n data: args,\n });\n }\n}\n"
10
10
  ],
11
11
  "mappings": "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",
12
- "debugId": "795799A0D37328F564756E2164756E21",
12
+ "debugId": "4C9A3D295A07FEA264756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{n as g}from"../chunk-ppt296ye.js";import{o as b}from"../chunk-gsvzrj5r.js";import"../chunk-pjgfvdr6.js";import"../chunk-yeqwzeq7.js";import"../chunk-sbmg0hfr.js";import"../chunk-b3qebxqh.js";import"../chunk-n1xpxhm0.js";import"../chunk-bfnh3gwv.js";import{Vb as S}from"../chunk-cwq1vdcb.js";class i{app;instrumentation;constructor(f){this.app=new b({kernel:f.kernel}),this.instrumentation=f.instrumentation??((z,B)=>B(z))}async start(){if(Bun.env.NODE_ENV==="production"){let{httpProd:f}=await import("../chunk-v3agzap3.js");await f(this.app,this.instrumentation.bind(this))}else{g();let{httpDev:f}=await import("../chunk-54wqarj8.js");await f(this.app,this.instrumentation.bind(this))}}}export{i as Server};
2
+ import{n as g}from"../chunk-ppt296ye.js";import{o as b}from"../chunk-m359awjw.js";import"../chunk-q8haepmm.js";import"../chunk-fk9xtngd.js";import"../chunk-ty3q916e.js";import"../chunk-9r2k5ykk.js";import"../chunk-whj1a3vr.js";import"../chunk-sdx8r2qb.js";import{ec as S}from"../chunk-6gtmkbh0.js";class i{app;instrumentation;constructor(f){this.app=new b({kernel:f.kernel}),this.instrumentation=f.instrumentation??((z,B)=>B(z))}async start(){if(Bun.env.NODE_ENV==="production"){let{httpProd:f}=await import("../chunk-yrtvjmrj.js");await f(this.app,this.instrumentation.bind(this))}else{g();let{httpDev:f}=await import("../chunk-j3x1fffh.js");await f(this.app,this.instrumentation.bind(this))}}}export{i as Server};
3
3
 
4
- //# debugId=4B643978D79229AA64756E2164756E21
4
+ //# debugId=7B6CB429BACC298B64756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "import { App } from \"../app\";\nimport { Kernel } from \"../kernel\";\nimport { Instrumentation } from \"./types\";\nimport { watchEnv } from \"./watchEnv\";\n\nexport class Server {\n private app: App;\n private instrumentation: Instrumentation;\n\n constructor(params: { kernel: new () => Kernel; instrumentation?: Instrumentation }) {\n this.app = new App({ kernel: params.kernel });\n this.instrumentation =\n params.instrumentation ??\n ((req: Request, next: (req: Request) => Promise<Response>) => next(req));\n }\n\n async start() {\n // Dynamic import so each mode only pulls in its own code: `httpDev` drags in\n // Vite (dev-only) and `httpProd` reads the built `dist/` manifests — neither\n // should load in the other environment.\n if (process.env.NODE_ENV === \"production\") {\n const { httpProd } = await import(\"./httpProd.js\");\n await httpProd(this.app, this.instrumentation.bind(this));\n } else {\n // Dev only: reload `.env` into process.env on change so config edits take\n // effect without restarting the dev server (Bun reads `.env` only at\n // startup, even under `--hot`).\n watchEnv();\n const { httpDev } = await import(\"./httpDev.js\");\n await httpDev(this.app, this.instrumentation.bind(this));\n }\n }\n}\n"
6
6
  ],
7
7
  "mappings": ";kVAKO,CAAM,JAAO,JACV,DACA,WAER,MAAW,JAAC,HAAyE,CACnF,KAAK,IAAM,IAAI,EAAI,CAAE,OAAQ,EAAO,MAAO,CAAC,EAC5C,KAAK,gBACH,EAAO,kBACN,CAAC,EAAc,IAA8C,EAAK,CAAG,QAGpE,MAAK,EAAG,CAIZ,GAAI,mBAAyB,aAAc,CACzC,IAAQ,YAAa,KAAa,gCAClC,MAAM,EAAS,KAAK,IAAK,KAAK,gBAAgB,KAAK,IAAI,CAAC,EACnD,KAIL,EAAS,EACT,IAAQ,WAAY,KAAa,gCACjC,MAAM,EAAQ,KAAK,IAAK,KAAK,gBAAgB,KAAK,IAAI,CAAC,GAG7D",
8
- "debugId": "4B643978D79229AA64756E2164756E21",
8
+ "debugId": "7B6CB429BACC298B64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,78 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { FileStorageDriver } from "./FileStorageDriver";
3
+ import type { PutFileParams, ReadFileParams, ReadResult } from "./types";
4
+ /**
5
+ * The slice of `@azure/storage-blob` this driver uses. Declared structurally so
6
+ * the package stays an optional peer dependency: nothing here imports its types.
7
+ */
8
+ interface BlobClientLike {
9
+ download(offset?: number, count?: number): Promise<{
10
+ readableStreamBody?: NodeJS.ReadableStream;
11
+ blobBody?: Promise<Blob>;
12
+ contentLength?: number;
13
+ contentType?: string;
14
+ contentRange?: string;
15
+ etag?: string;
16
+ lastModified?: Date;
17
+ }>;
18
+ getProperties(): Promise<{
19
+ contentLength?: number;
20
+ contentType?: string;
21
+ etag?: string;
22
+ lastModified?: Date;
23
+ }>;
24
+ uploadData(data: Buffer | Blob, options?: {
25
+ blobHTTPHeaders?: {
26
+ blobContentType?: string;
27
+ };
28
+ }): Promise<unknown>;
29
+ delete(): Promise<unknown>;
30
+ }
31
+ interface ContainerClientLike {
32
+ getBlockBlobClient(name: string): BlobClientLike;
33
+ listBlobsFlat(options?: {
34
+ prefix?: string;
35
+ }): AsyncIterable<{
36
+ name: string;
37
+ }>;
38
+ }
39
+ interface BlobServiceClientLike {
40
+ getContainerClient(name: string): ContainerClientLike;
41
+ }
42
+ export interface AzureBlobDriverConfig {
43
+ /** Defaults to `process.env.AZURE_STORAGE_CONNECTION_STRING`. */
44
+ connectionString?: string;
45
+ /** Account URL, e.g. `https://acct.blob.core.windows.net`, optionally carrying a SAS token. */
46
+ url?: string;
47
+ /** A `StorageSharedKeyCredential` or any `TokenCredential`, used with `url`. */
48
+ credential?: unknown;
49
+ /** Default container. Falls back to `process.env.BUCKET_NAME`. */
50
+ container?: string;
51
+ /**
52
+ * A pre-built `BlobServiceClient`. Supply this to configure retries, proxies
53
+ * or a custom credential chain yourself — the driver then never imports the
54
+ * SDK.
55
+ */
56
+ serviceClient?: BlobServiceClientLike;
57
+ }
58
+ /**
59
+ * Azure Blob Storage.
60
+ *
61
+ * `@azure/storage-blob` is an optional peer dependency, loaded on first use, so
62
+ * apps that do not use Azure never install it.
63
+ */
64
+ export declare class AzureBlobDriver extends FileStorageDriver {
65
+ private config;
66
+ private serviceClientPromise;
67
+ constructor(config?: AzureBlobDriverConfig);
68
+ private serviceClient;
69
+ private blob;
70
+ put(params: PutFileParams | Blob): Promise<string>;
71
+ list(folder: string): Promise<string[]>;
72
+ fetch(params: ReadFileParams | string): Promise<Response>;
73
+ read(input: ReadFileParams | string): Promise<ReadResult>;
74
+ size(params: ReadFileParams | string): Promise<number>;
75
+ delete(params: ReadFileParams | string): Promise<void>;
76
+ }
77
+ export {};
78
+ //# sourceMappingURL=AzureBlobDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AzureBlobDriver.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/AzureBlobDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzE;;;GAGG;AACH,UAAU,cAAc;IACtB,QAAQ,CACN,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;QACT,kBAAkB,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;QAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,IAAI,CAAC;KACrB,CAAC,CAAC;IACH,aAAa,IAAI,OAAO,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,IAAI,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,CACR,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE;YAAE,eAAe,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,UAAU,mBAAmB;IAC3B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;IACjD,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/E;AAED,UAAU,qBAAqB;IAC7B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACvD;AAED,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+FAA+F;IAC/F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACvC;AAkBD;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;IAGxC,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,oBAAoB,CAA+C;gBAEvD,MAAM,GAAE,qBAA0B;YAIxC,aAAa;YAmCb,IAAI;IAeZ,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAiChC,IAAI,CAAC,MAAM,EAAE,MAAM;IAYnB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAkBrC,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAyDzD,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAgBpC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAc7C"}
@@ -1,7 +1,23 @@
1
- import type { IFileStorageDriver, ReadFileParams, PutFileParams } from "./types";
1
+ import type { IFileStorageDriver, PutFileParams, ReadFileParams, ReadResult } from "./types";
2
2
  export declare abstract class FileStorageDriver implements IFileStorageDriver {
3
3
  abstract fetch(params: ReadFileParams | string): Promise<Response>;
4
4
  abstract put(params: PutFileParams | Blob): Promise<string>;
5
5
  abstract list(folder: string): Promise<any>;
6
+ /**
7
+ * Default `read()` for drivers that only implement `fetch()`.
8
+ *
9
+ * Deliberately not abstract: every driver written before `read()` existed
10
+ * keeps compiling and gains working range support for free. It is not
11
+ * *efficient* though — to serve a range it buffers the whole object so the
12
+ * framework can slice it, which saves no bandwidth from the backend. Any
13
+ * driver whose backend can range natively should override this.
14
+ */
15
+ read(input: ReadFileParams | string): Promise<ReadResult>;
16
+ /**
17
+ * Total size of an object. Used to resolve suffix ranges on backends without
18
+ * native suffix support, and to report the total on a 416. Override with a
19
+ * HEAD-style request wherever one is available.
20
+ */
21
+ size(params: ReadFileParams | string): Promise<number>;
6
22
  }
7
23
  //# sourceMappingURL=FileStorageDriver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileStorageDriver.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/FileStorageDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,8BAAsB,iBAAkB,YAAW,kBAAkB;IACnE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3D,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAC5C"}
1
+ {"version":3,"file":"FileStorageDriver.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/FileStorageDriver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAC;AAEjB,8BAAsB,iBAAkB,YAAW,kBAAkB;IACnE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3D,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAE3C;;;;;;;;OAQG;IACG,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoD/D;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAc7D"}
@@ -1,10 +1,12 @@
1
- import type { PutFileParams, ReadFileParams } from "./types";
1
+ import type { PutFileParams, ReadFileParams, ReadResult } from "./types";
2
2
  import { FileStorageDriver } from "./FileStorageDriver";
3
3
  export declare class FileSystemDriver extends FileStorageDriver {
4
4
  private folderPath;
5
5
  constructor(folderPath?: string);
6
6
  put(params: PutFileParams | Blob): Promise<string>;
7
7
  fetch(params: ReadFileParams | string): Promise<Response>;
8
+ read(input: ReadFileParams | string): Promise<ReadResult>;
9
+ size(params: ReadFileParams | string): Promise<number>;
8
10
  list(): Promise<string[]>;
9
11
  }
10
12
  //# sourceMappingURL=FileSystemDriver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileSystemDriver.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/FileSystemDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,qBAAa,gBAAiB,SAAQ,iBAAiB;IACzC,OAAO,CAAC,UAAU;gBAAV,UAAU,GAAE,MAA0C;IAIpE,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IA0BhC,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IA+BrC,IAAI;CAKX"}
1
+ {"version":3,"file":"FileSystemDriver.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/FileSystemDriver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQxD,qBAAa,gBAAiB,SAAQ,iBAAiB;IACzC,OAAO,CAAC,UAAU;gBAAV,UAAU,GAAE,MAA0C;IAIpE,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IA0BhC,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IA+BrC,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAyCzD,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IASpC,IAAI;CAKX"}
@@ -1,4 +1,4 @@
1
- import type { PutFileParams, ReadFileParams } from "./types";
1
+ import type { PutFileParams, ReadFileParams, ReadResult } from "./types";
2
2
  import { S3Client } from "@aws-sdk/client-s3";
3
3
  import { FileStorageDriver } from "./FileStorageDriver";
4
4
  export declare class S3Driver extends FileStorageDriver {
@@ -7,5 +7,7 @@ export declare class S3Driver extends FileStorageDriver {
7
7
  put(params: PutFileParams | Blob): Promise<string>;
8
8
  list(folder: string): Promise<import("@aws-sdk/client-s3").ListObjectsV2CommandOutput>;
9
9
  fetch(params: ReadFileParams | string): Promise<Response>;
10
+ read(input: ReadFileParams | string): Promise<ReadResult>;
11
+ size(params: ReadFileParams | string): Promise<number>;
10
12
  }
11
13
  //# sourceMappingURL=S3Driver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"S3Driver.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/S3Driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7D,OAAO,EAIL,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,QAAS,SAAQ,iBAAiB;IAC7C,OAAO,CAAC,MAAM,CAAW;gBAEb,GAAG,MAAM,EAAE,qBAAqB,CAAC,OAAO,QAAQ,CAAC;IAKvD,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAuChC,IAAI,CAAC,MAAM,EAAE,MAAM;IAWnB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAgC5C"}
1
+ {"version":3,"file":"S3Driver.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/S3Driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzE,OAAO,EAKL,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,qBAAa,QAAS,SAAQ,iBAAiB;IAC7C,OAAO,CAAC,MAAM,CAAW;gBAEb,GAAG,MAAM,EAAE,qBAAqB,CAAC,OAAO,QAAQ,CAAC;IAKvD,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IA6ChC,IAAI,CAAC,MAAM,EAAE,MAAM;IAWnB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAiCrC,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiDzD,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAkB3C"}
@@ -1,3 +1,5 @@
1
+ import type { ByteRange } from "../../../http/range";
2
+ export type { ByteRange };
1
3
  export interface PutFileParams {
2
4
  name: string;
3
5
  bucket?: string;
@@ -7,6 +9,44 @@ export interface PutFileParams {
7
9
  export interface ReadFileParams {
8
10
  name: string;
9
11
  bucket?: string;
12
+ /**
13
+ * Ask the backend for only these bytes. Absent or `null` reads the whole
14
+ * object. Drivers that cannot range are free to ignore this and return the
15
+ * complete object with `partial: false`.
16
+ */
17
+ range?: ByteRange | null;
18
+ }
19
+ /**
20
+ * What a driver hands back from `read()`: the bytes, plus enough metadata for
21
+ * the framework to build the HTTP response. Drivers deliberately do not build
22
+ * `Response`s themselves, so the 200/206/416 rules live in exactly one place.
23
+ */
24
+ export interface ReadResult {
25
+ /**
26
+ * Prefer a `Blob` (including a `BunFile`) over a `ReadableStream` whenever
27
+ * the driver holds a sized handle: Bun drops an explicitly set
28
+ * `Content-Length` and falls back to chunked encoding for any stream body,
29
+ * but keeps it for a sized blob.
30
+ */
31
+ body: ReadableStream<Uint8Array> | Blob | null;
32
+ /** Absolute inclusive offsets of `body` within the complete object. */
33
+ start: number;
34
+ end: number;
35
+ /** Authoritative size of the *complete* object, not of `body`. */
36
+ total: number;
37
+ /**
38
+ * Whether the driver actually applied the requested range.
39
+ *
40
+ * Not derivable from the offsets: `bytes=0-` over a whole object is a 206
41
+ * whose offsets span the entire file, while a driver that chose to ignore the
42
+ * range reports the very same offsets and wants a 200.
43
+ */
44
+ partial: boolean;
45
+ type: string;
46
+ etag?: string;
47
+ lastModified?: Date;
48
+ /** Used for `Content-Disposition`. */
49
+ name?: string;
10
50
  }
11
51
  export interface FileMetadata {
12
52
  width: number;
@@ -15,5 +55,10 @@ export interface FileMetadata {
15
55
  export interface IFileStorageDriver {
16
56
  fetch(input: ReadFileParams | string): Promise<Response>;
17
57
  put(params: PutFileParams | Blob): Promise<string>;
58
+ /**
59
+ * Optional: `FileStorageDriver` supplies a `fetch()`-backed default, so
60
+ * drivers written before this existed keep working.
61
+ */
62
+ read?(input: ReadFileParams | string): Promise<ReadResult>;
18
63
  }
19
64
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../services/file-storage/drivers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/C,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD;;;OAGG;IACH,IAAI,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5D"}
@@ -1,8 +1,11 @@
1
1
  export { FileStorageServiceProvider } from "./file-storage/FileStorageServiceProvider";
2
2
  export { FileSystemDriver } from "./file-storage/drivers/FileSystemDriver";
3
3
  export { S3Driver } from "./file-storage/drivers/S3Driver";
4
- export type { FileMetadata, PutFileParams, ReadFileParams } from "./file-storage/drivers/types";
4
+ export { AzureBlobDriver, type AzureBlobDriverConfig, } from "./file-storage/drivers/AzureBlobDriver";
5
+ export type { ByteRange, FileMetadata, PutFileParams, ReadFileParams, ReadResult, } from "./file-storage/drivers/types";
5
6
  export { FileStorageDriver } from "./file-storage/drivers/FileStorageDriver";
7
+ export { resolveRange, toRangeHeaderValue, parseContentRange } from "../http/range";
8
+ export { FileNotFoundError, RangeNotSatisfiableError } from "../http/errors";
6
9
  export { RateLimiterServiceProvider } from "./rate-limiter/RateLimiterServiceProvider";
7
10
  export { InMemoryRateLimiter } from "./rate-limiter/drivers/InMemoryRateLimiterDriver";
8
11
  export { RateLimiterDriver } from "./rate-limiter/drivers/RateLimiterDriver";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../services/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAG7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAI7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sDAAsD,CAAC;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,0CAA0C,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../services/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,cAAc,EACd,UAAU,GACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAI7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sDAAsD,CAAC;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,0CAA0C,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{Aa as o,Ba as p,Ca as q,Da as r,Ea as s,Fa as t,Ga as u,Ha as v,Ia as w,Ja as x,Ka as y,Ma as z,ma as a,na as b,oa as c,pa as d,qa as e,ra as f,sa as g,ta as h,ua as i,va as j,wa as k,xa as l,ya as m,za as n}from"../chunk-wa84ybnt.js";import"../chunk-qeq8hv3t.js";import"../chunk-522q81af.js";import"../chunk-syaxsp9y.js";import"../chunk-8cqkdzyh.js";import"../chunk-hzw2y2rz.js";import"../chunk-q0y425d3.js";import"../chunk-1kmbs8cd.js";import"../chunk-zaa3yt2w.js";import"../chunk-358x9aca.js";import"../chunk-pxcv9ccp.js";import"../chunk-qzemjynx.js";import"../chunk-shpca068.js";import"../chunk-b3qebxqh.js";import"../chunk-n1xpxhm0.js";import"../chunk-bfnh3gwv.js";import"../chunk-cwq1vdcb.js";export{v as XOAuthProvider,m as ViewRouterServiceProvider,z as Singleton,r as Sharp,e as S3Driver,j as ResendDriver,y as RedisServiceProvider,h as RateLimiterServiceProvider,f as RateLimiterDriver,o as QueueServiceProvider,t as OAuthProvider,n as LoggingServiceProvider,p as Job,g as InMemoryRateLimiter,s as ImageOptimizationServiceProvider,q as ImageOptimizationDriver,u as GoogleOAuthProvider,b as FileSystemDriver,c as FileStorageServiceProvider,a as FileStorageDriver,k as EmailServiceProvider,i as EmailDriver,w as CronServiceProvider,x as CronJob,l as BroadcastingServiceProvider,d as ApiRouterServiceProvider};
2
+ import{Aa as u,Ba as v,Ca as w,Da as x,Ea as y,Fa as z,Ga as A,Ha as B,Ia as C,Ja as D,Ka as E,Ma as F,la as f,ma as g,na as h,oa as i,pa as j,qa as k,ra as l,sa as m,ta as n,ua as o,va as p,wa as q,xa as r,ya as s,za as t}from"../chunk-25d4feyv.js";import"../chunk-knrx23te.js";import"../chunk-20376aj6.js";import"../chunk-ngnrytfh.js";import"../chunk-9s3te5pa.js";import"../chunk-qy3aczt9.js";import"../chunk-ytr22fm4.js";import"../chunk-kkdtznm5.js";import"../chunk-s49529x2.js";import"../chunk-5kx4hw7c.js";import"../chunk-nx8t65g3.js";import"../chunk-sdj112nj.js";import"../chunk-gv4v6qsg.js";import"../chunk-9r2k5ykk.js";import{Mb as a,Nb as b,Ob as c,Vb as d,Wb as e}from"../chunk-whj1a3vr.js";import"../chunk-sdx8r2qb.js";import"../chunk-6gtmkbh0.js";export{b as toRangeHeaderValue,a as resolveRange,c as parseContentRange,B as XOAuthProvider,s as ViewRouterServiceProvider,F as Singleton,x as Sharp,j as S3Driver,p as ResendDriver,E as RedisServiceProvider,n as RateLimiterServiceProvider,l as RateLimiterDriver,d as RangeNotSatisfiableError,u as QueueServiceProvider,z as OAuthProvider,t as LoggingServiceProvider,v as Job,m as InMemoryRateLimiter,y as ImageOptimizationServiceProvider,w as ImageOptimizationDriver,A as GoogleOAuthProvider,g as FileSystemDriver,h as FileStorageServiceProvider,f as FileStorageDriver,e as FileNotFoundError,q as EmailServiceProvider,o as EmailDriver,C as CronServiceProvider,D as CronJob,r as BroadcastingServiceProvider,k as AzureBlobDriver,i as ApiRouterServiceProvider};
3
3
 
4
- //# debugId=E4D0FCDFD54249E164756E2164756E21
4
+ //# debugId=1E7100BBAF44775764756E2164756E21
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "E4D0FCDFD54249E164756E2164756E21",
7
+ "debugId": "1E7100BBAF44775764756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -13,6 +13,11 @@ export declare class ApiRouterServiceContainer extends ServiceContainer {
13
13
  };
14
14
  runRouteMiddleware(path: string, httpRequest: HttpRequest): Promise<Response>;
15
15
  getRouteData(path: string): Promise<any>;
16
+ /**
17
+ * Copies request-context headers and cookies onto a Response a handler built
18
+ * itself, without disturbing what the handler already set.
19
+ */
20
+ private mergeContextIntoResponse;
16
21
  handleApiRequest(req: Request): Promise<Response>;
17
22
  }
18
23
  //# sourceMappingURL=ApiRouterServiceContainer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApiRouterServiceContainer.d.ts","sourceRoot":"","sources":["../../../services/router/ApiRouterServiceContainer.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,WAAW,EAAE,MAAM,YAAY,CAAC;AAOpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA4BhF,qBAAa,yBAA0B,SAAQ,gBAAgB;IAK1C,OAAO,EAAE,wBAAwB;IAJpD,MAAM,CAAC,KAAK,SAA+B;IAE3C,UAAU,EAAE,aAAa,CAAM;gBAEZ,OAAO,EAAE,wBAAwB;IAY7C,wBAAwB,CAAC,GAAG,EAAE,OAAO;;;;IAuBtC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAyBzD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA6BxC,gBAAgB,CAAC,GAAG,EAAE,OAAO;CAoDpC"}
1
+ {"version":3,"file":"ApiRouterServiceContainer.d.ts","sourceRoot":"","sources":["../../../services/router/ApiRouterServiceContainer.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,WAAW,EAAE,MAAM,YAAY,CAAC;AAOpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA4BhF,qBAAa,yBAA0B,SAAQ,gBAAgB;IAK1C,OAAO,EAAE,wBAAwB;IAJpD,MAAM,CAAC,KAAK,SAA+B;IAE3C,UAAU,EAAE,aAAa,CAAM;gBAEZ,OAAO,EAAE,wBAAwB;IAY7C,wBAAwB,CAAC,GAAG,EAAE,OAAO;;;;IAuBtC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAyBzD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B9C;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAoD1B,gBAAgB,CAAC,GAAG,EAAE,OAAO;CAkEpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createFlatApiRoutes.d.ts","sourceRoot":"","sources":["../../../services/router/createFlatApiRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EACL,KAAK,SAAS,EAMf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,KAAK,YAAY,GAAG,GAAG,CAAC;AACxB,MAAM,MAAM,aAAa,GAAG,MAAM,CAChC,MAAM,EACN,MAAM,CACJ,MAAM,EACN;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,UAAU,UAAU,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC;CACpE,CACF,CACF,CAAC;AAiCF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,QAAQ,SAAK,EACb,cAAc,GAAE,gBAAgB,EAAE,GAAG,MAAM,EAAO;;cAxCxC,YAAY;oBACN,CAAC,MAAM,GAAG,CAAC,UAAU,UAAU,CAAC,GAAG,gBAAgB,CAAC,EAAE;;EAmIvE"}
1
+ {"version":3,"file":"createFlatApiRoutes.d.ts","sourceRoot":"","sources":["../../../services/router/createFlatApiRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EACL,KAAK,SAAS,EAMf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,KAAK,YAAY,GAAG,GAAG,CAAC;AACxB,MAAM,MAAM,aAAa,GAAG,MAAM,CAChC,MAAM,EACN,MAAM,CACJ,MAAM,EACN;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,UAAU,UAAU,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC;CACpE,CACF,CACF,CAAC;AAwCF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,QAAQ,SAAK,EACb,cAAc,GAAE,gBAAgB,EAAE,GAAG,MAAM,EAAO;;cA/CxC,YAAY;oBACN,CAAC,MAAM,GAAG,CAAC,UAAU,UAAU,CAAC,GAAG,gBAAgB,CAAC,EAAE;;EA+IvE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gemi",
3
- "version": "0.42.2",
3
+ "version": "0.43.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "Enes Tufekci <enes@gemijs.dev>",
@@ -52,9 +52,15 @@
52
52
  "uuid": "^9.0.1"
53
53
  },
54
54
  "peerDependencies": {
55
+ "@azure/storage-blob": "^12.28.0",
55
56
  "react": ">=19",
56
57
  "react-dom": ">=19",
57
58
  "sharp": "^0.34.2",
58
59
  "vite": "^8.0.0"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "@azure/storage-blob": {
63
+ "optional": true
64
+ }
59
65
  }
60
66
  }
@@ -1,6 +0,0 @@
1
- // @bun
2
- import{m as O}from"./chunk-ppt296ye.js";import{createElement as j}from"react";function T(i,n){let t=Object.keys(n).sort((p,s)=>s.length-p.length).map((p)=>p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),e=new RegExp(t.join("|"),"g");return i.replace(e,(p)=>n[p])}async function Y(i,n,t=[]){let e=[...t.map((b)=>`${i}/views/${b}.tsx`),`${i}/views/RootLayout.tsx`],p=new Set;for(let b of e){let u=n.moduleGraph.getModulesByFile(b);if(u)for(let d of u)p.add(d)}let s=[],r=[],c={};for(let b of p)if(b)for(let u of b.importedModules){if(u.file.includes("module.css"))c[u.file]=u.ssrTransformResult.map.sourcesContent.join("");if(u.file.includes(".css"))r.push(u.file)}for(let b of r){let u=await n.transformRequest(b+"?direct"),d=b.includes("module.css"),h="";if(d)h=T(c[b],u.default);s.push({isDev:!0,id:b,content:d?h:u.code})}return s.map((b,u)=>{return j("style",{key:u,type:"text/css","data-vite-dev-id":b.id,dangerouslySetInnerHTML:{__html:b.content}})})}async function Z(i=[]){return i.map((n,t)=>{return j("style",{key:t,id:n?.id,type:"text/css",dangerouslySetInnerHTML:{__html:n.content}})})}import{existsSync as y}from"fs";import{basename as _}from"path";import{networkInterfaces as z}from"os";var v={name:"gemi",version:"0.42.2",private:!1,license:"MIT",author:"Enes Tufekci <enes@gemijs.dev>",repository:{type:"git",url:"git+https://github.com/nstfkc/gemi.git",directory:"packages/gemi"},bin:{gemi:"./dist/bin/gemi.js"},files:["dist/**/*"],module:!0,exports:{"./http":"./http/index.ts","./client":"./client/index.ts","./app":"./app/index.ts","./facades":"./facades/index.ts","./email":"./email/index.ts","./vite":"./dist/vite/index.mjs","./runtime":"./client/runtime.ts","./kernel":"./kernel/index.ts","./services":"./services/index.ts","./broadcasting":"./broadcasting/index.ts","./i18n":"./i18n/index.ts","./server":"./server/index.ts","./config":"./config/index.ts","./bun/preload":"./bun/preload.ts","./bun/plugin":"./bun/plugin.ts"},scripts:{lint:"oxlint",build:"NODE_ENV=production bun run build:core && bun run build:bin && bun run build:types && bun run build:client && bun run build:plugin && bun run build:client-types","build:core":"bun ./scripts/build.ts","build:bin":"bun build --outdir=./dist/bin --target=bun --external=vite --external=react-dom --external=react/jsx-runtime --external=bun --external=sharp --sourcemap ./bin/gemi.ts && bun ./scripts/prepare-bin.ts","build:client":"vite build -c vite.client.config.mts","build:plugin":"vite build -c vite.plugin.config.mts","build:types":"tsc","build:client-types":"tsc -p tsconfig.browser.json",test:"vitest","build:publish":"bun scripts/build-publish.ts",prepublishOnly:"echo 'Do not publish from this directory \u2014 its exports point at TS source. Run: bun run build:publish, then publish from .publish/' && exit 1"},dependencies:{"@aws-sdk/client-s3":"^3.629.0","@aws-sdk/s3-request-presigner":"^3.629.0","@prisma/client":"^6.4.1","ast-types":"^0.14.2",commander:"^12.1.0",history:"^5.3.0","jsx-email":"2.0.0-rc2.1",open:"^10.1.0","react-error-boundary":"^6.0.0",recast:"^0.23.9",resend:"^6.12.3",satori:"^0.12.2","temporal-polyfill":"^0.2.5","twitter-api-v2":"^1.20.2","urlpattern-polyfill":"^10.0.0",uuid:"^9.0.1"},devDependencies:{"@babel/parser":"^7.25.4","@repo/typescript-config":"*","@types/bun":"^1.3.14","@types/eslint":"^8.56.5","@types/node":"^20.11.24","@types/react":"^19.0.2","@types/react-dom":"^19.0.2",eslint:"^8.57.0",oxlint:"^1.39.0",react:"19.2.3","react-dom":"19.2.3",typescript:"^5.7.3",vitest:"^4.0.0"},peerDependencies:{react:">=19","react-dom":">=19",sharp:"^0.34.2",vite:"^8.0.0"}};var G=[" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2557","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551","\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2551","\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551","\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551"," \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D"],H=Boolean(process.stdout.isTTY)&&!process.env.NO_COLOR,l=(i,n)=>H?`\x1B[${i}m${n}\x1B[0m`:n,J=(i)=>l("1",i),g=(i)=>l("2",i),x=(i)=>l("36",i),L=(i)=>l("32",i),N=(i)=>l("35",i);function Q(){return v.version??"?"}function R(i){for(let n of Object.values(z()))for(let t of n??[])if((t.family==="IPv4"||t.family===4)&&!t.internal)return`http://${t.address}:${i}`;return null}function W(i){return O(i).filter((n)=>y(n)).map((n)=>_(n))}function K(i){let{port:n,rootDir:t}=i,e=`http://localhost:${n}`,p=R(n),s=W(t),r=(b,u)=>` ${L("\u279C")} ${J(b.padEnd(9))}${u}`,c=["",...G.map((b)=>N(b)),"",` ${g("gemi")} ${x(`v${Q()}`)}`,"",r("Local:",x(e)),r("Network:",p?x(p):g("unavailable")),r("Env:",s.length?s.join(", "):g("none")),""];console.log(c.join(`
3
- `))}
4
- export{Y as g,Z as h,K as i};
5
-
6
- //# debugId=F1970A538709A56E64756E2164756E21
@@ -1,5 +0,0 @@
1
- // @bun
2
- var l="GEMI_REQUEST_BREAKER_ERROR";class a extends Error{kind="GEMI_REQUEST_BREAKER_ERROR";payload={api:{},view:{}}}function R(r,t){return r.replace(/:([^/]+[*?]?)/g,(c,e)=>{let s=e.endsWith("?")||e.endsWith("*"),n=s?e.slice(0,-1):e,o=t[n];if(o===void 0){if(s)return"";if(import.meta.env.DEV)throw Error(`Missing parameter: ${n}`);console.error(`Missing parameter: ${n} in URL: ${r}`)}return String(o)}).replace(/\/\//g,"/").replace(/\/$/,"")}class i extends a{constructor(r,t=307){super("Redirect error");this.name="RedirectError",this.payload={api:{status:200,data:{},directive:{kind:"Redirect",path:r}},view:{status:t,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:r}}}}}class d{static to(r,...t){let[c={}]=t,{search:e={},params:s={},permanent:n,status:o}={params:{},status:307,permanent:!1,...c},p=new URLSearchParams(e).toString();throw new i([R(r,s),p.toString()].filter(Boolean).join("?"),o??(n?301:307))}static external(r,t=307){throw new i(r,t)}}class E{}
3
- export{l as Lb,a as Mb,R as Nb,d as Ob,E as Pb};
4
-
5
- //# debugId=F8DEA1094CF0281064756E2164756E21
@@ -1,13 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../http/Error.ts", "../utils/applyParams.ts", "../facades/Redirect.ts", "../services/ServiceProvider.ts"],
4
- "sourcesContent": [
5
- "export const GEMI_REQUEST_BREAKER_ERROR = \"GEMI_REQUEST_BREAKER_ERROR\";\n\nexport class RequestBreakerError extends Error {\n public kind = GEMI_REQUEST_BREAKER_ERROR;\n public payload: {\n api: Record<string, any>;\n view: Record<string, any>;\n } = { api: {}, view: {} };\n}\n",
6
- "export function applyParams<T extends string>(\n url: T,\n params: Record<string, string | number | undefined>,\n): string {\n return (\n url\n .replace(/:([^/]+[*?]?)/g, (_, key) => {\n const hasSuffix = key.endsWith(\"?\") || key.endsWith(\"*\");\n const paramName = hasSuffix ? key.slice(0, -1) : key;\n const value = params[paramName];\n\n if (value === undefined) {\n if (hasSuffix) {\n return \"\"; // Remove the optional segment if no value is provided\n }\n // @ts-ignore\n if (import.meta.env.DEV) {\n throw new Error(`Missing parameter: ${paramName}`);\n }\n console.error(`Missing parameter: ${paramName} in URL: ${url}`);\n }\n\n return String(value);\n })\n // remove double slashes\n .replace(/\\/\\//g, \"/\")\n // remove trailing slash\n .replace(/\\/$/, \"\")\n );\n}\n",
7
- "import type { UrlParser, ViewPaths } from \"../client/types\";\nimport { RequestBreakerError } from \"../http/Error\";\nimport { applyParams } from \"../utils/applyParams\";\n\nclass RedirectError extends RequestBreakerError {\n constructor(path: string, status = 307) {\n super(\"Redirect error\");\n this.name = \"RedirectError\";\n this.payload = {\n api: {\n status: 200,\n data: {},\n directive: { kind: \"Redirect\", path },\n },\n view: {\n status,\n headers: {\n \"Cache-Control\":\n \"private, no-cache, no-store, max-age=0, must-revalidate\",\n Location: path,\n },\n },\n };\n }\n}\n\ntype Options<T extends ViewPaths> = UrlParser<T> extends Record<string, never>\n ? {\n search?: Record<string, string | number | boolean | undefined | null>;\n status?: number;\n permanent?: boolean;\n }\n : {\n search?: Record<string, string | number | boolean | undefined | null>;\n params: UrlParser<T>;\n status?: number;\n permanent?: boolean;\n };\n\nexport class Redirect {\n static to<T extends ViewPaths>(\n path: T,\n ...args: UrlParser<T> extends Record<string, never>\n ? [options?: Options<T>]\n : [options: Options<T>]\n ) {\n const [options = {}] = args;\n const {\n search = {},\n params = {},\n permanent,\n status,\n } = {\n params: {},\n status: 307,\n permanent: false,\n ...options,\n };\n const searchParams = new URLSearchParams(search).toString();\n throw new RedirectError(\n [applyParams(path, params), searchParams.toString()]\n .filter(Boolean)\n .join(\"?\"),\n status ?? (permanent ? 301 : 307),\n );\n }\n\n static external(url: string, status = 307) {\n throw new RedirectError(url, status);\n }\n}\n",
8
- "export abstract class ServiceProvider {\n abstract boot(...p: any[]): Promise<any> | any;\n}\n"
9
- ],
10
- "mappings": ";AAAO,IAAM,EAA6B,6BAEnC,MAAM,UAA4B,KAAM,CACtC,KAHiC,6BAIjC,QAGH,CAAE,IAAK,CAAC,EAAG,KAAM,CAAC,CAAE,CAC1B,CCRO,SAAS,CAA6B,CAC3C,EACA,EACQ,CACR,OACE,EACG,QAAQ,iBAAkB,CAAC,EAAG,IAAQ,CACrC,IAAM,EAAY,EAAI,SAAS,GAAG,GAAK,EAAI,SAAS,GAAG,EACjD,EAAY,EAAY,EAAI,MAAM,EAAG,EAAE,EAAI,EAC3C,EAAQ,EAAO,GAErB,GAAI,IAAU,OAAW,CACvB,GAAI,EACF,MAAO,GAGT,GAAI,YAAY,IAAI,IAClB,MAAU,MAAM,sBAAsB,GAAW,EAEnD,QAAQ,MAAM,sBAAsB,aAAqB,GAAK,EAGhE,OAAO,OAAO,CAAK,EACpB,EAEA,QAAQ,QAAS,GAAG,EAEpB,QAAQ,MAAO,EAAE,ECvBxB,MAAM,UAAsB,CAAoB,CAC9C,WAAW,CAAC,EAAc,EAAS,IAAK,CACtC,MAAM,gBAAgB,EACtB,KAAK,KAAO,gBACZ,KAAK,QAAU,CACb,IAAK,CACH,OAAQ,IACR,KAAM,CAAC,EACP,UAAW,CAAE,KAAM,WAAY,MAAK,CACtC,EACA,KAAM,CACJ,SACA,QAAS,CACP,gBACE,0DACF,SAAU,CACZ,CACF,CACF,EAEJ,CAeO,MAAM,CAAS,OACb,GAAuB,CAC5B,KACG,EAGH,CACA,IAAO,EAAU,CAAC,GAAK,GAErB,SAAS,CAAC,EACV,SAAS,CAAC,EACV,YACA,UACE,CACF,OAAQ,CAAC,EACT,OAAQ,IACR,UAAW,MACR,CACL,EACM,EAAe,IAAI,gBAAgB,CAAM,EAAE,SAAS,EAC1D,MAAM,IAAI,EACR,CAAC,EAAY,EAAM,CAAM,EAAG,EAAa,SAAS,CAAC,EAChD,OAAO,OAAO,EACd,KAAK,GAAG,EACX,IAAW,EAAY,IAAM,IAC/B,QAGK,SAAQ,CAAC,EAAa,EAAS,IAAK,CACzC,MAAM,IAAI,EAAc,EAAK,CAAM,EAEvC,CCtEO,MAAe,CAAgB,CAEtC",
11
- "debugId": "F8DEA1094CF0281064756E2164756E21",
12
- "names": []
13
- }