frappe-nextjs 0.1.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 (98) hide show
  1. package/README.md +90 -0
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +156 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/build/boilerplates.d.ts +12 -0
  7. package/dist/build/boilerplates.d.ts.map +1 -0
  8. package/dist/build/boilerplates.js +261 -0
  9. package/dist/build/boilerplates.js.map +1 -0
  10. package/dist/build/build.d.ts +27 -0
  11. package/dist/build/build.d.ts.map +1 -0
  12. package/dist/build/build.js +172 -0
  13. package/dist/build/build.js.map +1 -0
  14. package/dist/build/context-generator.d.ts +13 -0
  15. package/dist/build/context-generator.d.ts.map +1 -0
  16. package/dist/build/context-generator.js +76 -0
  17. package/dist/build/context-generator.js.map +1 -0
  18. package/dist/build/hooks-patcher.d.ts +11 -0
  19. package/dist/build/hooks-patcher.d.ts.map +1 -0
  20. package/dist/build/hooks-patcher.js +78 -0
  21. package/dist/build/hooks-patcher.js.map +1 -0
  22. package/dist/build/index.d.ts +8 -0
  23. package/dist/build/index.d.ts.map +1 -0
  24. package/dist/build/index.js +33 -0
  25. package/dist/build/index.js.map +1 -0
  26. package/dist/build/init.d.ts +27 -0
  27. package/dist/build/init.d.ts.map +1 -0
  28. package/dist/build/init.js +175 -0
  29. package/dist/build/init.js.map +1 -0
  30. package/dist/build/nginx-generator.d.ts +22 -0
  31. package/dist/build/nginx-generator.d.ts.map +1 -0
  32. package/dist/build/nginx-generator.js +114 -0
  33. package/dist/build/nginx-generator.js.map +1 -0
  34. package/dist/build/supervisor-generator.d.ts +31 -0
  35. package/dist/build/supervisor-generator.d.ts.map +1 -0
  36. package/dist/build/supervisor-generator.js +105 -0
  37. package/dist/build/supervisor-generator.js.map +1 -0
  38. package/dist/client/FrappeClient.d.ts +143 -0
  39. package/dist/client/FrappeClient.d.ts.map +1 -0
  40. package/dist/client/FrappeClient.js +446 -0
  41. package/dist/client/FrappeClient.js.map +1 -0
  42. package/dist/client/index.d.ts +3 -0
  43. package/dist/client/index.d.ts.map +1 -0
  44. package/dist/client/index.js +21 -0
  45. package/dist/client/index.js.map +1 -0
  46. package/dist/client/types.d.ts +140 -0
  47. package/dist/client/types.d.ts.map +1 -0
  48. package/dist/client/types.js +17 -0
  49. package/dist/client/types.js.map +1 -0
  50. package/dist/hooks/FrappeProvider.d.ts +41 -0
  51. package/dist/hooks/FrappeProvider.d.ts.map +1 -0
  52. package/dist/hooks/FrappeProvider.js +48 -0
  53. package/dist/hooks/FrappeProvider.js.map +1 -0
  54. package/dist/hooks/index.d.ts +8 -0
  55. package/dist/hooks/index.d.ts.map +1 -0
  56. package/dist/hooks/index.js +17 -0
  57. package/dist/hooks/index.js.map +1 -0
  58. package/dist/hooks/useFrappeAuth.d.ts +37 -0
  59. package/dist/hooks/useFrappeAuth.d.ts.map +1 -0
  60. package/dist/hooks/useFrappeAuth.js +111 -0
  61. package/dist/hooks/useFrappeAuth.js.map +1 -0
  62. package/dist/hooks/useFrappeCall.d.ts +26 -0
  63. package/dist/hooks/useFrappeCall.d.ts.map +1 -0
  64. package/dist/hooks/useFrappeCall.js +47 -0
  65. package/dist/hooks/useFrappeCall.js.map +1 -0
  66. package/dist/hooks/useFrappeDoc.d.ts +37 -0
  67. package/dist/hooks/useFrappeDoc.d.ts.map +1 -0
  68. package/dist/hooks/useFrappeDoc.js +79 -0
  69. package/dist/hooks/useFrappeDoc.js.map +1 -0
  70. package/dist/hooks/useFrappeDocList.d.ts +37 -0
  71. package/dist/hooks/useFrappeDocList.d.ts.map +1 -0
  72. package/dist/hooks/useFrappeDocList.js +65 -0
  73. package/dist/hooks/useFrappeDocList.js.map +1 -0
  74. package/dist/hooks/useFrappeFileUpload.d.ts +40 -0
  75. package/dist/hooks/useFrappeFileUpload.d.ts.map +1 -0
  76. package/dist/hooks/useFrappeFileUpload.js +68 -0
  77. package/dist/hooks/useFrappeFileUpload.js.map +1 -0
  78. package/dist/index.d.ts +10 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +24 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/ssr/index.d.ts +4 -0
  83. package/dist/ssr/index.d.ts.map +1 -0
  84. package/dist/ssr/index.js +13 -0
  85. package/dist/ssr/index.js.map +1 -0
  86. package/dist/ssr/middleware.d.ts +18 -0
  87. package/dist/ssr/middleware.d.ts.map +1 -0
  88. package/dist/ssr/middleware.js +132 -0
  89. package/dist/ssr/middleware.js.map +1 -0
  90. package/dist/ssr/proxy-config.d.ts +33 -0
  91. package/dist/ssr/proxy-config.d.ts.map +1 -0
  92. package/dist/ssr/proxy-config.js +133 -0
  93. package/dist/ssr/proxy-config.js.map +1 -0
  94. package/dist/ssr/server-client.d.ts +73 -0
  95. package/dist/ssr/server-client.d.ts.map +1 -0
  96. package/dist/ssr/server-client.js +94 -0
  97. package/dist/ssr/server-client.js.map +1 -0
  98. package/package.json +79 -0
