@static-suite/static-suite-data-server 0.0.1 → 0.0.3
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/README.md +569 -107
- package/dist/http/README.md +569 -107
- package/dist/http/routes/dependency.d.ts +10 -0
- package/dist/http/routes/dependency.d.ts.map +1 -0
- package/dist/http/routes/dependency.js +71 -0
- package/dist/http/routes/dump.d.ts.map +1 -1
- package/dist/http/routes/dump.js +15 -10
- package/dist/http/routes/home.js +2 -1
- package/dist/http/routes/index.d.ts.map +1 -1
- package/dist/http/routes/index.js +8 -0
- package/dist/http/routes/status.d.ts.map +1 -1
- package/dist/http/routes/status.js +1 -6
- package/dist/http/views/dependencyIndex.pug +14 -0
- package/dist/lib/dataServer.d.ts +2 -1
- package/dist/lib/dataServer.d.ts.map +1 -1
- package/dist/lib/query/query.types.d.ts +2 -2
- package/dist/lib/query/query.types.d.ts.map +1 -1
- package/dist/lib/query/query.types.js +2 -2
- package/dist/lib/query/queryRunner.d.ts.map +1 -1
- package/dist/lib/query/queryRunner.js +3 -1
- package/dist/lib/store/dataDir/dataDir.types.d.ts +5 -5
- package/dist/lib/store/dataDir/dataDir.types.d.ts.map +1 -1
- package/dist/lib/store/dataDir/dataDirManager.d.ts.map +1 -1
- package/dist/lib/store/dataDir/dataDirManager.js +23 -12
- package/dist/lib/store/dependency/dependency.types.d.ts.map +1 -1
- package/dist/lib/store/dependency/dependencyFileHelper.d.ts +1 -1
- package/dist/lib/store/dependency/dependencyFileHelper.d.ts.map +1 -1
- package/dist/lib/store/dependency/dependencyFileHelper.js +5 -3
- package/dist/lib/store/dependency/dependencyManager.d.ts +12 -0
- package/dist/lib/store/dependency/dependencyManager.d.ts.map +1 -1
- package/dist/lib/store/dependency/dependencyManager.js +7 -5
- package/dist/lib/store/dependency/dependencyTagger.d.ts.map +1 -1
- package/dist/lib/store/dependency/dependencyTagger.js +3 -38
- package/dist/lib/store/diff/{diffManager.types.d.ts → diff.types.d.ts} +14 -6
- package/dist/lib/store/diff/diff.types.d.ts.map +1 -0
- package/dist/lib/store/{dependency/dependencyManager.types.js → diff/diff.types.js} +0 -0
- package/dist/lib/store/diff/diffManager.d.ts +1 -1
- package/dist/lib/store/diff/diffManager.d.ts.map +1 -1
- package/dist/lib/store/diff/diffManager.js +38 -81
- package/dist/lib/store/dump/{dumpManager.types.d.ts → dump.types.d.ts} +21 -8
- package/dist/lib/store/dump/dump.types.d.ts.map +1 -0
- package/dist/lib/store/{diff/diffManager.types.js → dump/dump.types.js} +0 -0
- package/dist/lib/store/dump/dumpManager.d.ts +1 -1
- package/dist/lib/store/dump/dumpManager.d.ts.map +1 -1
- package/dist/lib/store/dump/dumpManager.js +31 -56
- package/dist/lib/store/dump/dumpMetadataHelper.d.ts +7 -0
- package/dist/lib/store/dump/dumpMetadataHelper.d.ts.map +1 -0
- package/dist/lib/store/dump/dumpMetadataHelper.js +61 -0
- package/dist/lib/store/hook/hook.types.d.ts +49 -23
- package/dist/lib/store/hook/hook.types.d.ts.map +1 -1
- package/dist/lib/store/hook/hookManager.d.ts.map +1 -1
- package/dist/lib/store/hook/hookManager.js +19 -8
- package/dist/lib/store/store.d.ts.map +1 -1
- package/dist/lib/store/store.js +9 -4
- package/dist/lib/store/store.types.d.ts +14 -37
- package/dist/lib/store/store.types.d.ts.map +1 -1
- package/dist/lib/store/storeManager.d.ts.map +1 -1
- package/dist/lib/store/storeManager.js +20 -10
- package/dist/lib/store/workDir/storage/getChangedLinesBetween.d.ts +16 -0
- package/dist/lib/store/workDir/storage/getChangedLinesBetween.d.ts.map +1 -0
- package/dist/lib/store/workDir/storage/{getChangedLinesSince.js → getChangedLinesBetween.js} +22 -20
- package/dist/lib/store/workDir/storage/getDataFromLogLine.d.ts.map +1 -1
- package/dist/lib/store/workDir/storage/getDataFromLogLine.js +16 -3
- package/dist/lib/store/workDir/storage/index.d.ts +1 -1
- package/dist/lib/store/workDir/storage/index.d.ts.map +1 -1
- package/dist/lib/store/workDir/storage/index.js +1 -1
- package/dist/lib/store/workDir/workDir.types.d.ts +9 -1
- package/dist/lib/store/workDir/workDir.types.d.ts.map +1 -1
- package/dist/lib/store/workDir/workDirHelper.d.ts +13 -6
- package/dist/lib/store/workDir/workDirHelper.d.ts.map +1 -1
- package/dist/lib/store/workDir/workDirHelper.js +42 -11
- package/dist/lib/utils/fs/fsUtils.d.ts +6 -0
- package/dist/lib/utils/fs/fsUtils.d.ts.map +1 -1
- package/dist/lib/utils/fs/fsUtils.js +20 -1
- package/dist/lib/utils/module/moduleManager.d.ts.map +1 -1
- package/dist/lib/utils/module/moduleManager.js +5 -1
- package/dist/lib/utils/string/stringUtils.d.ts +14 -0
- package/dist/lib/utils/string/stringUtils.d.ts.map +1 -1
- package/dist/lib/utils/string/stringUtils.js +28 -1
- package/dist/static-suite-data-server.d.ts +19 -39
- package/package.json +3 -3
- package/src/http/routes/dependency.ts +91 -0
- package/src/http/routes/dump.ts +21 -10
- package/src/http/routes/home.ts +2 -2
- package/src/http/routes/index.ts +16 -0
- package/src/http/routes/status.ts +1 -9
- package/src/http/views/dependencyIndex.pug +14 -0
- package/src/lib/dataServer.ts +2 -0
- package/src/lib/query/query.types.ts +2 -2
- package/src/lib/query/queryRunner.ts +3 -1
- package/src/lib/store/dataDir/dataDir.types.ts +5 -5
- package/src/lib/store/dataDir/dataDirManager.ts +30 -14
- package/src/lib/store/dependency/dependency.types.ts +0 -5
- package/src/lib/store/dependency/dependencyFileHelper.ts +5 -3
- package/src/lib/store/dependency/dependencyManager.ts +6 -3
- package/src/lib/store/dependency/dependencyTagger.ts +3 -39
- package/src/lib/store/diff/{diffManager.types.ts → diff.types.ts} +14 -5
- package/src/lib/store/diff/diffManager.ts +45 -84
- package/src/lib/store/dump/{dumpManager.types.ts → dump.types.ts} +24 -7
- package/src/lib/store/dump/dumpManager.ts +40 -75
- package/src/lib/store/dump/dumpMetadataHelper.ts +73 -0
- package/src/lib/store/hook/hook.types.ts +58 -23
- package/src/lib/store/hook/hookManager.ts +24 -9
- package/src/lib/store/store.ts +9 -4
- package/src/lib/store/store.types.ts +16 -37
- package/src/lib/store/storeManager.ts +28 -12
- package/src/lib/store/workDir/__tests__/workDirHelper.test.ts +6 -1
- package/src/lib/store/workDir/storage/__tests__/{getChangedLinesSince.test.ts → getChangedLinesBetween.test.ts} +9 -4
- package/src/lib/store/workDir/storage/getChangedLinesBetween.ts +52 -0
- package/src/lib/store/workDir/storage/getDataFromLogLine.ts +22 -3
- package/src/lib/store/workDir/storage/index.ts +1 -1
- package/src/lib/store/workDir/workDir.types.ts +11 -1
- package/src/lib/store/workDir/workDirHelper.ts +45 -11
- package/src/lib/utils/fs/fsUtils.ts +18 -0
- package/src/lib/utils/module/moduleManager.ts +5 -1
- package/src/lib/utils/string/__tests__/stringUtils.test.ts +30 -1
- package/src/lib/utils/string/stringUtils.ts +32 -0
- package/dist/lib/query/queryRunner copy.d.ts +0 -3
- package/dist/lib/query/queryRunner copy.d.ts.map +0 -1
- package/dist/lib/query/queryRunner copy.js +0 -87
- package/dist/lib/store/dependency/dependencyManager copy.d.ts +0 -6
- package/dist/lib/store/dependency/dependencyManager copy.d.ts.map +0 -1
- package/dist/lib/store/dependency/dependencyManager copy.js +0 -91
- package/dist/lib/store/dependency/dependencyManager.types.d.ts +0 -48
- package/dist/lib/store/dependency/dependencyManager.types.d.ts.map +0 -1
- package/dist/lib/store/dependency/dependencyTagManager.d.ts +0 -6
- package/dist/lib/store/dependency/dependencyTagManager.d.ts.map +0 -1
- package/dist/lib/store/dependency/dependencyTagManager.js +0 -33
- package/dist/lib/store/diff/diffManager.types.d.ts.map +0 -1
- package/dist/lib/store/diff/tracker.d.ts +0 -3
- package/dist/lib/store/diff/tracker.d.ts.map +0 -1
- package/dist/lib/store/diff/tracker.js +0 -82
- package/dist/lib/store/diff/tracker.types.d.ts +0 -31
- package/dist/lib/store/diff/tracker.types.d.ts.map +0 -1
- package/dist/lib/store/diff/tracker.types.js +0 -2
- package/dist/lib/store/dump/dumpManager.types.d.ts.map +0 -1
- package/dist/lib/store/dump/dumpManager.types.js +0 -2
- package/dist/lib/store/include/includeIndex.d.ts +0 -6
- package/dist/lib/store/include/includeIndex.d.ts.map +0 -1
- package/dist/lib/store/include/includeIndex.js +0 -65
- package/dist/lib/store/include/includeIndex.types.d.ts +0 -29
- package/dist/lib/store/include/includeIndex.types.d.ts.map +0 -1
- package/dist/lib/store/include/includeIndex.types.js +0 -2
- package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts +0 -9
- package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts.map +0 -1
- package/src/lib/store/workDir/storage/getChangedLinesSince.ts +0 -47
|
@@ -2,27 +2,19 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import microtime from 'microtime';
|
|
4
4
|
import { logger } from '@lib/utils/logger';
|
|
5
|
-
import {
|
|
6
|
-
|
|
5
|
+
import {
|
|
6
|
+
getFileContent,
|
|
7
|
+
isJsonFile,
|
|
8
|
+
readFile,
|
|
9
|
+
removeEmptyDirsUpwards,
|
|
10
|
+
} from '@lib/utils/fs';
|
|
7
11
|
import { config } from '@lib/config';
|
|
8
12
|
import { store } from '@lib/store';
|
|
9
13
|
import { diffManager } from '../diff/diffManager';
|
|
10
|
-
import { Diff } from '../diff/
|
|
11
|
-
import { Dump, DumpManager } from './
|
|
14
|
+
import { Diff } from '../diff/diff.types';
|
|
15
|
+
import { Dump, DumpManager } from './dump.types';
|
|
12
16
|
import { hookManager } from '../hook';
|
|
13
|
-
|
|
14
|
-
const removeEmptyDirsUpwards = (dir: string): void => {
|
|
15
|
-
const isEmpty = fs.readdirSync(dir).length === 0;
|
|
16
|
-
if (isEmpty) {
|
|
17
|
-
try {
|
|
18
|
-
fs.rmdirSync(dir);
|
|
19
|
-
} catch (e) {
|
|
20
|
-
logger.debug(`Error deleting empty directory "${dir}": ${e}`);
|
|
21
|
-
}
|
|
22
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
23
|
-
removeEmptyDirsUpwards(path.dirname(dir));
|
|
24
|
-
}
|
|
25
|
-
};
|
|
17
|
+
import { dumpMetadataHelper } from './dumpMetadataHelper';
|
|
26
18
|
|
|
27
19
|
const storeUpdatedFiles = (diff: Diff, dump: Dump, dumpDir: string): void => {
|
|
28
20
|
diff.updated.forEach(relativeFilepath => {
|
|
@@ -59,9 +51,19 @@ const storeUpdatedFiles = (diff: Diff, dump: Dump, dumpDir: string): void => {
|
|
|
59
51
|
JSON.parse(dumpFileContentString)?.data?.content?.url?.path ||
|
|
60
52
|
null;
|
|
61
53
|
/*
|
|
54
|
+
// Save a copy for later reference.
|
|
55
|
+
const backupAbsoluteFilepathInDumpDir =
|
|
56
|
+
absoluteFilepathInDumpDir.replace(
|
|
57
|
+
'/dump/files/',
|
|
58
|
+
'/dump/files.bak/',
|
|
59
|
+
);
|
|
60
|
+
const backupDir = path.dirname(backupAbsoluteFilepathInDumpDir);
|
|
61
|
+
if (!fs.existsSync(backupDir)) {
|
|
62
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
63
|
+
}
|
|
62
64
|
fs.renameSync(
|
|
63
65
|
absoluteFilepathInDumpDir,
|
|
64
|
-
|
|
66
|
+
backupAbsoluteFilepathInDumpDir,
|
|
65
67
|
);
|
|
66
68
|
*/
|
|
67
69
|
}
|
|
@@ -102,6 +104,9 @@ const removeDeletedFiles = (diff: Diff, dump: Dump, dumpDir: string): void => {
|
|
|
102
104
|
// Delete it.
|
|
103
105
|
fs.unlinkSync(absoluteFilepath);
|
|
104
106
|
|
|
107
|
+
// Delete any empty directory.
|
|
108
|
+
removeEmptyDirsUpwards(path.dirname(absoluteFilepath));
|
|
109
|
+
|
|
105
110
|
// Mark it as deleted.
|
|
106
111
|
dump.deleted.set(relativeFilepath, {
|
|
107
112
|
oldPublicUrl,
|
|
@@ -114,51 +119,23 @@ const removeDeletedFiles = (diff: Diff, dump: Dump, dumpDir: string): void => {
|
|
|
114
119
|
});
|
|
115
120
|
};
|
|
116
121
|
|
|
117
|
-
const storeDumpMetadata = (
|
|
118
|
-
metadataFilepath: string,
|
|
119
|
-
dump: Dump,
|
|
120
|
-
diffResetDate: Date,
|
|
121
|
-
) => {
|
|
122
|
-
let currentDumpMetadata: Dump[] = [];
|
|
123
|
-
try {
|
|
124
|
-
currentDumpMetadata = JSON.parse(
|
|
125
|
-
fs.readFileSync(metadataFilepath).toString(),
|
|
126
|
-
);
|
|
127
|
-
} catch (e) {
|
|
128
|
-
currentDumpMetadata = [];
|
|
129
|
-
}
|
|
130
|
-
currentDumpMetadata.push(jsonify(dump));
|
|
131
|
-
try {
|
|
132
|
-
const currentDumpMetadataString = JSON.stringify(currentDumpMetadata);
|
|
133
|
-
fs.writeFileSync(metadataFilepath, currentDumpMetadataString);
|
|
134
|
-
// Resetting the diff must happen when dump metadata is successfully
|
|
135
|
-
// stored into disk.
|
|
136
|
-
diffManager.reset(diffResetDate);
|
|
137
|
-
} catch (e) {
|
|
138
|
-
logger.error(
|
|
139
|
-
`Dump: error saving dump metadata to "${metadataFilepath}": ${e}`,
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
|
|
144
122
|
export const dumpManager: DumpManager = {
|
|
145
123
|
dump(options = { incremental: true }): Dump {
|
|
146
124
|
const startDate = microtime.now();
|
|
147
125
|
|
|
148
|
-
// Create a diff reset date just before consuming a diff.
|
|
149
|
-
const diffResetDate = new Date();
|
|
150
|
-
const diff = diffManager.getDiff({ incremental: options.incremental });
|
|
151
|
-
|
|
152
126
|
// Diff data is processed and transformed into a dump object.
|
|
127
|
+
const diff = diffManager.getDiff({ incremental: options.incremental });
|
|
153
128
|
let dump: Dump = {
|
|
154
|
-
|
|
129
|
+
execTimeMs: 0,
|
|
130
|
+
fromUniqueId: diff.fromUniqueId,
|
|
131
|
+
toUniqueId: diff.toUniqueId,
|
|
155
132
|
updated: new Map(),
|
|
156
133
|
deleted: new Map(),
|
|
134
|
+
diff,
|
|
157
135
|
};
|
|
158
136
|
|
|
159
137
|
if (config.dumpDir) {
|
|
160
138
|
const dumpDir = `${config.dumpDir}/files`;
|
|
161
|
-
const metadataFilepath = `${config.dumpDir}/metadata.json`;
|
|
162
139
|
|
|
163
140
|
if (diff.updated.size || diff.deleted.size) {
|
|
164
141
|
// Store updated files.
|
|
@@ -175,19 +152,26 @@ export const dumpManager: DumpManager = {
|
|
|
175
152
|
|
|
176
153
|
// Merge and store dump metadata if any.
|
|
177
154
|
if (dump.updated.size || dump.deleted.size) {
|
|
178
|
-
storeDumpMetadata(
|
|
155
|
+
const storeSuccessful = dumpMetadataHelper.storeDumpMetadata(dump);
|
|
156
|
+
if (storeSuccessful) {
|
|
157
|
+
// Resetting the diff must happen when dump metadata is successfully
|
|
158
|
+
// stored into disk.
|
|
159
|
+
diffManager.reset(diff.toUniqueId);
|
|
160
|
+
}
|
|
179
161
|
|
|
180
162
|
logger.info(
|
|
181
163
|
`Dump created in ${execTimeMs} ms. Updated: ${dump.updated.size} / Deleted: ${dump.deleted.size}`,
|
|
182
164
|
);
|
|
183
165
|
|
|
166
|
+
/*
|
|
184
167
|
// Log dump if not empty
|
|
185
168
|
if (dump.updated.size || dump.deleted.size) {
|
|
186
169
|
logger.debug(`Dump: "${JSON.stringify(jsonify(dump))}"`);
|
|
187
170
|
}
|
|
171
|
+
*/
|
|
188
172
|
} else {
|
|
189
173
|
// Resetting the diff must happen when no other operations are pending.
|
|
190
|
-
diffManager.reset(
|
|
174
|
+
diffManager.reset(diff.toUniqueId);
|
|
191
175
|
logger.info(
|
|
192
176
|
`Dump done in ${execTimeMs} ms without changes stored into disk.`,
|
|
193
177
|
);
|
|
@@ -202,30 +186,11 @@ export const dumpManager: DumpManager = {
|
|
|
202
186
|
return dump;
|
|
203
187
|
},
|
|
204
188
|
|
|
205
|
-
reset(
|
|
189
|
+
reset(uniqueId): void {
|
|
206
190
|
if (config.dumpDir) {
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
const metadata = JSON.parse(
|
|
210
|
-
fs.existsSync(metadataFilepath)
|
|
211
|
-
? fs.readFileSync(metadataFilepath).toString()
|
|
212
|
-
: '[]',
|
|
213
|
-
);
|
|
214
|
-
|
|
215
|
-
// Remove any dump data older that timestamp
|
|
216
|
-
const resetMetadata = metadata.filter(
|
|
217
|
-
(dump: Dump) => dump.since > timestamp,
|
|
218
|
-
);
|
|
219
|
-
|
|
191
|
+
const resetMetadata =
|
|
192
|
+
dumpMetadataHelper.removeDumpDataOlderThan(uniqueId);
|
|
220
193
|
logger.debug(`Dump reset : "${JSON.stringify(resetMetadata)}"`);
|
|
221
|
-
|
|
222
|
-
try {
|
|
223
|
-
fs.writeFileSync(metadataFilepath, JSON.stringify(resetMetadata));
|
|
224
|
-
} catch (e) {
|
|
225
|
-
logger.error(
|
|
226
|
-
`Dump: error resetting dump metadata to "${metadataFilepath}": ${e}`,
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
194
|
} else {
|
|
230
195
|
logger.error(
|
|
231
196
|
'"dumpDir" option not provided. Dump reset cannot be executed.',
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { logger } from '@lib/utils/logger';
|
|
3
|
+
import { jsonify } from '@lib/utils/object';
|
|
4
|
+
import { config } from '@lib/config';
|
|
5
|
+
import { Dump, DumpMetadata } from './dump.types';
|
|
6
|
+
import { unixEpochUniqueId } from '../workDir';
|
|
7
|
+
|
|
8
|
+
const getMetadataFilepath = () => `${config.dumpDir}/metadata.json`;
|
|
9
|
+
|
|
10
|
+
export const dumpMetadataHelper = {
|
|
11
|
+
storeDumpMetadata: (dump: Dump): boolean => {
|
|
12
|
+
const metadataFilepath = getMetadataFilepath();
|
|
13
|
+
const fallbackDumpMetadata: DumpMetadata = {
|
|
14
|
+
current: unixEpochUniqueId,
|
|
15
|
+
dumps: [],
|
|
16
|
+
};
|
|
17
|
+
let currentDumpMetadata = fallbackDumpMetadata;
|
|
18
|
+
try {
|
|
19
|
+
currentDumpMetadata = JSON.parse(
|
|
20
|
+
fs.readFileSync(metadataFilepath).toString(),
|
|
21
|
+
);
|
|
22
|
+
} catch (e) {
|
|
23
|
+
currentDumpMetadata = fallbackDumpMetadata;
|
|
24
|
+
}
|
|
25
|
+
currentDumpMetadata.current = dump.toUniqueId;
|
|
26
|
+
currentDumpMetadata.dumps.push(jsonify(dump));
|
|
27
|
+
try {
|
|
28
|
+
const currentDumpMetadataString = JSON.stringify(currentDumpMetadata);
|
|
29
|
+
fs.writeFileSync(metadataFilepath, currentDumpMetadataString);
|
|
30
|
+
return true;
|
|
31
|
+
} catch (e) {
|
|
32
|
+
logger.error(
|
|
33
|
+
`Dump: error saving dump metadata to "${metadataFilepath}": ${e}`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
removeDumpDataOlderThan(uniqueId: string): DumpMetadata {
|
|
40
|
+
const metadataFilepath = getMetadataFilepath();
|
|
41
|
+
|
|
42
|
+
const metadata = JSON.parse(
|
|
43
|
+
fs.existsSync(metadataFilepath)
|
|
44
|
+
? fs.readFileSync(metadataFilepath).toString()
|
|
45
|
+
: '[]',
|
|
46
|
+
) as DumpMetadata;
|
|
47
|
+
|
|
48
|
+
// Remove any dump data older than or equal to unique id.
|
|
49
|
+
metadata.dumps = metadata.dumps.filter(dump => dump.toUniqueId > uniqueId);
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
fs.writeFileSync(metadataFilepath, JSON.stringify(metadata));
|
|
53
|
+
} catch (e) {
|
|
54
|
+
logger.error(
|
|
55
|
+
`Dump: error removing dump metadata older than "${uniqueId}" from "${metadataFilepath}": ${e}`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return metadata;
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
getCurrentDumpUniqueId(): string {
|
|
63
|
+
const metadataFilepath = getMetadataFilepath();
|
|
64
|
+
|
|
65
|
+
const metadata = JSON.parse(
|
|
66
|
+
fs.existsSync(metadataFilepath)
|
|
67
|
+
? fs.readFileSync(metadataFilepath).toString()
|
|
68
|
+
: '[]',
|
|
69
|
+
) as DumpMetadata;
|
|
70
|
+
|
|
71
|
+
return metadata.current || unixEpochUniqueId;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ConfigOptions } from '@lib/config/config.types';
|
|
2
2
|
import { Store } from '@lib/store/store.types';
|
|
3
3
|
import { FileType } from '@lib/utils/fs/fs.types';
|
|
4
|
+
import { Logger } from '@lib/utils/logger/logger.types';
|
|
5
|
+
import { Json } from '@lib/utils/object/object.types';
|
|
4
6
|
import { DependencyTagger } from '../dependency/dependency.types';
|
|
5
|
-
import { Dump } from '../dump/
|
|
7
|
+
import { Dump } from '../dump/dump.types';
|
|
6
8
|
import { ChangedFiles } from '../workDir/workDir.types';
|
|
7
9
|
|
|
8
10
|
/**
|
|
@@ -15,15 +17,15 @@ export type HookManager = {
|
|
|
15
17
|
|
|
16
18
|
// Events when store is created/loaded for the first time.
|
|
17
19
|
invokeOnStoreLoadStart(): void;
|
|
18
|
-
invokeOnProcessFile(options:
|
|
19
|
-
invokeOnStoreItemAdd(options:
|
|
20
|
+
invokeOnProcessFile(options: FileTypeHookOptions): FileType;
|
|
21
|
+
invokeOnStoreItemAdd(options: StoreItemHookOptions): void;
|
|
20
22
|
invokeOnStoreLoadDone(): void;
|
|
21
23
|
|
|
22
24
|
// Events when store changes, leading to update or remove actions.
|
|
23
25
|
invokeOnStoreChangeStart(changedFiles: ChangedFiles): void;
|
|
24
|
-
invokeOnStoreItemBeforeUpdate(options:
|
|
25
|
-
invokeOnStoreItemAfterUpdate(options:
|
|
26
|
-
invokeOnStoreItemDelete(options:
|
|
26
|
+
invokeOnStoreItemBeforeUpdate(options: StoreItemHookOptions): void;
|
|
27
|
+
invokeOnStoreItemAfterUpdate(options: StoreItemHookOptions): void;
|
|
28
|
+
invokeOnStoreItemDelete(options: StoreItemHookOptions): void;
|
|
27
29
|
invokeOnStoreChangeDone(changedFiles: ChangedFiles): void;
|
|
28
30
|
|
|
29
31
|
// Dump related events
|
|
@@ -43,6 +45,11 @@ export interface OnModuleLoadHookOptions {
|
|
|
43
45
|
* The data store.
|
|
44
46
|
*/
|
|
45
47
|
store: Store;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The logger service.
|
|
51
|
+
*/
|
|
52
|
+
logger: Logger;
|
|
46
53
|
}
|
|
47
54
|
|
|
48
55
|
/**
|
|
@@ -59,6 +66,11 @@ export interface BaseHookOptions {
|
|
|
59
66
|
*/
|
|
60
67
|
store: Store;
|
|
61
68
|
|
|
69
|
+
/**
|
|
70
|
+
* The logger service.
|
|
71
|
+
*/
|
|
72
|
+
logger: Logger;
|
|
73
|
+
|
|
62
74
|
/**
|
|
63
75
|
* The dependency tagger service.
|
|
64
76
|
*/
|
|
@@ -66,24 +78,47 @@ export interface BaseHookOptions {
|
|
|
66
78
|
}
|
|
67
79
|
|
|
68
80
|
/**
|
|
69
|
-
* Options passed to a
|
|
81
|
+
* Options passed to a store item hook.
|
|
70
82
|
*/
|
|
71
|
-
export interface
|
|
83
|
+
export interface StoreItemHookOptions {
|
|
72
84
|
/**
|
|
73
85
|
* Relative file path inside the data dir.
|
|
74
86
|
*/
|
|
75
87
|
relativeFilepath: string;
|
|
76
88
|
|
|
77
89
|
/**
|
|
78
|
-
*
|
|
90
|
+
* Contents of the store item.
|
|
79
91
|
*/
|
|
80
|
-
|
|
92
|
+
storeItem: Json | string | null;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Contents of the previous store item before store was updated.
|
|
96
|
+
*/
|
|
97
|
+
previousStoreItem?: Json | string | null;
|
|
81
98
|
}
|
|
82
99
|
|
|
100
|
+
export interface FullStoreItemHookOptions
|
|
101
|
+
extends StoreItemHookOptions,
|
|
102
|
+
BaseHookOptions {}
|
|
103
|
+
|
|
83
104
|
/**
|
|
84
|
-
*
|
|
105
|
+
* Options passed to a file type hook.
|
|
85
106
|
*/
|
|
86
|
-
export interface
|
|
107
|
+
export interface FileTypeHookOptions {
|
|
108
|
+
/**
|
|
109
|
+
* Relative file path inside the data dir.
|
|
110
|
+
*/
|
|
111
|
+
relativeFilepath: string;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* File contents, an object with "raw" and "json" members.
|
|
115
|
+
*/
|
|
116
|
+
fileContent: FileType;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface FullFileTypeHookOptions
|
|
120
|
+
extends FileTypeHookOptions,
|
|
121
|
+
BaseHookOptions {}
|
|
87
122
|
|
|
88
123
|
export interface ChangedFilesHookOptions extends BaseHookOptions {
|
|
89
124
|
/**
|
|
@@ -139,11 +174,11 @@ export type HookModule = {
|
|
|
139
174
|
* @remarks
|
|
140
175
|
* This hook is aimed at altering the contents of the file before it being added to the store.
|
|
141
176
|
*
|
|
142
|
-
* @param options - An object with options passed to the hook. @see {@link
|
|
177
|
+
* @param options - An object with options passed to the hook. @see {@link FullFileTypeHookOptions}
|
|
143
178
|
*
|
|
144
|
-
* @returns The file contents,
|
|
179
|
+
* @returns The file contents, an object with "raw" and "json" members.
|
|
145
180
|
*/
|
|
146
|
-
onProcessFile?(options:
|
|
181
|
+
onProcessFile?(options: FullFileTypeHookOptions): FileType;
|
|
147
182
|
|
|
148
183
|
/**
|
|
149
184
|
* A hook executed after a file is added into the store.
|
|
@@ -152,9 +187,9 @@ export type HookModule = {
|
|
|
152
187
|
* This hook is aimed at adding some information to the store, e.g.- indexing all contents
|
|
153
188
|
* by their taxonomy.
|
|
154
189
|
*
|
|
155
|
-
* @param options - An object with options passed to the hook. @see {@link
|
|
190
|
+
* @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
|
|
156
191
|
*/
|
|
157
|
-
onStoreItemAdd?(options:
|
|
192
|
+
onStoreItemAdd?(options: FullStoreItemHookOptions): void;
|
|
158
193
|
|
|
159
194
|
/**
|
|
160
195
|
* A hook executed after the store finishes loading.
|
|
@@ -184,9 +219,9 @@ export type HookModule = {
|
|
|
184
219
|
* This hook is aimed at adding some information to the store, e.g.- indexing all contents
|
|
185
220
|
* by their taxonomy.
|
|
186
221
|
*
|
|
187
|
-
* @param options - An object with options passed to the hook. @see {@link
|
|
222
|
+
* @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
|
|
188
223
|
*/
|
|
189
|
-
onStoreItemBeforeUpdate?(options:
|
|
224
|
+
onStoreItemBeforeUpdate?(options: FullStoreItemHookOptions): void;
|
|
190
225
|
|
|
191
226
|
/**
|
|
192
227
|
* A hook executed after a file is updated in the store.
|
|
@@ -195,9 +230,9 @@ export type HookModule = {
|
|
|
195
230
|
* This hook is aimed at adding some information to the store, e.g.- indexing all contents
|
|
196
231
|
* by their taxonomy.
|
|
197
232
|
*
|
|
198
|
-
* @param options - An object with options passed to the hook. @see {@link
|
|
233
|
+
* @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
|
|
199
234
|
*/
|
|
200
|
-
onStoreItemAfterUpdate?(options:
|
|
235
|
+
onStoreItemAfterUpdate?(options: FullStoreItemHookOptions): void;
|
|
201
236
|
|
|
202
237
|
/**
|
|
203
238
|
* A hook executed after a file is deleted from the store.
|
|
@@ -206,9 +241,9 @@ export type HookModule = {
|
|
|
206
241
|
* This hook is aimed at reverting the actions taken in storeAdd hook, e.g.- removing a file
|
|
207
242
|
* from a taxonomy index.
|
|
208
243
|
*
|
|
209
|
-
* @param options - An object with options passed to the hook. @see {@link
|
|
244
|
+
* @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
|
|
210
245
|
*/
|
|
211
|
-
onStoreItemDelete?(options:
|
|
246
|
+
onStoreItemDelete?(options: FullStoreItemHookOptions): void;
|
|
212
247
|
|
|
213
248
|
/**
|
|
214
249
|
* A hook executed after the store ends updating.
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { config } from '@lib/config';
|
|
2
2
|
import { store } from '@lib/store';
|
|
3
|
+
import { logger } from '@lib/utils/logger';
|
|
3
4
|
import { dependencyTagger } from '@lib/store/dependency/dependencyTagger';
|
|
4
5
|
import { FileType } from '@lib/utils/fs/fs.types';
|
|
5
6
|
import { dirBasedModuleGroupManager } from '@lib/utils/module';
|
|
6
7
|
import { HookManager, HookModule } from './hook.types';
|
|
7
|
-
import { Dump } from '../dump/
|
|
8
|
+
import { Dump } from '../dump/dump.types';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* A manager for hooks stored in a user-land directory defined by configuration.
|
|
@@ -30,6 +31,7 @@ export const hookManager: HookManager = {
|
|
|
30
31
|
if (hookModule.onStoreLoadStart) {
|
|
31
32
|
hookModule.onStoreLoadStart({
|
|
32
33
|
store,
|
|
34
|
+
logger,
|
|
33
35
|
dependencyTagger,
|
|
34
36
|
});
|
|
35
37
|
}
|
|
@@ -47,6 +49,7 @@ export const hookManager: HookManager = {
|
|
|
47
49
|
relativeFilepath,
|
|
48
50
|
fileContent: processedFileContent,
|
|
49
51
|
store,
|
|
52
|
+
logger,
|
|
50
53
|
dependencyTagger,
|
|
51
54
|
});
|
|
52
55
|
if (returnValue) {
|
|
@@ -57,16 +60,17 @@ export const hookManager: HookManager = {
|
|
|
57
60
|
return processedFileContent;
|
|
58
61
|
},
|
|
59
62
|
|
|
60
|
-
invokeOnStoreItemAdd({ relativeFilepath,
|
|
63
|
+
invokeOnStoreItemAdd({ relativeFilepath, storeItem }): void {
|
|
61
64
|
const hookModulesInfo = moduleManager.getModuleGroupInfo();
|
|
62
65
|
hookModulesInfo.forEach(hookInfo => {
|
|
63
66
|
const hookModule = hookInfo.getModule();
|
|
64
67
|
if (hookModule.onStoreItemAdd) {
|
|
65
68
|
hookModule.onStoreItemAdd({
|
|
66
69
|
relativeFilepath,
|
|
67
|
-
fileContent,
|
|
68
70
|
store,
|
|
71
|
+
logger,
|
|
69
72
|
dependencyTagger,
|
|
73
|
+
storeItem,
|
|
70
74
|
});
|
|
71
75
|
}
|
|
72
76
|
});
|
|
@@ -79,6 +83,7 @@ export const hookManager: HookManager = {
|
|
|
79
83
|
if (hookModule.onStoreLoadDone) {
|
|
80
84
|
hookModule.onStoreLoadDone({
|
|
81
85
|
store,
|
|
86
|
+
logger,
|
|
82
87
|
dependencyTagger,
|
|
83
88
|
});
|
|
84
89
|
}
|
|
@@ -92,6 +97,7 @@ export const hookManager: HookManager = {
|
|
|
92
97
|
if (hookModule.onStoreChangeStart) {
|
|
93
98
|
hookModule.onStoreChangeStart({
|
|
94
99
|
store,
|
|
100
|
+
logger,
|
|
95
101
|
dependencyTagger,
|
|
96
102
|
changedFiles,
|
|
97
103
|
});
|
|
@@ -99,46 +105,54 @@ export const hookManager: HookManager = {
|
|
|
99
105
|
});
|
|
100
106
|
},
|
|
101
107
|
|
|
102
|
-
invokeOnStoreItemBeforeUpdate({ relativeFilepath,
|
|
108
|
+
invokeOnStoreItemBeforeUpdate({ relativeFilepath, storeItem }) {
|
|
103
109
|
const hookModulesInfo = moduleManager.getModuleGroupInfo();
|
|
104
110
|
hookModulesInfo.forEach(hookInfo => {
|
|
105
111
|
const hookModule = hookInfo.getModule();
|
|
106
112
|
if (hookModule.onStoreItemBeforeUpdate) {
|
|
107
113
|
hookModule.onStoreItemBeforeUpdate({
|
|
108
114
|
store,
|
|
115
|
+
logger,
|
|
109
116
|
dependencyTagger,
|
|
110
117
|
relativeFilepath,
|
|
111
|
-
|
|
118
|
+
storeItem,
|
|
112
119
|
});
|
|
113
120
|
}
|
|
114
121
|
});
|
|
115
122
|
},
|
|
116
123
|
|
|
117
|
-
invokeOnStoreItemAfterUpdate({
|
|
124
|
+
invokeOnStoreItemAfterUpdate({
|
|
125
|
+
relativeFilepath,
|
|
126
|
+
storeItem,
|
|
127
|
+
previousStoreItem,
|
|
128
|
+
}) {
|
|
118
129
|
const hookModulesInfo = moduleManager.getModuleGroupInfo();
|
|
119
130
|
hookModulesInfo.forEach(hookInfo => {
|
|
120
131
|
const hookModule = hookInfo.getModule();
|
|
121
132
|
if (hookModule.onStoreItemAfterUpdate) {
|
|
122
133
|
hookModule.onStoreItemAfterUpdate({
|
|
123
134
|
store,
|
|
135
|
+
logger,
|
|
124
136
|
dependencyTagger,
|
|
125
137
|
relativeFilepath,
|
|
126
|
-
|
|
138
|
+
storeItem,
|
|
139
|
+
previousStoreItem,
|
|
127
140
|
});
|
|
128
141
|
}
|
|
129
142
|
});
|
|
130
143
|
},
|
|
131
144
|
|
|
132
|
-
invokeOnStoreItemDelete({ relativeFilepath,
|
|
145
|
+
invokeOnStoreItemDelete({ relativeFilepath, storeItem }) {
|
|
133
146
|
const hookModulesInfo = moduleManager.getModuleGroupInfo();
|
|
134
147
|
hookModulesInfo.forEach(hookInfo => {
|
|
135
148
|
const hookModule = hookInfo.getModule();
|
|
136
149
|
if (hookModule.onStoreItemDelete) {
|
|
137
150
|
hookModule.onStoreItemDelete({
|
|
138
151
|
store,
|
|
152
|
+
logger,
|
|
139
153
|
dependencyTagger,
|
|
140
154
|
relativeFilepath,
|
|
141
|
-
|
|
155
|
+
storeItem,
|
|
142
156
|
});
|
|
143
157
|
}
|
|
144
158
|
});
|
|
@@ -151,6 +165,7 @@ export const hookManager: HookManager = {
|
|
|
151
165
|
if (hookModule.onStoreChangeDone) {
|
|
152
166
|
hookModule.onStoreChangeDone({
|
|
153
167
|
store,
|
|
168
|
+
logger,
|
|
154
169
|
dependencyTagger,
|
|
155
170
|
changedFiles,
|
|
156
171
|
});
|
package/src/lib/store/store.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
StoreSubset,
|
|
9
9
|
StoreSubsetOptions,
|
|
10
10
|
} from './store.types';
|
|
11
|
+
import { unixEpochUniqueId } from './workDir';
|
|
11
12
|
|
|
12
13
|
// Instantiate the subset cache so it can be accessed faster.
|
|
13
14
|
const subsetCache = cache.bin<StoreSubset>('store-subset');
|
|
@@ -22,7 +23,8 @@ const initIndex = () => {
|
|
|
22
23
|
|
|
23
24
|
const initData = () => new Map<string, any>() as StoreData<string, any>;
|
|
24
25
|
export const store: Store = {
|
|
25
|
-
|
|
26
|
+
initialUniqueId: unixEpochUniqueId,
|
|
27
|
+
currentUniqueId: unixEpochUniqueId,
|
|
26
28
|
data: initData(),
|
|
27
29
|
deleted: new Set<string>(),
|
|
28
30
|
index: initIndex(),
|
|
@@ -39,7 +41,7 @@ store.data.subset = (options: StoreSubsetOptions): StoreSubset => {
|
|
|
39
41
|
};
|
|
40
42
|
const opts = { ...defaultOptions, ...options };
|
|
41
43
|
|
|
42
|
-
let subset: StoreSubset = { filenames: [], items: [] };
|
|
44
|
+
let subset: StoreSubset = { map: new Map(), filenames: [], items: [] };
|
|
43
45
|
|
|
44
46
|
const dirWithTrimmedSlashes = opts.dir?.replace(/^\//, '').replace(/\/$/, '');
|
|
45
47
|
const dirPart = dirWithTrimmedSlashes ? `${dirWithTrimmedSlashes}/` : '';
|
|
@@ -77,8 +79,10 @@ store.data.subset = (options: StoreSubsetOptions): StoreSubset => {
|
|
|
77
79
|
const mapKeys = Array.from(store.data.keys());
|
|
78
80
|
mapKeys.forEach(k => {
|
|
79
81
|
if (k.match(regex)) {
|
|
82
|
+
const storeItem = store.data.get(k);
|
|
83
|
+
subset.map.set(k, storeItem);
|
|
80
84
|
subset.filenames.push(k);
|
|
81
|
-
subset.items.push(
|
|
85
|
+
subset.items.push(storeItem);
|
|
82
86
|
}
|
|
83
87
|
});
|
|
84
88
|
subsetCache.set(pattern, subset);
|
|
@@ -96,7 +100,8 @@ store.data.subset = (options: StoreSubsetOptions): StoreSubset => {
|
|
|
96
100
|
* Resets store and deletes all loaded data.
|
|
97
101
|
*/
|
|
98
102
|
export const resetStore = (): void => {
|
|
99
|
-
store.
|
|
103
|
+
store.initialUniqueId = unixEpochUniqueId;
|
|
104
|
+
store.currentUniqueId = unixEpochUniqueId;
|
|
100
105
|
const previousSubset = store.data.subset;
|
|
101
106
|
store.data = initData();
|
|
102
107
|
store.data.subset = previousSubset;
|