@proofkit/fmodata 0.1.0-alpha.9 → 0.1.0-beta.24

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 (163) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +655 -453
  3. package/dist/esm/client/batch-builder.d.ts +10 -9
  4. package/dist/esm/client/batch-builder.js +119 -56
  5. package/dist/esm/client/batch-builder.js.map +1 -1
  6. package/dist/esm/client/batch-request.js +16 -21
  7. package/dist/esm/client/batch-request.js.map +1 -1
  8. package/dist/esm/client/builders/default-select.d.ts +10 -0
  9. package/dist/esm/client/builders/default-select.js +41 -0
  10. package/dist/esm/client/builders/default-select.js.map +1 -0
  11. package/dist/esm/client/builders/expand-builder.d.ts +45 -0
  12. package/dist/esm/client/builders/expand-builder.js +185 -0
  13. package/dist/esm/client/builders/expand-builder.js.map +1 -0
  14. package/dist/esm/client/builders/index.d.ts +9 -0
  15. package/dist/esm/client/builders/query-string-builder.d.ts +18 -0
  16. package/dist/esm/client/builders/query-string-builder.js +21 -0
  17. package/dist/esm/client/builders/query-string-builder.js.map +1 -0
  18. package/dist/esm/client/builders/response-processor.d.ts +43 -0
  19. package/dist/esm/client/builders/response-processor.js +175 -0
  20. package/dist/esm/client/builders/response-processor.js.map +1 -0
  21. package/dist/esm/client/builders/select-mixin.d.ts +25 -0
  22. package/dist/esm/client/builders/select-mixin.js +28 -0
  23. package/dist/esm/client/builders/select-mixin.js.map +1 -0
  24. package/dist/esm/client/builders/select-utils.d.ts +18 -0
  25. package/dist/esm/client/builders/select-utils.js +30 -0
  26. package/dist/esm/client/builders/select-utils.js.map +1 -0
  27. package/dist/esm/client/builders/shared-types.d.ts +40 -0
  28. package/dist/esm/client/builders/table-utils.d.ts +35 -0
  29. package/dist/esm/client/builders/table-utils.js +44 -0
  30. package/dist/esm/client/builders/table-utils.js.map +1 -0
  31. package/dist/esm/client/database.d.ts +34 -22
  32. package/dist/esm/client/database.js +48 -84
  33. package/dist/esm/client/database.js.map +1 -1
  34. package/dist/esm/client/delete-builder.d.ts +25 -30
  35. package/dist/esm/client/delete-builder.js +45 -30
  36. package/dist/esm/client/delete-builder.js.map +1 -1
  37. package/dist/esm/client/entity-set.d.ts +35 -43
  38. package/dist/esm/client/entity-set.js +126 -52
  39. package/dist/esm/client/entity-set.js.map +1 -1
  40. package/dist/esm/client/error-parser.d.ts +12 -0
  41. package/dist/esm/client/error-parser.js +25 -0
  42. package/dist/esm/client/error-parser.js.map +1 -0
  43. package/dist/esm/client/filemaker-odata.d.ts +26 -7
  44. package/dist/esm/client/filemaker-odata.js +65 -42
  45. package/dist/esm/client/filemaker-odata.js.map +1 -1
  46. package/dist/esm/client/insert-builder.d.ts +19 -24
  47. package/dist/esm/client/insert-builder.js +94 -58
  48. package/dist/esm/client/insert-builder.js.map +1 -1
  49. package/dist/esm/client/query/expand-builder.d.ts +35 -0
  50. package/dist/esm/client/query/index.d.ts +4 -0
  51. package/dist/esm/client/query/query-builder.d.ts +132 -0
  52. package/dist/esm/client/query/query-builder.js +456 -0
  53. package/dist/esm/client/query/query-builder.js.map +1 -0
  54. package/dist/esm/client/query/response-processor.d.ts +25 -0
  55. package/dist/esm/client/query/types.d.ts +77 -0
  56. package/dist/esm/client/query/url-builder.d.ts +71 -0
  57. package/dist/esm/client/query/url-builder.js +100 -0
  58. package/dist/esm/client/query/url-builder.js.map +1 -0
  59. package/dist/esm/client/query-builder.d.ts +2 -115
  60. package/dist/esm/client/record-builder.d.ts +108 -36
  61. package/dist/esm/client/record-builder.js +284 -119
  62. package/dist/esm/client/record-builder.js.map +1 -1
  63. package/dist/esm/client/response-processor.d.ts +4 -9
  64. package/dist/esm/client/sanitize-json.d.ts +35 -0
  65. package/dist/esm/client/sanitize-json.js +27 -0
  66. package/dist/esm/client/sanitize-json.js.map +1 -0
  67. package/dist/esm/client/schema-manager.d.ts +5 -5
  68. package/dist/esm/client/schema-manager.js +45 -31
  69. package/dist/esm/client/schema-manager.js.map +1 -1
  70. package/dist/esm/client/update-builder.d.ts +34 -40
  71. package/dist/esm/client/update-builder.js +99 -58
  72. package/dist/esm/client/update-builder.js.map +1 -1
  73. package/dist/esm/client/webhook-builder.d.ts +126 -0
  74. package/dist/esm/client/webhook-builder.js +189 -0
  75. package/dist/esm/client/webhook-builder.js.map +1 -0
  76. package/dist/esm/errors.d.ts +19 -2
  77. package/dist/esm/errors.js +39 -4
  78. package/dist/esm/errors.js.map +1 -1
  79. package/dist/esm/index.d.ts +10 -8
  80. package/dist/esm/index.js +40 -10
  81. package/dist/esm/index.js.map +1 -1
  82. package/dist/esm/logger.d.ts +47 -0
  83. package/dist/esm/logger.js +69 -0
  84. package/dist/esm/logger.js.map +1 -0
  85. package/dist/esm/logger.test.d.ts +1 -0
  86. package/dist/esm/orm/column.d.ts +62 -0
  87. package/dist/esm/orm/column.js +63 -0
  88. package/dist/esm/orm/column.js.map +1 -0
  89. package/dist/esm/orm/field-builders.d.ts +164 -0
  90. package/dist/esm/orm/field-builders.js +158 -0
  91. package/dist/esm/orm/field-builders.js.map +1 -0
  92. package/dist/esm/orm/index.d.ts +5 -0
  93. package/dist/esm/orm/operators.d.ts +173 -0
  94. package/dist/esm/orm/operators.js +260 -0
  95. package/dist/esm/orm/operators.js.map +1 -0
  96. package/dist/esm/orm/table.d.ts +355 -0
  97. package/dist/esm/orm/table.js +202 -0
  98. package/dist/esm/orm/table.js.map +1 -0
  99. package/dist/esm/transform.d.ts +20 -21
  100. package/dist/esm/transform.js +44 -45
  101. package/dist/esm/transform.js.map +1 -1
  102. package/dist/esm/types.d.ts +96 -30
  103. package/dist/esm/types.js +7 -0
  104. package/dist/esm/types.js.map +1 -0
  105. package/dist/esm/validation.d.ts +22 -12
  106. package/dist/esm/validation.js +132 -85
  107. package/dist/esm/validation.js.map +1 -1
  108. package/package.json +34 -29
  109. package/src/client/batch-builder.ts +153 -89
  110. package/src/client/batch-request.ts +25 -41
  111. package/src/client/builders/default-select.ts +75 -0
  112. package/src/client/builders/expand-builder.ts +246 -0
  113. package/src/client/builders/index.ts +11 -0
  114. package/src/client/builders/query-string-builder.ts +46 -0
  115. package/src/client/builders/response-processor.ts +279 -0
  116. package/src/client/builders/select-mixin.ts +65 -0
  117. package/src/client/builders/select-utils.ts +59 -0
  118. package/src/client/builders/shared-types.ts +45 -0
  119. package/src/client/builders/table-utils.ts +83 -0
  120. package/src/client/database.ts +89 -183
  121. package/src/client/delete-builder.ts +74 -84
  122. package/src/client/entity-set.ts +286 -293
  123. package/src/client/error-parser.ts +41 -0
  124. package/src/client/filemaker-odata.ts +98 -66
  125. package/src/client/insert-builder.ts +157 -118
  126. package/src/client/query/expand-builder.ts +160 -0
  127. package/src/client/query/index.ts +14 -0
  128. package/src/client/query/query-builder.ts +729 -0
  129. package/src/client/query/response-processor.ts +226 -0
  130. package/src/client/query/types.ts +126 -0
  131. package/src/client/query/url-builder.ts +151 -0
  132. package/src/client/query-builder.ts +10 -1455
  133. package/src/client/record-builder.ts +575 -240
  134. package/src/client/response-processor.ts +15 -42
  135. package/src/client/sanitize-json.ts +64 -0
  136. package/src/client/schema-manager.ts +61 -76
  137. package/src/client/update-builder.ts +161 -143
  138. package/src/client/webhook-builder.ts +265 -0
  139. package/src/errors.ts +49 -16
  140. package/src/index.ts +99 -54
  141. package/src/logger.test.ts +34 -0
  142. package/src/logger.ts +116 -0
  143. package/src/orm/column.ts +106 -0
  144. package/src/orm/field-builders.ts +250 -0
  145. package/src/orm/index.ts +61 -0
  146. package/src/orm/operators.ts +473 -0
  147. package/src/orm/table.ts +741 -0
  148. package/src/transform.ts +90 -70
  149. package/src/types.ts +154 -113
  150. package/src/validation.ts +200 -115
  151. package/dist/esm/client/base-table.d.ts +0 -125
  152. package/dist/esm/client/base-table.js +0 -57
  153. package/dist/esm/client/base-table.js.map +0 -1
  154. package/dist/esm/client/query-builder.js +0 -896
  155. package/dist/esm/client/query-builder.js.map +0 -1
  156. package/dist/esm/client/table-occurrence.d.ts +0 -72
  157. package/dist/esm/client/table-occurrence.js +0 -74
  158. package/dist/esm/client/table-occurrence.js.map +0 -1
  159. package/dist/esm/filter-types.d.ts +0 -76
  160. package/src/client/base-table.ts +0 -175
  161. package/src/client/query-builder.ts.bak +0 -1457
  162. package/src/client/table-occurrence.ts +0 -175
  163. package/src/filter-types.ts +0 -97