@@ -0,0 +1,446 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FrappeClient = void 0;
4
+ const types_1 = require("./types");
5
+ /**
6
+ * Core Frappe API client.
7
+ *
8
+ * Works in both browser (cookie auth) and server (token auth) environments.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * // Browser (same-origin, cookie auth)
13
+ * const client = new FrappeClient();
14
+ *
15
+ * // Server-side (token auth)
16
+ * const client = new FrappeClient({
17
+ * baseUrl: 'https://mysite.frappe.cloud',
18
+ * token: { apiKey: '...', apiSecret: '...' },
19
+ * });
20
+ * ```
21
+ */
22
+ class FrappeClient {
23
+ constructor(config = {}) {
24
+ this.csrfToken = null;
25
+ this.baseUrl = (config.baseUrl || '').replace(/\/$/, '');
26
+ this.headers = {
27
+ Accept: 'application/json',
28
+ 'Content-Type': 'application/json',
29
+ ...config.headers,
30
+ };
31
+ // Token-based auth for server-side usage
32
+ if (config.token) {
33
+ this.headers['Authorization'] =
34
+ `token ${config.token.apiKey}:${config.token.apiSecret}`;
35
+ }
36
+ this.fetchFn = config.fetchImpl || globalThis.fetch.bind(globalThis);
37
+ }
38
+ // ─── CSRF Token ─────────────────────────────────────────────────
39
+ /**
40
+ * Set CSRF token (required for browser-side POST/PUT/DELETE requests).
41
+ * In Frappe, this is injected into the page via `{{ frappe.session.csrf_token }}`.
42
+ */
43
+ setCsrfToken(token) {
44
+ this.csrfToken = token;
45
+ }
46
+ /**
47
+ * Get CSRF token from the window object (browser only).
48
+ */
49
+ getCsrfToken() {
50
+ if (this.csrfToken)
51
+ return this.csrfToken;
52
+ if (typeof window !== 'undefined' && window.csrf_token) {
53
+ const token = window.csrf_token;
54
+ if (token !== '{{ csrf_token }}') {
55
+ this.csrfToken = token;
56
+ return token;
57
+ }
58
+ }
59
+ return null;
60
+ }
61
+ // ─── Core Request Method ────────────────────────────────────────
62
+ async request(path, options = {}) {
63
+ const url = `${this.baseUrl}${path}`;
64
+ const headers = { ...this.headers };
65
+ // Add CSRF token for mutating requests
66
+ const method = (options.method || 'GET').toUpperCase();
67
+ if (['POST', 'PUT', 'DELETE'].includes(method)) {
68
+ const csrf = this.getCsrfToken();
69
+ if (csrf) {
70
+ headers['X-Frappe-CSRF-Token'] = csrf;
71
+ }
72
+ }
73
+ // Add site name header (needed for multi-site setups)
74
+ if (typeof window !== 'undefined') {
75
+ headers['X-Frappe-Site-Name'] = window.location.hostname;
76
+ }
77
+ const response = await this.fetchFn(url, {
78
+ ...options,
79
+ headers: {
80
+ ...headers,
81
+ ...options.headers,
82
+ },
83
+ credentials: 'include', // Include cookies for browser-side auth
84
+ });
85
+ if (!response.ok) {
86
+ throw await this.parseError(response);
87
+ }
88
+ const data = (await response.json());
89
+ return data.message;
90
+ }
91
+ /**
92
+ * Parse a Frappe error response into a FrappeApiError.
93
+ */
94
+ async parseError(response) {
95
+ let errorData = {};
96
+ try {
97
+ errorData = await response.json();
98
+ }
99
+ catch {
100
+ // Response wasn't JSON
101
+ }
102
+ const serverMessages = [];
103
+ if (errorData._server_messages) {
104
+ try {
105
+ const msgs = JSON.parse(errorData._server_messages);
106
+ for (const m of msgs) {
107
+ try {
108
+ const parsed = JSON.parse(m);
109
+ serverMessages.push(parsed.message || m);
110
+ }
111
+ catch {
112
+ if (m)
113
+ serverMessages.push(m);
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ // Couldn't parse server messages
119
+ }
120
+ }
121
+ const message = serverMessages.length > 0
122
+ ? serverMessages.join('\n')
123
+ : errorData._error_message || `HTTP ${response.status}: ${response.statusText}`;
124
+ let exc;
125
+ if (errorData.exc) {
126
+ try {
127
+ const parsed = JSON.parse(errorData.exc);
128
+ exc = Array.isArray(parsed) ? parsed[0] : parsed;
129
+ }
130
+ catch {
131
+ exc = errorData.exc;
132
+ }
133
+ }
134
+ return new types_1.FrappeApiError(message, response.status, errorData.exc_type, serverMessages, exc);
135
+ }
136
+ // ─── Document CRUD ─────────────────────────────────────────────
137
+ /**
138
+ * Get a list of documents.
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * const todos = await client.getDocList({
143
+ * doctype: 'ToDo',
144
+ * fields: ['name', 'description', 'status'],
145
+ * filters: [['status', '=', 'Open']],
146
+ * orderBy: { field: 'creation', order: 'desc' },
147
+ * limit: 20,
148
+ * });
149
+ * ```
150
+ */
151
+ async getDocList(params) {
152
+ const queryParams = new URLSearchParams();
153
+ if (params.fields) {
154
+ queryParams.set('fields', JSON.stringify(params.fields));
155
+ }
156
+ if (params.filters) {
157
+ queryParams.set('filters', JSON.stringify(params.filters));
158
+ }
159
+ if (params.orderBy) {
160
+ queryParams.set('order_by', `${params.orderBy.field} ${params.orderBy.order || 'asc'}`);
161
+ }
162
+ if (params.limit !== undefined) {
163
+ queryParams.set('limit_page_length', String(params.limit));
164
+ }
165
+ if (params.offset !== undefined) {
166
+ queryParams.set('limit_start', String(params.offset));
167
+ }
168
+ if (params.groupBy) {
169
+ queryParams.set('group_by', params.groupBy);
170
+ }
171
+ if (params.parent) {
172
+ queryParams.set('parent', params.parent);
173
+ }
174
+ const qs = queryParams.toString();
175
+ const path = `/api/resource/${encodeURIComponent(params.doctype)}${qs ? `?${qs}` : ''}`;
176
+ // Frappe returns { data: [...] } for resource list endpoints
177
+ const url = `${this.baseUrl}${path}`;
178
+ const response = await this.fetchFn(url, {
179
+ headers: this.buildHeaders('GET'),
180
+ credentials: 'include',
181
+ });
182
+ if (!response.ok) {
183
+ throw await this.parseError(response);
184
+ }
185
+ const json = await response.json();
186
+ return (json.data || []);
187
+ }
188
+ /**
189
+ * Get a single document.
190
+ *
191
+ * @example
192
+ * ```ts
193
+ * const todo = await client.getDoc({ doctype: 'ToDo', name: 'TODO-001' });
194
+ * ```
195
+ */
196
+ async getDoc(params) {
197
+ const queryParams = new URLSearchParams();
198
+ if (params.fields) {
199
+ queryParams.set('fields', JSON.stringify(params.fields));
200
+ }
201
+ const qs = queryParams.toString();
202
+ const path = `/api/resource/${encodeURIComponent(params.doctype)}/${encodeURIComponent(params.name)}${qs ? `?${qs}` : ''}`;
203
+ const url = `${this.baseUrl}${path}`;
204
+ const response = await this.fetchFn(url, {
205
+ headers: this.buildHeaders('GET'),
206
+ credentials: 'include',
207
+ });
208
+ if (!response.ok) {
209
+ throw await this.parseError(response);
210
+ }
211
+ const json = await response.json();
212
+ return json.data;
213
+ }
214
+ /**
215
+ * Create a new document.
216
+ *
217
+ * @example
218
+ * ```ts
219
+ * const newTodo = await client.createDoc({
220
+ * doctype: 'ToDo',
221
+ * data: { description: 'Buy milk', status: 'Open' },
222
+ * });
223
+ * ```
224
+ */
225
+ async createDoc(params) {
226
+ const path = `/api/resource/${encodeURIComponent(params.doctype)}`;
227
+ const url = `${this.baseUrl}${path}`;
228
+ const response = await this.fetchFn(url, {
229
+ method: 'POST',
230
+ headers: this.buildHeaders('POST'),
231
+ credentials: 'include',
232
+ body: JSON.stringify(params.data),
233
+ });
234
+ if (!response.ok) {
235
+ throw await this.parseError(response);
236
+ }
237
+ const json = await response.json();
238
+ return json.data;
239
+ }
240
+ /**
241
+ * Update an existing document.
242
+ *
243
+ * @example
244
+ * ```ts
245
+ * const updated = await client.updateDoc({
246
+ * doctype: 'ToDo',
247
+ * name: 'TODO-001',
248
+ * data: { status: 'Closed' },
249
+ * });
250
+ * ```
251
+ */
252
+ async updateDoc(params) {
253
+ const path = `/api/resource/${encodeURIComponent(params.doctype)}/${encodeURIComponent(params.name)}`;
254
+ const url = `${this.baseUrl}${path}`;
255
+ const response = await this.fetchFn(url, {
256
+ method: 'PUT',
257
+ headers: this.buildHeaders('PUT'),
258
+ credentials: 'include',
259
+ body: JSON.stringify(params.data),
260
+ });
261
+ if (!response.ok) {
262
+ throw await this.parseError(response);
263
+ }
264
+ const json = await response.json();
265
+ return json.data;
266
+ }
267
+ /**
268
+ * Delete a document.
269
+ *
270
+ * @example
271
+ * ```ts
272
+ * await client.deleteDoc({ doctype: 'ToDo', name: 'TODO-001' });
273
+ * ```
274
+ */
275
+ async deleteDoc(doctype, name) {
276
+ const path = `/api/resource/${encodeURIComponent(doctype)}/${encodeURIComponent(name)}`;
277
+ const url = `${this.baseUrl}${path}`;
278
+ const response = await this.fetchFn(url, {
279
+ method: 'DELETE',
280
+ headers: this.buildHeaders('DELETE'),
281
+ credentials: 'include',
282
+ });
283
+ if (!response.ok) {
284
+ throw await this.parseError(response);
285
+ }
286
+ }
287
+ /**
288
+ * Get the count of documents matching filters.
289
+ */
290
+ async getCount(doctype, filters) {
291
+ const args = { doctype };
292
+ if (filters) {
293
+ args.filters = filters;
294
+ }
295
+ return this.call({
296
+ method: 'frappe.client.get_count',
297
+ args,
298
+ });
299
+ }
300
+ // ─── Method Calls ──────────────────────────────────────────────
301
+ /**
302
+ * Call a whitelisted Frappe backend method.
303
+ *
304
+ * @example
305
+ * ```ts
306
+ * const result = await client.call({
307
+ * method: 'frappe.ping',
308
+ * });
309
+ * // result === 'pong'
310
+ * ```
311
+ */
312
+ async call(params) {
313
+ const { method, args = {}, httpMethod = 'POST' } = params;
314
+ const path = `/api/method/${method}`;
315
+ if (httpMethod === 'GET') {
316
+ const queryParams = new URLSearchParams();
317
+ for (const [key, value] of Object.entries(args)) {
318
+ queryParams.set(key, typeof value === 'string' ? value : JSON.stringify(value));
319
+ }
320
+ const qs = queryParams.toString();
321
+ return this.request(`${path}${qs ? `?${qs}` : ''}`, { method: 'GET' });
322
+ }
323
+ return this.request(path, {
324
+ method: 'POST',
325
+ body: JSON.stringify(args),
326
+ });
327
+ }
328
+ // ─── File Upload ───────────────────────────────────────────────
329
+ /**
330
+ * Upload a file to Frappe.
331
+ *
332
+ * @example
333
+ * ```ts
334
+ * const fileInput = document.querySelector('input[type="file"]');
335
+ * const result = await client.uploadFile({
336
+ * file: fileInput.files[0],
337
+ * doctype: 'ToDo',
338
+ * docname: 'TODO-001',
339
+ * isPrivate: true,
340
+ * onProgress: (pct) => console.log(`${pct}% uploaded`),
341
+ * });
342
+ * ```
343
+ */
344
+ async uploadFile(options) {
345
+ const formData = new FormData();
346
+ formData.append('file', options.file, options.fileName || undefined);
347
+ if (options.doctype)
348
+ formData.append('doctype', options.doctype);
349
+ if (options.docname)
350
+ formData.append('docname', options.docname);
351
+ if (options.isPrivate)
352
+ formData.append('is_private', '1');
353
+ const headers = {};
354
+ // Don't set Content-Type — let the browser set it with the boundary
355
+ if (this.headers['Authorization']) {
356
+ headers['Authorization'] = this.headers['Authorization'];
357
+ }
358
+ const csrf = this.getCsrfToken();
359
+ if (csrf) {
360
+ headers['X-Frappe-CSRF-Token'] = csrf;
361
+ }
362
+ if (typeof window !== 'undefined') {
363
+ headers['X-Frappe-Site-Name'] = window.location.hostname;
364
+ }
365
+ // Use XMLHttpRequest for progress tracking in browser
366
+ if (options.onProgress && typeof XMLHttpRequest !== 'undefined') {
367
+ return new Promise((resolve, reject) => {
368
+ const xhr = new XMLHttpRequest();
369
+ xhr.open('POST', `${this.baseUrl}/api/method/upload_file`);
370
+ for (const [key, value] of Object.entries(headers)) {
371
+ xhr.setRequestHeader(key, value);
372
+ }
373
+ xhr.withCredentials = true;
374
+ xhr.upload.onprogress = (event) => {
375
+ if (event.lengthComputable && options.onProgress) {
376
+ options.onProgress(Math.round((event.loaded / event.total) * 100));
377
+ }
378
+ };
379
+ xhr.onload = () => {
380
+ if (xhr.status >= 200 && xhr.status < 300) {
381
+ const data = JSON.parse(xhr.responseText);
382
+ resolve(data.message);
383
+ }
384
+ else {
385
+ reject(new types_1.FrappeApiError(`Upload failed: ${xhr.statusText}`, xhr.status));
386
+ }
387
+ };
388
+ xhr.onerror = () => reject(new types_1.FrappeApiError('Upload failed', 0));
389
+ xhr.send(formData);
390
+ });
391
+ }
392
+ // Fallback to fetch (no progress, but works server-side)
393
+ const response = await this.fetchFn(`${this.baseUrl}/api/method/upload_file`, {
394
+ method: 'POST',
395
+ headers,
396
+ credentials: 'include',
397
+ body: formData,
398
+ });
399
+ if (!response.ok) {
400
+ throw await this.parseError(response);
401
+ }
402
+ const data = await response.json();
403
+ return data.message;
404
+ }
405
+ // ─── Auth Methods ──────────────────────────────────────────────
406
+ /**
407
+ * Login with username and password (sets session cookie).
408
+ */
409
+ async login(username, password) {
410
+ await this.request('/api/method/login', {
411
+ method: 'POST',
412
+ body: JSON.stringify({ usr: username, pwd: password }),
413
+ });
414
+ }
415
+ /**
416
+ * Logout the current user.
417
+ */
418
+ async logout() {
419
+ await this.request('/api/method/logout', { method: 'POST' });
420
+ }
421
+ /**
422
+ * Get the currently logged-in user.
423
+ */
424
+ async getLoggedUser() {
425
+ return this.call({
426
+ method: 'frappe.auth.get_logged_user',
427
+ httpMethod: 'GET',
428
+ });
429
+ }
430
+ // ─── Helper ────────────────────────────────────────────────────
431
+ buildHeaders(method) {
432
+ const headers = { ...this.headers };
433
+ if (['POST', 'PUT', 'DELETE'].includes(method)) {
434
+ const csrf = this.getCsrfToken();
435
+ if (csrf) {
436
+ headers['X-Frappe-CSRF-Token'] = csrf;
437
+ }
438
+ }
439
+ if (typeof window !== 'undefined') {
440
+ headers['X-Frappe-Site-Name'] = window.location.hostname;
441
+ }
442
+ return headers;
443
+ }
444
+ }
445
+ exports.FrappeClient = FrappeClient;
446
+ //# sourceMappingURL=FrappeClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrappeClient.js","sourceRoot":"","sources":["../../src/client/FrappeClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { FrappeClient } from './FrappeClient';
2
+ export * from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,cAAc,SAAS,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.FrappeClient = void 0;
18
+ var FrappeClient_1 = require("./FrappeClient");
19
+ Object.defineProperty(exports, "FrappeClient", { enumerable: true, get: function () { return FrappeClient_1.FrappeClient; } });
20
+ __exportStar(require("./types"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,0CAAwB"}
@@ -0,0 +1,140 @@
1
+ /** Filter operators supported by Frappe's API */
2
+ export type FilterOperator = '=' | '!=' | '>' | '<' | '>=' | '<=' | 'like' | 'not like' | 'in' | 'not in' | 'is' | 'between';
3
+ /** A single filter: [doctype, field, operator, value] or [field, operator, value] */
4
+ export type Filter = [string, string, FilterOperator, string | number | boolean | string[]] | [string, FilterOperator, string | number | boolean | string[]];
5
+ /** Order-by clause */
6
+ export interface OrderBy {
7
+ field: string;
8
+ order?: 'asc' | 'desc';
9
+ }
10
+ /** Parameters for getDocList */
11
+ export interface GetDocListParams {
12
+ /** DocType name */
13
+ doctype: string;
14
+ /** List of fields to fetch. Default: ['name'] */
15
+ fields?: string[];
16
+ /** Filters to apply */
17
+ filters?: Filter[] | Record<string, string | number | boolean>;
18
+ /** Order by clause */
19
+ orderBy?: OrderBy;
20
+ /** Number of records to fetch */
21
+ limit?: number;
22
+ /** Offset for pagination */
23
+ offset?: number;
24
+ /** Group by field */
25
+ groupBy?: string;
26
+ /** Parent doctype for child tables */
27
+ parent?: string;
28
+ }
29
+ /** Parameters for getDoc */
30
+ export interface GetDocParams {
31
+ /** DocType name */
32
+ doctype: string;
33
+ /** Document name/ID */
34
+ name: string;
35
+ /** Specific fields to fetch */
36
+ fields?: string[];
37
+ }
38
+ /** Parameters for creating a document */
39
+ export interface CreateDocParams {
40
+ /** DocType name */
41
+ doctype: string;
42
+ /** Document data */
43
+ data: Record<string, unknown>;
44
+ }
45
+ /** Parameters for updating a document */
46
+ export interface UpdateDocParams {
47
+ /** DocType name */
48
+ doctype: string;
49
+ /** Document name/ID */
50
+ name: string;
51
+ /** Fields to update */
52
+ data: Record<string, unknown>;
53
+ }
54
+ /** Parameters for calling a whitelisted method */
55
+ export interface CallParams {
56
+ /** Dotted method path, e.g. 'frappe.client.get_count' */
57
+ method: string;
58
+ /** Method arguments */
59
+ args?: Record<string, unknown>;
60
+ /** HTTP method override (default: POST) */
61
+ httpMethod?: 'GET' | 'POST';
62
+ }
63
+ /** File upload options */
64
+ export interface FileUploadOptions {
65
+ /** The file to upload */
66
+ file: File | Blob;
67
+ /** File name */
68
+ fileName?: string;
69
+ /** Attach to this DocType */
70
+ doctype?: string;
71
+ /** Attach to this document name */
72
+ docname?: string;
73
+ /** Mark as private */
74
+ isPrivate?: boolean;
75
+ /** Upload progress callback */
76
+ onProgress?: (progress: number) => void;
77
+ }
78
+ /** Standard Frappe document fields present on every document */
79
+ export interface FrappeDocBase {
80
+ name: string;
81
+ owner: string;
82
+ creation: string;
83
+ modified: string;
84
+ modified_by: string;
85
+ doctype: string;
86
+ docstatus: 0 | 1 | 2;
87
+ idx?: number;
88
+ }
89
+ /** Generic Frappe document */
90
+ export type FrappeDoc<T extends Record<string, unknown> = Record<string, unknown>> = FrappeDocBase & T;
91
+ /** Standard Frappe API response wrapper */
92
+ export interface FrappeResponse<T = unknown> {
93
+ message?: T;
94
+ exc_type?: string;
95
+ exc?: string;
96
+ _server_messages?: string;
97
+ _error_message?: string;
98
+ }
99
+ /** Error thrown by FrappeClient */
100
+ export declare class FrappeApiError extends Error {
101
+ readonly httpStatus: number;
102
+ readonly excType?: string;
103
+ readonly serverMessages: string[];
104
+ readonly exc?: string;
105
+ constructor(message: string, httpStatus: number, excType?: string, serverMessages?: string[], exc?: string);
106
+ }
107
+ /** Configuration for FrappeClient */
108
+ export interface FrappeClientConfig {
109
+ /** Base URL of the Frappe site, e.g. 'https://mysite.frappe.cloud' or '' for same-origin */
110
+ baseUrl?: string;
111
+ /** Use token-based auth (for server-side / SSR) */
112
+ token?: {
113
+ apiKey: string;
114
+ apiSecret: string;
115
+ };
116
+ /** Custom headers to include in every request */
117
+ headers?: Record<string, string>;
118
+ /** Custom fetch implementation (useful for Next.js server components) */
119
+ fetchImpl?: typeof fetch;
120
+ }
121
+ /** Authentication state */
122
+ export interface AuthState {
123
+ isLoggedIn: boolean;
124
+ user: string | null;
125
+ userImage: string | null;
126
+ }
127
+ /** Login credentials */
128
+ export interface LoginCredentials {
129
+ username: string;
130
+ password: string;
131
+ }
132
+ /** File upload response */
133
+ export interface FileUploadResponse {
134
+ name: string;
135
+ file_name: string;
136
+ file_url: string;
137
+ is_private: boolean;
138
+ file_size: number;
139
+ }
140
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ // ─── Frappe API Types ───────────────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.FrappeApiError = void 0;
5
+ /** Error thrown by FrappeClient */
6
+ class FrappeApiError extends Error {
7
+ constructor(message, httpStatus, excType, serverMessages = [], exc) {
8
+ super(message);
9
+ this.name = 'FrappeApiError';
10
+ this.httpStatus = httpStatus;
11
+ this.excType = excType;
12
+ this.serverMessages = serverMessages;
13
+ this.exc = exc;
14
+ }
15
+ }
16
+ exports.FrappeApiError = FrappeApiError;
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":";AAAA,uEAAuE;;;AAiIvE,mCAAmC;AACnC,MAAa,cAAe,SAAQ,KAAK;IAMvC,YACE,OAAe,EACf,UAAkB,EAClB,OAAgB,EAChB,iBAA2B,EAAE,EAC7B,GAAY;QAEZ,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AApBD,wCAoBC"}