@proofkit/fmodata 0.1.0-alpha.4 → 0.1.0-alpha.6

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 (57) hide show
  1. package/README.md +357 -28
  2. package/dist/esm/client/base-table.d.ts +122 -5
  3. package/dist/esm/client/base-table.js +46 -5
  4. package/dist/esm/client/base-table.js.map +1 -1
  5. package/dist/esm/client/database.d.ts +20 -3
  6. package/dist/esm/client/database.js +62 -13
  7. package/dist/esm/client/database.js.map +1 -1
  8. package/dist/esm/client/delete-builder.js +24 -27
  9. package/dist/esm/client/delete-builder.js.map +1 -1
  10. package/dist/esm/client/entity-set.d.ts +9 -6
  11. package/dist/esm/client/entity-set.js +5 -1
  12. package/dist/esm/client/entity-set.js.map +1 -1
  13. package/dist/esm/client/filemaker-odata.d.ts +17 -4
  14. package/dist/esm/client/filemaker-odata.js +90 -27
  15. package/dist/esm/client/filemaker-odata.js.map +1 -1
  16. package/dist/esm/client/insert-builder.js +45 -34
  17. package/dist/esm/client/insert-builder.js.map +1 -1
  18. package/dist/esm/client/query-builder.d.ts +7 -2
  19. package/dist/esm/client/query-builder.js +273 -202
  20. package/dist/esm/client/query-builder.js.map +1 -1
  21. package/dist/esm/client/record-builder.d.ts +2 -2
  22. package/dist/esm/client/record-builder.js +50 -40
  23. package/dist/esm/client/record-builder.js.map +1 -1
  24. package/dist/esm/client/table-occurrence.d.ts +66 -2
  25. package/dist/esm/client/table-occurrence.js +36 -1
  26. package/dist/esm/client/table-occurrence.js.map +1 -1
  27. package/dist/esm/client/update-builder.js +39 -35
  28. package/dist/esm/client/update-builder.js.map +1 -1
  29. package/dist/esm/errors.d.ts +60 -0
  30. package/dist/esm/errors.js +122 -0
  31. package/dist/esm/errors.js.map +1 -0
  32. package/dist/esm/index.d.ts +5 -2
  33. package/dist/esm/index.js +25 -3
  34. package/dist/esm/index.js.map +1 -1
  35. package/dist/esm/transform.d.ts +56 -0
  36. package/dist/esm/transform.js +107 -0
  37. package/dist/esm/transform.js.map +1 -0
  38. package/dist/esm/types.d.ts +21 -5
  39. package/dist/esm/validation.d.ts +6 -3
  40. package/dist/esm/validation.js +104 -33
  41. package/dist/esm/validation.js.map +1 -1
  42. package/package.json +10 -1
  43. package/src/client/base-table.ts +155 -8
  44. package/src/client/database.ts +116 -13
  45. package/src/client/delete-builder.ts +42 -43
  46. package/src/client/entity-set.ts +21 -11
  47. package/src/client/filemaker-odata.ts +132 -34
  48. package/src/client/insert-builder.ts +69 -37
  49. package/src/client/query-builder.ts +345 -233
  50. package/src/client/record-builder.ts +84 -59
  51. package/src/client/table-occurrence.ts +118 -4
  52. package/src/client/update-builder.ts +77 -49
  53. package/src/errors.ts +185 -0
  54. package/src/index.ts +30 -1
  55. package/src/transform.ts +236 -0
  56. package/src/types.ts +112 -34
  57. package/src/validation.ts +120 -36