@@ -1,9 +1,8 @@
1
1
  import type { StandardSchemaV1 } from "@standard-schema/spec";
2
- import type { BaseTable } from "./base-table";
3
- import type { ExecuteOptions } from "../types";
4
- import type { ExpandValidationConfig } from "../validation";
5
- import { ValidationError, ResponseStructureError } from "../errors";
2
+ import type { ResponseStructureError, ValidationError } from "../errors";
3
+ import type { FMTable } from "../orm/table";
6
4
  import { transformResponseFields } from "../transform";
5
+ import type { ExpandValidationConfig } from "../validation";
7
6
  import { validateListResponse, validateRecord } from "../validation";
8
7
 
9
8
  // Type for raw OData responses
@@ -24,30 +23,15 @@ export type ODataRecordResponse<T = unknown> = ODataResponse<
24
23
  >;
25
24
 
26
25
  /**
27
- * Strip OData annotations from a single record
28
- */
29
- export function stripODataAnnotations<T extends Record<string, unknown>>(
30
- record: ODataRecordResponse<T>,
31
- options?: ExecuteOptions,
32
- ): T {
33
- if (options?.includeODataAnnotations === true) {
34
- return record as T;
35
- }
36
- const { "@id": _id, "@editLink": _editLink, ...rest } = record;
37
- return rest as T;
38
- }
39
-
40
- /**
41
- * Transform field IDs back to names using the base table configuration
26
+ * Transform field IDs back to names using the table configuration
42
27
  */
