@addai/tables-mcp 0.7.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.
- package/README.md +127 -0
- package/dist/api-client.d.ts +12 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +53 -0
- package/dist/api-client.js.map +1 -0
- package/dist/helpers/column-settings.d.ts +25 -0
- package/dist/helpers/column-settings.d.ts.map +1 -0
- package/dist/helpers/column-settings.js +96 -0
- package/dist/helpers/column-settings.js.map +1 -0
- package/dist/helpers/column-types.d.ts +8 -0
- package/dist/helpers/column-types.d.ts.map +1 -0
- package/dist/helpers/column-types.js +83 -0
- package/dist/helpers/column-types.js.map +1 -0
- package/dist/helpers/errors.d.ts +16 -0
- package/dist/helpers/errors.d.ts.map +1 -0
- package/dist/helpers/errors.js +19 -0
- package/dist/helpers/errors.js.map +1 -0
- package/dist/helpers/mapped-columns.d.ts +21 -0
- package/dist/helpers/mapped-columns.d.ts.map +1 -0
- package/dist/helpers/mapped-columns.js +119 -0
- package/dist/helpers/mapped-columns.js.map +1 -0
- package/dist/helpers/validate-options.d.ts +34 -0
- package/dist/helpers/validate-options.d.ts.map +1 -0
- package/dist/helpers/validate-options.js +120 -0
- package/dist/helpers/validate-options.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logo.d.ts +2 -0
- package/dist/logo.d.ts.map +1 -0
- package/dist/logo.js +64 -0
- package/dist/logo.js.map +1 -0
- package/dist/preview.d.ts +3 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +4 -0
- package/dist/preview.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +136 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +128 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/comments.d.ts +4 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +63 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/dashboards.d.ts +4 -0
- package/dist/tools/dashboards.d.ts.map +1 -0
- package/dist/tools/dashboards.js +560 -0
- package/dist/tools/dashboards.js.map +1 -0
- package/dist/tools/discovery.d.ts +4 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +115 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/files.d.ts +4 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +115 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/folders.d.ts +4 -0
- package/dist/tools/folders.d.ts.map +1 -0
- package/dist/tools/folders.js +164 -0
- package/dist/tools/folders.js.map +1 -0
- package/dist/tools/history.d.ts +4 -0
- package/dist/tools/history.d.ts.map +1 -0
- package/dist/tools/history.js +50 -0
- package/dist/tools/history.js.map +1 -0
- package/dist/tools/rows.d.ts +4 -0
- package/dist/tools/rows.d.ts.map +1 -0
- package/dist/tools/rows.js +244 -0
- package/dist/tools/rows.js.map +1 -0
- package/dist/tools/search.d.ts +4 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +89 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/structure.d.ts +4 -0
- package/dist/tools/structure.d.ts.map +1 -0
- package/dist/tools/structure.js +172 -0
- package/dist/tools/structure.js.map +1 -0
- package/dist/tools/views.d.ts +4 -0
- package/dist/tools/views.d.ts.map +1 -0
- package/dist/tools/views.js +169 -0
- package/dist/tools/views.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# aitables-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for [AiTables](https://tables.add.ai) — lets Claude Code (and Claude Desktop) read and manage your AiTables databases, tables, and rows.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### 1. Get your API key
|
|
8
|
+
|
|
9
|
+
In AiTables, go to any database → click the dropdown menu → **API Keys** → create a new key with the permissions you need.
|
|
10
|
+
|
|
11
|
+
### 2. Configure Claude Code
|
|
12
|
+
|
|
13
|
+
Add to your project's `.mcp.json` (or `~/.claude.json` for global access):
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"mcpServers": {
|
|
18
|
+
"aitables": {
|
|
19
|
+
"command": "npx",
|
|
20
|
+
"args": ["-y", "aitables-mcp"],
|
|
21
|
+
"env": {
|
|
22
|
+
"AITABLES_API_KEY": "ait_user_xxxxxxxxxxxx"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. Use it
|
|
30
|
+
|
|
31
|
+
Just talk to Claude naturally:
|
|
32
|
+
|
|
33
|
+
- *"What databases do I have?"*
|
|
34
|
+
- *"Show me the columns in my Projects table"*
|
|
35
|
+
- *"Create a task tracker with Status, Priority, and Due Date columns"*
|
|
36
|
+
- *"Add a row: Status = Todo, Priority = High, Due Date = 2026-04-01"*
|
|
37
|
+
- *"Find all rows mentioning 'urgent'"*
|
|
38
|
+
|
|
39
|
+
## Tools
|
|
40
|
+
|
|
41
|
+
| Tool | Description |
|
|
42
|
+
|------|-------------|
|
|
43
|
+
| `list_workspaces` | List accessible workspaces |
|
|
44
|
+
| `list_databases` | List databases (optionally by workspace) |
|
|
45
|
+
| `create_database` | Create a database in a workspace |
|
|
46
|
+
| `get_database` | Get a single database |
|
|
47
|
+
| `update_database` | Rename / re-describe / re-icon a database |
|
|
48
|
+
| `delete_database` | Delete a database and all its contents |
|
|
49
|
+
| `list_tables` | List tables in a database |
|
|
50
|
+
| `get_table_schema` | Get column names, types, and settings |
|
|
51
|
+
| `create_table` | Create a table with columns |
|
|
52
|
+
| `update_table` | Rename / re-describe / re-icon a table |
|
|
53
|
+
| `delete_table` | Delete a table and all its rows |
|
|
54
|
+
| `add_columns` | Add columns to a table |
|
|
55
|
+
| `update_column` | Update column name/options/settings |
|
|
56
|
+
| `delete_column` | Delete a column and its data |
|
|
57
|
+
| `get_row` | Fetch one record by ID — resolves its table automatically when `table_id` is omitted |
|
|
58
|
+
| `list_rows` | Query rows with filters, sorting, pagination |
|
|
59
|
+
| `create_rows` | Create one or more rows |
|
|
60
|
+
| `update_rows` | Update specific cells in rows |
|
|
61
|
+
| `delete_rows` | Delete rows |
|
|
62
|
+
| `search_rows` | Cross-column text search |
|
|
63
|
+
| `export_table` | Export all table data |
|
|
64
|
+
| `list_table_folders` | List folders that group tables in a database |
|
|
65
|
+
| `create_table_folder` | Create a folder for tables (nestable) |
|
|
66
|
+
| `update_table_folder` | Rename / re-icon / re-color a table folder |
|
|
67
|
+
| `delete_table_folder` | Remove a table folder (tables survive) |
|
|
68
|
+
| `move_table_to_folder` | Move a table into a folder (or to root) |
|
|
69
|
+
| `list_database_folders` | List folders that group databases in a workspace |
|
|
70
|
+
| `create_database_folder` | Create a folder for databases |
|
|
71
|
+
| `update_database_folder` | Rename / re-icon / re-color a database folder |
|
|
72
|
+
| `delete_database_folder` | Remove a database folder (databases survive) |
|
|
73
|
+
| `move_database_to_folder` | Move a database into a folder (or to root) |
|
|
74
|
+
| `list_views` | List a table's saved views |
|
|
75
|
+
| `get_view` | Get one view incl. full settings |
|
|
76
|
+
| `create_view` | Create a view (table/kanban/calendar/…) |
|
|
77
|
+
| `update_view` | Update view name/type/settings/public |
|
|
78
|
+
| `delete_view` | Delete a view (not the last one) |
|
|
79
|
+
| `reorder_views` | Reorder a table's views |
|
|
80
|
+
| `list_view_shares` | List public share links for a view |
|
|
81
|
+
| `create_view_share` | Create a public share link |
|
|
82
|
+
| `deactivate_view_share` | Revoke a share link |
|
|
83
|
+
| `get_row_history` | Edit history for a single row |
|
|
84
|
+
| `get_table_history` | Paginated edit history for a table |
|
|
85
|
+
| `upload_file` | Upload a real local file into a FILE column (any size) |
|
|
86
|
+
|
|
87
|
+
## Smart Column Handling
|
|
88
|
+
|
|
89
|
+
When you create select/multiselect columns, just provide the option values — colors are auto-assigned:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
"Create a Status column with options: Todo, In Progress, Done"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The server generates properly colored options that render correctly in the AiTables UI. This also applies to tags and label columns.
|
|
96
|
+
|
|
97
|
+
## Environment Variables
|
|
98
|
+
|
|
99
|
+
| Variable | Required | Description |
|
|
100
|
+
|----------|----------|-------------|
|
|
101
|
+
| `AITABLES_API_KEY` | Yes | Your AiTables API key (`ait_user_*` or `ait_live_*`) |
|
|
102
|
+
| `AITABLES_API_URL` | No | Override the API base URL (for custom domains) |
|
|
103
|
+
|
|
104
|
+
## Development
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
cd addai-tables/mcp
|
|
108
|
+
npm install
|
|
109
|
+
npm run build
|
|
110
|
+
npm run dev # watch mode
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
For local testing, point your `.mcp.json` to the built output:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"mcpServers": {
|
|
118
|
+
"aitables": {
|
|
119
|
+
"command": "node",
|
|
120
|
+
"args": ["path/to/addai-tables/mcp/dist/index.js"],
|
|
121
|
+
"env": {
|
|
122
|
+
"AITABLES_API_KEY": "ait_user_xxxxxxxxxxxx"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ApiResponse } from './types.js';
|
|
2
|
+
export declare class AiTablesClient {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private apiKey;
|
|
5
|
+
constructor(apiKey: string, baseUrl?: string);
|
|
6
|
+
private request;
|
|
7
|
+
get<T = unknown>(path: string, params?: Record<string, string>): Promise<ApiResponse<T>>;
|
|
8
|
+
post<T = unknown>(path: string, body: unknown): Promise<ApiResponse<T>>;
|
|
9
|
+
patch<T = unknown>(path: string, body: unknown): Promise<ApiResponse<T>>;
|
|
10
|
+
delete<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;YAK9B,OAAO;IA6Cf,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI9D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;IAI7C,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;IAI9C,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;CAGvD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = 'https://syhzpqqvrplaqdipcymw.supabase.co/functions/v1/aitables-api/v1';
|
|
2
|
+
export class AiTablesClient {
|
|
3
|
+
baseUrl;
|
|
4
|
+
apiKey;
|
|
5
|
+
constructor(apiKey, baseUrl) {
|
|
6
|
+
this.apiKey = apiKey;
|
|
7
|
+
this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
8
|
+
}
|
|
9
|
+
async request(method, path, options) {
|
|
10
|
+
let url = `${this.baseUrl}${path}`;
|
|
11
|
+
if (options?.params) {
|
|
12
|
+
const searchParams = new URLSearchParams();
|
|
13
|
+
for (const [key, value] of Object.entries(options.params)) {
|
|
14
|
+
if (value !== undefined && value !== '') {
|
|
15
|
+
searchParams.set(key, value);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const qs = searchParams.toString();
|
|
19
|
+
if (qs)
|
|
20
|
+
url += `?${qs}`;
|
|
21
|
+
}
|
|
22
|
+
const headers = {
|
|
23
|
+
'x-api-key': this.apiKey,
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
};
|
|
26
|
+
const fetchOptions = { method, headers };
|
|
27
|
+
if (options?.body !== undefined) {
|
|
28
|
+
fetchOptions.body = JSON.stringify(options.body);
|
|
29
|
+
}
|
|
30
|
+
const response = await fetch(url, fetchOptions);
|
|
31
|
+
const json = await response.json();
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
const message = json.error?.message ||
|
|
34
|
+
json.message ||
|
|
35
|
+
`API request failed with status ${response.status}`;
|
|
36
|
+
return { error: { message, code: String(response.status) } };
|
|
37
|
+
}
|
|
38
|
+
return json;
|
|
39
|
+
}
|
|
40
|
+
async get(path, params) {
|
|
41
|
+
return this.request('GET', path, { params });
|
|
42
|
+
}
|
|
43
|
+
async post(path, body) {
|
|
44
|
+
return this.request('POST', path, { body });
|
|
45
|
+
}
|
|
46
|
+
async patch(path, body) {
|
|
47
|
+
return this.request('PATCH', path, { body });
|
|
48
|
+
}
|
|
49
|
+
async delete(path, body) {
|
|
50
|
+
return this.request('DELETE', path, { body });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GACpB,uEAAuE,CAAC;AAE1E,MAAM,OAAO,cAAc;IACjB,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB,YAAY,MAAc,EAAE,OAAgB;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,OAGC;QAED,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAEnC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBACxC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YACD,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,EAAE;gBAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,MAAM,YAAY,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACtD,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAoB,CAAC;QAErD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,EAAE,OAAO;gBACnB,IAAI,CAAC,OAAO;gBACZ,kCAAkC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAc,IAAY,EAAE,MAA+B;QAClE,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAc,IAAY,EAAE,IAAa;QACjD,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,KAAK,CAAc,IAAY,EAAE,IAAa;QAClD,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,MAAM,CAAc,IAAY,EAAE,IAAc;QACpD,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SelectOption, ColumnDefinition } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Assign preset colors to an array of option values, cycling round-robin.
|
|
4
|
+
*/
|
|
5
|
+
export declare function assignColors(values: string[]): SelectOption[];
|
|
6
|
+
/**
|
|
7
|
+
* Merge new option values with existing options, preserving colors for existing
|
|
8
|
+
* options and assigning new colors for new ones.
|
|
9
|
+
*/
|
|
10
|
+
export declare function mergeSelectOptions(existingOptions: SelectOption[], newValues: string[]): SelectOption[];
|
|
11
|
+
/**
|
|
12
|
+
* Enrich a column definition with smart defaults and auto-assigned colors.
|
|
13
|
+
* This is the core intelligence that makes the MCP smarter than the raw API.
|
|
14
|
+
*/
|
|
15
|
+
export declare function enrichColumnSettings(column: ColumnDefinition): Record<string, unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* Build the column_settings and column_type for the API request.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildColumnPayload(column: ColumnDefinition): {
|
|
20
|
+
name: string;
|
|
21
|
+
column_type: string;
|
|
22
|
+
column_settings: Record<string, unknown>;
|
|
23
|
+
is_required: boolean;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=column-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-settings.d.ts","sourceRoot":"","sources":["../../src/helpers/column-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAmBlE;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAM7D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,EAAE,GAClB,YAAY,EAAE,CAoBhB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmCtF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;CACtB,CAOA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { getDefaultSettings } from './column-types.js';
|
|
2
|
+
// Preset colors from AiTables (same order as colorUtils.js)
|
|
3
|
+
const PRESET_COLORS = [
|
|
4
|
+
'#579BFC', // blue
|
|
5
|
+
'#00C875', // green
|
|
6
|
+
'#FDAB3D', // yellow
|
|
7
|
+
'#A25DDC', // purple
|
|
8
|
+
'#FF642E', // orange
|
|
9
|
+
'#E2445C', // red
|
|
10
|
+
'#FF158A', // pink
|
|
11
|
+
'#00C2E0', // teal
|
|
12
|
+
'#C4C4C4', // gray
|
|
13
|
+
'#808080', // dark gray
|
|
14
|
+
'#7F5347', // brown
|
|
15
|
+
'#225091', // navy
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Assign preset colors to an array of option values, cycling round-robin.
|
|
19
|
+
*/
|
|
20
|
+
export function assignColors(values) {
|
|
21
|
+
return values.map((value, index) => ({
|
|
22
|
+
value,
|
|
23
|
+
color: PRESET_COLORS[index % PRESET_COLORS.length],
|
|
24
|
+
active: true,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Merge new option values with existing options, preserving colors for existing
|
|
29
|
+
* options and assigning new colors for new ones.
|
|
30
|
+
*/
|
|
31
|
+
export function mergeSelectOptions(existingOptions, newValues) {
|
|
32
|
+
const existingMap = new Map(existingOptions.map((o) => [o.value, o.color]));
|
|
33
|
+
const usedColors = new Set(existingOptions.map((o) => o.color));
|
|
34
|
+
let colorIndex = 0;
|
|
35
|
+
return newValues.map((value) => {
|
|
36
|
+
if (existingMap.has(value)) {
|
|
37
|
+
return { value, color: existingMap.get(value), active: true };
|
|
38
|
+
}
|
|
39
|
+
// Find next color, preferring unused ones
|
|
40
|
+
while (usedColors.has(PRESET_COLORS[colorIndex % PRESET_COLORS.length]) &&
|
|
41
|
+
colorIndex < PRESET_COLORS.length * 2) {
|
|
42
|
+
colorIndex++;
|
|
43
|
+
}
|
|
44
|
+
const color = PRESET_COLORS[colorIndex % PRESET_COLORS.length];
|
|
45
|
+
colorIndex++;
|
|
46
|
+
return { value, color, active: true };
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Enrich a column definition with smart defaults and auto-assigned colors.
|
|
51
|
+
* This is the core intelligence that makes the MCP smarter than the raw API.
|
|
52
|
+
*/
|
|
53
|
+
export function enrichColumnSettings(column) {
|
|
54
|
+
const defaults = getDefaultSettings(column.type);
|
|
55
|
+
const userSettings = column.settings || {};
|
|
56
|
+
switch (column.type) {
|
|
57
|
+
case 'select':
|
|
58
|
+
case 'multiselect':
|
|
59
|
+
if (column.options && column.options.length > 0) {
|
|
60
|
+
return { ...defaults, ...userSettings, options: assignColors(column.options) };
|
|
61
|
+
}
|
|
62
|
+
return { ...defaults, ...userSettings };
|
|
63
|
+
case 'tags':
|
|
64
|
+
if (column.options && column.options.length > 0) {
|
|
65
|
+
return {
|
|
66
|
+
...defaults,
|
|
67
|
+
...userSettings,
|
|
68
|
+
tags: column.options.map((value, i) => ({
|
|
69
|
+
value,
|
|
70
|
+
color: PRESET_COLORS[i % PRESET_COLORS.length],
|
|
71
|
+
})),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return { ...defaults, ...userSettings };
|
|
75
|
+
case 'label':
|
|
76
|
+
if (column.options && column.options.length > 0) {
|
|
77
|
+
return { ...defaults, ...userSettings, options: assignColors(column.options) };
|
|
78
|
+
}
|
|
79
|
+
// Use the 8 preset labels from defaults
|
|
80
|
+
return { ...defaults, ...userSettings };
|
|
81
|
+
default:
|
|
82
|
+
return { ...defaults, ...userSettings };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Build the column_settings and column_type for the API request.
|
|
87
|
+
*/
|
|
88
|
+
export function buildColumnPayload(column) {
|
|
89
|
+
return {
|
|
90
|
+
name: column.name,
|
|
91
|
+
column_type: column.type,
|
|
92
|
+
column_settings: enrichColumnSettings(column),
|
|
93
|
+
is_required: column.required ?? false,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=column-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-settings.js","sourceRoot":"","sources":["../../src/helpers/column-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const COLUMN_TYPES: Record<string, {
|
|
2
|
+
label: string;
|
|
3
|
+
defaultSettings: Record<string, unknown>;
|
|
4
|
+
}>;
|
|
5
|
+
export declare function getDefaultSettings(type: string): Record<string, unknown>;
|
|
6
|
+
export declare function isValidColumnType(type: string): boolean;
|
|
7
|
+
export declare const CREATABLE_COLUMN_TYPES: string[];
|
|
8
|
+
//# sourceMappingURL=column-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-types.d.ts","sourceRoot":"","sources":["../../src/helpers/column-types.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAiEpG,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIxE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAGD,eAAO,MAAM,sBAAsB,UASlC,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Column type metadata ported from app/src/utils/columnTypes.js
|
|
2
|
+
// Only includes default settings — no icons or React components
|
|
3
|
+
export const COLUMN_TYPES = {
|
|
4
|
+
text: { label: 'Text', defaultSettings: { multi: false } },
|
|
5
|
+
number: { label: 'Number', defaultSettings: { format: 'number', decimals: 0, prefix: '', suffix: '' } },
|
|
6
|
+
boolean: { label: 'Checkbox', defaultSettings: { style: 'check', color: '#22c55e' } },
|
|
7
|
+
date: { label: 'Date', defaultSettings: { includeTime: false, format: 'yyyy-MM-dd' } },
|
|
8
|
+
select: { label: 'Select', defaultSettings: { options: [] } },
|
|
9
|
+
multiselect: { label: 'Multi-Select', defaultSettings: { options: [] } },
|
|
10
|
+
tags: { label: 'Tags', defaultSettings: { tags: [] } },
|
|
11
|
+
label: {
|
|
12
|
+
label: 'Label',
|
|
13
|
+
defaultSettings: {
|
|
14
|
+
options: [
|
|
15
|
+
{ value: 'Label 1', color: '#579BFC' },
|
|
16
|
+
{ value: 'Label 2', color: '#00C875' },
|
|
17
|
+
{ value: 'Label 3', color: '#FDAB3D' },
|
|
18
|
+
{ value: 'Label 4', color: '#A25DDC' },
|
|
19
|
+
{ value: 'Label 5', color: '#FF642E' },
|
|
20
|
+
{ value: 'Label 6', color: '#E2445C' },
|
|
21
|
+
{ value: 'Label 7', color: '#FF158A' },
|
|
22
|
+
{ value: 'Label 8', color: '#00C2E0' },
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
file: { label: 'File', defaultSettings: { allowedTypes: [], maxSize: 10485760 } },
|
|
27
|
+
richtext: { label: 'Rich Text', defaultSettings: { multi: false } },
|
|
28
|
+
html: { label: 'HTML', defaultSettings: { maxPreviewLength: 100 } },
|
|
29
|
+
url: { label: 'URL', defaultSettings: { displayType: 'link' } },
|
|
30
|
+
email: { label: 'Email', defaultSettings: {} },
|
|
31
|
+
phone: { label: 'Phone', defaultSettings: { format: 'international' } },
|
|
32
|
+
relation: { label: 'Relation', defaultSettings: { targetTableId: null, displayColumn: null } },
|
|
33
|
+
linked_table: { label: 'Linked Table', defaultSettings: { targetTableId: null, displayColumn: null, relationType: 'single', allowNavigation: true, allowCreation: false } },
|
|
34
|
+
formula: { label: 'Formula', defaultSettings: { expression: '', resultType: 'text' } },
|
|
35
|
+
lookup: { label: 'Lookup', defaultSettings: { relationColumn: null, lookupColumn: null } },
|
|
36
|
+
rollup: { label: 'Rollup', defaultSettings: { relationColumn: null, lookupColumn: null, aggregation: 'count' } },
|
|
37
|
+
count: { label: 'Count', defaultSettings: { relationColumn: null } },
|
|
38
|
+
rating: { label: 'Rating', defaultSettings: { maxRating: 5, icon: 'star', color: '#fbbf24' } },
|
|
39
|
+
progress: { label: 'Progress', defaultSettings: { showIcon: true, showPercentage: true, color: null } },
|
|
40
|
+
country: { label: 'Country', defaultSettings: {} },
|
|
41
|
+
world_clock: { label: 'World Clock', defaultSettings: {} },
|
|
42
|
+
duration: { label: 'Duration', defaultSettings: { format: 'h:mm', unit: 'hours' } },
|
|
43
|
+
hour: { label: 'Time', defaultSettings: { use24Hour: false } },
|
|
44
|
+
week: { label: 'Week', defaultSettings: { displayFormat: 'W## YYYY' } },
|
|
45
|
+
timeline: { label: 'Timeline', defaultSettings: { showDuration: true, showBar: false } },
|
|
46
|
+
vote: { label: 'Vote', defaultSettings: { color: '#3b82f6' } },
|
|
47
|
+
checklist: { label: 'Checklist', defaultSettings: {} },
|
|
48
|
+
color_picker: { label: 'Colour', defaultSettings: {} },
|
|
49
|
+
people: { label: 'People', defaultSettings: { allowMultiple: true } },
|
|
50
|
+
team: { label: 'Team', defaultSettings: { allowMultiple: true } },
|
|
51
|
+
aiboards: { label: 'AiBoards', defaultSettings: { allowMultiple: false } },
|
|
52
|
+
location: { label: 'Location', defaultSettings: {} },
|
|
53
|
+
weather: { label: 'Weather', defaultSettings: { sourceLocationColumn: null, units: 'celsius' } },
|
|
54
|
+
time_tracking: { label: 'Time Tracking', defaultSettings: { targetDurationColumn: null } },
|
|
55
|
+
autonumber: { label: 'Autonumber', defaultSettings: { prefix: '', suffix: '', startNumber: 1, incrementBy: 1 } },
|
|
56
|
+
barcode: { label: 'Barcode', defaultSettings: { format: 'qr', displayType: 'both' } },
|
|
57
|
+
button: { label: 'Button', defaultSettings: { actionType: 'open_url', actionConfig: {}, label: 'Click', icon: null, style: 'primary', confirmMessage: null, url: '' } },
|
|
58
|
+
form: { label: 'Form', defaultSettings: { formId: null, buttonLabel: 'Fill Form', showProgress: true, style: 'primary' } },
|
|
59
|
+
ai_column: { label: 'AI Generated', defaultSettings: { aiKeyName: null, promptTemplate: '', systemPrompt: '', model: null, temperature: 0.7, maxTokens: 500, trigger: { type: 'manual_only', watchColumns: [] }, allowRegenerate: true } },
|
|
60
|
+
creation_log: { label: 'Creation Log', defaultSettings: { dateFormat: 'MMM d, yyyy' } },
|
|
61
|
+
update_log: { label: 'Update Log', defaultSettings: { dateFormat: 'MMM d, yyyy' } },
|
|
62
|
+
};
|
|
63
|
+
export function getDefaultSettings(type) {
|
|
64
|
+
const config = COLUMN_TYPES[type];
|
|
65
|
+
if (!config)
|
|
66
|
+
return {};
|
|
67
|
+
return { ...config.defaultSettings };
|
|
68
|
+
}
|
|
69
|
+
export function isValidColumnType(type) {
|
|
70
|
+
return type in COLUMN_TYPES;
|
|
71
|
+
}
|
|
72
|
+
// Column types that Claude can create via the MCP (excludes system/computed/relational types)
|
|
73
|
+
export const CREATABLE_COLUMN_TYPES = [
|
|
74
|
+
'text', 'number', 'boolean', 'date',
|
|
75
|
+
'select', 'multiselect', 'tags', 'label',
|
|
76
|
+
'file', 'richtext', 'html', 'url', 'email', 'phone',
|
|
77
|
+
'rating', 'progress', 'country', 'world_clock',
|
|
78
|
+
'duration', 'hour', 'week', 'timeline',
|
|
79
|
+
'vote', 'checklist', 'color_picker',
|
|
80
|
+
'people', 'team', 'aiboards', 'location',
|
|
81
|
+
'autonumber', 'barcode', 'button',
|
|
82
|
+
];
|
|
83
|
+
//# sourceMappingURL=column-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-types.js","sourceRoot":"","sources":["../../src/helpers/column-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ApiResponse } from '../types.js';
|
|
2
|
+
export declare function formatError(response: ApiResponse): string;
|
|
3
|
+
export declare function mcpError(message: string): {
|
|
4
|
+
content: {
|
|
5
|
+
type: "text";
|
|
6
|
+
text: string;
|
|
7
|
+
}[];
|
|
8
|
+
isError: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function mcpResult(data: unknown): {
|
|
11
|
+
content: {
|
|
12
|
+
type: "text";
|
|
13
|
+
text: string;
|
|
14
|
+
}[];
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/helpers/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAKzD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM;;;;;;EAKvC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO;;;;;EAKtC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function formatError(response) {
|
|
2
|
+
if (response.error) {
|
|
3
|
+
return response.error.message;
|
|
4
|
+
}
|
|
5
|
+
return 'Unknown error';
|
|
6
|
+
}
|
|
7
|
+
export function mcpError(message) {
|
|
8
|
+
return {
|
|
9
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
10
|
+
isError: true,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function mcpResult(data) {
|
|
14
|
+
const text = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: 'text', text }],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/helpers/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,QAAqB;IAC/C,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;IAChC,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AiTablesClient } from '../api-client.js';
|
|
2
|
+
import type { Column } from '../types.js';
|
|
3
|
+
export interface ColumnMap {
|
|
4
|
+
nameToId: Map<string, string>;
|
|
5
|
+
idToName: Map<string, string>;
|
|
6
|
+
columns: Column[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Fetch columns for a table and build bidirectional name/ID maps.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildColumnMap(client: AiTablesClient, tableId: string): Promise<ColumnMap>;
|
|
12
|
+
/**
|
|
13
|
+
* Translate row data from column names to column UUIDs for API writes.
|
|
14
|
+
* Also normalizes values based on column type (e.g. checklist format).
|
|
15
|
+
*/
|
|
16
|
+
export declare function translateToIds(data: Record<string, unknown>, map: ColumnMap): Record<string, unknown>;
|
|
17
|
+
/**
|
|
18
|
+
* Translate row data from column UUIDs to column names for display.
|
|
19
|
+
*/
|
|
20
|
+
export declare function translateToNames(data: Record<string, unknown>, map: ColumnMap): Record<string, unknown>;
|
|
21
|
+
//# sourceMappingURL=mapped-columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapped-columns.d.ts","sourceRoot":"","sources":["../../src/helpers/mapped-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC,CA2BpB;AA2DD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,SAAS,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,SAAS,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch columns for a table and build bidirectional name/ID maps.
|
|
3
|
+
*/
|
|
4
|
+
export async function buildColumnMap(client, tableId) {
|
|
5
|
+
const response = await client.get(`/tables/${tableId}/columns`);
|
|
6
|
+
const columns = response.data || [];
|
|
7
|
+
const nameToId = new Map();
|
|
8
|
+
const idToName = new Map();
|
|
9
|
+
// Track duplicate names to handle collisions
|
|
10
|
+
const nameCount = new Map();
|
|
11
|
+
for (const col of columns) {
|
|
12
|
+
nameCount.set(col.name, (nameCount.get(col.name) || 0) + 1);
|
|
13
|
+
}
|
|
14
|
+
for (const col of columns) {
|
|
15
|
+
const count = nameCount.get(col.name) || 1;
|
|
16
|
+
if (count > 1) {
|
|
17
|
+
// Duplicate name — use "Name (column_id)" to disambiguate
|
|
18
|
+
const disambiguated = `${col.name} (${col.id.slice(0, 8)})`;
|
|
19
|
+
nameToId.set(disambiguated, col.id);
|
|
20
|
+
idToName.set(col.id, disambiguated);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
nameToId.set(col.name, col.id);
|
|
24
|
+
idToName.set(col.id, col.name);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { nameToId, idToName, columns };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generate a unique ID for checklist items.
|
|
31
|
+
*/
|
|
32
|
+
function generateId() {
|
|
33
|
+
return Math.random().toString(36).slice(2, 11) + Date.now().toString(36);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Normalize a checklist value into the expected format:
|
|
37
|
+
* [{ id: string, text: string, done: boolean }]
|
|
38
|
+
*
|
|
39
|
+
* Accepts:
|
|
40
|
+
* - Array of strings: ["Buy milk", "Call dentist"]
|
|
41
|
+
* - Array of objects with text: [{ text: "Buy milk", done: true }]
|
|
42
|
+
* - Comma-separated string: "Buy milk, Call dentist"
|
|
43
|
+
* - Already correct format (passed through with ID validation)
|
|
44
|
+
*/
|
|
45
|
+
function normalizeChecklist(value) {
|
|
46
|
+
if (!value)
|
|
47
|
+
return [];
|
|
48
|
+
let items;
|
|
49
|
+
if (typeof value === 'string') {
|
|
50
|
+
// Comma-separated string → array of strings
|
|
51
|
+
items = value.split(',').map((s) => s.trim()).filter(Boolean);
|
|
52
|
+
}
|
|
53
|
+
else if (Array.isArray(value)) {
|
|
54
|
+
items = value;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return value; // Unknown format, pass through
|
|
58
|
+
}
|
|
59
|
+
return items.map((item) => {
|
|
60
|
+
if (typeof item === 'string') {
|
|
61
|
+
return { id: generateId(), text: item, done: false };
|
|
62
|
+
}
|
|
63
|
+
if (typeof item === 'object' && item !== null) {
|
|
64
|
+
const obj = item;
|
|
65
|
+
return {
|
|
66
|
+
id: obj.id && typeof obj.id === 'string' ? obj.id : generateId(),
|
|
67
|
+
text: obj.text ?? obj.label ?? obj.name ?? '',
|
|
68
|
+
done: Boolean(obj.done ?? obj.checked ?? obj.completed ?? false),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return { id: generateId(), text: String(item), done: false };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Normalize value based on column type.
|
|
76
|
+
*/
|
|
77
|
+
function normalizeForColumnType(value, columnType) {
|
|
78
|
+
if (columnType === 'checklist') {
|
|
79
|
+
return normalizeChecklist(value);
|
|
80
|
+
}
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Translate row data from column names to column UUIDs for API writes.
|
|
85
|
+
* Also normalizes values based on column type (e.g. checklist format).
|
|
86
|
+
*/
|
|
87
|
+
export function translateToIds(data, map) {
|
|
88
|
+
// Build a quick lookup: columnId → column_type
|
|
89
|
+
const typeById = new Map();
|
|
90
|
+
for (const col of map.columns) {
|
|
91
|
+
typeById.set(col.id, col.column_type);
|
|
92
|
+
}
|
|
93
|
+
const result = {};
|
|
94
|
+
for (const [key, value] of Object.entries(data)) {
|
|
95
|
+
const columnId = map.nameToId.get(key);
|
|
96
|
+
if (columnId) {
|
|
97
|
+
const colType = typeById.get(columnId) || '';
|
|
98
|
+
result[columnId] = normalizeForColumnType(value, colType);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// If it's already a UUID (or unknown key), pass through
|
|
102
|
+
const colType = typeById.get(key) || '';
|
|
103
|
+
result[key] = colType ? normalizeForColumnType(value, colType) : value;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Translate row data from column UUIDs to column names for display.
|
|
110
|
+
*/
|
|
111
|
+
export function translateToNames(data, map) {
|
|
112
|
+
const result = {};
|
|
113
|
+
for (const [key, value] of Object.entries(data)) {
|
|
114
|
+
const columnName = map.idToName.get(key);
|
|
115
|
+
result[columnName || key] = value;
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=mapped-columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapped-columns.js","sourceRoot":"","sources":["../../src/helpers/mapped-columns.ts"],"names":[],"mappings":"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"}
|