@baseplate-dev/project-builder-server 0.2.5 → 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 (132) 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 +1 -2
  4. package/dist/compiler/app-entry-builder.d.ts.map +1 -1
  5. package/dist/compiler/app-entry-builder.js +3 -5
  6. package/dist/compiler/app-entry-builder.js.map +1 -1
  7. package/dist/compiler/index.d.ts.map +1 -1
  8. package/dist/compiler/index.js +0 -4
  9. package/dist/compiler/index.js.map +1 -1
  10. package/dist/compiler/web/admin/crud/displays.d.ts +5 -0
  11. package/dist/compiler/web/admin/crud/displays.d.ts.map +1 -0
  12. package/dist/compiler/web/admin/crud/displays.js.map +1 -0
  13. package/dist/compiler/web/admin/crud/index.d.ts +5 -0
  14. package/dist/compiler/web/admin/crud/index.d.ts.map +1 -0
  15. package/dist/compiler/web/admin/crud/index.js.map +1 -0
  16. package/dist/compiler/web/admin/crud/inputs.d.ts +5 -0
  17. package/dist/compiler/web/admin/crud/inputs.d.ts.map +1 -0
  18. package/dist/compiler/web/admin/crud/inputs.js.map +1 -0
  19. package/dist/compiler/web/admin/index.d.ts +5 -0
  20. package/dist/compiler/web/admin/index.d.ts.map +1 -0
  21. package/dist/compiler/web/admin/index.js +10 -0
  22. package/dist/compiler/web/admin/index.js.map +1 -0
  23. package/dist/compiler/web/admin/sections.d.ts +5 -0
  24. package/dist/compiler/web/admin/sections.d.ts.map +1 -0
  25. package/dist/compiler/{admin → web/admin}/sections.js +2 -1
  26. package/dist/compiler/web/admin/sections.js.map +1 -0
  27. package/dist/compiler/web/index.d.ts.map +1 -1
  28. package/dist/compiler/web/index.js +72 -6
  29. package/dist/compiler/web/index.js.map +1 -1
  30. package/dist/diff/diff-project.d.ts.map +1 -1
  31. package/dist/diff/diff-project.js +22 -5
  32. package/dist/diff/diff-project.js.map +1 -1
  33. package/dist/diff/diff-utils.d.ts +7 -3
  34. package/dist/diff/diff-utils.d.ts.map +1 -1
  35. package/dist/diff/diff-utils.js +80 -22
  36. package/dist/diff/diff-utils.js.map +1 -1
  37. package/dist/diff/index.d.ts +1 -0
  38. package/dist/diff/index.d.ts.map +1 -1
  39. package/dist/diff/index.js +1 -0
  40. package/dist/diff/index.js.map +1 -1
  41. package/dist/diff/snapshot/apply-diff-to-file-contents.d.ts +3 -0
  42. package/dist/diff/snapshot/apply-diff-to-file-contents.d.ts.map +1 -0
  43. package/dist/diff/snapshot/apply-diff-to-file-contents.js +26 -0
  44. package/dist/diff/snapshot/apply-diff-to-file-contents.js.map +1 -0
  45. package/dist/diff/snapshot/apply-diff-to-generator-output.d.ts +4 -0
  46. package/dist/diff/snapshot/apply-diff-to-generator-output.d.ts.map +1 -0
  47. package/dist/diff/snapshot/apply-diff-to-generator-output.js +28 -0
  48. package/dist/diff/snapshot/apply-diff-to-generator-output.js.map +1 -0
  49. package/dist/diff/snapshot/create-snapshot-for-project.d.ts +41 -0
  50. package/dist/diff/snapshot/create-snapshot-for-project.d.ts.map +1 -0
  51. package/dist/diff/snapshot/create-snapshot-for-project.js +48 -0
  52. package/dist/diff/snapshot/create-snapshot-for-project.js.map +1 -0
  53. package/dist/diff/snapshot/index.d.ts +6 -0
  54. package/dist/diff/snapshot/index.d.ts.map +1 -0
  55. package/dist/diff/snapshot/index.js +5 -0
  56. package/dist/diff/snapshot/index.js.map +1 -0
  57. package/dist/diff/snapshot/save-snapshot.d.ts +25 -0
  58. package/dist/diff/snapshot/save-snapshot.d.ts.map +1 -0
  59. package/dist/diff/snapshot/save-snapshot.js +55 -0
  60. package/dist/diff/snapshot/save-snapshot.js.map +1 -0
  61. package/dist/diff/snapshot/snapshot-diff-utils.d.ts +7 -0
  62. package/dist/diff/snapshot/snapshot-diff-utils.d.ts.map +1 -0
  63. package/dist/diff/snapshot/snapshot-diff-utils.js +20 -0
  64. package/dist/diff/snapshot/snapshot-diff-utils.js.map +1 -0
  65. package/dist/diff/snapshot/snapshot-management.d.ts +31 -0
  66. package/dist/diff/snapshot/snapshot-management.d.ts.map +1 -0
  67. package/dist/diff/snapshot/snapshot-management.js +154 -0
  68. package/dist/diff/snapshot/snapshot-management.js.map +1 -0
  69. package/dist/diff/snapshot/snapshot-manifest.d.ts +40 -0
  70. package/dist/diff/snapshot/snapshot-manifest.d.ts.map +1 -0
  71. package/dist/diff/snapshot/snapshot-manifest.js +113 -0
  72. package/dist/diff/snapshot/snapshot-manifest.js.map +1 -0
  73. package/dist/diff/snapshot/snapshot-types.d.ts +165 -0
  74. package/dist/diff/snapshot/snapshot-types.d.ts.map +1 -0
  75. package/dist/diff/snapshot/snapshot-types.js +23 -0
  76. package/dist/diff/snapshot/snapshot-types.js.map +1 -0
  77. package/dist/diff/snapshot/snapshot-utils.d.ts +20 -0
  78. package/dist/diff/snapshot/snapshot-utils.d.ts.map +1 -0
  79. package/dist/diff/snapshot/snapshot-utils.js +51 -0
  80. package/dist/diff/snapshot/snapshot-utils.js.map +1 -0
  81. package/dist/diff/types.d.ts +38 -6
  82. package/dist/diff/types.d.ts.map +1 -1
  83. package/dist/project-definition/get-single-app-directory-for-project.d.ts +11 -0
  84. package/dist/project-definition/get-single-app-directory-for-project.d.ts.map +1 -0
  85. package/dist/project-definition/get-single-app-directory-for-project.js +18 -0
  86. package/dist/project-definition/get-single-app-directory-for-project.js.map +1 -0
  87. package/dist/project-definition/index.d.ts +2 -0
  88. package/dist/project-definition/index.d.ts.map +1 -0
  89. package/dist/project-definition/index.js +2 -0
  90. package/dist/project-definition/index.js.map +1 -0
  91. package/dist/project-definition/load-project-definition.d.ts +12 -0
  92. package/dist/project-definition/load-project-definition.d.ts.map +1 -0
  93. package/dist/project-definition/load-project-definition.js +34 -0
  94. package/dist/project-definition/load-project-definition.js.map +1 -0
  95. package/dist/server/plugin.js +6 -6
  96. package/dist/server/plugin.js.map +1 -1
  97. package/dist/sync/generate-for-directory.d.ts +5 -14
  98. package/dist/sync/generate-for-directory.d.ts.map +1 -1
  99. package/dist/sync/generate-for-directory.js +37 -30
  100. package/dist/sync/generate-for-directory.js.map +1 -1
  101. package/dist/sync/get-previous-generated-payload.d.ts +9 -0
  102. package/dist/sync/get-previous-generated-payload.d.ts.map +1 -0
  103. package/dist/sync/get-previous-generated-payload.js +23 -0
  104. package/dist/sync/get-previous-generated-payload.js.map +1 -0
  105. package/dist/sync/sync-project.d.ts +7 -3
  106. package/dist/sync/sync-project.d.ts.map +1 -1
  107. package/dist/sync/sync-project.js +5 -29
  108. package/dist/sync/sync-project.js.map +1 -1
  109. package/dist/sync/types.d.ts +14 -0
  110. package/dist/sync/types.d.ts.map +1 -0
  111. package/dist/sync/types.js +15 -0
  112. package/dist/sync/types.js.map +1 -0
  113. package/package.json +12 -11
  114. package/dist/compiler/admin/crud/displays.d.ts +0 -5
  115. package/dist/compiler/admin/crud/displays.d.ts.map +0 -1
  116. package/dist/compiler/admin/crud/displays.js.map +0 -1
  117. package/dist/compiler/admin/crud/index.d.ts +0 -5
  118. package/dist/compiler/admin/crud/index.d.ts.map +0 -1
  119. package/dist/compiler/admin/crud/index.js.map +0 -1
  120. package/dist/compiler/admin/crud/inputs.d.ts +0 -5
  121. package/dist/compiler/admin/crud/inputs.d.ts.map +0 -1
  122. package/dist/compiler/admin/crud/inputs.js.map +0 -1
  123. package/dist/compiler/admin/index.d.ts +0 -3
  124. package/dist/compiler/admin/index.d.ts.map +0 -1
  125. package/dist/compiler/admin/index.js +0 -102
  126. package/dist/compiler/admin/index.js.map +0 -1
  127. package/dist/compiler/admin/sections.d.ts +0 -5
  128. package/dist/compiler/admin/sections.d.ts.map +0 -1
  129. package/dist/compiler/admin/sections.js.map +0 -1
  130. /package/dist/compiler/{admin → web/admin}/crud/displays.js +0 -0
  131. /package/dist/compiler/{admin → web/admin}/crud/index.js +0 -0
  132. /package/dist/compiler/{admin → web/admin}/crud/inputs.js +0 -0