43
28
  export function applyFieldTransformation<T extends Record<string, unknown>>(
44
29
  response: ODataResponse<T> | ODataListResponse<T>,
45
- baseTable: BaseTable<Record<string, StandardSchemaV1>, any, any, any>,
30
+ // biome-ignore lint/suspicious/noExplicitAny: Accepts any FMTable configuration
31
+ table: FMTable<any, any>,
46
32
  expandConfigs?: ExpandValidationConfig[],
47
33
  ): ODataResponse<T> | ODataListResponse<T> {
48
- return transformResponseFields(response, baseTable, expandConfigs) as
49
- | ODataResponse<T>
50
- | ODataListResponse<T>;
34
+ return transformResponseFields(response, table, expandConfigs) as ODataResponse<T> | ODataListResponse<T>;
51
35
  }
52
36
 
53
37
  /**
@@ -58,10 +42,7 @@ export async function applyValidation<T extends Record<string, unknown>>(
58
42
  schema?: Record<string, StandardSchemaV1>,
59
43
  selectedFields?: (keyof T)[],
60
44
  expandConfigs?: ExpandValidationConfig[],
61
- ): Promise<
62
- | { valid: true; data: T | T[] }
63
- | { valid: false; error: ValidationError | ResponseStructureError }
64
- > {
45
+ ): Promise<{ valid: true; data: T | T[] } | { valid: false; error: ValidationError | ResponseStructureError }> {
65
46
  if (Array.isArray(data)) {
66
47
  // Validate as a list
67
48
  const validation = await validateListResponse<T>(
@@ -74,27 +55,19 @@ export async function applyValidation<T extends Record<string, unknown>>(
74
55
  return { valid: false, error: validation.error };
75
56
  }
76
57
  return { valid: true, data: validation.data };
77
- } else {
78
- // Validate as a single record
79
- const validation = await validateRecord<T>(
80
- data,
81
- schema,
82
- selectedFields,
83
- expandConfigs,
84
- );
85
- if (!validation.valid) {
86
- return { valid: false, error: validation.error };
87
- }
88
- return { valid: true, data: validation.data };
89
58
  }
59
+ // Validate as a single record
60
+ const validation = await validateRecord<T>(data, schema, selectedFields, expandConfigs);
61
+ if (!validation.valid) {
62
+ return { valid: false, error: validation.error };
63
+ }
64
+ return { valid: true, data: validation.data };
90
65
  }
91
66
 
92
67
  /**
93
68
  * Extract value array from OData list response, or wrap single record in array
94
69
  */
