@breadstone-infrastructure/prisma-seeds 0.0.231

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 (252) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +284 -0
  4. package/ai/AISeedGenerator.d.ts +127 -0
  5. package/ai/AISeedGenerator.d.ts.map +1 -0
  6. package/ai/AISeedGenerator.js +438 -0
  7. package/ai/AISeedGenerator.js.map +1 -0
  8. package/ai/AISeedTypes.d.ts +138 -0
  9. package/ai/AISeedTypes.d.ts.map +1 -0
  10. package/ai/AISeedTypes.js +3 -0
  11. package/ai/AISeedTypes.js.map +1 -0
  12. package/ai/PrismaModelAnalyzer.d.ts +36 -0
  13. package/ai/PrismaModelAnalyzer.d.ts.map +1 -0
  14. package/ai/PrismaModelAnalyzer.js +110 -0
  15. package/ai/PrismaModelAnalyzer.js.map +1 -0
  16. package/ai/PrismaTypeSchemaGenerator.d.ts +38 -0
  17. package/ai/PrismaTypeSchemaGenerator.d.ts.map +1 -0
  18. package/ai/PrismaTypeSchemaGenerator.js +71 -0
  19. package/ai/PrismaTypeSchemaGenerator.js.map +1 -0
  20. package/ai/createAISeeder.d.ts +11 -0
  21. package/ai/createAISeeder.d.ts.map +1 -0
  22. package/ai/createAISeeder.js +72 -0
  23. package/ai/createAISeeder.js.map +1 -0
  24. package/ai/index.d.ts +6 -0
  25. package/ai/index.d.ts.map +1 -0
  26. package/ai/index.js +5 -0
  27. package/ai/index.js.map +1 -0
  28. package/assets/AssetManager.d.ts +213 -0
  29. package/assets/AssetManager.d.ts.map +1 -0
  30. package/assets/AssetManager.js +460 -0
  31. package/assets/AssetManager.js.map +1 -0
  32. package/assets/IImageTransformOptions.d.ts +42 -0
  33. package/assets/IImageTransformOptions.d.ts.map +1 -0
  34. package/assets/IImageTransformOptions.js +22 -0
  35. package/assets/IImageTransformOptions.js.map +1 -0
  36. package/assets/adapters/BlobAdapterFactory.d.ts +21 -0
  37. package/assets/adapters/BlobAdapterFactory.d.ts.map +1 -0
  38. package/assets/adapters/BlobAdapterFactory.js +3 -0
  39. package/assets/adapters/BlobAdapterFactory.js.map +1 -0
  40. package/assets/adapters/CloudflareR2BlobAdapter.d.ts +97 -0
  41. package/assets/adapters/CloudflareR2BlobAdapter.d.ts.map +1 -0
  42. package/assets/adapters/CloudflareR2BlobAdapter.js +265 -0
  43. package/assets/adapters/CloudflareR2BlobAdapter.js.map +1 -0
  44. package/assets/adapters/EmptyBlobAdapter.d.ts +42 -0
  45. package/assets/adapters/EmptyBlobAdapter.d.ts.map +1 -0
  46. package/assets/adapters/EmptyBlobAdapter.js +65 -0
  47. package/assets/adapters/EmptyBlobAdapter.js.map +1 -0
  48. package/assets/adapters/LocalFileAdapter.d.ts +34 -0
  49. package/assets/adapters/LocalFileAdapter.d.ts.map +1 -0
  50. package/assets/adapters/LocalFileAdapter.js +74 -0
  51. package/assets/adapters/LocalFileAdapter.js.map +1 -0
  52. package/assets/adapters/VercelBlobAdapter.d.ts +73 -0
  53. package/assets/adapters/VercelBlobAdapter.d.ts.map +1 -0
  54. package/assets/adapters/VercelBlobAdapter.js +168 -0
  55. package/assets/adapters/VercelBlobAdapter.js.map +1 -0
  56. package/assets/adapters/abstracts/BlobAdapterBase.d.ts +62 -0
  57. package/assets/adapters/abstracts/BlobAdapterBase.d.ts.map +1 -0
  58. package/assets/adapters/abstracts/BlobAdapterBase.js +58 -0
  59. package/assets/adapters/abstracts/BlobAdapterBase.js.map +1 -0
  60. package/assets/adapters/abstracts/HttpBlobAdapterBase.d.ts +43 -0
  61. package/assets/adapters/abstracts/HttpBlobAdapterBase.d.ts.map +1 -0
  62. package/assets/adapters/abstracts/HttpBlobAdapterBase.js +88 -0
  63. package/assets/adapters/abstracts/HttpBlobAdapterBase.js.map +1 -0
  64. package/assets/adapters/createBlobAdapter.d.ts +47 -0
  65. package/assets/adapters/createBlobAdapter.d.ts.map +1 -0
  66. package/assets/adapters/createBlobAdapter.js +63 -0
  67. package/assets/adapters/createBlobAdapter.js.map +1 -0
  68. package/assets/adapters/index.d.ts +11 -0
  69. package/assets/adapters/index.d.ts.map +1 -0
  70. package/assets/adapters/index.js +7 -0
  71. package/assets/adapters/index.js.map +1 -0
  72. package/assets/adapters/interfaces/IBlobAdapter.d.ts +41 -0
  73. package/assets/adapters/interfaces/IBlobAdapter.d.ts.map +1 -0
  74. package/assets/adapters/interfaces/IBlobAdapter.js +3 -0
  75. package/assets/adapters/interfaces/IBlobAdapter.js.map +1 -0
  76. package/assets/adapters/interfaces/IBlobAdapterConfig.d.ts +16 -0
  77. package/assets/adapters/interfaces/IBlobAdapterConfig.d.ts.map +1 -0
  78. package/assets/adapters/interfaces/IBlobAdapterConfig.js +2 -0
  79. package/assets/adapters/interfaces/IBlobAdapterConfig.js.map +1 -0
  80. package/assets/adapters/interfaces/IBlobUploadResult.d.ts +24 -0
  81. package/assets/adapters/interfaces/IBlobUploadResult.d.ts.map +1 -0
  82. package/assets/adapters/interfaces/IBlobUploadResult.js +2 -0
  83. package/assets/adapters/interfaces/IBlobUploadResult.js.map +1 -0
  84. package/base/BaseSeeder.d.ts +21 -0
  85. package/base/BaseSeeder.d.ts.map +1 -0
  86. package/base/BaseSeeder.js +45 -0
  87. package/base/BaseSeeder.js.map +1 -0
  88. package/base/functionalSeeder.d.ts +31 -0
  89. package/base/functionalSeeder.d.ts.map +1 -0
  90. package/base/functionalSeeder.js +33 -0
  91. package/base/functionalSeeder.js.map +1 -0
  92. package/cli/Cli.d.ts +2 -0
  93. package/cli/Cli.d.ts.map +1 -0
  94. package/cli/Cli.js +32 -0
  95. package/cli/Cli.js.map +1 -0
  96. package/cli/CliArgs.d.ts +2 -0
  97. package/cli/CliArgs.d.ts.map +1 -0
  98. package/cli/CliArgs.js +133 -0
  99. package/cli/CliArgs.js.map +1 -0
  100. package/cli/CliArgsConfig.d.ts +2 -0
  101. package/cli/CliArgsConfig.d.ts.map +1 -0
  102. package/cli/CliArgsConfig.js +15 -0
  103. package/cli/CliArgsConfig.js.map +1 -0
  104. package/cli/CliRun.d.ts +2 -0
  105. package/cli/CliRun.d.ts.map +1 -0
  106. package/cli/CliRun.js +34 -0
  107. package/cli/CliRun.js.map +1 -0
  108. package/cli/commands/SeedCommand.d.ts +2 -0
  109. package/cli/commands/SeedCommand.d.ts.map +1 -0
  110. package/cli/commands/SeedCommand.js +73 -0
  111. package/cli/commands/SeedCommand.js.map +1 -0
  112. package/cli/commands/SeedCommandArgsConfig.d.ts +2 -0
  113. package/cli/commands/SeedCommandArgsConfig.d.ts.map +1 -0
  114. package/cli/commands/SeedCommandArgsConfig.js +31 -0
  115. package/cli/commands/SeedCommandArgsConfig.js.map +1 -0
  116. package/cli/seed.d.ts +2 -0
  117. package/cli/seed.d.ts.map +1 -0
  118. package/cli/seed.js +42 -0
  119. package/cli/seed.js.map +1 -0
  120. package/config/IAssetConfig.d.ts +36 -0
  121. package/config/IAssetConfig.d.ts.map +1 -0
  122. package/config/IAssetConfig.js +3 -0
  123. package/config/IAssetConfig.js.map +1 -0
  124. package/config/IComposedSeedConfig.d.ts +32 -0
  125. package/config/IComposedSeedConfig.d.ts.map +1 -0
  126. package/config/IComposedSeedConfig.js +3 -0
  127. package/config/IComposedSeedConfig.js.map +1 -0
  128. package/config/ISeedConfig.d.ts +75 -0
  129. package/config/ISeedConfig.d.ts.map +1 -0
  130. package/config/ISeedConfig.js +3 -0
  131. package/config/ISeedConfig.js.map +1 -0
  132. package/config/ISeedContext.d.ts +92 -0
  133. package/config/ISeedContext.d.ts.map +1 -0
  134. package/config/ISeedContext.js +3 -0
  135. package/config/ISeedContext.js.map +1 -0
  136. package/config/ISeedDefinition.d.ts +38 -0
  137. package/config/ISeedDefinition.d.ts.map +1 -0
  138. package/config/ISeedDefinition.js +3 -0
  139. package/config/ISeedDefinition.js.map +1 -0
  140. package/config/ISeedFactory.d.ts +15 -0
  141. package/config/ISeedFactory.d.ts.map +1 -0
  142. package/config/ISeedFactory.js +3 -0
  143. package/config/ISeedFactory.js.map +1 -0
  144. package/config/ISeedOptions.d.ts +44 -0
  145. package/config/ISeedOptions.d.ts.map +1 -0
  146. package/config/ISeedOptions.js +2 -0
  147. package/config/ISeedOptions.js.map +1 -0
  148. package/config/ISeedResult.d.ts +44 -0
  149. package/config/ISeedResult.d.ts.map +1 -0
  150. package/config/ISeedResult.js +2 -0
  151. package/config/ISeedResult.js.map +1 -0
  152. package/config/ISeeder.d.ts +37 -0
  153. package/config/ISeeder.d.ts.map +1 -0
  154. package/config/ISeeder.js +3 -0
  155. package/config/ISeeder.js.map +1 -0
  156. package/config/createAdapter.d.ts +13 -0
  157. package/config/createAdapter.d.ts.map +1 -0
  158. package/config/createAdapter.js +16 -0
  159. package/config/createAdapter.js.map +1 -0
  160. package/config/createSeed.d.ts +6 -0
  161. package/config/createSeed.d.ts.map +1 -0
  162. package/config/createSeed.js +16 -0
  163. package/config/createSeed.js.map +1 -0
  164. package/config/defineConfig.d.ts +27 -0
  165. package/config/defineConfig.d.ts.map +1 -0
  166. package/config/defineConfig.js +35 -0
  167. package/config/defineConfig.js.map +1 -0
  168. package/discovery/SeedConfigDiscovery.d.ts +16 -0
  169. package/discovery/SeedConfigDiscovery.d.ts.map +1 -0
  170. package/discovery/SeedConfigDiscovery.js +137 -0
  171. package/discovery/SeedConfigDiscovery.js.map +1 -0
  172. package/index.d.ts +32 -0
  173. package/index.d.ts.map +1 -0
  174. package/index.js +32 -0
  175. package/index.js.map +1 -0
  176. package/json/JsonReferenceResolver.d.ts +23 -0
  177. package/json/JsonReferenceResolver.d.ts.map +1 -0
  178. package/json/JsonReferenceResolver.js +99 -0
  179. package/json/JsonReferenceResolver.js.map +1 -0
  180. package/json/JsonSchemaValidator.d.ts +23 -0
  181. package/json/JsonSchemaValidator.d.ts.map +1 -0
  182. package/json/JsonSchemaValidator.js +98 -0
  183. package/json/JsonSchemaValidator.js.map +1 -0
  184. package/json/JsonSeedLoader.d.ts +33 -0
  185. package/json/JsonSeedLoader.d.ts.map +1 -0
  186. package/json/JsonSeedLoader.js +176 -0
  187. package/json/JsonSeedLoader.js.map +1 -0
  188. package/json/JsonSeedTypes.d.ts +204 -0
  189. package/json/JsonSeedTypes.d.ts.map +1 -0
  190. package/json/JsonSeedTypes.js +3 -0
  191. package/json/JsonSeedTypes.js.map +1 -0
  192. package/json/createJsonSeeder.d.ts +13 -0
  193. package/json/createJsonSeeder.d.ts.map +1 -0
  194. package/json/createJsonSeeder.js +240 -0
  195. package/json/createJsonSeeder.js.map +1 -0
  196. package/json/index.d.ts +6 -0
  197. package/json/index.d.ts.map +1 -0
  198. package/json/index.js +7 -0
  199. package/json/index.js.map +1 -0
  200. package/logging/ISeedLogger.d.ts +55 -0
  201. package/logging/ISeedLogger.d.ts.map +1 -0
  202. package/logging/ISeedLogger.js +3 -0
  203. package/logging/ISeedLogger.js.map +1 -0
  204. package/logging/LogLevel.d.ts +30 -0
  205. package/logging/LogLevel.d.ts.map +1 -0
  206. package/logging/LogLevel.js +37 -0
  207. package/logging/LogLevel.js.map +1 -0
  208. package/logging/SeedLogger.d.ts +24 -0
  209. package/logging/SeedLogger.d.ts.map +1 -0
  210. package/logging/SeedLogger.js +94 -0
  211. package/logging/SeedLogger.js.map +1 -0
  212. package/orchestration/SeedOrchestrator.d.ts +30 -0
  213. package/orchestration/SeedOrchestrator.d.ts.map +1 -0
  214. package/orchestration/SeedOrchestrator.js +262 -0
  215. package/orchestration/SeedOrchestrator.js.map +1 -0
  216. package/package.json +27 -0
  217. package/resolvers/EntityResolver.d.ts +43 -0
  218. package/resolvers/EntityResolver.d.ts.map +1 -0
  219. package/resolvers/EntityResolver.js +95 -0
  220. package/resolvers/EntityResolver.js.map +1 -0
  221. package/utils/AssetReferenceResolver.d.ts +49 -0
  222. package/utils/AssetReferenceResolver.d.ts.map +1 -0
  223. package/utils/AssetReferenceResolver.js +62 -0
  224. package/utils/AssetReferenceResolver.js.map +1 -0
  225. package/utils/EntityLookupCache.d.ts +47 -0
  226. package/utils/EntityLookupCache.d.ts.map +1 -0
  227. package/utils/EntityLookupCache.js +64 -0
  228. package/utils/EntityLookupCache.js.map +1 -0
  229. package/utils/ISeedRandom.d.ts +70 -0
  230. package/utils/ISeedRandom.d.ts.map +1 -0
  231. package/utils/ISeedRandom.js +3 -0
  232. package/utils/ISeedRandom.js.map +1 -0
  233. package/utils/LocalizationToolkit.d.ts +125 -0
  234. package/utils/LocalizationToolkit.d.ts.map +1 -0
  235. package/utils/LocalizationToolkit.js +131 -0
  236. package/utils/LocalizationToolkit.js.map +1 -0
  237. package/utils/SeededRandom.d.ts +15 -0
  238. package/utils/SeededRandom.d.ts.map +1 -0
  239. package/utils/SeededRandom.js +56 -0
  240. package/utils/SeededRandom.js.map +1 -0
  241. package/utils/StringArrayToolkit.d.ts +25 -0
  242. package/utils/StringArrayToolkit.d.ts.map +1 -0
  243. package/utils/StringArrayToolkit.js +56 -0
  244. package/utils/StringArrayToolkit.js.map +1 -0
  245. package/utils/StringValueGuard.d.ts +24 -0
  246. package/utils/StringValueGuard.d.ts.map +1 -0
  247. package/utils/StringValueGuard.js +46 -0
  248. package/utils/StringValueGuard.js.map +1 -0
  249. package/utils/WarningCollector.d.ts +40 -0
  250. package/utils/WarningCollector.d.ts.map +1 -0
  251. package/utils/WarningCollector.js +83 -0
  252. package/utils/WarningCollector.js.map +1 -0