@@ -8,6 +8,11 @@ import type {
8
8
  import type { TableOccurrence } from "./table-occurrence";
9
9
  import { validateSingleResponse } from "../validation";
10
10
  import { type FFetchOptions } from "@fetchkit/ffetch";
11
+ import {
12
+ transformFieldNamesToIds,
13
+ transformTableName,
14
+ transformResponseFields,
15
+ } from "../transform";
11
16
 
12
17
  export class InsertBuilder<
13
18
  T extends Record<string, any>,
@@ -37,57 +42,84 @@ export class InsertBuilder<
37
42
  async execute(
38
43
  options?: RequestInit & FFetchOptions,
39
44
  ): Promise<Result<T & ODataRecordMetadata>> {
40
- try {
41
- const url = `/${this.databaseName}/${this.tableName}`;
42
-
43
- // Make POST request with JSON body
44
- const response = await this.context._makeRequest(url, {
45
- method: "POST",
46
- headers: {
47
- "Content-Type": "application/json",
48
- },
49
- body: JSON.stringify(this.data),
50
- ...options,
51
- });
52
-
53
- // Get schema from occurrence if available
54
- const schema = this.occurrence?.baseTable?.schema;
55
-
56
- // Validate the response (FileMaker returns the created record)
57
- const validation = await validateSingleResponse<T>(
45
+ // Transform table name to FMTID if using entity IDs
46
+ const tableId = this.occurrence
47
+ ? transformTableName(this.occurrence)
48
+ : this.tableName;
49
+ const url = `/${this.databaseName}/${tableId}`;
50
+
51
+ // Transform field names to FMFIDs if using entity IDs
52
+ const transformedData = this.occurrence?.baseTable
53
+ ? transformFieldNamesToIds(this.data, this.occurrence.baseTable)
54
+ : this.data;
55
+
56
+ // Make POST request with JSON body
57
+ const result = await this.context._makeRequest(url, {
58
+ method: "POST",
59
+ headers: {
60
+ "Content-Type": "application/json",
61
+ },
62
+ body: JSON.stringify(transformedData),
63
+ ...options,
64
+ });
65
+
66
+ if (result.error) {
67
+ return { data: undefined, error: result.error };
68
+ }
69
+
70
+ let response = result.data;
71
+
72
+ // Transform response field IDs back to names if using entity IDs
73
+ if (this.occurrence?.baseTable) {
74
+ response = transformResponseFields(
58
75
  response,
59
- schema,
60
- undefined, // No selected fields for insert
61
- undefined, // No expand configs
62
- "exact", // Expect exactly one record
76
+ this.occurrence.baseTable,
77
+ undefined, // No expand configs for insert
63
78
  );
79
+ }
80
+
81
+ // Get schema from occurrence if available
82
+ const schema = this.occurrence?.baseTable?.schema;
64
83
 
65
- if (!validation.valid) {
66
- return { data: undefined, error: validation.error };
67
- }
84
+ // Validate the response (FileMaker returns the created record)
85
+ const validation = await validateSingleResponse<T>(
86
+ response,
87
+ schema,
88
+ undefined, // No selected fields for insert
89
+ undefined, // No expand configs
90
+ "exact", // Expect exactly one record
91
+ );
68
92
 
69
- // Handle null response (shouldn't happen for insert, but handle it)
70
- if (validation.data === null) {
71
- return {
72
- data: undefined,
73
- error: new Error("Insert operation returned null response"),
74
- };
75
- }
93
+ if (!validation.valid) {
94
+ return { data: undefined, error: validation.error };
95
+ }
76
96
 
77
- return { data: validation.data, error: undefined };
78
- } catch (error) {
97
+ // Handle null response (shouldn't happen for insert, but handle it)
98
+ if (validation.data === null) {
79
99
  return {
80
100
  data: undefined,
81
- error: error instanceof Error ? error : new Error(String(error)),
101
+ error: new Error("Insert operation returned null response"),
82
102
  };
83
103
  }
104
+
105
+ return { data: validation.data, error: undefined };
84
106
  }
85
107
 
86
108
  getRequestConfig(): { method: string; url: string; body?: any } {
109
+ // Transform table name to FMTID if using entity IDs
110
+ const tableId = this.occurrence
111
+ ? transformTableName(this.occurrence)
112
+ : this.tableName;
113
+
114
+ // Transform field names to FMFIDs if using entity IDs
115
+ const transformedData = this.occurrence?.baseTable
116
+ ? transformFieldNamesToIds(this.data, this.occurrence.baseTable)
117
+ : this.data;
118
+
87
119
  return {
88
120
  method: "POST",
89
- url: `/${this.databaseName}/${this.tableName}`,
90
- body: JSON.stringify(this.data),
121
+ url: `/${this.databaseName}/${tableId}`,
122
+ body: JSON.stringify(transformedData),
91
123
  };
92
124
  }
93
125
  }