95
- export function extractListValue<T>(
96
- response: ODataListResponse<T> | ODataRecordResponse<T>,
97
- ): T[] {
70
+ export function extractListValue<T>(response: ODataListResponse<T> | ODataRecordResponse<T>): T[] {
98
71
  if ("value" in response && Array.isArray(response.value)) {
99
72
  return response.value;
100
73
  }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * FileMaker OData API sometimes returns invalid JSON containing unquoted `?`
3
+ * characters as field values (e.g., `"fieldName": ?`), which causes JSON.parse()
4
+ * to fail. This module provides utilities to sanitize such responses before parsing.
5
+ */
6
+
7
+ import { ResponseParseError } from "../errors";
8
+
9
+ /**
10
+ * Sanitizes FileMaker OData JSON responses by replacing unquoted `?` values with `null`.
11
+ *
12
+ * FileMaker uses `?` to represent undefined/null values in its OData responses,
13
+ * but this is not valid JSON. This function converts those to proper `null` values.
14
+ *
15
+ * The regex uses two patterns:
16
+ * 1. `/:\s*\?(?=\s*[,}\]])/g` - for values in objects (after `:`)
17
+ * 2. `/(?<=[\[,])\s*\?(?=\s*[,\]])/g` - for values in arrays (after `[` or `,`)
18
+ *
19
+ * @param text - The raw response text from FileMaker OData API
20
+ * @returns Sanitized JSON string with `?` values replaced by `null`
21
+ *
22
+ * @example
23
+ * sanitizeFileMakerJson('{"field1": "valid", "field2": ?, "field3": null}')
24
+ * // Returns: '{"field1": "valid", "field2": null, "field3": null}'
25
+ */
26
+ export function sanitizeFileMakerJson(text: string): string {
27
+ // Replace unquoted ? values in objects (after colon)
28
+ // Also handles arrays when the array is a value in an object
29
+ let result = text.replace(/:\s*\?(?=\s*[,}\]])/g, ": null");
30
+
31
+ // Replace unquoted ? values directly in arrays (not after colon)
32
+ // e.g., [1, ?, 3] -> [1, null, 3]
33
+ result = result.replace(/(?<=[[,])\s*\?(?=\s*[,\]])/g, " null");
34
+
35
+ return result;
36
+ }
37
+
38
+ /**
39
+ * Safely parses a Response body as JSON, handling FileMaker's invalid JSON responses.
40
+ *
41
+ * This function reads the response as text first, sanitizes any invalid `?` values,
42
+ * and then parses the sanitized JSON. This approach handles the case where FileMaker
43
+ * returns a Content-Type of application/json but the body contains invalid JSON.
44
+ *
45
+ * @param response - The fetch Response object
46
+ * @returns Parsed JSON data
47
+ * @throws ResponseParseError if the JSON is still invalid after sanitization (includes sanitized text for debugging)
48
+ */
49
+ export async function safeJsonParse<T = unknown>(response: Response): Promise<T> {
50
+ const text = await response.text();
51
+ const sanitized = sanitizeFileMakerJson(text);
52
+ try {
53
+ return JSON.parse(sanitized) as T;
54
+ } catch (err) {
55
+ throw new ResponseParseError(
56
+ response.url,
57
+ `Failed to parse response as JSON: ${err instanceof Error ? err.message : "Unknown error"}`,
58
+ {
59
+ rawText: sanitized,
60
+ cause: err instanceof Error ? err : undefined,
61
+ },
62
+ );
63
+ }
64
+ }
@@ -1,14 +1,14 @@
1
1
  import type { FFetchOptions } from "@fetchkit/ffetch";
