@baseplate-dev/project-builder-server 0.2.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/api/index.d.ts +3 -3
  2. package/dist/api/sync.d.ts +3 -3
  3. package/dist/compiler/app-entry-builder.d.ts.map +1 -1
  4. package/dist/compiler/app-entry-builder.js +3 -5
  5. package/dist/compiler/app-entry-builder.js.map +1 -1
  6. package/dist/compiler/web/index.d.ts.map +1 -1
  7. package/dist/compiler/web/index.js +2 -1
  8. package/dist/compiler/web/index.js.map +1 -1
  9. package/dist/diff/diff-project.d.ts.map +1 -1
  10. package/dist/diff/diff-project.js +22 -5
  11. package/dist/diff/diff-project.js.map +1 -1
  12. package/dist/diff/diff-utils.d.ts +7 -3
  13. package/dist/diff/diff-utils.d.ts.map +1 -1
  14. package/dist/diff/diff-utils.js +80 -22
  15. package/dist/diff/diff-utils.js.map +1 -1
  16. package/dist/diff/index.d.ts +1 -0
  17. package/dist/diff/index.d.ts.map +1 -1
  18. package/dist/diff/index.js +1 -0
  19. package/dist/diff/index.js.map +1 -1
  20. package/dist/diff/snapshot/apply-diff-to-file-contents.d.ts +3 -0
  21. package/dist/diff/snapshot/apply-diff-to-file-contents.d.ts.map +1 -0
  22. package/dist/diff/snapshot/apply-diff-to-file-contents.js +26 -0
  23. package/dist/diff/snapshot/apply-diff-to-file-contents.js.map +1 -0
  24. package/dist/diff/snapshot/apply-diff-to-generator-output.d.ts +4 -0
  25. package/dist/diff/snapshot/apply-diff-to-generator-output.d.ts.map +1 -0
  26. package/dist/diff/snapshot/apply-diff-to-generator-output.js +28 -0
  27. package/dist/diff/snapshot/apply-diff-to-generator-output.js.map +1 -0
  28. package/dist/diff/snapshot/create-snapshot-for-project.d.ts +41 -0
  29. package/dist/diff/snapshot/create-snapshot-for-project.d.ts.map +1 -0
  30. package/dist/diff/snapshot/create-snapshot-for-project.js +48 -0
  31. package/dist/diff/snapshot/create-snapshot-for-project.js.map +1 -0
  32. package/dist/diff/snapshot/index.d.ts +6 -0
  33. package/dist/diff/snapshot/index.d.ts.map +1 -0
  34. package/dist/diff/snapshot/index.js +5 -0
  35. package/dist/diff/snapshot/index.js.map +1 -0
  36. package/dist/diff/snapshot/save-snapshot.d.ts +25 -0
  37. package/dist/diff/snapshot/save-snapshot.d.ts.map +1 -0
  38. package/dist/diff/snapshot/save-snapshot.js +55 -0
  39. package/dist/diff/snapshot/save-snapshot.js.map +1 -0
  40. package/dist/diff/snapshot/snapshot-diff-utils.d.ts +7 -0
  41. package/dist/diff/snapshot/snapshot-diff-utils.d.ts.map +1 -0
  42. package/dist/diff/snapshot/snapshot-diff-utils.js +20 -0
  43. package/dist/diff/snapshot/snapshot-diff-utils.js.map +1 -0
  44. package/dist/diff/snapshot/snapshot-management.d.ts +31 -0
  45. package/dist/diff/snapshot/snapshot-management.d.ts.map +1 -0
  46. package/dist/diff/snapshot/snapshot-management.js +154 -0
  47. package/dist/diff/snapshot/snapshot-management.js.map +1 -0
  48. package/dist/diff/snapshot/snapshot-manifest.d.ts +40 -0
  49. package/dist/diff/snapshot/snapshot-manifest.d.ts.map +1 -0
  50. package/dist/diff/snapshot/snapshot-manifest.js +113 -0
  51. package/dist/diff/snapshot/snapshot-manifest.js.map +1 -0
  52. package/dist/diff/snapshot/snapshot-types.d.ts +165 -0
  53. package/dist/diff/snapshot/snapshot-types.d.ts.map +1 -0
  54. package/dist/diff/snapshot/snapshot-types.js +23 -0
  55. package/dist/diff/snapshot/snapshot-types.js.map +1 -0
  56. package/dist/diff/snapshot/snapshot-utils.d.ts +20 -0
  57. package/dist/diff/snapshot/snapshot-utils.d.ts.map +1 -0
  58. package/dist/diff/snapshot/snapshot-utils.js +51 -0
  59. package/dist/diff/snapshot/snapshot-utils.js.map +1 -0
  60. package/dist/diff/types.d.ts +38 -6
  61. package/dist/diff/types.d.ts.map +1 -1
  62. package/dist/project-definition/get-single-app-directory-for-project.d.ts +11 -0
  63. package/dist/project-definition/get-single-app-directory-for-project.d.ts.map +1 -0
  64. package/dist/project-definition/get-single-app-directory-for-project.js +18 -0
  65. package/dist/project-definition/get-single-app-directory-for-project.js.map +1 -0
  66. package/dist/project-definition/index.d.ts +2 -0
  67. package/dist/project-definition/index.d.ts.map +1 -0
  68. package/dist/project-definition/index.js +2 -0
  69. package/dist/project-definition/index.js.map +1 -0
  70. package/dist/project-definition/load-project-definition.d.ts +12 -0
  71. package/dist/project-definition/load-project-definition.d.ts.map +1 -0
  72. package/dist/project-definition/load-project-definition.js +34 -0
  73. package/dist/project-definition/load-project-definition.js.map +1 -0
  74. package/dist/server/plugin.js +6 -6
  75. package/dist/server/plugin.js.map +1 -1
  76. package/dist/sync/generate-for-directory.d.ts +5 -14
  77. package/dist/sync/generate-for-directory.d.ts.map +1 -1
  78. package/dist/sync/generate-for-directory.js +37 -30
  79. package/dist/sync/generate-for-directory.js.map +1 -1
  80. package/dist/sync/get-previous-generated-payload.d.ts +9 -0
  81. package/dist/sync/get-previous-generated-payload.d.ts.map +1 -0
  82. package/dist/sync/get-previous-generated-payload.js +23 -0
  83. package/dist/sync/get-previous-generated-payload.js.map +1 -0
  84. package/dist/sync/sync-project.d.ts +7 -3
  85. package/dist/sync/sync-project.d.ts.map +1 -1
  86. package/dist/sync/sync-project.js +5 -29
  87. package/dist/sync/sync-project.js.map +1 -1
  88. package/dist/sync/types.d.ts +14 -0
  89. package/dist/sync/types.d.ts.map +1 -0
  90. package/dist/sync/types.js +15 -0
  91. package/dist/sync/types.js.map +1 -0
  92. package/package.json +12 -11
