@tadnt2003/n8n-nodes-infisical 0.2.0 → 0.3.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.
@@ -0,0 +1,5 @@
1
+ import { IDataObject, IExecuteFunctions } from 'n8n-workflow';
2
+ export declare function getInfisicalToken(helpers: IExecuteFunctions['helpers'], credentials: IDataObject): Promise<{
3
+ apiUrl: string;
4
+ accessToken: string;
5
+ }>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInfisicalToken = void 0;
4
+ async function getInfisicalToken(helpers, credentials) {
5
+ const apiUrl = credentials.apiUrl.replace(/\/$/, '');
6
+ const authType = credentials.authType || 'serviceToken';
7
+ if (authType === 'universalAuth') {
8
+ const clientId = credentials.clientId;
9
+ const clientSecret = credentials.clientSecret;
10
+ const parts = [
11
+ `clientId=${encodeURIComponent(clientId)}`,
12
+ `clientSecret=${encodeURIComponent(clientSecret)}`,
13
+ ];
14
+ if (credentials.organizationSlug) {
15
+ parts.push(`organizationSlug=${encodeURIComponent(credentials.organizationSlug)}`);
16
+ }
17
+ const tokenResponse = await helpers.httpRequest({
18
+ method: 'POST',
19
+ url: `${apiUrl}/v1/auth/universal-auth/login`,
20
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
21
+ body: parts.join('&'),
22
+ });
23
+ return { apiUrl, accessToken: tokenResponse.accessToken };
24
+ }
25
+ return { apiUrl, accessToken: credentials.apiKey };
26
+ }
27
+ exports.getInfisicalToken = getInfisicalToken;
@@ -0,0 +1,2 @@
1
+ import { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export declare function executeFolderOperation(ctx: IExecuteFunctions, apiUrl: string, baseHeaders: Record<string, string>, operation: string, i: number): Promise<INodeExecutionData[]>;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeFolderOperation = void 0;
4
+ async function executeFolderOperation(ctx, apiUrl, baseHeaders, operation, i) {
5
+ const result = [];
6
+ // ── getFolderById ─────────────────────────────────────────────────────
7
+ if (operation === 'getFolderById') {
8
+ const folderId = ctx.getNodeParameter('folderId', i);
9
+ const response = await ctx.helpers.httpRequest({
10
+ method: 'GET',
11
+ url: `${apiUrl}/v2/folders/${encodeURIComponent(folderId)}`,
12
+ headers: baseHeaders,
13
+ });
14
+ result.push({ json: response.folder, pairedItem: { item: i } });
15
+ }
16
+ else {
17
+ // All remaining operations share projectId / environment / folderPath
18
+ const projectId = ctx.getNodeParameter('projectId', i);
19
+ const environment = ctx.getNodeParameter('environment', i);
20
+ const folderPath = ctx.getNodeParameter('folderPath', i);
21
+ // ── listFolders ───────────────────────────────────────────────────
22
+ if (operation === 'listFolders') {
23
+ const listFolderOptions = ctx.getNodeParameter('listFolderOptions', i, {});
24
+ const qs = { projectId, environment, path: folderPath };
25
+ if (listFolderOptions.recursive !== undefined)
26
+ qs.recursive = listFolderOptions.recursive;
27
+ if (listFolderOptions.lastSecretModified)
28
+ qs.lastSecretModified = listFolderOptions.lastSecretModified;
29
+ const response = await ctx.helpers.httpRequest({
30
+ method: 'GET',
31
+ url: `${apiUrl}/v2/folders`,
32
+ headers: baseHeaders,
33
+ qs,
34
+ });
35
+ const folders = response.folders;
36
+ for (const folder of folders) {
37
+ result.push({ json: folder, pairedItem: { item: i } });
38
+ }
39
+ // ── createFolder ───────────────────────────────────────────────────
40
+ }
41
+ else if (operation === 'createFolder') {
42
+ const folderName = ctx.getNodeParameter('folderName', i);
43
+ const createFolderOptions = ctx.getNodeParameter('createFolderOptions', i, {});
44
+ const body = {
45
+ projectId,
46
+ environment,
47
+ name: folderName,
48
+ path: folderPath,
49
+ };
50
+ if (createFolderOptions.description !== undefined)
51
+ body.description = createFolderOptions.description;
52
+ const response = await ctx.helpers.httpRequest({
53
+ method: 'POST',
54
+ url: `${apiUrl}/v2/folders`,
55
+ headers: baseHeaders,
56
+ body: JSON.stringify(body),
57
+ });
58
+ result.push({ json: response.folder, pairedItem: { item: i } });
59
+ // ── updateFolder ───────────────────────────────────────────────────
60
+ }
61
+ else if (operation === 'updateFolder') {
62
+ const folderId = ctx.getNodeParameter('folderId', i);
63
+ const folderName = ctx.getNodeParameter('folderName', i);
64
+ const updateFolderOptions = ctx.getNodeParameter('updateFolderOptions', i, {});
65
+ const body = {
66
+ projectId,
67
+ environment,
68
+ name: folderName,
69
+ path: folderPath,
70
+ };
71
+ if (updateFolderOptions.description !== undefined)
72
+ body.description = updateFolderOptions.description;
73
+ const response = await ctx.helpers.httpRequest({
74
+ method: 'PATCH',
75
+ url: `${apiUrl}/v2/folders/${encodeURIComponent(folderId)}`,
76
+ headers: baseHeaders,
77
+ body: JSON.stringify(body),
78
+ });
79
+ result.push({ json: response.folder, pairedItem: { item: i } });
80
+ // ── deleteFolder ───────────────────────────────────────────────────
81
+ }
82
+ else if (operation === 'deleteFolder') {
83
+ const folderIdOrName = ctx.getNodeParameter('folderIdOrName', i);
84
+ const deleteFolderOptions = ctx.getNodeParameter('deleteFolderOptions', i, {});
85
+ const body = {
86
+ projectId,
87
+ environment,
88
+ path: folderPath,
89
+ };
90
+ if (deleteFolderOptions.forceDelete)
91
+ body.forceDelete = deleteFolderOptions.forceDelete;
92
+ const response = await ctx.helpers.httpRequest({
93
+ method: 'DELETE',
94
+ url: `${apiUrl}/v2/folders/${encodeURIComponent(folderIdOrName)}`,
95
+ headers: baseHeaders,
96
+ body: JSON.stringify(body),
97
+ });
98
+ result.push({ json: response.folder, pairedItem: { item: i } });
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ exports.executeFolderOperation = executeFolderOperation;
@@ -0,0 +1,2 @@
1
+ import { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export declare function executeProjectOperation(ctx: IExecuteFunctions, apiUrl: string, baseHeaders: Record<string, string>, operation: string, i: number): Promise<INodeExecutionData[]>;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeProjectOperation = void 0;
4
+ async function executeProjectOperation(ctx, apiUrl, baseHeaders, operation, i) {
5
+ const result = [];
6
+ // ── getAll ────────────────────────────────────────────────────────────
7
+ if (operation === 'getAll') {
8
+ const response = await ctx.helpers.httpRequest({
9
+ method: 'GET',
10
+ url: `${apiUrl}/v1/projects`,
11
+ headers: baseHeaders,
12
+ });
13
+ const projects = response.projects;
14
+ for (const project of projects) {
15
+ result.push({ json: project, pairedItem: { item: i } });
16
+ }
17
+ // ── get ───────────────────────────────────────────────────────────────
18
+ }
19
+ else if (operation === 'get') {
20
+ const projectId = ctx.getNodeParameter('projectId', i);
21
+ const response = await ctx.helpers.httpRequest({
22
+ method: 'GET',
23
+ url: `${apiUrl}/v1/projects/${encodeURIComponent(projectId)}`,
24
+ headers: baseHeaders,
25
+ });
26
+ result.push({ json: response.project, pairedItem: { item: i } });
27
+ // ── getBySlug ─────────────────────────────────────────────────────────
28
+ }
29
+ else if (operation === 'getBySlug') {
30
+ const slug = ctx.getNodeParameter('slug', i);
31
+ const response = await ctx.helpers.httpRequest({
32
+ method: 'GET',
33
+ url: `${apiUrl}/v1/projects/slug/${encodeURIComponent(slug)}`,
34
+ headers: baseHeaders,
35
+ });
36
+ // Response body is the project object directly (no wrapper key)
37
+ result.push({ json: response, pairedItem: { item: i } });
38
+ // ── getSecretSnapshots ────────────────────────────────────────────────
39
+ }
40
+ else if (operation === 'getSecretSnapshots') {
41
+ const projectId = ctx.getNodeParameter('projectId', i);
42
+ const environment = ctx.getNodeParameter('snapshotEnvironment', i);
43
+ const snapshotOptions = ctx.getNodeParameter('snapshotOptions', i, {});
44
+ const qs = { environment };
45
+ if (snapshotOptions.secretPath)
46
+ qs.path = snapshotOptions.secretPath;
47
+ if (snapshotOptions.offset !== undefined && snapshotOptions.offset !== '')
48
+ qs.offset = snapshotOptions.offset;
49
+ if (snapshotOptions.limit !== undefined && snapshotOptions.limit !== '')
50
+ qs.limit = snapshotOptions.limit;
51
+ const response = await ctx.helpers.httpRequest({
52
+ method: 'GET',
53
+ url: `${apiUrl}/v1/projects/${encodeURIComponent(projectId)}/secret-snapshots`,
54
+ headers: baseHeaders,
55
+ qs,
56
+ });
57
+ const snapshots = response.secretSnapshots;
58
+ for (const snapshot of snapshots) {
59
+ result.push({ json: snapshot, pairedItem: { item: i } });
60
+ }
61
+ // ── getUserMemberships ────────────────────────────────────────────────
62
+ }
63
+ else if (operation === 'getUserMemberships') {
64
+ const projectId = ctx.getNodeParameter('projectId', i);
65
+ const response = await ctx.helpers.httpRequest({
66
+ method: 'GET',
67
+ url: `${apiUrl}/v1/projects/${encodeURIComponent(projectId)}/memberships`,
68
+ headers: baseHeaders,
69
+ });
70
+ const memberships = response.memberships;
71
+ for (const membership of memberships) {
72
+ result.push({ json: membership, pairedItem: { item: i } });
73
+ }
74
+ // ── getUserByUsername ─────────────────────────────────────────────────
75
+ }
76
+ else if (operation === 'getUserByUsername') {
77
+ const projectId = ctx.getNodeParameter('projectId', i);
78
+ const username = ctx.getNodeParameter('username', i);
79
+ const response = await ctx.helpers.httpRequest({
80
+ method: 'POST',
81
+ url: `${apiUrl}/v1/projects/${encodeURIComponent(projectId)}/memberships/details`,
82
+ headers: baseHeaders,
83
+ body: JSON.stringify({ username }),
84
+ });
85
+ result.push({ json: response.membership, pairedItem: { item: i } });
86
+ }
87
+ return result;
88
+ }
89
+ exports.executeProjectOperation = executeProjectOperation;
@@ -0,0 +1,2 @@
1
+ import { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export declare function executeSecretOperation(ctx: IExecuteFunctions, apiUrl: string, baseHeaders: Record<string, string>, operation: string, i: number): Promise<INodeExecutionData[]>;
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeSecretOperation = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ async function executeSecretOperation(ctx, apiUrl, baseHeaders, operation, i) {
6
+ var _a, _b, _c, _d, _e, _f;
7
+ const projectId = ctx.getNodeParameter('projectId', i);
8
+ const environment = ctx.getNodeParameter('environment', i);
9
+ const secretPath = ctx.getNodeParameter('secretPath', i);
10
+ const result = [];
11
+ // ── get ───────────────────────────────────────────────────────────────
12
+ if (operation === 'get') {
13
+ const secretKey = ctx.getNodeParameter('secretKey', i);
14
+ const response = await ctx.helpers.httpRequest({
15
+ method: 'GET',
16
+ url: `${apiUrl}/v4/secrets/${encodeURIComponent(secretKey)}`,
17
+ headers: baseHeaders,
18
+ qs: { projectId, environment, secretPath },
19
+ });
20
+ result.push({ json: response, pairedItem: { item: i } });
21
+ // ── getAll ────────────────────────────────────────────────────────────
22
+ }
23
+ else if (operation === 'getAll') {
24
+ const response = await ctx.helpers.httpRequest({
25
+ method: 'GET',
26
+ url: `${apiUrl}/v4/secrets`,
27
+ headers: baseHeaders,
28
+ qs: { projectId, environment, secretPath },
29
+ });
30
+ const secrets = response.secrets;
31
+ for (const secret of secrets) {
32
+ result.push({ json: secret, pairedItem: { item: i } });
33
+ }
34
+ // ── create ────────────────────────────────────────────────────────────
35
+ }
36
+ else if (operation === 'create') {
37
+ const secretKey = ctx.getNodeParameter('secretKey', i);
38
+ const secretValue = ctx.getNodeParameter('secretValue', i);
39
+ const createOptions = ctx.getNodeParameter('createOptions', i, {});
40
+ const secretMetadataParam = ctx.getNodeParameter('secretMetadata', i, {});
41
+ const body = {
42
+ projectId,
43
+ environment,
44
+ secretValue,
45
+ secretPath,
46
+ type: (_a = createOptions.type) !== null && _a !== void 0 ? _a : 'shared',
47
+ };
48
+ if (createOptions.secretComment)
49
+ body.secretComment = createOptions.secretComment;
50
+ if (createOptions.skipMultilineEncoding) {
51
+ body.skipMultilineEncoding = createOptions.skipMultilineEncoding;
52
+ }
53
+ const metadataEntries = (_b = secretMetadataParam.values) !== null && _b !== void 0 ? _b : [];
54
+ if (metadataEntries.length > 0) {
55
+ body.secretMetadata = metadataEntries.map((m) => ({ key: m.key, value: m.value }));
56
+ }
57
+ const response = await ctx.helpers.httpRequest({
58
+ method: 'POST',
59
+ url: `${apiUrl}/v4/secrets/${encodeURIComponent(secretKey)}`,
60
+ headers: baseHeaders,
61
+ body: JSON.stringify(body),
62
+ });
63
+ result.push({ json: response, pairedItem: { item: i } });
64
+ // ── update ────────────────────────────────────────────────────────────
65
+ }
66
+ else if (operation === 'update') {
67
+ const secretKey = ctx.getNodeParameter('secretKey', i);
68
+ const updateOptions = ctx.getNodeParameter('updateOptions', i, {});
69
+ const secretMetadataParam = ctx.getNodeParameter('secretMetadata', i, {});
70
+ const body = {
71
+ projectId,
72
+ environment,
73
+ secretPath,
74
+ };
75
+ if (updateOptions.secretValue !== undefined && updateOptions.secretValue !== '') {
76
+ body.secretValue = updateOptions.secretValue;
77
+ }
78
+ if (updateOptions.newSecretName)
79
+ body.newSecretName = updateOptions.newSecretName;
80
+ if (updateOptions.secretComment !== undefined)
81
+ body.secretComment = updateOptions.secretComment;
82
+ if (updateOptions.type)
83
+ body.type = updateOptions.type;
84
+ if (updateOptions.skipMultilineEncoding) {
85
+ body.skipMultilineEncoding = updateOptions.skipMultilineEncoding;
86
+ }
87
+ const metadataEntries = (_c = secretMetadataParam.values) !== null && _c !== void 0 ? _c : [];
88
+ if (metadataEntries.length > 0) {
89
+ body.secretMetadata = metadataEntries.map((m) => ({ key: m.key, value: m.value }));
90
+ }
91
+ const response = await ctx.helpers.httpRequest({
92
+ method: 'PATCH',
93
+ url: `${apiUrl}/v4/secrets/${encodeURIComponent(secretKey)}`,
94
+ headers: baseHeaders,
95
+ body: JSON.stringify(body),
96
+ });
97
+ result.push({ json: response, pairedItem: { item: i } });
98
+ // ── delete ────────────────────────────────────────────────────────────
99
+ }
100
+ else if (operation === 'delete') {
101
+ const secretKey = ctx.getNodeParameter('secretKey', i);
102
+ const body = {
103
+ projectId,
104
+ environment,
105
+ secretPath,
106
+ };
107
+ const response = await ctx.helpers.httpRequest({
108
+ method: 'DELETE',
109
+ url: `${apiUrl}/v4/secrets/${encodeURIComponent(secretKey)}`,
110
+ headers: baseHeaders,
111
+ body: JSON.stringify(body),
112
+ });
113
+ result.push({ json: response, pairedItem: { item: i } });
114
+ // ── createMany ────────────────────────────────────────────────────────
115
+ }
116
+ else if (operation === 'createMany') {
117
+ const secretsParam = ctx.getNodeParameter('secrets', i, {});
118
+ const secretItems = (_d = secretsParam.values) !== null && _d !== void 0 ? _d : [];
119
+ if (secretItems.length === 0) {
120
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'At least one secret must be added in the Secrets list', { itemIndex: i });
121
+ }
122
+ const createManyOptions = ctx.getNodeParameter('createManyOptions', i, {});
123
+ const effectivePath = createManyOptions.secretPath || secretPath;
124
+ const secrets = secretItems.map((item) => {
125
+ var _a;
126
+ const s = {
127
+ secretKey: item.secretKey,
128
+ secretValue: item.secretValue,
129
+ };
130
+ if (item.secretComment)
131
+ s.secretComment = item.secretComment;
132
+ if (item.skipMultilineEncoding)
133
+ s.skipMultilineEncoding = item.skipMultilineEncoding;
134
+ const metaParam = item.secretMetadata;
135
+ const metaEntries = (_a = metaParam === null || metaParam === void 0 ? void 0 : metaParam.values) !== null && _a !== void 0 ? _a : [];
136
+ if (metaEntries.length > 0) {
137
+ s.secretMetadata = metaEntries.map((m) => ({ key: m.key, value: m.value }));
138
+ }
139
+ return s;
140
+ });
141
+ const body = {
142
+ projectId,
143
+ environment,
144
+ secretPath: effectivePath,
145
+ secrets,
146
+ };
147
+ const response = await ctx.helpers.httpRequest({
148
+ method: 'POST',
149
+ url: `${apiUrl}/v4/secrets/batch`,
150
+ headers: baseHeaders,
151
+ body: JSON.stringify(body),
152
+ });
153
+ const responseData = response;
154
+ if (Array.isArray(responseData.secrets)) {
155
+ for (const secret of responseData.secrets) {
156
+ result.push({ json: secret, pairedItem: { item: i } });
157
+ }
158
+ }
159
+ else {
160
+ // Approval / policy-gated response
161
+ result.push({ json: responseData, pairedItem: { item: i } });
162
+ }
163
+ // ── updateMany ────────────────────────────────────────────────────────
164
+ }
165
+ else if (operation === 'updateMany') {
166
+ const secretsToUpdateParam = ctx.getNodeParameter('secretsToUpdate', i, {});
167
+ const secretItems = (_e = secretsToUpdateParam.values) !== null && _e !== void 0 ? _e : [];
168
+ if (secretItems.length === 0) {
169
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'At least one secret must be added in the Secrets list', { itemIndex: i });
170
+ }
171
+ const updateManyOptions = ctx.getNodeParameter('updateManyOptions', i, {});
172
+ const effectivePath = updateManyOptions.secretPath || secretPath;
173
+ const secrets = secretItems.map((item) => {
174
+ var _a;
175
+ const s = { secretKey: item.secretKey };
176
+ if (item.secretValue !== undefined && item.secretValue !== '') {
177
+ s.secretValue = item.secretValue;
178
+ }
179
+ if (item.newSecretName)
180
+ s.newSecretName = item.newSecretName;
181
+ if (item.secretComment !== undefined && item.secretComment !== '') {
182
+ s.secretComment = item.secretComment;
183
+ }
184
+ if (item.skipMultilineEncoding)
185
+ s.skipMultilineEncoding = item.skipMultilineEncoding;
186
+ const metaParam = item.secretMetadata;
187
+ const metaEntries = (_a = metaParam === null || metaParam === void 0 ? void 0 : metaParam.values) !== null && _a !== void 0 ? _a : [];
188
+ if (metaEntries.length > 0) {
189
+ s.secretMetadata = metaEntries.map((m) => ({ key: m.key, value: m.value }));
190
+ }
191
+ return s;
192
+ });
193
+ const body = {
194
+ projectId,
195
+ environment,
196
+ secretPath: effectivePath,
197
+ secrets,
198
+ };
199
+ if (updateManyOptions.mode)
200
+ body.mode = updateManyOptions.mode;
201
+ const response = await ctx.helpers.httpRequest({
202
+ method: 'PATCH',
203
+ url: `${apiUrl}/v4/secrets/batch`,
204
+ headers: baseHeaders,
205
+ body: JSON.stringify(body),
206
+ });
207
+ const responseData = response;
208
+ if (Array.isArray(responseData.secrets)) {
209
+ for (const secret of responseData.secrets) {
210
+ result.push({ json: secret, pairedItem: { item: i } });
211
+ }
212
+ }
213
+ else {
214
+ // Approval / policy-gated response
215
+ result.push({ json: responseData, pairedItem: { item: i } });
216
+ }
217
+ // ── deleteMany ────────────────────────────────────────────────────────
218
+ }
219
+ else if (operation === 'deleteMany') {
220
+ const secretsToDeleteParam = ctx.getNodeParameter('secretsToDelete', i, {});
221
+ const secretItems = (_f = secretsToDeleteParam.values) !== null && _f !== void 0 ? _f : [];
222
+ if (secretItems.length === 0) {
223
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'At least one secret must be added in the Secrets list', { itemIndex: i });
224
+ }
225
+ const deleteManyOptions = ctx.getNodeParameter('deleteManyOptions', i, {});
226
+ const effectivePath = deleteManyOptions.secretPath || secretPath;
227
+ const secrets = secretItems.map((item) => ({
228
+ secretKey: item.secretKey,
229
+ type: item.type || 'shared',
230
+ }));
231
+ const body = {
232
+ projectId,
233
+ environment,
234
+ secretPath: effectivePath,
235
+ secrets,
236
+ };
237
+ const response = await ctx.helpers.httpRequest({
238
+ method: 'DELETE',
239
+ url: `${apiUrl}/v4/secrets/batch`,
240
+ headers: baseHeaders,
241
+ body: JSON.stringify(body),
242
+ });
243
+ const responseData = response;
244
+ if (Array.isArray(responseData.secrets)) {
245
+ for (const secret of responseData.secrets) {
246
+ result.push({ json: secret, pairedItem: { item: i } });
247
+ }
248
+ }
249
+ else {
250
+ // Approval / policy-gated response
251
+ result.push({ json: responseData, pairedItem: { item: i } });
252
+ }
253
+ }
254
+ return result;
255
+ }
256
+ exports.executeSecretOperation = executeSecretOperation;
@@ -0,0 +1,2 @@
1
+ import { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export declare function executeSyncOperation(ctx: IExecuteFunctions, apiUrl: string, baseHeaders: Record<string, string>, operation: string, i: number): Promise<INodeExecutionData[]>;