@fairu/sdk 1.0.1

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 (150) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +447 -0
  3. package/dist/FairuClient-BUObk5LJ.cjs +91 -0
  4. package/dist/FairuClient-BUObk5LJ.cjs.map +1 -0
  5. package/dist/FairuClient-CT-IPh8i.js +92 -0
  6. package/dist/FairuClient-CT-IPh8i.js.map +1 -0
  7. package/dist/FairuError-D8sSmRAa.js +214 -0
  8. package/dist/FairuError-D8sSmRAa.js.map +1 -0
  9. package/dist/FairuError-DWH_Nwk0.cjs +213 -0
  10. package/dist/FairuError-DWH_Nwk0.cjs.map +1 -0
  11. package/dist/FairuProvider-BRpRddCI.cjs +51 -0
  12. package/dist/FairuProvider-BRpRddCI.cjs.map +1 -0
  13. package/dist/FairuProvider-Tc0vFo5L.js +52 -0
  14. package/dist/FairuProvider-Tc0vFo5L.js.map +1 -0
  15. package/dist/FileProxyBuilder-D-jZpAtd.cjs +269 -0
  16. package/dist/FileProxyBuilder-D-jZpAtd.cjs.map +1 -0
  17. package/dist/FileProxyBuilder-vHw1zBpJ.js +270 -0
  18. package/dist/FileProxyBuilder-vHw1zBpJ.js.map +1 -0
  19. package/dist/FragmentBuilder-BinoxeVS.js +194 -0
  20. package/dist/FragmentBuilder-BinoxeVS.js.map +1 -0
  21. package/dist/FragmentBuilder-BuvIC0aT.cjs +193 -0
  22. package/dist/FragmentBuilder-BuvIC0aT.cjs.map +1 -0
  23. package/dist/UploadError-CHBJuChw.cjs +81 -0
  24. package/dist/UploadError-CHBJuChw.cjs.map +1 -0
  25. package/dist/UploadError-_gEcJqSS.js +82 -0
  26. package/dist/UploadError-_gEcJqSS.js.map +1 -0
  27. package/dist/client/FairuClient.d.ts +8 -0
  28. package/dist/client/FairuClient.d.ts.map +1 -0
  29. package/dist/client/FairuProvider.d.ts +78 -0
  30. package/dist/client/FairuProvider.d.ts.map +1 -0
  31. package/dist/client/cache.d.ts +6 -0
  32. package/dist/client/cache.d.ts.map +1 -0
  33. package/dist/client/config.d.ts +77 -0
  34. package/dist/client/config.d.ts.map +1 -0
  35. package/dist/client/index.d.ts +5 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/errors/FairuError.d.ts +107 -0
  38. package/dist/errors/FairuError.d.ts.map +1 -0
  39. package/dist/errors/UploadError.d.ts +54 -0
  40. package/dist/errors/UploadError.d.ts.map +1 -0
  41. package/dist/errors/index.d.ts +3 -0
  42. package/dist/errors/index.d.ts.map +1 -0
  43. package/dist/fileproxy/FileProxyBuilder.d.ts +141 -0
  44. package/dist/fileproxy/FileProxyBuilder.d.ts.map +1 -0
  45. package/dist/fileproxy/index.d.ts +4 -0
  46. package/dist/fileproxy/index.d.ts.map +1 -0
  47. package/dist/fileproxy/types.d.ts +79 -0
  48. package/dist/fileproxy/types.d.ts.map +1 -0
  49. package/dist/fileproxy/useFileProxyUrl.d.ts +91 -0
  50. package/dist/fileproxy/useFileProxyUrl.d.ts.map +1 -0
  51. package/dist/fileproxy.cjs +10 -0
  52. package/dist/fileproxy.cjs.map +1 -0
  53. package/dist/fileproxy.d.ts +2 -0
  54. package/dist/fileproxy.js +10 -0
  55. package/dist/fileproxy.js.map +1 -0
  56. package/dist/fragments/FragmentBuilder.d.ts +107 -0
  57. package/dist/fragments/FragmentBuilder.d.ts.map +1 -0
  58. package/dist/fragments/FragmentRegistry.d.ts +93 -0
  59. package/dist/fragments/FragmentRegistry.d.ts.map +1 -0
  60. package/dist/fragments/index.d.ts +5 -0
  61. package/dist/fragments/index.d.ts.map +1 -0
  62. package/dist/fragments/predefined/assetFragments.d.ts +39 -0
  63. package/dist/fragments/predefined/assetFragments.d.ts.map +1 -0
  64. package/dist/fragments/predefined/copyrightFragments.d.ts +12 -0
  65. package/dist/fragments/predefined/copyrightFragments.d.ts.map +1 -0
  66. package/dist/fragments/predefined/folderFragments.d.ts +28 -0
  67. package/dist/fragments/predefined/folderFragments.d.ts.map +1 -0
  68. package/dist/fragments/predefined/galleryFragments.d.ts +24 -0
  69. package/dist/fragments/predefined/galleryFragments.d.ts.map +1 -0
  70. package/dist/fragments/predefined/index.d.ts +6 -0
  71. package/dist/fragments/predefined/index.d.ts.map +1 -0
  72. package/dist/fragments/predefined/licenseFragments.d.ts +12 -0
  73. package/dist/fragments/predefined/licenseFragments.d.ts.map +1 -0
  74. package/dist/fragments/types.d.ts +46 -0
  75. package/dist/fragments/types.d.ts.map +1 -0
  76. package/dist/fragments.cjs +403 -0
  77. package/dist/fragments.cjs.map +1 -0
  78. package/dist/fragments.d.ts +2 -0
  79. package/dist/fragments.js +403 -0
  80. package/dist/fragments.js.map +1 -0
  81. package/dist/generated/graphql.d.ts +3464 -0
  82. package/dist/generated/graphql.d.ts.map +1 -0
  83. package/dist/hooks/index.d.ts +3 -0
  84. package/dist/hooks/index.d.ts.map +1 -0
  85. package/dist/hooks/mutations/index.d.ts +5 -0
  86. package/dist/hooks/mutations/index.d.ts.map +1 -0
  87. package/dist/hooks/mutations/useAssetMutations.d.ts +66 -0
  88. package/dist/hooks/mutations/useAssetMutations.d.ts.map +1 -0
  89. package/dist/hooks/mutations/useFolderMutations.d.ts +69 -0
  90. package/dist/hooks/mutations/useFolderMutations.d.ts.map +1 -0
  91. package/dist/hooks/mutations/useGalleryMutations.d.ts +39 -0
  92. package/dist/hooks/mutations/useGalleryMutations.d.ts.map +1 -0
  93. package/dist/hooks/mutations/useUpdateAsset.d.ts +50 -0
  94. package/dist/hooks/mutations/useUpdateAsset.d.ts.map +1 -0
  95. package/dist/hooks/queries/index.d.ts +8 -0
  96. package/dist/hooks/queries/index.d.ts.map +1 -0
  97. package/dist/hooks/queries/useAsset.d.ts +46 -0
  98. package/dist/hooks/queries/useAsset.d.ts.map +1 -0
  99. package/dist/hooks/queries/useAssets.d.ts +58 -0
  100. package/dist/hooks/queries/useAssets.d.ts.map +1 -0
  101. package/dist/hooks/queries/useCopyright.d.ts +51 -0
  102. package/dist/hooks/queries/useCopyright.d.ts.map +1 -0
  103. package/dist/hooks/queries/useFolder.d.ts +93 -0
  104. package/dist/hooks/queries/useFolder.d.ts.map +1 -0
  105. package/dist/hooks/queries/useGallery.d.ts +101 -0
  106. package/dist/hooks/queries/useGallery.d.ts.map +1 -0
  107. package/dist/hooks/queries/useLicense.d.ts +63 -0
  108. package/dist/hooks/queries/useLicense.d.ts.map +1 -0
  109. package/dist/hooks/queries/useTenant.d.ts +89 -0
  110. package/dist/hooks/queries/useTenant.d.ts.map +1 -0
  111. package/dist/index.cjs +244 -0
  112. package/dist/index.cjs.map +1 -0
  113. package/dist/index.d.ts +18 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +244 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/react.cjs +596 -0
  118. package/dist/react.cjs.map +1 -0
  119. package/dist/react.d.ts +22 -0
  120. package/dist/react.d.ts.map +1 -0
  121. package/dist/react.js +596 -0
  122. package/dist/react.js.map +1 -0
  123. package/dist/upload/index.d.ts +4 -0
  124. package/dist/upload/index.d.ts.map +1 -0
  125. package/dist/upload/types.d.ts +96 -0
  126. package/dist/upload/types.d.ts.map +1 -0
  127. package/dist/upload/useMultipartUpload.d.ts +67 -0
  128. package/dist/upload/useMultipartUpload.d.ts.map +1 -0
  129. package/dist/upload/useUpload.d.ts +64 -0
  130. package/dist/upload/useUpload.d.ts.map +1 -0
  131. package/dist/upload.cjs +6 -0
  132. package/dist/upload.cjs.map +1 -0
  133. package/dist/upload.d.ts +2 -0
  134. package/dist/upload.js +6 -0
  135. package/dist/upload.js.map +1 -0
  136. package/dist/useFileProxyUrl-BCcux6re.cjs +87 -0
  137. package/dist/useFileProxyUrl-BCcux6re.cjs.map +1 -0
  138. package/dist/useFileProxyUrl-D_S1R_7O.js +88 -0
  139. package/dist/useFileProxyUrl-D_S1R_7O.js.map +1 -0
  140. package/dist/useMultipartUpload-BKnDbl8h.cjs +423 -0
  141. package/dist/useMultipartUpload-BKnDbl8h.cjs.map +1 -0
  142. package/dist/useMultipartUpload-CPK_PgUU.js +424 -0
  143. package/dist/useMultipartUpload-CPK_PgUU.js.map +1 -0
  144. package/dist/vanilla.cjs +219 -0
  145. package/dist/vanilla.cjs.map +1 -0
  146. package/dist/vanilla.d.ts +94 -0
  147. package/dist/vanilla.d.ts.map +1 -0
  148. package/dist/vanilla.js +220 -0
  149. package/dist/vanilla.js.map +1 -0
  150. package/package.json +177 -0
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
+ const FragmentBuilder = require("./FragmentBuilder-BuvIC0aT.cjs");
7
+ const FileProxyBuilder = require("./FileProxyBuilder-D-jZpAtd.cjs");
8
+ const FairuClient = require("./FairuClient-BUObk5LJ.cjs");
9
+ const FairuError = require("./FairuError-DWH_Nwk0.cjs");
10
+ class AssetOperations {
11
+ constructor(client) {
12
+ this.client = client;
13
+ }
14
+ /**
15
+ * Find an asset by ID.
16
+ */
17
+ async find(id, fragment) {
18
+ var _a;
19
+ const frag = fragment ?? FragmentBuilder.FragmentBuilder.for("FairuAsset").select(["id", "name", "mime", "alt", "url", "width", "height", "blurhash"]);
20
+ const query = `
21
+ query FairuFile($id: ID!) {
22
+ fairuFile(id: $id) ${frag.toGraphQL()}
23
+ }
24
+ `;
25
+ const result = await this.client.query(query, { id }).toPromise();
26
+ if (result.error) {
27
+ throw FairuError.FairuError.fromCombinedError(result.error);
28
+ }
29
+ return ((_a = result.data) == null ? void 0 : _a.fairuFile) ?? null;
30
+ }
31
+ /**
32
+ * List assets with pagination.
33
+ */
34
+ async list(options = {}) {
35
+ var _a;
36
+ const { page = 1, perPage = 20, folderId, fragment } = options;
37
+ const frag = fragment ?? FragmentBuilder.FragmentBuilder.for("FairuAsset").select(["id", "name", "mime", "url", "width", "height"]);
38
+ const query = `
39
+ query FairuFiles($page: Int, $perPage: Int, $folder: ID) {
40
+ fairuFiles(page: $page, first: $perPage, folder: $folder) {
41
+ data ${frag.toGraphQL()}
42
+ paginatorInfo {
43
+ currentPage
44
+ lastPage
45
+ perPage
46
+ total
47
+ hasMorePages
48
+ }
49
+ }
50
+ }
51
+ `;
52
+ const result = await this.client.query(query, { page, perPage, folder: folderId }).toPromise();
53
+ if (result.error) {
54
+ throw FairuError.FairuError.fromCombinedError(result.error);
55
+ }
56
+ return ((_a = result.data) == null ? void 0 : _a.fairuFiles) ?? { data: [], paginatorInfo: null };
57
+ }
58
+ /**
59
+ * Update an asset.
60
+ */
61
+ async update(data) {
62
+ var _a;
63
+ const mutation = `
64
+ mutation UpdateFairuFile($data: FairuFileDTO!) {
65
+ updateFairuFile(data: $data) {
66
+ id name mime alt caption description url blocked updated_at
67
+ }
68
+ }
69
+ `;
70
+ const result = await this.client.mutation(mutation, { data }).toPromise();
71
+ if (result.error) {
72
+ throw FairuError.FairuError.fromCombinedError(result.error);
73
+ }
74
+ if (!((_a = result.data) == null ? void 0 : _a.updateFairuFile)) {
75
+ throw new FairuError.FairuError("Failed to update asset");
76
+ }
77
+ return result.data.updateFairuFile;
78
+ }
79
+ /**
80
+ * Delete an asset.
81
+ */
82
+ async delete(id) {
83
+ var _a;
84
+ const mutation = `
85
+ mutation DeleteFairuFile($id: ID!) {
86
+ deleteFairuFile(id: $id)
87
+ }
88
+ `;
89
+ const result = await this.client.mutation(mutation, { id }).toPromise();
90
+ if (result.error) {
91
+ throw FairuError.FairuError.fromCombinedError(result.error);
92
+ }
93
+ return ((_a = result.data) == null ? void 0 : _a.deleteFairuFile) ?? false;
94
+ }
95
+ }
96
+ class FolderOperations {
97
+ constructor(client) {
98
+ this.client = client;
99
+ }
100
+ async find(id) {
101
+ var _a;
102
+ const query = `
103
+ query FairuFolder($id: ID!) {
104
+ fairuFolder(id: $id) {
105
+ id name parent_id created_at updated_at
106
+ }
107
+ }
108
+ `;
109
+ const result = await this.client.query(query, { id }).toPromise();
110
+ if (result.error) {
111
+ throw FairuError.FairuError.fromCombinedError(result.error);
112
+ }
113
+ return ((_a = result.data) == null ? void 0 : _a.fairuFolder) ?? null;
114
+ }
115
+ }
116
+ class UploadOperations {
117
+ constructor(client) {
118
+ this.client = client;
119
+ }
120
+ /**
121
+ * Simple file upload.
122
+ */
123
+ async simple(file, options = {}) {
124
+ var _a;
125
+ const createLinkMutation = `
126
+ mutation CreateFairuUploadLink($type: FairuUploadType!, $filename: String!, $folder: ID, $alt: String) {
127
+ createFairuUploadLink(type: $type, filename: $filename, folder: $folder, alt: $alt) {
128
+ id url
129
+ }
130
+ }
131
+ `;
132
+ const linkResult = await this.client.mutation(createLinkMutation, {
133
+ type: "STANDARD",
134
+ filename: file.name,
135
+ folder: options.folderId,
136
+ alt: options.alt
137
+ }).toPromise();
138
+ if (linkResult.error || !((_a = linkResult.data) == null ? void 0 : _a.createFairuUploadLink)) {
139
+ throw new FairuError.FairuError("Failed to create upload link");
140
+ }
141
+ const { id, url } = linkResult.data.createFairuUploadLink;
142
+ await this.uploadToUrl(url, file, options.onProgress);
143
+ return { id, url };
144
+ }
145
+ uploadToUrl(url, file, onProgress) {
146
+ return new Promise((resolve, reject) => {
147
+ const xhr = new XMLHttpRequest();
148
+ if (onProgress) {
149
+ xhr.upload.addEventListener("progress", (e) => {
150
+ if (e.lengthComputable) {
151
+ onProgress(Math.round(e.loaded / e.total * 100));
152
+ }
153
+ });
154
+ }
155
+ xhr.addEventListener("load", () => {
156
+ if (xhr.status >= 200 && xhr.status < 300) {
157
+ resolve();
158
+ } else {
159
+ reject(new FairuError.FairuError(`Upload failed with status ${xhr.status}`));
160
+ }
161
+ });
162
+ xhr.addEventListener("error", () => reject(new FairuError.FairuError("Upload failed")));
163
+ xhr.open("PUT", url);
164
+ xhr.setRequestHeader("Content-Type", file.type || "application/octet-stream");
165
+ xhr.send(file);
166
+ });
167
+ }
168
+ }
169
+ class VanillaFairuClient {
170
+ constructor(config) {
171
+ __publicField(this, "client");
172
+ __publicField(this, "assets");
173
+ __publicField(this, "folders");
174
+ __publicField(this, "upload");
175
+ this.client = FairuClient.createFairuClient(config);
176
+ this.assets = new AssetOperations(this.client);
177
+ this.folders = new FolderOperations(this.client);
178
+ this.upload = new UploadOperations(this.client);
179
+ }
180
+ /**
181
+ * Get the underlying urql client.
182
+ */
183
+ getClient() {
184
+ return this.client;
185
+ }
186
+ /**
187
+ * Execute a raw GraphQL query.
188
+ */
189
+ async query(query, variables) {
190
+ const result = await this.client.query(query, variables).toPromise();
191
+ if (result.error) {
192
+ throw FairuError.FairuError.fromCombinedError(result.error);
193
+ }
194
+ return result.data;
195
+ }
196
+ /**
197
+ * Execute a raw GraphQL mutation.
198
+ */
199
+ async mutate(mutation, variables) {
200
+ const result = await this.client.mutation(mutation, variables).toPromise();
201
+ if (result.error) {
202
+ throw FairuError.FairuError.fromCombinedError(result.error);
203
+ }
204
+ return result.data;
205
+ }
206
+ }
207
+ function createVanillaClient(config) {
208
+ return new VanillaFairuClient(config);
209
+ }
210
+ exports.FragmentBuilder = FragmentBuilder.FragmentBuilder;
211
+ exports.fileProxy = FileProxyBuilder.fileProxy;
212
+ exports.fileProxyUtils = FileProxyBuilder.fileProxyUtils;
213
+ exports.AuthenticationError = FairuError.AuthenticationError;
214
+ exports.FairuError = FairuError.FairuError;
215
+ exports.GraphQLError = FairuError.GraphQLError;
216
+ exports.ValidationError = FairuError.ValidationError;
217
+ exports.VanillaFairuClient = VanillaFairuClient;
218
+ exports.createVanillaClient = createVanillaClient;
219
+ //# sourceMappingURL=vanilla.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.cjs","sources":["../src/vanilla.ts"],"sourcesContent":["/**\n * Vanilla TypeScript client for @fairu/sdk (no React dependency)\n *\n * @example\n * ```typescript\n * import { createVanillaClient } from '@fairu/sdk/vanilla';\n *\n * const client = createVanillaClient({\n * url: 'https://fairu.app/graphql',\n * token: 'your-token',\n * });\n *\n * // Fetch an asset\n * const asset = await client.assets.find('asset-id');\n *\n * // Upload a file\n * const result = await client.upload.simple(file, { folderId: 'folder-id' });\n * ```\n */\n\nimport { Client } from '@urql/core';\nimport { createFairuClient, type FairuClientConfig } from './client';\nimport { FragmentBuilder } from './fragments';\nimport { FairuError } from './errors';\nimport type {\n FairuAsset,\n FairuFolder,\n FairuFileDto,\n} from './generated/graphql';\n\n/**\n * Asset operations for vanilla client.\n */\nclass AssetOperations {\n constructor(private client: Client) {}\n\n /**\n * Find an asset by ID.\n */\n async find(id: string, fragment?: FragmentBuilder): Promise<FairuAsset | null> {\n const frag = fragment ?? FragmentBuilder.for('FairuAsset')\n .select(['id', 'name', 'mime', 'alt', 'url', 'width', 'height', 'blurhash']);\n\n const query = `\n query FairuFile($id: ID!) {\n fairuFile(id: $id) ${frag.toGraphQL()}\n }\n `;\n\n const result = await this.client.query(query, { id }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.fairuFile ?? null;\n }\n\n /**\n * List assets with pagination.\n */\n async list(options: {\n page?: number;\n perPage?: number;\n folderId?: string;\n fragment?: FragmentBuilder;\n } = {}): Promise<{ data: FairuAsset[]; paginatorInfo: unknown }> {\n const { page = 1, perPage = 20, folderId, fragment } = options;\n const frag = fragment ?? FragmentBuilder.for('FairuAsset')\n .select(['id', 'name', 'mime', 'url', 'width', 'height']);\n\n const query = `\n query FairuFiles($page: Int, $perPage: Int, $folder: ID) {\n fairuFiles(page: $page, first: $perPage, folder: $folder) {\n data ${frag.toGraphQL()}\n paginatorInfo {\n currentPage\n lastPage\n perPage\n total\n hasMorePages\n }\n }\n }\n `;\n\n const result = await this.client.query(query, { page, perPage, folder: folderId }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.fairuFiles ?? { data: [], paginatorInfo: null };\n }\n\n /**\n * Update an asset.\n */\n async update(data: FairuFileDto): Promise<FairuAsset> {\n const mutation = `\n mutation UpdateFairuFile($data: FairuFileDTO!) {\n updateFairuFile(data: $data) {\n id name mime alt caption description url blocked updated_at\n }\n }\n `;\n\n const result = await this.client.mutation(mutation, { data }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n if (!result.data?.updateFairuFile) {\n throw new FairuError('Failed to update asset');\n }\n\n return result.data.updateFairuFile;\n }\n\n /**\n * Delete an asset.\n */\n async delete(id: string): Promise<boolean> {\n const mutation = `\n mutation DeleteFairuFile($id: ID!) {\n deleteFairuFile(id: $id)\n }\n `;\n\n const result = await this.client.mutation(mutation, { id }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.deleteFairuFile ?? false;\n }\n}\n\n/**\n * Folder operations for vanilla client.\n */\nclass FolderOperations {\n constructor(private client: Client) {}\n\n async find(id: string): Promise<FairuFolder | null> {\n const query = `\n query FairuFolder($id: ID!) {\n fairuFolder(id: $id) {\n id name parent_id created_at updated_at\n }\n }\n `;\n\n const result = await this.client.query(query, { id }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.fairuFolder ?? null;\n }\n}\n\n/**\n * Upload operations for vanilla client.\n */\nclass UploadOperations {\n constructor(private client: Client) {}\n\n /**\n * Simple file upload.\n */\n async simple(\n file: File,\n options: {\n folderId?: string;\n alt?: string;\n onProgress?: (percentage: number) => void;\n } = {}\n ): Promise<{ id: string; url: string }> {\n // Create upload link\n const createLinkMutation = `\n mutation CreateFairuUploadLink($type: FairuUploadType!, $filename: String!, $folder: ID, $alt: String) {\n createFairuUploadLink(type: $type, filename: $filename, folder: $folder, alt: $alt) {\n id url\n }\n }\n `;\n\n const linkResult = await this.client.mutation(createLinkMutation, {\n type: 'STANDARD',\n filename: file.name,\n folder: options.folderId,\n alt: options.alt,\n }).toPromise();\n\n if (linkResult.error || !linkResult.data?.createFairuUploadLink) {\n throw new FairuError('Failed to create upload link');\n }\n\n const { id, url } = linkResult.data.createFairuUploadLink;\n\n // Upload file\n await this.uploadToUrl(url, file, options.onProgress);\n\n return { id, url };\n }\n\n private uploadToUrl(\n url: string,\n file: File,\n onProgress?: (percentage: number) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n if (onProgress) {\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n });\n }\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new FairuError(`Upload failed with status ${xhr.status}`));\n }\n });\n\n xhr.addEventListener('error', () => reject(new FairuError('Upload failed')));\n xhr.open('PUT', url);\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n xhr.send(file);\n });\n }\n}\n\n/**\n * Vanilla Fairu client.\n */\nexport class VanillaFairuClient {\n private client: Client;\n\n public readonly assets: AssetOperations;\n public readonly folders: FolderOperations;\n public readonly upload: UploadOperations;\n\n constructor(config: FairuClientConfig) {\n this.client = createFairuClient(config);\n this.assets = new AssetOperations(this.client);\n this.folders = new FolderOperations(this.client);\n this.upload = new UploadOperations(this.client);\n }\n\n /**\n * Get the underlying urql client.\n */\n getClient(): Client {\n return this.client;\n }\n\n /**\n * Execute a raw GraphQL query.\n */\n async query<T = unknown>(\n query: string,\n variables?: Record<string, unknown>\n ): Promise<T> {\n const result = await this.client.query(query, variables).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data as T;\n }\n\n /**\n * Execute a raw GraphQL mutation.\n */\n async mutate<T = unknown>(\n mutation: string,\n variables?: Record<string, unknown>\n ): Promise<T> {\n const result = await this.client.mutation(mutation, variables).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data as T;\n }\n}\n\n/**\n * Create a vanilla Fairu client.\n */\nexport function createVanillaClient(config: FairuClientConfig): VanillaFairuClient {\n return new VanillaFairuClient(config);\n}\n\n// Re-export types and utilities\nexport { FragmentBuilder } from './fragments';\nexport { fileProxy, fileProxyUtils, type FileProxyParams } from './fileproxy';\nexport { FairuError, GraphQLError, ValidationError, AuthenticationError } from './errors';\nexport type { FairuClientConfig } from './client';\nexport type * from './generated/graphql';\n"],"names":["FragmentBuilder","FairuError","createFairuClient"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { Client } from '@urql/core';
2
+ import { FairuClientConfig } from './client';
3
+ import { FragmentBuilder } from './fragments';
4
+ import { FairuAsset, FairuFolder, FairuFileDto } from './generated/graphql';
5
+ /**
6
+ * Asset operations for vanilla client.
7
+ */
8
+ declare class AssetOperations {
9
+ private client;
10
+ constructor(client: Client);
11
+ /**
12
+ * Find an asset by ID.
13
+ */
14
+ find(id: string, fragment?: FragmentBuilder): Promise<FairuAsset | null>;
15
+ /**
16
+ * List assets with pagination.
17
+ */
18
+ list(options?: {
19
+ page?: number;
20
+ perPage?: number;
21
+ folderId?: string;
22
+ fragment?: FragmentBuilder;
23
+ }): Promise<{
24
+ data: FairuAsset[];
25
+ paginatorInfo: unknown;
26
+ }>;
27
+ /**
28
+ * Update an asset.
29
+ */
30
+ update(data: FairuFileDto): Promise<FairuAsset>;
31
+ /**
32
+ * Delete an asset.
33
+ */
34
+ delete(id: string): Promise<boolean>;
35
+ }
36
+ /**
37
+ * Folder operations for vanilla client.
38
+ */
39
+ declare class FolderOperations {
40
+ private client;
41
+ constructor(client: Client);
42
+ find(id: string): Promise<FairuFolder | null>;
43
+ }
44
+ /**
45
+ * Upload operations for vanilla client.
46
+ */
47
+ declare class UploadOperations {
48
+ private client;
49
+ constructor(client: Client);
50
+ /**
51
+ * Simple file upload.
52
+ */
53
+ simple(file: File, options?: {
54
+ folderId?: string;
55
+ alt?: string;
56
+ onProgress?: (percentage: number) => void;
57
+ }): Promise<{
58
+ id: string;
59
+ url: string;
60
+ }>;
61
+ private uploadToUrl;
62
+ }
63
+ /**
64
+ * Vanilla Fairu client.
65
+ */
66
+ export declare class VanillaFairuClient {
67
+ private client;
68
+ readonly assets: AssetOperations;
69
+ readonly folders: FolderOperations;
70
+ readonly upload: UploadOperations;
71
+ constructor(config: FairuClientConfig);
72
+ /**
73
+ * Get the underlying urql client.
74
+ */
75
+ getClient(): Client;
76
+ /**
77
+ * Execute a raw GraphQL query.
78
+ */
79
+ query<T = unknown>(query: string, variables?: Record<string, unknown>): Promise<T>;
80
+ /**
81
+ * Execute a raw GraphQL mutation.
82
+ */
83
+ mutate<T = unknown>(mutation: string, variables?: Record<string, unknown>): Promise<T>;
84
+ }
85
+ /**
86
+ * Create a vanilla Fairu client.
87
+ */
88
+ export declare function createVanillaClient(config: FairuClientConfig): VanillaFairuClient;
89
+ export { FragmentBuilder } from './fragments';
90
+ export { fileProxy, fileProxyUtils, type FileProxyParams } from './fileproxy';
91
+ export { FairuError, GraphQLError, ValidationError, AuthenticationError } from './errors';
92
+ export type { FairuClientConfig } from './client';
93
+ export type * from './generated/graphql';
94
+ //# sourceMappingURL=vanilla.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.d.ts","sourceRoot":"","sources":["../src/vanilla.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,cAAM,eAAe;IACP,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAmB9E;;OAEG;IACG,IAAI,CAAC,OAAO,GAAE;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,eAAe,CAAC;KACvB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC;IA6BhE;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBrD;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAe3C;AAED;;GAEG;AACH,cAAM,gBAAgB;IACR,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE5B,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;CAiBpD;AAED;;GAEG;AACH,cAAM,gBAAgB;IACR,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC;;OAEG;IACG,MAAM,CACV,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;KACtC,GACL,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BvC,OAAO,CAAC,WAAW;CA8BpB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IAEvB,SAAgB,MAAM,EAAE,eAAe,CAAC;IACxC,SAAgB,OAAO,EAAE,gBAAgB,CAAC;IAC1C,SAAgB,MAAM,EAAE,gBAAgB,CAAC;gBAE7B,MAAM,EAAE,iBAAiB;IAOrC;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC;IAUb;;OAEG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC;CASd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,CAEjF;AAGD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC1F,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,mBAAmB,qBAAqB,CAAC"}
@@ -0,0 +1,220 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ import { F as FragmentBuilder } from "./FragmentBuilder-BinoxeVS.js";
5
+ import { f, a } from "./FileProxyBuilder-vHw1zBpJ.js";
6
+ import { c as createFairuClient } from "./FairuClient-CT-IPh8i.js";
7
+ import { F as FairuError } from "./FairuError-D8sSmRAa.js";
8
+ import { A, G, V } from "./FairuError-D8sSmRAa.js";
9
+ class AssetOperations {
10
+ constructor(client) {
11
+ this.client = client;
12
+ }
13
+ /**
14
+ * Find an asset by ID.
15
+ */
16
+ async find(id, fragment) {
17
+ var _a;
18
+ const frag = fragment ?? FragmentBuilder.for("FairuAsset").select(["id", "name", "mime", "alt", "url", "width", "height", "blurhash"]);
19
+ const query = `
20
+ query FairuFile($id: ID!) {
21
+ fairuFile(id: $id) ${frag.toGraphQL()}
22
+ }
23
+ `;
24
+ const result = await this.client.query(query, { id }).toPromise();
25
+ if (result.error) {
26
+ throw FairuError.fromCombinedError(result.error);
27
+ }
28
+ return ((_a = result.data) == null ? void 0 : _a.fairuFile) ?? null;
29
+ }
30
+ /**
31
+ * List assets with pagination.
32
+ */
33
+ async list(options = {}) {
34
+ var _a;
35
+ const { page = 1, perPage = 20, folderId, fragment } = options;
36
+ const frag = fragment ?? FragmentBuilder.for("FairuAsset").select(["id", "name", "mime", "url", "width", "height"]);
37
+ const query = `
38
+ query FairuFiles($page: Int, $perPage: Int, $folder: ID) {
39
+ fairuFiles(page: $page, first: $perPage, folder: $folder) {
40
+ data ${frag.toGraphQL()}
41
+ paginatorInfo {
42
+ currentPage
43
+ lastPage
44
+ perPage
45
+ total
46
+ hasMorePages
47
+ }
48
+ }
49
+ }
50
+ `;
51
+ const result = await this.client.query(query, { page, perPage, folder: folderId }).toPromise();
52
+ if (result.error) {
53
+ throw FairuError.fromCombinedError(result.error);
54
+ }
55
+ return ((_a = result.data) == null ? void 0 : _a.fairuFiles) ?? { data: [], paginatorInfo: null };
56
+ }
57
+ /**
58
+ * Update an asset.
59
+ */
60
+ async update(data) {
61
+ var _a;
62
+ const mutation = `
63
+ mutation UpdateFairuFile($data: FairuFileDTO!) {
64
+ updateFairuFile(data: $data) {
65
+ id name mime alt caption description url blocked updated_at
66
+ }
67
+ }
68
+ `;
69
+ const result = await this.client.mutation(mutation, { data }).toPromise();
70
+ if (result.error) {
71
+ throw FairuError.fromCombinedError(result.error);
72
+ }
73
+ if (!((_a = result.data) == null ? void 0 : _a.updateFairuFile)) {
74
+ throw new FairuError("Failed to update asset");
75
+ }
76
+ return result.data.updateFairuFile;
77
+ }
78
+ /**
79
+ * Delete an asset.
80
+ */
81
+ async delete(id) {
82
+ var _a;
83
+ const mutation = `
84
+ mutation DeleteFairuFile($id: ID!) {
85
+ deleteFairuFile(id: $id)
86
+ }
87
+ `;
88
+ const result = await this.client.mutation(mutation, { id }).toPromise();
89
+ if (result.error) {
90
+ throw FairuError.fromCombinedError(result.error);
91
+ }
92
+ return ((_a = result.data) == null ? void 0 : _a.deleteFairuFile) ?? false;
93
+ }
94
+ }
95
+ class FolderOperations {
96
+ constructor(client) {
97
+ this.client = client;
98
+ }
99
+ async find(id) {
100
+ var _a;
101
+ const query = `
102
+ query FairuFolder($id: ID!) {
103
+ fairuFolder(id: $id) {
104
+ id name parent_id created_at updated_at
105
+ }
106
+ }
107
+ `;
108
+ const result = await this.client.query(query, { id }).toPromise();
109
+ if (result.error) {
110
+ throw FairuError.fromCombinedError(result.error);
111
+ }
112
+ return ((_a = result.data) == null ? void 0 : _a.fairuFolder) ?? null;
113
+ }
114
+ }
115
+ class UploadOperations {
116
+ constructor(client) {
117
+ this.client = client;
118
+ }
119
+ /**
120
+ * Simple file upload.
121
+ */
122
+ async simple(file, options = {}) {
123
+ var _a;
124
+ const createLinkMutation = `
125
+ mutation CreateFairuUploadLink($type: FairuUploadType!, $filename: String!, $folder: ID, $alt: String) {
126
+ createFairuUploadLink(type: $type, filename: $filename, folder: $folder, alt: $alt) {
127
+ id url
128
+ }
129
+ }
130
+ `;
131
+ const linkResult = await this.client.mutation(createLinkMutation, {
132
+ type: "STANDARD",
133
+ filename: file.name,
134
+ folder: options.folderId,
135
+ alt: options.alt
136
+ }).toPromise();
137
+ if (linkResult.error || !((_a = linkResult.data) == null ? void 0 : _a.createFairuUploadLink)) {
138
+ throw new FairuError("Failed to create upload link");
139
+ }
140
+ const { id, url } = linkResult.data.createFairuUploadLink;
141
+ await this.uploadToUrl(url, file, options.onProgress);
142
+ return { id, url };
143
+ }
144
+ uploadToUrl(url, file, onProgress) {
145
+ return new Promise((resolve, reject) => {
146
+ const xhr = new XMLHttpRequest();
147
+ if (onProgress) {
148
+ xhr.upload.addEventListener("progress", (e) => {
149
+ if (e.lengthComputable) {
150
+ onProgress(Math.round(e.loaded / e.total * 100));
151
+ }
152
+ });
153
+ }
154
+ xhr.addEventListener("load", () => {
155
+ if (xhr.status >= 200 && xhr.status < 300) {
156
+ resolve();
157
+ } else {
158
+ reject(new FairuError(`Upload failed with status ${xhr.status}`));
159
+ }
160
+ });
161
+ xhr.addEventListener("error", () => reject(new FairuError("Upload failed")));
162
+ xhr.open("PUT", url);
163
+ xhr.setRequestHeader("Content-Type", file.type || "application/octet-stream");
164
+ xhr.send(file);
165
+ });
166
+ }
167
+ }
168
+ class VanillaFairuClient {
169
+ constructor(config) {
170
+ __publicField(this, "client");
171
+ __publicField(this, "assets");
172
+ __publicField(this, "folders");
173
+ __publicField(this, "upload");
174
+ this.client = createFairuClient(config);
175
+ this.assets = new AssetOperations(this.client);
176
+ this.folders = new FolderOperations(this.client);
177
+ this.upload = new UploadOperations(this.client);
178
+ }
179
+ /**
180
+ * Get the underlying urql client.
181
+ */
182
+ getClient() {
183
+ return this.client;
184
+ }
185
+ /**
186
+ * Execute a raw GraphQL query.
187
+ */
188
+ async query(query, variables) {
189
+ const result = await this.client.query(query, variables).toPromise();
190
+ if (result.error) {
191
+ throw FairuError.fromCombinedError(result.error);
192
+ }
193
+ return result.data;
194
+ }
195
+ /**
196
+ * Execute a raw GraphQL mutation.
197
+ */
198
+ async mutate(mutation, variables) {
199
+ const result = await this.client.mutation(mutation, variables).toPromise();
200
+ if (result.error) {
201
+ throw FairuError.fromCombinedError(result.error);
202
+ }
203
+ return result.data;
204
+ }
205
+ }
206
+ function createVanillaClient(config) {
207
+ return new VanillaFairuClient(config);
208
+ }
209
+ export {
210
+ A as AuthenticationError,
211
+ FairuError,
212
+ FragmentBuilder,
213
+ G as GraphQLError,
214
+ V as ValidationError,
215
+ VanillaFairuClient,
216
+ createVanillaClient,
217
+ f as fileProxy,
218
+ a as fileProxyUtils
219
+ };
220
+ //# sourceMappingURL=vanilla.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.js","sources":["../src/vanilla.ts"],"sourcesContent":["/**\n * Vanilla TypeScript client for @fairu/sdk (no React dependency)\n *\n * @example\n * ```typescript\n * import { createVanillaClient } from '@fairu/sdk/vanilla';\n *\n * const client = createVanillaClient({\n * url: 'https://fairu.app/graphql',\n * token: 'your-token',\n * });\n *\n * // Fetch an asset\n * const asset = await client.assets.find('asset-id');\n *\n * // Upload a file\n * const result = await client.upload.simple(file, { folderId: 'folder-id' });\n * ```\n */\n\nimport { Client } from '@urql/core';\nimport { createFairuClient, type FairuClientConfig } from './client';\nimport { FragmentBuilder } from './fragments';\nimport { FairuError } from './errors';\nimport type {\n FairuAsset,\n FairuFolder,\n FairuFileDto,\n} from './generated/graphql';\n\n/**\n * Asset operations for vanilla client.\n */\nclass AssetOperations {\n constructor(private client: Client) {}\n\n /**\n * Find an asset by ID.\n */\n async find(id: string, fragment?: FragmentBuilder): Promise<FairuAsset | null> {\n const frag = fragment ?? FragmentBuilder.for('FairuAsset')\n .select(['id', 'name', 'mime', 'alt', 'url', 'width', 'height', 'blurhash']);\n\n const query = `\n query FairuFile($id: ID!) {\n fairuFile(id: $id) ${frag.toGraphQL()}\n }\n `;\n\n const result = await this.client.query(query, { id }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.fairuFile ?? null;\n }\n\n /**\n * List assets with pagination.\n */\n async list(options: {\n page?: number;\n perPage?: number;\n folderId?: string;\n fragment?: FragmentBuilder;\n } = {}): Promise<{ data: FairuAsset[]; paginatorInfo: unknown }> {\n const { page = 1, perPage = 20, folderId, fragment } = options;\n const frag = fragment ?? FragmentBuilder.for('FairuAsset')\n .select(['id', 'name', 'mime', 'url', 'width', 'height']);\n\n const query = `\n query FairuFiles($page: Int, $perPage: Int, $folder: ID) {\n fairuFiles(page: $page, first: $perPage, folder: $folder) {\n data ${frag.toGraphQL()}\n paginatorInfo {\n currentPage\n lastPage\n perPage\n total\n hasMorePages\n }\n }\n }\n `;\n\n const result = await this.client.query(query, { page, perPage, folder: folderId }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.fairuFiles ?? { data: [], paginatorInfo: null };\n }\n\n /**\n * Update an asset.\n */\n async update(data: FairuFileDto): Promise<FairuAsset> {\n const mutation = `\n mutation UpdateFairuFile($data: FairuFileDTO!) {\n updateFairuFile(data: $data) {\n id name mime alt caption description url blocked updated_at\n }\n }\n `;\n\n const result = await this.client.mutation(mutation, { data }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n if (!result.data?.updateFairuFile) {\n throw new FairuError('Failed to update asset');\n }\n\n return result.data.updateFairuFile;\n }\n\n /**\n * Delete an asset.\n */\n async delete(id: string): Promise<boolean> {\n const mutation = `\n mutation DeleteFairuFile($id: ID!) {\n deleteFairuFile(id: $id)\n }\n `;\n\n const result = await this.client.mutation(mutation, { id }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.deleteFairuFile ?? false;\n }\n}\n\n/**\n * Folder operations for vanilla client.\n */\nclass FolderOperations {\n constructor(private client: Client) {}\n\n async find(id: string): Promise<FairuFolder | null> {\n const query = `\n query FairuFolder($id: ID!) {\n fairuFolder(id: $id) {\n id name parent_id created_at updated_at\n }\n }\n `;\n\n const result = await this.client.query(query, { id }).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data?.fairuFolder ?? null;\n }\n}\n\n/**\n * Upload operations for vanilla client.\n */\nclass UploadOperations {\n constructor(private client: Client) {}\n\n /**\n * Simple file upload.\n */\n async simple(\n file: File,\n options: {\n folderId?: string;\n alt?: string;\n onProgress?: (percentage: number) => void;\n } = {}\n ): Promise<{ id: string; url: string }> {\n // Create upload link\n const createLinkMutation = `\n mutation CreateFairuUploadLink($type: FairuUploadType!, $filename: String!, $folder: ID, $alt: String) {\n createFairuUploadLink(type: $type, filename: $filename, folder: $folder, alt: $alt) {\n id url\n }\n }\n `;\n\n const linkResult = await this.client.mutation(createLinkMutation, {\n type: 'STANDARD',\n filename: file.name,\n folder: options.folderId,\n alt: options.alt,\n }).toPromise();\n\n if (linkResult.error || !linkResult.data?.createFairuUploadLink) {\n throw new FairuError('Failed to create upload link');\n }\n\n const { id, url } = linkResult.data.createFairuUploadLink;\n\n // Upload file\n await this.uploadToUrl(url, file, options.onProgress);\n\n return { id, url };\n }\n\n private uploadToUrl(\n url: string,\n file: File,\n onProgress?: (percentage: number) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n if (onProgress) {\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n });\n }\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new FairuError(`Upload failed with status ${xhr.status}`));\n }\n });\n\n xhr.addEventListener('error', () => reject(new FairuError('Upload failed')));\n xhr.open('PUT', url);\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n xhr.send(file);\n });\n }\n}\n\n/**\n * Vanilla Fairu client.\n */\nexport class VanillaFairuClient {\n private client: Client;\n\n public readonly assets: AssetOperations;\n public readonly folders: FolderOperations;\n public readonly upload: UploadOperations;\n\n constructor(config: FairuClientConfig) {\n this.client = createFairuClient(config);\n this.assets = new AssetOperations(this.client);\n this.folders = new FolderOperations(this.client);\n this.upload = new UploadOperations(this.client);\n }\n\n /**\n * Get the underlying urql client.\n */\n getClient(): Client {\n return this.client;\n }\n\n /**\n * Execute a raw GraphQL query.\n */\n async query<T = unknown>(\n query: string,\n variables?: Record<string, unknown>\n ): Promise<T> {\n const result = await this.client.query(query, variables).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data as T;\n }\n\n /**\n * Execute a raw GraphQL mutation.\n */\n async mutate<T = unknown>(\n mutation: string,\n variables?: Record<string, unknown>\n ): Promise<T> {\n const result = await this.client.mutation(mutation, variables).toPromise();\n\n if (result.error) {\n throw FairuError.fromCombinedError(result.error);\n }\n\n return result.data as T;\n }\n}\n\n/**\n * Create a vanilla Fairu client.\n */\nexport function createVanillaClient(config: FairuClientConfig): VanillaFairuClient {\n return new VanillaFairuClient(config);\n}\n\n// Re-export types and utilities\nexport { FragmentBuilder } from './fragments';\nexport { fileProxy, fileProxyUtils, type FileProxyParams } from './fileproxy';\nexport { FairuError, GraphQLError, ValidationError, AuthenticationError } from './errors';\nexport type { FairuClientConfig } from './client';\nexport type * from './generated/graphql';\n"],"names":[],"mappings":"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"}