pushwork 2.0.0-a.sub.1 → 2.0.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/branches.d.ts +20 -0
  2. package/dist/branches.d.ts.map +1 -0
  3. package/dist/branches.js +111 -0
  4. package/dist/branches.js.map +1 -0
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +245 -270
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config.d.ts +17 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +84 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/fs-tree.d.ts +6 -0
  14. package/dist/fs-tree.d.ts.map +1 -0
  15. package/dist/fs-tree.js +99 -0
  16. package/dist/fs-tree.js.map +1 -0
  17. package/dist/ignore.d.ts +6 -0
  18. package/dist/ignore.d.ts.map +1 -0
  19. package/dist/ignore.js +74 -0
  20. package/dist/ignore.js.map +1 -0
  21. package/dist/index.d.ts +8 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +35 -4
  24. package/dist/index.js.map +1 -1
  25. package/dist/log.d.ts +3 -0
  26. package/dist/log.d.ts.map +1 -0
  27. package/dist/log.js +14 -0
  28. package/dist/log.js.map +1 -0
  29. package/dist/pushwork.d.ts +129 -0
  30. package/dist/pushwork.d.ts.map +1 -0
  31. package/dist/pushwork.js +1062 -0
  32. package/dist/pushwork.js.map +1 -0
  33. package/dist/repo.d.ts +14 -0
  34. package/dist/repo.d.ts.map +1 -0
  35. package/dist/repo.js +60 -0
  36. package/dist/repo.js.map +1 -0
  37. package/dist/shapes/custom.d.ts +3 -0
  38. package/dist/shapes/custom.d.ts.map +1 -0
  39. package/dist/shapes/custom.js +57 -0
  40. package/dist/shapes/custom.js.map +1 -0
  41. package/dist/shapes/file.d.ts +20 -0
  42. package/dist/shapes/file.d.ts.map +1 -0
  43. package/dist/shapes/file.js +140 -0
  44. package/dist/shapes/file.js.map +1 -0
  45. package/dist/shapes/index.d.ts +10 -0
  46. package/dist/shapes/index.d.ts.map +1 -0
  47. package/dist/shapes/index.js +35 -0
  48. package/dist/shapes/index.js.map +1 -0
  49. package/dist/shapes/patchwork-folder.d.ts +3 -0
  50. package/dist/shapes/patchwork-folder.d.ts.map +1 -0
  51. package/dist/shapes/patchwork-folder.js +160 -0
  52. package/dist/shapes/patchwork-folder.js.map +1 -0
  53. package/dist/shapes/types.d.ts +38 -0
  54. package/dist/shapes/types.d.ts.map +1 -0
  55. package/dist/shapes/types.js +52 -0
  56. package/dist/shapes/types.js.map +1 -0
  57. package/dist/shapes/vfs.d.ts +3 -0
  58. package/dist/shapes/vfs.d.ts.map +1 -0
  59. package/dist/shapes/vfs.js +92 -0
  60. package/dist/shapes/vfs.js.map +1 -0
  61. package/dist/stash.d.ts +23 -0
  62. package/dist/stash.d.ts.map +1 -0
  63. package/dist/stash.js +118 -0
  64. package/dist/stash.js.map +1 -0
  65. package/dist/version.d.ts +11 -0
  66. package/dist/version.d.ts.map +1 -0
  67. package/dist/version.js +93 -0
  68. package/dist/version.js.map +1 -0
  69. package/package.json +19 -48
  70. package/patches/@automerge__automerge-repo@2.6.0-subduction.15.patch +26 -0
  71. package/.prettierrc +0 -9
  72. package/ARCHITECTURE-ACCORDING-TO-CLAUDE.md +0 -248
  73. package/CLAUDE.md +0 -141
  74. package/README.md +0 -221
  75. package/babel.config.js +0 -5
  76. package/dist/cli/commands.d.ts +0 -71
  77. package/dist/cli/commands.d.ts.map +0 -1
  78. package/dist/cli/commands.js +0 -794
  79. package/dist/cli/commands.js.map +0 -1
  80. package/dist/cli/index.d.ts +0 -2
  81. package/dist/cli/index.d.ts.map +0 -1
  82. package/dist/cli/index.js +0 -19
  83. package/dist/cli/index.js.map +0 -1
  84. package/dist/commands.d.ts +0 -61
  85. package/dist/commands.d.ts.map +0 -1
  86. package/dist/commands.js +0 -861
  87. package/dist/commands.js.map +0 -1
  88. package/dist/config/index.d.ts +0 -71
  89. package/dist/config/index.d.ts.map +0 -1
  90. package/dist/config/index.js +0 -314
  91. package/dist/config/index.js.map +0 -1
  92. package/dist/core/change-detection.d.ts +0 -80
  93. package/dist/core/change-detection.d.ts.map +0 -1
  94. package/dist/core/change-detection.js +0 -523
  95. package/dist/core/change-detection.js.map +0 -1
  96. package/dist/core/config.d.ts +0 -81
  97. package/dist/core/config.d.ts.map +0 -1
  98. package/dist/core/config.js +0 -258
  99. package/dist/core/config.js.map +0 -1
  100. package/dist/core/index.d.ts +0 -6
  101. package/dist/core/index.d.ts.map +0 -1
  102. package/dist/core/index.js +0 -6
  103. package/dist/core/index.js.map +0 -1
  104. package/dist/core/move-detection.d.ts +0 -34
  105. package/dist/core/move-detection.d.ts.map +0 -1
  106. package/dist/core/move-detection.js +0 -121
  107. package/dist/core/move-detection.js.map +0 -1
  108. package/dist/core/snapshot.d.ts +0 -105
  109. package/dist/core/snapshot.d.ts.map +0 -1
  110. package/dist/core/snapshot.js +0 -217
  111. package/dist/core/snapshot.js.map +0 -1
  112. package/dist/core/sync-engine.d.ts +0 -157
  113. package/dist/core/sync-engine.d.ts.map +0 -1
  114. package/dist/core/sync-engine.js +0 -1379
  115. package/dist/core/sync-engine.js.map +0 -1
  116. package/dist/types/config.d.ts +0 -99
  117. package/dist/types/config.d.ts.map +0 -1
  118. package/dist/types/config.js +0 -5
  119. package/dist/types/config.js.map +0 -1
  120. package/dist/types/documents.d.ts +0 -88
  121. package/dist/types/documents.d.ts.map +0 -1
  122. package/dist/types/documents.js +0 -20
  123. package/dist/types/documents.js.map +0 -1
  124. package/dist/types/index.d.ts +0 -4
  125. package/dist/types/index.d.ts.map +0 -1
  126. package/dist/types/index.js +0 -4
  127. package/dist/types/index.js.map +0 -1
  128. package/dist/types/snapshot.d.ts +0 -64
  129. package/dist/types/snapshot.d.ts.map +0 -1
  130. package/dist/types/snapshot.js +0 -2
  131. package/dist/types/snapshot.js.map +0 -1
  132. package/dist/utils/content-similarity.d.ts +0 -53
  133. package/dist/utils/content-similarity.d.ts.map +0 -1
  134. package/dist/utils/content-similarity.js +0 -155
  135. package/dist/utils/content-similarity.js.map +0 -1
  136. package/dist/utils/content.d.ts +0 -10
  137. package/dist/utils/content.d.ts.map +0 -1
  138. package/dist/utils/content.js +0 -31
  139. package/dist/utils/content.js.map +0 -1
  140. package/dist/utils/directory.d.ts +0 -24
  141. package/dist/utils/directory.d.ts.map +0 -1
  142. package/dist/utils/directory.js +0 -52
  143. package/dist/utils/directory.js.map +0 -1
  144. package/dist/utils/fs.d.ts +0 -74
  145. package/dist/utils/fs.d.ts.map +0 -1
  146. package/dist/utils/fs.js +0 -248
  147. package/dist/utils/fs.js.map +0 -1
  148. package/dist/utils/index.d.ts +0 -5
  149. package/dist/utils/index.d.ts.map +0 -1
  150. package/dist/utils/index.js +0 -5
  151. package/dist/utils/index.js.map +0 -1
  152. package/dist/utils/mime-types.d.ts +0 -13
  153. package/dist/utils/mime-types.d.ts.map +0 -1
  154. package/dist/utils/mime-types.js +0 -209
  155. package/dist/utils/mime-types.js.map +0 -1
  156. package/dist/utils/network-sync.d.ts +0 -36
  157. package/dist/utils/network-sync.d.ts.map +0 -1
  158. package/dist/utils/network-sync.js +0 -250
  159. package/dist/utils/network-sync.js.map +0 -1
  160. package/dist/utils/node-polyfills.d.ts +0 -9
  161. package/dist/utils/node-polyfills.d.ts.map +0 -1
  162. package/dist/utils/node-polyfills.js +0 -9
  163. package/dist/utils/node-polyfills.js.map +0 -1
  164. package/dist/utils/output.d.ts +0 -129
  165. package/dist/utils/output.d.ts.map +0 -1
  166. package/dist/utils/output.js +0 -368
  167. package/dist/utils/output.js.map +0 -1
  168. package/dist/utils/repo-factory.d.ts +0 -13
  169. package/dist/utils/repo-factory.d.ts.map +0 -1
  170. package/dist/utils/repo-factory.js +0 -46
  171. package/dist/utils/repo-factory.js.map +0 -1
  172. package/dist/utils/string-similarity.d.ts +0 -14
  173. package/dist/utils/string-similarity.d.ts.map +0 -1
  174. package/dist/utils/string-similarity.js +0 -39
  175. package/dist/utils/string-similarity.js.map +0 -1
  176. package/dist/utils/text-diff.d.ts +0 -37
  177. package/dist/utils/text-diff.d.ts.map +0 -1
  178. package/dist/utils/text-diff.js +0 -93
  179. package/dist/utils/text-diff.js.map +0 -1
  180. package/dist/utils/trace.d.ts +0 -19
  181. package/dist/utils/trace.d.ts.map +0 -1
  182. package/dist/utils/trace.js +0 -63
  183. package/dist/utils/trace.js.map +0 -1
  184. package/src/cli.ts +0 -442
  185. package/src/commands.ts +0 -1134
  186. package/src/core/change-detection.ts +0 -712
  187. package/src/core/config.ts +0 -313
  188. package/src/core/index.ts +0 -5
  189. package/src/core/move-detection.ts +0 -169
  190. package/src/core/snapshot.ts +0 -275
  191. package/src/core/sync-engine.ts +0 -1795
  192. package/src/index.ts +0 -4
  193. package/src/types/config.ts +0 -111
  194. package/src/types/documents.ts +0 -91
  195. package/src/types/index.ts +0 -3
  196. package/src/types/snapshot.ts +0 -67
  197. package/src/utils/content.ts +0 -34
  198. package/src/utils/directory.ts +0 -73
  199. package/src/utils/fs.ts +0 -297
  200. package/src/utils/index.ts +0 -4
  201. package/src/utils/mime-types.ts +0 -244
  202. package/src/utils/network-sync.ts +0 -319
  203. package/src/utils/node-polyfills.ts +0 -8
  204. package/src/utils/output.ts +0 -450
  205. package/src/utils/repo-factory.ts +0 -73
  206. package/src/utils/string-similarity.ts +0 -54
  207. package/src/utils/text-diff.ts +0 -101
  208. package/src/utils/trace.ts +0 -70
  209. package/test/integration/README.md +0 -328
  210. package/test/integration/clone-test.sh +0 -310
  211. package/test/integration/conflict-resolution-test.sh +0 -309
  212. package/test/integration/debug-both-nested.sh +0 -74
  213. package/test/integration/debug-concurrent-nested.sh +0 -87
  214. package/test/integration/debug-nested.sh +0 -73
  215. package/test/integration/deletion-behavior-test.sh +0 -487
  216. package/test/integration/deletion-sync-test-simple.sh +0 -193
  217. package/test/integration/deletion-sync-test.sh +0 -297
  218. package/test/integration/exclude-patterns.test.ts +0 -144
  219. package/test/integration/full-integration-test.sh +0 -363
  220. package/test/integration/fuzzer.test.ts +0 -818
  221. package/test/integration/in-memory-sync.test.ts +0 -830
  222. package/test/integration/init-sync.test.ts +0 -89
  223. package/test/integration/manual-sync-test.sh +0 -84
  224. package/test/integration/sync-deletion.test.ts +0 -280
  225. package/test/integration/sync-flow.test.ts +0 -291
  226. package/test/jest.setup.ts +0 -34
  227. package/test/run-tests.sh +0 -225
  228. package/test/unit/deletion-behavior.test.ts +0 -249
  229. package/test/unit/enhanced-mime-detection.test.ts +0 -244
  230. package/test/unit/snapshot.test.ts +0 -404
  231. package/test/unit/sync-convergence.test.ts +0 -298
  232. package/test/unit/sync-timing.test.ts +0 -134
  233. package/test/unit/utils.test.ts +0 -366
  234. package/tsconfig.json +0 -23