@@ -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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"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Types and interfaces for the structured directory snapshot system
3
+ */
4
+ import { z } from 'zod';
5
+ import type { FileDiff } from '../types.js';
6
+ export interface SnapshotManifest {
7
+ /** Version of the snapshot format */
8
+ version: string;
9
+ /** Categorized list of files in the snapshot */
10
+ files: SnapshotFiles;
11
+ }
12
+ export interface SnapshotFiles {
13
+ /** Files that were modified (have diffs stored) */
14
+ modified: ModifiedFileEntry[];
15
+ /** Files that were added (exist in generated but not working) */
16
+ added: string[];
17
+ /** Files that were deleted (exist in working but not generated) */
18
+ deleted: string[];
19
+ }
20
+ export interface ModifiedFileEntry {
21
+ /** Relative path to the file */
22
+ path: string;
23
+ /** Name of the diff file in the diffs/ directory */
24
+ diffFile: string;
25
+ }
26
+ export interface SnapshotDirectory {
27
+ /** Path to the snapshot directory */
28
+ path: string;
29
+ /** Path to the manifest.json file */
30
+ manifestPath: string;
31
+ /** Path to the diffs/ subdirectory */
32
+ diffsPath: string;
33
+ }
34
+ export interface SnapshotOptions {
35
+ /** Custom name for the snapshot directory (default: .baseplate-snapshot) */
36
+ snapshotDir?: string;
37
+ /** Whether to use strict comparison mode */
38
+ strict?: boolean;
39
+ }
40
+ export interface SnapshotComparison {
41
+ /** Files that have new differences not in the snapshot */
42
+ newDifferences: FileDiff[];
43
+ /** Files that match the expected snapshot */
44
+ expectedDifferences: FileDiff[];
45
+ /** Files that were expected in snapshot but are missing */
46
+ missingExpected: string[];
47
+ }
48
+ export interface CompareSnapshotResult {
49
+ /** Comparison results */
50
+ comparison: SnapshotComparison;
51
+ /** Whether the comparison passed (no new differences) */
52
+ passed: boolean;
53
+ /** Summary message describing the results */
54
+ summary: string;
55
+ }
56
+ export interface ApplySnapshotResult {
57
+ /** Number of patches successfully applied */
58
+ appliedPatches: number;
59
+ /** Number of patches that failed */
60
+ failedPatches: number;
61
+ /** Details of any failures */
62
+ failures: PatchFailure[];
63
+ }
64
+ export interface PatchFailure {
65
+ /** Path to the file that failed to patch */
66
+ filePath: string;
67
+ /** Error message describing the failure */
68
+ error: string;
69
+ /** The diff content that failed to apply */
70
+ diffContent: string;
71
+ }
72
+ export declare const SNAPSHOT_VERSION = "1";
73
+ export declare const DEFAULT_SNAPSHOT_DIR = ".baseplate-snapshot";
74
+ export declare const MANIFEST_FILENAME = "manifest.json";
75
+ export declare const DIFFS_DIRNAME = "diffs";
76
+ export declare const modifiedFileEntrySchema: z.ZodObject<{
77
+ path: z.ZodString;
78
+ diffFile: z.ZodString;
79
+ }, "strip", z.ZodTypeAny, {
80
+ path: string;
81
+ diffFile: string;
82
+ }, {
83
+ path: string;
84
+ diffFile: string;
85
+ }>;
86
+ export declare const snapshotFilesSchema: z.ZodObject<{
87
+ modified: z.ZodArray<z.ZodObject<{
88
+ path: z.ZodString;
89
+ diffFile: z.ZodString;
90
+ }, "strip", z.ZodTypeAny, {
91
+ path: string;
92
+ diffFile: string;
93
+ }, {
94
+ path: string;
95
+ diffFile: string;
96
+ }>, "many">;
97
+ added: z.ZodArray<z.ZodString, "many">;
98
+ deleted: z.ZodArray<z.ZodString, "many">;
99
+ }, "strip", z.ZodTypeAny, {
100
+ added: string[];
101
+ modified: {
102
+ path: string;
103
+ diffFile: string;
104
+ }[];
105
+ deleted: string[];
106
+ }, {
107
+ added: string[];
108
+ modified: {
109
+ path: string;
110
+ diffFile: string;
111
+ }[];
112
+ deleted: string[];
113
+ }>;
114
+ export declare const snapshotManifestSchema: z.ZodObject<{
115
+ version: z.ZodString;
116
+ files: z.ZodObject<{
117
+ modified: z.ZodArray<z.ZodObject<{
118
+ path: z.ZodString;
119
+ diffFile: z.ZodString;
120
+ }, "strip", z.ZodTypeAny, {
121
+ path: string;
122
+ diffFile: string;
123
+ }, {
124
+ path: string;
125
+ diffFile: string;
126
+ }>, "many">;
127
+ added: z.ZodArray<z.ZodString, "many">;
128
+ deleted: z.ZodArray<z.ZodString, "many">;
129
+ }, "strip", z.ZodTypeAny, {
130
+ added: string[];
131
+ modified: {
132
+ path: string;
133
+ diffFile: string;
134
+ }[];
135
+ deleted: string[];
136
+ }, {
137
+ added: string[];
138
+ modified: {
139
+ path: string;
140
+ diffFile: string;
141
+ }[];
142
+ deleted: string[];
143
+ }>;
144
+ }, "strip", z.ZodTypeAny, {
145
+ version: string;
146
+ files: {
147
+ added: string[];
148
+ modified: {
149
+ path: string;
150
+ diffFile: string;
151
+ }[];
152
+ deleted: string[];
153
+ };
154
+ }, {
155
+ version: string;
156
+ files: {
157
+ added: string[];
158
+ modified: {
159
+ path: string;
160
+ diffFile: string;
161
+ }[];
162
+ deleted: string[];
163
+ };
164
+ }>;
165
+ //# sourceMappingURL=snapshot-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-types.d.ts","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,iEAAiE;IACjE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,mBAAmB,EAAE,QAAQ,EAAE,CAAC;IAChC,2DAA2D;IAC3D,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,yBAAyB;IACzB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAC1D,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,eAAO,MAAM,aAAa,UAAU,CAAC;AAGrC,eAAO,MAAM,uBAAuB;;;;;;;;;EAGlC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI9B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGjC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Types and interfaces for the structured directory snapshot system
3
+ */
4
+ import { z } from 'zod';
5
+ export const SNAPSHOT_VERSION = '1';
6
+ export const DEFAULT_SNAPSHOT_DIR = '.baseplate-snapshot';
7
+ export const MANIFEST_FILENAME = 'manifest.json';
8
+ export const DIFFS_DIRNAME = 'diffs';
9
+ // Zod schemas for validation
10
+ export const modifiedFileEntrySchema = z.object({
11
+ path: z.string(),
12
+ diffFile: z.string(),
13
+ });
14
+ export const snapshotFilesSchema = z.object({
15
+ modified: z.array(modifiedFileEntrySchema),
16
+ added: z.array(z.string()),
17
+ deleted: z.array(z.string()),
18
+ });
19
+ export const snapshotManifestSchema = z.object({
20
+ version: z.string(),
21
+ files: snapshotFilesSchema,
22
+ });
23
+ //# sourceMappingURL=snapshot-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-types.js","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA+ExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC,6BAA6B;AAC7B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,mBAAmB;CAC3B,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { SnapshotDirectory, SnapshotOptions } from './snapshot-types.js';
2
+ /**
3
+ * Converts a file path to a safe filename for storing diffs
4
+ * Example: "src/components/button.tsx" -> "src_components_button.tsx.diff"
5
+ */
6
+ export declare function pathToSafeDiffFilename(filePath: string): string;
7
+ /**
8
+ * Converts a safe diff filename back to the original file path
9
+ * Example: "src_components_button.tsx.diff" -> "src/components/button.tsx"
10
+ */
11
+ export declare function safeDiffFilenameToPath(diffFilename: string): string;
12
+ /**
13
+ * Creates the snapshot directory structure
14
+ */
15
+ export declare function createSnapshotDirectory(baseDirectory: string, snapshotDir?: string): Promise<SnapshotDirectory>;
16
+ /**
17
+ * Resolves the snapshot directory paths without creating them
18
+ */
19
+ export declare function resolveSnapshotDirectory(baseDirectory: string, options?: SnapshotOptions): SnapshotDirectory;
20
+ //# sourceMappingURL=snapshot-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-utils.d.ts","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAQ9E;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,WAAW,GAAE,MAA6B,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAc5B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,eAAoB,GAC5B,iBAAiB,CAWnB"}
@@ -0,0 +1,51 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DEFAULT_SNAPSHOT_DIR, DIFFS_DIRNAME, MANIFEST_FILENAME, } from './snapshot-types.js';
4
+ /**
5
+ * Converts a file path to a safe filename for storing diffs
6
+ * Example: "src/components/button.tsx" -> "src_components_button.tsx.diff"
7
+ */
8
+ export function pathToSafeDiffFilename(filePath) {
9
+ return `${filePath.replaceAll(/[/\\]/g, '_')}.diff`;
10
+ }
11
+ /**
12
+ * Converts a safe diff filename back to the original file path
13
+ * Example: "src_components_button.tsx.diff" -> "src/components/button.tsx"
14
+ */
15
+ export function safeDiffFilenameToPath(diffFilename) {
16
+ if (!diffFilename.endsWith('.diff')) {
17
+ throw new Error(`Invalid diff filename: ${diffFilename}`);
18
+ }
19
+ return diffFilename.slice(0, -5).replaceAll('_', '/');
20
+ }
21
+ /**
22
+ * Creates the snapshot directory structure
23
+ */
24
+ export async function createSnapshotDirectory(baseDirectory, snapshotDir = DEFAULT_SNAPSHOT_DIR) {
25
+ const snapshotPath = path.resolve(baseDirectory, snapshotDir);
26
+ const manifestPath = path.join(snapshotPath, MANIFEST_FILENAME);
27
+ const diffsPath = path.join(snapshotPath, DIFFS_DIRNAME);
28
+ // Create the directories
29
+ await mkdir(snapshotPath, { recursive: true });
30
+ await mkdir(diffsPath, { recursive: true });
31
+ return {
32
+ path: snapshotPath,
33
+ manifestPath,
34
+ diffsPath,
35
+ };
36
+ }
37
+ /**
38
+ * Resolves the snapshot directory paths without creating them
39
+ */
40
+ export function resolveSnapshotDirectory(baseDirectory, options = {}) {
41
+ const snapshotDirName = options.snapshotDir ?? DEFAULT_SNAPSHOT_DIR;
42
+ const snapshotPath = path.resolve(baseDirectory, snapshotDirName);
43
+ const manifestPath = path.join(snapshotPath, MANIFEST_FILENAME);
44
+ const diffsPath = path.join(snapshotPath, DIFFS_DIRNAME);
45
+ return {
46
+ path: snapshotPath,
47
+ manifestPath,
48
+ diffsPath,
49
+ };
50
+ }
51
+ //# sourceMappingURL=snapshot-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-utils.js","sourceRoot":"","sources":["../../../src/diff/snapshot/snapshot-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAoB;IACzD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAAqB,EACrB,cAAsB,oBAAoB;IAE1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAEzD,yBAAyB;IACzB,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,aAAqB,EACrB,UAA2B,EAAE;IAE7B,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAEzD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -1,11 +1,42 @@
1
- export interface FileDiff {
1
+ interface BaseFileDiff {
2
2
  path: string;
3
- type: 'added' | 'modified' | 'deleted';
4
- generatedContent?: string | Buffer;
5
- workingContent?: string | Buffer;
6
- isBinary: boolean;
7
- unifiedDiff?: string;
8
3
  }
4
+ interface AddedFileDiff extends BaseFileDiff {
5
+ type: 'added';
6
+ isBinary: false;
7
+ workingContent: string;
8
+ unifiedDiff: string;
9
+ }
10
+ interface AddedFileBinaryDiff extends BaseFileDiff {
11
+ type: 'added';
12
+ isBinary: true;
13
+ workingContent: Buffer;
14
+ }
15
+ interface ModifiedFileDiff extends BaseFileDiff {
16
+ type: 'modified';
17
+ isBinary: false;
18
+ generatedContent: string;
19
+ workingContent: string;
20
+ unifiedDiff: string;
21
+ }
22
+ interface ModifiedFileBinaryDiff extends BaseFileDiff {
23
+ type: 'modified';
24
+ isBinary: true;
25
+ generatedContent: Buffer;
26
+ workingContent: Buffer;
27
+ }
28
+ interface DeletedFileDiff extends BaseFileDiff {
29
+ type: 'deleted';
30
+ isBinary: false;
31
+ generatedContent: string;
32
+ unifiedDiff: string;
33
+ }
34
+ interface DeletedFileBinaryDiff extends BaseFileDiff {
35
+ type: 'deleted';
36
+ isBinary: true;
37
+ generatedContent: Buffer;
38
+ }
39
+ export type FileDiff = AddedFileDiff | AddedFileBinaryDiff | ModifiedFileDiff | ModifiedFileBinaryDiff | DeletedFileDiff | DeletedFileBinaryDiff;
9
40
  export interface DiffSummary {
10
41
  totalFiles: number;
11
42
  addedFiles: number;
@@ -19,4 +50,5 @@ export interface DiffOptions {
19
50
  globPatterns?: string[];
20
51
  useIgnoreFile?: boolean;
21
52
  }
53
+ export {};
22
54
  //# sourceMappingURL=types.d.ts.map