n8n-nodes-ca-google-sheets-style 0.1.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.
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './nodes/GoogleSheetsStyle/GoogleSheetsStyle.node';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./nodes/GoogleSheetsStyle/GoogleSheetsStyle.node"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1GQUFpRSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbm9kZXMvR29vZ2xlU2hlZXRzU3R5bGUvR29vZ2xlU2hlZXRzU3R5bGUubm9kZSc7XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class GoogleSheetsStyle implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GoogleSheetsStyle = void 0;
|
|
4
|
+
// Utility functions
|
|
5
|
+
function parseRange(range) {
|
|
6
|
+
const match = range.match(/([A-Z]+)(\d+):([A-Z]+)(\d+)/);
|
|
7
|
+
if (!match) {
|
|
8
|
+
throw new Error(`Invalid range format: ${range}`);
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
startCol: letterToCol(match[1]),
|
|
12
|
+
startRow: parseInt(match[2], 10),
|
|
13
|
+
endCol: letterToCol(match[3]),
|
|
14
|
+
endRow: parseInt(match[4], 10),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function letterToCol(letter) {
|
|
18
|
+
let col = 0;
|
|
19
|
+
for (let i = 0; i < letter.length; i++) {
|
|
20
|
+
col = col * 26 + (letter.charCodeAt(i) - 64);
|
|
21
|
+
}
|
|
22
|
+
return col;
|
|
23
|
+
}
|
|
24
|
+
function colToLetter(col) {
|
|
25
|
+
let letter = '';
|
|
26
|
+
while (col > 0) {
|
|
27
|
+
const temp = (col - 1) % 26;
|
|
28
|
+
letter = String.fromCharCode(temp + 65) + letter;
|
|
29
|
+
col = Math.floor((col - temp) / 26);
|
|
30
|
+
}
|
|
31
|
+
return letter;
|
|
32
|
+
}
|
|
33
|
+
function hexToRgb(hex) {
|
|
34
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
35
|
+
if (!result) {
|
|
36
|
+
return { red: 1, green: 1, blue: 1 };
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
red: parseInt(result[1], 16) / 255,
|
|
40
|
+
green: parseInt(result[2], 16) / 255,
|
|
41
|
+
blue: parseInt(result[3], 16) / 255,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function rgbToHex(rgb) {
|
|
45
|
+
const r = Math.round((rgb.red || 0) * 255);
|
|
46
|
+
const g = Math.round((rgb.green || 0) * 255);
|
|
47
|
+
const b = Math.round((rgb.blue || 0) * 255);
|
|
48
|
+
return '#' + [r, g, b].map(x => x.toString(16).padStart(2, '0')).join('');
|
|
49
|
+
}
|
|
50
|
+
function extractFormat(format) {
|
|
51
|
+
const result = {};
|
|
52
|
+
if (format.backgroundColor) {
|
|
53
|
+
result.backgroundColor = rgbToHex(format.backgroundColor);
|
|
54
|
+
}
|
|
55
|
+
if (format.textFormat) {
|
|
56
|
+
result.textFormat = {
|
|
57
|
+
color: format.textFormat.foregroundColor
|
|
58
|
+
? rgbToHex(format.textFormat.foregroundColor)
|
|
59
|
+
: undefined,
|
|
60
|
+
fontFamily: format.textFormat.fontFamily,
|
|
61
|
+
fontSize: format.textFormat.fontSize,
|
|
62
|
+
bold: format.textFormat.bold,
|
|
63
|
+
italic: format.textFormat.italic,
|
|
64
|
+
strikethrough: format.textFormat.strikethrough,
|
|
65
|
+
underline: format.textFormat.underline,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (format.horizontalAlignment) {
|
|
69
|
+
result.horizontalAlignment = format.horizontalAlignment;
|
|
70
|
+
}
|
|
71
|
+
if (format.verticalAlignment) {
|
|
72
|
+
result.verticalAlignment = format.verticalAlignment;
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
class GoogleSheetsStyle {
|
|
77
|
+
constructor() {
|
|
78
|
+
this.description = {
|
|
79
|
+
displayName: 'Google Sheets Style',
|
|
80
|
+
name: 'googleSheetsStyle',
|
|
81
|
+
icon: 'file:googleSheets.svg',
|
|
82
|
+
group: ['transform'],
|
|
83
|
+
version: 1,
|
|
84
|
+
subtitle: '={{$parameter["operation"]}}',
|
|
85
|
+
description: 'Read and write cell styles in Google Sheets',
|
|
86
|
+
defaults: {
|
|
87
|
+
name: 'Google Sheets Style',
|
|
88
|
+
},
|
|
89
|
+
inputs: ['main'],
|
|
90
|
+
outputs: ['main'],
|
|
91
|
+
credentials: [
|
|
92
|
+
{
|
|
93
|
+
name: 'googleSheetsOAuth2Api',
|
|
94
|
+
required: true,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
properties: [
|
|
98
|
+
{
|
|
99
|
+
displayName: 'Operation',
|
|
100
|
+
name: 'operation',
|
|
101
|
+
type: 'options',
|
|
102
|
+
noDataExpression: true,
|
|
103
|
+
options: [
|
|
104
|
+
{
|
|
105
|
+
name: 'Get Style',
|
|
106
|
+
value: 'getStyle',
|
|
107
|
+
description: 'Get cell formatting/style from a range',
|
|
108
|
+
action: 'Get cell style',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'Set Style',
|
|
112
|
+
value: 'setStyle',
|
|
113
|
+
description: 'Set cell formatting/style for a range',
|
|
114
|
+
action: 'Set cell style',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
default: 'getStyle',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
displayName: 'Spreadsheet ID',
|
|
121
|
+
name: 'spreadsheetId',
|
|
122
|
+
type: 'string',
|
|
123
|
+
required: true,
|
|
124
|
+
default: '',
|
|
125
|
+
description: 'The ID of the spreadsheet (from URL)',
|
|
126
|
+
placeholder: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
displayName: 'Sheet ID',
|
|
130
|
+
name: 'sheetId',
|
|
131
|
+
type: 'number',
|
|
132
|
+
required: true,
|
|
133
|
+
default: 0,
|
|
134
|
+
description: 'The ID of the sheet (gid parameter from URL)',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
displayName: 'Range',
|
|
138
|
+
name: 'range',
|
|
139
|
+
type: 'string',
|
|
140
|
+
required: true,
|
|
141
|
+
default: 'A1:B2',
|
|
142
|
+
description: 'The A1 notation of the range (e.g., A1:B2)',
|
|
143
|
+
placeholder: 'A1:B2',
|
|
144
|
+
},
|
|
145
|
+
// Set Style options
|
|
146
|
+
{
|
|
147
|
+
displayName: 'Background Color',
|
|
148
|
+
name: 'backgroundColor',
|
|
149
|
+
type: 'color',
|
|
150
|
+
default: '#ffffff',
|
|
151
|
+
displayOptions: {
|
|
152
|
+
show: {
|
|
153
|
+
operation: ['setStyle'],
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
description: 'Background color of the cells',
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
displayName: 'Text Color',
|
|
160
|
+
name: 'textColor',
|
|
161
|
+
type: 'color',
|
|
162
|
+
default: '#000000',
|
|
163
|
+
displayOptions: {
|
|
164
|
+
show: {
|
|
165
|
+
operation: ['setStyle'],
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
description: 'Text/foreground color',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
displayName: 'Font Size',
|
|
172
|
+
name: 'fontSize',
|
|
173
|
+
type: 'number',
|
|
174
|
+
default: 10,
|
|
175
|
+
displayOptions: {
|
|
176
|
+
show: {
|
|
177
|
+
operation: ['setStyle'],
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
description: 'Font size in points',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
displayName: 'Bold',
|
|
184
|
+
name: 'bold',
|
|
185
|
+
type: 'boolean',
|
|
186
|
+
default: false,
|
|
187
|
+
displayOptions: {
|
|
188
|
+
show: {
|
|
189
|
+
operation: ['setStyle'],
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
description: 'Whether to make text bold',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
displayName: 'Italic',
|
|
196
|
+
name: 'italic',
|
|
197
|
+
type: 'boolean',
|
|
198
|
+
default: false,
|
|
199
|
+
displayOptions: {
|
|
200
|
+
show: {
|
|
201
|
+
operation: ['setStyle'],
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
description: 'Whether to make text italic',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
displayName: 'Horizontal Alignment',
|
|
208
|
+
name: 'horizontalAlignment',
|
|
209
|
+
type: 'options',
|
|
210
|
+
options: [
|
|
211
|
+
{ name: 'Left', value: 'LEFT' },
|
|
212
|
+
{ name: 'Center', value: 'CENTER' },
|
|
213
|
+
{ name: 'Right', value: 'RIGHT' },
|
|
214
|
+
],
|
|
215
|
+
default: 'LEFT',
|
|
216
|
+
displayOptions: {
|
|
217
|
+
show: {
|
|
218
|
+
operation: ['setStyle'],
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
description: 'Horizontal text alignment',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
displayName: 'Fields to Update',
|
|
225
|
+
name: 'fieldsToUpdate',
|
|
226
|
+
type: 'multiOptions',
|
|
227
|
+
options: [
|
|
228
|
+
{ name: 'Background Color', value: 'backgroundColor' },
|
|
229
|
+
{ name: 'Text Color', value: 'textColor' },
|
|
230
|
+
{ name: 'Font Size', value: 'fontSize' },
|
|
231
|
+
{ name: 'Bold', value: 'bold' },
|
|
232
|
+
{ name: 'Italic', value: 'italic' },
|
|
233
|
+
{ name: 'Horizontal Alignment', value: 'horizontalAlignment' },
|
|
234
|
+
],
|
|
235
|
+
default: ['backgroundColor'],
|
|
236
|
+
displayOptions: {
|
|
237
|
+
show: {
|
|
238
|
+
operation: ['setStyle'],
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
description: 'Which style fields to update',
|
|
242
|
+
},
|
|
243
|
+
],
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
async execute() {
|
|
247
|
+
const items = this.getInputData();
|
|
248
|
+
const returnData = [];
|
|
249
|
+
const operation = this.getNodeParameter('operation', 0);
|
|
250
|
+
for (let i = 0; i < items.length; i++) {
|
|
251
|
+
try {
|
|
252
|
+
const spreadsheetId = this.getNodeParameter('spreadsheetId', i);
|
|
253
|
+
const sheetId = this.getNodeParameter('sheetId', i);
|
|
254
|
+
const range = this.getNodeParameter('range', i);
|
|
255
|
+
if (operation === 'getStyle') {
|
|
256
|
+
const result = await getStyle.call(this, spreadsheetId, sheetId, range);
|
|
257
|
+
returnData.push({ json: result });
|
|
258
|
+
}
|
|
259
|
+
else if (operation === 'setStyle') {
|
|
260
|
+
const result = await setStyle.call(this, spreadsheetId, sheetId, range, i);
|
|
261
|
+
returnData.push({ json: result });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (this.continueOnFail()) {
|
|
266
|
+
returnData.push({ json: { error: error.message } });
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return [returnData];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
exports.GoogleSheetsStyle = GoogleSheetsStyle;
|
|
276
|
+
async function getStyle(spreadsheetId, sheetId, range) {
|
|
277
|
+
const { startRow, endRow, startCol, endCol } = parseRange(range);
|
|
278
|
+
const response = await this.helpers.requestOAuth2.call(this, 'googleSheetsOAuth2Api', {
|
|
279
|
+
method: 'GET',
|
|
280
|
+
uri: `https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}`,
|
|
281
|
+
qs: {
|
|
282
|
+
ranges: range,
|
|
283
|
+
fields: 'sheets.data.rowData.values.effectiveFormat,sheets.properties',
|
|
284
|
+
},
|
|
285
|
+
json: true,
|
|
286
|
+
});
|
|
287
|
+
const sheets = response.sheets;
|
|
288
|
+
if (!sheets || sheets.length === 0) {
|
|
289
|
+
return { error: 'No sheet data found' };
|
|
290
|
+
}
|
|
291
|
+
const sheetData = sheets[0];
|
|
292
|
+
const data = sheetData.data || [];
|
|
293
|
+
if (data.length === 0) {
|
|
294
|
+
return { error: 'No data in range' };
|
|
295
|
+
}
|
|
296
|
+
const rowData = data[0].rowData || [];
|
|
297
|
+
const styles = [];
|
|
298
|
+
rowData.forEach((row, rowIndex) => {
|
|
299
|
+
const values = row.values || [];
|
|
300
|
+
values.forEach((cell, colIndex) => {
|
|
301
|
+
const format = cell.effectiveFormat || {};
|
|
302
|
+
styles.push({
|
|
303
|
+
row: startRow + rowIndex,
|
|
304
|
+
col: startCol + colIndex,
|
|
305
|
+
cell: colToLetter(startCol + colIndex) + (startRow + rowIndex),
|
|
306
|
+
format: extractFormat(format),
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
return {
|
|
311
|
+
spreadsheetId,
|
|
312
|
+
sheetId,
|
|
313
|
+
range,
|
|
314
|
+
styles,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
async function setStyle(spreadsheetId, sheetId, range, itemIndex) {
|
|
318
|
+
const { startRow, endRow, startCol, endCol } = parseRange(range);
|
|
319
|
+
const fieldsToUpdate = this.getNodeParameter('fieldsToUpdate', itemIndex);
|
|
320
|
+
const cellFormat = {};
|
|
321
|
+
const fields = [];
|
|
322
|
+
if (fieldsToUpdate.includes('backgroundColor')) {
|
|
323
|
+
const bgColor = this.getNodeParameter('backgroundColor', itemIndex);
|
|
324
|
+
cellFormat.backgroundColor = hexToRgb(bgColor);
|
|
325
|
+
fields.push('userEnteredFormat.backgroundColor');
|
|
326
|
+
}
|
|
327
|
+
if (fieldsToUpdate.includes('textColor')) {
|
|
328
|
+
const textColor = this.getNodeParameter('textColor', itemIndex);
|
|
329
|
+
if (!cellFormat.textFormat)
|
|
330
|
+
cellFormat.textFormat = {};
|
|
331
|
+
cellFormat.textFormat.foregroundColor = hexToRgb(textColor);
|
|
332
|
+
fields.push('userEnteredFormat.textFormat.foregroundColor');
|
|
333
|
+
}
|
|
334
|
+
if (fieldsToUpdate.includes('fontSize')) {
|
|
335
|
+
const fontSize = this.getNodeParameter('fontSize', itemIndex);
|
|
336
|
+
if (!cellFormat.textFormat)
|
|
337
|
+
cellFormat.textFormat = {};
|
|
338
|
+
cellFormat.textFormat.fontSize = fontSize;
|
|
339
|
+
fields.push('userEnteredFormat.textFormat.fontSize');
|
|
340
|
+
}
|
|
341
|
+
if (fieldsToUpdate.includes('bold')) {
|
|
342
|
+
const bold = this.getNodeParameter('bold', itemIndex);
|
|
343
|
+
if (!cellFormat.textFormat)
|
|
344
|
+
cellFormat.textFormat = {};
|
|
345
|
+
cellFormat.textFormat.bold = bold;
|
|
346
|
+
fields.push('userEnteredFormat.textFormat.bold');
|
|
347
|
+
}
|
|
348
|
+
if (fieldsToUpdate.includes('italic')) {
|
|
349
|
+
const italic = this.getNodeParameter('italic', itemIndex);
|
|
350
|
+
if (!cellFormat.textFormat)
|
|
351
|
+
cellFormat.textFormat = {};
|
|
352
|
+
cellFormat.textFormat.italic = italic;
|
|
353
|
+
fields.push('userEnteredFormat.textFormat.italic');
|
|
354
|
+
}
|
|
355
|
+
if (fieldsToUpdate.includes('horizontalAlignment')) {
|
|
356
|
+
const alignment = this.getNodeParameter('horizontalAlignment', itemIndex);
|
|
357
|
+
cellFormat.horizontalAlignment = alignment;
|
|
358
|
+
fields.push('userEnteredFormat.horizontalAlignment');
|
|
359
|
+
}
|
|
360
|
+
const request = {
|
|
361
|
+
requests: [
|
|
362
|
+
{
|
|
363
|
+
repeatCell: {
|
|
364
|
+
range: {
|
|
365
|
+
sheetId,
|
|
366
|
+
startRowIndex: startRow - 1,
|
|
367
|
+
endRowIndex: endRow,
|
|
368
|
+
startColumnIndex: startCol - 1,
|
|
369
|
+
endColumnIndex: endCol,
|
|
370
|
+
},
|
|
371
|
+
cell: {
|
|
372
|
+
userEnteredFormat: cellFormat,
|
|
373
|
+
},
|
|
374
|
+
fields: fields.join(','),
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
],
|
|
378
|
+
};
|
|
379
|
+
await this.helpers.requestOAuth2.call(this, 'googleSheetsOAuth2Api', {
|
|
380
|
+
method: 'POST',
|
|
381
|
+
uri: `https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}:batchUpdate`,
|
|
382
|
+
body: request,
|
|
383
|
+
json: true,
|
|
384
|
+
});
|
|
385
|
+
return {
|
|
386
|
+
success: true,
|
|
387
|
+
spreadsheetId,
|
|
388
|
+
sheetId,
|
|
389
|
+
range,
|
|
390
|
+
appliedFormat: cellFormat,
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR29vZ2xlU2hlZXRzU3R5bGUubm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ub2Rlcy9Hb29nbGVTaGVldHNTdHlsZS9Hb29nbGVTaGVldHNTdHlsZS5ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9DQSxvQkFBb0I7QUFDcEIsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUNoQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTztRQUNOLFFBQVEsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7S0FDOUIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUFjO0lBQ2xDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDeEMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNaLENBQUM7QUFFRCxTQUFTLFdBQVcs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V0FBVyxFQUFFLE1BQU07d0JBQ25CLGdCQUFnQixFQUFFLFFBQVEsR0FBRyxDQUFDO3dCQUM5QixjQUFjLEVBQUUsTUFBTTtxQkFDdEI7b0JBQ0QsSUFBSSxFQUFFO3dCQUNMLGlCQUFpQixFQUFFLFVBQVU7cUJBQzdCO29CQUNELE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztpQkFDeEI7YUFDRDtTQUNEO0tBQ0QsQ0FBQztJQUVGLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNwQyxJQUFJLEVBQ0osdUJBQXVCLEVBQ3ZCO1FBQ0MsTUFBTSxFQUFFLE1BQU07UUFDZCxHQUFHLEVBQUUsaURBQWlELGFBQWEsY0FBYztRQUNqRixJQUFJLEVBQUUsT0FBTztRQUNiLElBQUksRUFBRSxJQUFJO0tBQ1YsQ0FDRCxDQUFDO0lBRUYsT0FBTztRQUNOLE9BQU8sRUFBRSxJQUFJO1FBQ2IsYUFBYTtRQUNiLE9BQU87UUFDUCxLQUFLO1FBQ0wsYUFBYSxFQUFFLFVBQVU7S0FDekIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRJRXhlY3V0ZUZ1bmN0aW9ucyxcblx0SU5vZGVFeGVjdXRpb25EYXRhLFxuXHRJTm9kZVR5cGUsXG5cdElOb2RlVHlwZURlc2NyaXB0aW9uLFxuXHRJRGF0YU9iamVjdCxcblx0Tm9kZU9wZXJhdGlvbkVycm9yLFxufSBmcm9tICduOG4td29ya2Zsb3cnO1xuXG5pbnRlcmZhY2UgQ2VsbEZvcm1hdCB7XG5cdGJhY2tncm91bmRDb2xvcj86IHsgcmVkPzogbnVtYmVyOyBncmVlbj86IG51bWJlcjsgYmx1ZT86IG51bWJlcjsgYWxwaGE/OiBudW1iZXIgfTtcblx0dGV4dEZvcm1hdD86IHtcblx0XHRmb3JlZ3JvdW5kQ29sb3I/OiB7IHJlZD86IG51bWJlcjsgZ3JlZW4/OiBudW1iZXI7IGJsdWU/OiBudW1iZXI7IGFscGhhPzogbnVtYmVyIH07XG5cdFx0Zm9udEZhbWlseT86IHN0cmluZztcblx0XHRmb250U2l6ZT86IG51bWJlcjtcblx0XHRib2xkPzogYm9vbGVhbjtcblx0XHRpdGFsaWM/OiBib29sZWFuO1xuXHRcdHN0cmlrZXRocm91Z2g/OiBib29sZWFuO1xuXHRcdHVuZGVybGluZT86IGJvb2xlYW47XG5cdH07XG5cdGhvcml6b250YWxBbGlnbm1lbnQ/OiBzdHJpbmc7XG5cdHZlcnRpY2FsQWxpZ25tZW50Pzogc3RyaW5nO1xuXHR3cmFwU3RyYXRlZ3k/OiBzdHJpbmc7XG5cdGJvcmRlcnM/OiB7XG5cdFx0dG9wPzogQm9yZGVyU3R5bGU7XG5cdFx0Ym90dG9tPzogQm9yZGVyU3R5bGU7XG5cdFx0bGVmdD86IEJvcmRlclN0eWxlO1xuXHRcdHJpZ2h0PzogQm9yZGVyU3R5bGU7XG5cdH07XG59XG5cbmludGVyZmFjZSBCb3JkZXJTdHlsZSB7XG5cdHN0eWxlPzogc3RyaW5nO1xuXHRjb2xvcj86IHsgcmVkPzogbnVtYmVyOyBncmVlbj86IG51bWJlcjsgYmx1ZT86IG51bWJlcjsgYWxwaGE/OiBudW1iZXIgfTtcbn1cblxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcbmZ1bmN0aW9uIHBhcnNlUmFuZ2UocmFuZ2U6IHN0cmluZyk6IHsgc3RhcnRSb3c6IG51bWJlcjsgZW5kUm93OiBudW1iZXI7IHN0YXJ0Q29sOiBudW1iZXI7IGVuZENvbDogbnVtYmVyIH0ge1xuXHRjb25zdCBtYXRjaCA9IHJhbmdlLm1hdGNoKC8oW0EtWl0rKShcXGQrKTooW0EtWl0rKShcXGQrKS8pO1xuXHRpZiAoIW1hdGNoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbmdlIGZvcm1hdDogJHtyYW5nZX1gKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHN0YXJ0Q29sOiBsZXR0ZXJUb0NvbChtYXRjaFsxXSksXG5cdFx0c3RhcnRSb3c6IHBhcnNlSW50KG1hdGNoWzJdLCAxMCksXG5cdFx0ZW5kQ29sOiBsZXR0ZXJUb0NvbChtYXRjaFszXSksXG5cdFx0ZW5kUm93OiBwYXJzZUludChtYXRjaFs0XSwgMTApLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBsZXR0ZXJUb0NvbChsZXR0ZXI6IHN0cmluZyk6IG51bWJlciB7XG5cdGxldCBjb2wgPSAwO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGxldHRlci5sZW5ndGg7IGkrKykge1xuXHRcdGNvbCA9IGNvbCAqIDI2ICsgKGxldHRlci5jaGFyQ29kZUF0KGkpIC0gNjQpO1xuXHR9XG5cdHJldHVybiBjb2w7XG59XG5cbmZ1bmN0aW9uIGNvbFRvTGV0dGVyKGNvbDogbnVtYmVyKTogc3RyaW5nIHtcblx0bGV0IGxldHRlciA9ICcnO1xuXHR3aGlsZSAoY29sID4gMCkge1xuXHRcdGNvbnN0IHRlbXAgPSAoY29sIC0gMSkgJSAyNjtcblx0XHRsZXR0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRlbXAgKyA2NSkgKyBsZXR0ZXI7XG5cdFx0Y29sID0gTWF0aC5mbG9vcigoY29sIC0gdGVtcCkgLyAyNik7XG5cdH1cblx0cmV0dXJuIGxldHRlcjtcbn1cblxuZnVuY3Rpb24gaGV4VG9SZ2IoaGV4OiBzdHJpbmcpOiB7IHJlZDogbnVtYmVyOyBncmVlbjogbnVtYmVyOyBibHVlOiBudW1iZXIgfSB7XG5cdGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuXHRpZiAoIXJlc3VsdCkge1xuXHRcdHJldHVybiB7IHJlZDogMSwgZ3JlZW46IDEsIGJsdWU6IDEgfTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHJlZDogcGFyc2VJbnQocmVzdWx0WzFdLCAxNikgLyAyNTUsXG5cdFx0Z3JlZW46IHBhcnNlSW50KHJlc3VsdFsyXSwgMTYpIC8gMjU1LFxuXHRcdGJsdWU6IHBhcnNlSW50KHJlc3VsdFszXSwgMTYpIC8gMjU1LFxuXHR9O1xufVxuXG5mdW5jdGlvbiByZ2JUb0hleChyZ2I6IHsgcmVkPzogbnVtYmVyOyBncmVlbj86IG51bWJlcjsgYmx1ZT86IG51bWJlciB9KTogc3RyaW5nIHtcblx0Y29uc3QgciA9IE1hdGgucm91bmQoKHJnYi5yZWQgfHwgMCkgKiAyNTUpO1xuXHRjb25zdCBnID0gTWF0aC5yb3VuZCgocmdiLmdyZWVuIHx8IDApICogMjU1KTtcblx0Y29uc3QgYiA9IE1hdGgucm91bmQoKHJnYi5ibHVlIHx8IDApICogMjU1KTtcblx0cmV0dXJuICcjJyArIFtyLCBnLCBiXS5tYXAoeCA9PiB4LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEZvcm1hdChmb3JtYXQ6IENlbGxGb3JtYXQpOiBJRGF0YU9iamVjdCB7XG5cdGNvbnN0IHJlc3VsdDogSURhdGFPYmplY3QgPSB7fTtcblxuXHRpZiAoZm9ybWF0LmJhY2tncm91bmRDb2xvcikge1xuXHRcdHJlc3VsdC5iYWNrZ3JvdW5kQ29sb3IgPSByZ2JUb0hleChmb3JtYXQuYmFja2dyb3VuZENvbG9yKTtcblx0fVxuXG5cdGlmIChmb3JtYXQudGV4dEZvcm1hdCkge1xuXHRcdHJlc3VsdC50ZXh0Rm9ybWF0ID0ge1xuXHRcdFx0Y29sb3I6IGZvcm1hdC50ZXh0Rm9ybWF0LmZvcmVncm91bmRDb2xvclxuXHRcdFx0XHQ/IHJnYlRvSGV4KGZvcm1hdC50ZXh0Rm9ybWF0LmZvcmVncm91bmRDb2xvcilcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRmb250RmFtaWx5OiBmb3JtYXQudGV4dEZvcm1hdC5mb250RmFtaWx5LFxuXHRcdFx0Zm9udFNpemU6IGZvcm1hdC50ZXh0Rm9ybWF0LmZvbnRTaXplLFxuXHRcdFx0Ym9sZDogZm9ybWF0LnRleHRGb3JtYXQuYm9sZCxcblx0XHRcdGl0YWxpYzogZm9ybWF0LnRleHRGb3JtYXQuaXRhbGljLFxuXHRcdFx0c3RyaWtldGhyb3VnaDogZm9ybWF0LnRleHRGb3JtYXQuc3RyaWtldGhyb3VnaCxcblx0XHRcdHVuZGVybGluZTogZm9ybWF0LnRleHRGb3JtYXQudW5kZXJsaW5lLFxuXHRcdH07XG5cdH1cblxuXHRpZiAoZm9ybWF0Lmhvcml6b250YWxBbGlnbm1lbnQpIHtcblx0XHRyZXN1bHQuaG9yaXpvbnRhbEFsaWdubWVudCA9IGZvcm1hdC5ob3Jpem9udGFsQWxpZ25tZW50O1xuXHR9XG5cblx0aWYgKGZvcm1hdC52ZXJ0aWNhbEFsaWdubWVudCkge1xuXHRcdHJlc3VsdC52ZXJ0aWNhbEFsaWdubWVudCA9IGZvcm1hdC52ZXJ0aWNhbEFsaWdubWVudDtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBHb29nbGVTaGVldHNTdHlsZSBpbXBsZW1lbnRzIElOb2RlVHlwZSB7XG5cdGRlc2NyaXB0aW9uOiBJTm9kZVR5cGVEZXNjcmlwdGlvbiA9IHtcblx0XHRkaXNwbGF5TmFtZTogJ0dvb2dsZSBTaGVldHMgU3R5bGUnLFxuXHRcdG5hbWU6ICdnb29nbGVTaGVldHNTdHlsZScsXG5cdFx0aWNvbjogJ2ZpbGU6Z29vZ2xlU2hlZXRzLnN2ZycsXG5cdFx0Z3JvdXA6IFsndHJhbnNmb3JtJ10sXG5cdFx0dmVyc2lvbjogMSxcblx0XHRzdWJ0aXRsZTogJz17eyRwYXJhbWV0ZXJbXCJvcGVyYXRpb25cIl19fScsXG5cdFx0ZGVzY3JpcHRpb246ICdSZWFkIGFuZCB3cml0ZSBjZWxsIHN0eWxlcyBpbiBHb29nbGUgU2hlZXRzJyxcblx0XHRkZWZhdWx0czoge1xuXHRcdFx0bmFtZTogJ0dvb2dsZSBTaGVldHMgU3R5bGUnLFxuXHRcdH0sXG5cdFx0aW5wdXRzOiBbJ21haW4nXSxcblx0XHRvdXRwdXRzOiBbJ21haW4nXSxcblx0XHRjcmVkZW50aWFsczogW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiAnZ29vZ2xlU2hlZXRzT0F1dGgyQXBpJyxcblx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdFx0cHJvcGVydGllczogW1xuXHRcdFx0e1xuXHRcdFx0XHRkaXNwbGF5TmFtZTogJ09wZXJhdGlvbicsXG5cdFx0XHRcdG5hbWU6ICdvcGVyYXRpb24nLFxuXHRcdFx0XHR0eXBlOiAnb3B0aW9ucycsXG5cdFx0XHRcdG5vRGF0YUV4cHJlc3Npb246IHRydWUsXG5cdFx0XHRcdG9wdGlvbnM6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiAnR2V0IFN0eWxlJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnZ2V0U3R5bGUnLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdHZXQgY2VsbCBmb3JtYXR0aW5nL3N0eWxlIGZyb20gYSByYW5nZScsXG5cdFx0XHRcdFx0XHRhY3Rpb246ICdHZXQgY2VsbCBzdHlsZScsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiAnU2V0IFN0eWxlJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnc2V0U3R5bGUnLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdTZXQgY2VsbCBmb3JtYXR0aW5nL3N0eWxlIGZvciBhIHJhbmdlJyxcblx0XHRcdFx0XHRcdGFjdGlvbjogJ1NldCBjZWxsIHN0eWxlJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRkZWZhdWx0OiAnZ2V0U3R5bGUnLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdTcHJlYWRzaGVldCBJRCcsXG5cdFx0XHRcdG5hbWU6ICdzcHJlYWRzaGVldElkJyxcblx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdHJlcXVpcmVkOiB0cnVlLFxuXHRcdFx0XHRkZWZhdWx0OiAnJyxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdUaGUgSUQgb2YgdGhlIHNwcmVhZHNoZWV0IChmcm9tIFVSTCknLFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogJzFCeGlNVnMwWFJBNW5GTWRLdkJkQlpqZ21VVXFwdGxiczc0T2d2RTJ1cG1zJyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRpc3BsYXlOYW1lOiAnU2hlZXQgSUQnLFxuXHRcdFx0XHRuYW1lOiAnc2hlZXRJZCcsXG5cdFx0XHRcdHR5cGU6ICdudW1iZXInLFxuXHRcdFx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRcdFx0ZGVmYXVsdDogMCxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdUaGUgSUQgb2YgdGhlIHNoZWV0IChnaWQgcGFyYW1ldGVyIGZyb20gVVJMKScsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkaXNwbGF5TmFtZTogJ1JhbmdlJyxcblx0XHRcdFx0bmFtZTogJ3JhbmdlJyxcblx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdHJlcXVpcmVkOiB0cnVlLFxuXHRcdFx0XHRkZWZhdWx0OiAnQTE6QjInLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogJ1RoZSBBMSBub3RhdGlvbiBvZiB0aGUgcmFuZ2UgKGUuZy4sIEExOkIyKScsXG5cdFx0XHRcdHBsYWNlaG9sZGVyOiAnQTE6QjInLFxuXHRcdFx0fSxcblx0XHRcdC8vIFNldCBTdHlsZSBvcHRpb25zXG5cdFx0XHR7XG5cdFx0XHRcdGRpc3BsYXlOYW1lOiAnQmFja2dyb3VuZCBDb2xvcicsXG5cdFx0XHRcdG5hbWU6ICdiYWNrZ3JvdW5kQ29sb3InLFxuXHRcdFx0XHR0eXBlOiAnY29sb3InLFxuXHRcdFx0XHRkZWZhdWx0OiAnI2ZmZmZmZicsXG5cdFx0XHRcdGRpc3BsYXlPcHRpb25zOiB7XG5cdFx0XHRcdFx0c2hvdzoge1xuXHRcdFx0XHRcdFx0b3BlcmF0aW9uOiBbJ3NldFN0eWxlJ10sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxscycsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkaXNwbGF5TmFtZTogJ1RleHQgQ29sb3InLFxuXHRcdFx0XHRuYW1lOiAndGV4dENvbG9yJyxcblx0XHRcdFx0dHlwZTogJ2NvbG9yJyxcblx0XHRcdFx0ZGVmYXVsdDogJyMwMDAwMDAnLFxuXHRcdFx0XHRkaXNwbGF5T3B0aW9uczoge1xuXHRcdFx0XHRcdHNob3c6IHtcblx0XHRcdFx0XHRcdG9wZXJhdGlvbjogWydzZXRTdHlsZSddLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAnVGV4dC9mb3JlZ3JvdW5kIGNvbG9yJyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRpc3BsYXlOYW1lOiAnRm9udCBTaXplJyxcblx0XHRcdFx0bmFtZTogJ2ZvbnRTaXplJyxcblx0XHRcdFx0dHlwZTogJ251bWJlcicsXG5cdFx0XHRcdGRlZmF1bHQ6IDEwLFxuXHRcdFx0XHRkaXNwbGF5T3B0aW9uczoge1xuXHRcdFx0XHRcdHNob3c6IHtcblx0XHRcdFx0XHRcdG9wZXJhdGlvbjogWydzZXRTdHlsZSddLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAnRm9udCBzaXplIGluIHBvaW50cycsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkaXNwbGF5TmFtZTogJ0JvbGQnLFxuXHRcdFx0XHRuYW1lOiAnYm9sZCcsXG5cdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0ZGVmYXVsdDogZmFsc2UsXG5cdFx0XHRcdGRpc3BsYXlPcHRpb25zOiB7XG5cdFx0XHRcdFx0c2hvdzoge1xuXHRcdFx0XHRcdFx0b3BlcmF0aW9uOiBbJ3NldFN0eWxlJ10sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG1ha2UgdGV4dCBib2xkJyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRpc3BsYXlOYW1lOiAnSXRhbGljJyxcblx0XHRcdFx0bmFtZTogJ2l0YWxpYycsXG5cdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0ZGVmYXVsdDogZmFsc2UsXG5cdFx0XHRcdGRpc3BsYXlPcHRpb25zOiB7XG5cdFx0XHRcdFx0c2hvdzoge1xuXHRcdFx0XHRcdFx0b3BlcmF0aW9uOiBbJ3NldFN0eWxlJ10sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG1ha2UgdGV4dCBpdGFsaWMnLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdIb3Jpem9udGFsIEFsaWdubWVudCcsXG5cdFx0XHRcdG5hbWU6ICdob3Jpem9udGFsQWxpZ25tZW50Jyxcblx0XHRcdFx0dHlwZTogJ29wdGlvbnMnLFxuXHRcdFx0XHRvcHRpb25zOiBbXG5cdFx0XHRcdFx0eyBuYW1lOiAnTGVmdCcsIHZhbHVlOiAnTEVGVCcgfSxcblx0XHRcdFx0XHR7IG5hbWU6ICdDZW50ZXInLCB2YWx1ZTogJ0NFTlRFUicgfSxcblx0XHRcdFx0XHR7IG5hbWU6ICdSaWdodCcsIHZhbHVlOiAnUklHSFQnIH0sXG5cdFx0XHRcdF0sXG5cdFx0XHRcdGRlZmF1bHQ6ICdMRUZUJyxcblx0XHRcdFx0ZGlzcGxheU9wdGlvbnM6IHtcblx0XHRcdFx0XHRzaG93OiB7XG5cdFx0XHRcdFx0XHRvcGVyYXRpb246IFsnc2V0U3R5bGUnXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogJ0hvcml6b250YWwgdGV4dCBhbGlnbm1lbnQnLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdGaWVsZHMgdG8gVXBkYXRlJyxcblx0XHRcdFx0bmFtZTogJ2ZpZWxkc1RvVXBkYXRlJyxcblx0XHRcdFx0dHlwZTogJ211bHRpT3B0aW9ucycsXG5cdFx0XHRcdG9wdGlvbnM6IFtcblx0XHRcdFx0XHR7IG5hbWU6ICdCYWNrZ3JvdW5kIENvbG9yJywgdmFsdWU6ICdiYWNrZ3JvdW5kQ29sb3InIH0sXG5cdFx0XHRcdFx0eyBuYW1lOiAnVGV4dCBDb2xvcicsIHZhbHVlOiAndGV4dENvbG9yJyB9LFxuXHRcdFx0XHRcdHsgbmFtZTogJ0ZvbnQgU2l6ZScsIHZhbHVlOiAnZm9udFNpemUnIH0sXG5cdFx0XHRcdFx0eyBuYW1lOiAnQm9sZCcsIHZhbHVlOiAnYm9sZCcgfSxcblx0XHRcdFx0XHR7IG5hbWU6ICdJdGFsaWMnLCB2YWx1ZTogJ2l0YWxpYycgfSxcblx0XHRcdFx0XHR7IG5hbWU6ICdIb3Jpem9udGFsIEFsaWdubWVudCcsIHZhbHVlOiAnaG9yaXpvbnRhbEFsaWdubWVudCcgfSxcblx0XHRcdFx0XSxcblx0XHRcdFx0ZGVmYXVsdDogWydiYWNrZ3JvdW5kQ29sb3InXSxcblx0XHRcdFx0ZGlzcGxheU9wdGlvbnM6IHtcblx0XHRcdFx0XHRzaG93OiB7XG5cdFx0XHRcdFx0XHRvcGVyYXRpb246IFsnc2V0U3R5bGUnXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogJ1doaWNoIHN0eWxlIGZpZWxkcyB0byB1cGRhdGUnLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9O1xuXG5cdGFzeW5jIGV4ZWN1dGUodGhpczogSUV4ZWN1dGVGdW5jdGlvbnMpOiBQcm9taXNlPElOb2RlRXhlY3V0aW9uRGF0YVtdW10+IHtcblx0XHRjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SW5wdXREYXRhKCk7XG5cdFx0Y29uc3QgcmV0dXJuRGF0YTogSU5vZGVFeGVjdXRpb25EYXRhW10gPSBbXTtcblx0XHRjb25zdCBvcGVyYXRpb24gPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ29wZXJhdGlvbicsIDApIGFzIHN0cmluZztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHNwcmVhZHNoZWV0SWQgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ3NwcmVhZHNoZWV0SWQnLCBpKSBhcyBzdHJpbmc7XG5cdFx0XHRcdGNvbnN0IHNoZWV0SWQgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ3NoZWV0SWQnLCBpKSBhcyBudW1iZXI7XG5cdFx0XHRcdGNvbnN0IHJhbmdlID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdyYW5nZScsIGkpIGFzIHN0cmluZztcblxuXHRcdFx0XHRpZiAob3BlcmF0aW9uID09PSAnZ2V0U3R5bGUnKSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3R5bGUuY2FsbCh0aGlzLCBzcHJlYWRzaGVldElkLCBzaGVldElkLCByYW5nZSk7XG5cdFx0XHRcdFx0cmV0dXJuRGF0YS5wdXNoKHsganNvbjogcmVzdWx0IH0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJ3NldFN0eWxlJykge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNldFN0eWxlLmNhbGwodGhpcywgc3ByZWFkc2hlZXRJZCwgc2hlZXRJZCwgcmFuZ2UsIGkpO1xuXHRcdFx0XHRcdHJldHVybkRhdGEucHVzaCh7IGpzb246IHJlc3VsdCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0aWYgKHRoaXMuY29udGludWVPbkZhaWwoKSkge1xuXHRcdFx0XHRcdHJldHVybkRhdGEucHVzaCh7IGpzb246IHsgZXJyb3I6IChlcnJvciBhcyBFcnJvcikubWVzc2FnZSB9IH0pO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBbcmV0dXJuRGF0YV07XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U3R5bGUoXG5cdHRoaXM6IElFeGVjdXRlRnVuY3Rpb25zLFxuXHRzcHJlYWRzaGVldElkOiBzdHJpbmcsXG5cdHNoZWV0SWQ6IG51bWJlcixcblx0cmFuZ2U6IHN0cmluZyxcbik6IFByb21pc2U8SURhdGFPYmplY3Q+IHtcblx0Y29uc3QgeyBzdGFydFJvdywgZW5kUm93LCBzdGFydENvbCwgZW5kQ29sIH0gPSBwYXJzZVJhbmdlKHJhbmdlKTtcblxuXHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaGVscGVycy5yZXF1ZXN0T0F1dGgyLmNhbGwoXG5cdFx0dGhpcyxcblx0XHQnZ29vZ2xlU2hlZXRzT0F1dGgyQXBpJyxcblx0XHR7XG5cdFx0XHRtZXRob2Q6ICdHRVQnLFxuXHRcdFx0dXJpOiBgaHR0cHM6Ly9zaGVldHMuZ29vZ2xlYXBpcy5jb20vdjQvc3ByZWFkc2hlZXRzLyR7c3ByZWFkc2hlZXRJZH1gLFxuXHRcdFx0cXM6IHtcblx0XHRcdFx0cmFuZ2VzOiByYW5nZSxcblx0XHRcdFx0ZmllbGRzOiAnc2hlZXRzLmRhdGEucm93RGF0YS52YWx1ZXMuZWZmZWN0aXZlRm9ybWF0LHNoZWV0cy5wcm9wZXJ0aWVzJyxcblx0XHRcdH0sXG5cdFx0XHRqc29uOiB0cnVlLFxuXHRcdH0sXG5cdCk7XG5cblx0Y29uc3Qgc2hlZXRzID0gKHJlc3BvbnNlIGFzIElEYXRhT2JqZWN0KS5zaGVldHMgYXMgSURhdGFPYmplY3RbXTtcblx0aWYgKCFzaGVldHMgfHwgc2hlZXRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB7IGVycm9yOiAnTm8gc2hlZXQgZGF0YSBmb3VuZCcgfTtcblx0fVxuXG5cdGNvbnN0IHNoZWV0RGF0YSA9IHNoZWV0c1swXSBhcyBJRGF0YU9iamVjdDtcblx0Y29uc3QgZGF0YSA9IChzaGVldERhdGEuZGF0YSBhcyBJRGF0YU9iamVjdFtdKSB8fCBbXTtcblx0aWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHsgZXJyb3I6ICdObyBkYXRhIGluIHJhbmdlJyB9O1xuXHR9XG5cblx0Y29uc3Qgcm93RGF0YSA9IChkYXRhWzBdIGFzIElEYXRhT2JqZWN0KS5yb3dEYXRhIGFzIElEYXRhT2JqZWN0W10gfHwgW107XG5cdGNvbnN0IHN0eWxlczogSURhdGFPYmplY3RbXSA9IFtdO1xuXG5cdHJvd0RhdGEuZm9yRWFjaCgocm93LCByb3dJbmRleCkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlcyA9IChyb3cudmFsdWVzIGFzIElEYXRhT2JqZWN0W10pIHx8IFtdO1xuXHRcdHZhbHVlcy5mb3JFYWNoKChjZWxsLCBjb2xJbmRleCkgPT4ge1xuXHRcdFx0Y29uc3QgZm9ybWF0ID0gY2VsbC5lZmZlY3RpdmVGb3JtYXQgYXMgQ2VsbEZvcm1hdCB8fCB7fTtcblx0XHRcdHN0eWxlcy5wdXNoKHtcblx0XHRcdFx0cm93OiBzdGFydFJvdyArIHJvd0luZGV4LFxuXHRcdFx0XHRjb2w6IHN0YXJ0Q29sICsgY29sSW5kZXgsXG5cdFx0XHRcdGNlbGw6IGNvbFRvTGV0dGVyKHN0YXJ0Q29sICsgY29sSW5kZXgpICsgKHN0YXJ0Um93ICsgcm93SW5kZXgpLFxuXHRcdFx0XHRmb3JtYXQ6IGV4dHJhY3RGb3JtYXQoZm9ybWF0KSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRyZXR1cm4ge1xuXHRcdHNwcmVhZHNoZWV0SWQsXG5cdFx0c2hlZXRJZCxcblx0XHRyYW5nZSxcblx0XHRzdHlsZXMsXG5cdH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldFN0eWxlKFxuXHR0aGlzOiBJRXhlY3V0ZUZ1bmN0aW9ucyxcblx0c3ByZWFkc2hlZXRJZDogc3RyaW5nLFxuXHRzaGVldElkOiBudW1iZXIsXG5cdHJhbmdlOiBzdHJpbmcsXG5cdGl0ZW1JbmRleDogbnVtYmVyLFxuKTogUHJvbWlzZTxJRGF0YU9iamVjdD4ge1xuXHRjb25zdCB7IHN0YXJ0Um93LCBlbmRSb3csIHN0YXJ0Q29sLCBlbmRDb2wgfSA9IHBhcnNlUmFuZ2UocmFuZ2UpO1xuXHRjb25zdCBmaWVsZHNUb1VwZGF0ZSA9IHRoaXMuZ2V0Tm9kZVBhcmFtZXRlcignZmllbGRzVG9VcGRhdGUnLCBpdGVtSW5kZXgpIGFzIHN0cmluZ1tdO1xuXG5cdGNvbnN0IGNlbGxGb3JtYXQ6IElEYXRhT2JqZWN0ID0ge307XG5cdGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuXHRpZiAoZmllbGRzVG9VcGRhdGUuaW5jbHVkZXMoJ2JhY2tncm91bmRDb2xvcicpKSB7XG5cdFx0Y29uc3QgYmdDb2xvciA9IHRoaXMuZ2V0Tm9kZVBhcmFtZXRlcignYmFja2dyb3VuZENvbG9yJywgaXRlbUluZGV4KSBhcyBzdHJpbmc7XG5cdFx0Y2VsbEZvcm1hdC5iYWNrZ3JvdW5kQ29sb3IgPSBoZXhUb1JnYihiZ0NvbG9yKTtcblx0XHRmaWVsZHMucHVzaCgndXNlckVudGVyZWRGb3JtYXQuYmFja2dyb3VuZENvbG9yJyk7XG5cdH1cblxuXHRpZiAoZmllbGRzVG9VcGRhdGUuaW5jbHVkZXMoJ3RleHRDb2xvcicpKSB7XG5cdFx0Y29uc3QgdGV4dENvbG9yID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCd0ZXh0Q29sb3InLCBpdGVtSW5kZXgpIGFzIHN0cmluZztcblx0XHRpZiAoIWNlbGxGb3JtYXQudGV4dEZvcm1hdCkgY2VsbEZvcm1hdC50ZXh0Rm9ybWF0ID0ge307XG5cdFx0KGNlbGxGb3JtYXQudGV4dEZvcm1hdCBhcyBJRGF0YU9iamVjdCkuZm9yZWdyb3VuZENvbG9yID0gaGV4VG9SZ2IodGV4dENvbG9yKTtcblx0XHRmaWVsZHMucHVzaCgndXNlckVudGVyZWRGb3JtYXQudGV4dEZvcm1hdC5mb3JlZ3JvdW5kQ29sb3InKTtcblx0fVxuXG5cdGlmIChmaWVsZHNUb1VwZGF0ZS5pbmNsdWRlcygnZm9udFNpemUnKSkge1xuXHRcdGNvbnN0IGZvbnRTaXplID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdmb250U2l6ZScsIGl0ZW1JbmRleCkgYXMgbnVtYmVyO1xuXHRcdGlmICghY2VsbEZvcm1hdC50ZXh0Rm9ybWF0KSBjZWxsRm9ybWF0LnRleHRGb3JtYXQgPSB7fTtcblx0XHQoY2VsbEZvcm1hdC50ZXh0Rm9ybWF0IGFzIElEYXRhT2JqZWN0KS5mb250U2l6ZSA9IGZvbnRTaXplO1xuXHRcdGZpZWxkcy5wdXNoKCd1c2VyRW50ZXJlZEZvcm1hdC50ZXh0Rm9ybWF0LmZvbnRTaXplJyk7XG5cdH1cblxuXHRpZiAoZmllbGRzVG9VcGRhdGUuaW5jbHVkZXMoJ2JvbGQnKSkge1xuXHRcdGNvbnN0IGJvbGQgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2JvbGQnLCBpdGVtSW5kZXgpIGFzIGJvb2xlYW47XG5cdFx0aWYgKCFjZWxsRm9ybWF0LnRleHRGb3JtYXQpIGNlbGxGb3JtYXQudGV4dEZvcm1hdCA9IHt9O1xuXHRcdChjZWxsRm9ybWF0LnRleHRGb3JtYXQgYXMgSURhdGFPYmplY3QpLmJvbGQgPSBib2xkO1xuXHRcdGZpZWxkcy5wdXNoKCd1c2VyRW50ZXJlZEZvcm1hdC50ZXh0Rm9ybWF0LmJvbGQnKTtcblx0fVxuXG5cdGlmIChmaWVsZHNUb1VwZGF0ZS5pbmNsdWRlcygnaXRhbGljJykpIHtcblx0XHRjb25zdCBpdGFsaWMgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2l0YWxpYycsIGl0ZW1JbmRleCkgYXMgYm9vbGVhbjtcblx0XHRpZiAoIWNlbGxGb3JtYXQudGV4dEZvcm1hdCkgY2VsbEZvcm1hdC50ZXh0Rm9ybWF0ID0ge307XG5cdFx0KGNlbGxGb3JtYXQudGV4dEZvcm1hdCBhcyBJRGF0YU9iamVjdCkuaXRhbGljID0gaXRhbGljO1xuXHRcdGZpZWxkcy5wdXNoKCd1c2VyRW50ZXJlZEZvcm1hdC50ZXh0Rm9ybWF0Lml0YWxpYycpO1xuXHR9XG5cblx0aWYgKGZpZWxkc1RvVXBkYXRlLmluY2x1ZGVzKCdob3Jpem9udGFsQWxpZ25tZW50JykpIHtcblx0XHRjb25zdCBhbGlnbm1lbnQgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2hvcml6b250YWxBbGlnbm1lbnQnLCBpdGVtSW5kZXgpIGFzIHN0cmluZztcblx0XHRjZWxsRm9ybWF0Lmhvcml6b250YWxBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG5cdFx0ZmllbGRzLnB1c2goJ3VzZXJFbnRlcmVkRm9ybWF0Lmhvcml6b250YWxBbGlnbm1lbnQnKTtcblx0fVxuXG5cdGNvbnN0IHJlcXVlc3QgPSB7XG5cdFx0cmVxdWVzdHM6IFtcblx0XHRcdHtcblx0XHRcdFx0cmVwZWF0Q2VsbDoge1xuXHRcdFx0XHRcdHJhbmdlOiB7XG5cdFx0XHRcdFx0XHRzaGVldElkLFxuXHRcdFx0XHRcdFx0c3RhcnRSb3dJbmRleDogc3RhcnRSb3cgLSAxLFxuXHRcdFx0XHRcdFx0ZW5kUm93SW5kZXg6IGVuZFJvdyxcblx0XHRcdFx0XHRcdHN0YXJ0Q29sdW1uSW5kZXg6IHN0YXJ0Q29sIC0gMSxcblx0XHRcdFx0XHRcdGVuZENvbHVtbkluZGV4OiBlbmRDb2wsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRjZWxsOiB7XG5cdFx0XHRcdFx0XHR1c2VyRW50ZXJlZEZvcm1hdDogY2VsbEZvcm1hdCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGZpZWxkczogZmllbGRzLmpvaW4oJywnKSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XSxcblx0fTtcblxuXHRhd2FpdCB0aGlzLmhlbHBlcnMucmVxdWVzdE9BdXRoMi5jYWxsKFxuXHRcdHRoaXMsXG5cdFx0J2dvb2dsZVNoZWV0c09BdXRoMkFwaScsXG5cdFx0e1xuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHR1cmk6IGBodHRwczovL3NoZWV0cy5nb29nbGVhcGlzLmNvbS92NC9zcHJlYWRzaGVldHMvJHtzcHJlYWRzaGVldElkfTpiYXRjaFVwZGF0ZWAsXG5cdFx0XHRib2R5OiByZXF1ZXN0LFxuXHRcdFx0anNvbjogdHJ1ZSxcblx0XHR9LFxuXHQpO1xuXG5cdHJldHVybiB7XG5cdFx0c3VjY2VzczogdHJ1ZSxcblx0XHRzcHJlYWRzaGVldElkLFxuXHRcdHNoZWV0SWQsXG5cdFx0cmFuZ2UsXG5cdFx0YXBwbGllZEZvcm1hdDogY2VsbEZvcm1hdCxcblx0fTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60"><g fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"><path fill="#28B446" d="M35.69 1 52 17.225v39.087a3.67 3.67 0 0 1-1.084 2.61A3.7 3.7 0 0 1 48.293 60H12.707a3.7 3.7 0 0 1-2.623-1.078A3.67 3.67 0 0 1 9 56.312V4.688a3.67 3.67 0 0 1 1.084-2.61A3.7 3.7 0 0 1 12.707 1z"/><path fill="#6ACE7C" d="M35.69 1 52 17.225H39.397c-2.054 0-3.707-1.829-3.707-3.872z"/><path fill="#219B38" d="M39.211 17.225 52 22.48v-5.255z"/><path fill="#FFF" d="M20.12 31.975c0-.817.662-1.475 1.483-1.475h17.794c.821 0 1.482.658 1.482 1.475v15.487c0 .818-.661 1.475-1.482 1.475H21.603a1.476 1.476 0 0 1-1.482-1.474V31.974zm2.225 1.475h6.672v2.212h-6.672zm0 5.162h6.672v2.213h-6.672zm0 5.163h6.672v2.212h-6.672zm9.638-10.325h6.672v2.212h-6.672zm0 5.162h6.672v2.213h-6.672zm0 5.163h6.672v2.212h-6.672z"/><path fill="#28B446" d="M34.69 0 51 16.225v39.087a3.67 3.67 0 0 1-1.084 2.61A3.7 3.7 0 0 1 47.293 59H11.707a3.7 3.7 0 0 1-2.623-1.078A3.67 3.67 0 0 1 8 55.312V3.688a3.67 3.67 0 0 1 1.084-2.61A3.7 3.7 0 0 1 11.707 0z"/><path fill="#6ACE7C" d="M34.69 0 51 16.225H38.397c-2.054 0-3.707-1.829-3.707-3.872z"/><path fill="#219B38" d="M38.211 16.225 51 21.48v-5.255z"/><path fill="#FFF" d="M19.12 30.975c0-.817.662-1.475 1.483-1.475h17.794c.821 0 1.482.658 1.482 1.475v15.487c0 .818-.661 1.475-1.482 1.475H20.603a1.476 1.476 0 0 1-1.482-1.474V30.974zm2.225 1.475h6.672v2.212h-6.672zm0 5.162h6.672v2.213h-6.672zm0 5.163h6.672v2.212h-6.672zm9.638-10.325h6.672v2.212h-6.672zm0 5.162h6.672v2.213h-6.672zm0 5.163h6.672v2.212h-6.672z"/></g></svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-ca-google-sheets-style",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "n8n node for Google Sheets cell styling (read/write formatting)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"n8n-community-node-package",
|
|
7
|
+
"google-sheets",
|
|
8
|
+
"formatting",
|
|
9
|
+
"style"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"author": {
|
|
13
|
+
"name": "junwoobang"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/mineclover/n8n-nodes-custom.git",
|
|
18
|
+
"directory": "packages/google-sheets-style"
|
|
19
|
+
},
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=18.0.0"
|
|
22
|
+
},
|
|
23
|
+
"main": "dist/index.js",
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc && cp -r src/nodes/**/*.svg dist/nodes/ 2>/dev/null || true",
|
|
26
|
+
"dev": "tsc --watch",
|
|
27
|
+
"lint": "eslint . --ext .ts",
|
|
28
|
+
"prepublishOnly": "npm run build"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"n8n": {
|
|
34
|
+
"n8nNodesApiVersion": 1,
|
|
35
|
+
"credentials": [],
|
|
36
|
+
"nodes": [
|
|
37
|
+
"dist/nodes/GoogleSheetsStyle/GoogleSheetsStyle.node.js"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^20.0.0",
|
|
42
|
+
"typescript": "^5.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"n8n-workflow": "*"
|
|
46
|
+
}
|
|
47
|
+
}
|