@lilremark/n8n-nodes-twenty-dynamic 2.2.10

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 (64) hide show
  1. package/LICENSE.md +19 -0
  2. package/README.md +290 -0
  3. package/dist/credentials/TwentyApi.credentials.d.ts +8 -0
  4. package/dist/credentials/TwentyApi.credentials.js +49 -0
  5. package/dist/credentials/TwentyApi.credentials.js.map +1 -0
  6. package/dist/nodes/Twenty/ComplexFieldDetection.d.ts +8 -0
  7. package/dist/nodes/Twenty/ComplexFieldDetection.js +27 -0
  8. package/dist/nodes/Twenty/ComplexFieldDetection.js.map +1 -0
  9. package/dist/nodes/Twenty/FieldParameters.d.ts +11 -0
  10. package/dist/nodes/Twenty/FieldParameters.js +211 -0
  11. package/dist/nodes/Twenty/FieldParameters.js.map +1 -0
  12. package/dist/nodes/Twenty/FieldTransformation.d.ts +30 -0
  13. package/dist/nodes/Twenty/FieldTransformation.js +168 -0
  14. package/dist/nodes/Twenty/FieldTransformation.js.map +1 -0
  15. package/dist/nodes/Twenty/Twenty.node.d.ts +22 -0
  16. package/dist/nodes/Twenty/Twenty.node.js +1629 -0
  17. package/dist/nodes/Twenty/Twenty.node.js.map +1 -0
  18. package/dist/nodes/Twenty/Twenty.node.json +30 -0
  19. package/dist/nodes/Twenty/TwentyApi.client.d.ts +82 -0
  20. package/dist/nodes/Twenty/TwentyApi.client.js +654 -0
  21. package/dist/nodes/Twenty/TwentyApi.client.js.map +1 -0
  22. package/dist/nodes/Twenty/introspection/fieldIntrospection.d.ts +15 -0
  23. package/dist/nodes/Twenty/introspection/fieldIntrospection.js +135 -0
  24. package/dist/nodes/Twenty/introspection/fieldIntrospection.js.map +1 -0
  25. package/dist/nodes/Twenty/operations/create.operation.d.ts +7 -0
  26. package/dist/nodes/Twenty/operations/create.operation.js +20 -0
  27. package/dist/nodes/Twenty/operations/create.operation.js.map +1 -0
  28. package/dist/nodes/Twenty/operations/createMany.operation.d.ts +11 -0
  29. package/dist/nodes/Twenty/operations/createMany.operation.js +72 -0
  30. package/dist/nodes/Twenty/operations/createMany.operation.js.map +1 -0
  31. package/dist/nodes/Twenty/operations/delete.operation.d.ts +7 -0
  32. package/dist/nodes/Twenty/operations/delete.operation.js +18 -0
  33. package/dist/nodes/Twenty/operations/delete.operation.js.map +1 -0
  34. package/dist/nodes/Twenty/operations/deleteMany.operation.d.ts +7 -0
  35. package/dist/nodes/Twenty/operations/deleteMany.operation.js +39 -0
  36. package/dist/nodes/Twenty/operations/deleteMany.operation.js.map +1 -0
  37. package/dist/nodes/Twenty/operations/get.operation.d.ts +7 -0
  38. package/dist/nodes/Twenty/operations/get.operation.js +25 -0
  39. package/dist/nodes/Twenty/operations/get.operation.js.map +1 -0
  40. package/dist/nodes/Twenty/operations/getMany.operation.d.ts +8 -0
  41. package/dist/nodes/Twenty/operations/getMany.operation.js +37 -0
  42. package/dist/nodes/Twenty/operations/getMany.operation.js.map +1 -0
  43. package/dist/nodes/Twenty/operations/index.d.ts +11 -0
  44. package/dist/nodes/Twenty/operations/index.js +26 -0
  45. package/dist/nodes/Twenty/operations/index.js.map +1 -0
  46. package/dist/nodes/Twenty/operations/list.operation.d.ts +7 -0
  47. package/dist/nodes/Twenty/operations/list.operation.js +25 -0
  48. package/dist/nodes/Twenty/operations/list.operation.js.map +1 -0
  49. package/dist/nodes/Twenty/operations/update.operation.d.ts +7 -0
  50. package/dist/nodes/Twenty/operations/update.operation.js +21 -0
  51. package/dist/nodes/Twenty/operations/update.operation.js.map +1 -0
  52. package/dist/nodes/Twenty/operations/updateMany.operation.d.ts +19 -0
  53. package/dist/nodes/Twenty/operations/updateMany.operation.js +75 -0
  54. package/dist/nodes/Twenty/operations/updateMany.operation.js.map +1 -0
  55. package/dist/nodes/Twenty/operations/upsert.operation.d.ts +12 -0
  56. package/dist/nodes/Twenty/operations/upsert.operation.js +122 -0
  57. package/dist/nodes/Twenty/operations/upsert.operation.js.map +1 -0
  58. package/dist/nodes/Twenty/operations/upsertMany.operation.d.ts +13 -0
  59. package/dist/nodes/Twenty/operations/upsertMany.operation.js +120 -0
  60. package/dist/nodes/Twenty/operations/upsertMany.operation.js.map +1 -0
  61. package/dist/nodes/Twenty/twenty.svg +12 -0
  62. package/dist/package.json +81 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/package.json +81 -0
