n8n-nodes-substack 1.5.0 → 1.7.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.
Files changed (35) hide show
  1. package/dist/credentials/SubstackApi.credentials.js +3 -3
  2. package/dist/credentials/SubstackApi.credentials.js.map +1 -1
  3. package/dist/nodes/Substack/Comment.fields.js +0 -14
  4. package/dist/nodes/Substack/Comment.fields.js.map +1 -1
  5. package/dist/nodes/Substack/Comment.operations.d.ts +1 -2
  6. package/dist/nodes/Substack/Comment.operations.js +2 -29
  7. package/dist/nodes/Substack/Comment.operations.js.map +1 -1
  8. package/dist/nodes/Substack/Note.fields.js +2 -57
  9. package/dist/nodes/Substack/Note.fields.js.map +1 -1
  10. package/dist/nodes/Substack/Note.operations.d.ts +0 -1
  11. package/dist/nodes/Substack/Note.operations.js +9 -107
  12. package/dist/nodes/Substack/Note.operations.js.map +1 -1
  13. package/dist/nodes/Substack/Post.fields.js +0 -30
  14. package/dist/nodes/Substack/Post.fields.js.map +1 -1
  15. package/dist/nodes/Substack/Post.operations.d.ts +0 -1
  16. package/dist/nodes/Substack/Post.operations.js +2 -32
  17. package/dist/nodes/Substack/Post.operations.js.map +1 -1
  18. package/dist/nodes/Substack/Profile.fields.js +0 -14
  19. package/dist/nodes/Substack/Profile.fields.js.map +1 -1
  20. package/dist/nodes/Substack/Profile.operations.d.ts +0 -1
  21. package/dist/nodes/Substack/Profile.operations.js +2 -31
  22. package/dist/nodes/Substack/Profile.operations.js.map +1 -1
  23. package/dist/nodes/Substack/Substack.node.js +2 -2
  24. package/dist/nodes/Substack/Substack.node.js.map +1 -1
  25. package/dist/nodes/Substack/SubstackUtils.js +3 -2
  26. package/dist/nodes/Substack/SubstackUtils.js.map +1 -1
  27. package/dist/nodes/Substack/shared/DataFormatters.js +17 -29
  28. package/dist/nodes/Substack/shared/DataFormatters.js.map +1 -1
  29. package/dist/nodes/Substack/types.d.ts +1 -15
  30. package/dist/package.json +6 -6
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +6 -6
  33. package/dist/nodes/Substack/MarkdownParser.d.ts +0 -11
  34. package/dist/nodes/Substack/MarkdownParser.js +0 -228
  35. package/dist/nodes/Substack/MarkdownParser.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-substack",
3
- "version": "1.5.0",
3
+ "version": "1.7.1",
4
4
  "description": "n8n community node for Substack API integration",
5
5
  "keywords": [
6
6
  "n8n-community-node-package"
@@ -20,12 +20,12 @@
20
20
  },
21
21
  "main": "index.js",
22
22
  "scripts": {
23
- "build": "npx rimraf dist && tsc && gulp build:icons",
23
+ "build": "pnpm dlx rimraf dist && tsc && gulp build:icons",
24
24
  "dev": "tsc --watch",
25
25
  "format": "prettier nodes credentials --write",
26
26
  "lint": "eslint nodes credentials package.json",
27
27
  "lintfix": "eslint nodes credentials package.json --fix",
28
- "prepublishOnly": "npm run build && npx eslint -c eslint.prepublish.config.js nodes credentials package.json",
28
+ "prepublishOnly": "pnpm run build && eslint -c eslint.prepublish.config.js nodes credentials package.json",
29
29
  "test": "jest",
30
30
  "test:watch": "jest --watch",
31
31
  "test:unit": "jest",
@@ -47,8 +47,8 @@
47
47
  "@types/jest": "^30.0.0",
48
48
  "@types/marked": "^4.3.2",
49
49
  "@types/turndown": "^5.0.5",
50
- "@typescript-eslint/parser": "~8.38.0",
51
- "eslint": "^9.29.0",
50
+ "@typescript-eslint/parser": "~8.56.0",
51
+ "eslint": ">=9.29.0 <10",
52
52
  "eslint-plugin-n8n-nodes-base": "^1.16.3",
53
53
  "gulp": "^5.0.0",
54
54
  "jest": "^30.0.3",
@@ -61,7 +61,7 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "marked": "^4.3.0",
64
- "substack-api": "^1.4.0",
64
+ "substack-api": "^3.1.0",
65
65
  "turndown": "^7.2.0"
66
66
  }
67
67
  }
