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 +22 -0
- package/README.md +148 -0
- package/dist/credentials/FramerApi.credentials.d.ts +10 -0
- package/dist/credentials/FramerApi.credentials.js +44 -0
- package/dist/credentials/FramerApi.credentials.js.map +1 -0
- package/dist/credentials/framer.svg +13 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/Framer/Framer.node.d.ts +5 -0
- package/dist/nodes/Framer/Framer.node.js +626 -0
- package/dist/nodes/Framer/Framer.node.js.map +1 -0
- package/dist/nodes/Framer/Framer.node.json +18 -0
- package/dist/nodes/Framer/framer.svg +13 -0
- package/package.json +62 -0
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>
|
package/dist/index.d.ts
ADDED
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,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
|
+
}
|