@@ -0,0 +1,48 @@
1
+ import { buildGeneratorEntry, executeGeneratorEntry, formatGeneratorOutput, loadIgnorePatterns, } from '@baseplate-dev/sync';
2
+ import path from 'node:path';
3
+ import { compileApplications } from '#src/compiler/index.js';
4
+ import { loadProjectDefinition } from '#src/project-definition/index.js';
5
+ import { createTemplateMetadataOptions } from '#src/sync/template-metadata-utils.js';
6
+ import { saveSnapshot } from './save-snapshot.js';
7
+ /**
8
+ * Creates a snapshot of the current diff state for a particular app
9
+ */
10
+ export async function createSnapshotForProject(options) {
11
+ const { projectDirectory: directory, app: appName, logger, context, useIgnoreFile = true, snapshotDir, } = options;
12
+ try {
13
+ logger.info('Loading project definition...');
14
+ const { definition: projectJson } = await loadProjectDefinition(directory, context);
15
+ logger.info('Compiling applications...');
16
+ const apps = compileApplications(projectJson, context);
17
+ // Filter apps if specified
18
+ const app = apps.find((app) => appName === app.name);
19
+ if (!app) {
20
+ throw new Error(`No applications found named ${appName}. Available apps: ${apps.map((a) => a.name).join(', ')}`);
21
+ }
22
+ const appDirectory = path.join(directory, app.appDirectory);
23
+ logger.info(`Creating snapshot for app: ${app.name} (${app.appDirectory})`);
24
+ // Load ignore patterns for this app directory
25
+ const ignoreInstance = useIgnoreFile
26
+ ? await loadIgnorePatterns(appDirectory)
27
+ : undefined;
28
+ // Generate the output without writing files
29
+ const generatorEntry = await buildGeneratorEntry(app.generatorBundle);
30
+ const generatorOutput = await executeGeneratorEntry(generatorEntry, {
31
+ templateMetadataOptions: createTemplateMetadataOptions(projectJson),
32
+ });
33
+ // Format the output
34
+ const formattedGeneratorOutput = await formatGeneratorOutput(generatorOutput, { outputDirectory: appDirectory });
35
+ // Create snapshot
36
+ const result = await saveSnapshot(appDirectory, formattedGeneratorOutput, {
37
+ snapshotDir,
38
+ ignoreInstance,
39
+ });
40
+ logger.info(`✓ Snapshot created at ${result.snapshotPath} (${result.fileCount.modified} modified, ${result.fileCount.added} added, ${result.fileCount.deleted} deleted)`);
41
+ logger.info('✓ Snapshots created successfully');
42
+ }
43
+ catch (error) {
44
+ logger.error(`Error creating snapshot: ${String(error)}`);
45
+ throw error;
46
+ }
47
+ }
48
+ //# sourceMappingURL=create-snapshot-for-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-snapshot-for-project.js","sourceRoot":"","sources":["../../../src/diff/snapshot/create-snapshot-for-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './apply-diff-to-file-contents.js';
2
+ export * from './apply-diff-to-generator-output.js';
3
+ export * from './create-snapshot-for-project.js';
4
+ export * from './snapshot-management.js';
5
+ export type * from './snapshot-types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/diff/snapshot/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,mBAAmB,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './apply-diff-to-file-contents.js';
2
+ export * from './apply-diff-to-generator-output.js';
3
+ export * from './create-snapshot-for-project.js';
4
+ export * from './snapshot-management.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/diff/snapshot/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Snapshot creation functionality
3
+ */
4
+ import type { GeneratorOutput } from '@baseplate-dev/sync';
5
+ import type ignore from 'ignore';
6
+ interface SaveSnapshotOptions {
7
+ ignoreInstance?: ignore.Ignore;
8
+ snapshotDir?: string;
9
+ }
10
+ interface SaveSnapshotResult {
11
+ /** Path to the created snapshot directory */
12
+ snapshotPath: string;
13
+ /** Number of files included in the snapshot */
14
+ fileCount: {
15
+ modified: number;
16
+ added: number;
17
+ deleted: number;
18
+ };
19
+ }
20
+ /**
21
+ * Creates a snapshot from the current diff state
22
+ */
23
+ export declare function saveSnapshot(directory: string, generatorOutput: GeneratorOutput, { ignoreInstance, snapshotDir }?: SaveSnapshotOptions): Promise<SaveSnapshotResult>;
24
+ export {};
25
+ //# sourceMappingURL=save-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-snapshot.d.ts","sourceRoot":"","sources":["../../../src/diff/snapshot/save-snapshot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAejC,UAAU,mBAAmB;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,kBAAkB;IAC1B,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,EAChC,EAAE,cAAc,EAAE,WAAW,EAAE,GAAE,mBAAwB,GACxD,OAAO,CAAC,kBAAkB,CAAC,CA+D7B"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Snapshot creation functionality
3
+ */
4
+ import { mkdir, rm } from 'node:fs/promises';
5
+ import { compareFiles } from '../diff-utils.js';
6
+ import { saveSnapshotDiffFile } from './snapshot-diff-utils.js';
7
+ import { saveSnapshotManifest } from './snapshot-manifest.js';
8
+ import { SNAPSHOT_VERSION } from './snapshot-types.js';
9
+ import { createSnapshotDirectory, pathToSafeDiffFilename, } from './snapshot-utils.js';
10
+ /**
11
+ * Creates a snapshot from the current diff state
12
+ */
13
+ export async function saveSnapshot(directory, generatorOutput, { ignoreInstance, snapshotDir } = {}) {
14
+ // Get current diff state
15
+ const diffSummary = await compareFiles(directory, generatorOutput, undefined, ignoreInstance);
16
+ // Create snapshot directory structure
17
+ const snapshotDirectory = await createSnapshotDirectory(directory, snapshotDir);
18
+ // Create manifest
19
+ const { diffs } = diffSummary;
20
+ // For now, we ignore binary modifications
21
+ const modifiedTextDiffs = diffs.filter((diff) => diff.type === 'modified' && !diff.isBinary);
22
+ const manifest = {
23
+ version: SNAPSHOT_VERSION,
24
+ files: {
25
+ modified: modifiedTextDiffs.map((diff) => ({
26
+ path: diff.path,
27
+ diffFile: pathToSafeDiffFilename(diff.path),
28
+ })),
29
+ added: diffs
30
+ .filter((diff) => diff.type === 'added')
31
+ .map((diff) => diff.path),
32
+ deleted: diffs
33
+ .filter((diff) => diff.type === 'deleted')
34
+ .map((diff) => diff.path),
35
+ },
36
+ };
37
+ // Clear out existing diffs
38
+ await rm(snapshotDirectory.diffsPath, { recursive: true });
39
+ await mkdir(snapshotDirectory.diffsPath, { recursive: true });
40
+ // Save diffs to diffs folder
41
+ for (const diff of modifiedTextDiffs) {
42
+ await saveSnapshotDiffFile(snapshotDirectory, diff.path, diff.generatedContent, diff.workingContent);
43
+ }
44
+ // Save manifest
45
+ await saveSnapshotManifest(snapshotDirectory, manifest);
46
+ return {
47
+ snapshotPath: snapshotDirectory.path,
48
+ fileCount: {
49
+ modified: manifest.files.modified.length,
50
+ added: manifest.files.added.length,
51
+ deleted: manifest.files.deleted.length,
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=save-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-snapshot.js","sourceRoot":"","sources":["../../../src/diff/snapshot/save-snapshot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAI7C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAkB7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,eAAgC,EAChC,EAAE,cAAc,EAAE,WAAW,KAA0B,EAAE;IAEzD,yBAAyB;IACzB,MAAM,WAAW,GAAG,MAAM,YAAY,CACpC,SAAS,EACT,eAAe,EACf,SAAS,EACT,cAAc,CACf,CAAC;IAEF,sCAAsC;IACtC,MAAM,iBAAiB,GAAG,MAAM,uBAAuB,CACrD,SAAS,EACT,WAAW,CACZ,CAAC;IAEF,kBAAkB;IAClB,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;IAE9B,0CAA0C;IAC1C,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CACpC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CACrD,CAAC;IACF,MAAM,QAAQ,GAAqB;QACjC,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE;YACL,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,KAAK,EAAE,KAAK;iBACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;iBACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,OAAO,EAAE,KAAK;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;iBACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5B;KACF,CAAC;IAEF,2BAA2B;IAC3B,MAAM,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,6BAA6B;IAC7B,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;QACrC,MAAM,oBAAoB,CACxB,iBAAiB,EACjB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,oBAAoB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAExD,OAAO;QACL,YAAY,EAAE,iBAAiB,CAAC,IAAI;QACpC,SAAS,EAAE;YACT,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;YACxC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;YAClC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM;SACvC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SnapshotDirectory } from './snapshot-types.js';
2
+ /**
3
+ * Creates and saves a diff file for a modified file
4
+ */
5
+ export declare function saveSnapshotDiffFile(snapshotDirectory: SnapshotDirectory, relativePath: string, generatedContent: string, workingContent: string): Promise<string>;
6
+ export declare function removeSnapshotDiffFile(snapshotDirectory: SnapshotDirectory, diffFileName: string): Promise<void>;
7
+ //# sourceMappingURL=snapshot-diff-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-diff-utils.d.ts","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-diff-utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,20 @@
1
+ import { createPatch } from 'diff';
2
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { pathToSafeDiffFilename } from './snapshot-utils.js';
5
+ /**
6
+ * Creates and saves a diff file for a modified file
7
+ */
8
+ export async function saveSnapshotDiffFile(snapshotDirectory, relativePath, generatedContent, workingContent) {
9
+ const diffContent = createPatch(relativePath, generatedContent, workingContent);
10
+ const diffFileName = pathToSafeDiffFilename(relativePath);
11
+ const diffFilePath = path.join(snapshotDirectory.diffsPath, diffFileName);
12
+ await mkdir(path.dirname(diffFilePath), { recursive: true });
13
+ await writeFile(diffFilePath, diffContent, 'utf8');
14
+ return diffFileName;
15
+ }
16
+ export async function removeSnapshotDiffFile(snapshotDirectory, diffFileName) {
17
+ const diffFilePath = path.join(snapshotDirectory.diffsPath, diffFileName);
18
+ await rm(diffFilePath);
19
+ }
20
+ //# sourceMappingURL=snapshot-diff-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-diff-utils.js","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-diff-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,iBAAoC,EACpC,YAAoB,EACpB,gBAAwB,EACxB,cAAsB;IAEtB,MAAM,WAAW,GAAG,WAAW,CAC7B,YAAY,EACZ,gBAAgB,EAChB,cAAc,CACf,CAAC;IACF,MAAM,YAAY,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAE1E,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAEnD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,iBAAoC,EACpC,YAAoB;IAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1E,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { SchemaParserContext } from '@baseplate-dev/project-builder-lib';
2
+ import type { Logger } from '@baseplate-dev/sync';
3
+ import type { GeneratorOperations } from '#src/sync/types.js';
4
+ export interface SnapshotManagementOptions {
5
+ projectDirectory: string;
6
+ appName: string;
7
+ snapshotDirectory?: string;
8
+ context: SchemaParserContext;
9
+ logger: Logger;
10
+ generatorOperations?: GeneratorOperations;
11
+ }
12
+ /**
13
+ * Adds files to snapshot
14
+ */
15
+ export declare function addFilesToSnapshot(relativePaths: string[], isDeleted: boolean, { projectDirectory, snapshotDirectory, appName, context, logger, generatorOperations, }: SnapshotManagementOptions): Promise<void>;
16
+ /**
17
+ * Removes files from snapshot
18
+ */
19
+ export declare function removeFilesFromSnapshot(relativePaths: string[], { projectDirectory, appName, snapshotDirectory, context, logger, }: SnapshotManagementOptions): Promise<void>;
20
+ export interface SnapshotListOptions {
21
+ projectDirectory: string;
22
+ appName: string;
23
+ snapshotDirectory?: string;
24
+ context: SchemaParserContext;
25
+ logger: Logger;
26
+ }
27
+ /**
28
+ * Lists snapshot contents
29
+ */
30
+ export declare function listSnapshotContents({ projectDirectory, snapshotDirectory, appName, context, logger, }: SnapshotListOptions): Promise<void>;
31
+ //# sourceMappingURL=snapshot-management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-management.d.ts","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-management.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAOlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAoB9D,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EAAE,EACvB,SAAS,EAAE,OAAO,EAClB,EACE,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,MAAM,EACN,mBAAkD,GACnD,EAAE,yBAAyB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiGf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EAAE,EACvB,EACE,gBAAgB,EAChB,OAAO,EACP,iBAAiB,EACjB,OAAO,EACP,MAAM,GACP,EAAE,yBAAyB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,EACzC,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,MAAM,GACP,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDrC"}
@@ -0,0 +1,154 @@
1
+ import { enhanceErrorWithContext } from '@baseplate-dev/utils';
2
+ import { handleFileNotFoundError } from '@baseplate-dev/utils/node';
3
+ import { readFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { compileApplications } from '#src/compiler/index.js';
6
+ import { getSingleAppDirectoryForProject } from '#src/project-definition/get-single-app-directory-for-project.js';
7
+ import { loadProjectDefinition } from '#src/project-definition/index.js';
8
+ import { createTemplateMetadataOptions } from '#src/sync/template-metadata-utils.js';
9
+ import { DEFAULT_GENERATOR_OPERATIONS } from '#src/sync/types.js';
10
+ import { removeSnapshotDiffFile, saveSnapshotDiffFile, } from './snapshot-diff-utils.js';
11
+ import { initializeSnapshotManifest, loadSnapshotManifest, saveSnapshotManifest, snapshotManifestUtils, } from './snapshot-manifest.js';
12
+ import { resolveSnapshotDirectory } from './snapshot-utils.js';
13
+ /**
14
+ * Adds files to snapshot
15
+ */
16
+ export async function addFilesToSnapshot(relativePaths, isDeleted, { projectDirectory, snapshotDirectory, appName, context, logger, generatorOperations = DEFAULT_GENERATOR_OPERATIONS, }) {
17
+ try {
18
+ const { definition } = await loadProjectDefinition(projectDirectory, context);
19
+ const compiledApps = compileApplications(definition, context);
20
+ const compiledApp = compiledApps.find((a) => a.name === appName);
21
+ if (!compiledApp) {
22
+ throw new Error(`App ${appName} not found`);
23
+ }
24
+ const appDirectory = path.join(projectDirectory, compiledApp.appDirectory);
25
+ const snapshotDirectories = resolveSnapshotDirectory(appDirectory, {
26
+ snapshotDir: snapshotDirectory,
27
+ });
28
+ logger.info(`Generating project to create snapshot...`);
29
+ const appEntry = await generatorOperations.buildGeneratorEntry(compiledApp.generatorBundle);
30
+ const { files: generatedFiles } = await generatorOperations.executeGeneratorEntry(appEntry, {
31
+ templateMetadataOptions: createTemplateMetadataOptions(definition),
32
+ });
33
+ // Load existing manifest
34
+ let manifest = (await loadSnapshotManifest(snapshotDirectories)) ??
35
+ initializeSnapshotManifest();
36
+ for (const relativePath of relativePaths) {
37
+ const absolutePath = path.join(appDirectory, relativePath);
38
+ if (isDeleted) {
39
+ if (!generatedFiles.get(relativePath)) {
40
+ throw new Error(`File not found in generated output: ${relativePath}`);
41
+ }
42
+ // Mark file as intentionally deleted
43
+ logger.info(`Adding deleted file to snapshot: ${relativePath}`);
44
+ manifest = snapshotManifestUtils.addDeletedFile(manifest, relativePath);
45
+ }
46
+ else {
47
+ // Add existing file with diff
48
+ const workingContent = await readFile(absolutePath, 'utf8').catch(handleFileNotFoundError);
49
+ if (!workingContent) {
50
+ throw new Error(`File not found: ${absolutePath}. Use --deleted flag for deleted files.`);
51
+ }
52
+ const generatedContent = generatedFiles.get(relativePath)?.contents;
53
+ if (generatedContent) {
54
+ if (Buffer.isBuffer(generatedContent)) {
55
+ throw new TypeError(`Diffing binary contents is not currently supported.`);
56
+ }
57
+ if (generatedContent === workingContent) {
58
+ logger.warn(`File ${relativePath} is unchanged. Skipping snapshot generation.`);
59
+ continue;
60
+ }
61
+ const diffFileName = await saveSnapshotDiffFile(snapshotDirectories, relativePath, generatedContent, workingContent);
62
+ manifest = snapshotManifestUtils.addModifiedFile(manifest, relativePath, diffFileName);
63
+ }
64
+ else {
65
+ // Mark file as added
66
+ manifest = snapshotManifestUtils.addAddedFile(manifest, relativePath);
67
+ }
68
+ logger.info(`Adding file to snapshot: ${relativePath}`);
69
+ }
70
+ }
71
+ // Save updated manifest
72
+ await saveSnapshotManifest(snapshotDirectories, manifest);
73
+ logger.info(`✓ Added ${relativePaths.length} file(s) to snapshot`);
74
+ }
75
+ catch (error) {
76
+ throw enhanceErrorWithContext(error, `Failed to add files to snapshot`);
77
+ }
78
+ }
79
+ /**
80
+ * Removes files from snapshot
81
+ */
82
+ export async function removeFilesFromSnapshot(relativePaths, { projectDirectory, appName, snapshotDirectory, context, logger, }) {
83
+ try {
84
+ const { definition } = await loadProjectDefinition(projectDirectory, context);
85
+ const appDirectory = getSingleAppDirectoryForProject(projectDirectory, definition, appName);
86
+ const snapshotDir = resolveSnapshotDirectory(appDirectory, {
87
+ snapshotDir: snapshotDirectory,
88
+ });
89
+ // Load existing manifest
90
+ let manifest = await loadSnapshotManifest(snapshotDir);
91
+ if (!manifest) {
92
+ throw new Error(`Snapshot not found at ${snapshotDir.path}`);
93
+ }
94
+ for (const relativePath of relativePaths) {
95
+ const modifiedFile = manifest.files.modified.find((entry) => entry.path === relativePath);
96
+ if (modifiedFile?.diffFile) {
97
+ await removeSnapshotDiffFile(snapshotDir, modifiedFile.diffFile);
98
+ }
99
+ manifest = snapshotManifestUtils.removeFile(manifest, relativePath);
100
+ }
101
+ // Save updated manifest
102
+ await saveSnapshotManifest(snapshotDir, manifest);
103
+ logger.info(`✓ Removed ${relativePaths.length} file(s) from snapshot`);
104
+ }
105
+ catch (error) {
106
+ logger.error(`Failed to remove files from snapshot: ${error.message}`);
107
+ throw error;
108
+ }
109
+ }
110
+ /**
111
+ * Lists snapshot contents
112
+ */
113
+ export async function listSnapshotContents({ projectDirectory, snapshotDirectory, appName, context, logger, }) {
114
+ try {
115
+ const { definition } = await loadProjectDefinition(projectDirectory, context);
116
+ const appDirectory = getSingleAppDirectoryForProject(projectDirectory, definition, appName);
117
+ const snapshotDir = resolveSnapshotDirectory(appDirectory, {
118
+ snapshotDir: snapshotDirectory,
119
+ });
120
+ // Load manifest
121
+ const manifest = await loadSnapshotManifest(snapshotDir);
122
+ if (!manifest) {
123
+ throw new Error(`Snapshot not found at ${snapshotDir.path}`);
124
+ }
125
+ logger.info(`Snapshot contents (${snapshotDir.path}):`);
126
+ if (manifest.files.modified.length > 0) {
127
+ logger.info(`\\nModified files (${manifest.files.modified.length}):`);
128
+ for (const entry of manifest.files.modified) {
129
+ logger.info(` ${entry.path}`);
130
+ }
131
+ }
132
+ if (manifest.files.added.length > 0) {
133
+ logger.info(`\\nAdded files (${manifest.files.added.length}):`);
134
+ for (const file of manifest.files.added) {
135
+ logger.info(` ${file}`);
136
+ }
137
+ }
138
+ if (manifest.files.deleted.length > 0) {
139
+ logger.info(`\\nDeleted files (${manifest.files.deleted.length}):`);
140
+ for (const file of manifest.files.deleted) {
141
+ logger.info(` ${file}`);
142
+ }
143
+ }
144
+ if (manifest.files.modified.length === 0 &&
145
+ manifest.files.added.length === 0 &&
146
+ manifest.files.deleted.length === 0) {
147
+ logger.info(' (empty)');
148
+ }
149
+ }
150
+ catch (error) {
151
+ throw enhanceErrorWithContext(error, `Failed to list snapshot contents`);
152
+ }
153
+ }
154
+ //# sourceMappingURL=snapshot-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-management.js","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { SnapshotDirectory, SnapshotManifest } from './snapshot-types.js';
2
+ /**
3
+ * Creates a new snapshot manifest
4
+ */
5
+ export declare function initializeSnapshotManifest(): SnapshotManifest;
6
+ /**
7
+ * Saves a manifest to the snapshot directory
8
+ */
9
+ export declare function saveSnapshotManifest(snapshotDirectory: SnapshotDirectory, manifest: SnapshotManifest): Promise<void>;
10
+ /**
11
+ * Loads a manifest from the snapshot directory
12
+ */
13
+ export declare function loadSnapshotManifest(snapshotDirectory: SnapshotDirectory): Promise<SnapshotManifest | undefined>;
14
+ /**
15
+ * Adds a modified file entry to the manifest
16
+ */
17
+ declare function addModifiedFile(manifest: SnapshotManifest, filePath: string, diffFile: string): SnapshotManifest;
18
+ /**
19
+ * Adds an added file to the manifest
20
+ */
21
+ declare function addAddedFile(manifest: SnapshotManifest, filePath: string): SnapshotManifest;
22
+ /**
23
+ * Adds a deleted file to the manifest
24
+ */
25
+ declare function addDeletedFile(manifest: SnapshotManifest, filePath: string): SnapshotManifest;
26
+ /**
27
+ * Removes a file from the manifest
28
+ */
29
+ declare function removeFile(manifest: SnapshotManifest, filePath: string): SnapshotManifest;
30
+ /**
31
+ * Utilities for working with snapshot manifests
32
+ */
33
+ export declare const snapshotManifestUtils: {
34
+ addModifiedFile: typeof addModifiedFile;
35
+ addAddedFile: typeof addAddedFile;
36
+ addDeletedFile: typeof addDeletedFile;
37
+ removeFile: typeof removeFile;
38
+ };
39
+ export {};
40
+ //# sourceMappingURL=snapshot-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-manifest.d.ts","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-manifest.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI/E;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,gBAAgB,CAS7D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAOvC;AAED;;GAEG;AACH,iBAAS,eAAe,CACtB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAWlB;AAED;;GAEG;AACH,iBAAS,YAAY,CACnB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAYlB;AAED;;GAEG;AACH,iBAAS,cAAc,CACrB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAYlB;AAED;;GAEG;AACH,iBAAS,UAAU,CACjB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAYlB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;CAMjC,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { stringifyPrettyStable } from '@baseplate-dev/utils';
2
+ import { handleFileNotFoundError, readJsonWithSchema, } from '@baseplate-dev/utils/node';
3
+ import { mkdir, writeFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { SNAPSHOT_VERSION, snapshotManifestSchema } from './snapshot-types.js';
6
+ /**
7
+ * Creates a new snapshot manifest
8
+ */
9
+ export function initializeSnapshotManifest() {
10
+ return {
11
+ version: SNAPSHOT_VERSION,
12
+ files: {
13
+ modified: [],
14
+ added: [],
15
+ deleted: [],
16
+ },
17
+ };
18
+ }
19
+ /**
20
+ * Saves a manifest to the snapshot directory
21
+ */
22
+ export async function saveSnapshotManifest(snapshotDirectory, manifest) {
23
+ const sortedManifest = {
24
+ version: manifest.version,
25
+ files: {
26
+ added: manifest.files.added.toSorted(),
27
+ deleted: manifest.files.deleted.toSorted(),
28
+ modified: manifest.files.modified.toSorted((a, b) => a.path.localeCompare(b.path)),
29
+ },
30
+ };
31
+ const manifestContent = stringifyPrettyStable(sortedManifest);
32
+ await mkdir(path.dirname(snapshotDirectory.manifestPath), {
33
+ recursive: true,
34
+ });
35
+ await writeFile(snapshotDirectory.manifestPath, manifestContent, 'utf8');
36
+ }
37
+ /**
38
+ * Loads a manifest from the snapshot directory
39
+ */
40
+ export async function loadSnapshotManifest(snapshotDirectory) {
41
+ const manifestData = await readJsonWithSchema(snapshotDirectory.manifestPath, snapshotManifestSchema).catch(handleFileNotFoundError);
42
+ return manifestData;
43
+ }
44
+ /**
45
+ * Adds a modified file entry to the manifest
46
+ */
47
+ function addModifiedFile(manifest, filePath, diffFile) {
48
+ return {
49
+ ...manifest,
50
+ files: {
51
+ ...manifest.files,
52
+ modified: [
53
+ ...manifest.files.modified.filter((entry) => entry.path !== filePath),
54
+ { path: filePath, diffFile },
55
+ ],
56
+ },
57
+ };
58
+ }
59
+ /**
60
+ * Adds an added file to the manifest
61
+ */
62
+ function addAddedFile(manifest, filePath) {
63
+ if (manifest.files.added.includes(filePath)) {
64
+ return manifest;
65
+ }
66
+ return {
67
+ ...manifest,
68
+ files: {
69
+ ...manifest.files,
70
+ added: [...manifest.files.added, filePath],
71
+ },
72
+ };
73
+ }
74
+ /**
75
+ * Adds a deleted file to the manifest
76
+ */
77
+ function addDeletedFile(manifest, filePath) {
78
+ if (manifest.files.deleted.includes(filePath)) {
79
+ return manifest;
80
+ }
81
+ return {
82
+ ...manifest,
83
+ files: {
84
+ ...manifest.files,
85
+ deleted: [...manifest.files.deleted, filePath],
86
+ },
87
+ };
88
+ }
89
+ /**
90
+ * Removes a file from the manifest
91
+ */
92
+ function removeFile(manifest, filePath) {
93
+ return {
94
+ ...manifest,
95
+ files: {
96
+ ...manifest.files,
97
+ modified: manifest.files.modified.filter((entry) => entry.path !== filePath),
98
+ added: manifest.files.added.filter((path) => path !== filePath),
99
+ deleted: manifest.files.deleted.filter((path) => path !== filePath),
100
+ },
101
+ };
102
+ }
103
+ /**
104
+ * Utilities for working with snapshot manifests
105
+ */
106
+ export const snapshotManifestUtils = {
107
+ // Immutable file operations (return new manifest)
108
+ addModifiedFile,
109
+ addAddedFile,
110
+ addDeletedFile,
111
+ removeFile,
112
+ };
113
+ //# sourceMappingURL=snapshot-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-manifest.js","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-manifest.ts"],"names":[],"mappings":"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"}