@static-suite/static-suite-data-server 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/README.md +564 -104
  2. package/dist/http/README.md +564 -104
  3. package/dist/http/routes/dependency.d.ts +10 -0
  4. package/dist/http/routes/dependency.d.ts.map +1 -0
  5. package/dist/http/routes/dependency.js +71 -0
  6. package/dist/http/routes/dump.d.ts.map +1 -1
  7. package/dist/http/routes/dump.js +15 -10
  8. package/dist/http/routes/home.js +2 -1
  9. package/dist/http/routes/index.d.ts.map +1 -1
  10. package/dist/http/routes/index.js +8 -0
  11. package/dist/http/routes/status.d.ts.map +1 -1
  12. package/dist/http/routes/status.js +1 -6
  13. package/dist/http/views/dependencyIndex.pug +14 -0
  14. package/dist/lib/dataServer.d.ts +2 -1
  15. package/dist/lib/dataServer.d.ts.map +1 -1
  16. package/dist/lib/query/query.types.d.ts +2 -2
  17. package/dist/lib/query/query.types.d.ts.map +1 -1
  18. package/dist/lib/query/query.types.js +2 -2
  19. package/dist/lib/query/queryRunner.d.ts.map +1 -1
  20. package/dist/lib/query/queryRunner.js +3 -1
  21. package/dist/lib/store/dataDir/dataDir.types.d.ts +5 -5
  22. package/dist/lib/store/dataDir/dataDir.types.d.ts.map +1 -1
  23. package/dist/lib/store/dataDir/dataDirManager.d.ts.map +1 -1
  24. package/dist/lib/store/dataDir/dataDirManager.js +23 -12
  25. package/dist/lib/store/dependency/dependency.types.d.ts.map +1 -1
  26. package/dist/lib/store/dependency/dependencyFileHelper.d.ts +1 -1
  27. package/dist/lib/store/dependency/dependencyFileHelper.d.ts.map +1 -1
  28. package/dist/lib/store/dependency/dependencyFileHelper.js +5 -3
  29. package/dist/lib/store/dependency/dependencyManager.d.ts +12 -0
  30. package/dist/lib/store/dependency/dependencyManager.d.ts.map +1 -1
  31. package/dist/lib/store/dependency/dependencyManager.js +7 -5
  32. package/dist/lib/store/dependency/dependencyTagger.d.ts.map +1 -1
  33. package/dist/lib/store/dependency/dependencyTagger.js +3 -38
  34. package/dist/lib/store/diff/{diffManager.types.d.ts → diff.types.d.ts} +14 -6
  35. package/dist/lib/store/diff/diff.types.d.ts.map +1 -0
  36. package/dist/lib/store/{dependency/dependencyManager.types.js → diff/diff.types.js} +0 -0
  37. package/dist/lib/store/diff/diffManager.d.ts +1 -1
  38. package/dist/lib/store/diff/diffManager.d.ts.map +1 -1
  39. package/dist/lib/store/diff/diffManager.js +38 -81
  40. package/dist/lib/store/dump/{dumpManager.types.d.ts → dump.types.d.ts} +21 -8
  41. package/dist/lib/store/dump/dump.types.d.ts.map +1 -0
  42. package/dist/lib/store/{diff/diffManager.types.js → dump/dump.types.js} +0 -0
  43. package/dist/lib/store/dump/dumpManager.d.ts +1 -1
  44. package/dist/lib/store/dump/dumpManager.d.ts.map +1 -1
  45. package/dist/lib/store/dump/dumpManager.js +31 -56
  46. package/dist/lib/store/dump/dumpMetadataHelper.d.ts +7 -0
  47. package/dist/lib/store/dump/dumpMetadataHelper.d.ts.map +1 -0
  48. package/dist/lib/store/dump/dumpMetadataHelper.js +61 -0
  49. package/dist/lib/store/hook/hook.types.d.ts +49 -23
  50. package/dist/lib/store/hook/hook.types.d.ts.map +1 -1
  51. package/dist/lib/store/hook/hookManager.d.ts.map +1 -1
  52. package/dist/lib/store/hook/hookManager.js +19 -8
  53. package/dist/lib/store/store.d.ts.map +1 -1
  54. package/dist/lib/store/store.js +9 -4
  55. package/dist/lib/store/store.types.d.ts +14 -37
  56. package/dist/lib/store/store.types.d.ts.map +1 -1
  57. package/dist/lib/store/storeManager.d.ts.map +1 -1
  58. package/dist/lib/store/storeManager.js +20 -10
  59. package/dist/lib/store/workDir/storage/getChangedLinesBetween.d.ts +16 -0
  60. package/dist/lib/store/workDir/storage/getChangedLinesBetween.d.ts.map +1 -0
  61. package/dist/lib/store/workDir/storage/{getChangedLinesSince.js → getChangedLinesBetween.js} +22 -20
  62. package/dist/lib/store/workDir/storage/getDataFromLogLine.d.ts.map +1 -1
  63. package/dist/lib/store/workDir/storage/getDataFromLogLine.js +16 -3
  64. package/dist/lib/store/workDir/storage/index.d.ts +1 -1
  65. package/dist/lib/store/workDir/storage/index.d.ts.map +1 -1
  66. package/dist/lib/store/workDir/storage/index.js +1 -1
  67. package/dist/lib/store/workDir/workDir.types.d.ts +9 -1
  68. package/dist/lib/store/workDir/workDir.types.d.ts.map +1 -1
  69. package/dist/lib/store/workDir/workDirHelper.d.ts +13 -6
  70. package/dist/lib/store/workDir/workDirHelper.d.ts.map +1 -1
  71. package/dist/lib/store/workDir/workDirHelper.js +42 -11
  72. package/dist/lib/utils/fs/fsUtils.d.ts +6 -0
  73. package/dist/lib/utils/fs/fsUtils.d.ts.map +1 -1
  74. package/dist/lib/utils/fs/fsUtils.js +20 -1
  75. package/dist/lib/utils/module/moduleManager.d.ts.map +1 -1
  76. package/dist/lib/utils/module/moduleManager.js +5 -1
  77. package/dist/lib/utils/string/stringUtils.d.ts +14 -0
  78. package/dist/lib/utils/string/stringUtils.d.ts.map +1 -1
  79. package/dist/lib/utils/string/stringUtils.js +28 -1
  80. package/dist/static-suite-data-server.d.ts +19 -39
  81. package/package.json +3 -3
  82. package/src/http/routes/dependency.ts +91 -0
  83. package/src/http/routes/dump.ts +21 -10
  84. package/src/http/routes/home.ts +2 -2
  85. package/src/http/routes/index.ts +16 -0
  86. package/src/http/routes/status.ts +1 -9
  87. package/src/http/views/dependencyIndex.pug +14 -0
  88. package/src/lib/dataServer.ts +2 -0
  89. package/src/lib/query/query.types.ts +2 -2
  90. package/src/lib/query/queryRunner.ts +3 -1
  91. package/src/lib/store/dataDir/dataDir.types.ts +5 -5
  92. package/src/lib/store/dataDir/dataDirManager.ts +30 -14
  93. package/src/lib/store/dependency/dependency.types.ts +0 -5
  94. package/src/lib/store/dependency/dependencyFileHelper.ts +5 -3
  95. package/src/lib/store/dependency/dependencyManager.ts +6 -3
  96. package/src/lib/store/dependency/dependencyTagger.ts +3 -39
  97. package/src/lib/store/diff/{diffManager.types.ts → diff.types.ts} +14 -5
  98. package/src/lib/store/diff/diffManager.ts +45 -84
  99. package/src/lib/store/dump/{dumpManager.types.ts → dump.types.ts} +24 -7
  100. package/src/lib/store/dump/dumpManager.ts +40 -75
  101. package/src/lib/store/dump/dumpMetadataHelper.ts +73 -0
  102. package/src/lib/store/hook/hook.types.ts +58 -23
  103. package/src/lib/store/hook/hookManager.ts +24 -9
  104. package/src/lib/store/store.ts +9 -4
  105. package/src/lib/store/store.types.ts +16 -37
  106. package/src/lib/store/storeManager.ts +28 -12
  107. package/src/lib/store/workDir/__tests__/workDirHelper.test.ts +6 -1
  108. package/src/lib/store/workDir/storage/__tests__/{getChangedLinesSince.test.ts → getChangedLinesBetween.test.ts} +9 -4
  109. package/src/lib/store/workDir/storage/getChangedLinesBetween.ts +52 -0
  110. package/src/lib/store/workDir/storage/getDataFromLogLine.ts +22 -3
  111. package/src/lib/store/workDir/storage/index.ts +1 -1
  112. package/src/lib/store/workDir/workDir.types.ts +11 -1
  113. package/src/lib/store/workDir/workDirHelper.ts +45 -11
  114. package/src/lib/utils/fs/fsUtils.ts +18 -0
  115. package/src/lib/utils/module/moduleManager.ts +5 -1
  116. package/src/lib/utils/string/__tests__/stringUtils.test.ts +30 -1
  117. package/src/lib/utils/string/stringUtils.ts +32 -0
  118. package/dist/lib/query/queryRunner copy.d.ts +0 -3
  119. package/dist/lib/query/queryRunner copy.d.ts.map +0 -1
  120. package/dist/lib/query/queryRunner copy.js +0 -87
  121. package/dist/lib/store/dependency/dependencyManager copy.d.ts +0 -6
  122. package/dist/lib/store/dependency/dependencyManager copy.d.ts.map +0 -1
  123. package/dist/lib/store/dependency/dependencyManager copy.js +0 -91
  124. package/dist/lib/store/dependency/dependencyManager.types.d.ts +0 -48
  125. package/dist/lib/store/dependency/dependencyManager.types.d.ts.map +0 -1
  126. package/dist/lib/store/dependency/dependencyTagManager.d.ts +0 -6
  127. package/dist/lib/store/dependency/dependencyTagManager.d.ts.map +0 -1
  128. package/dist/lib/store/dependency/dependencyTagManager.js +0 -33
  129. package/dist/lib/store/diff/diffManager.types.d.ts.map +0 -1
  130. package/dist/lib/store/diff/tracker.d.ts +0 -3
  131. package/dist/lib/store/diff/tracker.d.ts.map +0 -1
  132. package/dist/lib/store/diff/tracker.js +0 -82
  133. package/dist/lib/store/diff/tracker.types.d.ts +0 -31
  134. package/dist/lib/store/diff/tracker.types.d.ts.map +0 -1
  135. package/dist/lib/store/diff/tracker.types.js +0 -2
  136. package/dist/lib/store/dump/dumpManager.types.d.ts.map +0 -1
  137. package/dist/lib/store/dump/dumpManager.types.js +0 -2
  138. package/dist/lib/store/include/includeIndex.d.ts +0 -6
  139. package/dist/lib/store/include/includeIndex.d.ts.map +0 -1
  140. package/dist/lib/store/include/includeIndex.js +0 -65
  141. package/dist/lib/store/include/includeIndex.types.d.ts +0 -29
  142. package/dist/lib/store/include/includeIndex.types.d.ts.map +0 -1
  143. package/dist/lib/store/include/includeIndex.types.js +0 -2
  144. package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts +0 -9
  145. package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts.map +0 -1
  146. 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 { jsonify } from '@lib/utils/object';
