n8n-nodes-framer-cms 0.1.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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FleetPay
4
+ Copyright (c) 2026 emilbou (subsequent modifications)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,148 @@
1
+ # n8n-nodes-framer-cms
2
+
3
+ n8n community node for the **Framer Server API** (`framer-api`). Provides CMS read/write, publish, and deploy operations for Framer projects directly inside n8n workflows — no plugin or open browser required.
4
+
5
+ > Independent rewrite/fork of [`n8n-nodes-framer`](https://www.npmjs.com/package/n8n-nodes-framer) v0.2.1 (originally by FleetPay, MIT licensed). Reconstructed from the published package to fix a broken `main` entry point, add types throughout, and continue development independently. See [LICENSE](./LICENSE) for attribution.
6
+
7
+ ## Features
8
+
9
+ - Full CMS access (collections, items, fields)
10
+ - `publish()` and `deploy()` native (covers the gap of webhook-plugin integrations)
11
+ - A compound **Site Manager** resource that accepts a v4-webhook-style JSON payload and runs multi-step read/audit/write flows (see below) — present in the upstream package but undocumented there
12
+ - Credential managed in n8n UI, encrypted in n8n's database — no env vars
13
+ - WebSocket-based, designed for batch operations
14
+ - Works offline of the Framer editor (no need to keep the project open)
15
+
16
+ ## Installation
17
+
18
+ ### Via n8n UI (recommended)
19
+
20
+ 1. Open your self-hosted n8n
21
+ 2. Go to **Settings → Community Nodes**
22
+ 3. Click **Install**
23
+ 4. Enter package name: `n8n-nodes-framer-cms`
24
+ 5. Accept the unverified package disclaimer
25
+ 6. Click **Install**
26
+
27
+ ### Via npm (manual)
28
+
29
+ ```bash
30
+ cd ~/.n8n/custom # or wherever your n8n custom nodes folder is
31
+ npm install n8n-nodes-framer-cms
32
+ ```
33
+
34
+ Restart n8n after manual install.
35
+
36
+ ## Setup
37
+
38
+ ### 1. Generate a Framer API key
39
+
40
+ 1. Open your Framer project in the browser
41
+ 2. Go to **Site Settings → API Keys**
42
+ 3. Click **Create API Key** and copy the value (it is only shown once)
43
+
44
+ ### 2. Create the credential in n8n
45
+
46
+ 1. Go to **Credentials → New**
47
+ 2. Search for **Framer API**
48
+ 3. Fill in:
49
+ - **Project URL**: the URL from your browser address bar, e.g. `https://framer.com/projects/Sites--aabbccddeeff`
50
+ - **API Key**: the key you just created
51
+ 4. Save
52
+
53
+ ### 3. Add the Framer node to a workflow
54
+
55
+ 1. In any workflow, search for **Framer** in the node panel
56
+ 2. Pick the resource and operation
57
+ 3. Bind the credential you created
58
+
59
+ ## Operations
60
+
61
+ ### Site Manager (Compound)
62
+
63
+ Accepts a single **Input JSON** payload (defaults to `$json`, i.e. the incoming webhook body) and runs one of:
64
+
65
+ | Operation | What it does |
66
+ |---|---|
67
+ | Read Structure | Every collection with its fields and item count |
68
+ | Read Page(s) | Items matching one or more slug paths (`path` or `paths`) |
69
+ | Read CMS Collection | All items of a collection matched by name substring (`collection`) |
70
+ | Read CMS Item | One item by collection name + `slug` |
71
+ | Audit SEO | Scans every item for missing/oversized meta title & description |
72
+ | Read Changes | Paths changed since the last publish |
73
+ | Update SEO / Pages | Bulk-updates page fields by `path` (looks for a collection named like "page(s)"/"landing") |
74
+ | Create Page | Adds one item to the pages collection |
75
+ | Create Blog Posts | Adds one or more items to the blog/post collection |
76
+ | Publish | Creates a preview deployment |
77
+ | Deploy | Promotes a `deployment_id` to production |
78
+ | Publish and Deploy | Publish then immediately deploy in one call |
79
+
80
+ This resource exists to be a drop-in target for existing v4-webhook-based automations — point the webhook at this node instead and keep the same JSON body shape.
81
+
82
+ ### Project
83
+ - **Get Info** — display name and hashed project ID
84
+
85
+ ### Collection
86
+ - **Get Many** — list all collections (managed and unmanaged)
87
+ - **Get** — fetch a collection by ID
88
+ - **Get Fields** — list field definitions of a collection
89
+ - **Set Fields** — replace field schema (managed collections only)
90
+
91
+ ### Item
92
+ - **Get Many** — list items in a collection
93
+ - **Add or Update** — bulk insert/update items by ID match
94
+ - **Remove** — delete items by ID
95
+ - **Set Order** — arrange items in a specific order
96
+
97
+ ### Publish
98
+ - **Get Changes** — paths added/removed/modified since last publish
99
+ - **Get Contributors** — authors who contributed to a version range
100
+ - **Create Preview** — publish a preview link, returns deployment ID
101
+ - **Deploy to Production** — promote a preview to production
102
+
103
+ ## Example: full publish flow
104
+
105
+ ```
106
+ Manual Trigger
107
+ → Framer (Item: Add or Update) // populate CMS from external source
108
+ → Framer (Publish: Get Changes) // verify what changed
109
+ → Framer (Publish: Create Preview) // get deployment ID
110
+ → Framer (Publish: Deploy to Production)
111
+ ```
112
+
113
+ ## Architecture notes
114
+
115
+ - The node opens **one WebSocket connection per execution** and reuses it across all input items, then disconnects. This is the recommended pattern for the Framer Server API and avoids reconnect overhead in batch workflows.
116
+ - `framer-api` ships ESM-only (`"type": "module"`) while this node compiles to CommonJS. It's loaded through a dynamic `import()` at runtime (see the top of [`Framer.node.ts`](./nodes/Framer/Framer.node.ts)) so `tsc` doesn't downlevel it to a `require()` call, which would crash with `ERR_REQUIRE_ESM`.
117
+ - Compatible with n8n self-hosted (Community Edition or higher). Not available on n8n Cloud (unverified community nodes are restricted to self-hosted).
118
+
119
+ ## Compatibility
120
+
121
+ - n8n version: ≥ 1.82.0
122
+ - Node.js: ≥ 22 (matches the `framer-api` engine requirement)
123
+ - Framer Server API: open beta
124
+
125
+ ## Development
126
+
127
+ ```bash
128
+ npm install
129
+ npm run build # tsc + copy icons into dist/
130
+ npm run lint
131
+ ```
132
+
133
+ Link into a local n8n instance for testing:
134
+
135
+ ```bash
136
+ npm run build
137
+ npm link
138
+ cd ~/.n8n/custom
139
+ npm link n8n-nodes-framer-cms
140
+ ```
141
+
142
+ ## Support
143
+
144
+ Issues and PRs welcome on this repo.
145
+
146
+ ## License
147
+
148
+ MIT — see [LICENSE](./LICENSE). Originally based on `n8n-nodes-framer` v0.2.1 (MIT, © FleetPay).
@@ -0,0 +1,10 @@
1
+ import { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class FramerApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ icon: "file:framer.svg";
7
+ properties: INodeProperties[];
8
+ authenticate: IAuthenticateGeneric;
9
+ test: ICredentialTestRequest;
10
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FramerApi = void 0;
4
+ class FramerApi {
5
+ constructor() {
6
+ this.name = 'framerApi';
7
+ this.displayName = 'Framer API';
8
+ this.documentationUrl = 'https://www.framer.com/developers/server-api-introduction';
9
+ this.icon = 'file:framer.svg';
10
+ this.properties = [
11
+ {
12
+ displayName: 'Project URL',
13
+ name: 'projectUrl',
14
+ type: 'string',
15
+ default: '',
16
+ required: true,
17
+ placeholder: 'https://framer.com/projects/Sites--aabbccddeeff',
18
+ description: 'The full URL of your Framer project. Find it in the browser address bar when the project is open.',
19
+ },
20
+ {
21
+ displayName: 'API Key',
22
+ name: 'apiKey',
23
+ type: 'string',
24
+ typeOptions: { password: true },
25
+ default: '',
26
+ required: true,
27
+ description: 'Generate an API key in the Framer site settings of your project. The key is shown only once at creation.',
28
+ },
29
+ ];
30
+ this.authenticate = {
31
+ type: 'generic',
32
+ properties: {},
33
+ };
34
+ this.test = {
35
+ request: {
36
+ baseURL: '={{$credentials.projectUrl}}',
37
+ url: '/',
38
+ method: 'HEAD',
39
+ },
40
+ };
41
+ }
42
+ }
43
+ exports.FramerApi = FramerApi;
44
+ //# sourceMappingURL=FramerApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FramerApi.credentials.js","sourceRoot":"","sources":["../../credentials/FramerApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,SAAS;IAAtB;QACC,SAAI,GAAG,WAAW,CAAC;QAEnB,gBAAW,GAAG,YAAY,CAAC;QAE3B,qBAAgB,GAAG,2DAA2D,CAAC;QAE/E,SAAI,GAAG,iBAA0B,CAAC;QAElC,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,aAAa;gBAC1B,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,iDAAiD;gBAC9D,WAAW,EACV,mGAAmG;aACpG;YACD;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,QAAQ,EAAE,IAAI;gBACd,WAAW,EACV,0GAA0G;aAC3G;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,EAAE;SACd,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,8BAA8B;gBACvC,GAAG,EAAE,GAAG;gBACR,MAAM,EAAE,MAAM;aACd;SACD,CAAC;IACH,CAAC;CAAA;AA5CD,8BA4CC"}
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" width="60" height="60">
2
+ <defs>
3
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0%" stop-color="#0099FF"/>
5
+ <stop offset="100%" stop-color="#00C8FF"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="60" height="60" rx="12" fill="url(#g)"/>
9
+ <path
10
+ d="M18 12 L42 12 L42 24 L30 24 L42 36 L30 36 L30 48 L18 48 L18 36 L18 24 Z"
11
+ fill="#FFFFFF"
12
+ />
13
+ </svg>
@@ -0,0 +1,2 @@
1
+ export { FramerApi } from './credentials/FramerApi.credentials';
2
+ export { Framer } from './nodes/Framer/Framer.node';
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Framer = exports.FramerApi = void 0;
4
+ var FramerApi_credentials_1 = require("./credentials/FramerApi.credentials");
5
+ Object.defineProperty(exports, "FramerApi", { enumerable: true, get: function () { return FramerApi_credentials_1.FramerApi; } });
6
+ var Framer_node_1 = require("./nodes/Framer/Framer.node");
7
+ Object.defineProperty(exports, "Framer", { enumerable: true, get: function () { return Framer_node_1.Framer; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAAA,6EAAgE;AAAvD,kHAAA,SAAS,OAAA;AAClB,0DAAoD;AAA3C,qGAAA,MAAM,OAAA"}
@@ -0,0 +1,5 @@
1
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class Framer implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,626 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Framer = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ /**
6
+ * framer-api ships ESM-only ("type": "module"), while this node compiles to
7
+ * CommonJS like the rest of n8n. A static `import` would be rewritten to
8
+ * `require()` by tsc and crash at runtime with ERR_REQUIRE_ESM, so the
9
+ * connector is loaded through a dynamic `import()` that tsc cannot downlevel.
10
+ */
11
+ async function loadFramerConnect() {
12
+ const dynamicImport = new Function('m', 'return import(m)');
13
+ const mod = await dynamicImport('framer-api');
14
+ return mod.connect;
15
+ }
16
+ function getErrorMessage(error) {
17
+ return error instanceof Error ? error.message : String(error);
18
+ }
19
+ function parseJsonArray(input, label, ctx) {
20
+ let parsed = input;
21
+ if (typeof input === 'string') {
22
+ try {
23
+ parsed = JSON.parse(input);
24
+ }
25
+ catch (err) {
26
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `${label} is not valid JSON: ${getErrorMessage(err)}`);
27
+ }
28
+ }
29
+ if (!Array.isArray(parsed)) {
30
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `${label} must be a JSON array`);
31
+ }
32
+ return parsed;
33
+ }
34
+ async function getCollectionById(framer, id, ctx) {
35
+ const all = await framer.getCollections();
36
+ const found = all.find((c) => c.id === id);
37
+ if (!found) {
38
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `Collection not found: ${id}`);
39
+ }
40
+ return found;
41
+ }
42
+ /**
43
+ * Compound "Site Manager" resource: bundles multi-step read/audit/write
44
+ * flows behind a single v4-webhook-compatible JSON payload, so existing
45
+ * webhook-based automations can be pointed at this node with no payload
46
+ * changes.
47
+ */
48
+ async function runSiteManager(framer, operation, data, ctx, itemIndex) {
49
+ const result = { success: true, action: operation };
50
+ const getCollections = async () => framer.getCollections();
51
+ const findCollection = async (nameSubstr) => {
52
+ const all = await getCollections();
53
+ const tgt = String(nameSubstr ?? '').toLowerCase();
54
+ return all.find((c) => (c.name || '').toLowerCase().includes(tgt));
55
+ };
56
+ try {
57
+ if (operation === 'readStructure') {
58
+ const cols = await getCollections();
59
+ const details = [];
60
+ for (const col of cols) {
61
+ let fields = [];
62
+ let items = [];
63
+ try {
64
+ fields = (await col.getFields());
65
+ }
66
+ catch (e) {
67
+ fields = [{ error: getErrorMessage(e) }];
68
+ }
69
+ try {
70
+ items = (await col.getItems());
71
+ }
72
+ catch {
73
+ items = [];
74
+ }
75
+ details.push({
76
+ name: col.name,
77
+ id: col.id,
78
+ slug: col.slug,
79
+ itemCount: Array.isArray(items) ? items.length : 0,
80
+ fields: Array.isArray(fields)
81
+ ? fields.map((f) => ({ name: f.name, type: f.type, id: f.id }))
82
+ : fields,
83
+ });
84
+ }
85
+ result.collections = details;
86
+ }
87
+ else if (operation === 'readPages') {
88
+ const paths = data.path ? [data.path] : (data.paths || []);
89
+ const cols = await getCollections();
90
+ const pages = [];
91
+ for (const col of cols) {
92
+ const items = (await col.getItems());
93
+ for (const it of items) {
94
+ const slug = it.slug || '';
95
+ const match = paths.length === 0 ||
96
+ paths.some((p) => p === '/' + slug ||
97
+ p === slug ||
98
+ slug.includes(String(p).replace('/', '')));
99
+ if (match) {
100
+ pages.push({ collection: col.name, slug: it.slug, id: it.id, fieldData: it.fieldData || it });
101
+ }
102
+ }
103
+ }
104
+ result.pages = pages;
105
+ if (pages.length === 0)
106
+ result.note = 'Nenhum item CMS encontrado.';
107
+ }
108
+ else if (operation === 'readCms') {
109
+ const col = await findCollection(data.collection);
110
+ if (col) {
111
+ const items = (await col.getItems());
112
+ const fields = (await col.getFields());
113
+ result.collection = {
114
+ name: col.name,
115
+ id: col.id,
116
+ fields: (Array.isArray(fields) ? fields : []).map((f) => f.name),
117
+ };
118
+ result.items = items.map((it) => ({ slug: it.slug, id: it.id, fieldData: it.fieldData || it }));
119
+ }
120
+ else {
121
+ const all = await getCollections();
122
+ result.error = 'Colecao nao encontrada.';
123
+ result.availableCollections = all.map((c) => c.name);
124
+ }
125
+ }
126
+ else if (operation === 'readCmsItem') {
127
+ const col = await findCollection(data.collection);
128
+ if (col) {
129
+ const items = (await col.getItems());
130
+ const found = items.find((i) => i.slug === data.slug);
131
+ if (found) {
132
+ result.item = { slug: found.slug, id: found.id, fieldData: found.fieldData || found };
133
+ }
134
+ else {
135
+ result.error = 'Item nao encontrado.';
136
+ result.availableSlugs = items.map((i) => i.slug);
137
+ }
138
+ }
139
+ else {
140
+ result.error = 'Colecao nao encontrada.';
141
+ }
142
+ }
143
+ else if (operation === 'auditSeo') {
144
+ const cols = await getCollections();
145
+ const issues = [];
146
+ const audits = [];
147
+ for (const col of cols) {
148
+ const items = (await col.getItems());
149
+ const fields = (await col.getFields());
150
+ const fnames = (Array.isArray(fields) ? fields : []).map((f) => (f.name || '').toLowerCase());
151
+ const hasMT = fnames.some((f) => f.includes('meta') && f.includes('title'));
152
+ const hasMD = fnames.some((f) => f.includes('meta') && f.includes('desc'));
153
+ for (const it of items) {
154
+ const fd = it.fieldData || {};
155
+ const aud = { collection: col.name, slug: it.slug };
156
+ const mt = (fd['meta-title'] || fd['metaTitle'] || fd['meta_title']);
157
+ if (mt) {
158
+ aud.meta_title = mt;
159
+ if (mt.length > 60)
160
+ issues.push({ slug: it.slug, issue: 'meta_title_too_long', severity: 'medium' });
161
+ }
162
+ else if (hasMT) {
163
+ issues.push({ slug: it.slug, issue: 'meta_title_missing', severity: 'high' });
164
+ }
165
+ const md = (fd['meta-description'] || fd['metaDescription'] || fd['meta_description']);
166
+ if (md) {
167
+ aud.meta_description = md;
168
+ if (md.length > 160)
169
+ issues.push({ slug: it.slug, issue: 'meta_desc_too_long', severity: 'medium' });
170
+ }
171
+ else if (hasMD) {
172
+ issues.push({ slug: it.slug, issue: 'meta_desc_missing', severity: 'high' });
173
+ }
174
+ aud.fieldData = fd;
175
+ audits.push(aud);
176
+ }
177
+ }
178
+ result.audit = { total_items: audits.length, total_issues: issues.length, issues, items: audits };
179
+ }
180
+ else if (operation === 'readChanges') {
181
+ result.changes = (await framer.getChangedPaths());
182
+ }
183
+ else if (operation === 'updatePages') {
184
+ const pagesInput = data.pages || [];
185
+ const cols = await getCollections();
186
+ const pgCol = cols.find((c) => {
187
+ const n = (c.name || '').toLowerCase();
188
+ return n.includes('page') || n.includes('pagina') || n.includes('landing');
189
+ });
190
+ const updates = [];
191
+ if (!pgCol) {
192
+ updates.push({ error: 'colecao de paginas nao encontrada' });
193
+ }
194
+ else {
195
+ const items = (await pgCol.getItems());
196
+ for (const pg of pagesInput) {
197
+ const slug = (pg.path || '').replace(/^\//, '');
198
+ const existing = items.find((i) => i.slug === slug || i.slug === pg.path);
199
+ const fieldData = {};
200
+ if (pg.meta_title)
201
+ fieldData['meta-title'] = pg.meta_title;
202
+ if (pg.meta_description)
203
+ fieldData['meta-description'] = pg.meta_description;
204
+ if (pg.title)
205
+ fieldData.title = pg.title;
206
+ if (existing) {
207
+ await pgCol.addItems([{ id: existing.id, fieldData }]);
208
+ updates.push({ path: pg.path, updated: true, id: existing.id });
209
+ }
210
+ else {
211
+ updates.push({
212
+ path: pg.path,
213
+ error: 'pagina nao encontrada',
214
+ availableSlugs: items.map((i) => i.slug),
215
+ });
216
+ }
217
+ }
218
+ }
219
+ result.updates = updates;
220
+ }
221
+ else if (operation === 'createPage') {
222
+ const pg = data.page || data;
223
+ const pgCol = (await findCollection('page')) || (await findCollection('pagina')) || (await findCollection('landing'));
224
+ if (pgCol) {
225
+ await pgCol.addItems([
226
+ {
227
+ slug: pg.slug,
228
+ fieldData: {
229
+ title: pg.title,
230
+ 'meta-title': pg.meta_title,
231
+ 'meta-description': pg.meta_description,
232
+ },
233
+ },
234
+ ]);
235
+ result.created = { slug: pg.slug, title: pg.title, addedToCms: true };
236
+ }
237
+ else {
238
+ result.created = { slug: pg.slug, addedToCms: false, error: 'colecao de paginas nao encontrada' };
239
+ }
240
+ }
241
+ else if (operation === 'createBlogPosts') {
242
+ const posts = data.posts || [];
243
+ const blogCol = (await findCollection('blog')) || (await findCollection('post'));
244
+ if (blogCol) {
245
+ const created = [];
246
+ for (const bp of posts) {
247
+ await blogCol.addItems([
248
+ {
249
+ slug: bp.slug,
250
+ fieldData: {
251
+ title: bp.title,
252
+ 'meta-description': bp.meta_description,
253
+ body: bp.body,
254
+ },
255
+ },
256
+ ]);
257
+ created.push({ slug: bp.slug });
258
+ }
259
+ result.itemsAdded = created.length;
260
+ result.items = created;
261
+ }
262
+ else {
263
+ result.error = 'Colecao de blog nao encontrada.';
264
+ }
265
+ }
266
+ else if (operation === 'publish') {
267
+ const pub = await framer.publish();
268
+ result.deployment = pub.deployment;
269
+ result.note = 'Preview publicado. Use operation=deploy com deployment.id para promover a producao.';
270
+ }
271
+ else if (operation === 'deploy') {
272
+ const deploymentId = (data.deployment_id || data.deploymentId);
273
+ if (!deploymentId) {
274
+ result.success = false;
275
+ result.error = 'operation=deploy requer deployment_id (obtido de operation=publish)';
276
+ }
277
+ else {
278
+ result.deployed = (await framer.deploy(deploymentId));
279
+ }
280
+ }
281
+ else if (operation === 'publishAndDeploy') {
282
+ const pub = await framer.publish();
283
+ result.deployment = pub.deployment;
284
+ result.deployed = (await framer.deploy(pub.deployment.id));
285
+ result.note = 'Publicado e promovido a producao em uma so chamada.';
286
+ }
287
+ else {
288
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `Site Manager: operation nao suportada: ${operation}`, {
289
+ itemIndex,
290
+ });
291
+ }
292
+ }
293
+ catch (err) {
294
+ result.success = false;
295
+ result.error = getErrorMessage(err);
296
+ }
297
+ return result;
298
+ }
299
+ class Framer {
300
+ constructor() {
301
+ this.description = {
302
+ displayName: 'Framer',
303
+ name: 'framer',
304
+ icon: 'file:framer.svg',
305
+ group: ['transform'],
306
+ version: 1,
307
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
308
+ description: 'Read and write Framer CMS, publish previews, deploy to production',
309
+ defaults: { name: 'Framer' },
310
+ inputs: ['main'],
311
+ outputs: ['main'],
312
+ credentials: [
313
+ {
314
+ name: 'framerApi',
315
+ required: true,
316
+ },
317
+ ],
318
+ properties: [
319
+ {
320
+ displayName: 'Resource',
321
+ name: 'resource',
322
+ type: 'options',
323
+ noDataExpression: true,
324
+ options: [
325
+ { name: 'Site Manager (Compound)', value: 'siteManager' },
326
+ { name: 'Project', value: 'project' },
327
+ { name: 'Collection', value: 'collection' },
328
+ { name: 'Item', value: 'item' },
329
+ { name: 'Publish', value: 'publish' },
330
+ ],
331
+ default: 'siteManager',
332
+ },
333
+ {
334
+ displayName: 'Operation',
335
+ name: 'operation',
336
+ type: 'options',
337
+ noDataExpression: true,
338
+ displayOptions: { show: { resource: ['siteManager'] } },
339
+ options: [
340
+ { name: 'Read Structure', value: 'readStructure', action: 'Read all collections with fields and item counts' },
341
+ { name: 'Read Page(s)', value: 'readPages', action: 'Read items by slug path' },
342
+ { name: 'Read CMS Collection', value: 'readCms', action: 'Read all items of a collection by name' },
343
+ { name: 'Read CMS Item', value: 'readCmsItem', action: 'Read one item by collection + slug' },
344
+ { name: 'Audit SEO', value: 'auditSeo', action: 'Scan all items for SEO issues' },
345
+ { name: 'Read Changes', value: 'readChanges', action: 'List changed paths since last publish' },
346
+ { name: 'Update SEO / Pages', value: 'updatePages', action: 'Bulk update page fields by path' },
347
+ { name: 'Create Page', value: 'createPage', action: 'Create a new page in the pages collection' },
348
+ { name: 'Create Blog Posts', value: 'createBlogPosts', action: 'Create blog posts in the blog collection' },
349
+ { name: 'Publish', value: 'publish', action: 'Publish a preview' },
350
+ { name: 'Deploy', value: 'deploy', action: 'Promote deployment to production' },
351
+ { name: 'Publish and Deploy', value: 'publishAndDeploy', action: 'Publish preview and immediately deploy to production' },
352
+ ],
353
+ default: 'readStructure',
354
+ },
355
+ {
356
+ displayName: 'Input JSON',
357
+ name: 'siteManagerInput',
358
+ type: 'json',
359
+ default: '={{ $json }}',
360
+ displayOptions: { show: { resource: ['siteManager'] } },
361
+ description: 'Payload compatible with the v4 webhook. For most operations leave as $JSON (passes webhook body).',
362
+ },
363
+ {
364
+ displayName: 'Operation',
365
+ name: 'operation',
366
+ type: 'options',
367
+ noDataExpression: true,
368
+ displayOptions: { show: { resource: ['project'] } },
369
+ options: [
370
+ {
371
+ name: 'Get Info',
372
+ value: 'getInfo',
373
+ action: 'Get project info',
374
+ description: 'Retrieve display name and hashed ID of the project',
375
+ },
376
+ ],
377
+ default: 'getInfo',
378
+ },
379
+ {
380
+ displayName: 'Operation',
381
+ name: 'operation',
382
+ type: 'options',
383
+ noDataExpression: true,
384
+ displayOptions: { show: { resource: ['collection'] } },
385
+ options: [
386
+ {
387
+ name: 'Get Many',
388
+ value: 'getMany',
389
+ action: 'List all collections',
390
+ description: 'Returns both managed and unmanaged collections in the project',
391
+ },
392
+ { name: 'Get', value: 'get', action: 'Get a collection by ID' },
393
+ { name: 'Get Fields', value: 'getFields', action: 'Get all fields of a collection' },
394
+ {
395
+ name: 'Set Fields',
396
+ value: 'setFields',
397
+ action: 'Replace the field schema of a managed collection',
398
+ description: 'Only works on collections this integration manages. Pass a JSON array of field definitions.',
399
+ },
400
+ ],
401
+ default: 'getMany',
402
+ },
403
+ {
404
+ displayName: 'Operation',
405
+ name: 'operation',
406
+ type: 'options',
407
+ noDataExpression: true,
408
+ displayOptions: { show: { resource: ['item'] } },
409
+ options: [
410
+ { name: 'Get Many', value: 'getMany', action: 'List items in a collection' },
411
+ {
412
+ name: 'Add or Update',
413
+ value: 'addOrUpdate',
414
+ action: 'Add new items or update existing ones',
415
+ description: 'Items with matching IDs are updated, others are inserted. Pass a JSON array of items.',
416
+ },
417
+ { name: 'Remove', value: 'remove', action: 'Remove items by ID from a collection' },
418
+ { name: 'Set Order', value: 'setOrder', action: 'Arrange items in a specific order' },
419
+ ],
420
+ default: 'getMany',
421
+ },
422
+ {
423
+ displayName: 'Operation',
424
+ name: 'operation',
425
+ type: 'options',
426
+ noDataExpression: true,
427
+ displayOptions: { show: { resource: ['publish'] } },
428
+ options: [
429
+ { name: 'Get Changes', value: 'getChanges', action: 'List paths added removed or modified since last publish' },
430
+ { name: 'Get Contributors', value: 'getContributors', action: 'List authors who made changes between versions' },
431
+ {
432
+ name: 'Create Preview',
433
+ value: 'createPreview',
434
+ action: 'Publish a new preview link with current changes',
435
+ description: 'Returns the deployment ID needed for Deploy to Production',
436
+ },
437
+ { name: 'Deploy to Production', value: 'deploy', action: 'Promote a preview deployment to production' },
438
+ ],
439
+ default: 'createPreview',
440
+ },
441
+ {
442
+ displayName: 'Collection ID',
443
+ name: 'collectionId',
444
+ type: 'string',
445
+ required: true,
446
+ default: '',
447
+ displayOptions: {
448
+ show: {
449
+ resource: ['collection', 'item'],
450
+ operation: ['get', 'getFields', 'setFields', 'getMany', 'addOrUpdate', 'remove', 'setOrder'],
451
+ },
452
+ hide: { resource: ['collection'], operation: ['getMany'] },
453
+ },
454
+ description: 'The ID of the CMS collection',
455
+ },
456
+ {
457
+ displayName: 'Items (JSON)',
458
+ name: 'itemsJson',
459
+ type: 'json',
460
+ required: true,
461
+ default: '[\n {\n "id": "optional-existing-id",\n "fieldData": {\n "title": "Example",\n "slug": "example"\n }\n }\n]',
462
+ displayOptions: { show: { resource: ['item'], operation: ['addOrUpdate'] } },
463
+ description: 'Array of items to add or update. Items with an existing ID will be updated, others will be inserted.',
464
+ },
465
+ {
466
+ displayName: 'Item IDs',
467
+ name: 'itemIds',
468
+ type: 'string',
469
+ required: true,
470
+ default: '',
471
+ placeholder: 'id1,id2,id3',
472
+ displayOptions: { show: { resource: ['item'], operation: ['remove', 'setOrder'] } },
473
+ description: 'Comma-separated list of item IDs',
474
+ },
475
+ {
476
+ displayName: 'Fields (JSON)',
477
+ name: 'fieldsJson',
478
+ type: 'json',
479
+ required: true,
480
+ default: '[\n { "id": "title", "name": "Title", "type": "string" },\n { "id": "slug", "name": "Slug", "type": "string" }\n]',
481
+ displayOptions: { show: { resource: ['collection'], operation: ['setFields'] } },
482
+ description: 'Array of field definitions. Only valid on collections managed by this integration.',
483
+ },
484
+ {
485
+ displayName: 'Deployment ID',
486
+ name: 'deploymentId',
487
+ type: 'string',
488
+ required: true,
489
+ default: '',
490
+ displayOptions: { show: { resource: ['publish'], operation: ['deploy'] } },
491
+ description: 'The deployment ID returned by Create Preview',
492
+ },
493
+ {
494
+ displayName: 'From Version',
495
+ name: 'fromVersion',
496
+ type: 'number',
497
+ default: 0,
498
+ displayOptions: { show: { resource: ['publish'], operation: ['getContributors'] } },
499
+ description: 'Optional. Starting version number. Leave 0 for default.',
500
+ },
501
+ {
502
+ displayName: 'To Version',
503
+ name: 'toVersion',
504
+ type: 'number',
505
+ default: 0,
506
+ displayOptions: { show: { resource: ['publish'], operation: ['getContributors'] } },
507
+ description: 'Optional. Ending version number. Leave 0 for default.',
508
+ },
509
+ ],
510
+ };
511
+ }
512
+ async execute() {
513
+ const items = this.getInputData();
514
+ const returnData = [];
515
+ const credentials = (await this.getCredentials('framerApi'));
516
+ const connect = await loadFramerConnect();
517
+ const framer = await connect(credentials.projectUrl, credentials.apiKey);
518
+ try {
519
+ for (let i = 0; i < items.length; i++) {
520
+ const resource = this.getNodeParameter('resource', i);
521
+ const operation = this.getNodeParameter('operation', i);
522
+ try {
523
+ let result;
524
+ if (resource === 'siteManager') {
525
+ const rawInput = this.getNodeParameter('siteManagerInput', i);
526
+ const input = (typeof rawInput === 'string' ? JSON.parse(rawInput) : rawInput || {});
527
+ const data = input.body || input;
528
+ result = await runSiteManager(framer, operation, data, this, i);
529
+ }
530
+ else if (resource === 'project' && operation === 'getInfo') {
531
+ result = await framer.getProjectInfo();
532
+ }
533
+ else if (resource === 'collection' && operation === 'getMany') {
534
+ result = await framer.getCollections();
535
+ }
536
+ else if (resource === 'collection' && operation === 'get') {
537
+ const id = this.getNodeParameter('collectionId', i);
538
+ const all = await framer.getCollections();
539
+ result = all.find((c) => c.id === id) ?? null;
540
+ }
541
+ else if (resource === 'collection' && operation === 'getFields') {
542
+ const id = this.getNodeParameter('collectionId', i);
543
+ const collection = await getCollectionById(framer, id, this);
544
+ result = await collection.getFields();
545
+ }
546
+ else if (resource === 'collection' && operation === 'setFields') {
547
+ const id = this.getNodeParameter('collectionId', i);
548
+ const fields = parseJsonArray(this.getNodeParameter('fieldsJson', i), 'Fields', this);
549
+ const collection = await getCollectionById(framer, id, this);
550
+ if (typeof collection.setFields !== 'function') {
551
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Collection ${id} is unmanaged. setFields only works on managed collections.`, { itemIndex: i });
552
+ }
553
+ result = await collection.setFields(fields);
554
+ }
555
+ else if (resource === 'item' && operation === 'getMany') {
556
+ const id = this.getNodeParameter('collectionId', i);
557
+ const collection = await getCollectionById(framer, id, this);
558
+ result = await collection.getItems();
559
+ }
560
+ else if (resource === 'item' && operation === 'addOrUpdate') {
561
+ const id = this.getNodeParameter('collectionId', i);
562
+ const itemsPayload = parseJsonArray(this.getNodeParameter('itemsJson', i), 'Items', this);
563
+ const collection = await getCollectionById(framer, id, this);
564
+ result = await collection.addItems(itemsPayload);
565
+ }
566
+ else if (resource === 'item' && operation === 'remove') {
567
+ const id = this.getNodeParameter('collectionId', i);
568
+ const ids = this.getNodeParameter('itemIds', i)
569
+ .split(',')
570
+ .map((s) => s.trim())
571
+ .filter(Boolean);
572
+ const collection = await getCollectionById(framer, id, this);
573
+ result = await collection.removeItems(ids);
574
+ }
575
+ else if (resource === 'item' && operation === 'setOrder') {
576
+ const id = this.getNodeParameter('collectionId', i);
577
+ const ids = this.getNodeParameter('itemIds', i)
578
+ .split(',')
579
+ .map((s) => s.trim())
580
+ .filter(Boolean);
581
+ const collection = await getCollectionById(framer, id, this);
582
+ result = await collection.setItemOrder(ids);
583
+ }
584
+ else if (resource === 'publish' && operation === 'getChanges') {
585
+ result = await framer.getChangedPaths();
586
+ }
587
+ else if (resource === 'publish' && operation === 'getContributors') {
588
+ const fromVersion = this.getNodeParameter('fromVersion', i);
589
+ const toVersion = this.getNodeParameter('toVersion', i);
590
+ result = await framer.getChangeContributors(fromVersion || undefined, toVersion || undefined);
591
+ }
592
+ else if (resource === 'publish' && operation === 'createPreview') {
593
+ result = await framer.publish();
594
+ }
595
+ else if (resource === 'publish' && operation === 'deploy') {
596
+ const deploymentId = this.getNodeParameter('deploymentId', i);
597
+ result = await framer.deploy(deploymentId);
598
+ }
599
+ else {
600
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unsupported combination: resource=${resource}, operation=${operation}`, { itemIndex: i });
601
+ }
602
+ returnData.push({
603
+ json: { resource, operation, data: (result ?? null) },
604
+ pairedItem: { item: i },
605
+ });
606
+ }
607
+ catch (error) {
608
+ if (this.continueOnFail()) {
609
+ returnData.push({
610
+ json: { error: getErrorMessage(error), resource, operation },
611
+ pairedItem: { item: i },
612
+ });
613
+ continue;
614
+ }
615
+ throw error;
616
+ }
617
+ }
618
+ }
619
+ finally {
620
+ await framer.disconnect();
621
+ }
622
+ return [returnData];
623
+ }
624
+ }
625
+ exports.Framer = Framer;
626
+ //# sourceMappingURL=Framer.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Framer.node.js","sourceRoot":"","sources":["../../../nodes/Framer/Framer.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "node": "n8n-nodes-base.framer",
3
+ "nodeVersion": "1.0",
4
+ "codexVersion": "1.0",
5
+ "categories": ["Marketing", "Productivity"],
6
+ "resources": {
7
+ "credentialDocumentation": [
8
+ {
9
+ "url": "https://www.framer.com/developers/server-api-introduction"
10
+ }
11
+ ],
12
+ "primaryDocumentation": [
13
+ {
14
+ "url": "https://github.com/emilbou/n8n-nodes-framer-cms"
15
+ }
16
+ ]
17
+ }
18
+ }
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" width="60" height="60">
2
+ <defs>
3
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0%" stop-color="#0099FF"/>
5
+ <stop offset="100%" stop-color="#00C8FF"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="60" height="60" rx="12" fill="url(#g)"/>
9
+ <path
10
+ d="M18 12 L42 12 L42 24 L30 24 L42 36 L30 36 L30 48 L18 48 L18 36 L18 24 Z"
11
+ fill="#FFFFFF"
12
+ />
13
+ </svg>
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "n8n-nodes-framer-cms",
3
+ "version": "0.1.0",
4
+ "description": "n8n community node for the official Framer Server API. CMS read/write, publish, deploy, plus a webhook-compatible Site Manager compound resource.",
5
+ "keywords": [
6
+ "n8n-community-node-package",
7
+ "n8n",
8
+ "n8n-nodes",
9
+ "framer",
10
+ "framer-api",
11
+ "cms"
12
+ ],
13
+ "license": "MIT",
14
+ "homepage": "https://github.com/emilbou/n8n-nodes-framer-cms",
15
+ "author": {
16
+ "name": "emilbou"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/emilbou/n8n-nodes-framer-cms.git"
21
+ },
22
+ "engines": {
23
+ "node": ">=22"
24
+ },
25
+ "main": "dist/index.js",
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsc && gulp build:icons",
31
+ "dev": "tsc --watch",
32
+ "format": "prettier nodes credentials --write",
33
+ "lint": "eslint nodes credentials --ext .ts && eslint package.json",
34
+ "lintfix": "eslint nodes credentials --ext .ts --fix",
35
+ "prepublishOnly": "npm run build && npm run lint"
36
+ },
37
+ "n8n": {
38
+ "n8nNodesApiVersion": 1,
39
+ "credentials": [
40
+ "dist/credentials/FramerApi.credentials.js"
41
+ ],
42
+ "nodes": [
43
+ "dist/nodes/Framer/Framer.node.js"
44
+ ]
45
+ },
46
+ "dependencies": {
47
+ "framer-api": "^0.1.18"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.10.0",
51
+ "@typescript-eslint/parser": "~7.15",
52
+ "eslint": "^8.56.0",
53
+ "eslint-plugin-n8n-nodes-base": "^1.16.3",
54
+ "gulp": "^4.0.2",
55
+ "n8n-workflow": "^1.82.0",
56
+ "prettier": "^3.2.5",
57
+ "typescript": "^5.4.5"
58
+ },
59
+ "peerDependencies": {
60
+ "n8n-workflow": "*"
61
+ }
62
+ }