2
2
  import type { ExecutionContext } from "../types";
3
3
 
4
- type GenericField = {
4
+ interface GenericField {
5
5
  name: string;
6
6
  nullable?: boolean;
7
7
  primary?: boolean;
8
8
  unique?: boolean;
9
9
  global?: boolean;
10
10
  repetitions?: number;
11
- };
11
+ }
12
12
 
13
13
  type StringField = GenericField & {
14
14
  type: "string";
@@ -40,54 +40,41 @@ type ContainerField = GenericField & {
40
40
  externalSecurePath?: string;
41
41
  };
42
42
 
43
- export type Field =
44
- | StringField
45
- | NumericField
46
- | DateField
47
- | TimeField
48
- | TimestampField
49
- | ContainerField;
50
-
51
- export type {
52
- StringField,
53
- NumericField,
54
- DateField,
55
- TimeField,
56
- TimestampField,
57
- ContainerField,
58
- };
43
+ export type Field = StringField | NumericField | DateField | TimeField | TimestampField | ContainerField;
44
+
45
+ export type { StringField, NumericField, DateField, TimeField, TimestampField, ContainerField };
59
46
 
60
47
  type FileMakerField = Omit<Field, "type" | "repetitions" | "maxLength"> & {
61
48
  type: string;
62
49
  };
63
50
 
64
- type TableDefinition = {
51
+ interface TableDefinition {
65
52
  tableName: string;
66
53
  fields: FileMakerField[];
67
- };
54
+ }
68
55
 
69
56
  export class SchemaManager {
70
- public constructor(
71
- private readonly databaseName: string,
72
- private readonly context: ExecutionContext,
73
- ) {}
57
+ private readonly databaseName: string;
58
+ private readonly context: ExecutionContext;
74
59
 
75
- public async createTable(
60
+ constructor(databaseName: string, context: ExecutionContext) {
61
+ this.databaseName = databaseName;
62
+ this.context = context;
63
+ }
64
+
65
+ async createTable(
76
66
  tableName: string,
77
67
  fields: Field[],
78
68
  options?: RequestInit & FFetchOptions,
79
69
  ): Promise<TableDefinition> {
80
- const result = await this.context._makeRequest<TableDefinition>(
81
- `/${this.databaseName}/FileMaker_Tables`,
82
- {
83
- method: "POST",
84
- body: JSON.stringify({
85
- tableName,
86
- fields: fields.map(SchemaManager.compileFieldDefinition),
87
- }),
88
- ...options,
89
- },
90
- );
70
+ const result = await this.context._makeRequest<TableDefinition>(`/${this.databaseName}/FileMaker_Tables`, {
71
+ method: "POST",
72
+ body: JSON.stringify({
73
+ tableName,
74
+ fields: fields.map(SchemaManager.compileFieldDefinition),
75
+ }),
76
+ ...options,
77
+ });
91
78
 
92
79
  if (result.error) {
93
80
  throw result.error;
@@ -96,11 +83,7 @@ export class SchemaManager {
96
83
  return result.data;
97
84
  }
98
85
 
99
- public async addFields(
100
- tableName: string,
101
- fields: Field[],
102
- options?: RequestInit & FFetchOptions,
103
- ): Promise<TableDefinition> {
86
+ async addFields(tableName: string, fields: Field[], options?: RequestInit & FFetchOptions): Promise<TableDefinition> {
104
87
  const result = await this.context._makeRequest<TableDefinition>(
105
88
  `/${this.databaseName}/FileMaker_Tables/${tableName}`,
106
89
  {
@@ -119,39 +102,29 @@ export class SchemaManager {
119
102
  return result.data;
120
103
  }
121
104
 
122
- public async deleteTable(
123
- tableName: string,
124
- options?: RequestInit & FFetchOptions,
125
- ): Promise<void> {
126
- const result = await this.context._makeRequest(
127
- `/${this.databaseName}/FileMaker_Tables/${tableName}`,
128
- { method: "DELETE", ...options },
129
- );
105
+ async deleteTable(tableName: string, options?: RequestInit & FFetchOptions): Promise<void> {
106
+ const result = await this.context._makeRequest(`/${this.databaseName}/FileMaker_Tables/${tableName}`, {
107
+ method: "DELETE",
108
+ ...options,
109
+ });
130
110
 
131
111
  if (result.error) {
132
112
  throw result.error;
133
113
  }
134
114
  }
135
115
 
136
- public async deleteField(
137
- tableName: string,
138
- fieldName: string,
139
- options?: RequestInit & FFetchOptions,
140
- ): Promise<void> {
141
- const result = await this.context._makeRequest(
142
- `/${this.databaseName}/FileMaker_Tables/${tableName}/${fieldName}`,
143
- {
144
- method: "DELETE",
145
- ...options,
146
- },
147
- );
116
+ async deleteField(tableName: string, fieldName: string, options?: RequestInit & FFetchOptions): Promise<void> {
117
+ const result = await this.context._makeRequest(`/${this.databaseName}/FileMaker_Tables/${tableName}/${fieldName}`, {
118
+ method: "DELETE",
119
+ ...options,
120
+ });
148
121
 
149
122
  if (result.error) {
150
123
  throw result.error;
151
124
  }
152
125
  }
153
126
 
154
- public async createIndex(
127
+ async createIndex(
155
128
  tableName: string,
156
129
  fieldName: string,
157
130
  options?: RequestInit & FFetchOptions,
@@ -172,11 +145,7 @@ export class SchemaManager {
172
145
  return result.data;
173
146
  }
174
147
 
175
- public async deleteIndex(
176
- tableName: string,
177
- fieldName: string,
178
- options?: RequestInit & FFetchOptions,
179
- ): Promise<void> {
148
+ async deleteIndex(tableName: string, fieldName: string, options?: RequestInit & FFetchOptions): Promise<void> {
180
149
  const result = await this.context._makeRequest(
181
150
  `/${this.databaseName}/FileMaker_Indexes/${tableName}/${fieldName}`,
182
151
  {
@@ -209,36 +178,52 @@ export class SchemaManager {
209
178
  }
210
179
 
211
180
  // Build the result object, excluding type, maxLength, and repetitions
181
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic result object construction
212
182
  const result: any = {
213
183
  name: field.name,
214
184
  type,
215
185
  };
216
186
 
217
187
  // Add optional properties that FileMaker expects
218
- if (field.nullable !== undefined) result.nullable = field.nullable;
219
- if (field.primary !== undefined) result.primary = field.primary;
220
- if (field.unique !== undefined) result.unique = field.unique;
221
- if (field.global !== undefined) result.global = field.global;
188
+ if (field.nullable !== undefined) {
189
+ result.nullable = field.nullable;
190
+ }
191
+ if (field.primary !== undefined) {
192
+ result.primary = field.primary;
193
+ }
194
+ if (field.unique !== undefined) {
195
+ result.unique = field.unique;
196
+ }
197
+ if (field.global !== undefined) {
198
+ result.global = field.global;
199
+ }
222
200
 
223
201
  // Add type-specific properties
224
202
  if (field.type === "string") {
225
203
  const stringField = field as StringField;
226
- if (stringField.default !== undefined)
204
+ if (stringField.default !== undefined) {
227
205
  result.default = stringField.default;
206
+ }
228
207
  } else if (field.type === "date") {
229
208
  const dateField = field as DateField;
230
- if (dateField.default !== undefined) result.default = dateField.default;
209
+ if (dateField.default !== undefined) {
210
+ result.default = dateField.default;
211
+ }
231
212
  } else if (field.type === "time") {
232
213
  const timeField = field as TimeField;
233
- if (timeField.default !== undefined) result.default = timeField.default;
214
+ if (timeField.default !== undefined) {
215
+ result.default = timeField.default;
216
+ }
234
217
  } else if (field.type === "timestamp") {
235
218
  const timestampField = field as TimestampField;
236
- if (timestampField.default !== undefined)
219
+ if (timestampField.default !== undefined) {
237
220
  result.default = timestampField.default;
221
+ }
238
222
  } else if (field.type === "container") {
239
223
  const containerField = field as ContainerField;
240
- if (containerField.externalSecurePath !== undefined)
224
+ if (containerField.externalSecurePath !== undefined) {
241
225
  result.externalSecurePath = containerField.externalSecurePath;
226
+ }
242
227
  }
243
228
 
244
229
  return result as FileMakerField;