@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.
- package/LICENSE.md +21 -0
- package/README.md +655 -453
- package/dist/esm/client/batch-builder.d.ts +10 -9
- package/dist/esm/client/batch-builder.js +119 -56
- package/dist/esm/client/batch-builder.js.map +1 -1
- package/dist/esm/client/batch-request.js +16 -21
- package/dist/esm/client/batch-request.js.map +1 -1
- package/dist/esm/client/builders/default-select.d.ts +10 -0
- package/dist/esm/client/builders/default-select.js +41 -0
- package/dist/esm/client/builders/default-select.js.map +1 -0
- package/dist/esm/client/builders/expand-builder.d.ts +45 -0
- package/dist/esm/client/builders/expand-builder.js +185 -0
- package/dist/esm/client/builders/expand-builder.js.map +1 -0
- package/dist/esm/client/builders/index.d.ts +9 -0
- package/dist/esm/client/builders/query-string-builder.d.ts +18 -0
- package/dist/esm/client/builders/query-string-builder.js +21 -0
- package/dist/esm/client/builders/query-string-builder.js.map +1 -0
- package/dist/esm/client/builders/response-processor.d.ts +43 -0
- package/dist/esm/client/builders/response-processor.js +175 -0
- package/dist/esm/client/builders/response-processor.js.map +1 -0
- package/dist/esm/client/builders/select-mixin.d.ts +25 -0
- package/dist/esm/client/builders/select-mixin.js +28 -0
- package/dist/esm/client/builders/select-mixin.js.map +1 -0
- package/dist/esm/client/builders/select-utils.d.ts +18 -0
- package/dist/esm/client/builders/select-utils.js +30 -0
- package/dist/esm/client/builders/select-utils.js.map +1 -0
- package/dist/esm/client/builders/shared-types.d.ts +40 -0
- package/dist/esm/client/builders/table-utils.d.ts +35 -0
- package/dist/esm/client/builders/table-utils.js +44 -0
- package/dist/esm/client/builders/table-utils.js.map +1 -0
- package/dist/esm/client/database.d.ts +34 -22
- package/dist/esm/client/database.js +48 -84
- package/dist/esm/client/database.js.map +1 -1
- package/dist/esm/client/delete-builder.d.ts +25 -30
- package/dist/esm/client/delete-builder.js +45 -30
- package/dist/esm/client/delete-builder.js.map +1 -1
- package/dist/esm/client/entity-set.d.ts +35 -43
- package/dist/esm/client/entity-set.js +126 -52
- package/dist/esm/client/entity-set.js.map +1 -1
- package/dist/esm/client/error-parser.d.ts +12 -0
- package/dist/esm/client/error-parser.js +25 -0
- package/dist/esm/client/error-parser.js.map +1 -0
- package/dist/esm/client/filemaker-odata.d.ts +26 -7
- package/dist/esm/client/filemaker-odata.js +65 -42
- package/dist/esm/client/filemaker-odata.js.map +1 -1
- package/dist/esm/client/insert-builder.d.ts +19 -24
- package/dist/esm/client/insert-builder.js +94 -58
- package/dist/esm/client/insert-builder.js.map +1 -1
- package/dist/esm/client/query/expand-builder.d.ts +35 -0
- package/dist/esm/client/query/index.d.ts +4 -0
- package/dist/esm/client/query/query-builder.d.ts +132 -0
- package/dist/esm/client/query/query-builder.js +456 -0
- package/dist/esm/client/query/query-builder.js.map +1 -0
- package/dist/esm/client/query/response-processor.d.ts +25 -0
- package/dist/esm/client/query/types.d.ts +77 -0
- package/dist/esm/client/query/url-builder.d.ts +71 -0
- package/dist/esm/client/query/url-builder.js +100 -0
- package/dist/esm/client/query/url-builder.js.map +1 -0
- package/dist/esm/client/query-builder.d.ts +2 -115
- package/dist/esm/client/record-builder.d.ts +108 -36
- package/dist/esm/client/record-builder.js +284 -119
- package/dist/esm/client/record-builder.js.map +1 -1
- package/dist/esm/client/response-processor.d.ts +4 -9
- package/dist/esm/client/sanitize-json.d.ts +35 -0
- package/dist/esm/client/sanitize-json.js +27 -0
- package/dist/esm/client/sanitize-json.js.map +1 -0
- package/dist/esm/client/schema-manager.d.ts +5 -5
- package/dist/esm/client/schema-manager.js +45 -31
- package/dist/esm/client/schema-manager.js.map +1 -1
- package/dist/esm/client/update-builder.d.ts +34 -40
- package/dist/esm/client/update-builder.js +99 -58
- package/dist/esm/client/update-builder.js.map +1 -1
- package/dist/esm/client/webhook-builder.d.ts +126 -0
- package/dist/esm/client/webhook-builder.js +189 -0
- package/dist/esm/client/webhook-builder.js.map +1 -0
- package/dist/esm/errors.d.ts +19 -2
- package/dist/esm/errors.js +39 -4
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.d.ts +10 -8
- package/dist/esm/index.js +40 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logger.d.ts +47 -0
- package/dist/esm/logger.js +69 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/logger.test.d.ts +1 -0
- package/dist/esm/orm/column.d.ts +62 -0
- package/dist/esm/orm/column.js +63 -0
- package/dist/esm/orm/column.js.map +1 -0
- package/dist/esm/orm/field-builders.d.ts +164 -0
- package/dist/esm/orm/field-builders.js +158 -0
- package/dist/esm/orm/field-builders.js.map +1 -0
- package/dist/esm/orm/index.d.ts +5 -0
- package/dist/esm/orm/operators.d.ts +173 -0
- package/dist/esm/orm/operators.js +260 -0
- package/dist/esm/orm/operators.js.map +1 -0
- package/dist/esm/orm/table.d.ts +355 -0
- package/dist/esm/orm/table.js +202 -0
- package/dist/esm/orm/table.js.map +1 -0
- package/dist/esm/transform.d.ts +20 -21
- package/dist/esm/transform.js +44 -45
- package/dist/esm/transform.js.map +1 -1
- package/dist/esm/types.d.ts +96 -30
- package/dist/esm/types.js +7 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/validation.d.ts +22 -12
- package/dist/esm/validation.js +132 -85
- package/dist/esm/validation.js.map +1 -1
- package/package.json +34 -29
- package/src/client/batch-builder.ts +153 -89
- package/src/client/batch-request.ts +25 -41
- package/src/client/builders/default-select.ts +75 -0
- package/src/client/builders/expand-builder.ts +246 -0
- package/src/client/builders/index.ts +11 -0
- package/src/client/builders/query-string-builder.ts +46 -0
- package/src/client/builders/response-processor.ts +279 -0
- package/src/client/builders/select-mixin.ts +65 -0
- package/src/client/builders/select-utils.ts +59 -0
- package/src/client/builders/shared-types.ts +45 -0
- package/src/client/builders/table-utils.ts +83 -0
- package/src/client/database.ts +89 -183
- package/src/client/delete-builder.ts +74 -84
- package/src/client/entity-set.ts +286 -293
- package/src/client/error-parser.ts +41 -0
- package/src/client/filemaker-odata.ts +98 -66
- package/src/client/insert-builder.ts +157 -118
- package/src/client/query/expand-builder.ts +160 -0
- package/src/client/query/index.ts +14 -0
- package/src/client/query/query-builder.ts +729 -0
- package/src/client/query/response-processor.ts +226 -0
- package/src/client/query/types.ts +126 -0
- package/src/client/query/url-builder.ts +151 -0
- package/src/client/query-builder.ts +10 -1455
- package/src/client/record-builder.ts +575 -240
- package/src/client/response-processor.ts +15 -42
- package/src/client/sanitize-json.ts +64 -0
- package/src/client/schema-manager.ts +61 -76
- package/src/client/update-builder.ts +161 -143
- package/src/client/webhook-builder.ts +265 -0
- package/src/errors.ts +49 -16
- package/src/index.ts +99 -54
- package/src/logger.test.ts +34 -0
- package/src/logger.ts +116 -0
- package/src/orm/column.ts +106 -0
- package/src/orm/field-builders.ts +250 -0
- package/src/orm/index.ts +61 -0
- package/src/orm/operators.ts +473 -0
- package/src/orm/table.ts +741 -0
- package/src/transform.ts +90 -70
- package/src/types.ts +154 -113
- package/src/validation.ts +200 -115
- package/dist/esm/client/base-table.d.ts +0 -125
- package/dist/esm/client/base-table.js +0 -57
- package/dist/esm/client/base-table.js.map +0 -1
- package/dist/esm/client/query-builder.js +0 -896
- package/dist/esm/client/query-builder.js.map +0 -1
- package/dist/esm/client/table-occurrence.d.ts +0 -72
- package/dist/esm/client/table-occurrence.js +0 -74
- package/dist/esm/client/table-occurrence.js.map +0 -1
- package/dist/esm/filter-types.d.ts +0 -76
- package/src/client/base-table.ts +0 -175
- package/src/client/query-builder.ts.bak +0 -1457
- package/src/client/table-occurrence.ts +0 -175
- package/src/filter-types.ts +0 -97
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
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
|
-
*
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
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
|
-
|
|
51
|
+
interface TableDefinition {
|
|
65
52
|
tableName: string;
|
|
66
53
|
fields: FileMakerField[];
|
|
67
|
-
}
|
|
54
|
+
}
|
|
68
55
|
|
|
69
56
|
export class SchemaManager {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
private readonly context: ExecutionContext,
|
|
73
|
-
) {}
|
|
57
|
+
private readonly databaseName: string;
|
|
58
|
+
private readonly context: ExecutionContext;
|
|
74
59
|
|
|
75
|
-
|
|
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
|
-
|
|
82
|
-
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
123
|
-
tableName
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
137
|
-
tableName
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
if (field.
|
|
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)
|
|
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)
|
|
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;
|