@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 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.0.** This version includes the product expansion and signed event
10
- trigger described below, plus the maintenance fixes from 0.2.3.
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 './credentialTest';
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("./transport");
6
- const credentialTest_1 = require("./credentialTest");
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("./renderwolf");
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
- const products = ['auditwolf', 'financewolf', 'renderwolf', 'tools'];
14
- // Resource-specific defaults are selected from the checked-in catalogue.
15
- // eslint-disable-next-line n8n-nodes-base/node-param-default-missing
16
- const operationParameters = products.map(product => ({
17
- displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
18
- default: product === 'renderwolf' ? 'screenshot' : catalog_1.operations.find(op => op.product === product).id,
19
- displayOptions: { show: { resource: [product] } },
20
- options: [...(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)),
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.
@@ -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 entry-point/icon/version checks.
18
- - 149 unit/execution tests: every action dispatch, legacy formats, product
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
- There is a documented, targeted exception to the lint rule requiring automatic
43
- webhook registration/deletion. Other targeted exceptions cover the shared
44
- legacy implementation filename and a catalogue-selected operation default that
45
- the static rule cannot infer. These are not claims of manual Cloud verification.
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.0",
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
  },