n8n-nodes-substack 1.1.1 → 1.2.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/dist/nodes/Substack/Comment.operations.js +12 -50
- package/dist/nodes/Substack/Comment.operations.js.map +1 -1
- package/dist/nodes/Substack/MarkdownParser.d.ts +2 -2
- package/dist/nodes/Substack/MarkdownParser.js +112 -37
- package/dist/nodes/Substack/MarkdownParser.js.map +1 -1
- package/dist/nodes/Substack/Note.operations.js +24 -122
- package/dist/nodes/Substack/Note.operations.js.map +1 -1
- package/dist/nodes/Substack/Post.operations.js +20 -124
- package/dist/nodes/Substack/Post.operations.js.map +1 -1
- package/dist/nodes/Substack/Profile.operations.js +9 -47
- package/dist/nodes/Substack/Profile.operations.js.map +1 -1
- package/dist/nodes/Substack/SubstackUtils.d.ts +10 -3
- package/dist/nodes/Substack/SubstackUtils.js +52 -41
- package/dist/nodes/Substack/SubstackUtils.js.map +1 -1
- package/dist/nodes/Substack/shared/DataFormatters.d.ts +9 -0
- package/dist/nodes/Substack/shared/DataFormatters.js +85 -0
- package/dist/nodes/Substack/shared/DataFormatters.js.map +1 -0
- package/dist/nodes/Substack/shared/OperationUtils.d.ts +5 -0
- package/dist/nodes/Substack/shared/OperationUtils.js +35 -0
- package/dist/nodes/Substack/shared/OperationUtils.js.map +1 -0
- package/dist/nodes/Substack/shared/ResourceOperations.d.ts +25 -0
- package/dist/nodes/Substack/shared/ResourceOperations.js +59 -0
- package/dist/nodes/Substack/shared/ResourceOperations.js.map +1 -0
- package/dist/package.json +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.commentOperationHandlers = exports.commentOperations = exports.CommentOperation = void 0;
|
|
4
|
+
const DataFormatters_1 = require("./shared/DataFormatters");
|
|
5
|
+
const OperationUtils_1 = require("./shared/OperationUtils");
|
|
4
6
|
const SubstackUtils_1 = require("./SubstackUtils");
|
|
5
7
|
var CommentOperation;
|
|
6
8
|
(function (CommentOperation) {
|
|
@@ -36,44 +38,17 @@ exports.commentOperations = [
|
|
|
36
38
|
},
|
|
37
39
|
];
|
|
38
40
|
async function getAll(executeFunctions, client, publicationAddress, itemIndex) {
|
|
39
|
-
var _a;
|
|
40
41
|
try {
|
|
41
|
-
const
|
|
42
|
-
const postId = typeof postIdParam === 'string' ? parseInt(postIdParam, 10) : postIdParam;
|
|
43
|
-
if (!postId || isNaN(postId)) {
|
|
44
|
-
throw new Error('Invalid postId: must be a valid number');
|
|
45
|
-
}
|
|
42
|
+
const postId = OperationUtils_1.OperationUtils.parseNumericParam(executeFunctions.getNodeParameter('postId', itemIndex), 'postId');
|
|
46
43
|
const limitParam = executeFunctions.getNodeParameter('limit', itemIndex, '');
|
|
47
|
-
|
|
48
|
-
if (limitParam !== '' && limitParam !== null && limitParam !== undefined) {
|
|
49
|
-
limit = Number(limitParam);
|
|
50
|
-
}
|
|
44
|
+
const limit = OperationUtils_1.OperationUtils.parseLimit(limitParam);
|
|
51
45
|
const post = await client.postForId(postId);
|
|
52
46
|
const commentsIterable = await post.comments();
|
|
53
|
-
const
|
|
54
|
-
let count = 0;
|
|
55
|
-
for await (const comment of commentsIterable) {
|
|
56
|
-
if (count >= limit)
|
|
57
|
-
break;
|
|
58
|
-
formattedComments.push({
|
|
59
|
-
id: comment.id,
|
|
60
|
-
body: comment.body,
|
|
61
|
-
createdAt: ((_a = comment.rawData) === null || _a === void 0 ? void 0 : _a.created_at) || comment.createdAt.toISOString(),
|
|
62
|
-
parentPostId: postId,
|
|
63
|
-
author: {
|
|
64
|
-
id: comment.author.id,
|
|
65
|
-
name: comment.author.name,
|
|
66
|
-
isAdmin: comment.author.isAdmin || false,
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
count++;
|
|
70
|
-
}
|
|
47
|
+
const results = await OperationUtils_1.OperationUtils.executeAsyncIterable(commentsIterable, limit, (comment, publicationAddress) => DataFormatters_1.DataFormatters.formatComment(comment, postId), publicationAddress);
|
|
71
48
|
return {
|
|
72
49
|
success: true,
|
|
73
|
-
data:
|
|
74
|
-
metadata: {
|
|
75
|
-
status: 'success',
|
|
76
|
-
},
|
|
50
|
+
data: results,
|
|
51
|
+
metadata: { status: 'success' }
|
|
77
52
|
};
|
|
78
53
|
}
|
|
79
54
|
catch (error) {
|
|
@@ -85,27 +60,14 @@ async function getAll(executeFunctions, client, publicationAddress, itemIndex) {
|
|
|
85
60
|
}
|
|
86
61
|
}
|
|
87
62
|
async function getCommentById(executeFunctions, client, publicationAddress, itemIndex) {
|
|
88
|
-
var _a, _b;
|
|
89
63
|
try {
|
|
90
|
-
const commentId = executeFunctions.getNodeParameter('commentId', itemIndex);
|
|
91
|
-
const comment = await client.commentForId(
|
|
92
|
-
const
|
|
93
|
-
id: comment.id,
|
|
94
|
-
body: comment.body,
|
|
95
|
-
createdAt: ((_a = comment.rawData) === null || _a === void 0 ? void 0 : _a.created_at) || comment.createdAt.toISOString(),
|
|
96
|
-
parentPostId: ((_b = comment.rawData) === null || _b === void 0 ? void 0 : _b.parent_post_id) || 0,
|
|
97
|
-
author: {
|
|
98
|
-
id: comment.author.id,
|
|
99
|
-
name: comment.author.name,
|
|
100
|
-
isAdmin: comment.author.isAdmin || false,
|
|
101
|
-
},
|
|
102
|
-
};
|
|
64
|
+
const commentId = OperationUtils_1.OperationUtils.parseNumericParam(executeFunctions.getNodeParameter('commentId', itemIndex), 'commentId');
|
|
65
|
+
const comment = await client.commentForId(commentId);
|
|
66
|
+
const result = DataFormatters_1.DataFormatters.formatComment(comment);
|
|
103
67
|
return {
|
|
104
68
|
success: true,
|
|
105
|
-
data:
|
|
106
|
-
metadata: {
|
|
107
|
-
status: 'success',
|
|
108
|
-
},
|
|
69
|
+
data: result,
|
|
70
|
+
metadata: { status: 'success' }
|
|
109
71
|
};
|
|
110
72
|
}
|
|
111
73
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Comment.operations.js","sourceRoot":"","sources":["../../../nodes/Substack/Comment.operations.ts"],"names":[],"mappings":";;;AAGA,mDAAgD;AAEhD,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC3B,qCAAiB,CAAA;IACjB,qDAAiC,CAAA;AAClC,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAEY,QAAA,iBAAiB,GAAsB;IACnD;QACC,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ;QACjB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE;YACf,IAAI,EAAE;gBACL,QAAQ,EAAE,CAAC,SAAS,CAAC;aACrB;SACD;QACD,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,gBAAgB,CAAC,MAAM;gBAC9B,WAAW,EAAE,sCAAsC;gBACnD,MAAM,EAAE,kBAAkB;aAC1B;YACD;gBACC,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,gBAAgB,CAAC,cAAc;gBACtC,WAAW,EAAE,kCAAkC;gBAC/C,MAAM,EAAE,mBAAmB;aAC3B;SACD;KACD;CACD,CAAC;AAEF,KAAK,UAAU,MAAM,CACpB,gBAAmC,EACnC,MAAsB,EACtB,kBAA0B,EAC1B,SAAiB
|
|
1
|
+
{"version":3,"file":"Comment.operations.js","sourceRoot":"","sources":["../../../nodes/Substack/Comment.operations.ts"],"names":[],"mappings":";;;AAGA,4DAAyD;AACzD,4DAAyD;AACzD,mDAAgD;AAEhD,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC3B,qCAAiB,CAAA;IACjB,qDAAiC,CAAA;AAClC,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAEY,QAAA,iBAAiB,GAAsB;IACnD;QACC,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ;QACjB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE;YACf,IAAI,EAAE;gBACL,QAAQ,EAAE,CAAC,SAAS,CAAC;aACrB;SACD;QACD,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,gBAAgB,CAAC,MAAM;gBAC9B,WAAW,EAAE,sCAAsC;gBACnD,MAAM,EAAE,kBAAkB;aAC1B;YACD;gBACC,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,gBAAgB,CAAC,cAAc;gBACtC,WAAW,EAAE,kCAAkC;gBAC/C,MAAM,EAAE,mBAAmB;aAC3B;SACD;KACD;CACD,CAAC;AAEF,KAAK,UAAU,MAAM,CACpB,gBAAmC,EACnC,MAAsB,EACtB,kBAA0B,EAC1B,SAAiB;IAEjB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,+BAAc,CAAC,iBAAiB,CAC9C,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,EACtD,QAAQ,CACR,CAAC;QACF,MAAM,UAAU,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,+BAAc,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,+BAAc,CAAC,oBAAoB,CACxD,gBAAgB,EAChB,KAAK,EACL,CAAC,OAAY,EAAE,kBAA0B,EAAE,EAAE,CAAC,+BAAc,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAC3F,kBAAkB,CAClB,CAAC;QAEF,OAAO;YACN,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC/B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,6BAAa,CAAC,mBAAmB,CAAC;YACxC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE;YAChC,SAAS;SACT,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,KAAK,UAAU,cAAc,CAC5B,gBAAmC,EACnC,MAAsB,EACtB,kBAA0B,EAC1B,SAAiB;IAEjB,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,+BAAc,CAAC,iBAAiB,CACjD,gBAAgB,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,EACzD,WAAW,CACX,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,+BAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAErD,OAAO;YACN,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC/B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,6BAAa,CAAC,mBAAmB,CAAC;YACxC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE;YAChC,SAAS;SACT,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAEY,QAAA,wBAAwB,GAQjC;IACH,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM;IACjC,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,cAAc;CACjD,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { OwnProfile } from 'substack-api';
|
|
2
2
|
export declare class MarkdownParser {
|
|
3
|
-
static parseMarkdownToNoteStructured(markdown: string, noteBuilder: ReturnType<OwnProfile['newNote']>): ReturnType<OwnProfile['newNote']
|
|
4
|
-
static parseMarkdownToNote(markdown: string, noteBuilder: ReturnType<OwnProfile['newNote']>): ReturnType<OwnProfile['newNote']
|
|
3
|
+
static parseMarkdownToNoteStructured(markdown: string, noteBuilder: ReturnType<OwnProfile['newNote']>): Promise<ReturnType<ReturnType<OwnProfile['newNote']>['paragraph']>>;
|
|
4
|
+
static parseMarkdownToNote(markdown: string, noteBuilder: ReturnType<OwnProfile['newNote']>): Promise<ReturnType<ReturnType<OwnProfile['newNote']>['paragraph']>>;
|
|
5
5
|
private static processTokensStructured;
|
|
6
6
|
private static processHeadingStructured;
|
|
7
7
|
private static processParagraphStructured;
|
|
@@ -1,13 +1,61 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.MarkdownParser = void 0;
|
|
4
|
-
|
|
37
|
+
function decodeHtmlEntities(text) {
|
|
38
|
+
const entityMap = {
|
|
39
|
+
''': "'",
|
|
40
|
+
'"': '"',
|
|
41
|
+
'&': '&',
|
|
42
|
+
'<': '<',
|
|
43
|
+
'>': '>',
|
|
44
|
+
' ': ' '
|
|
45
|
+
};
|
|
46
|
+
return text.replace(/&#?\w+;/g, (entity) => entityMap[entity] || entity);
|
|
47
|
+
}
|
|
5
48
|
class MarkdownParser {
|
|
6
|
-
static parseMarkdownToNoteStructured(markdown, noteBuilder) {
|
|
49
|
+
static async parseMarkdownToNoteStructured(markdown, noteBuilder) {
|
|
7
50
|
if (!markdown.trim()) {
|
|
8
51
|
throw new Error('Note body cannot be empty - at least one paragraph with content is required');
|
|
9
52
|
}
|
|
10
|
-
const
|
|
53
|
+
const { marked } = await Promise.resolve().then(() => __importStar(require('marked')));
|
|
54
|
+
marked.setOptions({
|
|
55
|
+
gfm: true,
|
|
56
|
+
breaks: false
|
|
57
|
+
});
|
|
58
|
+
const tokens = marked.lexer(markdown);
|
|
11
59
|
const meaningfulTokens = tokens.filter(token => token.type === 'paragraph' ||
|
|
12
60
|
token.type === 'heading' ||
|
|
13
61
|
token.type === 'list');
|
|
@@ -15,77 +63,98 @@ class MarkdownParser {
|
|
|
15
63
|
throw new Error('Note must contain at least one paragraph with actual content');
|
|
16
64
|
}
|
|
17
65
|
const contentTracker = { meaningfulNodesCreated: 0 };
|
|
18
|
-
|
|
66
|
+
let currentBuilder = null;
|
|
67
|
+
currentBuilder = this.processTokensStructured(tokens, noteBuilder, contentTracker);
|
|
19
68
|
if (contentTracker.meaningfulNodesCreated === 0) {
|
|
20
69
|
throw new Error('Note must contain at least one paragraph with actual content');
|
|
21
70
|
}
|
|
22
|
-
|
|
71
|
+
if (!currentBuilder) {
|
|
72
|
+
throw new Error('Failed to create note content');
|
|
73
|
+
}
|
|
74
|
+
return currentBuilder;
|
|
23
75
|
}
|
|
24
|
-
static parseMarkdownToNote(markdown, noteBuilder) {
|
|
25
|
-
return this.parseMarkdownToNoteStructured(markdown, noteBuilder);
|
|
76
|
+
static async parseMarkdownToNote(markdown, noteBuilder) {
|
|
77
|
+
return await this.parseMarkdownToNoteStructured(markdown, noteBuilder);
|
|
26
78
|
}
|
|
27
79
|
static processTokensStructured(tokens, noteBuilder, contentTracker) {
|
|
80
|
+
let currentBuilder = null;
|
|
28
81
|
for (const token of tokens) {
|
|
82
|
+
let newBuilder = null;
|
|
29
83
|
switch (token.type) {
|
|
30
84
|
case 'heading':
|
|
31
|
-
this.processHeadingStructured(token, noteBuilder, contentTracker);
|
|
85
|
+
newBuilder = this.processHeadingStructured(token, noteBuilder, currentBuilder, contentTracker);
|
|
32
86
|
break;
|
|
33
87
|
case 'paragraph':
|
|
34
|
-
this.processParagraphStructured(token, noteBuilder, contentTracker);
|
|
88
|
+
newBuilder = this.processParagraphStructured(token, noteBuilder, currentBuilder, contentTracker);
|
|
35
89
|
break;
|
|
36
90
|
case 'list':
|
|
37
|
-
this.processListStructured(token, noteBuilder, contentTracker);
|
|
91
|
+
newBuilder = this.processListStructured(token, noteBuilder, currentBuilder, contentTracker);
|
|
38
92
|
break;
|
|
39
93
|
case 'space':
|
|
40
94
|
break;
|
|
41
95
|
default:
|
|
42
96
|
if (token.text) {
|
|
43
|
-
|
|
44
|
-
|
|
97
|
+
const decodedText = decodeHtmlEntities(token.text);
|
|
98
|
+
if (currentBuilder) {
|
|
99
|
+
newBuilder = currentBuilder.paragraph().text(decodedText);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
newBuilder = noteBuilder.paragraph().text(decodedText);
|
|
103
|
+
}
|
|
45
104
|
contentTracker.meaningfulNodesCreated++;
|
|
46
105
|
}
|
|
47
106
|
break;
|
|
48
107
|
}
|
|
108
|
+
if (newBuilder) {
|
|
109
|
+
currentBuilder = newBuilder;
|
|
110
|
+
}
|
|
49
111
|
}
|
|
112
|
+
return currentBuilder;
|
|
50
113
|
}
|
|
51
|
-
static processHeadingStructured(token, noteBuilder, contentTracker) {
|
|
114
|
+
static processHeadingStructured(token, noteBuilder, currentBuilder, contentTracker) {
|
|
52
115
|
const hasContent = (token.tokens && token.tokens.some((t) => t.text && t.text.trim())) ||
|
|
53
116
|
(token.text && token.text.trim());
|
|
54
117
|
if (!hasContent) {
|
|
55
|
-
return;
|
|
118
|
+
return currentBuilder;
|
|
56
119
|
}
|
|
57
|
-
let paragraphBuilder = noteBuilder.paragraph();
|
|
120
|
+
let paragraphBuilder = currentBuilder ? currentBuilder.paragraph() : noteBuilder.paragraph();
|
|
58
121
|
if (token.tokens && token.tokens.length > 0) {
|
|
59
122
|
paragraphBuilder = this.processInlineTokensStructured(token.tokens, paragraphBuilder, true);
|
|
60
123
|
}
|
|
61
124
|
else if (token.text) {
|
|
62
|
-
paragraphBuilder = paragraphBuilder.bold(token.text);
|
|
125
|
+
paragraphBuilder = paragraphBuilder.bold(decodeHtmlEntities(token.text));
|
|
63
126
|
}
|
|
64
127
|
contentTracker.meaningfulNodesCreated++;
|
|
128
|
+
return paragraphBuilder;
|
|
65
129
|
}
|
|
66
|
-
static processParagraphStructured(token, noteBuilder, contentTracker) {
|
|
130
|
+
static processParagraphStructured(token, noteBuilder, currentBuilder, contentTracker) {
|
|
67
131
|
const hasContent = (token.tokens && token.tokens.some((t) => t.text && t.text.trim())) ||
|
|
68
132
|
(token.text && token.text.trim());
|
|
69
133
|
if (!hasContent) {
|
|
70
|
-
return;
|
|
134
|
+
return currentBuilder;
|
|
71
135
|
}
|
|
72
136
|
const text = token.text ? token.text.trim() : '';
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
137
|
+
const normalizedText = text.replace(/\s+/g, ' ').trim();
|
|
138
|
+
const isOnlyListMarkers = /^([-*+]|(\d+\.))+(\s*([-*+]|(\d+\.)))*$/.test(normalizedText);
|
|
139
|
+
const isEmptyListMarkers = normalizedText === '- * 1.' || /^[-*+\d.\s]+$/.test(normalizedText);
|
|
140
|
+
if (isOnlyListMarkers || isEmptyListMarkers) {
|
|
141
|
+
return currentBuilder;
|
|
76
142
|
}
|
|
77
|
-
let paragraphBuilder = noteBuilder.paragraph();
|
|
143
|
+
let paragraphBuilder = currentBuilder ? currentBuilder.paragraph() : noteBuilder.paragraph();
|
|
78
144
|
if (token.tokens && token.tokens.length > 0) {
|
|
79
145
|
paragraphBuilder = this.processInlineTokensStructured(token.tokens, paragraphBuilder);
|
|
80
146
|
}
|
|
81
147
|
else if (token.text) {
|
|
82
|
-
paragraphBuilder = paragraphBuilder.text(token.text);
|
|
148
|
+
paragraphBuilder = paragraphBuilder.text(decodeHtmlEntities(token.text));
|
|
83
149
|
}
|
|
84
150
|
contentTracker.meaningfulNodesCreated++;
|
|
151
|
+
return paragraphBuilder;
|
|
85
152
|
}
|
|
86
|
-
static processListStructured(token, noteBuilder, contentTracker) {
|
|
153
|
+
static processListStructured(token, noteBuilder, currentBuilder, contentTracker) {
|
|
87
154
|
if (!token.items)
|
|
88
|
-
return;
|
|
155
|
+
return currentBuilder;
|
|
156
|
+
let finalBuilder = currentBuilder;
|
|
157
|
+
let listItemNumber = 1;
|
|
89
158
|
token.items.forEach((item, index) => {
|
|
90
159
|
const hasContent = (item.tokens && item.tokens.some((t) => t.text && t.text.trim())) ||
|
|
91
160
|
(item.text && item.text.trim());
|
|
@@ -111,9 +180,10 @@ class MarkdownParser {
|
|
|
111
180
|
if (!actualContent) {
|
|
112
181
|
return;
|
|
113
182
|
}
|
|
114
|
-
let paragraphBuilder = noteBuilder.paragraph();
|
|
183
|
+
let paragraphBuilder = finalBuilder ? finalBuilder.paragraph() : noteBuilder.paragraph();
|
|
115
184
|
if (token.ordered) {
|
|
116
|
-
paragraphBuilder = paragraphBuilder.text(`${
|
|
185
|
+
paragraphBuilder = paragraphBuilder.text(`${listItemNumber}. `);
|
|
186
|
+
listItemNumber++;
|
|
117
187
|
}
|
|
118
188
|
else {
|
|
119
189
|
paragraphBuilder = paragraphBuilder.text('• ');
|
|
@@ -124,14 +194,16 @@ class MarkdownParser {
|
|
|
124
194
|
paragraphBuilder = this.processInlineTokensStructured(firstToken.tokens, paragraphBuilder);
|
|
125
195
|
}
|
|
126
196
|
else if (firstToken && firstToken.text) {
|
|
127
|
-
paragraphBuilder = paragraphBuilder.text(firstToken.text);
|
|
197
|
+
paragraphBuilder = paragraphBuilder.text(decodeHtmlEntities(firstToken.text));
|
|
128
198
|
}
|
|
129
199
|
}
|
|
130
200
|
else if (item.text) {
|
|
131
|
-
paragraphBuilder = paragraphBuilder.text(item.text);
|
|
201
|
+
paragraphBuilder = paragraphBuilder.text(decodeHtmlEntities(item.text));
|
|
132
202
|
}
|
|
133
203
|
contentTracker.meaningfulNodesCreated++;
|
|
204
|
+
finalBuilder = paragraphBuilder;
|
|
134
205
|
});
|
|
206
|
+
return finalBuilder;
|
|
135
207
|
}
|
|
136
208
|
static processInlineTokensStructured(tokens, paragraphBuilder, isHeading = false) {
|
|
137
209
|
let currentBuilder = paragraphBuilder;
|
|
@@ -141,25 +213,27 @@ class MarkdownParser {
|
|
|
141
213
|
}
|
|
142
214
|
switch (token.type) {
|
|
143
215
|
case 'text':
|
|
216
|
+
const decodedText = decodeHtmlEntities(token.text);
|
|
144
217
|
if (isHeading) {
|
|
145
|
-
currentBuilder = currentBuilder.bold(
|
|
218
|
+
currentBuilder = currentBuilder.bold(decodedText);
|
|
146
219
|
}
|
|
147
220
|
else {
|
|
148
|
-
currentBuilder = currentBuilder.text(
|
|
221
|
+
currentBuilder = currentBuilder.text(decodedText);
|
|
149
222
|
}
|
|
150
223
|
break;
|
|
151
224
|
case 'strong':
|
|
152
|
-
currentBuilder = currentBuilder.bold(token.text);
|
|
225
|
+
currentBuilder = currentBuilder.bold(decodeHtmlEntities(token.text));
|
|
153
226
|
break;
|
|
154
227
|
case 'em':
|
|
155
|
-
currentBuilder = currentBuilder.italic(token.text);
|
|
228
|
+
currentBuilder = currentBuilder.italic(decodeHtmlEntities(token.text));
|
|
156
229
|
break;
|
|
157
230
|
case 'codespan':
|
|
158
|
-
currentBuilder = currentBuilder.code(token.text);
|
|
231
|
+
currentBuilder = currentBuilder.code(decodeHtmlEntities(token.text));
|
|
159
232
|
break;
|
|
160
233
|
case 'link':
|
|
161
234
|
if (token.text) {
|
|
162
|
-
|
|
235
|
+
const decodedLinkText = decodeHtmlEntities(token.text);
|
|
236
|
+
currentBuilder = currentBuilder.text(`${decodedLinkText} (${token.href})`);
|
|
163
237
|
}
|
|
164
238
|
else {
|
|
165
239
|
currentBuilder = currentBuilder.text(token.href);
|
|
@@ -167,11 +241,12 @@ class MarkdownParser {
|
|
|
167
241
|
break;
|
|
168
242
|
default:
|
|
169
243
|
if (token.text) {
|
|
244
|
+
const decodedFallbackText = decodeHtmlEntities(token.text);
|
|
170
245
|
if (isHeading) {
|
|
171
|
-
currentBuilder = currentBuilder.bold(
|
|
246
|
+
currentBuilder = currentBuilder.bold(decodedFallbackText);
|
|
172
247
|
}
|
|
173
248
|
else {
|
|
174
|
-
currentBuilder = currentBuilder.text(
|
|
249
|
+
currentBuilder = currentBuilder.text(decodedFallbackText);
|
|
175
250
|
}
|
|
176
251
|
}
|
|
177
252
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownParser.js","sourceRoot":"","sources":["../../../nodes/Substack/MarkdownParser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MarkdownParser.js","sourceRoot":"","sources":["../../../nodes/Substack/MarkdownParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.noteOperationHandlers = exports.noteOperations = exports.NoteOperation = void 0;
|
|
4
4
|
const SubstackUtils_1 = require("./SubstackUtils");
|
|
5
5
|
const MarkdownParser_1 = require("./MarkdownParser");
|
|
6
|
+
const DataFormatters_1 = require("./shared/DataFormatters");
|
|
7
|
+
const OperationUtils_1 = require("./shared/OperationUtils");
|
|
6
8
|
var NoteOperation;
|
|
7
9
|
(function (NoteOperation) {
|
|
8
10
|
NoteOperation["Create"] = "create";
|
|
@@ -58,42 +60,16 @@ exports.noteOperations = [
|
|
|
58
60
|
},
|
|
59
61
|
];
|
|
60
62
|
async function get(executeFunctions, client, publicationAddress, itemIndex) {
|
|
61
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
62
63
|
try {
|
|
63
64
|
const limitParam = executeFunctions.getNodeParameter('limit', itemIndex, '');
|
|
64
|
-
|
|
65
|
-
if (limitParam !== '' && limitParam !== null && limitParam !== undefined) {
|
|
66
|
-
limit = Number(limitParam);
|
|
67
|
-
}
|
|
65
|
+
const limit = OperationUtils_1.OperationUtils.parseLimit(limitParam);
|
|
68
66
|
const ownProfile = await client.ownProfile();
|
|
69
67
|
const notesIterable = await ownProfile.notes();
|
|
70
|
-
const
|
|
71
|
-
let count = 0;
|
|
72
|
-
for await (const note of notesIterable) {
|
|
73
|
-
if (count >= limit)
|
|
74
|
-
break;
|
|
75
|
-
formattedNotes.push({
|
|
76
|
-
noteId: ((_c = (_b = (_a = note.rawData) === null || _a === void 0 ? void 0 : _a.comment) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.toString()) || ((_d = note.id) === null || _d === void 0 ? void 0 : _d.toString()) || 'unknown',
|
|
77
|
-
body: note.body || '',
|
|
78
|
-
url: SubstackUtils_1.SubstackUtils.formatUrl(publicationAddress, `/p/${((_f = (_e = note.rawData) === null || _e === void 0 ? void 0 : _e.comment) === null || _f === void 0 ? void 0 : _f.id) || note.id || 'unknown'}`),
|
|
79
|
-
date: ((_h = (_g = note.rawData) === null || _g === void 0 ? void 0 : _g.context) === null || _h === void 0 ? void 0 : _h.timestamp) ||
|
|
80
|
-
((_j = note.publishedAt) === null || _j === void 0 ? void 0 : _j.toISOString()) ||
|
|
81
|
-
new Date().toISOString(),
|
|
82
|
-
status: 'published',
|
|
83
|
-
userId: ((_l = (_k = note.author) === null || _k === void 0 ? void 0 : _k.id) === null || _l === void 0 ? void 0 : _l.toString()) || 'unknown',
|
|
84
|
-
likes: note.likesCount || 0,
|
|
85
|
-
restacks: ((_o = (_m = note.rawData) === null || _m === void 0 ? void 0 : _m.comment) === null || _o === void 0 ? void 0 : _o.restacks) || 0,
|
|
86
|
-
type: 'note',
|
|
87
|
-
entityKey: ((_p = note.rawData) === null || _p === void 0 ? void 0 : _p.entity_key) || note.id,
|
|
88
|
-
});
|
|
89
|
-
count++;
|
|
90
|
-
}
|
|
68
|
+
const results = await OperationUtils_1.OperationUtils.executeAsyncIterable(notesIterable, limit, DataFormatters_1.DataFormatters.formatNote, publicationAddress);
|
|
91
69
|
return {
|
|
92
70
|
success: true,
|
|
93
|
-
data:
|
|
94
|
-
metadata: {
|
|
95
|
-
status: 'success',
|
|
96
|
-
},
|
|
71
|
+
data: results,
|
|
72
|
+
metadata: { status: 'success' }
|
|
97
73
|
};
|
|
98
74
|
}
|
|
99
75
|
catch (error) {
|
|
@@ -105,47 +81,17 @@ async function get(executeFunctions, client, publicationAddress, itemIndex) {
|
|
|
105
81
|
}
|
|
106
82
|
}
|
|
107
83
|
async function getNotesBySlug(executeFunctions, client, publicationAddress, itemIndex) {
|
|
108
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
109
84
|
try {
|
|
110
85
|
const slug = executeFunctions.getNodeParameter('slug', itemIndex);
|
|
111
86
|
const limitParam = executeFunctions.getNodeParameter('limit', itemIndex, '');
|
|
112
|
-
|
|
113
|
-
if (limitParam !== '' && limitParam !== null && limitParam !== undefined) {
|
|
114
|
-
limit = Number(limitParam);
|
|
115
|
-
}
|
|
87
|
+
const limit = OperationUtils_1.OperationUtils.parseLimit(limitParam);
|
|
116
88
|
const profile = await client.profileForSlug(slug);
|
|
117
89
|
const notesIterable = await profile.notes();
|
|
118
|
-
const
|
|
119
|
-
let count = 0;
|
|
120
|
-
for await (const note of notesIterable) {
|
|
121
|
-
if (count >= limit)
|
|
122
|
-
break;
|
|
123
|
-
try {
|
|
124
|
-
formattedNotes.push({
|
|
125
|
-
noteId: ((_c = (_b = (_a = note.rawData) === null || _a === void 0 ? void 0 : _a.comment) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.toString()) || ((_d = note.id) === null || _d === void 0 ? void 0 : _d.toString()) || 'unknown',
|
|
126
|
-
body: note.body || '',
|
|
127
|
-
url: SubstackUtils_1.SubstackUtils.formatUrl(publicationAddress, `/p/${((_f = (_e = note.rawData) === null || _e === void 0 ? void 0 : _e.comment) === null || _f === void 0 ? void 0 : _f.id) || note.id || 'unknown'}`),
|
|
128
|
-
date: ((_h = (_g = note.rawData) === null || _g === void 0 ? void 0 : _g.context) === null || _h === void 0 ? void 0 : _h.timestamp) ||
|
|
129
|
-
((_j = note.publishedAt) === null || _j === void 0 ? void 0 : _j.toISOString()) ||
|
|
130
|
-
new Date().toISOString(),
|
|
131
|
-
status: 'published',
|
|
132
|
-
userId: ((_l = (_k = note.author) === null || _k === void 0 ? void 0 : _k.id) === null || _l === void 0 ? void 0 : _l.toString()) || 'unknown',
|
|
133
|
-
likes: note.likesCount || 0,
|
|
134
|
-
restacks: ((_o = (_m = note.rawData) === null || _m === void 0 ? void 0 : _m.comment) === null || _o === void 0 ? void 0 : _o.restacks) || 0,
|
|
135
|
-
type: 'note',
|
|
136
|
-
entityKey: ((_p = note.rawData) === null || _p === void 0 ? void 0 : _p.entity_key) || note.id,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
}
|
|
141
|
-
count++;
|
|
142
|
-
}
|
|
90
|
+
const results = await OperationUtils_1.OperationUtils.executeAsyncIterable(notesIterable, limit, DataFormatters_1.DataFormatters.formatNote, publicationAddress);
|
|
143
91
|
return {
|
|
144
92
|
success: true,
|
|
145
|
-
data:
|
|
146
|
-
metadata: {
|
|
147
|
-
status: 'success',
|
|
148
|
-
},
|
|
93
|
+
data: results,
|
|
94
|
+
metadata: { status: 'success' }
|
|
149
95
|
};
|
|
150
96
|
}
|
|
151
97
|
catch (error) {
|
|
@@ -157,47 +103,17 @@ async function getNotesBySlug(executeFunctions, client, publicationAddress, item
|
|
|
157
103
|
}
|
|
158
104
|
}
|
|
159
105
|
async function getNotesById(executeFunctions, client, publicationAddress, itemIndex) {
|
|
160
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
161
106
|
try {
|
|
162
|
-
const userId = executeFunctions.getNodeParameter('userId', itemIndex);
|
|
107
|
+
const userId = OperationUtils_1.OperationUtils.parseNumericParam(executeFunctions.getNodeParameter('userId', itemIndex), 'userId');
|
|
163
108
|
const limitParam = executeFunctions.getNodeParameter('limit', itemIndex, '');
|
|
164
|
-
|
|
165
|
-
if (limitParam !== '' && limitParam !== null && limitParam !== undefined) {
|
|
166
|
-
limit = Number(limitParam);
|
|
167
|
-
}
|
|
109
|
+
const limit = OperationUtils_1.OperationUtils.parseLimit(limitParam);
|
|
168
110
|
const profile = await client.profileForId(userId);
|
|
169
111
|
const notesIterable = await profile.notes();
|
|
170
|
-
const
|
|
171
|
-
let count = 0;
|
|
172
|
-
for await (const note of notesIterable) {
|
|
173
|
-
if (count >= limit)
|
|
174
|
-
break;
|
|
175
|
-
try {
|
|
176
|
-
formattedNotes.push({
|
|
177
|
-
noteId: ((_c = (_b = (_a = note.rawData) === null || _a === void 0 ? void 0 : _a.comment) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.toString()) || ((_d = note.id) === null || _d === void 0 ? void 0 : _d.toString()) || 'unknown',
|
|
178
|
-
body: note.body || '',
|
|
179
|
-
url: SubstackUtils_1.SubstackUtils.formatUrl(publicationAddress, `/p/${((_f = (_e = note.rawData) === null || _e === void 0 ? void 0 : _e.comment) === null || _f === void 0 ? void 0 : _f.id) || note.id || 'unknown'}`),
|
|
180
|
-
date: ((_h = (_g = note.rawData) === null || _g === void 0 ? void 0 : _g.context) === null || _h === void 0 ? void 0 : _h.timestamp) ||
|
|
181
|
-
((_j = note.publishedAt) === null || _j === void 0 ? void 0 : _j.toISOString()) ||
|
|
182
|
-
new Date().toISOString(),
|
|
183
|
-
status: 'published',
|
|
184
|
-
userId: ((_l = (_k = note.author) === null || _k === void 0 ? void 0 : _k.id) === null || _l === void 0 ? void 0 : _l.toString()) || 'unknown',
|
|
185
|
-
likes: note.likesCount || 0,
|
|
186
|
-
restacks: ((_o = (_m = note.rawData) === null || _m === void 0 ? void 0 : _m.comment) === null || _o === void 0 ? void 0 : _o.restacks) || 0,
|
|
187
|
-
type: 'note',
|
|
188
|
-
entityKey: ((_p = note.rawData) === null || _p === void 0 ? void 0 : _p.entity_key) || note.id,
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
}
|
|
193
|
-
count++;
|
|
194
|
-
}
|
|
112
|
+
const results = await OperationUtils_1.OperationUtils.executeAsyncIterable(notesIterable, limit, DataFormatters_1.DataFormatters.formatNote, publicationAddress);
|
|
195
113
|
return {
|
|
196
114
|
success: true,
|
|
197
|
-
data:
|
|
198
|
-
metadata: {
|
|
199
|
-
status: 'success',
|
|
200
|
-
},
|
|
115
|
+
data: results,
|
|
116
|
+
metadata: { status: 'success' }
|
|
201
117
|
};
|
|
202
118
|
}
|
|
203
119
|
catch (error) {
|
|
@@ -209,30 +125,14 @@ async function getNotesById(executeFunctions, client, publicationAddress, itemIn
|
|
|
209
125
|
}
|
|
210
126
|
}
|
|
211
127
|
async function getNoteById(executeFunctions, client, publicationAddress, itemIndex) {
|
|
212
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
213
128
|
try {
|
|
214
|
-
const noteId = executeFunctions.getNodeParameter('noteId', itemIndex);
|
|
215
|
-
const note = await client.noteForId(
|
|
216
|
-
const
|
|
217
|
-
noteId: ((_c = (_b = (_a = note.rawData) === null || _a === void 0 ? void 0 : _a.comment) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.toString()) || ((_d = note.id) === null || _d === void 0 ? void 0 : _d.toString()) || 'unknown',
|
|
218
|
-
body: note.body || '',
|
|
219
|
-
url: SubstackUtils_1.SubstackUtils.formatUrl(publicationAddress, `/p/${((_f = (_e = note.rawData) === null || _e === void 0 ? void 0 : _e.comment) === null || _f === void 0 ? void 0 : _f.id) || note.id || 'unknown'}`),
|
|
220
|
-
date: ((_h = (_g = note.rawData) === null || _g === void 0 ? void 0 : _g.context) === null || _h === void 0 ? void 0 : _h.timestamp) ||
|
|
221
|
-
((_j = note.publishedAt) === null || _j === void 0 ? void 0 : _j.toISOString()) ||
|
|
222
|
-
new Date().toISOString(),
|
|
223
|
-
status: 'published',
|
|
224
|
-
userId: ((_l = (_k = note.author) === null || _k === void 0 ? void 0 : _k.id) === null || _l === void 0 ? void 0 : _l.toString()) || 'unknown',
|
|
225
|
-
likes: note.likesCount || 0,
|
|
226
|
-
restacks: ((_o = (_m = note.rawData) === null || _m === void 0 ? void 0 : _m.comment) === null || _o === void 0 ? void 0 : _o.restacks) || 0,
|
|
227
|
-
type: 'note',
|
|
228
|
-
entityKey: ((_p = note.rawData) === null || _p === void 0 ? void 0 : _p.entity_key) || note.id,
|
|
229
|
-
};
|
|
129
|
+
const noteId = OperationUtils_1.OperationUtils.parseNumericParam(executeFunctions.getNodeParameter('noteId', itemIndex), 'noteId');
|
|
130
|
+
const note = await client.noteForId(noteId);
|
|
131
|
+
const result = DataFormatters_1.DataFormatters.formatNote(note, publicationAddress);
|
|
230
132
|
return {
|
|
231
133
|
success: true,
|
|
232
|
-
data:
|
|
233
|
-
metadata: {
|
|
234
|
-
status: 'success',
|
|
235
|
-
},
|
|
134
|
+
data: result,
|
|
135
|
+
metadata: { status: 'success' }
|
|
236
136
|
};
|
|
237
137
|
}
|
|
238
138
|
catch (error) {
|
|
@@ -252,7 +152,8 @@ async function createSimpleNote(ownProfile, body, executeFunctions, itemIndex) {
|
|
|
252
152
|
});
|
|
253
153
|
}
|
|
254
154
|
try {
|
|
255
|
-
|
|
155
|
+
const finalBuilder = ownProfile.newNote().paragraph().text(body.trim());
|
|
156
|
+
return await finalBuilder.publish();
|
|
256
157
|
}
|
|
257
158
|
catch (buildError) {
|
|
258
159
|
return SubstackUtils_1.SubstackUtils.formatErrorResponse({
|
|
@@ -271,7 +172,8 @@ async function createAdvancedNote(ownProfile, body, executeFunctions, itemIndex)
|
|
|
271
172
|
});
|
|
272
173
|
}
|
|
273
174
|
try {
|
|
274
|
-
|
|
175
|
+
const finalBuilder = await MarkdownParser_1.MarkdownParser.parseMarkdownToNoteStructured(body.trim(), ownProfile.newNote());
|
|
176
|
+
return await finalBuilder.publish();
|
|
275
177
|
}
|
|
276
178
|
catch (error) {
|
|
277
179
|
let userMessage = error.message;
|