n8n-nodes-plus-tard 1.0.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.
Files changed (40) hide show
  1. package/LICENSE.md +19 -0
  2. package/README.md +247 -0
  3. package/dist/credentials/PlusTardApi.credentials.d.ts +10 -0
  4. package/dist/credentials/PlusTardApi.credentials.js +40 -0
  5. package/dist/credentials/PlusTardApi.credentials.js.map +1 -0
  6. package/dist/credentials/plustard.svg +1 -0
  7. package/dist/icons/github.dark.svg +3 -0
  8. package/dist/icons/github.svg +3 -0
  9. package/dist/nodes/PlusTard/PlusTard.node.d.ts +9 -0
  10. package/dist/nodes/PlusTard/PlusTard.node.js +52 -0
  11. package/dist/nodes/PlusTard/PlusTard.node.js.map +1 -0
  12. package/dist/nodes/PlusTard/PlusTard.node.json +0 -0
  13. package/dist/nodes/PlusTard/plustard.svg +1 -0
  14. package/dist/nodes/PlusTard/resources/index.d.ts +2 -0
  15. package/dist/nodes/PlusTard/resources/index.js +8 -0
  16. package/dist/nodes/PlusTard/resources/index.js.map +1 -0
  17. package/dist/nodes/PlusTard/resources/media.d.ts +2 -0
  18. package/dist/nodes/PlusTard/resources/media.js +49 -0
  19. package/dist/nodes/PlusTard/resources/media.js.map +1 -0
  20. package/dist/nodes/PlusTard/resources/posts.d.ts +2 -0
  21. package/dist/nodes/PlusTard/resources/posts.js +31 -0
  22. package/dist/nodes/PlusTard/resources/posts.js.map +1 -0
  23. package/dist/nodes/PlusTard/types.d.ts +19 -0
  24. package/dist/nodes/PlusTard/types.js +16 -0
  25. package/dist/nodes/PlusTard/types.js.map +1 -0
  26. package/dist/nodes/PlusTard/utils/fieldBuilders.d.ts +6 -0
  27. package/dist/nodes/PlusTard/utils/fieldBuilders.js +189 -0
  28. package/dist/nodes/PlusTard/utils/fieldBuilders.js.map +1 -0
  29. package/dist/nodes/PlusTard/utils/nodeBuilder.d.ts +5 -0
  30. package/dist/nodes/PlusTard/utils/nodeBuilder.js +52 -0
  31. package/dist/nodes/PlusTard/utils/nodeBuilder.js.map +1 -0
  32. package/dist/nodes/PlusTard/utils/platformHelpers.d.ts +7 -0
  33. package/dist/nodes/PlusTard/utils/platformHelpers.js +96 -0
  34. package/dist/nodes/PlusTard/utils/platformHelpers.js.map +1 -0
  35. package/dist/nodes/PlusTard/utils/routingHooks.d.ts +6 -0
  36. package/dist/nodes/PlusTard/utils/routingHooks.js +60 -0
  37. package/dist/nodes/PlusTard/utils/routingHooks.js.map +1 -0
  38. package/dist/package.json +50 -0
  39. package/dist/tsconfig.tsbuildinfo +1 -0
  40. package/package.json +50 -0
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildPlatformSelector = buildPlatformSelector;
4
+ exports.buildPageSelectors = buildPageSelectors;
5
+ exports.buildMediaItemsField = buildMediaItemsField;
6
+ exports.buildCommonPostFields = buildCommonPostFields;
7
+ exports.buildPlatformSpecificFields = buildPlatformSpecificFields;
8
+ const platformHelpers_1 = require("./platformHelpers");
9
+ function buildPlatformSelector() {
10
+ return {
11
+ displayName: 'Platforms',
12
+ name: 'selectedPlatforms',
13
+ type: 'multiOptions',
14
+ options: platformHelpers_1.SUPPORTED_PLATFORMS.map((platform) => ({
15
+ name: platform.name,
16
+ value: platform.value,
17
+ })),
18
+ default: [],
19
+ displayOptions: {
20
+ show: {
21
+ resource: ['posts'],
22
+ operation: ['create'],
23
+ },
24
+ },
25
+ description: 'Select the platforms where you want to post your content. After selecting platforms, you will be able to choose specific pages/accounts for each platform.',
26
+ required: true,
27
+ };
28
+ }
29
+ function buildPageSelectors() {
30
+ return platformHelpers_1.SUPPORTED_PLATFORMS.map((platform) => ({
31
+ displayName: platform.displayName,
32
+ name: `${platform.value}Pages`,
33
+ type: 'multiOptions',
34
+ typeOptions: {
35
+ loadOptionsMethod: `get${platform.value.charAt(0).toUpperCase() + platform.value.slice(1)}Pages`,
36
+ },
37
+ default: [],
38
+ displayOptions: {
39
+ show: {
40
+ resource: ['posts'],
41
+ operation: ['create'],
42
+ selectedPlatforms: [platform.value],
43
+ },
44
+ },
45
+ description: `Select the ${platform.name} pages/accounts to post to. Make sure you have connected ${platform.name} pages in Plus Tard.`,
46
+ }));
47
+ }
48
+ function buildMediaItemsField() {
49
+ return {
50
+ displayName: 'Image URLs',
51
+ name: 'imagePosts',
52
+ type: 'fixedCollection',
53
+ default: { items: [] },
54
+ typeOptions: {
55
+ multipleValues: true,
56
+ sortable: true,
57
+ },
58
+ displayOptions: {
59
+ show: {
60
+ resource: ['posts'],
61
+ operation: ['create'],
62
+ },
63
+ },
64
+ description: 'Media files to attach to your post. Upload files first using the Media resource, then use the returned URLs here.',
65
+ options: [
66
+ {
67
+ name: 'items',
68
+ displayName: 'Media Items',
69
+ values: [
70
+ {
71
+ displayName: 'URL',
72
+ name: 'url',
73
+ type: 'string',
74
+ default: '',
75
+ noDataExpression: false,
76
+ description: 'URL of the uploaded media file. You can use expressions like ={{ $JSON.URL }}.',
77
+ placeholder: 'https://example.com/image.jpg',
78
+ required: true,
79
+ },
80
+ ],
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ function buildCommonPostFields() {
86
+ return [
87
+ {
88
+ displayName: 'Text Content',
89
+ name: 'text',
90
+ type: 'string',
91
+ typeOptions: {
92
+ rows: 4,
93
+ },
94
+ default: '',
95
+ displayOptions: {
96
+ show: {
97
+ resource: ['posts'],
98
+ operation: ['create'],
99
+ },
100
+ },
101
+ description: 'The main text content of your post. Will be used across all selected platforms. Note: Different platforms have different character limits.',
102
+ placeholder: 'Hello, world! #socialmedia #automation',
103
+ required: true,
104
+ },
105
+ {
106
+ displayName: 'Scheduled For',
107
+ name: 'plannedAt',
108
+ type: 'dateTime',
109
+ default: '',
110
+ displayOptions: {
111
+ show: {
112
+ resource: ['posts'],
113
+ operation: ['create'],
114
+ },
115
+ },
116
+ description: 'When to publish the post (ISO 8601 format). Leave empty to publish immediately.',
117
+ required: true,
118
+ },
119
+ ];
120
+ }
121
+ function buildPlatformSpecificFields() {
122
+ return [
123
+ {
124
+ displayName: 'Twitter Parameters',
125
+ name: 'twitterParams',
126
+ type: 'fixedCollection',
127
+ default: { items: [] },
128
+ typeOptions: {
129
+ multipleValues: true,
130
+ },
131
+ displayOptions: {
132
+ show: {
133
+ resource: ['posts'],
134
+ operation: ['create'],
135
+ selectedPlatforms: ['twitter'],
136
+ },
137
+ },
138
+ description: 'Additional parameters specific to Twitter/X posts',
139
+ options: [
140
+ {
141
+ name: 'items',
142
+ displayName: 'Parameters',
143
+ values: [
144
+ {
145
+ displayName: 'Parameter',
146
+ name: 'param',
147
+ type: 'string',
148
+ default: '',
149
+ description: 'Twitter-specific parameter',
150
+ },
151
+ ],
152
+ },
153
+ ],
154
+ },
155
+ {
156
+ displayName: 'TikTok Parameters',
157
+ name: 'tiktokParams',
158
+ type: 'fixedCollection',
159
+ default: { items: [] },
160
+ typeOptions: {
161
+ multipleValues: true,
162
+ },
163
+ displayOptions: {
164
+ show: {
165
+ resource: ['posts'],
166
+ operation: ['create'],
167
+ selectedPlatforms: ['tiktok'],
168
+ },
169
+ },
170
+ description: 'Additional parameters specific to TikTok posts',
171
+ options: [
172
+ {
173
+ name: 'items',
174
+ displayName: 'Parameters',
175
+ values: [
176
+ {
177
+ displayName: 'Parameter',
178
+ name: 'param',
179
+ type: 'string',
180
+ default: '',
181
+ description: 'TikTok-specific parameter',
182
+ },
183
+ ],
184
+ },
185
+ ],
186
+ },
187
+ ];
188
+ }
189
+ //# sourceMappingURL=fieldBuilders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldBuilders.js","sourceRoot":"","sources":["../../../../nodes/PlusTard/utils/fieldBuilders.ts"],"names":[],"mappings":";;AAMA,sDAoBC;AAKD,gDAkBC;AAKD,oDAqCC;AAKD,sDAqCC;AAKD,kEAmEC;AA5MD,uDAAwD;AAKxD,SAAgB,qBAAqB;IACpC,OAAO;QACN,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,qCAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE;QACX,cAAc,EAAE;YACf,IAAI,EAAE;gBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;gBACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;aACrB;SACD;QACD,WAAW,EACV,4JAA4J;QAC7J,QAAQ,EAAE,IAAI;KACd,CAAC;AACH,CAAC;AAKD,SAAgB,kBAAkB;IACjC,OAAO,qCAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,IAAI,EAAE,GAAG,QAAQ,CAAC,KAAK,OAAO;QAC9B,IAAI,EAAE,cAAuB;QAC7B,WAAW,EAAE;YACZ,iBAAiB,EAAE,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;SAChG;QACD,OAAO,EAAE,EAAE;QACX,cAAc,EAAE;YACf,IAAI,EAAE;gBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;gBACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;gBACrB,iBAAiB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;aACnC;SACD;QACD,WAAW,EAAE,cAAc,QAAQ,CAAC,IAAI,4DAA4D,QAAQ,CAAC,IAAI,sBAAsB;KACvI,CAAC,CAAC,CAAC;AACL,CAAC;AAKD,SAAgB,oBAAoB;IACnC,OAAO;QACN,WAAW,EAAE,YAAY;QACzB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACtB,WAAW,EAAE;YACZ,cAAc,EAAE,IAAI;YACpB,QAAQ,EAAE,IAAI;SACd;QACD,cAAc,EAAE;YACf,IAAI,EAAE;gBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;gBACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;aACrB;SACD;QACD,WAAW,EACV,mHAAmH;QACpH,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,aAAa;gBAC1B,MAAM,EAAE;oBACP;wBACC,WAAW,EAAE,KAAK;wBAClB,IAAI,EAAE,KAAK;wBACX,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;wBACX,gBAAgB,EAAE,KAAK;wBACvB,WAAW,EAAE,gFAAgF;wBAC7F,WAAW,EAAE,+BAA+B;wBAC5C,QAAQ,EAAE,IAAI;qBACd;iBACD;aACD;SACD;KACD,CAAC;AACH,CAAC;AAKD,SAAgB,qBAAqB;IACpC,OAAO;QACN;YACC,WAAW,EAAE,cAAc;YAC3B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE;gBACZ,IAAI,EAAE,CAAC;aACP;YACD,OAAO,EAAE,EAAE;YACX,cAAc,EAAE;gBACf,IAAI,EAAE;oBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;oBACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;iBACrB;aACD;YACD,WAAW,EACV,4IAA4I;YAC7I,WAAW,EAAE,wCAAwC;YACrD,QAAQ,EAAE,IAAI;SACd;QACD;YACC,WAAW,EAAE,eAAe;YAC5B,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE;YACX,cAAc,EAAE;gBACf,IAAI,EAAE;oBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;oBACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;iBACrB;aACD;YACD,WAAW,EACV,iFAAiF;YAClF,QAAQ,EAAE,IAAI;SACd;KACD,CAAC;AACH,CAAC;AAKD,SAAgB,2BAA2B;IAC1C,OAAO;QACN;YACC,WAAW,EAAE,oBAAoB;YACjC,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACtB,WAAW,EAAE;gBACZ,cAAc,EAAE,IAAI;aACpB;YACD,cAAc,EAAE;gBACf,IAAI,EAAE;oBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;oBACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;oBACrB,iBAAiB,EAAE,CAAC,SAAS,CAAC;iBAC9B;aACD;YACD,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,YAAY;oBACzB,MAAM,EAAE;wBACP;4BACC,WAAW,EAAE,WAAW;4BACxB,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,EAAE;4BACX,WAAW,EAAE,4BAA4B;yBACzC;qBACD;iBACD;aACD;SACD;QACD;YACC,WAAW,EAAE,mBAAmB;YAChC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACtB,WAAW,EAAE;gBACZ,cAAc,EAAE,IAAI;aACpB;YACD,cAAc,EAAE;gBACf,IAAI,EAAE;oBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;oBACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;oBACrB,iBAAiB,EAAE,CAAC,QAAQ,CAAC;iBAC7B;aACD;YACD,WAAW,EAAE,gDAAgD;YAC7D,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,YAAY;oBACzB,MAAM,EAAE;wBACP;4BACC,WAAW,EAAE,WAAW;4BACxB,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,EAAE;4BACX,WAAW,EAAE,2BAA2B;yBACxC;qBACD;iBACD;aACD;SACD;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ import type { PlusTardResource, PlusTardResourceModule } from '../types';
3
+ export declare function buildResourceSelector(): INodeProperties;
4
+ export declare function buildOperationSelector(resource: PlusTardResource, resourceModule: PlusTardResourceModule): INodeProperties;
5
+ export declare function buildNodeProperties(resourceModules: Record<PlusTardResource, PlusTardResourceModule>): INodeProperties[];
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildResourceSelector = buildResourceSelector;
4
+ exports.buildOperationSelector = buildOperationSelector;
5
+ exports.buildNodeProperties = buildNodeProperties;
6
+ const types_1 = require("../types");
7
+ function buildResourceSelector() {
8
+ return {
9
+ displayName: 'Resource',
10
+ name: 'resource',
11
+ type: 'options',
12
+ noDataExpression: true,
13
+ options: types_1.PLUSTARD_RESOURCES.map((resource) => ({
14
+ name: resource.name,
15
+ value: resource.value,
16
+ description: resource.description,
17
+ })),
18
+ default: '',
19
+ };
20
+ }
21
+ function buildOperationSelector(resource, resourceModule) {
22
+ return {
23
+ displayName: 'Operation',
24
+ name: 'operation',
25
+ type: 'options',
26
+ noDataExpression: true,
27
+ default: '',
28
+ displayOptions: {
29
+ show: {
30
+ resource: [resource],
31
+ },
32
+ },
33
+ options: resourceModule.operations.map((op) => ({
34
+ name: op.name,
35
+ value: op.value,
36
+ action: op.action,
37
+ routing: op.routing,
38
+ })),
39
+ };
40
+ }
41
+ function buildNodeProperties(resourceModules) {
42
+ const properties = [];
43
+ properties.push(buildResourceSelector());
44
+ Object.entries(resourceModules).forEach(([resource, module]) => {
45
+ properties.push(buildOperationSelector(resource, module));
46
+ });
47
+ Object.values(resourceModules).forEach((module) => {
48
+ properties.push(...module.fields);
49
+ });
50
+ return properties;
51
+ }
52
+ //# sourceMappingURL=nodeBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeBuilder.js","sourceRoot":"","sources":["../../../../nodes/PlusTard/utils/nodeBuilder.ts"],"names":[],"mappings":";;AAIA,sDAaC;AAED,wDAsBC;AAED,kDAmBC;AA5DD,oCAA8C;AAE9C,SAAgB,qBAAqB;IACpC,OAAO;QACN,WAAW,EAAE,UAAU;QACvB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,0BAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;SACjC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE;KACX,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CACrC,QAA0B,EAC1B,cAAsC;IAEtC,OAAO;QACN,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,EAAE;QACX,cAAc,EAAE;YACf,IAAI,EAAE;gBACL,QAAQ,EAAE,CAAC,QAAQ,CAAC;aACpB;SACD;QACD,OAAO,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,OAAO,EAAE,EAAE,CAAC,OAAgB;SAC5B,CAAC,CAAC;KACH,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAClC,eAAiE;IAEjE,MAAM,UAAU,GAAsB,EAAE,CAAC;IAGzC,UAAU,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAGzC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE;QAC9D,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAA4B,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAGH,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACjD,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACnB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
2
+ export declare const SUPPORTED_PLATFORMS: {
3
+ name: string;
4
+ value: string;
5
+ displayName: string;
6
+ }[];
7
+ export declare function loadPlatformAccounts(this: ILoadOptionsFunctions, platform: string): Promise<INodePropertyOptions[]>;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SUPPORTED_PLATFORMS = void 0;
4
+ exports.loadPlatformAccounts = loadPlatformAccounts;
5
+ exports.SUPPORTED_PLATFORMS = [
6
+ {
7
+ name: 'Twitter/X',
8
+ value: 'twitter',
9
+ displayName: 'Twitter/X Accounts',
10
+ },
11
+ {
12
+ name: 'Facebook',
13
+ value: 'facebook',
14
+ displayName: 'Facebook Pages',
15
+ },
16
+ {
17
+ name: 'Instagram',
18
+ value: 'instagram',
19
+ displayName: 'Instagram Accounts',
20
+ },
21
+ {
22
+ name: 'LinkedIn',
23
+ value: 'linkedin',
24
+ displayName: 'LinkedIn Accounts',
25
+ },
26
+ {
27
+ name: 'TikTok',
28
+ value: 'tiktok',
29
+ displayName: 'TikTok Accounts',
30
+ },
31
+ {
32
+ name: 'Bluesky',
33
+ value: 'bluesky',
34
+ displayName: 'Bluesky Accounts',
35
+ },
36
+ {
37
+ name: 'Threads',
38
+ value: 'threads',
39
+ displayName: 'Threads Accounts',
40
+ },
41
+ ];
42
+ async function loadPlatformAccounts(platform) {
43
+ var _a;
44
+ try {
45
+ this.logger.debug(`[PlusTard] Loading accounts for platform: ${platform}`);
46
+ const response = (await this.helpers.httpRequestWithAuthentication.call(this, 'plusTardAPIApi', {
47
+ method: 'GET',
48
+ url: 'https://plus-tard.com/api/user_providers',
49
+ headers: {
50
+ Accept: 'application/ld+json',
51
+ 'Content-Type': 'application/ld+json',
52
+ },
53
+ }));
54
+ this.logger.debug('[PlusTard] Raw API response:', { response: JSON.stringify(response, null, 2) });
55
+ this.logger.debug(`[PlusTard] Response type: ${typeof response}, Is array: ${Array.isArray(response)}`);
56
+ const responseObj = response;
57
+ const userProviders = Array.isArray(response)
58
+ ? response
59
+ : responseObj.member || responseObj['hydra:member'] || [];
60
+ this.logger.debug(`[PlusTard] Found ${userProviders.length} user providers`);
61
+ const platformAccounts = [];
62
+ for (const provider of userProviders) {
63
+ const prov = provider;
64
+ this.logger.debug(`[PlusTard] Provider: ${prov.provider}, Accounts: ${(prov.accounts || []).length}`);
65
+ if (((_a = prov.provider) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === platform.toLowerCase()) {
66
+ const accounts = prov.accounts || [];
67
+ if (accounts.length > 0) {
68
+ for (const account of accounts) {
69
+ const acc = account;
70
+ platformAccounts.push({
71
+ name: acc.name || acc.accountId || acc['@id'] || 'Unknown',
72
+ value: acc['@id'] || acc.accountId || '',
73
+ });
74
+ }
75
+ }
76
+ else {
77
+ platformAccounts.push({
78
+ name: prov.username || prov['@id'] || 'Unknown',
79
+ value: prov['@id'] || '',
80
+ });
81
+ }
82
+ }
83
+ }
84
+ this.logger.debug(`[PlusTard] Returning ${platformAccounts.length} accounts for platform ${platform}`);
85
+ return platformAccounts;
86
+ }
87
+ catch (error) {
88
+ this.logger.error('[PlusTard] Error loading accounts:', {
89
+ error: error instanceof Error ? error.message : String(error),
90
+ platform,
91
+ stack: error instanceof Error ? error.stack : undefined
92
+ });
93
+ return [];
94
+ }
95
+ }
96
+ //# sourceMappingURL=platformHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platformHelpers.js","sourceRoot":"","sources":["../../../../nodes/PlusTard/utils/platformHelpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IExecuteFunctions } from 'n8n-workflow';
2
+ export declare function postsCreatePreSend(this: IExecuteFunctions, requestOptions: {
3
+ body?: Record<string, unknown>;
4
+ }): Promise<{
5
+ body?: Record<string, unknown>;
6
+ }>;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.postsCreatePreSend = postsCreatePreSend;
4
+ function buildPagesArray(executeFunctions, itemIndex) {
5
+ const selectedPlatforms = executeFunctions.getNodeParameter('selectedPlatforms', itemIndex, []);
6
+ const allPages = [];
7
+ selectedPlatforms.forEach((platform) => {
8
+ const pagesParam = `${platform}Pages`;
9
+ const pages = executeFunctions.getNodeParameter(pagesParam, itemIndex, []);
10
+ executeFunctions.logger.debug(`[PlusTard] Platform: ${platform}, Param: ${pagesParam}, Pages: ${JSON.stringify(pages)}`);
11
+ if (pages && Array.isArray(pages)) {
12
+ allPages.push(...pages);
13
+ }
14
+ });
15
+ return allPages;
16
+ }
17
+ function processMediaItems(executeFunctions, itemIndex) {
18
+ const imagePostsData = executeFunctions.getNodeParameter('imagePosts', itemIndex, { items: [] });
19
+ if (!imagePostsData || !imagePostsData.items || !Array.isArray(imagePostsData.items)) {
20
+ return [];
21
+ }
22
+ return imagePostsData.items.map((item) => item.url).filter((url) => url);
23
+ }
24
+ function processPlatformParams(executeFunctions, itemIndex, paramName) {
25
+ const paramsData = executeFunctions.getNodeParameter(paramName, itemIndex, {
26
+ items: [],
27
+ });
28
+ if (!paramsData || !paramsData.items || !Array.isArray(paramsData.items)) {
29
+ return [];
30
+ }
31
+ return paramsData.items.map((item) => item.param).filter((param) => param);
32
+ }
33
+ async function postsCreatePreSend(requestOptions) {
34
+ const itemIndex = 0;
35
+ this.logger.debug('[PlusTard] Starting postsCreatePreSend');
36
+ const pageIds = buildPagesArray(this, itemIndex);
37
+ this.logger.debug(`[PlusTard] pageIds: ${JSON.stringify(pageIds)}`);
38
+ const pageId = pageIds[0] || this.getNodeParameter('pageId', itemIndex, '');
39
+ this.logger.debug(`[PlusTard] pageId: ${pageId}`);
40
+ const selectedPlatforms = this.getNodeParameter('selectedPlatforms', itemIndex, []);
41
+ const provider = selectedPlatforms[0] || this.getNodeParameter('provider', itemIndex, '');
42
+ this.logger.debug(`[PlusTard] provider: ${provider}`);
43
+ const imagePosts = processMediaItems(this, itemIndex);
44
+ this.logger.debug(`[PlusTard] imagePosts: ${JSON.stringify(imagePosts)}`);
45
+ const twitterParams = processPlatformParams(this, itemIndex, 'twitterParams');
46
+ this.logger.debug(`[PlusTard] twitterParams: ${JSON.stringify(twitterParams)}`);
47
+ const tiktokParams = processPlatformParams(this, itemIndex, 'tiktokParams');
48
+ this.logger.debug(`[PlusTard] tiktokParams: ${JSON.stringify(tiktokParams)}`);
49
+ requestOptions.body = {
50
+ text: this.getNodeParameter('text', itemIndex),
51
+ provider: provider,
52
+ plannedAt: this.getNodeParameter('plannedAt', itemIndex),
53
+ pageId: pageId,
54
+ imagePosts: imagePosts,
55
+ twitterParams: twitterParams,
56
+ tiktokParams: tiktokParams,
57
+ };
58
+ return requestOptions;
59
+ }
60
+ //# sourceMappingURL=routingHooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routingHooks.js","sourceRoot":"","sources":["../../../../nodes/PlusTard/utils/routingHooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "n8n-nodes-plus-tard",
3
+ "version": "0.1.0",
4
+ "description": "n8n community node for Plus Tard - Schedule social media posts across Twitter/X, Facebook, Instagram, LinkedIn, TikTok, Bluesky, and Threads",
5
+ "license": "MIT",
6
+ "homepage": "",
7
+ "keywords": [
8
+ "n8n-community-node-package"
9
+ ],
10
+ "author": {
11
+ "name": "Boréales Créations",
12
+ "email": "boreales.creations@gmail.com"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/boreales/n8n-nodes-plus-tard.git"
17
+ },
18
+ "scripts": {
19
+ "build": "n8n-node build",
20
+ "build:watch": "tsc --watch",
21
+ "dev": "n8n-node dev",
22
+ "lint": "n8n-node lint",
23
+ "lint:fix": "n8n-node lint --fix",
24
+ "release": "n8n-node release",
25
+ "prepublishOnly": "n8n-node prerelease"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "n8n": {
31
+ "n8nNodesApiVersion": 1,
32
+ "strict": true,
33
+ "credentials": [
34
+ "dist/credentials/PlusTardApi.credentials.js"
35
+ ],
36
+ "nodes": [
37
+ "dist/nodes/PlusTard/PlusTard.node.js"
38
+ ]
39
+ },
40
+ "devDependencies": {
41
+ "@n8n/node-cli": "*",
42
+ "eslint": "9.32.0",
43
+ "prettier": "3.6.2",
44
+ "release-it": "^19.0.4",
45
+ "typescript": "5.9.2"
46
+ },
47
+ "peerDependencies": {
48
+ "n8n-workflow": "*"
49
+ }
50
+ }