@baseplate-dev/project-builder-server 0.1.1
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 +390 -0
- package/dist/api/context.d.ts +15 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +21 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/index.d.ts +287 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +12 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/plugins.d.ts +35 -0
- package/dist/api/plugins.d.ts.map +1 -0
- package/dist/api/plugins.js +13 -0
- package/dist/api/plugins.js.map +1 -0
- package/dist/api/projects.d.ts +62 -0
- package/dist/api/projects.d.ts.map +1 -0
- package/dist/api/projects.js +64 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/sync.d.ts +134 -0
- package/dist/api/sync.d.ts.map +1 -0
- package/dist/api/sync.js +90 -0
- package/dist/api/sync.js.map +1 -0
- package/dist/api/trpc.d.ts +50 -0
- package/dist/api/trpc.d.ts.map +1 -0
- package/dist/api/trpc.js +39 -0
- package/dist/api/trpc.js.map +1 -0
- package/dist/api/types.d.ts +13 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/version.d.ts +40 -0
- package/dist/api/version.d.ts.map +1 -0
- package/dist/api/version.js +9 -0
- package/dist/api/version.js.map +1 -0
- package/dist/compiler/admin/crud/displays.d.ts +5 -0
- package/dist/compiler/admin/crud/displays.d.ts.map +1 -0
- package/dist/compiler/admin/crud/displays.js +46 -0
- package/dist/compiler/admin/crud/displays.js.map +1 -0
- package/dist/compiler/admin/crud/index.d.ts +5 -0
- package/dist/compiler/admin/crud/index.d.ts.map +1 -0
- package/dist/compiler/admin/crud/index.js +90 -0
- package/dist/compiler/admin/crud/index.js.map +1 -0
- package/dist/compiler/admin/crud/inputs.d.ts +5 -0
- package/dist/compiler/admin/crud/inputs.d.ts.map +1 -0
- package/dist/compiler/admin/crud/inputs.js +146 -0
- package/dist/compiler/admin/crud/inputs.js.map +1 -0
- package/dist/compiler/admin/index.d.ts +3 -0
- package/dist/compiler/admin/index.d.ts.map +1 -0
- package/dist/compiler/admin/index.js +95 -0
- package/dist/compiler/admin/index.js.map +1 -0
- package/dist/compiler/admin/sections.d.ts +5 -0
- package/dist/compiler/admin/sections.d.ts.map +1 -0
- package/dist/compiler/admin/sections.js +54 -0
- package/dist/compiler/admin/sections.js.map +1 -0
- package/dist/compiler/app-entry-builder.d.ts +19 -0
- package/dist/compiler/app-entry-builder.d.ts.map +1 -0
- package/dist/compiler/app-entry-builder.js +45 -0
- package/dist/compiler/app-entry-builder.js.map +1 -0
- package/dist/compiler/backend/enums.d.ts +4 -0
- package/dist/compiler/backend/enums.d.ts.map +1 -0
- package/dist/compiler/backend/enums.js +14 -0
- package/dist/compiler/backend/enums.js.map +1 -0
- package/dist/compiler/backend/fastify.d.ts +5 -0
- package/dist/compiler/backend/fastify.d.ts.map +1 -0
- package/dist/compiler/backend/fastify.js +62 -0
- package/dist/compiler/backend/fastify.js.map +1 -0
- package/dist/compiler/backend/feature.d.ts +4 -0
- package/dist/compiler/backend/feature.d.ts.map +1 -0
- package/dist/compiler/backend/feature.js +26 -0
- package/dist/compiler/backend/feature.js.map +1 -0
- package/dist/compiler/backend/graphql.d.ts +4 -0
- package/dist/compiler/backend/graphql.d.ts.map +1 -0
- package/dist/compiler/backend/graphql.js +171 -0
- package/dist/compiler/backend/graphql.js.map +1 -0
- package/dist/compiler/backend/index.d.ts +3 -0
- package/dist/compiler/backend/index.d.ts.map +1 -0
- package/dist/compiler/backend/index.js +34 -0
- package/dist/compiler/backend/index.js.map +1 -0
- package/dist/compiler/backend/models.d.ts +4 -0
- package/dist/compiler/backend/models.d.ts.map +1 -0
- package/dist/compiler/backend/models.js +79 -0
- package/dist/compiler/backend/models.js.map +1 -0
- package/dist/compiler/backend/services.d.ts +4 -0
- package/dist/compiler/backend/services.d.ts.map +1 -0
- package/dist/compiler/backend/services.js +90 -0
- package/dist/compiler/backend/services.js.map +1 -0
- package/dist/compiler/backend/utils.d.ts +16 -0
- package/dist/compiler/backend/utils.d.ts.map +1 -0
- package/dist/compiler/backend/utils.js +17 -0
- package/dist/compiler/backend/utils.js.map +1 -0
- package/dist/compiler/index.d.ts +3 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +31 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/web/features.d.ts +5 -0
- package/dist/compiler/web/features.d.ts.map +1 -0
- package/dist/compiler/web/features.js +30 -0
- package/dist/compiler/web/features.js.map +1 -0
- package/dist/compiler/web/index.d.ts +3 -0
- package/dist/compiler/web/index.d.ts.map +1 -0
- package/dist/compiler/web/index.js +58 -0
- package/dist/compiler/web/index.js.map +1 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +2 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/server.d.ts +2 -0
- package/dist/constants/server.d.ts.map +1 -0
- package/dist/constants/server.js +2 -0
- package/dist/constants/server.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/node-plugin-store.d.ts +6 -0
- package/dist/plugins/node-plugin-store.d.ts.map +1 -0
- package/dist/plugins/node-plugin-store.js +40 -0
- package/dist/plugins/node-plugin-store.js.map +1 -0
- package/dist/plugins/plugin-discovery.d.ts +7 -0
- package/dist/plugins/plugin-discovery.d.ts.map +1 -0
- package/dist/plugins/plugin-discovery.js +50 -0
- package/dist/plugins/plugin-discovery.js.map +1 -0
- package/dist/server/builder-service-manager.d.ts +32 -0
- package/dist/server/builder-service-manager.d.ts.map +1 -0
- package/dist/server/builder-service-manager.js +52 -0
- package/dist/server/builder-service-manager.js.map +1 -0
- package/dist/server/graceful-shutdown.d.ts +2 -0
- package/dist/server/graceful-shutdown.d.ts.map +1 -0
- package/dist/server/graceful-shutdown.js +25 -0
- package/dist/server/graceful-shutdown.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +33 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/plugin.d.ts +12 -0
- package/dist/server/plugin.d.ts.map +1 -0
- package/dist/server/plugin.js +109 -0
- package/dist/server/plugin.js.map +1 -0
- package/dist/server/server.d.ts +16 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +47 -0
- package/dist/server/server.js.map +1 -0
- package/dist/service/builder-service.d.ts +154 -0
- package/dist/service/builder-service.d.ts.map +1 -0
- package/dist/service/builder-service.js +338 -0
- package/dist/service/builder-service.js.map +1 -0
- package/dist/sync/build-project.d.ts +54 -0
- package/dist/sync/build-project.d.ts.map +1 -0
- package/dist/sync/build-project.js +173 -0
- package/dist/sync/build-project.js.map +1 -0
- package/dist/sync/conflict-file-monitor.d.ts +27 -0
- package/dist/sync/conflict-file-monitor.d.ts.map +1 -0
- package/dist/sync/conflict-file-monitor.js +125 -0
- package/dist/sync/conflict-file-monitor.js.map +1 -0
- package/dist/sync/generate-for-directory.d.ts +29 -0
- package/dist/sync/generate-for-directory.d.ts.map +1 -0
- package/dist/sync/generate-for-directory.js +132 -0
- package/dist/sync/generate-for-directory.js.map +1 -0
- package/dist/sync/generator-steps-writer.d.ts +3 -0
- package/dist/sync/generator-steps-writer.d.ts.map +1 -0
- package/dist/sync/generator-steps-writer.js +6 -0
- package/dist/sync/generator-steps-writer.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/sync-metadata-controller.d.ts +29 -0
- package/dist/sync/sync-metadata-controller.d.ts.map +1 -0
- package/dist/sync/sync-metadata-controller.js +95 -0
- package/dist/sync/sync-metadata-controller.js.map +1 -0
- package/dist/sync/sync-metadata-service.d.ts +20 -0
- package/dist/sync/sync-metadata-service.d.ts.map +1 -0
- package/dist/sync/sync-metadata-service.js +31 -0
- package/dist/sync/sync-metadata-service.js.map +1 -0
- package/dist/sync/sync-metadata.d.ts +444 -0
- package/dist/sync/sync-metadata.d.ts.map +1 -0
- package/dist/sync/sync-metadata.js +80 -0
- package/dist/sync/sync-metadata.js.map +1 -0
- package/dist/sync/utils.d.ts +8 -0
- package/dist/sync/utils.d.ts.map +1 -0
- package/dist/sync/utils.js +23 -0
- package/dist/sync/utils.js.map +1 -0
- package/dist/template-extractor/index.d.ts +2 -0
- package/dist/template-extractor/index.d.ts.map +1 -0
- package/dist/template-extractor/index.js +2 -0
- package/dist/template-extractor/index.js.map +1 -0
- package/dist/template-extractor/run-template-extractor.d.ts +4 -0
- package/dist/template-extractor/run-template-extractor.d.ts.map +1 -0
- package/dist/template-extractor/run-template-extractor.js +60 -0
- package/dist/template-extractor/run-template-extractor.js.map +1 -0
- package/dist/user-config/index.d.ts +2 -0
- package/dist/user-config/index.d.ts.map +1 -0
- package/dist/user-config/index.js +2 -0
- package/dist/user-config/index.js.map +1 -0
- package/dist/user-config/user-config-schema.d.ts +46 -0
- package/dist/user-config/user-config-schema.d.ts.map +1 -0
- package/dist/user-config/user-config-schema.js +30 -0
- package/dist/user-config/user-config-schema.js.map +1 -0
- package/dist/utils/case.d.ts +3 -0
- package/dist/utils/case.d.ts.map +1 -0
- package/dist/utils/case.js +14 -0
- package/dist/utils/case.js.map +1 -0
- package/dist/utils/errors.d.ts +10 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +15 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/paths.d.ts +8 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +17 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { differenceSet } from '@baseplate-dev/utils';
|
|
2
|
+
import { fileExists, handleFileNotFoundError } from '@baseplate-dev/utils/node';
|
|
3
|
+
import { watch } from 'chokidar';
|
|
4
|
+
import { produce } from 'immer';
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { getPackageSyncStatusFromResult } from './utils.js';
|
|
8
|
+
const FS_WATCHER_OPTIONS = {
|
|
9
|
+
awaitWriteFinish: {
|
|
10
|
+
stabilityThreshold: 1000,
|
|
11
|
+
},
|
|
12
|
+
ignoreInitial: true,
|
|
13
|
+
// we use polling since fs events has some glitchiness with regards to deleting
|
|
14
|
+
// the parent directory of a file that is being deleted
|
|
15
|
+
usePolling: true,
|
|
16
|
+
interval: 500,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* This class is responsible for monitoring the conflict files and the files that are pending deletion.
|
|
20
|
+
*
|
|
21
|
+
* It will update the metadata when the files are resolved.
|
|
22
|
+
*/
|
|
23
|
+
export class ConflictFileMonitor {
|
|
24
|
+
syncMetadataController;
|
|
25
|
+
logger;
|
|
26
|
+
// Start with an empty watched‑set; paths are added via `handleMetadataChange`
|
|
27
|
+
conflictFileWatcher = watch([], FS_WATCHER_OPTIONS);
|
|
28
|
+
conflictFiles = new Set();
|
|
29
|
+
unsubscribers = [];
|
|
30
|
+
constructor(syncMetadataController, logger) {
|
|
31
|
+
this.syncMetadataController = syncMetadataController;
|
|
32
|
+
this.logger = logger;
|
|
33
|
+
}
|
|
34
|
+
handleMetadataChange(metadata) {
|
|
35
|
+
const newConflictFiles = new Set();
|
|
36
|
+
for (const packageInfo of Object.values(metadata.packages)) {
|
|
37
|
+
const { result } = packageInfo;
|
|
38
|
+
if (!result)
|
|
39
|
+
continue;
|
|
40
|
+
for (const f of result.filesWithConflicts ?? []) {
|
|
41
|
+
newConflictFiles.add(path.join(packageInfo.path, f.generatedConflictRelativePath ?? f.relativePath));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const conflictFilesToWatch = differenceSet(newConflictFiles, this.conflictFiles);
|
|
45
|
+
this.conflictFileWatcher.add([...conflictFilesToWatch]);
|
|
46
|
+
// trigger the change event for each file on first load since
|
|
47
|
+
// chokidar won't trigger the event for files that do not exist
|
|
48
|
+
for (const filePath of conflictFilesToWatch) {
|
|
49
|
+
this.handleFileChange(filePath).catch((err) => {
|
|
50
|
+
this.logger.error(`Error handling conflict file change: ${String(err)}`);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const conflictFilesToUnwatch = differenceSet(this.conflictFiles, newConflictFiles);
|
|
54
|
+
this.conflictFileWatcher.unwatch([...conflictFilesToUnwatch]);
|
|
55
|
+
this.conflictFiles = newConflictFiles;
|
|
56
|
+
}
|
|
57
|
+
async checkFileForConflicts(filePath) {
|
|
58
|
+
try {
|
|
59
|
+
if (filePath.endsWith('.conflict'))
|
|
60
|
+
return false;
|
|
61
|
+
const contents = await readFile(filePath, 'utf8').catch(handleFileNotFoundError);
|
|
62
|
+
return !contents?.includes('>>>>>>>');
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
this.logger.error(`Error reading file ${filePath}: ${String(err)}`);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async handleFileChange(filePath) {
|
|
70
|
+
const doesFileExist = await fileExists(filePath);
|
|
71
|
+
const isResolved = !doesFileExist || (await this.checkFileForConflicts(filePath));
|
|
72
|
+
if (isResolved) {
|
|
73
|
+
await this.syncMetadataController.updateMetadata(produce((draft) => {
|
|
74
|
+
for (const packageInfo of Object.values(draft.packages)) {
|
|
75
|
+
const relativePath = path.relative(packageInfo.path, filePath);
|
|
76
|
+
const filesWithConflicts = packageInfo.result?.filesWithConflicts ?? [];
|
|
77
|
+
// strip the file from the list of conflicts
|
|
78
|
+
for (let i = filesWithConflicts.length - 1; i >= 0; i--) {
|
|
79
|
+
const conflictFile = filesWithConflicts[i];
|
|
80
|
+
// if the file is a generated-deleted or working-deleted conflict and it exists, consider it still unresolved
|
|
81
|
+
if ((conflictFile.conflictType === 'generated-deleted' ||
|
|
82
|
+
conflictFile.conflictType === 'working-deleted') &&
|
|
83
|
+
doesFileExist) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (conflictFile.generatedConflictRelativePath === relativePath ||
|
|
87
|
+
conflictFile.relativePath === relativePath) {
|
|
88
|
+
filesWithConflicts.splice(i, 1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
packageInfo.status = getPackageSyncStatusFromResult(packageInfo.result);
|
|
92
|
+
}
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* This method will start the monitor and watch for changes in the metadata.
|
|
98
|
+
*/
|
|
99
|
+
async start() {
|
|
100
|
+
const handleConflictFileChange = (event, filePath) => {
|
|
101
|
+
this.handleFileChange(filePath).catch((err) => {
|
|
102
|
+
this.logger.error(`Error handling conflict file change: ${String(err)}`);
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
this.conflictFileWatcher.on('all', handleConflictFileChange);
|
|
106
|
+
try {
|
|
107
|
+
const metadata = await this.syncMetadataController.getMetadata();
|
|
108
|
+
this.handleMetadataChange(metadata);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
this.logger.error(`Error getting initial metadata for conflict file monitor: ${String(err)}`);
|
|
112
|
+
}
|
|
113
|
+
this.unsubscribers.push(this.syncMetadataController.on('sync-metadata-changed', this.handleMetadataChange.bind(this)));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* This method will stop the monitor and close the watchers.
|
|
117
|
+
*/
|
|
118
|
+
async stop() {
|
|
119
|
+
for (const unsubscriber of this.unsubscribers) {
|
|
120
|
+
unsubscriber();
|
|
121
|
+
}
|
|
122
|
+
await this.conflictFileWatcher.close();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=conflict-file-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-file-monitor.js","sourceRoot":"","sources":["../../src/sync/conflict-file-monitor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,kBAAkB,GAAoB;IAC1C,gBAAgB,EAAE;QAChB,kBAAkB,EAAE,IAAI;KACzB;IACD,aAAa,EAAE,IAAI;IACnB,+EAA+E;IAC/E,uDAAuD;IACvD,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IAOpB;IACA;IAPV,8EAA8E;IACtE,mBAAmB,GAAG,KAAK,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACpD,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,aAAa,GAAmB,EAAE,CAAC;IAE3C,YACU,sBAA8C,EAC9C,MAAc;QADd,2BAAsB,GAAtB,sBAAsB,CAAwB;QAC9C,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEI,oBAAoB,CAAC,QAAsB;QACjD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC3C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC;gBAChD,gBAAgB,CAAC,GAAG,CAClB,IAAI,CAAC,IAAI,CACP,WAAW,CAAC,IAAI,EAChB,CAAC,CAAC,6BAA6B,IAAI,CAAC,CAAC,YAAY,CAClD,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,oBAAoB,GAAG,aAAa,CACxC,gBAAgB,EAChB,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC;QACxD,6DAA6D;QAC7D,+DAA+D;QAC/D,KAAK,MAAM,QAAQ,IAAI,oBAAoB,EAAE,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,wCAAwC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,sBAAsB,GAAG,aAAa,CAC1C,IAAI,CAAC,aAAa,EAClB,gBAAgB,CACjB,CAAC;QACF,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,QAAgB;QAClD,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,OAAO,KAAK,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CACrD,uBAAuB,CACxB,CAAC;YACF,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QAC7C,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,UAAU,GACd,CAAC,aAAa,IAAI,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEjE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAC9C,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChB,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC/D,MAAM,kBAAkB,GACtB,WAAW,CAAC,MAAM,EAAE,kBAAkB,IAAI,EAAE,CAAC;oBAC/C,4CAA4C;oBAC5C,KAAK,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBACxD,MAAM,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;wBAC3C,6GAA6G;wBAC7G,IACE,CAAC,YAAY,CAAC,YAAY,KAAK,mBAAmB;4BAChD,YAAY,CAAC,YAAY,KAAK,iBAAiB,CAAC;4BAClD,aAAa,EACb,CAAC;4BACD,SAAS;wBACX,CAAC;wBACD,IACE,YAAY,CAAC,6BAA6B,KAAK,YAAY;4BAC3D,YAAY,CAAC,YAAY,KAAK,YAAY,EAC1C,CAAC;4BACD,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAClC,CAAC;oBACH,CAAC;oBACD,WAAW,CAAC,MAAM,GAAG,8BAA8B,CACjD,WAAW,CAAC,MAAM,CACnB,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK;QAChB,MAAM,wBAAwB,GAAG,CAC/B,KAAa,EACb,QAAgB,EACV,EAAE;YACR,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,wCAAwC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QAE7D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;YACjE,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,6DAA6D,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAC5B,uBAAuB,EACvB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CACrC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI;QACf,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9C,YAAY,EAAE,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AppEntry } from '@baseplate-dev/project-builder-lib';
|
|
2
|
+
import type { GeneratorEntry, GeneratorOutput, Logger, PreviousGeneratedPayload, TemplateMetadataOptions } from '@baseplate-dev/sync';
|
|
3
|
+
import { buildGeneratorEntry, executeGeneratorEntry, writeGeneratorOutput } from '@baseplate-dev/sync';
|
|
4
|
+
import type { BaseplateUserConfig } from '#src/user-config/user-config-schema.js';
|
|
5
|
+
import type { PackageSyncResult } from './sync-metadata.js';
|
|
6
|
+
import { writeGeneratorSteps } from './generator-steps-writer.js';
|
|
7
|
+
interface GenerateForDirectoryOptions {
|
|
8
|
+
baseDirectory: string;
|
|
9
|
+
appEntry: AppEntry;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
writeTemplateMetadataOptions?: TemplateMetadataOptions;
|
|
12
|
+
userConfig: BaseplateUserConfig;
|
|
13
|
+
previousPackageSyncResult: PackageSyncResult | undefined;
|
|
14
|
+
operations?: GeneratorOperations;
|
|
15
|
+
abortSignal?: AbortSignal;
|
|
16
|
+
skipCommands?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface GeneratorOperations {
|
|
19
|
+
buildGeneratorEntry: typeof buildGeneratorEntry;
|
|
20
|
+
executeGeneratorEntry: typeof executeGeneratorEntry;
|
|
21
|
+
getPreviousGeneratedPayload: typeof getPreviousGeneratedPayload;
|
|
22
|
+
writeGeneratorOutput: typeof writeGeneratorOutput;
|
|
23
|
+
writeMetadata: (project: GeneratorEntry, output: GeneratorOutput, projectDirectory: string) => Promise<void>;
|
|
24
|
+
writeGeneratorSteps: typeof writeGeneratorSteps;
|
|
25
|
+
}
|
|
26
|
+
declare function getPreviousGeneratedPayload(projectDirectory: string): Promise<PreviousGeneratedPayload | undefined>;
|
|
27
|
+
export declare function generateForDirectory({ baseDirectory, appEntry, logger, writeTemplateMetadataOptions, userConfig, previousPackageSyncResult, operations, abortSignal, skipCommands, }: GenerateForDirectoryOptions): Promise<PackageSyncResult>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=generate-for-directory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-for-directory.d.ts","sourceRoot":"","sources":["../../src/sync/generate-for-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAEV,cAAc,EACd,eAAe,EACf,MAAM,EACN,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EAInB,qBAAqB,EACrB,oBAAoB,EAGrB,MAAM,qBAAqB,CAAC;AAa7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAElF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,UAAU,2BAA2B;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B,CAAC,EAAE,uBAAuB,CAAC;IACvD,UAAU,EAAE,mBAAmB,CAAC;IAChC,yBAAyB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzD,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;IAChE,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,aAAa,EAAE,CACb,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,eAAe,EACvB,gBAAgB,EAAE,MAAM,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;CACjD;AAyCD,iBAAe,2BAA2B,CACxC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAe/C;AAED,wBAAsB,oBAAoB,CAAC,EACzC,aAAa,EACb,QAAQ,EACR,MAAM,EACN,4BAA4B,EAC5B,UAAU,EACV,yBAAyB,EACzB,UAAuC,EACvC,WAAW,EACX,YAAY,GACb,EAAE,2BAA2B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+H1D"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { buildGeneratorEntry, CancelledSyncError, createCodebaseFileReaderFromDirectory, deleteMetadataFiles, executeGeneratorEntry, writeGeneratorOutput, writeGeneratorsMetadata, writeTemplateMetadata, } from '@baseplate-dev/sync';
|
|
2
|
+
import { enhanceErrorWithContext, randomUid } from '@baseplate-dev/utils';
|
|
3
|
+
import { dirExists, handleFileNotFoundError, readJsonWithSchema, writeJson, } from '@baseplate-dev/utils/node';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { mkdir, rename, rm } from 'node:fs/promises';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { writeGeneratorSteps } from './generator-steps-writer.js';
|
|
9
|
+
const defaultGeneratorOperations = {
|
|
10
|
+
buildGeneratorEntry,
|
|
11
|
+
executeGeneratorEntry,
|
|
12
|
+
getPreviousGeneratedPayload,
|
|
13
|
+
writeGeneratorOutput,
|
|
14
|
+
writeMetadata: async (project, output, projectDirectory) => {
|
|
15
|
+
await deleteMetadataFiles(projectDirectory);
|
|
16
|
+
await writeGeneratorsMetadata(project, projectDirectory);
|
|
17
|
+
await writeTemplateMetadata(output.files, projectDirectory);
|
|
18
|
+
},
|
|
19
|
+
writeGeneratorSteps,
|
|
20
|
+
};
|
|
21
|
+
const GENERATED_DIRECTORY = 'baseplate/.clean';
|
|
22
|
+
const FILE_ID_MAP_PATH = 'baseplate/file-id-map.json';
|
|
23
|
+
async function getPreviousGeneratedFileIdMap(projectDirectory) {
|
|
24
|
+
const generatedFileIdMapPath = path.join(projectDirectory, FILE_ID_MAP_PATH);
|
|
25
|
+
try {
|
|
26
|
+
const fileIdMap = await readJsonWithSchema(generatedFileIdMapPath, z.record(z.string(), z.string())).catch(handleFileNotFoundError);
|
|
27
|
+
if (!fileIdMap) {
|
|
28
|
+
return new Map();
|
|
29
|
+
}
|
|
30
|
+
return new Map(Object.entries(fileIdMap));
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
throw enhanceErrorWithContext(err, `Failed to get previous generated file id map (${generatedFileIdMapPath})`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function getPreviousGeneratedPayload(projectDirectory) {
|
|
37
|
+
const generatedDirectory = path.join(projectDirectory, GENERATED_DIRECTORY);
|
|
38
|
+
const previousDirectoryExists = await dirExists(generatedDirectory);
|
|
39
|
+
if (!previousDirectoryExists) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const fileIdMap = await getPreviousGeneratedFileIdMap(projectDirectory);
|
|
43
|
+
return {
|
|
44
|
+
fileReader: createCodebaseFileReaderFromDirectory(generatedDirectory),
|
|
45
|
+
fileIdToRelativePathMap: fileIdMap,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export async function generateForDirectory({ baseDirectory, appEntry, logger, writeTemplateMetadataOptions, userConfig, previousPackageSyncResult, operations = defaultGeneratorOperations, abortSignal, skipCommands, }) {
|
|
49
|
+
const { appDirectory, name, generatorBundle } = appEntry;
|
|
50
|
+
const projectDirectory = path.join(baseDirectory, appDirectory);
|
|
51
|
+
logger.info(`Generating project ${name} in ${projectDirectory}...`);
|
|
52
|
+
const project = await operations.buildGeneratorEntry(generatorBundle);
|
|
53
|
+
const output = await operations.executeGeneratorEntry(project, {
|
|
54
|
+
templateMetadataOptions: writeTemplateMetadataOptions,
|
|
55
|
+
});
|
|
56
|
+
if (abortSignal?.aborted)
|
|
57
|
+
throw new CancelledSyncError();
|
|
58
|
+
logger.info('Project built! Writing output....');
|
|
59
|
+
// load clean directory contents
|
|
60
|
+
const previousGeneratedPayload = await operations.getPreviousGeneratedPayload(projectDirectory);
|
|
61
|
+
if (previousGeneratedPayload) {
|
|
62
|
+
logger.debug('Detected generated folder. Attempting 3-way merge...');
|
|
63
|
+
}
|
|
64
|
+
const generatedTemporaryDirectory = path.join(projectDirectory, 'baseplate/build/generated_tmp');
|
|
65
|
+
await mkdir(generatedTemporaryDirectory, { recursive: true });
|
|
66
|
+
try {
|
|
67
|
+
const { failedCommands, filesWithConflicts, fileIdToRelativePathMap } = await operations.writeGeneratorOutput(output, projectDirectory, {
|
|
68
|
+
previousGeneratedPayload,
|
|
69
|
+
generatedContentsDirectory: generatedTemporaryDirectory,
|
|
70
|
+
rerunCommands: previousPackageSyncResult?.failedCommands?.map((c) => c.command),
|
|
71
|
+
logger,
|
|
72
|
+
mergeDriver: userConfig.sync?.customMergeDriver
|
|
73
|
+
? {
|
|
74
|
+
name: 'baseplate-custom-merge-driver',
|
|
75
|
+
driver: userConfig.sync.customMergeDriver,
|
|
76
|
+
}
|
|
77
|
+
: undefined,
|
|
78
|
+
abortSignal,
|
|
79
|
+
skipCommands,
|
|
80
|
+
});
|
|
81
|
+
// write metadata to the generated directory
|
|
82
|
+
if (writeTemplateMetadataOptions?.includeTemplateMetadata) {
|
|
83
|
+
await operations.writeMetadata(project, output, projectDirectory);
|
|
84
|
+
}
|
|
85
|
+
// swap out generated directory with generated_tmp
|
|
86
|
+
const generatedDirectory = path.join(projectDirectory, GENERATED_DIRECTORY);
|
|
87
|
+
if (previousGeneratedPayload) {
|
|
88
|
+
await rm(generatedDirectory, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
await rename(generatedTemporaryDirectory, generatedDirectory);
|
|
91
|
+
// Write file ID map
|
|
92
|
+
const fileIdMap = Object.fromEntries([...fileIdToRelativePathMap.entries()].sort(([a], [b]) => a.localeCompare(b)));
|
|
93
|
+
await writeJson(path.join(projectDirectory, FILE_ID_MAP_PATH), fileIdMap);
|
|
94
|
+
// Write generator steps
|
|
95
|
+
if (userConfig.sync?.writeGeneratorStepsJson && output.metadata) {
|
|
96
|
+
await operations.writeGeneratorSteps(output.metadata, projectDirectory);
|
|
97
|
+
}
|
|
98
|
+
// List out conflicts
|
|
99
|
+
function warnAboutConflicts(conflicts, message) {
|
|
100
|
+
if (conflicts.length === 0) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
logger.warn(chalk.red(`${message}\n${conflicts.map((f) => f.relativePath).join('\n')}`));
|
|
104
|
+
}
|
|
105
|
+
warnAboutConflicts(filesWithConflicts.filter((f) => f.conflictType === 'merge-conflict'), 'Merge conflicts occurred while writing files:');
|
|
106
|
+
warnAboutConflicts(filesWithConflicts.filter((f) => f.conflictType === 'generated-deleted'), 'Files were deleted in the new generation but were modified by user so could not be automatically deleted:');
|
|
107
|
+
warnAboutConflicts(filesWithConflicts.filter((f) => f.conflictType === 'working-deleted'), 'Files were deleted by user but were added back in the new generation so should be reviewed:');
|
|
108
|
+
if (failedCommands.length > 0) {
|
|
109
|
+
logger.error(`Project successfully written but with failed commands! Please check logs for more info.`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
logger.info('Project successfully generated!');
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
filesWithConflicts,
|
|
116
|
+
failedCommands: failedCommands.map((c) => ({
|
|
117
|
+
id: randomUid(),
|
|
118
|
+
command: c.command,
|
|
119
|
+
workingDir: c.workingDir,
|
|
120
|
+
output: c.output,
|
|
121
|
+
})),
|
|
122
|
+
completedAt: new Date().toISOString(),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
// attempt to remove any temporary directory
|
|
127
|
+
await rm(generatedTemporaryDirectory, { recursive: true }).catch(() => {
|
|
128
|
+
/* ignore errors */
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=generate-for-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-for-directory.js","sourceRoot":"","sources":["../../src/sync/generate-for-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-steps-writer.d.ts","sourceRoot":"","sources":["../../src/sync/generator-steps-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAKnE,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,uBAAuB,EACjC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function writeGeneratorSteps(metadata, outputDirectory) {
|
|
4
|
+
await fs.writeFile(path.join(outputDirectory, 'baseplate/build/generator-steps.json'), JSON.stringify(metadata, null, 2));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=generator-steps-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-steps-writer.js","sourceRoot":"","sources":["../../src/sync/generator-steps-writer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAiC,EACjC,eAAuB;IAEvB,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,sCAAsC,CAAC,EAClE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Logger } from '@baseplate-dev/sync';
|
|
2
|
+
import { TypedEventEmitter } from '@baseplate-dev/utils';
|
|
3
|
+
import { type PackageSyncInfo, type SyncMetadata } from './sync-metadata.js';
|
|
4
|
+
/**
|
|
5
|
+
* Controller for getting updates about the latest sync metadata.
|
|
6
|
+
* Uses throttling to coalesce multiple write calls into a single save.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SyncMetadataController extends TypedEventEmitter<{
|
|
9
|
+
['sync-metadata-changed']: SyncMetadata;
|
|
10
|
+
}> {
|
|
11
|
+
protected readonly projectDirectory: string;
|
|
12
|
+
protected logger: Logger;
|
|
13
|
+
protected options: {
|
|
14
|
+
disableThrottling?: boolean;
|
|
15
|
+
};
|
|
16
|
+
protected syncMetadata: SyncMetadata | undefined;
|
|
17
|
+
private readonly throttledWrite;
|
|
18
|
+
constructor(projectDirectory: string, logger: Logger, options?: {
|
|
19
|
+
disableThrottling?: boolean;
|
|
20
|
+
});
|
|
21
|
+
private getMetadataPath;
|
|
22
|
+
readSyncMetadata(): Promise<SyncMetadata>;
|
|
23
|
+
watchMetadata(): () => void;
|
|
24
|
+
getMetadata(): Promise<SyncMetadata>;
|
|
25
|
+
writeMetadata(syncMetadata: SyncMetadata): void;
|
|
26
|
+
updateMetadataForPackage(packageId: string, update: (metadata: PackageSyncInfo) => PackageSyncInfo): Promise<void>;
|
|
27
|
+
updateMetadata(update: (metadata: SyncMetadata) => SyncMetadata): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sync-metadata-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-metadata-controller.d.ts","sourceRoot":"","sources":["../../src/sync/sync-metadata-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAEL,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB,CAAC;IAC5D,CAAC,uBAAuB,CAAC,EAAE,YAAY,CAAC;CACzC,CAAC;IAME,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM;IAC3C,SAAS,CAAC,MAAM,EAAE,MAAM;IACxB,SAAS,CAAC,OAAO,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE;IAPpD,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IAEjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;gBAG7C,gBAAgB,EAAE,MAAM,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAO;IAiBzD,OAAO,CAAC,eAAe;IAIjB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC;IAgB/C,aAAa,IAAI,MAAM,IAAI;IAyBrB,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAM1C,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAKzC,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GACrD,OAAO,CAAC,IAAI,CAAC;IAiBV,cAAc,CAClB,MAAM,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,YAAY,GAC/C,OAAO,CAAC,IAAI,CAAC;CAKjB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { enhanceErrorWithContext, TypedEventEmitter, } from '@baseplate-dev/utils';
|
|
2
|
+
import { watch } from 'chokidar';
|
|
3
|
+
import { isEqual, throttle } from 'es-toolkit';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { readSyncMetadata, SYNC_METADATA_PATH, writeSyncMetadata, } from './sync-metadata-service.js';
|
|
6
|
+
import { INITIAL_SYNC_METADATA, } from './sync-metadata.js';
|
|
7
|
+
/**
|
|
8
|
+
* Controller for getting updates about the latest sync metadata.
|
|
9
|
+
* Uses throttling to coalesce multiple write calls into a single save.
|
|
10
|
+
*/
|
|
11
|
+
export class SyncMetadataController extends TypedEventEmitter {
|
|
12
|
+
projectDirectory;
|
|
13
|
+
logger;
|
|
14
|
+
options;
|
|
15
|
+
syncMetadata;
|
|
16
|
+
throttledWrite;
|
|
17
|
+
constructor(projectDirectory, logger, options = {}) {
|
|
18
|
+
super();
|
|
19
|
+
this.projectDirectory = projectDirectory;
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
this.options = options;
|
|
22
|
+
const writeCallback = (metadata) => {
|
|
23
|
+
// we emit the event before writing since we cache the metadata in memory
|
|
24
|
+
this.emit('sync-metadata-changed', metadata);
|
|
25
|
+
writeSyncMetadata(this.projectDirectory, metadata).catch((err) => {
|
|
26
|
+
this.logger.error(`Failed to write metadata: ${String(err)}`);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
this.throttledWrite = options.disableThrottling
|
|
30
|
+
? writeCallback
|
|
31
|
+
: throttle(writeCallback, 100);
|
|
32
|
+
}
|
|
33
|
+
getMetadataPath() {
|
|
34
|
+
return path.resolve(this.projectDirectory, SYNC_METADATA_PATH);
|
|
35
|
+
}
|
|
36
|
+
async readSyncMetadata() {
|
|
37
|
+
return readSyncMetadata(this.projectDirectory).catch((err) => {
|
|
38
|
+
if (err instanceof TypeError) {
|
|
39
|
+
this.logger.warn(`Invalid sync metadata found in ${this.getMetadataPath()}. Will use default metadata instead.`);
|
|
40
|
+
this.logger.warn(err.message);
|
|
41
|
+
return structuredClone(INITIAL_SYNC_METADATA);
|
|
42
|
+
}
|
|
43
|
+
throw enhanceErrorWithContext(err, `Failed to read sync metadata from ${this.getMetadataPath()}`);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
watchMetadata() {
|
|
47
|
+
const watcher = watch(this.getMetadataPath(), { awaitWriteFinish: true });
|
|
48
|
+
const handleMetadataChange = () => {
|
|
49
|
+
this.readSyncMetadata()
|
|
50
|
+
.then((metadata) => {
|
|
51
|
+
if (!isEqual(metadata, this.syncMetadata)) {
|
|
52
|
+
this.syncMetadata = metadata;
|
|
53
|
+
this.emit('sync-metadata-changed', metadata);
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
.catch((err) => {
|
|
57
|
+
this.logger.error(`Failed to update sync metadata: ${String(err)}`);
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
watcher.on('all', handleMetadataChange);
|
|
61
|
+
return () => {
|
|
62
|
+
watcher.close().catch((err) => {
|
|
63
|
+
this.logger.error(`Failed to close metadata watcher: ${String(err)}`);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async getMetadata() {
|
|
68
|
+
this.syncMetadata ??= await this.readSyncMetadata();
|
|
69
|
+
return this.syncMetadata;
|
|
70
|
+
}
|
|
71
|
+
writeMetadata(syncMetadata) {
|
|
72
|
+
this.syncMetadata = syncMetadata;
|
|
73
|
+
this.throttledWrite(syncMetadata);
|
|
74
|
+
}
|
|
75
|
+
async updateMetadataForPackage(packageId, update) {
|
|
76
|
+
const metadata = await this.getMetadata();
|
|
77
|
+
if (!(packageId in metadata.packages)) {
|
|
78
|
+
throw new Error(`No package metadata found for ${packageId}`);
|
|
79
|
+
}
|
|
80
|
+
const updatedMetadata = {
|
|
81
|
+
...metadata,
|
|
82
|
+
packages: {
|
|
83
|
+
...metadata.packages,
|
|
84
|
+
[packageId]: update(metadata.packages[packageId]),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
this.writeMetadata(updatedMetadata);
|
|
88
|
+
}
|
|
89
|
+
async updateMetadata(update) {
|
|
90
|
+
const metadata = await this.getMetadata();
|
|
91
|
+
const updatedMetadata = update(metadata);
|
|
92
|
+
this.writeMetadata(updatedMetadata);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=sync-metadata-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-metadata-controller.js","sourceRoot":"","sources":["../../src/sync/sync-metadata-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SyncMetadata } from './sync-metadata.js';
|
|
2
|
+
/**
|
|
3
|
+
* The path to the sync metadata file.
|
|
4
|
+
*/
|
|
5
|
+
export declare const SYNC_METADATA_PATH: string;
|
|
6
|
+
/**
|
|
7
|
+
* Reads the sync metadata from the project directory.
|
|
8
|
+
*
|
|
9
|
+
* @param projectDirectory The directory of the project.
|
|
10
|
+
* @returns The sync metadata or a default object if the file does not exist.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readSyncMetadata(projectDirectory: string): Promise<SyncMetadata>;
|
|
13
|
+
/**
|
|
14
|
+
* Writes the sync metadata to the project directory.
|
|
15
|
+
*
|
|
16
|
+
* @param projectDirectory The directory of the project.
|
|
17
|
+
* @param syncMetadata The sync metadata to write.
|
|
18
|
+
*/
|
|
19
|
+
export declare function writeSyncMetadata(projectDirectory: string, syncMetadata: SyncMetadata): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=sync-metadata-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-metadata-service.d.ts","sourceRoot":"","sources":["../../src/sync/sync-metadata-service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAI9B,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,YAAY,CAAC,CAQvB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { handleFileNotFoundError, readJsonWithSchema, writeStablePrettyJson, } from '@baseplate-dev/utils/node';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { INITIAL_SYNC_METADATA, syncMetadataSchema } from './sync-metadata.js';
|
|
5
|
+
/**
|
|
6
|
+
* The path to the sync metadata file.
|
|
7
|
+
*/
|
|
8
|
+
export const SYNC_METADATA_PATH = path.join('baseplate', '.build', 'sync_result.json');
|
|
9
|
+
/**
|
|
10
|
+
* Reads the sync metadata from the project directory.
|
|
11
|
+
*
|
|
12
|
+
* @param projectDirectory The directory of the project.
|
|
13
|
+
* @returns The sync metadata or a default object if the file does not exist.
|
|
14
|
+
*/
|
|
15
|
+
export async function readSyncMetadata(projectDirectory) {
|
|
16
|
+
const syncMetadataPath = path.join(projectDirectory, SYNC_METADATA_PATH);
|
|
17
|
+
const syncMetadata = await readJsonWithSchema(syncMetadataPath, syncMetadataSchema).catch(handleFileNotFoundError);
|
|
18
|
+
return syncMetadata ?? structuredClone(INITIAL_SYNC_METADATA);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Writes the sync metadata to the project directory.
|
|
22
|
+
*
|
|
23
|
+
* @param projectDirectory The directory of the project.
|
|
24
|
+
* @param syncMetadata The sync metadata to write.
|
|
25
|
+
*/
|
|
26
|
+
export async function writeSyncMetadata(projectDirectory, syncMetadata) {
|
|
27
|
+
const syncMetadataPath = path.join(projectDirectory, SYNC_METADATA_PATH);
|
|
28
|
+
await mkdir(path.dirname(syncMetadataPath), { recursive: true });
|
|
29
|
+
await writeStablePrettyJson(syncMetadataPath, syncMetadata);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sync-metadata-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-metadata-service.js","sourceRoot":"","sources":["../../src/sync/sync-metadata-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CACzC,WAAW,EACX,QAAQ,EACR,kBAAkB,CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,gBAAwB;IAExB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,gBAAgB,EAChB,kBAAkB,CACnB,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEjC,OAAO,YAAY,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,gBAAwB,EACxB,YAA0B;IAE1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACzE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC"}
|