@@ -0,0 +1,97 @@
1
+ import { HttpBlobAdapterBase } from './abstracts/HttpBlobAdapterBase.js';
2
+ import type { IBlobAdapter } from './interfaces/IBlobAdapter.js';
3
+ import type { IBlobAdapterConfig } from './interfaces/IBlobAdapterConfig.js';
4
+ import type { IBlobUploadResult } from './interfaces/IBlobUploadResult.js';
5
+ export interface ICloudflareR2AdapterConfig extends IBlobAdapterConfig {
6
+ /**
7
+ * Cloudflare account identifier used for the API endpoint hostname.
8
+ */
9
+ accountId: string;
10
+ /**
11
+ * Cloudflare R2 access key identifier.
12
+ */
13
+ accessKeyId: string;
14
+ /**
15
+ * Cloudflare R2 secret access key.
16
+ */
17
+ secretAccessKey: string;
18
+ /**
19
+ * Name of the R2 bucket to target.
20
+ */
21
+ bucketName: string;
22
+ /**
23
+ * Optional region override. Defaults to `auto` which is recommended for R2.
24
+ */
25
+ region?: string;
26
+ /**
27
+ * Optional publicly reachable base URL for accessing uploaded blobs.
28
+ * When omitted the adapter derives a default R2 endpoint URL.
29
+ */
30
+ publicBaseUrl?: string;
31
+ }
32
+ /**
33
+ * Blob adapter implementation backed by Cloudflare R2 using signed HTTP requests.
34
+ *
35
+ * @public
36
+ */
37
+ export declare class CloudflareR2BlobAdapter extends HttpBlobAdapterBase<ICloudflareR2AdapterConfig> implements IBlobAdapter {
38
+ private readonly _http;
39
+ private readonly _host;
40
+ /**
41
+ * Creates a new Cloudflare R2 blob adapter instance.
42
+ *
43
+ * @param config Adapter configuration values.
44
+ */
45
+ constructor(config: ICloudflareR2AdapterConfig);
46
+ /**
47
+ * Gets the adapter name identifier.
48
+ */
49
+ get name(): string;
50
+ /**
51
+ * Uploads a blob to Cloudflare R2.
52
+ *
53
+ * @param key File key relative to the configured prefix.
54
+ * @param buffer File contents.
55
+ * @param mimeType MIME type of the uploaded content.
56
+ * @returns Upload metadata including the public URL.
57
+ */
58
+ upload(key: string, buffer: Buffer, mimeType: string): Promise<IBlobUploadResult>;
59
+ /**
60
+ * Resolves the public URL for a stored blob.
61
+ *
62
+ * @param key File key relative to the configured prefix.
63
+ * @returns The publicly accessible URL.
64
+ */
65
+ getPublicUrl(key: string): Promise<string>;
66
+ /**
67
+ * Checks whether a blob exists in the configured bucket.
68
+ *
69
+ * @param key File key relative to the configured prefix.
70
+ * @returns True when the blob exists; otherwise false.
71
+ */
72
+ exists(key: string): Promise<boolean>;
73
+ /**
74
+ * Deletes a blob from Cloudflare R2.
75
+ *
76
+ * @param key File key relative to the configured prefix.
77
+ */
78
+ delete(key: string): Promise<void>;
79
+ private buildPublicUrl;
80
+ private performRequest;
81
+ private normalizeHeaderNames;
82
+ private buildCanonicalRequest;
83
+ private buildCanonicalHeaders;
84
+ private getSignedHeaders;
85
+ private canonicalizePath;
86
+ private buildStringToSign;
87
+ private credentialScope;
88
+ private calculateSignature;
89
+ private hashHex;
90
+ private hmacBuffer;
91
+ private hmacHex;
92
+ private formatAmzDate;
93
+ private formatDate;
94
+ private pad;
95
+ private validateConfig;
96
+ }
97
+ //# sourceMappingURL=CloudflareR2BlobAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareR2BlobAdapter.d.ts","sourceRoot":"","sources":["../../../src/assets/adapters/CloudflareR2BlobAdapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,oCAAoC,CAAC;AAC1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAM3E,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IAElE;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,mBAAmB,CAAC,0BAA0B,CAAE,YAAW,YAAY;IAIhH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAM/B;;;;OAIG;gBACgB,MAAM,EAAE,0BAA0B;IAyBrD;;OAEG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAMD;;;;;;;OAOG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmB9F;;;;;OAKG;IACU,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASvD;;;;;OAKG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAalD;;;;OAIG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/C,OAAO,CAAC,cAAc;YAWR,cAAc;IAwC5B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,cAAc;CAiBzB"}
@@ -0,0 +1,265 @@
1
+ // #region Imports
2
+ import axios from 'axios';
3
+ import { createHash, createHmac } from 'node:crypto';
4
+ import { HttpBlobAdapterBase, HttpStatusError } from './abstracts/HttpBlobAdapterBase.js';
5
+ // #endregion
6
+ /**
7
+ * Blob adapter implementation backed by Cloudflare R2 using signed HTTP requests.
8
+ *
9
+ * @public
10
+ */
11
+ export class CloudflareR2BlobAdapter extends HttpBlobAdapterBase {
12
+ // #region Fields
13
+ _http;
14
+ _host;
15
+ // #endregion
16
+ // #region Ctor
17
+ /**
18
+ * Creates a new Cloudflare R2 blob adapter instance.
19
+ *
20
+ * @param config Adapter configuration values.
21
+ */
22
+ constructor(config) {
23
+ if (!config) {
24
+ throw new Error('Cloudflare R2 configuration is required.');
25
+ }
26
+ const resolvedConfig = {
27
+ ...config,
28
+ region: config.region ?? 'auto'
29
+ };
30
+ super(resolvedConfig);
31
+ this.validateConfig(resolvedConfig);
32
+ this._host = `${resolvedConfig.accountId}.r2.cloudflarestorage.com`;
33
+ this._http = axios.create({
34
+ baseURL: `https://${this._host}`,
35
+ maxBodyLength: Infinity,
36
+ validateStatus: () => true
37
+ });
38
+ }
39
+ // #endregion
40
+ // #region Properties
41
+ /**
42
+ * Gets the adapter name identifier.
43
+ */
44
+ get name() {
45
+ return 'cloudflare-r2';
46
+ }
47
+ // #endregion
48
+ // #region Methods
49
+ /**
50
+ * Uploads a blob to Cloudflare R2.
51
+ *
52
+ * @param key File key relative to the configured prefix.
53
+ * @param buffer File contents.
54
+ * @param mimeType MIME type of the uploaded content.
55
+ * @returns Upload metadata including the public URL.
56
+ */
57
+ async upload(key, buffer, mimeType) {
58
+ const fullKey = this.resolveKey(key);
59
+ const headers = {
60
+ 'content-type': mimeType,
61
+ 'content-length': String(buffer.byteLength)
62
+ };
63
+ await this.performRequest('PUT', fullKey, buffer, headers);
64
+ return {
65
+ key: fullKey,
66
+ url: this.buildPublicUrl(fullKey),
67
+ size: buffer.byteLength,
68
+ metadata: {
69
+ contentType: mimeType
70
+ }
71
+ };
72
+ }
73
+ /**
74
+ * Resolves the public URL for a stored blob.
75
+ *
76
+ * @param key File key relative to the configured prefix.
77
+ * @returns The publicly accessible URL.
78
+ */
79
+ async getPublicUrl(key) {
80
+ const fullKey = this.resolveKey(key);
81
+ const exists = await this.exists(key);
82
+ if (!exists) {
83
+ throw new Error(`Blob not found for key: ${fullKey}`);
84
+ }
85
+ return this.buildPublicUrl(fullKey);
86
+ }
87
+ /**
88
+ * Checks whether a blob exists in the configured bucket.
89
+ *
90
+ * @param key File key relative to the configured prefix.
91
+ * @returns True when the blob exists; otherwise false.
92
+ */
93
+ async exists(key) {
94
+ const fullKey = this.resolveKey(key);
95
+ try {
96
+ const response = await this.performRequest('HEAD', fullKey);
97
+ return response.status === 200;
98
+ }
99
+ catch (error) {
100
+ if (this.isNotFoundError(error)) {
101
+ return false;
102
+ }
103
+ throw this.toError(error, `Failed to check existence of Cloudflare R2 object: ${fullKey}`);
104
+ }
105
+ }
106
+ /**
107
+ * Deletes a blob from Cloudflare R2.
108
+ *
109
+ * @param key File key relative to the configured prefix.
110
+ */
111
+ async delete(key) {
112
+ const fullKey = this.resolveKey(key);
113
+ try {
114
+ await this.performRequest('DELETE', fullKey);
115
+ }
116
+ catch (error) {
117
+ if (this.isNotFoundError(error)) {
118
+ return;
119
+ }
120
+ throw this.toError(error, `Failed to delete Cloudflare R2 object: ${fullKey}`);
121
+ }
122
+ }
123
+ // #endregion
124
+ // #region Private Methods
125
+ buildPublicUrl(key) {
126
+ const config = this.config;
127
+ const encodedKey = this.encodeKey(key);
128
+ if (config.publicBaseUrl) {
129
+ return `${config.publicBaseUrl.replace(/\/$/, '')}/${encodedKey}`;
130
+ }
131
+ return `https://${config.accountId}.r2.cloudflarestorage.com/${config.bucketName}/${encodedKey}`;
132
+ }
133
+ async performRequest(method, key, body, headers = {}) {
134
+ const config = this.config;
135
+ const path = `/${config.bucketName}/${this.encodeKey(key)}`;
136
+ const now = new Date();
137
+ const payload = body ?? Buffer.alloc(0);
138
+ const hashedPayload = this.hashHex(payload);
139
+ const requestHeaders = {
140
+ 'host': this._host,
141
+ 'x-amz-content-sha256': hashedPayload,
142
+ 'x-amz-date': this.formatAmzDate(now),
143
+ ...this.normalizeHeaderNames(headers)
144
+ };
145
+ const canonicalRequest = this.buildCanonicalRequest(method, path, requestHeaders, hashedPayload);
146
+ const stringToSign = this.buildStringToSign(now, canonicalRequest);
147
+ const signature = this.calculateSignature(now, stringToSign);
148
+ const signedHeaders = this.getSignedHeaders(requestHeaders);
149
+ const authorization = `AWS4-HMAC-SHA256 Credential=${config.accessKeyId}/${this.credentialScope(now)}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
150
+ const signedRequestHeaders = {
151
+ ...requestHeaders,
152
+ Authorization: authorization
153
+ };
154
+ const response = await this._http.request({
155
+ method: method,
156
+ url: path,
157
+ headers: signedRequestHeaders,
158
+ data: method === 'PUT' ? payload : undefined,
159
+ responseType: 'text'
160
+ });
161
+ if (response.status < 200 || response.status >= 300) {
162
+ const responseText = typeof response.data === 'string' ? response.data : JSON.stringify(response.data ?? {});
163
+ throw new HttpStatusError(response.status, `Cloudflare R2 request failed for ${method} ${path}`, responseText);
164
+ }
165
+ return response;
166
+ }
167
+ normalizeHeaderNames(headers) {
168
+ const normalized = {};
169
+ for (const [key, value] of Object.entries(headers)) {
170
+ normalized[key.toLowerCase()] = value;
171
+ }
172
+ return normalized;
173
+ }
174
+ buildCanonicalRequest(method, path, headers, hashedPayload) {
175
+ const canonicalHeaders = this.buildCanonicalHeaders(headers);
176
+ const signedHeaders = this.getSignedHeaders(headers);
177
+ const canonicalPath = this.canonicalizePath(path);
178
+ return [
179
+ method,
180
+ canonicalPath,
181
+ '',
182
+ canonicalHeaders,
183
+ '',
184
+ signedHeaders,
185
+ hashedPayload
186
+ ].join('\n');
187
+ }
188
+ buildCanonicalHeaders(headers) {
189
+ const sortedKeys = Object.keys(headers).sort();
190
+ return `${sortedKeys.map((key) => `${key}:${headers[key].trim()}`).join('\n')}\n`;
191
+ }
192
+ getSignedHeaders(headers) {
193
+ return Object.keys(headers).sort()
194
+ .join(';');
195
+ }
196
+ canonicalizePath(path) {
197
+ return path.split('/')
198
+ .map((segment) => encodeURIComponent(decodeURIComponent(segment)))
199
+ .join('/');
200
+ }
201
+ buildStringToSign(now, canonicalRequest) {
202
+ const amzDate = this.formatAmzDate(now);
203
+ const scope = this.credentialScope(now);
204
+ const hashedCanonicalRequest = this.hashHex(Buffer.from(canonicalRequest, 'utf-8'));
205
+ return `AWS4-HMAC-SHA256\n${amzDate}\n${scope}\n${hashedCanonicalRequest}`;
206
+ }
207
+ credentialScope(now) {
208
+ const config = this.config;
209
+ return `${this.formatDate(now)}/${config.region ?? 'auto'}/s3/aws4_request`;
210
+ }
211
+ calculateSignature(now, stringToSign) {
212
+ const config = this.config;
213
+ const dateKey = this.hmacBuffer(`AWS4${config.secretAccessKey}`, this.formatDate(now));
214
+ const regionKey = this.hmacBuffer(dateKey, config.region ?? 'auto');
215
+ const serviceKey = this.hmacBuffer(regionKey, 's3');
216
+ const signingKey = this.hmacBuffer(serviceKey, 'aws4_request');
217
+ return this.hmacHex(signingKey, stringToSign);
218
+ }
219
+ hashHex(value) {
220
+ return createHash('sha256').update(value)
221
+ .digest('hex');
222
+ }
223
+ hmacBuffer(key, value) {
224
+ const hmac = createHmac('sha256', key);
225
+ hmac.update(value);
226
+ return hmac.digest();
227
+ }
228
+ hmacHex(key, value) {
229
+ const hmac = createHmac('sha256', key);
230
+ hmac.update(value);
231
+ return hmac.digest('hex');
232
+ }
233
+ formatAmzDate(date) {
234
+ const year = date.getUTCFullYear();
235
+ const month = this.pad(date.getUTCMonth() + 1);
236
+ const day = this.pad(date.getUTCDate());
237
+ const hours = this.pad(date.getUTCHours());
238
+ const minutes = this.pad(date.getUTCMinutes());
239
+ const seconds = this.pad(date.getUTCSeconds());
240
+ return `${year}${month}${day}T${hours}${minutes}${seconds}Z`;
241
+ }
242
+ formatDate(date) {
243
+ const year = date.getUTCFullYear();
244
+ const month = this.pad(date.getUTCMonth() + 1);
245
+ const day = this.pad(date.getUTCDate());
246
+ return `${year}${month}${day}`;
247
+ }
248
+ pad(value) {
249
+ return value.toString().padStart(2, '0');
250
+ }
251
+ validateConfig(config) {
252
+ const requiredFields = [
253
+ 'accountId',
254
+ 'accessKeyId',
255
+ 'secretAccessKey',
256
+ 'bucketName'
257
+ ];
258
+ for (const field of requiredFields) {
259
+ if (!config[field] || typeof config[field] !== 'string') {
260
+ throw new Error(`Cloudflare R2 configuration field "${String(field)}" is required.`);
261
+ }
262
+ }
263
+ }
264
+ }
265
+ //# sourceMappingURL=CloudflareR2BlobAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareR2BlobAdapter.js","sourceRoot":"","sources":["../../../src/assets/adapters/CloudflareR2BlobAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { IBlobAdapter } from './interfaces/IBlobAdapter.js';
2
+ import { IBlobUploadResult } from './interfaces/IBlobUploadResult.js';
3
+ /**
4
+ * Empty blob adapter that performs no actual uploads.
5
+ * Used as the default when no blob storage is configured.
6
+ *
7
+ * @public
8
+ */
9
+ export declare class EmptyBlobAdapter implements IBlobAdapter {
10
+ get name(): string;
11
+ /**
12
+ * Mock upload that returns a local file URL without actually uploading.
13
+ *
14
+ * @param key The unique key/path for the file
15
+ * @param buffer The file content as a buffer
16
+ * @param mimeType The MIME type of the file
17
+ * @returns Promise with mock upload result
18
+ */
19
+ upload(key: string, buffer: Buffer, mimeType: string): Promise<IBlobUploadResult>;
20
+ /**
21
+ * Generate a mock public URL.
22
+ *
23
+ * @param key The unique key/path of the file
24
+ * @returns Promise with mock URL
25
+ */
26
+ getPublicUrl(key: string): Promise<string>;
27
+ /**
28
+ * Always returns false since no files are actually stored.
29
+ *
30
+ * @param key The unique key/path of the file
31
+ * @returns Promise with false
32
+ */
33
+ exists(_key: string): Promise<boolean>;
34
+ /**
35
+ * Mock delete operation that does nothing.
36
+ *
37
+ * @param key The unique key/path of the file
38
+ * @returns Promise that resolves immediately
39
+ */
40
+ delete(_key: string): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=EmptyBlobAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyBlobAdapter.d.ts","sourceRoot":"","sources":["../../../src/assets/adapters/EmptyBlobAdapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAItE;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IAIjD,IAAW,IAAI,IAAI,MAAM,CAExB;IAID;;;;;;;OAOG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAe9F;;;;;OAKG;IACU,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD;;;;;OAKG;IACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD;;;;;OAKG;IACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMnD"}
@@ -0,0 +1,65 @@
1
+ /* eslint-disable no-unused-vars */
2
+ // #endregion
3
+ /**
4
+ * Empty blob adapter that performs no actual uploads.
5
+ * Used as the default when no blob storage is configured.
6
+ *
7
+ * @public
8
+ */
9
+ export class EmptyBlobAdapter {
10
+ // #region Properties
11
+ get name() {
12
+ return 'empty';
13
+ }
14
+ // #region Methods
15
+ /**
16
+ * Mock upload that returns a local file URL without actually uploading.
17
+ *
18
+ * @param key The unique key/path for the file
19
+ * @param buffer The file content as a buffer
20
+ * @param mimeType The MIME type of the file
21
+ * @returns Promise with mock upload result
22
+ */
23
+ async upload(key, buffer, mimeType) {
24
+ // Return a mock result that looks like a successful upload
25
+ // but doesn't actually store anything
26
+ return {
27
+ key,
28
+ url: `mock://assets/${key}`,
29
+ size: buffer.length,
30
+ metadata: {
31
+ mimeType,
32
+ adapter: 'empty',
33
+ note: 'No actual upload performed - this is a mock URL'
34
+ }
35
+ };
36
+ }
37
+ /**
38
+ * Generate a mock public URL.
39
+ *
40
+ * @param key The unique key/path of the file
41
+ * @returns Promise with mock URL
42
+ */
43
+ async getPublicUrl(key) {
44
+ return `mock://assets/${key}`;
45
+ }
46
+ /**
47
+ * Always returns false since no files are actually stored.
48
+ *
49
+ * @param key The unique key/path of the file
50
+ * @returns Promise with false
51
+ */
52
+ async exists(_key) {
53
+ return false;
54
+ }
55
+ /**
56
+ * Mock delete operation that does nothing.
57
+ *
58
+ * @param key The unique key/path of the file
59
+ * @returns Promise that resolves immediately
60
+ */
61
+ async delete(_key) {
62
+ // Nothing to delete
63
+ }
64
+ }
65
+ //# sourceMappingURL=EmptyBlobAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyBlobAdapter.js","sourceRoot":"","sources":["../../../src/assets/adapters/EmptyBlobAdapter.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAOnC,aAAa;AAEb;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAEzB,qBAAqB;IAErB,IAAW,IAAI;QACX,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,kBAAkB;IAElB;;;;;;;OAOG;IACI,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAc,EAAE,QAAgB;QAC7D,2DAA2D;QAC3D,sCAAsC;QACtC,OAAO;YACH,GAAG;YACH,GAAG,EAAE,iBAAiB,GAAG,EAAE;YAC3B,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,QAAQ,EAAE;gBACN,QAAQ;gBACR,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,iDAAiD;aAC1D;SACJ,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,YAAY,CAAC,GAAW;QACjC,OAAO,iBAAiB,GAAG,EAAE,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,MAAM,CAAC,IAAY;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,MAAM,CAAC,IAAY;QAC5B,oBAAoB;IACxB,CAAC;CAIJ"}
@@ -0,0 +1,34 @@
1
+ import { BlobAdapterBase } from './abstracts/BlobAdapterBase.js';
2
+ import type { IBlobUploadResult } from './interfaces/IBlobUploadResult.js';
3
+ import type { IBlobAdapterConfig } from './interfaces/IBlobAdapterConfig.js';
4
+ /**
5
+ * Configuration for local file adapter.
6
+ *
7
+ * @public
8
+ */
9
+ export interface ILocalFileAdapterConfig extends IBlobAdapterConfig {
10
+ /**
11
+ * Base directory for file storage
12
+ */
13
+ baseDirectory: string;
14
+ /**
15
+ * Base URL for generating public URLs
16
+ */
17
+ baseUrl: string;
18
+ }
19
+ /**
20
+ * Local file system blob adapter for development and testing.
21
+ * Completely standalone implementation without external dependencies.
22
+ *
23
+ * @public
24
+ */
25
+ export declare class LocalFileAdapter extends BlobAdapterBase<ILocalFileAdapterConfig> {
26
+ constructor(config: ILocalFileAdapterConfig);
27
+ get name(): string;
28
+ upload(key: string, buffer: Buffer, mimeType: string): Promise<IBlobUploadResult>;
29
+ getPublicUrl(key: string): Promise<string>;
30
+ exists(key: string): Promise<boolean>;
31
+ delete(key: string): Promise<void>;
32
+ private buildPublicUrl;
33
+ }
34
+ //# sourceMappingURL=LocalFileAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalFileAdapter.d.ts","sourceRoot":"","sources":["../../../src/assets/adapters/LocalFileAdapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAI7E;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IAE/D;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CAEnB;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,eAAe,CAAC,uBAAuB,CAAC;gBAIvD,MAAM,EAAE,uBAAuB;IAQlD,IAAW,IAAI,IAAI,MAAM,CAExB;IAMY,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoBjF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/C,OAAO,CAAC,cAAc;CAMzB"}
@@ -0,0 +1,74 @@
1
+ // #region Imports
2
+ import { promises as fs } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { BlobAdapterBase } from './abstracts/BlobAdapterBase.js';
5
+ /**
6
+ * Local file system blob adapter for development and testing.
7
+ * Completely standalone implementation without external dependencies.
8
+ *
9
+ * @public
10
+ */
11
+ export class LocalFileAdapter extends BlobAdapterBase {
12
+ // #region Ctor
13
+ constructor(config) {
14
+ super(config);
15
+ }
16
+ // #endregion
17
+ // #region Properties
18
+ get name() {
19
+ return 'local';
20
+ }
21
+ // #endregion
22
+ // #region Methods
23
+ async upload(key, buffer, mimeType) {
24
+ const fullKey = this.resolveKey(key);
25
+ const filePath = join(this.config.baseDirectory, fullKey);
26
+ await fs.mkdir(dirname(filePath), { recursive: true });
27
+ await fs.writeFile(filePath, buffer);
28
+ return {
29
+ key: fullKey,
30
+ url: this.buildPublicUrl(fullKey),
31
+ size: buffer.length,
32
+ metadata: {
33
+ contentType: mimeType,
34
+ provider: 'local-file',
35
+ filePath,
36
+ uploadedAt: new Date().toISOString()
37
+ }
38
+ };
39
+ }
40
+ async getPublicUrl(key) {
41
+ const fullKey = this.resolveKey(key);
42
+ return this.buildPublicUrl(fullKey);
43
+ }
44
+ async exists(key) {
45
+ const fullKey = this.resolveKey(key);
46
+ const filePath = join(this.config.baseDirectory, fullKey);
47
+ try {
48
+ await fs.access(filePath);
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ async delete(key) {
56
+ const fullKey = this.resolveKey(key);
57
+ const filePath = join(this.config.baseDirectory, fullKey);
58
+ try {
59
+ await fs.unlink(filePath);
60
+ }
61
+ catch (error) {
62
+ const nodeError = error;
63
+ if (nodeError.code !== 'ENOENT') {
64
+ throw error;
65
+ }
66
+ }
67
+ }
68
+ // #endregion
69
+ // #region Private Methods
70
+ buildPublicUrl(key) {
71
+ return `${this.config.baseUrl.replace(/\/$/, '')}/${key}`;
72
+ }
73
+ }
74
+ //# sourceMappingURL=LocalFileAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalFileAdapter.js","sourceRoot":"","sources":["../../../src/assets/adapters/LocalFileAdapter.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAyBjE;;;;;GAKG;AACH,MAAM,OAAO,gBAAiB,SAAQ,eAAwC;IAE1E,eAAe;IAEf,YAAmB,MAA+B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,aAAa;IAEb,qBAAqB;IAErB,IAAW,IAAI;QACX,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,aAAa;IAEb,kBAAkB;IAEX,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAc,EAAE,QAAgB;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAErC,OAAO;YACH,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACjC,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,QAAQ,EAAE;gBACN,WAAW,EAAE,QAAQ;gBACrB,QAAQ,EAAE,YAAY;gBACtB,QAAQ;gBACR,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACvC;SACJ,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,GAAW;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE1D,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE1D,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,KAA0B,CAAC;YAC7C,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;IAED,aAAa;IAEb,0BAA0B;IAElB,cAAc,CAAC,GAAW;QAC9B,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;IAC9D,CAAC;CAIJ"}