n8n-nodes-datatable-variables 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.
- package/LICENSE.md +19 -0
- package/README.md +123 -0
- package/dist/credentials/GithubIssuesApi.credentials.d.ts +10 -0
- package/dist/credentials/GithubIssuesApi.credentials.js +37 -0
- package/dist/credentials/GithubIssuesApi.credentials.js.map +1 -0
- package/dist/credentials/GithubIssuesOAuth2Api.credentials.d.ts +9 -0
- package/dist/credentials/GithubIssuesOAuth2Api.credentials.js +54 -0
- package/dist/credentials/GithubIssuesOAuth2Api.credentials.js.map +1 -0
- package/dist/dist/icons/datatable-import-export.svg +5 -0
- package/dist/dist/icons/datatable-trigger.svg +5 -0
- package/dist/dist/icons/datatable.svg +4 -0
- package/dist/icons/datatable-import-export.svg +5 -0
- package/dist/icons/datatable-trigger.svg +5 -0
- package/dist/icons/datatable.svg +4 -0
- package/dist/nodes/DatatableVariables/DatatableVariables.node.d.ts +10 -0
- package/dist/nodes/DatatableVariables/DatatableVariables.node.js +476 -0
- package/dist/nodes/DatatableVariables/DatatableVariables.node.js.map +1 -0
- package/dist/nodes/DatatableVariables/DatatableVariablesImportExport.node.d.ts +10 -0
- package/dist/nodes/DatatableVariables/DatatableVariablesImportExport.node.js +296 -0
- package/dist/nodes/DatatableVariables/DatatableVariablesImportExport.node.js.map +1 -0
- package/dist/nodes/DatatableVariables/DatatableVariablesTrigger.node.d.ts +10 -0
- package/dist/nodes/DatatableVariables/DatatableVariablesTrigger.node.js +145 -0
- package/dist/nodes/DatatableVariables/DatatableVariablesTrigger.node.js.map +1 -0
- package/dist/nodes/DatatableVariables/db.d.ts +46 -0
- package/dist/nodes/DatatableVariables/db.js +296 -0
- package/dist/nodes/DatatableVariables/db.js.map +1 -0
- package/dist/package.json +51 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatatableVariablesImportExport = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const db_1 = require("./db");
|
|
6
|
+
const db = new db_1.DbManager();
|
|
7
|
+
class DatatableVariablesImportExport {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.description = {
|
|
10
|
+
displayName: 'Datatable Variables Import/Export',
|
|
11
|
+
name: 'datatableVariablesImportExport',
|
|
12
|
+
icon: 'file:../../icons/datatable-import-export.svg',
|
|
13
|
+
group: ['transform'],
|
|
14
|
+
version: 1,
|
|
15
|
+
subtitle: '={{$parameter["operation"]}}',
|
|
16
|
+
usableAsTool: true,
|
|
17
|
+
description: 'Import or export local datatables and variables',
|
|
18
|
+
defaults: {
|
|
19
|
+
name: 'Datatable Variables Import/Export',
|
|
20
|
+
},
|
|
21
|
+
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
22
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
23
|
+
properties: [
|
|
24
|
+
{
|
|
25
|
+
displayName: 'Operation',
|
|
26
|
+
name: 'operation',
|
|
27
|
+
type: 'options',
|
|
28
|
+
noDataExpression: true,
|
|
29
|
+
options: [
|
|
30
|
+
{
|
|
31
|
+
name: 'Export',
|
|
32
|
+
value: 'export',
|
|
33
|
+
description: 'Export tables to a file or JSON output',
|
|
34
|
+
action: 'Export tables',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Import',
|
|
38
|
+
value: 'import',
|
|
39
|
+
description: 'Import tables from a file or JSON input',
|
|
40
|
+
action: 'Import tables',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
default: 'export',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
displayName: 'Export Mode',
|
|
47
|
+
name: 'exportMode',
|
|
48
|
+
type: 'options',
|
|
49
|
+
displayOptions: {
|
|
50
|
+
show: {
|
|
51
|
+
operation: ['export'],
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
options: [
|
|
55
|
+
{
|
|
56
|
+
name: 'All Tables',
|
|
57
|
+
value: 'all',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'Specific Table',
|
|
61
|
+
value: 'specific',
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
default: 'all',
|
|
65
|
+
description: 'Whether to export all tables or just one',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
displayName: 'Table Name',
|
|
69
|
+
name: 'tableName',
|
|
70
|
+
type: 'options',
|
|
71
|
+
typeOptions: {
|
|
72
|
+
loadOptionsMethod: 'getTables',
|
|
73
|
+
},
|
|
74
|
+
default: '',
|
|
75
|
+
required: true,
|
|
76
|
+
displayOptions: {
|
|
77
|
+
show: {
|
|
78
|
+
operation: ['export'],
|
|
79
|
+
exportMode: ['specific'],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
description: 'The name of the table to export',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
displayName: 'Output Format',
|
|
86
|
+
name: 'outputFormat',
|
|
87
|
+
type: 'options',
|
|
88
|
+
displayOptions: {
|
|
89
|
+
show: {
|
|
90
|
+
operation: ['export'],
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
options: [
|
|
94
|
+
{
|
|
95
|
+
name: 'JSON File (Binary)',
|
|
96
|
+
value: 'file',
|
|
97
|
+
description: 'Create a binary JSON file for download or sharing',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'JSON Output',
|
|
101
|
+
value: 'json',
|
|
102
|
+
description: 'Return raw JSON data as node output',
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
default: 'file',
|
|
106
|
+
description: 'Format of the exported data',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
displayName: 'Import Mode',
|
|
110
|
+
name: 'importMode',
|
|
111
|
+
type: 'options',
|
|
112
|
+
displayOptions: {
|
|
113
|
+
show: {
|
|
114
|
+
operation: ['import'],
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
options: [
|
|
118
|
+
{
|
|
119
|
+
name: 'Merge (Keep Existing, Add/Overwrite New)',
|
|
120
|
+
value: 'merge',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'Replace (Delete All Existing, Write New)',
|
|
124
|
+
value: 'replace',
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
default: 'merge',
|
|
128
|
+
description: 'How to handle existing data in your local datatables',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
displayName: 'Source Type',
|
|
132
|
+
name: 'sourceType',
|
|
133
|
+
type: 'options',
|
|
134
|
+
displayOptions: {
|
|
135
|
+
show: {
|
|
136
|
+
operation: ['import'],
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
options: [
|
|
140
|
+
{
|
|
141
|
+
name: 'JSON File (Binary)',
|
|
142
|
+
value: 'file',
|
|
143
|
+
description: 'Read from an uploaded binary JSON file',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'JSON Input String',
|
|
147
|
+
value: 'json',
|
|
148
|
+
description: 'Read from a raw JSON string input',
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
default: 'file',
|
|
152
|
+
description: 'Source of the data to import',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
displayName: 'Input Binary Property Name',
|
|
156
|
+
name: 'binaryPropertyName',
|
|
157
|
+
type: 'string',
|
|
158
|
+
default: 'data',
|
|
159
|
+
required: true,
|
|
160
|
+
displayOptions: {
|
|
161
|
+
show: {
|
|
162
|
+
operation: ['import'],
|
|
163
|
+
sourceType: ['file'],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
description: 'Name of the binary property on the input item containing the file to import',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
displayName: 'JSON Input String',
|
|
170
|
+
name: 'jsonInput',
|
|
171
|
+
type: 'string',
|
|
172
|
+
default: '{}',
|
|
173
|
+
required: true,
|
|
174
|
+
displayOptions: {
|
|
175
|
+
show: {
|
|
176
|
+
operation: ['import'],
|
|
177
|
+
sourceType: ['json'],
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
description: 'Raw JSON string to import (must represent tables data structure)',
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
};
|
|
184
|
+
this.methods = {
|
|
185
|
+
loadOptions: {
|
|
186
|
+
async getTables() {
|
|
187
|
+
const tableNames = await db.getTables();
|
|
188
|
+
return tableNames.map(name => ({
|
|
189
|
+
name,
|
|
190
|
+
value: name,
|
|
191
|
+
}));
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
async execute() {
|
|
197
|
+
var _a;
|
|
198
|
+
const items = this.getInputData();
|
|
199
|
+
const returnData = [];
|
|
200
|
+
const operation = this.getNodeParameter('operation', 0);
|
|
201
|
+
for (let i = 0; i < items.length; i++) {
|
|
202
|
+
try {
|
|
203
|
+
if (operation === 'export') {
|
|
204
|
+
const exportMode = this.getNodeParameter('exportMode', i);
|
|
205
|
+
const outputFormat = this.getNodeParameter('outputFormat', i);
|
|
206
|
+
let tableName;
|
|
207
|
+
if (exportMode === 'specific') {
|
|
208
|
+
tableName = this.getNodeParameter('tableName', i);
|
|
209
|
+
}
|
|
210
|
+
const data = await db.exportData(tableName);
|
|
211
|
+
if (!data) {
|
|
212
|
+
throw new Error(`Export data failed. ${tableName ? `Table "${tableName}" not found.` : 'Database is empty.'}`);
|
|
213
|
+
}
|
|
214
|
+
if (outputFormat === 'json') {
|
|
215
|
+
returnData.push({
|
|
216
|
+
json: {
|
|
217
|
+
success: true,
|
|
218
|
+
exportedAt: new Date().toISOString(),
|
|
219
|
+
data,
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const filename = tableName ? `datatable_${tableName}_export.json` : 'datatables_all_export.json';
|
|
225
|
+
const buffer = Buffer.from(JSON.stringify(data, null, 2), 'utf8');
|
|
226
|
+
const binaryData = await this.helpers.prepareBinaryData(buffer, filename, 'application/json');
|
|
227
|
+
returnData.push({
|
|
228
|
+
json: {
|
|
229
|
+
success: true,
|
|
230
|
+
exportedAt: new Date().toISOString(),
|
|
231
|
+
filename,
|
|
232
|
+
byteSize: buffer.length,
|
|
233
|
+
},
|
|
234
|
+
binary: {
|
|
235
|
+
data: binaryData,
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (operation === 'import') {
|
|
241
|
+
const importMode = this.getNodeParameter('importMode', i);
|
|
242
|
+
const sourceType = this.getNodeParameter('sourceType', i);
|
|
243
|
+
let parsedData;
|
|
244
|
+
if (sourceType === 'json') {
|
|
245
|
+
const jsonStr = this.getNodeParameter('jsonInput', i);
|
|
246
|
+
try {
|
|
247
|
+
parsedData = JSON.parse(jsonStr);
|
|
248
|
+
}
|
|
249
|
+
catch (e) {
|
|
250
|
+
throw new Error(`Failed to parse JSON string: ${e.message}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
const binaryProp = this.getNodeParameter('binaryPropertyName', i);
|
|
255
|
+
const binaryItem = (_a = items[i].binary) === null || _a === void 0 ? void 0 : _a[binaryProp];
|
|
256
|
+
if (!binaryItem) {
|
|
257
|
+
throw new Error(`Binary property "${binaryProp}" not found on input item ${i}.`);
|
|
258
|
+
}
|
|
259
|
+
const buffer = await this.helpers.getBinaryDataBuffer(i, binaryProp);
|
|
260
|
+
try {
|
|
261
|
+
parsedData = JSON.parse(buffer.toString('utf8'));
|
|
262
|
+
}
|
|
263
|
+
catch (e) {
|
|
264
|
+
throw new Error(`Failed to parse uploaded JSON file: ${e.message}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
await db.importData(parsedData, importMode);
|
|
268
|
+
returnData.push({
|
|
269
|
+
json: {
|
|
270
|
+
success: true,
|
|
271
|
+
importMode,
|
|
272
|
+
importedAt: new Date().toISOString(),
|
|
273
|
+
tablesCount: Object.keys(parsedData || {}).length,
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
const err = error;
|
|
280
|
+
if (this.continueOnFail()) {
|
|
281
|
+
returnData.push({
|
|
282
|
+
json: {
|
|
283
|
+
error: err.message,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
throw err;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return [returnData];
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
exports.DatatableVariablesImportExport = DatatableVariablesImportExport;
|
|
296
|
+
//# sourceMappingURL=DatatableVariablesImportExport.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatatableVariablesImportExport.node.js","sourceRoot":"","sources":["../../../nodes/DatatableVariables/DatatableVariablesImportExport.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { INodeType, INodeTypeDescription, IPollFunctions, INodeExecutionData, ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
|
|
2
|
+
export declare class DatatableVariablesTrigger implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
methods: {
|
|
5
|
+
loadOptions: {
|
|
6
|
+
getTables(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
poll(this: IPollFunctions): Promise<INodeExecutionData[][] | null>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatatableVariablesTrigger = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const db_1 = require("./db");
|
|
6
|
+
const db = new db_1.DbManager();
|
|
7
|
+
class DatatableVariablesTrigger {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.description = {
|
|
10
|
+
displayName: 'Datatable Variables Trigger',
|
|
11
|
+
name: 'datatableVariablesTrigger',
|
|
12
|
+
icon: 'file:../../icons/datatable-trigger.svg',
|
|
13
|
+
group: ['trigger'],
|
|
14
|
+
version: 1,
|
|
15
|
+
subtitle: '={{$parameter["tableName"]}}',
|
|
16
|
+
usableAsTool: true,
|
|
17
|
+
description: 'Triggers when a variable in a local datatable changes',
|
|
18
|
+
defaults: {
|
|
19
|
+
name: 'Datatable Variables Trigger',
|
|
20
|
+
},
|
|
21
|
+
inputs: [],
|
|
22
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
23
|
+
polling: true,
|
|
24
|
+
properties: [
|
|
25
|
+
{
|
|
26
|
+
displayName: 'Table Name',
|
|
27
|
+
name: 'tableName',
|
|
28
|
+
type: 'options',
|
|
29
|
+
typeOptions: {
|
|
30
|
+
loadOptionsMethod: 'getTables',
|
|
31
|
+
},
|
|
32
|
+
default: '',
|
|
33
|
+
required: true,
|
|
34
|
+
description: 'The name of the table to watch for changes',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
displayName: 'Trigger On',
|
|
38
|
+
name: 'triggerOn',
|
|
39
|
+
type: 'options',
|
|
40
|
+
options: [
|
|
41
|
+
{
|
|
42
|
+
name: 'All Changes in the Table',
|
|
43
|
+
value: 'all',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'Specific Variable',
|
|
47
|
+
value: 'specific',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'Multiple Variables',
|
|
51
|
+
value: 'multiple',
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
default: 'all',
|
|
55
|
+
description: 'Choose when to trigger the workflow',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
displayName: 'Variable Key',
|
|
59
|
+
name: 'variableKey',
|
|
60
|
+
type: 'string',
|
|
61
|
+
default: '',
|
|
62
|
+
required: true,
|
|
63
|
+
displayOptions: {
|
|
64
|
+
show: {
|
|
65
|
+
triggerOn: ['specific'],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
description: 'The specific variable key to watch',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
displayName: 'Variable Keys',
|
|
72
|
+
name: 'variableKeys',
|
|
73
|
+
type: 'string',
|
|
74
|
+
typeOptions: {
|
|
75
|
+
multipleValues: true,
|
|
76
|
+
},
|
|
77
|
+
default: [],
|
|
78
|
+
required: true,
|
|
79
|
+
displayOptions: {
|
|
80
|
+
show: {
|
|
81
|
+
triggerOn: ['multiple'],
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
description: 'The specific variable keys to watch',
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
this.methods = {
|
|
89
|
+
loadOptions: {
|
|
90
|
+
async getTables() {
|
|
91
|
+
const tableNames = await db.getTables();
|
|
92
|
+
return tableNames.map(name => ({
|
|
93
|
+
name,
|
|
94
|
+
value: name,
|
|
95
|
+
}));
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async poll() {
|
|
101
|
+
const tableName = this.getNodeParameter('tableName');
|
|
102
|
+
const triggerOn = this.getNodeParameter('triggerOn');
|
|
103
|
+
const staticData = this.getWorkflowStaticData('node');
|
|
104
|
+
const lastProcessedId = staticData.lastProcessedChangeId;
|
|
105
|
+
const latestChangeId = await db.getLatestChangeId();
|
|
106
|
+
if (lastProcessedId === undefined) {
|
|
107
|
+
staticData.lastProcessedChangeId = latestChangeId;
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if (latestChangeId <= lastProcessedId) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const changes = await db.getChanges(lastProcessedId);
|
|
114
|
+
if (changes.length === 0) {
|
|
115
|
+
staticData.lastProcessedChangeId = latestChangeId;
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const filteredChanges = [];
|
|
119
|
+
let targetKeys = [];
|
|
120
|
+
if (triggerOn === 'specific') {
|
|
121
|
+
targetKeys = [this.getNodeParameter('variableKey')];
|
|
122
|
+
}
|
|
123
|
+
else if (triggerOn === 'multiple') {
|
|
124
|
+
targetKeys = this.getNodeParameter('variableKeys');
|
|
125
|
+
}
|
|
126
|
+
for (const change of changes) {
|
|
127
|
+
if (change.tableName !== tableName && change.tableName !== '*') {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (triggerOn !== 'all') {
|
|
131
|
+
if (change.key !== '*' && !targetKeys.includes(change.key)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
filteredChanges.push(change);
|
|
136
|
+
}
|
|
137
|
+
staticData.lastProcessedChangeId = latestChangeId;
|
|
138
|
+
if (filteredChanges.length === 0) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return [this.helpers.returnJsonArray(filteredChanges)];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.DatatableVariablesTrigger = DatatableVariablesTrigger;
|
|
145
|
+
//# sourceMappingURL=DatatableVariablesTrigger.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatatableVariablesTrigger.node.js","sourceRoot":"","sources":["../../../nodes/DatatableVariables/DatatableVariablesTrigger.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface VariableData {
|
|
2
|
+
value: any;
|
|
3
|
+
type: 'text' | 'number' | 'boolean' | 'json' | 'date' | 'binary';
|
|
4
|
+
updatedAt: string;
|
|
5
|
+
mimeType?: string;
|
|
6
|
+
fileName?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TableData {
|
|
9
|
+
[key: string]: VariableData;
|
|
10
|
+
}
|
|
11
|
+
export interface ChangeRecord {
|
|
12
|
+
id: number;
|
|
13
|
+
tableName: string;
|
|
14
|
+
key: string;
|
|
15
|
+
action: 'set' | 'delete' | 'deleteTable';
|
|
16
|
+
value?: any;
|
|
17
|
+
type?: string;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
}
|
|
20
|
+
export interface DatabaseSchema {
|
|
21
|
+
tables: {
|
|
22
|
+
[tableName: string]: TableData;
|
|
23
|
+
};
|
|
24
|
+
changes: ChangeRecord[];
|
|
25
|
+
}
|
|
26
|
+
export declare class DbManager {
|
|
27
|
+
private dbPath;
|
|
28
|
+
private lockPath;
|
|
29
|
+
constructor();
|
|
30
|
+
private acquireLock;
|
|
31
|
+
private releaseLock;
|
|
32
|
+
private readDb;
|
|
33
|
+
private writeDb;
|
|
34
|
+
getTables(): Promise<string[]>;
|
|
35
|
+
createTable(tableName: string): Promise<void>;
|
|
36
|
+
deleteTable(tableName: string): Promise<void>;
|
|
37
|
+
getVariables(tableName: string): Promise<TableData | null>;
|
|
38
|
+
getVariable(tableName: string, key: string): Promise<VariableData | null>;
|
|
39
|
+
setVariable(tableName: string, key: string, value: any, type: VariableData['type'], mimeType?: string, fileName?: string): Promise<VariableData>;
|
|
40
|
+
deleteVariable(tableName: string, key: string): Promise<boolean>;
|
|
41
|
+
getChanges(sinceId: number): Promise<ChangeRecord[]>;
|
|
42
|
+
getLatestChangeId(): Promise<number>;
|
|
43
|
+
exportData(tableName?: string): Promise<any>;
|
|
44
|
+
importData(data: any, mode: 'merge' | 'replace'): Promise<void>;
|
|
45
|
+
private addChange;
|
|
46
|
+
}
|