@cplace/test-mcp-server 0.1.6 → 0.1.8
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 +38 -65
- package/dist/api.d.ts +9 -10
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +31 -4
- package/dist/api.js.map +1 -1
- package/dist/csvUtils.d.ts +7 -0
- package/dist/csvUtils.d.ts.map +1 -0
- package/dist/csvUtils.js +125 -0
- package/dist/csvUtils.js.map +1 -0
- package/dist/index.js +703 -24
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +17 -0
- package/dist/logger.js.map +1 -0
- package/dist/searchSchema.d.ts +245 -1
- package/dist/searchSchema.d.ts.map +1 -1
- package/dist/searchSchema.js +26 -25
- package/dist/searchSchema.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.js +7 -7
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,31 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
An MCP (Model Context Protocol) server that provides Claude Desktop with tools to interact with cplace APIs. This server exposes cplace functionality through a set of MCP tools for workspace management, page operations, and search capabilities.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Installation & Setup
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **Datamodel Information**: Get attributes and metadata
|
|
9
|
-
- **Page Retrieval**: Get pages by UID
|
|
10
|
-
- **Person Retrieval**: Get persons by UID or name
|
|
11
|
-
- **Complex Search**: Structured attribute filtering with multiple conditions
|
|
12
|
-
|
|
13
|
-
## Installation
|
|
14
|
-
|
|
15
|
-
### ONLY For Development/Local Use
|
|
16
|
-
|
|
17
|
-
1. Clone this repository
|
|
18
|
-
2. Install dependencies:
|
|
19
|
-
```bash
|
|
20
|
-
npm install
|
|
21
|
-
```
|
|
22
|
-
3. Build the project:
|
|
23
|
-
```bash
|
|
24
|
-
npm run build
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Configuration with Claude Desktop
|
|
28
|
-
|
|
29
|
-
### For NPM Installation (recommended)
|
|
7
|
+
### Claude Desktop Installation
|
|
30
8
|
Add this entry to your Claude Desktop MCP server configuration file:
|
|
31
9
|
|
|
32
10
|
```json
|
|
@@ -44,41 +22,25 @@ Add this entry to your Claude Desktop MCP server configuration file:
|
|
|
44
22
|
}
|
|
45
23
|
```
|
|
46
24
|
|
|
47
|
-
###
|
|
48
|
-
|
|
25
|
+
### Claude Code Installation
|
|
26
|
+
Use the Claude Code CLI to add the MCP server:
|
|
49
27
|
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"args": ["/absolute/path/to/this/project/dist/index.js"],
|
|
56
|
-
"env": {
|
|
57
|
-
"CPLACE_URL": "https://your-cplace-instance.com/your-tenant/",
|
|
58
|
-
"API_TOKEN": "your-api-token"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
28
|
+
```bash
|
|
29
|
+
claude mcp add cplace \
|
|
30
|
+
--env CPLACE_URL=https://your-cplace-instance.com/your-tenant/ \
|
|
31
|
+
--env API_TOKEN=your-api-token \
|
|
32
|
+
-- npx -y @cplace/test-mcp-server
|
|
63
33
|
```
|
|
64
34
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- `cplace_list_workspaces` - Get all workspaces with essential properties
|
|
70
|
-
- `cplace_get_workspace_details` - Get comprehensive workspace details
|
|
71
|
-
- `cplace_get_types_in_workspace` - Get types from workspace
|
|
72
|
-
- `cplace_get_type_datamodel` - Get the datamodel of a type including its attributes, constraints, and permissions
|
|
73
|
-
- `cplace_get_page_by_id` - Get page by ID with full details
|
|
74
|
-
- `cplace_get_person_by_id` - Get details about a person including their name and email
|
|
75
|
-
- `cplace_search_person` - Search a person by their name
|
|
76
|
-
- `cplace_search_pages` - Search pages of a type in cplace
|
|
35
|
+
Verify the installation:
|
|
36
|
+
```bash
|
|
37
|
+
claude mcp list
|
|
38
|
+
```
|
|
77
39
|
|
|
78
40
|
## Usage
|
|
79
41
|
|
|
80
42
|
1. Obtain an API Token for your cplace system (see [cplace documentation](https://docs.cplace.io/lowcode/low-code-cli/authentication/))
|
|
81
|
-
2. Configure your credentials (see
|
|
43
|
+
2. Configure your credentials (see Installation section above)
|
|
82
44
|
3. If Claude Desktop is running, close it
|
|
83
45
|
4. Add the MCP server configuration to Claude Desktop
|
|
84
46
|
5. Open Claude Desktop - the cplace tools should now be available
|
|
@@ -87,21 +49,32 @@ Add this entry to your Claude Desktop MCP server configuration file:
|
|
|
87
49
|
|
|
88
50
|
To change `CPLACE_URL` or `API_TOKEN`, update the values in the Claude Desktop configuration, then close & reopen Claude Desktop.
|
|
89
51
|
|
|
90
|
-
## Development
|
|
91
52
|
|
|
92
|
-
```bash
|
|
93
|
-
# Install dependencies
|
|
94
|
-
npm install
|
|
95
53
|
|
|
96
|
-
|
|
97
|
-
|
|
54
|
+
## Available Tools
|
|
55
|
+
|
|
56
|
+
### Workspace & Type Information
|
|
57
|
+
- `cplace_list_workspaces` - Get all workspaces with essential properties
|
|
58
|
+
- `cplace_get_types_in_workspace` - Get types from workspace
|
|
59
|
+
- `cplace_get_type_datamodel` - Get the datamodel of a type including its attributes, constraints, and permissions
|
|
98
60
|
|
|
99
|
-
|
|
100
|
-
|
|
61
|
+
### Page Operations
|
|
62
|
+
- `cplace_get_page_by_id` - Get page by ID with full details
|
|
63
|
+
- `cplace_create_page` - Create a new page with specified attributes and content
|
|
64
|
+
- `cplace_update_page` - Update an existing page's attributes, content, or structure
|
|
65
|
+
- `cplace_update_page_attributes_only` - Lightweight tool for updating only page attributes
|
|
101
66
|
|
|
102
|
-
|
|
103
|
-
|
|
67
|
+
### Search & Retrieval
|
|
68
|
+
- `cplace_search_pages` - Search pages of a type in cplace
|
|
69
|
+
- `cplace_fulltext_search` - Make a fulltext search across all pages in cplace
|
|
70
|
+
- `cplace_get_all_pages_of_type` - Get all pages of a specific type in a workspace
|
|
71
|
+
- `cplace_search_pages_csv` - Same as cplace_search_pages but returns results in CSV format
|
|
104
72
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
73
|
+
### User & Person Management
|
|
74
|
+
- `cplace_get_person_by_id` - Get details about a person including their name and email
|
|
75
|
+
- `cplace_search_person` - Search a person by their name
|
|
76
|
+
- `cplace_get_current_user` - Get information about the currently logged-in user
|
|
77
|
+
|
|
78
|
+
## Development
|
|
79
|
+
|
|
80
|
+
For development setup, contribution guidelines, and extending the server, see [DEVELOPMENT.md](DEVELOPMENT.md).
|
package/dist/api.d.ts
CHANGED
|
@@ -8,7 +8,6 @@ export interface WorkspaceDetailed {
|
|
|
8
8
|
totalPages: number;
|
|
9
9
|
hide: boolean;
|
|
10
10
|
url: string;
|
|
11
|
-
absoluteUrl: string;
|
|
12
11
|
creator?: string;
|
|
13
12
|
modifier?: string;
|
|
14
13
|
permissions: WorkspacePermissions;
|
|
@@ -46,7 +45,7 @@ export interface WorkspacesApiResponse {
|
|
|
46
45
|
result: WorkspaceDetailed[];
|
|
47
46
|
}
|
|
48
47
|
export interface PageDetailed {
|
|
49
|
-
|
|
48
|
+
uid: string;
|
|
50
49
|
name: string;
|
|
51
50
|
url: string;
|
|
52
51
|
type: PageType;
|
|
@@ -62,21 +61,21 @@ export interface PageType {
|
|
|
62
61
|
localizedNames: Record<string, string>;
|
|
63
62
|
}
|
|
64
63
|
export interface PageWorkspace {
|
|
65
|
-
|
|
64
|
+
uid: string;
|
|
66
65
|
name: string;
|
|
67
66
|
}
|
|
68
67
|
export interface PageParent {
|
|
69
|
-
|
|
68
|
+
uid: string;
|
|
70
69
|
name: string;
|
|
71
70
|
type: PageType;
|
|
72
71
|
}
|
|
73
72
|
export interface PageChild {
|
|
74
|
-
|
|
73
|
+
uid: string;
|
|
75
74
|
name: string;
|
|
76
75
|
type: PageType;
|
|
77
76
|
}
|
|
78
77
|
export interface PageUser {
|
|
79
|
-
|
|
78
|
+
uid: string;
|
|
80
79
|
name: string;
|
|
81
80
|
}
|
|
82
81
|
export interface PageAttributes {
|
|
@@ -86,7 +85,7 @@ export interface PageApiResponse {
|
|
|
86
85
|
result: PageDetailed;
|
|
87
86
|
}
|
|
88
87
|
export interface PersonDetailed {
|
|
89
|
-
|
|
88
|
+
uid: string;
|
|
90
89
|
name: string;
|
|
91
90
|
email: string;
|
|
92
91
|
url: string;
|
|
@@ -130,7 +129,7 @@ export interface SearchApiResponse {
|
|
|
130
129
|
summary: string;
|
|
131
130
|
}
|
|
132
131
|
export interface TypeDefinitionDetailed {
|
|
133
|
-
|
|
132
|
+
uid: string;
|
|
134
133
|
internalName: string;
|
|
135
134
|
workspaceId: string;
|
|
136
135
|
localizedNames: Record<string, string>;
|
|
@@ -166,7 +165,7 @@ export interface ApiEndpoints {
|
|
|
166
165
|
export declare class CplaceApiClient {
|
|
167
166
|
private config;
|
|
168
167
|
constructor(config: CplaceConfig);
|
|
169
|
-
makeApiRequest<T extends keyof ApiEndpoints>(endpoint: T, method?: 'GET' | 'POST', params?: Record<string, any>, data?: any): Promise<ApiEndpoints[T]>;
|
|
170
|
-
makeApiRequest<T = any>(endpoint: string, method?: 'GET' | 'POST', params?: Record<string, any>, data?: any): Promise<T>;
|
|
168
|
+
makeApiRequest<T extends keyof ApiEndpoints>(endpoint: T, method?: 'GET' | 'POST' | 'PATCH', params?: Record<string, any>, data?: any): Promise<ApiEndpoints[T]>;
|
|
169
|
+
makeApiRequest<T = any>(endpoint: string, method?: 'GET' | 'POST' | 'PATCH', params?: Record<string, any>, data?: any): Promise<T>;
|
|
171
170
|
}
|
|
172
171
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/api.js
CHANGED
|
@@ -1,26 +1,47 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
import { debugLogWithTag } from './logger.js';
|
|
2
3
|
export class CplaceApiClient {
|
|
3
4
|
config;
|
|
4
5
|
constructor(config) {
|
|
5
6
|
this.config = config;
|
|
6
7
|
}
|
|
7
8
|
async makeApiRequest(endpoint, method = 'GET', params, data) {
|
|
9
|
+
debugLogWithTag('API_CLIENT', `Making ${method} request to endpoint: ${endpoint}`);
|
|
10
|
+
debugLogWithTag('API_CLIENT', `Params: ${JSON.stringify(params)}`);
|
|
11
|
+
debugLogWithTag('API_CLIENT', `Data: ${JSON.stringify(data)}`);
|
|
8
12
|
if (!this.config.url || !this.config.apiToken) {
|
|
9
13
|
throw new Error('CPLACE_URL and API_TOKEN environment variables are required');
|
|
10
14
|
}
|
|
11
15
|
try {
|
|
12
16
|
const headers = {
|
|
13
17
|
'X-Cplace-Api-Token': this.config.apiToken,
|
|
14
|
-
'Content-Type': 'application/json'
|
|
18
|
+
'Content-Type': 'application/json',
|
|
19
|
+
'Accept': 'application/json'
|
|
15
20
|
};
|
|
21
|
+
if (method === 'POST' || method === 'PATCH') {
|
|
22
|
+
headers['X-Requested-With'] = 'XMLHttpRequest';
|
|
23
|
+
headers['X-CSRF-TOKEN'] = 'fetch';
|
|
24
|
+
}
|
|
16
25
|
const url = new URL(`cplace-api/cf.cplace.citizenAi/mcp/${endpoint}`, this.config.url).toString();
|
|
26
|
+
debugLogWithTag('API_CLIENT', `Full URL: ${url}`);
|
|
27
|
+
debugLogWithTag('API_CLIENT', `Headers: ${JSON.stringify(headers)}`);
|
|
17
28
|
let response;
|
|
29
|
+
debugLogWithTag('API_CLIENT', `About to make ${method} request`);
|
|
18
30
|
if (method === 'GET') {
|
|
19
31
|
response = await axios.get(url, { headers, params });
|
|
20
32
|
}
|
|
21
|
-
else {
|
|
33
|
+
else if (method === 'POST') {
|
|
34
|
+
debugLogWithTag('API_CLIENT', `POST request body: ${JSON.stringify(data)}`);
|
|
22
35
|
response = await axios.post(url, data, { headers });
|
|
23
36
|
}
|
|
37
|
+
else if (method === 'PATCH') {
|
|
38
|
+
debugLogWithTag('API_CLIENT', `PATCH request body: ${JSON.stringify(data)}`);
|
|
39
|
+
response = await axios.patch(url, data, { headers });
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
43
|
+
}
|
|
44
|
+
debugLogWithTag('API_CLIENT', `Response status: ${response.status}`);
|
|
24
45
|
const responseData = response.data;
|
|
25
46
|
if (responseData.result !== undefined) {
|
|
26
47
|
const result = responseData.result;
|
|
@@ -37,14 +58,20 @@ export class CplaceApiClient {
|
|
|
37
58
|
}
|
|
38
59
|
}
|
|
39
60
|
else {
|
|
40
|
-
|
|
61
|
+
debugLogWithTag('API_CLIENT', `API returned error response: ${JSON.stringify(responseData)}`);
|
|
62
|
+
const errorMessage = responseData.error || responseData.errorMessage || 'Unknown error';
|
|
63
|
+
throw new Error(`API Error: ${errorMessage} (Status: ${response.status})`);
|
|
41
64
|
}
|
|
42
65
|
}
|
|
43
66
|
catch (error) {
|
|
44
67
|
if (axios.isAxiosError(error)) {
|
|
45
|
-
|
|
68
|
+
debugLogWithTag('API_CLIENT', `HTTP Error: ${error.response?.status} - ${error.response?.statusText}`);
|
|
69
|
+
debugLogWithTag('API_CLIENT', `Response data: ${JSON.stringify(error.response?.data)}`);
|
|
70
|
+
debugLogWithTag('API_CLIENT', `Full error: ${error.message}`);
|
|
71
|
+
throw new Error(`Request failed: ${error.message} (Status: ${error.response?.status})`);
|
|
46
72
|
}
|
|
47
73
|
else {
|
|
74
|
+
debugLogWithTag('API_CLIENT', `Non-HTTP error: ${error}`);
|
|
48
75
|
throw error;
|
|
49
76
|
}
|
|
50
77
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PageDetailed } from './api.js';
|
|
2
|
+
import { CplaceApiClient } from './api.js';
|
|
3
|
+
export declare function escapeCSVValue(value: any): string;
|
|
4
|
+
export declare function flattenComplexAttribute(value: any): string;
|
|
5
|
+
export declare function resolveReferences(value: any, client: CplaceApiClient): Promise<string>;
|
|
6
|
+
export declare function convertPagesToCsv(pages: PageDetailed[], client: CplaceApiClient, includeAttributes?: string[]): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=csvUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csvUtils.d.ts","sourceRoot":"","sources":["../src/csvUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAa,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAK3C,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAajD;AAKD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAqC1D;AAKD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAwC5F;AAYD,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,EAAE,EACrB,MAAM,EAAE,eAAe,EACvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAsEjB"}
|
package/dist/csvUtils.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export function escapeCSVValue(value) {
|
|
2
|
+
if (value === null || value === undefined) {
|
|
3
|
+
return '';
|
|
4
|
+
}
|
|
5
|
+
const stringValue = String(value);
|
|
6
|
+
if (stringValue.includes(',') || stringValue.includes('"') || stringValue.includes('\n') || stringValue.includes('\r')) {
|
|
7
|
+
return `"${stringValue.replace(/"/g, '""')}"`;
|
|
8
|
+
}
|
|
9
|
+
return stringValue;
|
|
10
|
+
}
|
|
11
|
+
export function flattenComplexAttribute(value) {
|
|
12
|
+
if (value === null || value === undefined) {
|
|
13
|
+
return '';
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(value)) {
|
|
16
|
+
return value.map(item => {
|
|
17
|
+
if (typeof item === 'object' && item !== null) {
|
|
18
|
+
return item.name || item.displayName || item.id || JSON.stringify(item);
|
|
19
|
+
}
|
|
20
|
+
return String(item);
|
|
21
|
+
}).join('; ');
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === 'object' && value !== null) {
|
|
24
|
+
if ('name' in value)
|
|
25
|
+
return String(value.name);
|
|
26
|
+
if ('displayName' in value)
|
|
27
|
+
return String(value.displayName);
|
|
28
|
+
if ('id' in value)
|
|
29
|
+
return String(value.id);
|
|
30
|
+
if (value instanceof Date) {
|
|
31
|
+
return value.toISOString();
|
|
32
|
+
}
|
|
33
|
+
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}/.test(value)) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
return JSON.stringify(value);
|
|
37
|
+
}
|
|
38
|
+
return String(value);
|
|
39
|
+
}
|
|
40
|
+
export async function resolveReferences(value, client) {
|
|
41
|
+
if (typeof value === 'string') {
|
|
42
|
+
if (value.startsWith('page/')) {
|
|
43
|
+
try {
|
|
44
|
+
const pageData = await client.makeApiRequest('json/page', 'GET', { id: value });
|
|
45
|
+
return pageData.name || value;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (value.startsWith('person/')) {
|
|
52
|
+
try {
|
|
53
|
+
const personData = await client.makeApiRequest('json/person', 'GET', { id: value });
|
|
54
|
+
return personData.name || value;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(value)) {
|
|
62
|
+
const resolved = await Promise.all(value.map(async (item) => await resolveReferences(item, client)));
|
|
63
|
+
return resolved.join('; ');
|
|
64
|
+
}
|
|
65
|
+
if (typeof value === 'object' && value !== null) {
|
|
66
|
+
if ('id' in value && typeof value.id === 'string') {
|
|
67
|
+
return await resolveReferences(value.id, client);
|
|
68
|
+
}
|
|
69
|
+
return flattenComplexAttribute(value);
|
|
70
|
+
}
|
|
71
|
+
return flattenComplexAttribute(value);
|
|
72
|
+
}
|
|
73
|
+
function stripHtml(html) {
|
|
74
|
+
return html.replace(/<[^>]*>/g, '').trim();
|
|
75
|
+
}
|
|
76
|
+
export async function convertPagesToCsv(pages, client, includeAttributes) {
|
|
77
|
+
if (pages.length === 0) {
|
|
78
|
+
const headers = ['id', 'name', 'url', 'type', 'workspace', 'creator', 'modifier'];
|
|
79
|
+
return headers.map(escapeCSVValue).join(',') + '\n';
|
|
80
|
+
}
|
|
81
|
+
let attributesToInclude = [];
|
|
82
|
+
if (includeAttributes && includeAttributes.length > 0) {
|
|
83
|
+
attributesToInclude = includeAttributes;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const allAttributeKeys = new Set();
|
|
87
|
+
pages.forEach(page => {
|
|
88
|
+
if (page.attributes) {
|
|
89
|
+
Object.keys(page.attributes).forEach(key => allAttributeKeys.add(key));
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
attributesToInclude = Array.from(allAttributeKeys).sort();
|
|
93
|
+
}
|
|
94
|
+
const coreHeaders = ['id', 'name', 'url', 'type', 'workspace', 'creator', 'modifier'];
|
|
95
|
+
const headers = [...coreHeaders, ...attributesToInclude];
|
|
96
|
+
const csvRows = [];
|
|
97
|
+
csvRows.push(headers.map(escapeCSVValue).join(','));
|
|
98
|
+
for (const page of pages) {
|
|
99
|
+
const row = [];
|
|
100
|
+
row.push(escapeCSVValue(page.uid));
|
|
101
|
+
row.push(escapeCSVValue(page.name));
|
|
102
|
+
row.push(escapeCSVValue(page.url));
|
|
103
|
+
row.push(escapeCSVValue(page.type?.localizedNames?.en || page.type?.internalName || ''));
|
|
104
|
+
row.push(escapeCSVValue(page.workspace?.name || ''));
|
|
105
|
+
row.push(escapeCSVValue(page.creator?.name || ''));
|
|
106
|
+
row.push(escapeCSVValue(page.modifier?.name || ''));
|
|
107
|
+
for (const attributeName of attributesToInclude) {
|
|
108
|
+
const attributeValue = page.attributes?.[attributeName];
|
|
109
|
+
try {
|
|
110
|
+
const resolvedValue = await resolveReferences(attributeValue, client);
|
|
111
|
+
let finalValue = resolvedValue;
|
|
112
|
+
if (typeof finalValue === 'string' && finalValue.includes('<') && finalValue.includes('>')) {
|
|
113
|
+
finalValue = stripHtml(finalValue);
|
|
114
|
+
}
|
|
115
|
+
row.push(escapeCSVValue(finalValue));
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
row.push(escapeCSVValue(flattenComplexAttribute(attributeValue)));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
csvRows.push(row.join(','));
|
|
122
|
+
}
|
|
123
|
+
return csvRows.join('\n') + '\n';
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=csvUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csvUtils.js","sourceRoot":"","sources":["../src/csvUtils.ts"],"names":[],"mappings":"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"}
|