6
- import { getFileContent, isJsonFile, readFile } from '@lib/utils/fs';
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/diffManager.types';
11
- import { Dump, DumpManager } from './dumpManager.types';
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
- absoluteFilepathInDumpDir.replace('.json', '.2.json'),
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
- since: diff.since,
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(metadataFilepath, dump, diffResetDate);
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(diffResetDate);
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(timestamp: number): void {
189
+ reset(uniqueId): void {
206
190
  if (config.dumpDir) {
207
- const metadataFilepath = `${config.dumpDir}/metadata.json`;
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/dumpManager.types';
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: FileHookOptions): FileType;
19
- invokeOnStoreItemAdd(options: FileHookOptions): void;
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: FileHookOptions): void;
25
- invokeOnStoreItemAfterUpdate(options: FileHookOptions): void;
26
- invokeOnStoreItemDelete(options: FileHookOptions): void;
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 file hook.
81
+ * Options passed to a store item hook.
70
82
  */
71
- export interface FileHookOptions {
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
- * File contents, an object with "raw" and "json" members.
90
+ * Contents of the store item.
79
91
  */
80
- fileContent: FileType;
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
- * Full options passed to a hook.
105
+ * Options passed to a file type hook.
85
106
  */
86
- export interface FullHookOptions extends BaseHookOptions, FileHookOptions {}
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 FileHookOptions}
177
+ * @param options - An object with options passed to the hook. @see {@link FullFileTypeHookOptions}
143
178
  *
144
- * @returns The file contents, and object with "raw" and "json" members.
179
+ * @returns The file contents, an object with "raw" and "json" members.
145
180
  */
146
- onProcessFile?(options: FullHookOptions): FileType;
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 FileHookOptions}
190
+ * @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
156
191
  */
157
- onStoreItemAdd?(options: FullHookOptions): void;
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 FileHookOptions}
222
+ * @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
188
223
  */
189
- onStoreItemBeforeUpdate?(options: FullHookOptions): void;
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 FileHookOptions}
233
+ * @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
199
234
  */
200
- onStoreItemAfterUpdate?(options: FullHookOptions): void;
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 FileHookOptions}
244
+ * @param options - An object with options passed to the hook. @see {@link StoreItemHookOptions}
210
245
  */
211
- onStoreItemDelete?(options: FullHookOptions): void;
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/dumpManager.types';
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, fileContent }): void {
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, fileContent }) {
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
- fileContent,
118
+ storeItem,
112
119
  });
113
120
  }
114
121
  });
115
122
  },
116
123
 
117
- invokeOnStoreItemAfterUpdate({ relativeFilepath, fileContent }) {
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
- fileContent,
138
+ storeItem,
139
+ previousStoreItem,
127
140
  });
128
141
  }
129
142
  });
130
143
  },
131
144
 
132
- invokeOnStoreItemDelete({ relativeFilepath, fileContent }) {
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
- fileContent,
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
  });
@@ -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
- syncDate: null,
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(store.data.get(k));
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.syncDate = null;
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;