@@ -1,297 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Deletion Sync Test: Bob deletes, Alice receives deletion
4
- # Tests end-to-end deletion propagation through sync
5
-
6
- set -e # Exit on any error
7
-
8
- # Colors for output
9
- RED='\033[0;31m'
10
- GREEN='\033[0;32m'
11
- BLUE='\033[0;34m'
12
- YELLOW='\033[1;33m'
13
- NC='\033[0m' # No Color
14
-
15
- # Test configuration
16
- TEST_DIR="/tmp/pushwork-deletion-test-$$"
17
- BOB_DIR="$TEST_DIR/bob"
18
- ALICE_DIR="$TEST_DIR/alice"
19
- PUSHWORK_CMD="npm run start --silent --"
20
- SYNC_SERVER="ws://localhost:3030"
21
- STORAGE_ID="deletion-test-$(date +%s)"
22
- TEST_FILE="shared-document.ts"
23
- TEST_CONTENT="interface SharedInterface { id: number; name: string; }"
24
-
25
- # Logging functions
26
- log_info() {
27
- echo -e "${BLUE}[INFO]${NC} $1"
28
- }
29
-
30
- log_success() {
31
- echo -e "${GREEN}[PASS]${NC} $1"
32
- }
33
-
34
- log_error() {
35
- echo -e "${RED}[FAIL]${NC} $1"
36
- }
37
-
38
- log_test() {
39
- echo -e "${YELLOW}[TEST]${NC} $1"
40
- }
41
-
42
- log_warning() {
43
- echo -e "${YELLOW}[WARN]${NC} $1"
44
- }
45
-
46
- # Cleanup function
47
- cleanup() {
48
- if [ -d "$TEST_DIR" ]; then
49
- log_info "Cleaning up test directories..."
50
- rm -rf "$TEST_DIR"
51
- fi
52
- }
53
-
54
- # Error handler
55
- handle_error() {
56
- log_error "Test failed at line $1"
57
- log_info "Bob's directory contents:"
58
- if [ -d "$BOB_DIR" ]; then
59
- ls -la "$BOB_DIR" || true
60
- fi
61
- log_info "Alice's directory contents:"
62
- if [ -d "$ALICE_DIR" ]; then
63
- ls -la "$ALICE_DIR" || true
64
- fi
65
- cleanup
66
- exit 1
67
- }
68
-
69
- # Set up error handling
70
- trap 'handle_error $LINENO' ERR
71
- trap cleanup EXIT
72
-
73
- # Helper function to run pushwork commands
74
- run_pushwork() {
75
- local dir="$1"
76
- local cmd="$2"
77
- local user="$3"
78
-
79
- log_test "${user}: Running 'pushwork $cmd'"
80
- cd "$dir"
81
-
82
- # Capture both stdout and stderr
83
- if output=$(eval "$PUSHWORK_CMD $cmd" 2>&1); then
84
- if [ -n "$output" ]; then
85
- echo " Output: $output"
86
- fi
87
- return 0
88
- else
89
- log_error "${user}: Command failed: $output"
90
- return 1
91
- fi
92
- }
93
-
94
- # Helper function to check if file exists
95
- check_file_exists() {
96
- local dir="$1"
97
- local file="$2"
98
- local user="$3"
99
- local should_exist="$4"
100
-
101
- if [ -f "$dir/$file" ]; then
102
- if [ "$should_exist" = "true" ]; then
103
- log_success "${user}: File '$file' exists (expected)"
104
- return 0
105
- else
106
- log_error "${user}: File '$file' exists (should be deleted)"
107
- return 1
108
- fi
109
- else
110
- if [ "$should_exist" = "false" ]; then
111
- log_success "${user}: File '$file' is deleted (expected)"
112
- return 0
113
- else
114
- log_error "${user}: File '$file' is missing (should exist)"
115
- return 1
116
- fi
117
- fi
118
- }
119
-
120
- # Helper function to show directory contents
121
- show_directory_contents() {
122
- local dir="$1"
123
- local user="$2"
124
-
125
- log_info "${user}'s directory contents:"
126
- cd "$dir"
127
- if [ "$(ls -A .)" ]; then
128
- ls -la . | grep -v "^total" | tail -n +2 | while read line; do
129
- echo " $line"
130
- done
131
- else
132
- echo " (empty directory)"
133
- fi
134
- }
135
-
136
- # Main test function
137
- main() {
138
- echo "======================================"
139
- echo "Pushwork Deletion Sync Test"
140
- echo "======================================"
141
- echo "Testing: Bob deletes file → sync → Alice loses file"
142
- echo ""
143
-
144
- # Setup
145
- log_info "Setting up test environment..."
146
- mkdir -p "$BOB_DIR" "$ALICE_DIR"
147
-
148
- log_info "Test configuration:"
149
- echo " Bob's directory: $BOB_DIR"
150
- echo " Alice's directory: $ALICE_DIR"
151
- echo " Sync server: $SYNC_SERVER"
152
- echo " Storage ID: $STORAGE_ID"
153
- echo " Test file: $TEST_FILE"
154
- echo ""
155
-
156
- # Phase 1: Initialize both repositories
157
- log_info "=== Phase 1: Initialize Repositories ==="
158
-
159
- log_test "Initializing Bob's repository..."
160
- run_pushwork "$BOB_DIR" "init . --sync-server '$SYNC_SERVER' --storage-id '$STORAGE_ID'" "Bob"
161
-
162
- log_test "Initializing Alice's repository..."
163
- run_pushwork "$ALICE_DIR" "clone --sync-server '$SYNC_SERVER' --storage-id '$STORAGE_ID' ." "Alice"
164
-
165
- # Phase 2: Create initial shared file
166
- log_info "=== Phase 2: Create Shared File ==="
167
-
168
- log_test "Bob creates the shared file..."
169
- echo "$TEST_CONTENT" > "$BOB_DIR/$TEST_FILE"
170
- check_file_exists "$BOB_DIR" "$TEST_FILE" "Bob" "true"
171
-
172
- log_test "Bob commits the file..."
173
- run_pushwork "$BOB_DIR" "commit ." "Bob"
174
-
175
- log_test "Bob syncs to share the file..."
176
- run_pushwork "$BOB_DIR" "sync" "Bob"
177
-
178
- log_test "Alice syncs to receive the file..."
179
- run_pushwork "$ALICE_DIR" "sync" "Alice"
180
-
181
- # Verify both have the file
182
- check_file_exists "$BOB_DIR" "$TEST_FILE" "Bob" "true"
183
- check_file_exists "$ALICE_DIR" "$TEST_FILE" "Alice" "true"
184
-
185
- log_success "Phase 2: Both users have the shared file"
186
- echo ""
187
-
188
- # Phase 3: Bob deletes the file
189
- log_info "=== Phase 3: Bob Deletes File ==="
190
-
191
- show_directory_contents "$BOB_DIR" "Bob (before deletion)"
192
-
193
- log_test "Bob deletes the shared file..."
194
- rm "$BOB_DIR/$TEST_FILE"
195
- check_file_exists "$BOB_DIR" "$TEST_FILE" "Bob" "false"
196
-
197
- show_directory_contents "$BOB_DIR" "Bob (after deletion)"
198
-
199
- log_test "Bob commits the deletion..."
200
- run_pushwork "$BOB_DIR" "commit ." "Bob"
201
-
202
- # Verify file is still gone on Bob's side
203
- check_file_exists "$BOB_DIR" "$TEST_FILE" "Bob" "false"
204
-
205
- log_success "Phase 3: Bob successfully deleted and committed"
206
- echo ""
207
-
208
- # Phase 4: Bob syncs the deletion
209
- log_info "=== Phase 4: Bob Syncs Deletion ==="
210
-
211
- log_test "Bob syncs to propagate the deletion..."
212
- run_pushwork "$BOB_DIR" "sync" "Bob"
213
-
214
- # Verify file is still gone on Bob's side after sync
215
- check_file_exists "$BOB_DIR" "$TEST_FILE" "Bob" "false"
216
-
217
- log_test "Bob checks status after sync..."
218
- run_pushwork "$BOB_DIR" "status" "Bob"
219
-
220
- log_success "Phase 4: Bob's deletion synced successfully"
221
- echo ""
222
-
223
- # Phase 5: Alice syncs to receive the deletion
224
- log_info "=== Phase 5: Alice Syncs to Receive Deletion ==="
225
-
226
- show_directory_contents "$ALICE_DIR" "Alice (before sync)"
227
-
228
- # Alice should still have the file before syncing
229
- check_file_exists "$ALICE_DIR" "$TEST_FILE" "Alice" "true"
230
-
231
- log_test "Alice syncs to receive Bob's deletion..."
232
- run_pushwork "$ALICE_DIR" "sync" "Alice"
233
-
234
- show_directory_contents "$ALICE_DIR" "Alice (after sync)"
235
-
236
- # Critical test: Alice should now have the file deleted
237
- check_file_exists "$ALICE_DIR" "$TEST_FILE" "Alice" "false"
238
-
239
- log_test "Alice checks status after sync..."
240
- run_pushwork "$ALICE_DIR" "status" "Alice"
241
-
242
- log_success "Phase 5: Alice received the deletion successfully"
243
- echo ""
244
-
245
- # Phase 6: Verification
246
- log_info "=== Phase 6: Final Verification ==="
247
-
248
- log_test "Final verification of both repositories..."
249
-
250
- # Both should have no trace of the deleted file
251
- check_file_exists "$BOB_DIR" "$TEST_FILE" "Bob" "false"
252
- check_file_exists "$ALICE_DIR" "$TEST_FILE" "Alice" "false"
253
-
254
- # Check for any unexpected files
255
- show_directory_contents "$BOB_DIR" "Bob (final)"
256
- show_directory_contents "$ALICE_DIR" "Alice (final)"
257
-
258
- # Run final status checks
259
- log_test "Bob's final status:"
260
- run_pushwork "$BOB_DIR" "status" "Bob"
261
-
262
- log_test "Alice's final status:"
263
- run_pushwork "$ALICE_DIR" "status" "Alice"
264
-
265
- log_success "Phase 6: All verifications passed"
266
- echo ""
267
-
268
- # Success!
269
- echo "======================================"
270
- echo "🎉 DELETION SYNC TEST PASSED! 🎉"
271
- echo "======================================"
272
- echo "✅ Bob deleted file successfully"
273
- echo "✅ Bob's sync propagated deletion"
274
- echo "✅ Alice received deletion correctly"
275
- echo "✅ Both repositories in sync"
276
- echo ""
277
- echo "This test validates that file deletions"
278
- echo "propagate correctly through the sync engine!"
279
- }
280
-
281
- # Check if we're in the right directory
282
- if [ ! -f "package.json" ] || ! grep -q "pushwork" package.json; then
283
- log_error "This script must be run from the pushwork project root directory"
284
- exit 1
285
- fi
286
-
287
- # Check if dependencies are available
288
- if ! command -v npm &> /dev/null; then
289
- log_error "npm is not installed or not in PATH"
290
- exit 1
291
- fi
292
-
293
- # Run the test
294
- main
295
-
296
- echo ""
297
- echo "Test completed successfully! 🚀"
@@ -1,144 +0,0 @@
1
- import * as path from "path";
2
- import * as fs from "fs/promises";
3
- import { tmpdir } from "os";
4
- import { ConfigManager } from "../../src/core";
5
- import { DirectoryConfig } from "../../src/types";
6
- import {
7
- ensureDirectoryExists,
8
- writeFileContent,
9
- listDirectory,
10
- } from "../../src/utils";
11
-
12
- describe("Exclude Patterns", () => {
13
- let tmpDir: string;
14
- let syncToolDir: string;
15
- let configManager: ConfigManager;
16
-
17
- beforeEach(async () => {
18
- tmpDir = await fs.mkdtemp(path.join(tmpdir(), "sync-test-"));
19
- syncToolDir = path.join(tmpDir, ".pushwork");
20
- await ensureDirectoryExists(syncToolDir);
21
- await ensureDirectoryExists(path.join(syncToolDir, "automerge"));
22
-
23
- configManager = new ConfigManager(tmpDir);
24
- });
25
-
26
- afterEach(async () => {
27
- await fs.rm(tmpDir, { recursive: true, force: true });
28
- });
29
-
30
- it("should exclude .pushwork directory from filesystem listing", async () => {
31
- // Create files both inside and outside .pushwork directory
32
- await writeFileContent(
33
- path.join(tmpDir, "regular-file.txt"),
34
- "regular content"
35
- );
36
- await writeFileContent(
37
- path.join(tmpDir, "another-file.md"),
38
- "markdown content"
39
- );
40
- await writeFileContent(
41
- path.join(syncToolDir, "snapshot.json"),
42
- '{"timestamp": 123}'
43
- );
44
- await writeFileContent(
45
- path.join(syncToolDir, "config.json"),
46
- '{"test": true}'
47
- );
48
-
49
- // Create nested directory with file inside .pushwork
50
- const nestedDir = path.join(syncToolDir, "nested");
51
- await ensureDirectoryExists(nestedDir);
52
- await writeFileContent(
53
- path.join(nestedDir, "internal.log"),
54
- "internal log data"
55
- );
56
-
57
- // Test listDirectory with exclude patterns
58
- const excludePatterns = [".pushwork"];
59
- const entries = await listDirectory(tmpDir, true, excludePatterns);
60
-
61
- // Verify that .pushwork files are excluded
62
- const filePaths = entries.map((entry) => path.relative(tmpDir, entry.path));
63
-
64
- expect(filePaths).toContain("regular-file.txt");
65
- expect(filePaths).toContain("another-file.md");
66
- expect(filePaths).not.toContain(".pushwork/snapshot.json");
67
- expect(filePaths).not.toContain(".pushwork/config.json");
68
- expect(filePaths).not.toContain(".pushwork/nested/internal.log");
69
- });
70
-
71
- it("should exclude files matching glob patterns", async () => {
72
- // Create files that should and shouldn't be excluded
73
- await writeFileContent(path.join(tmpDir, "include.txt"), "include me");
74
- await writeFileContent(path.join(tmpDir, "exclude.tmp"), "exclude me");
75
- await writeFileContent(path.join(tmpDir, "debug.log"), "exclude me too");
76
- await writeFileContent(path.join(tmpDir, "readme.md"), "include me");
77
-
78
- // Create node_modules directory with files
79
- const nodeModulesDir = path.join(tmpDir, "node_modules");
80
- await ensureDirectoryExists(nodeModulesDir);
81
- await writeFileContent(
82
- path.join(nodeModulesDir, "package.json"),
83
- "exclude me"
84
- );
85
-
86
- // Test listDirectory with various exclude patterns
87
- const excludePatterns = ["*.tmp", "*.log", "node_modules", ".pushwork"];
88
- const entries = await listDirectory(tmpDir, true, excludePatterns);
89
-
90
- // Verify correct files are included/excluded
91
- const filePaths = entries.map((entry) => path.relative(tmpDir, entry.path));
92
-
93
- expect(filePaths).toContain("include.txt");
94
- expect(filePaths).toContain("readme.md");
95
- expect(filePaths).not.toContain("exclude.tmp");
96
- expect(filePaths).not.toContain("debug.log");
97
- expect(filePaths).not.toContain("node_modules/package.json");
98
- });
99
-
100
- it("should use merged configuration exclude patterns", async () => {
101
- // Create global config
102
- await configManager.createDefaultGlobal();
103
-
104
- // Create local config with additional exclude patterns
105
- const localConfig: DirectoryConfig = {
106
- sync_server: "wss://test.server.com",
107
- sync_enabled: true,
108
- exclude_patterns: [".git", "*.tmp", ".pushwork", "*.env"],
109
- artifact_directories: ["dist"],
110
- sync: {
111
- move_detection_threshold: 0.8,
112
- },
113
- };
114
- await configManager.save(localConfig);
115
-
116
- // Get merged config
117
- const mergedConfig = await configManager.getMerged();
118
-
119
- // Verify .pushwork is in the exclude patterns
120
- expect(mergedConfig.exclude_patterns).toContain(".pushwork");
121
- expect(mergedConfig.exclude_patterns).toContain("*.env");
122
- expect(mergedConfig.exclude_patterns).toContain(".git");
123
-
124
- // Create test files
125
- await writeFileContent(path.join(tmpDir, "include.txt"), "include me");
126
- await writeFileContent(path.join(tmpDir, "secret.env"), "exclude me");
127
- await writeFileContent(
128
- path.join(syncToolDir, "snapshot.json"),
129
- "exclude me"
130
- );
131
-
132
- // Test with merged exclude patterns
133
- const entries = await listDirectory(
134
- tmpDir,
135
- true,
136
- mergedConfig.exclude_patterns
137
- );
138
- const filePaths = entries.map((entry) => path.relative(tmpDir, entry.path));
139
-
140
- expect(filePaths).toContain("include.txt");
141
- expect(filePaths).not.toContain("secret.env");
142
- expect(filePaths).not.toContain(".pushwork/snapshot.json");
143
- });
144
- });