@ironfang/n8n-nodes-ironfang 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -2
- package/dist/{nodes/Ironfang → lib}/renderwolf.d.ts +1 -1
- package/dist/{nodes/Ironfang → lib}/renderwolf.js +2 -2
- package/dist/nodes/Ironfang/Ironfang.node.js +26 -10
- package/dist/nodes/Ironfang/IronfangTrigger.node.d.ts +8 -1
- package/dist/nodes/Ironfang/IronfangTrigger.node.js +19 -2
- package/docs/n8n-re-review-0.3.1.md +25 -0
- package/docs/validation.md +19 -7
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -6,8 +6,9 @@ Use Renderwolf, Financewolf, Auditwolf and Ironfang's public developer tools in
|
|
|
6
6
|
n8n. The Ironfang action node has **103 operations**, grouped by product. Ironfang
|
|
7
7
|
Trigger receives signed Auditwolf and Renderwolf events.
|
|
8
8
|
|
|
9
|
-
**Release: 0.3.
|
|
10
|
-
|
|
9
|
+
**Release: 0.3.1.** This patch addresses the n8n submission feedback on webhook
|
|
10
|
+
lifecycle hooks, static operation defaults and the shared Renderwolf module.
|
|
11
|
+
It includes the product expansion and signed event trigger from 0.3.0.
|
|
11
12
|
|
|
12
13
|
## Installation and credentials
|
|
13
14
|
|
|
@@ -136,6 +137,10 @@ deleting the n8n workflow removes its local listener; disable/delete the product
|
|
|
136
137
|
endpoint separately to stop deliveries. Rotating an endpoint secret requires
|
|
137
138
|
updating the n8n credential.
|
|
138
139
|
|
|
140
|
+
The required `checkExists`, `create` and `delete` lifecycle hooks acknowledge
|
|
141
|
+
this external setup. They do not call the product management API or verify
|
|
142
|
+
remote registration. Use Test Webhook/Test Destination to check delivery.
|
|
143
|
+
|
|
139
144
|
## Outputs, examples and compatibility
|
|
140
145
|
|
|
141
146
|
Existing Renderwolf version 1 workflows retain string `bytes` and `error`
|
|
@@ -168,6 +173,8 @@ Run `npm ci --ignore-scripts` and `npm run check`. With Docker, run
|
|
|
168
173
|
`bash scripts/check-runtime.sh` and `bash scripts/check-webhook-runtime.sh`.
|
|
169
174
|
These execute local fixtures, including multipart/file handling and signed
|
|
170
175
|
webhooks; they make no paid API calls. CI requires both before release.
|
|
176
|
+
Lint runs with inline configuration disabled, matching the submission scanner's
|
|
177
|
+
handling of suppression comments. Shared code in `lib/` is also linted and packaged.
|
|
171
178
|
|
|
172
179
|
To refresh the catalogue from an Ironfang source checkout, use
|
|
173
180
|
`python3 scripts/sync-contracts.py /path/to/ironfang` (development-only PyYAML).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IExecuteFunctions, INodeExecutionData, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
-
import { credentialTest } from '
|
|
2
|
+
import { credentialTest } from '../nodes/Ironfang/credentialTest';
|
|
3
3
|
/**
|
|
4
4
|
* Ironfang node. One node per vendor: pick a product with Resource, then an
|
|
5
5
|
* operation within it. Renderwolf (https://ironfang.uk/renderwolf/docs) is the
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.renderwolf = void 0;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
-
const transport_1 = require("
|
|
6
|
-
const credentialTest_1 = require("
|
|
5
|
+
const transport_1 = require("../nodes/Ironfang/transport");
|
|
6
|
+
const credentialTest_1 = require("../nodes/Ironfang/credentialTest");
|
|
7
7
|
/**
|
|
8
8
|
* Ironfang node. One node per vendor: pick a product with Resource, then an
|
|
9
9
|
* operation within it. Renderwolf (https://ironfang.uk/renderwolf/docs) is the
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Ironfang = void 0;
|
|
4
|
-
const renderwolf_1 = require("
|
|
4
|
+
const renderwolf_1 = require("../../lib/renderwolf");
|
|
5
5
|
const catalog_1 = require("./catalog");
|
|
6
6
|
const parameters_1 = require("./parameters");
|
|
7
7
|
const execute_1 = require("./execute");
|
|
@@ -10,15 +10,31 @@ const templates_1 = require("./templates");
|
|
|
10
10
|
const destinationCredentialTest_1 = require("./destinationCredentialTest");
|
|
11
11
|
const legacy = renderwolf_1.renderwolf;
|
|
12
12
|
const legacyOperations = (legacy.description.properties[1].options ?? []);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const operationParameters =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
13
|
+
function operationOptions(product) {
|
|
14
|
+
return [...(product === 'renderwolf' ? legacyOperations : []), ...catalog_1.operations.filter(op => op.product === product).map(op => ({ name: op.name, value: op.id, description: op.description, action: op.description }))].sort((a, b) => a.name.localeCompare(b.name));
|
|
15
|
+
}
|
|
16
|
+
const operationParameters = [
|
|
17
|
+
{
|
|
18
|
+
displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
|
|
19
|
+
default: 'archiveMonitorsByMonitorId', displayOptions: { show: { resource: ['auditwolf'] } },
|
|
20
|
+
options: operationOptions('auditwolf'),
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
|
|
24
|
+
default: 'deleteValidationResult', displayOptions: { show: { resource: ['financewolf'] } },
|
|
25
|
+
options: operationOptions('financewolf'),
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
|
|
29
|
+
default: 'screenshot', displayOptions: { show: { resource: ['renderwolf'] } },
|
|
30
|
+
options: operationOptions('renderwolf'),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
|
|
34
|
+
default: 'convertImage', displayOptions: { show: { resource: ['tools'] } },
|
|
35
|
+
options: operationOptions('tools'),
|
|
36
|
+
},
|
|
37
|
+
];
|
|
22
38
|
class Ironfang {
|
|
23
39
|
description = {
|
|
24
40
|
...legacy.description,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { INodeType, INodeTypeDescription, IWebhookFunctions, IWebhookResponseData } from 'n8n-workflow';
|
|
1
|
+
import type { IHookFunctions, INodeType, INodeTypeDescription, IWebhookFunctions, IWebhookResponseData } from 'n8n-workflow';
|
|
2
2
|
import { webhookCredentialTest } from './webhook';
|
|
3
3
|
export declare class IronfangTrigger implements INodeType {
|
|
4
4
|
description: INodeTypeDescription;
|
|
@@ -7,5 +7,12 @@ export declare class IronfangTrigger implements INodeType {
|
|
|
7
7
|
ironfangWebhookTest: typeof webhookCredentialTest;
|
|
8
8
|
};
|
|
9
9
|
};
|
|
10
|
+
webhookMethods: {
|
|
11
|
+
default: {
|
|
12
|
+
checkExists(this: IHookFunctions): Promise<boolean>;
|
|
13
|
+
create(this: IHookFunctions): Promise<boolean>;
|
|
14
|
+
delete(this: IHookFunctions): Promise<boolean>;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
10
17
|
webhook(this: IWebhookFunctions): Promise<IWebhookResponseData>;
|
|
11
18
|
}
|
|
@@ -3,8 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.IronfangTrigger = void 0;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
5
|
const webhook_1 = require("./webhook");
|
|
6
|
-
// Endpoints are registered explicitly and remain customer-owned; n8n owns its local route.
|
|
7
|
-
// eslint-disable-next-line @n8n/community-nodes/webhook-lifecycle-complete
|
|
8
6
|
class IronfangTrigger {
|
|
9
7
|
description = {
|
|
10
8
|
displayName: 'Ironfang Trigger', name: 'ironfangTrigger', group: ['trigger'], version: 1,
|
|
@@ -18,6 +16,25 @@ class IronfangTrigger {
|
|
|
18
16
|
],
|
|
19
17
|
};
|
|
20
18
|
methods = { credentialTest: { ironfangWebhookTest: webhook_1.webhookCredentialTest } };
|
|
19
|
+
webhookMethods = {
|
|
20
|
+
default: {
|
|
21
|
+
async checkExists() {
|
|
22
|
+
// External registration is required. True skips n8n-managed remote
|
|
23
|
+
// creation; it does not assert that a product endpoint exists.
|
|
24
|
+
return true;
|
|
25
|
+
},
|
|
26
|
+
async create() {
|
|
27
|
+
// The customer registers the URL and stores its signing secret.
|
|
28
|
+
// n8n creates the local route independently of this hook.
|
|
29
|
+
return true;
|
|
30
|
+
},
|
|
31
|
+
async delete() {
|
|
32
|
+
// n8n removes its local route. Leave customer-owned endpoints and
|
|
33
|
+
// duplicate state intact for later reactivation or shared use.
|
|
34
|
+
return true;
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
21
38
|
async webhook() {
|
|
22
39
|
const req = this.getRequestObject();
|
|
23
40
|
const res = this.getResponseObject();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# n8n re-review request — 0.3.1
|
|
2
|
+
|
|
3
|
+
Draft for the existing submission after npm publication is confirmed:
|
|
4
|
+
|
|
5
|
+
Please re-review `@ironfang/n8n-nodes-ironfang` version **0.3.1**
|
|
6
|
+
([source tag](https://github.com/ironfang-ltd/n8n-nodes-ironfang/tree/v0.3.1)).
|
|
7
|
+
It addresses all three findings:
|
|
8
|
+
|
|
9
|
+
1. `IronfangTrigger.node.ts` implements
|
|
10
|
+
`webhookMethods.default.checkExists`, `create` and `delete`. Endpoints are
|
|
11
|
+
explicitly registered through Auditwolf Create Webhooks or Renderwolf Create
|
|
12
|
+
Destination. The hooks acknowledge external management; they do not claim to
|
|
13
|
+
verify registration or delete customer-owned endpoints. Setup and testing
|
|
14
|
+
remain documented in the node and README.
|
|
15
|
+
2. `Ironfang.node.ts` defines a separate operation parameter for each product,
|
|
16
|
+
each with a literal string default. Existing defaults and operation IDs are
|
|
17
|
+
preserved.
|
|
18
|
+
3. The shared implementation moved from `nodes/Ironfang/renderwolf.ts` to
|
|
19
|
+
`lib/renderwolf.ts`. The two public node entry points retain their `.node.ts`
|
|
20
|
+
names and existing registration paths.
|
|
21
|
+
|
|
22
|
+
All three suppression comments have been removed. `npm run check` runs lint
|
|
23
|
+
with `--no-inline-config`, TypeScript, 151 regression tests and package checks.
|
|
24
|
+
The release workflow also requires real n8n 2.38.1 action and signed webhook
|
|
25
|
+
checks before publishing through npm trusted publishing with provenance.
|
package/docs/validation.md
CHANGED
|
@@ -12,13 +12,22 @@ routes and scopes were compared with the endpoint handlers (all 97 additional ro
|
|
|
12
12
|
production OpenAPI YAML URLs returned HTTP 200. No live authenticated customer
|
|
13
13
|
operation or paid render was used for these connector checks.
|
|
14
14
|
|
|
15
|
+
The 0.3.1 submission patch passed `npm run check` (151 tests), both real n8n
|
|
16
|
+
2.38.1 Docker checks and `npm audit` (zero reported vulnerabilities) locally on
|
|
17
|
+
9 September. CI repeats the Node 22/24 and Docker gates before publication.
|
|
18
|
+
The [re-review request](n8n-re-review-0.3.1.md) is prepared for the existing
|
|
19
|
+
submission; manual approval is still pending.
|
|
20
|
+
|
|
15
21
|
## Automated coverage
|
|
16
22
|
|
|
17
|
-
- Real n8n lint rules, TypeScript and package
|
|
18
|
-
-
|
|
23
|
+
- Real n8n lint rules with inline configuration disabled, TypeScript and package
|
|
24
|
+
entry-point/icon/version checks, including the helper's location outside `nodes/`.
|
|
25
|
+
- 151 unit/execution tests: every action dispatch, legacy formats, product
|
|
19
26
|
routing, explicit public access, no anonymous fallback, traversal rejection,
|
|
20
27
|
decimal strings, exact XML/hash checks, multipart files, pagination/repeated
|
|
21
|
-
cursors, destination credentials, structured problems and item linking.
|
|
28
|
+
cursors, destination credentials, structured problems and item linking. The
|
|
29
|
+
0.3.1 regression cases cover operation-selector defaults/options and lifecycle
|
|
30
|
+
activation/deletion/reactivation with retained duplicate state.
|
|
22
31
|
- n8n 2.38.1 Docker workflow: seven original-operation/version cases plus 18
|
|
23
32
|
expansion cases. It exercises authenticated and public helpers, XML/binary
|
|
24
33
|
input, generation, multipart uploads/outputs, pagination, signed downloads,
|
|
@@ -39,10 +48,13 @@ attaches an API key to a public/signed download request.
|
|
|
39
48
|
|
|
40
49
|
Webhook endpoints are registered explicitly and their secrets are stored in
|
|
41
50
|
n8n credentials. The receiver does not own or delete those remote endpoints.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
Version 0.3.1 implements `webhookMethods.default.checkExists`, `create` and
|
|
52
|
+
`delete` as acknowledgements of external management. Returning true from
|
|
53
|
+
`checkExists` skips automatic remote creation; it does not prove registration.
|
|
54
|
+
The hooks perform no management API calls and preserve duplicate state.
|
|
55
|
+
Each operation selector now has a literal default, and the shared Renderwolf
|
|
56
|
+
implementation lives in `lib/`. All three submission-related lint suppressions
|
|
57
|
+
have been removed. These checks do not establish manual Cloud verification.
|
|
46
58
|
|
|
47
59
|
S3 and webhook credential connection checks validate supplied fields/format.
|
|
48
60
|
Actual access/signing is checked through the product's destination/webhook test
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ironfang/n8n-nodes-ironfang",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "n8n nodes for Ironfang: Renderwolf, Financewolf, Auditwolf, public tools and signed events",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"n8n-community-node-package",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"build": "node scripts/clean.mjs && tsc && node scripts/copy-assets.mjs",
|
|
34
34
|
"dev": "tsc --watch",
|
|
35
35
|
"typecheck": "tsc --noEmit",
|
|
36
|
-
"lint": "eslint nodes credentials package.json",
|
|
36
|
+
"lint": "eslint --no-inline-config nodes lib credentials package.json",
|
|
37
37
|
"test": "npm run build && node --test tests/*.test.cjs",
|
|
38
38
|
"check": "npm run typecheck && npm run lint && npm test && node scripts/check-package.mjs"
|
|
39
39
|
},
|