@@ -1,11 +0,0 @@
1
- import type { OwnProfile } from 'substack-api';
2
- export declare class MarkdownParser {
3
- static parseMarkdownToNoteStructured(markdown: string, noteBuilder: ReturnType<OwnProfile['newNote']>): ReturnType<ReturnType<OwnProfile['newNote']>['paragraph']>;
4
- static parseMarkdownToNote(markdown: string, noteBuilder: ReturnType<OwnProfile['newNote']>): ReturnType<ReturnType<OwnProfile['newNote']>['paragraph']>;
5
- private static preprocessMarkdown;
6
- private static processTokensStructured;
7
- private static processHeadingStructured;
8
- private static processParagraphStructured;
9
- private static processListStructured;
10
- private static processInlineTokensStructured;
11
- }
@@ -1,228 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MarkdownParser = void 0;
4
- const marked_1 = require("marked");
5
- marked_1.marked.setOptions({
6
- gfm: true,
7
- breaks: false,
8
- });
9
- function decodeHtmlEntities(text) {
10
- const entityMap = {
11
- '&#39;': "'",
12
- '&quot;': '"',
13
- '&amp;': '&',
14
- '&lt;': '<',
15
- '&gt;': '>',
16
- '&nbsp;': ' ',
17
- };
18
- return text.replace(/&#?\w+;/g, (entity) => entityMap[entity] || entity);
19
- }
20
- class MarkdownParser {
21
- static parseMarkdownToNoteStructured(markdown, noteBuilder) {
22
- if (!markdown.trim()) {
23
- throw new Error('Note body cannot be empty - at least one paragraph with content is required');
24
- }
25
- const processedMarkdown = this.preprocessMarkdown(markdown);
26
- const tokens = marked_1.marked.lexer(processedMarkdown);
27
- const meaningfulTokens = tokens.filter((token) => token.type === 'paragraph' || token.type === 'heading' || token.type === 'list');
28
- if (meaningfulTokens.length === 0) {
29
- throw new Error('Note must contain at least one paragraph with actual content');
30
- }
31
- const contentTracker = { meaningfulNodesCreated: 0 };
32
- let currentBuilder = null;
33
- currentBuilder = this.processTokensStructured(tokens, noteBuilder, contentTracker);
34
- if (contentTracker.meaningfulNodesCreated === 0) {
35
- throw new Error('Note must contain at least one paragraph with actual content');
36
- }
37
- if (!currentBuilder) {
38
- throw new Error('Failed to create note content');
39
- }
40
- return currentBuilder;
41
- }
42
- static parseMarkdownToNote(markdown, noteBuilder) {
43
- return this.parseMarkdownToNoteStructured(markdown, noteBuilder);
44
- }
45
- static preprocessMarkdown(markdown) {
46
- return markdown.replace(/\\n/g, '\n');
47
- }
48
- static processTokensStructured(tokens, noteBuilder, contentTracker) {
49
- let currentBuilder = null;
50
- for (const token of tokens) {
51
- let newBuilder = null;
52
- switch (token.type) {
53
- case 'heading':
54
- newBuilder = this.processHeadingStructured(token, noteBuilder, currentBuilder, contentTracker);
55
- break;
56
- case 'paragraph':
57
- newBuilder = this.processParagraphStructured(token, noteBuilder, currentBuilder, contentTracker);
58
- break;
59
- case 'list':
60
- newBuilder = this.processListStructured(token, noteBuilder, currentBuilder, contentTracker);
61
- break;
62
- case 'space':
63
- break;
64
- default:
65
- if (token.text) {
66
- const decodedText = decodeHtmlEntities(token.text);
67
- if (currentBuilder) {
68
- newBuilder = currentBuilder.paragraph().text(decodedText);
69
- }
70
- else {
71
- newBuilder = noteBuilder.paragraph().text(decodedText);
72
- }
73
- contentTracker.meaningfulNodesCreated++;
74
- }
75
- break;
76
- }
77
- if (newBuilder) {
78
- currentBuilder = newBuilder;
79
- }
80
- }
81
- return currentBuilder;
82
- }
83
- static processHeadingStructured(token, noteBuilder, currentBuilder, contentTracker) {
84
- const hasContent = (token.tokens && token.tokens.some((t) => t.text && t.text.trim())) ||
85
- (token.text && token.text.trim());
86
- if (!hasContent) {
87
- return currentBuilder;
88
- }
89
- let paragraphBuilder = currentBuilder ? currentBuilder.paragraph() : noteBuilder.paragraph();
90
- if (token.tokens && token.tokens.length > 0) {
91
- paragraphBuilder = this.processInlineTokensStructured(token.tokens, paragraphBuilder, true);
92
- }
93
- else if (token.text) {
94
- paragraphBuilder = paragraphBuilder.bold(decodeHtmlEntities(token.text));
95
- }
96
- contentTracker.meaningfulNodesCreated++;
97
- return paragraphBuilder;
98
- }
99
- static processParagraphStructured(token, noteBuilder, currentBuilder, contentTracker) {
100
- const hasContent = (token.tokens && token.tokens.some((t) => t.text && t.text.trim())) ||
101
- (token.text && token.text.trim());
102
- if (!hasContent) {
103
- return currentBuilder;
104
- }
105
- const text = token.text ? token.text.trim() : '';
106
- const normalizedText = text.replace(/\s+/g, ' ').trim();
107
- const isOnlyListMarkers = /^([-*+]|(\d+\.))+(\s*([-*+]|(\d+\.)))*$/.test(normalizedText);
108
- const isEmptyListMarkers = normalizedText === '- * 1.' || /^[-*+\d.\s]+$/.test(normalizedText);
109
- if (isOnlyListMarkers || isEmptyListMarkers) {
110
- return currentBuilder;
111
- }
112
- let paragraphBuilder = currentBuilder ? currentBuilder.paragraph() : noteBuilder.paragraph();
113
- if (token.tokens && token.tokens.length > 0) {
114
- paragraphBuilder = this.processInlineTokensStructured(token.tokens, paragraphBuilder);
115
- }
116
- else if (token.text) {
117
- paragraphBuilder = paragraphBuilder.text(decodeHtmlEntities(token.text));
118
- }
119
- contentTracker.meaningfulNodesCreated++;
120
- return paragraphBuilder;
121
- }
122
- static processListStructured(token, noteBuilder, currentBuilder, contentTracker) {
123
- if (!token.items)
124
- return currentBuilder;
125
- let finalBuilder = currentBuilder;
126
- let listItemNumber = 1;
127
- token.items.forEach((item, index) => {
128
- const hasContent = (item.tokens && item.tokens.some((t) => t.text && t.text.trim())) ||
129
- (item.text && item.text.trim());
130
- if (!hasContent) {
131
- return;
132
- }
133
- let actualContent = '';
134
- if (item.tokens && item.tokens.length > 0) {
135
- const firstToken = item.tokens[0];
136
- if (firstToken && firstToken.tokens) {
137
- const meaningfulInlineTokens = firstToken.tokens.filter((t) => t.text && t.text.trim());
138
- if (meaningfulInlineTokens.length > 0) {
139
- actualContent = meaningfulInlineTokens.map((t) => t.text.trim()).join('');
140
- }
141
- }
142
- else if (firstToken && firstToken.text && firstToken.text.trim()) {
143
- actualContent = firstToken.text.trim();
144
- }
145
- }
146
- else if (item.text && item.text.trim()) {
147
- actualContent = item.text.trim();
148
- }
149
- if (!actualContent) {
150
- return;
151
- }
152
- let paragraphBuilder = finalBuilder ? finalBuilder.paragraph() : noteBuilder.paragraph();
153
- if (token.ordered) {
154
- paragraphBuilder = paragraphBuilder.text(`${listItemNumber}. `);
155
- listItemNumber++;
156
- }
157
- else {
158
- paragraphBuilder = paragraphBuilder.text('• ');
159
- }
160
- if (item.tokens && item.tokens.length > 0) {
161
- const firstToken = item.tokens[0];
162
- if (firstToken && firstToken.tokens) {
163
- paragraphBuilder = this.processInlineTokensStructured(firstToken.tokens, paragraphBuilder);
164
- }
165
- else if (firstToken && firstToken.text) {
166
- paragraphBuilder = paragraphBuilder.text(decodeHtmlEntities(firstToken.text));
167
- }
168
- }
169
- else if (item.text) {
170
- paragraphBuilder = paragraphBuilder.text(decodeHtmlEntities(item.text));
171
- }
172
- contentTracker.meaningfulNodesCreated++;
173
- finalBuilder = paragraphBuilder;
174
- });
175
- return finalBuilder;
176
- }
177
- static processInlineTokensStructured(tokens, paragraphBuilder, isHeading = false) {
178
- let currentBuilder = paragraphBuilder;
179
- for (const token of tokens) {
180
- if (!token.text || !token.text.trim()) {
181
- continue;
182
- }
183
- switch (token.type) {
184
- case 'text':
185
- const decodedText = decodeHtmlEntities(token.text);
186
- if (isHeading) {
187
- currentBuilder = currentBuilder.bold(decodedText);
188
- }
189
- else {
190
- currentBuilder = currentBuilder.text(decodedText);
191
- }
192
- break;
193
- case 'strong':
194
- currentBuilder = currentBuilder.bold(decodeHtmlEntities(token.text));
195
- break;
196
- case 'em':
197
- currentBuilder = currentBuilder.italic(decodeHtmlEntities(token.text));
198
- break;
199
- case 'codespan':
200
- currentBuilder = currentBuilder.code(decodeHtmlEntities(token.text));
201
- break;
202
- case 'link':
203
- if (token.text) {
204
- const decodedLinkText = decodeHtmlEntities(token.text);
205
- currentBuilder = currentBuilder.text(`${decodedLinkText} (${token.href})`);
206
- }
207
- else {
208
- currentBuilder = currentBuilder.text(token.href);
209
- }
210
- break;
211
- default:
212
- if (token.text) {
213
- const decodedFallbackText = decodeHtmlEntities(token.text);
214
- if (isHeading) {
215
- currentBuilder = currentBuilder.bold(decodedFallbackText);
216
- }
217
- else {
218
- currentBuilder = currentBuilder.text(decodedFallbackText);
219
- }
220
- }
221
- break;
222
- }
223
- }
224
- return currentBuilder;
225
- }
226
- }
227
- exports.MarkdownParser = MarkdownParser;
228
- //# sourceMappingURL=MarkdownParser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownParser.js","sourceRoot":"","sources":["../../../nodes/Substack/MarkdownParser.ts"],"names":[],"mappings":"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"}