package/LICENSE.md ADDED
@@ -0,0 +1,19 @@
1
+ Copyright 2022 n8n
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,290 @@
1
+ # n8n-nodes-twenty-dynamic
2
+
3
+ <p align="center">
4
+ <img src="https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png" alt="n8n-nodes-twenty-dynamic Banner" width="100%">
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/@lilremark/n8n-nodes-twenty-dynamic">
9
+ <img src="https://img.shields.io/npm/v/@lilremark/n8n-nodes-twenty-dynamic.svg?style=flat-square" alt="npm version">
10
+ </a>
11
+ <a href="https://www.npmjs.com/package/@lilremark/n8n-nodes-twenty-dynamic">
12
+ <img src="https://img.shields.io/npm/dm/@lilremark/n8n-nodes-twenty-dynamic.svg?style=flat-square" alt="npm downloads">
13
+ </a>
14
+ <a href="https://github.com/lilremark/n8n-nodes-twenty-dynamic/blob/master/LICENSE">
15
+ <img src="https://img.shields.io/npm/l/@lilremark/n8n-nodes-twenty-dynamic.svg?style=flat-square" alt="license">
16
+ </a>
17
+ </p>
18
+
19
+ The most dynamic, **zero-config** integration for [Twenty CRM](https://twenty.com). Custom built n8n community node under active development modelled after the official Notion n8n node for ease of use and dynamic resource and field discovery. It automatically adapts to your Twenty instance custom schema, including custom objects and fields, without requiring node updates. It is a fork of the official Twenty CRM node and extends it with dynamic resource and field discovery.
20
+
21
+ Unlike older Twenty CRM nodes, this node **dynamically adapts** to your Twenty instance in real-time. It automatically discovers your **custom objects**, **fields**, and schema changes without requiring manual node updates or configuration. This node is backwards compatible for older Twenty CRM instances and the latest Twenty CRM instances and aligns with the direction the official team is going with the dynamic GraphQL API.
22
+
23
+ [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.
24
+
25
+ [Twenty CRM](https://twenty.com) is a modern, open-source CRM system built for self hosting
26
+
27
+ ## Overview
28
+
29
+ | Feature | Older Nodes / Forks | **n8n-nodes-twenty-dynamic** |
30
+ | :--- | :--- | :--- |
31
+ | **Custom Objects** | ❌ Requires manual JSON inputs or HTTP Request Nodes | ✅ **Auto-discovered instantly** |
32
+ | **Custom Fields** | ❌ Often missing or raw JSON | ✅ **Native n8n inputs** for all types |
33
+ | **Performance** | 🐢 Sequential (slow) | ⚡ **Bulk Ops (10-100x faster)** |
34
+ | **System Objects** | ❌ Hidden | ✅ **Full Access** (Attachments, Metadata) |
35
+ | **Ease of Use** | 🔧 Configuration heavy | ✨ **Zero-config**, smart defaults |
36
+
37
+ ---
38
+
39
+ ### 🚀 Key Features
40
+
41
+ ✨ **Supports Personal and Enterprise Custom Databases and Fields**: Automatically fetches all standard and custom objects from your personal Twenty instance
42
+
43
+ 💎 **Support for Complex Field Types**: Template-based and dynamicinputs for FullName, Links, Currency, Address, Emails, Phones
44
+
45
+ 🔓 **Unlocks Access TwentyCRM System Databases**: View and edit system databases not normally accessible through the Twenty UI (Company/Person Attachments (attachments), Synced Email Metadata (messages), and more for advanced workflows)
46
+
47
+ 🎯 **Smart Field Resolution**: Dynamic dropdowns for SELECT/MULTI_SELECT and auto-formatted inputs for specialized types
48
+
49
+ ⚡ **High-Performance Bulk Operations**: Process thousands of records with **10x-100x speed improvements** (Create, Update, Delete, Upsert)
50
+
51
+ 🧬 **Dual-API Architecture**: Utilizes both Twenty Metadata API and GraphQL introspection for complete field coverage for standard and custom fields. REST API used for execution of queries. Maintain compatibility with older Twenty CRM API structures.
52
+
53
+ ---
54
+ ## 📦 Installation
55
+
56
+ **For n8n Self Hosted Community Edition Instances**
57
+
58
+ 1. Go to **Settings** → **Community Nodes**
59
+ 2. Select **Install**
60
+ 3. Enter package name: `@lilremark/n8n-nodes-twenty-dynamic`
61
+
62
+ ### Requirements (In GEneral Works for Most N8N and Twenty CRM Self Hosted Instances)
63
+ - **Twenty CRM**: v1.4.0 or later - Tested up to Twenty CRM v2.8.3 (Updated: 2026-06-03)
64
+ - **n8n**: v1.0.0 or later (Recommended) - Supports n8n 2.0 Beta (Newest Version as of 2025-12-15)
65
+
66
+ ---
67
+
68
+ ## 🔧 Configuration
69
+
70
+ ### 1. Generate API Key
71
+ In your **Twenty CRM** instance:
72
+ 1. Navigate to **Settings** → **Developers** → **API Keys**
73
+ 2. Click **Create API Key** and copy the value
74
+
75
+ ### 2. Add Credentials in n8n
76
+ 1. Search for **"Twenty API"** credentials
77
+ 2. Enter the following details:
78
+ - **API Key**: The key you copied from Twenty
79
+ - **Domain**: Your Twenty instance URL (e.g., `https://app.twenty.com` or `http://localhost:3000`)
80
+
81
+ > [!IMPORTANT]
82
+ > **Do not** include `/graphql` or `/metadata` in the domain. The node handles this automatically.
83
+ >
84
+ > ✅ Correct: `https://app.twenty.com`
85
+ > ❌ Incorrect: `https://app.twenty.com/graphql`
86
+
87
+ ---
88
+ ---
89
+
90
+ ### About This Project
91
+
92
+ Modelled after the official Notion N8N node. Unlike traditional n8n nodes with static operations, this node **dynamically discovers** the Twenty CRM schema at runtime. It queries the Twenty REST and GraphQL APIs to automatically adapt to:
93
+ - Support for all standard and system Twenty objects (Company, Person, Opportunity, etc.)
94
+ - Support for all custom databases and fields created in your Twenty instance
95
+ - Schema changes and updates without requiring node updates
96
+
97
+ **Key Technical Architecture:**
98
+ - **Dynamic Schema Discovery**: Queries `/metadata` endpoint to get available resources and fields
99
+ - **Hybrid GraphQL/REST**: GraphQL for mutations, REST API for efficient data retrieval and node queries
100
+ - **Runtime Query Construction**: Builds queries dynamically based on user selections
101
+ - **Intelligent Caching**: Fresh schema on execution, cached in editor UI for performance
102
+ - **Native n8n Integration**: Uses n8n's newest built-in HTTP request functionality for all API calls
103
+ - **TypeScript**: Modern, type-safe development with TypeScript
104
+ - **Zero Dependencies**: No external dependencies, pure n8n functionality
105
+
106
+ [Twenty CRM](https://twenty.com/) is an open-source CRM under rapid development. This node stays compatible through dynamic adaptation rather than static operation definitions.
107
+ ---
108
+
109
+ ## Installation
110
+
111
+ Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
112
+
113
+ **Quick Install in n8n:**
114
+ ```
115
+ Settings → Community Nodes → Install → @lilremark/n8n-nodes-twenty-dynamic
116
+ ```
117
+
118
+ **Or via npm:**
119
+ ```bash
120
+ npm install @lilremark/n8n-nodes-twenty-dynamic
121
+ ```
122
+
123
+ ---
124
+
125
+ ## Credentials
126
+
127
+ Generate an API key in Twenty by following the [Twenty API documentation](https://twenty.com/user-guide/section/functions/api-webhooks).
128
+
129
+ **Quick Steps:**
130
+ 1. Open your Twenty instance
131
+ 2. Navigate to **Settings → Developers → API Keys**
132
+ 3. Click **Create API Key**
133
+ 4. Copy the generated key
134
+
135
+ **In n8n:**
136
+ 1. Click **Add Credential** and search for **"Twenty API"**
137
+ 2. Provide:
138
+ - **API Key**: Your Twenty API key (from above)
139
+ - **Twenty Domain**: Your Twenty instance URL (e.g., `http://localhost:3000` or `https://twenty.example.com`)
140
+
141
+ **Important:** Use the **root domain only**, not the GraphQL endpoint:
142
+ - ✅ Correct: `https://twenty.example.com`
143
+ - ❌ Wrong: `https://twenty.example.com/graphql`
144
+
145
+ ---
146
+
147
+ ## Operations
148
+
149
+ This node dynamically discovers available objects from your Twenty CRM instance and supports the following operations:
150
+
151
+ ### Single Record Operations
152
+
153
+ - **Create**: Create a new record with intelligent field inputs
154
+ - **Get**: Retrieve a single record by ID
155
+ - **Update**: Update an existing record (partial updates supported)
156
+ - **Delete**: Delete a record by ID (permanent - cannot be undone)
157
+ - **Create or Update (Upsert)**: Smart upsert - create if not found, update if exists (match by ID or unique field)
158
+ - **List/Search**: Retrieve multiple records with pagination (up to 100 records)
159
+
160
+ ### Bulk Operations
161
+
162
+ Process multiple records in parallel for maximum performance:
163
+
164
+ - **Create Many**: Bulk create multiple records (10-20x faster than sequential)
165
+ - **Get Many**: Retrieve multiple records by IDs in parallel
166
+ - **Update Many**: Bulk update multiple records with different field values
167
+ - **Delete Many**: Bulk delete multiple records by IDs
168
+ - **Create or Update Many (Upsert Many)**: Bulk smart upsert - create or update multiple records based on unique field matching
169
+
170
+ **Bulk Operations Benefits:**
171
+ - ⚡ **10-20x faster** than sequential operations
172
+ - 🛡️ **Resilient**: Individual failures don't stop the entire batch
173
+ - 📊 **Detailed results**: Each item returns success/error status with index tracking
174
+ - 🔄 **Parallel execution**: Uses `Promise.allSettled()` for concurrent processing
175
+
176
+ ### Resource Selection
177
+ - **Database Group**: Filter databases by type
178
+ - **All Databases**: Show all available objects (default)
179
+ - **Standard Databases**: Main user-facing Twenty objects (Company, Person, Opportunity, Task, Note, etc.)
180
+ - **System Databases**: Internal meta-objects (Views, Filters, Attachments, etc.) - Advanced users only
181
+ - **Custom Databases**: User-created custom objects
182
+ - **Database**: Select the specific object/database to work with (dynamically filtered based on Database Group)
183
+
184
+ ### Smart Field Inputs
185
+
186
+ The node automatically provides appropriate inputs based on field types:
187
+
188
+ - **FullName fields** (Person.name): Individual First Name and Last Name inputs
189
+ - **Links fields** (domainName, linkedinLink): URL and Label inputs
190
+ - **Currency fields** (annualRecurringRevenue): Amount and Currency Code inputs with dropdown
191
+ - **Address fields**: Street, City, State, Postal Code, Country, and Coordinates inputs
192
+ - **Emails/Phones**: Multiple entry support with primary designation
193
+ - **SELECT/MULTI_SELECT**: Dynamic dropdowns with options from your Twenty instance
194
+ - **Simple fields**: Standard text, number, date, and boolean inputs
195
+ - **Resource-aware**: Same field name behaves differently based on object type (e.g., Company.name is text, Person.name is FullName)
196
+
197
+ ### Supported Databases
198
+
199
+ **Standard Databases:**
200
+ - Companies, People, Opportunities, Tasks, Notes
201
+ - Workflows, Workflow Runs, Workflow Versions
202
+
203
+ **System Databases:**
204
+ - Attachments, Calendar Events, Messages, Message Channels, Note Targets, etc.
205
+
206
+ **Custom Databases:**
207
+ - ✅ All custom databases you create in Twenty
208
+ - ✅ Custom fields on standard objects
209
+ - ✅ Most custom field types supported
210
+ - ⚠️ Some complex object-based custom fields are work-in-progress - please report bugs on GitHub
211
+
212
+ **Note:** The majority of custom fields are fully supported. If you encounter issues with specific custom field types, please [report them on GitHub](https://github.com/Logrui/n8n-nodes-twenty-dynamic/issues).
213
+
214
+ ---
215
+
216
+ ## Bug Reporting and Feature Requests
217
+
218
+ Please report bugs and request features on [GitHub Issues](https://github.com/Logrui/n8n-nodes-twenty-dynamic/issues).
219
+
220
+ **When reporting bugs, please include:**
221
+ - Your Twenty CRM version
222
+ - Your n8n version
223
+ - The database/object you're working with
224
+ - Steps to reproduce the issue
225
+ - Expected vs actual behavior
226
+ - Any error messages
227
+
228
+ ---
229
+
230
+ ## Development Status: Ready to Use for Majority of Operations✅
231
+
232
+ ### Production-Ready Features
233
+
234
+ - ✅ **Dual-source architecture**: Metadata API + GraphQL introspection
235
+ - ✅ **Complete field coverage**: Custom SELECTs + built-in enums
236
+ - ✅ **All CRUD operations**: Create, Read, Update, Delete, List, Upsert
237
+ - ✅ **Bulk operations**: Create Many, Get Many, Update Many, Delete Many, Upsert Many
238
+ - ✅ **Complex field types**: FullName, Links, Currency, Address, Emails, Phones
239
+ - ✅ **SELECT/MULTI_SELECT**: Dynamic options with real-time loading
240
+ - ✅ **Automatic field type detection**: Template-based inputs (no JSON required)
241
+ - ✅ **Smart caching**: Fresh on execution, cached in editor
242
+ - ✅ **Zero external dependencies**: Native n8n helpers only
243
+
244
+ ### Roadmap ⏳
245
+ - ⏳ Advanced filter UI improvements
246
+ - ⏳ Add support for remaining Twenty complex field types (Rating, etc.)
247
+ - ⏳ Support for Twenty "Views" and "Relations" and new AI Features
248
+ - ⏳ Support for get Database and Notion style resources
249
+
250
+
251
+ ---
252
+
253
+
254
+ ## Resources
255
+
256
+ - 📚 [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
257
+ - 🔧 [Twenty Developer Documentation](https://twenty.com/developers/)
258
+ - 🔗 [Twenty GraphQL API Documentation](https://twenty.com/developers/section/graphql)
259
+ - 📝 [Changelog](CHANGELOG.md) - Version history and release notes
260
+ - 💻 [GitHub Repository](https://github.com/Logrui/n8n-nodes-twenty-dynamic) - Source code and issues
261
+ - 📦 [npm Package](https://www.npmjs.com/package/n8n-nodes-twenty-dynamic) - Package details
262
+
263
+ ---
264
+
265
+
266
+ ## Compatibility
267
+
268
+ Compatible and tested with Twenty CRM v2.8.3 and n8n Version 2.0 Beta (Last Updated: 2026-06-03)
269
+
270
+
271
+ ## Credits
272
+
273
+ **Primary Development:**
274
+ - [s-yhc](https://github.com/s-yhc) - Dynamic node architecture and custom objects integration
275
+
276
+ **Maintainer:**
277
+ - [Logrui](https://github.com/Logrui)
278
+
279
+ **Community Contributors:**
280
+ - Testing and feedback from the n8n and Twenty communities
281
+ - Bug reports and feature requests via GitHub Issues
282
+
283
+ ---
284
+
285
+ **License:** MIT
286
+
287
+ **Support:** [GitHub Issues](https://github.com/Logrui/n8n-nodes-twenty-dynamic/issues)
288
+
289
+ **Latest Version:** Check [npm](https://www.npmjs.com/package/n8n-nodes-twenty-dynamic) or [GitHub Releases](https://github.com/Logrui/n8n-nodes-twenty-dynamic/releases)
290
+
@@ -0,0 +1,8 @@
1
+ import { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class TwentyApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ properties: INodeProperties[];
6
+ authenticate: IAuthenticateGeneric;
7
+ test: ICredentialTestRequest;
8
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TwentyApi = void 0;
4
+ class TwentyApi {
5
+ constructor() {
6
+ this.name = 'twentyApi';
7
+ this.displayName = 'Twenty API';
8
+ this.properties = [
9
+ {
10
+ displayName: 'API key',
11
+ name: 'apiKey',
12
+ type: 'string',
13
+ typeOptions: { password: true },
14
+ default: '',
15
+ hint: 'Generate in Settings → API & Webhooks. Keys can be scoped to a role under Settings → Members → Roles → Assignment tab.',
16
+ },
17
+ {
18
+ displayName: 'Domain',
19
+ name: 'domain',
20
+ type: 'string',
21
+ default: '',
22
+ hint: 'Your Twenty CRM base URL, e.g. https://yourworkspace.twenty.com',
23
+ },
24
+ {
25
+ displayName: 'Schema Cache',
26
+ name: 'schemaCache',
27
+ type: 'hidden',
28
+ default: '',
29
+ description: 'Stores the API schema to reduce API calls. Will be updated automatically.',
30
+ },
31
+ ];
32
+ this.authenticate = {
33
+ type: 'generic',
34
+ properties: {
35
+ headers: {
36
+ Authorization: '={{"Bearer " + $credentials.apiKey}}',
37
+ },
38
+ },
39
+ };
40
+ this.test = {
41
+ request: {
42
+ baseURL: '={{$credentials?.domain}}',
43
+ url: '/open-api/core',
44
+ },
45
+ };
46
+ }
47
+ }
48
+ exports.TwentyApi = TwentyApi;
49
+ //# sourceMappingURL=TwentyApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TwentyApi.credentials.js","sourceRoot":"","sources":["../../credentials/TwentyApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,SAAS;IAAtB;QACC,SAAI,GAAG,WAAW,CAAC;QACnB,gBAAW,GAAG,YAAY,CAAC;QAC3B,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,wHAAwH;aAC9H;YACD;gBACC,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,iEAAiE;aACvE;YACD;gBACC,WAAW,EAAE,cAAc;gBAC3B,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,2EAA2E;aACxF;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,sCAAsC;iBACrD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,2BAA2B;gBACpC,GAAG,EAAE,gBAAgB;aACrB;SACD,CAAC;IACH,CAAC;CAAA;AA3CD,8BA2CC"}
@@ -0,0 +1,8 @@
1
+ export interface IComplexFieldInfo {
2
+ fieldType: string;
3
+ needsSubFields: boolean;
4
+ }
5
+ export declare const COMPLEX_FIELD_MAPPINGS: Record<string, string>;
6
+ export declare function isComplexField(fieldName: string): boolean;
7
+ export declare function getComplexType(fieldName: string): string | null;
8
+ export declare function getFieldsForComplexType(complexType: string): string[];
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.COMPLEX_FIELD_MAPPINGS = void 0;
4
+ exports.isComplexField = isComplexField;
5
+ exports.getComplexType = getComplexType;
6
+ exports.getFieldsForComplexType = getFieldsForComplexType;
7
+ exports.COMPLEX_FIELD_MAPPINGS = {
8
+ domainName: 'Links',
9
+ linkedinLink: 'Links',
10
+ xLink: 'Links',
11
+ website: 'Links',
12
+ cvcWebsite: 'Links',
13
+ annualRecurringRevenue: 'Currency',
14
+ address: 'Address',
15
+ };
16
+ function isComplexField(fieldName) {
17
+ return fieldName in exports.COMPLEX_FIELD_MAPPINGS;
18
+ }
19
+ function getComplexType(fieldName) {
20
+ return exports.COMPLEX_FIELD_MAPPINGS[fieldName] || null;
21
+ }
22
+ function getFieldsForComplexType(complexType) {
23
+ return Object.entries(exports.COMPLEX_FIELD_MAPPINGS)
24
+ .filter(([_, type]) => type === complexType)
25
+ .map(([fieldName, _]) => fieldName);
26
+ }
27
+ //# sourceMappingURL=ComplexFieldDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComplexFieldDetection.js","sourceRoot":"","sources":["../../../nodes/Twenty/ComplexFieldDetection.ts"],"names":[],"mappings":";;;AAuCA,wCAEC;AAKD,wCAEC;AAKD,0DAIC;AAzCY,QAAA,sBAAsB,GAA2B;IAO7D,UAAU,EAAE,OAAO;IACnB,YAAY,EAAE,OAAO;IACrB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,OAAO;IAGnB,sBAAsB,EAAE,UAAU;IAGlC,OAAO,EAAE,SAAS;CAClB,CAAC;AAKF,SAAgB,cAAc,CAAC,SAAiB;IAC/C,OAAO,SAAS,IAAI,8BAAsB,CAAC;AAC5C,CAAC;AAKD,SAAgB,cAAc,CAAC,SAAiB;IAC/C,OAAO,8BAAsB,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAKD,SAAgB,uBAAuB,CAAC,WAAmB;IAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,8BAAsB,CAAC;SAC3C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { INodeProperties } from 'n8n-workflow';
2
+ export declare const fullNameFields: INodeProperties[];
3
+ export declare const linksFields: INodeProperties[];
4
+ export declare const currencyFields: INodeProperties[];
5
+ export declare const addressFields: INodeProperties[];
6
+ export declare const emailsFields: INodeProperties[];
7
+ export declare const phonesFields: INodeProperties[];
8
+ export declare const richTextFields: INodeProperties[];
9
+ export declare function getAllComplexFieldParameters(): INodeProperties[];
10
+ export declare function getComplexFieldNames(): string[];
11
+ export declare function getComplexFieldNamesForPerson(): string[];
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.richTextFields = exports.phonesFields = exports.emailsFields = exports.addressFields = exports.currencyFields = exports.linksFields = exports.fullNameFields = void 0;
4
+ exports.getAllComplexFieldParameters = getAllComplexFieldParameters;
5
+ exports.getComplexFieldNames = getComplexFieldNames;
6
+ exports.getComplexFieldNamesForPerson = getComplexFieldNamesForPerson;
7
+ exports.fullNameFields = [
8
+ {
9
+ displayName: 'First Name',
10
+ name: 'firstName',
11
+ type: 'string',
12
+ default: '',
13
+ description: 'First name / given name',
14
+ placeholder: 'John',
15
+ },
16
+ {
17
+ displayName: 'Last Name',
18
+ name: 'lastName',
19
+ type: 'string',
20
+ default: '',
21
+ description: 'Last name / family name',
22
+ placeholder: 'Doe',
23
+ },
24
+ ];
25
+ exports.linksFields = [
26
+ {
27
+ displayName: 'URL',
28
+ name: 'primaryLinkUrl',
29
+ type: 'string',
30
+ default: '',
31
+ description: 'The complete URL',
32
+ placeholder: 'https://example.com',
33
+ },
34
+ {
35
+ displayName: 'Label',
36
+ name: 'primaryLinkLabel',
37
+ type: 'string',
38
+ default: '',
39
+ description: 'Display label for the URL',
40
+ placeholder: 'example.com',
41
+ },
42
+ ];
43
+ exports.currencyFields = [
44
+ {
45
+ displayName: 'Amount',
46
+ name: 'currencyAmount',
47
+ type: 'number',
48
+ default: 0,
49
+ description: 'Amount in your currency (will be converted to micros automatically)',
50
+ placeholder: '100000',
51
+ },
52
+ {
53
+ displayName: 'Currency Code',
54
+ name: 'currencyCode',
55
+ type: 'options',
56
+ options: [
57
+ { name: 'Australian Dollar (AUD)', value: 'AUD' },
58
+ { name: 'British Pound (GBP)', value: 'GBP' },
59
+ { name: 'Canadian Dollar (CAD)', value: 'CAD' },
60
+ { name: 'Chinese Yuan (CNY)', value: 'CNY' },
61
+ { name: 'Euro (EUR)', value: 'EUR' },
62
+ { name: 'Japanese Yen (JPY)', value: 'JPY' },
63
+ { name: 'Swiss Franc (CHF)', value: 'CHF' },
64
+ { name: 'US Dollar (USD)', value: 'USD' },
65
+ ],
66
+ default: 'USD',
67
+ description: 'Three-letter currency code',
68
+ },
69
+ ];
70
+ exports.addressFields = [
71
+ {
72
+ displayName: 'Street Address 1',
73
+ name: 'addressStreet1',
74
+ type: 'string',
75
+ default: '',
76
+ description: 'Primary street address',
77
+ placeholder: '123 Main Street',
78
+ },
79
+ {
80
+ displayName: 'Street Address 2',
81
+ name: 'addressStreet2',
82
+ type: 'string',
83
+ default: '',
84
+ description: 'Apartment, suite, unit, etc. (optional).',
85
+ placeholder: 'Suite 100',
86
+ },
87
+ {
88
+ displayName: 'City',
89
+ name: 'addressCity',
90
+ type: 'string',
91
+ default: '',
92
+ description: 'City or locality',
93
+ placeholder: 'New York',
94
+ },
95
+ {
96
+ displayName: 'Postal Code',
97
+ name: 'addressPostcode',
98
+ type: 'string',
99
+ default: '',
100
+ description: 'ZIP or postal code',
101
+ placeholder: '10001',
102
+ },
103
+ {
104
+ displayName: 'State / Province',
105
+ name: 'addressState',
106
+ type: 'string',
107
+ default: '',
108
+ description: 'State, province, or region',
109
+ placeholder: 'NY',
110
+ },
111
+ {
112
+ displayName: 'Country',
113
+ name: 'addressCountry',
114
+ type: 'string',
115
+ default: '',
116
+ description: 'Country name',
117
+ placeholder: 'United States',
118
+ },
119
+ {
120
+ displayName: 'Latitude',
121
+ name: 'addressLat',
122
+ type: 'number',
123
+ default: undefined,
124
+ description: 'Geographic latitude (optional)',
125
+ placeholder: '40.7128',
126
+ },
127
+ {
128
+ displayName: 'Longitude',
129
+ name: 'addressLng',
130
+ type: 'number',
131
+ default: undefined,
132
+ description: 'Geographic longitude (optional)',
133
+ placeholder: '-74.0060',
134
+ },
135
+ ];
136
+ exports.emailsFields = [
137
+ {
138
+ displayName: 'Primary Email',
139
+ name: 'primaryEmail',
140
+ type: 'string',
141
+ default: '',
142
+ description: 'Primary email address',
143
+ placeholder: 'john@example.com',
144
+ },
145
+ ];
146
+ exports.phonesFields = [
147
+ {
148
+ displayName: 'Primary Phone Number',
149
+ name: 'primaryPhoneNumber',
150
+ type: 'string',
151
+ default: '',
152
+ placeholder: '+1-555-0123',
153
+ },
154
+ {
155
+ displayName: 'Country Code',
156
+ name: 'primaryPhoneCountryCode',
157
+ type: 'string',
158
+ default: '',
159
+ description: 'Two-letter country code (ISO 3166-1 alpha-2)',
160
+ placeholder: 'US',
161
+ },
162
+ {
163
+ displayName: 'Calling Code',
164
+ name: 'primaryPhoneCallingCode',
165
+ type: 'string',
166
+ default: '',
167
+ description: 'International calling code with plus sign',
168
+ placeholder: '+1',
169
+ },
170
+ ];
171
+ exports.richTextFields = [
172
+ {
173
+ displayName: 'Markdown',
174
+ name: 'markdown',
175
+ type: 'string',
176
+ typeOptions: { rows: 4 },
177
+ default: '',
178
+ description: 'Content in Markdown format',
179
+ placeholder: '## Heading\n\nYour content here...',
180
+ },
181
+ ];
182
+ function getAllComplexFieldParameters() {
183
+ return [
184
+ ...exports.fullNameFields,
185
+ ...exports.linksFields,
186
+ ...exports.currencyFields,
187
+ ...exports.addressFields,
188
+ ...exports.emailsFields,
189
+ ...exports.phonesFields,
190
+ ...exports.richTextFields,
191
+ ];
192
+ }
193
+ function getComplexFieldNames() {
194
+ return [
195
+ 'name',
196
+ 'domainName',
197
+ 'linkedinLink',
198
+ 'xLink',
199
+ 'website',
200
+ 'cvcWebsite',
201
+ 'annualRecurringRevenue',
202
+ 'address',
203
+ ];
204
+ }
205
+ function getComplexFieldNamesForPerson() {
206
+ return [
207
+ 'name',
208
+ ...getComplexFieldNames(),
209
+ ];
210
+ }
211
+ //# sourceMappingURL=FieldParameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldParameters.js","sourceRoot":"","sources":["../../../nodes/Twenty/FieldParameters.ts"],"names":[],"mappings":"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"}