@jinion/core 0.3.0 → 0.5.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.
- package/dist/agent/agent.d.ts +5 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +3 -2
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/claude/approvals.d.ts +2 -1
- package/dist/agent/claude/approvals.d.ts.map +1 -1
- package/dist/agent/claude/approvals.js +2 -2
- package/dist/agent/claude/approvals.js.map +1 -1
- package/dist/agent/claude/backend.d.ts +4 -0
- package/dist/agent/claude/backend.d.ts.map +1 -1
- package/dist/agent/claude/backend.js +1 -1
- package/dist/agent/claude/backend.js.map +1 -1
- package/dist/agent/claude/events.js +1 -1
- package/dist/agent/claude/events.js.map +1 -1
- package/dist/agent/claude/guard.d.ts.map +1 -1
- package/dist/agent/claude/guard.js +2 -1
- package/dist/agent/claude/guard.js.map +1 -1
- package/dist/agent/claude/jinion-tools.d.ts +9 -1
- package/dist/agent/claude/jinion-tools.d.ts.map +1 -1
- package/dist/agent/claude/jinion-tools.js +14 -2
- package/dist/agent/claude/jinion-tools.js.map +1 -1
- package/dist/agent/claude/mcp.d.ts.map +1 -1
- package/dist/agent/claude/mcp.js +21 -1
- package/dist/agent/claude/mcp.js.map +1 -1
- package/dist/agent/claude/options.d.ts +9 -1
- package/dist/agent/claude/options.d.ts.map +1 -1
- package/dist/agent/claude/options.js +7 -3
- package/dist/agent/claude/options.js.map +1 -1
- package/dist/agent/claude/paths.d.ts +0 -3
- package/dist/agent/claude/paths.d.ts.map +1 -1
- package/dist/agent/claude/paths.js +1 -7
- package/dist/agent/claude/paths.js.map +1 -1
- package/dist/agent/claude/permissions.js +1 -1
- package/dist/agent/claude/permissions.js.map +1 -1
- package/dist/agent/claude/policy.d.ts +1 -1
- package/dist/agent/claude/policy.d.ts.map +1 -1
- package/dist/agent/claude/policy.js +1 -0
- package/dist/agent/claude/policy.js.map +1 -1
- package/dist/agent/claude/prompt.d.ts +2 -1
- package/dist/agent/claude/prompt.d.ts.map +1 -1
- package/dist/agent/claude/prompt.js +10 -5
- package/dist/agent/claude/prompt.js.map +1 -1
- package/dist/agent/claude/review.d.ts +4 -1
- package/dist/agent/claude/review.d.ts.map +1 -1
- package/dist/agent/claude/review.js +5 -2
- package/dist/agent/claude/review.js.map +1 -1
- package/dist/agent/claude/session.d.ts +8 -1
- package/dist/agent/claude/session.d.ts.map +1 -1
- package/dist/agent/claude/session.js +7 -1
- package/dist/agent/claude/session.js.map +1 -1
- package/dist/agent/claude/tool-calls.d.ts.map +1 -1
- package/dist/agent/claude/tool-calls.js +11 -2
- package/dist/agent/claude/tool-calls.js.map +1 -1
- package/dist/agent/codex/approvals.d.ts +1 -1
- package/dist/agent/codex/approvals.d.ts.map +1 -1
- package/dist/agent/codex/approvals.js +1 -1
- package/dist/agent/codex/approvals.js.map +1 -1
- package/dist/agent/codex/backend.d.ts +4 -0
- package/dist/agent/codex/backend.d.ts.map +1 -1
- package/dist/agent/codex/backend.js +1 -1
- package/dist/agent/codex/backend.js.map +1 -1
- package/dist/agent/codex/events.d.ts.map +1 -1
- package/dist/agent/codex/events.js +15 -1
- package/dist/agent/codex/events.js.map +1 -1
- package/dist/agent/codex/jinion-tools.d.ts +38 -4
- package/dist/agent/codex/jinion-tools.d.ts.map +1 -1
- package/dist/agent/codex/jinion-tools.js +57 -10
- package/dist/agent/codex/jinion-tools.js.map +1 -1
- package/dist/agent/codex/mcp.d.ts.map +1 -1
- package/dist/agent/codex/mcp.js +4 -0
- package/dist/agent/codex/mcp.js.map +1 -1
- package/dist/agent/codex/modes.d.ts +2 -2
- package/dist/agent/codex/modes.d.ts.map +1 -1
- package/dist/agent/codex/modes.js +4 -3
- package/dist/agent/codex/modes.js.map +1 -1
- package/dist/agent/codex/rewind.js +1 -47
- package/dist/agent/codex/rewind.js.map +1 -1
- package/dist/agent/codex/session.d.ts +10 -3
- package/dist/agent/codex/session.d.ts.map +1 -1
- package/dist/agent/codex/session.js +21 -7
- package/dist/agent/codex/session.js.map +1 -1
- package/dist/agent/demo/mcp.d.ts +2 -0
- package/dist/agent/demo/mcp.d.ts.map +1 -1
- package/dist/agent/demo/mcp.js +14 -0
- package/dist/agent/demo/mcp.js.map +1 -1
- package/dist/agent/demo/script.d.ts +8 -2
- package/dist/agent/demo/script.d.ts.map +1 -1
- package/dist/agent/demo/tasks.d.ts +4 -1
- package/dist/agent/demo/tasks.d.ts.map +1 -1
- package/dist/agent/events.d.ts +4 -0
- package/dist/agent/events.d.ts.map +1 -1
- package/dist/agent/events.js +2 -0
- package/dist/agent/events.js.map +1 -1
- package/dist/agent/mcp.d.ts +5 -0
- package/dist/agent/mcp.d.ts.map +1 -1
- package/dist/agent/mcp.js +2 -0
- package/dist/agent/mcp.js.map +1 -1
- package/dist/agent/modes.d.ts +15 -1
- package/dist/agent/modes.d.ts.map +1 -1
- package/dist/agent/modes.js +16 -1
- package/dist/agent/modes.js.map +1 -1
- package/dist/agent/patches.d.ts +5 -0
- package/dist/agent/patches.d.ts.map +1 -1
- package/dist/agent/patches.js +49 -0
- package/dist/agent/patches.js.map +1 -1
- package/dist/agent/review-tools.d.ts +15 -0
- package/dist/agent/review-tools.d.ts.map +1 -0
- package/dist/agent/review-tools.js +13 -0
- package/dist/agent/review-tools.js.map +1 -0
- package/dist/agent/review.d.ts +18 -6
- package/dist/agent/review.d.ts.map +1 -1
- package/dist/agent/review.js +52 -17
- package/dist/agent/review.js.map +1 -1
- package/dist/api/client.d.ts +19 -5
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +14 -3
- package/dist/api/client.js.map +1 -1
- package/dist/api/connection.d.ts +7 -2
- package/dist/api/connection.d.ts.map +1 -1
- package/dist/api/connection.js +6 -0
- package/dist/api/connection.js.map +1 -1
- package/dist/api/fields.d.ts +9 -7
- package/dist/api/fields.d.ts.map +1 -1
- package/dist/api/fields.js +3 -2
- package/dist/api/fields.js.map +1 -1
- package/dist/api/json-schema.d.ts +604 -95
- package/dist/api/json-schema.d.ts.map +1 -1
- package/dist/api/json-schema.js +2 -1
- package/dist/api/json-schema.js.map +1 -1
- package/dist/api/methods/accounts.d.ts.map +1 -1
- package/dist/api/methods/accounts.js +1 -2
- package/dist/api/methods/accounts.js.map +1 -1
- package/dist/api/methods/app.d.ts.map +1 -1
- package/dist/api/methods/app.js +9 -5
- package/dist/api/methods/app.js.map +1 -1
- package/dist/api/methods/files.d.ts +3 -1
- package/dist/api/methods/files.d.ts.map +1 -1
- package/dist/api/methods/files.js +75 -2
- package/dist/api/methods/files.js.map +1 -1
- package/dist/api/methods/git.d.ts.map +1 -1
- package/dist/api/methods/git.js +54 -6
- package/dist/api/methods/git.js.map +1 -1
- package/dist/api/methods/lsp.d.ts +7 -0
- package/dist/api/methods/lsp.d.ts.map +1 -0
- package/dist/api/methods/lsp.js +68 -0
- package/dist/api/methods/lsp.js.map +1 -0
- package/dist/api/methods/preview.d.ts +4 -1
- package/dist/api/methods/preview.d.ts.map +1 -1
- package/dist/api/methods/preview.js +19 -3
- package/dist/api/methods/preview.js.map +1 -1
- package/dist/api/methods/terminals.d.ts.map +1 -1
- package/dist/api/methods/terminals.js +7 -1
- package/dist/api/methods/terminals.js.map +1 -1
- package/dist/api/protocol.d.ts +774 -13
- package/dist/api/protocol.d.ts.map +1 -1
- package/dist/api/protocol.js +126 -8
- package/dist/api/protocol.js.map +1 -1
- package/dist/api/schemas.d.ts +15 -2
- package/dist/api/schemas.d.ts.map +1 -1
- package/dist/api/schemas.js +4 -0
- package/dist/api/schemas.js.map +1 -1
- package/dist/api/screen.d.ts +2 -0
- package/dist/api/screen.d.ts.map +1 -1
- package/dist/api/screen.js +3 -0
- package/dist/api/screen.js.map +1 -1
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +13 -0
- package/dist/api/server.js.map +1 -1
- package/dist/commands/agent.js +3 -3
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/builtin.d.ts.map +1 -1
- package/dist/commands/builtin.js +2 -0
- package/dist/commands/builtin.js.map +1 -1
- package/dist/commands/conversation.d.ts.map +1 -1
- package/dist/commands/conversation.js +2 -0
- package/dist/commands/conversation.js.map +1 -1
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +1 -0
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/notifications.d.ts.map +1 -1
- package/dist/commands/notifications.js +5 -3
- package/dist/commands/notifications.js.map +1 -1
- package/dist/commands/registry.d.ts +3 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +14 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/skill.d.ts +5 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +30 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/views.d.ts.map +1 -1
- package/dist/commands/views.js +5 -1
- package/dist/commands/views.js.map +1 -1
- package/dist/controllers/accounts.d.ts +5 -2
- package/dist/controllers/accounts.d.ts.map +1 -1
- package/dist/controllers/accounts.js +11 -8
- package/dist/controllers/accounts.js.map +1 -1
- package/dist/controllers/context.d.ts +2 -0
- package/dist/controllers/context.d.ts.map +1 -1
- package/dist/controllers/context.js.map +1 -1
- package/dist/controllers/feedback.d.ts +1 -1
- package/dist/controllers/feedback.d.ts.map +1 -1
- package/dist/controllers/feedback.js +4 -1
- package/dist/controllers/feedback.js.map +1 -1
- package/dist/controllers/input.d.ts.map +1 -1
- package/dist/controllers/input.js +2 -0
- package/dist/controllers/input.js.map +1 -1
- package/dist/controllers/jinion.d.ts +7 -0
- package/dist/controllers/jinion.d.ts.map +1 -1
- package/dist/controllers/jinion.js +7 -0
- package/dist/controllers/jinion.js.map +1 -1
- package/dist/controllers/mcp.d.ts +7 -2
- package/dist/controllers/mcp.d.ts.map +1 -1
- package/dist/controllers/mcp.js +23 -7
- package/dist/controllers/mcp.js.map +1 -1
- package/dist/controllers/mode.d.ts +8 -4
- package/dist/controllers/mode.d.ts.map +1 -1
- package/dist/controllers/mode.js +30 -4
- package/dist/controllers/mode.js.map +1 -1
- package/dist/controllers/session.d.ts.map +1 -1
- package/dist/controllers/session.js +5 -1
- package/dist/controllers/session.js.map +1 -1
- package/dist/controllers/turns.d.ts +1 -0
- package/dist/controllers/turns.d.ts.map +1 -1
- package/dist/controllers/turns.js +9 -2
- package/dist/controllers/turns.js.map +1 -1
- package/dist/conversation/activity.d.ts +5 -0
- package/dist/conversation/activity.d.ts.map +1 -0
- package/dist/conversation/activity.js +41 -0
- package/dist/conversation/activity.js.map +1 -0
- package/dist/conversation/apply-event.d.ts.map +1 -1
- package/dist/conversation/apply-event.js +2 -1
- package/dist/conversation/apply-event.js.map +1 -1
- package/dist/conversation/dialogs.d.ts +1 -0
- package/dist/conversation/dialogs.d.ts.map +1 -1
- package/dist/conversation/edits.d.ts +5 -0
- package/dist/conversation/edits.d.ts.map +1 -1
- package/dist/conversation/edits.js +10 -0
- package/dist/conversation/edits.js.map +1 -1
- package/dist/conversation/reducer.d.ts +12 -0
- package/dist/conversation/reducer.d.ts.map +1 -1
- package/dist/design/guides.d.ts +78 -5
- package/dist/design/guides.d.ts.map +1 -1
- package/dist/design/guides.js +78 -5
- package/dist/design/guides.js.map +1 -1
- package/dist/design/prompt.d.ts +1 -1
- package/dist/design/prompt.d.ts.map +1 -1
- package/dist/design/prompt.js +2 -2
- package/dist/design/prompt.js.map +1 -1
- package/dist/design/tools.d.ts +2 -0
- package/dist/design/tools.d.ts.map +1 -1
- package/dist/design/tools.js +6 -2
- package/dist/design/tools.js.map +1 -1
- package/dist/directions/directions.d.ts +42 -0
- package/dist/directions/directions.d.ts.map +1 -0
- package/dist/directions/directions.js +120 -0
- package/dist/directions/directions.js.map +1 -0
- package/dist/directions/store.d.ts +34 -0
- package/dist/directions/store.d.ts.map +1 -0
- package/dist/directions/store.js +61 -0
- package/dist/directions/store.js.map +1 -0
- package/dist/directions/tools.d.ts +29 -0
- package/dist/directions/tools.d.ts.map +1 -0
- package/dist/directions/tools.js +57 -0
- package/dist/directions/tools.js.map +1 -0
- package/dist/directions/viewer.d.ts +6 -0
- package/dist/directions/viewer.d.ts.map +1 -0
- package/dist/directions/viewer.js +266 -0
- package/dist/directions/viewer.js.map +1 -0
- package/dist/files/names.d.ts +6 -0
- package/dist/files/names.d.ts.map +1 -0
- package/dist/files/names.js +18 -0
- package/dist/files/names.js.map +1 -0
- package/dist/files/operations.d.ts +54 -0
- package/dist/files/operations.d.ts.map +1 -0
- package/dist/files/operations.js +173 -0
- package/dist/files/operations.js.map +1 -0
- package/dist/files/search.d.ts +11 -0
- package/dist/files/search.d.ts.map +1 -0
- package/dist/files/search.js +112 -0
- package/dist/files/search.js.map +1 -0
- package/dist/files/trash.d.ts +11 -0
- package/dist/files/trash.d.ts.map +1 -0
- package/dist/files/trash.js +64 -0
- package/dist/files/trash.js.map +1 -0
- package/dist/files/types.d.ts +112 -0
- package/dist/files/types.d.ts.map +1 -0
- package/dist/files/types.js +47 -0
- package/dist/files/types.js.map +1 -0
- package/dist/files/watch.d.ts +26 -0
- package/dist/files/watch.d.ts.map +1 -0
- package/dist/files/watch.js +107 -0
- package/dist/files/watch.js.map +1 -0
- package/dist/git/blame.d.ts +10 -0
- package/dist/git/blame.d.ts.map +1 -0
- package/dist/git/blame.js +91 -0
- package/dist/git/blame.js.map +1 -0
- package/dist/git/repos.d.ts +5 -0
- package/dist/git/repos.d.ts.map +1 -1
- package/dist/git/repos.js +13 -0
- package/dist/git/repos.js.map +1 -1
- package/dist/git/staging.d.ts +10 -1
- package/dist/git/staging.d.ts.map +1 -1
- package/dist/git/staging.js +21 -0
- package/dist/git/staging.js.map +1 -1
- package/dist/git/types.d.ts +48 -0
- package/dist/git/types.d.ts.map +1 -1
- package/dist/git/types.js +25 -0
- package/dist/git/types.js.map +1 -1
- package/dist/host.d.ts +2 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +8 -1
- package/dist/host.js.map +1 -1
- package/dist/lib/glob.d.ts +6 -0
- package/dist/lib/glob.d.ts.map +1 -0
- package/dist/lib/glob.js +49 -0
- package/dist/lib/glob.js.map +1 -0
- package/dist/lib/paths.d.ts +3 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +9 -1
- package/dist/lib/paths.js.map +1 -1
- package/dist/look/tools.d.ts +7 -1
- package/dist/look/tools.d.ts.map +1 -1
- package/dist/look/tools.js +19 -4
- package/dist/look/tools.js.map +1 -1
- package/dist/lsp/code-intelligence.d.ts +87 -0
- package/dist/lsp/code-intelligence.d.ts.map +1 -0
- package/dist/lsp/code-intelligence.js +343 -0
- package/dist/lsp/code-intelligence.js.map +1 -0
- package/dist/lsp/edits.d.ts +4 -0
- package/dist/lsp/edits.d.ts.map +1 -0
- package/dist/lsp/edits.js +14 -0
- package/dist/lsp/edits.js.map +1 -0
- package/dist/lsp/project-check.d.ts +8 -0
- package/dist/lsp/project-check.d.ts.map +1 -0
- package/dist/lsp/project-check.js +71 -0
- package/dist/lsp/project-check.js.map +1 -0
- package/dist/lsp/results.d.ts +95 -0
- package/dist/lsp/results.d.ts.map +1 -0
- package/dist/lsp/results.js +116 -0
- package/dist/lsp/results.js.map +1 -0
- package/dist/lsp/server.d.ts +22 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +123 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp/servers.d.ts +21 -0
- package/dist/lsp/servers.d.ts.map +1 -0
- package/dist/lsp/servers.js +57 -0
- package/dist/lsp/servers.js.map +1 -0
- package/dist/lsp/transport.d.ts +9 -0
- package/dist/lsp/transport.d.ts.map +1 -0
- package/dist/lsp/transport.js +64 -0
- package/dist/lsp/transport.js.map +1 -0
- package/dist/lsp/types.d.ts +262 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +64 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/map/prompt.d.ts.map +1 -1
- package/dist/map/prompt.js +2 -1
- package/dist/map/prompt.js.map +1 -1
- package/dist/map/review.d.ts +29 -9
- package/dist/map/review.d.ts.map +1 -1
- package/dist/map/review.js +105 -25
- package/dist/map/review.js.map +1 -1
- package/dist/mcp/login.d.ts +2 -0
- package/dist/mcp/login.d.ts.map +1 -1
- package/dist/mcp/login.js +5 -0
- package/dist/mcp/login.js.map +1 -1
- package/dist/preview/pages.d.ts +17 -0
- package/dist/preview/pages.d.ts.map +1 -0
- package/dist/preview/pages.js +92 -0
- package/dist/preview/pages.js.map +1 -0
- package/dist/preview/previews.d.ts +22 -0
- package/dist/preview/previews.d.ts.map +1 -0
- package/dist/preview/previews.js +28 -0
- package/dist/preview/previews.js.map +1 -0
- package/dist/preview/prompt.d.ts +3 -0
- package/dist/preview/prompt.d.ts.map +1 -0
- package/dist/preview/prompt.js +5 -0
- package/dist/preview/prompt.js.map +1 -0
- package/dist/preview/tools.d.ts +21 -0
- package/dist/preview/tools.d.ts.map +1 -0
- package/dist/preview/tools.js +34 -0
- package/dist/preview/tools.js.map +1 -0
- package/dist/preview/types.d.ts +7 -0
- package/dist/preview/types.d.ts.map +1 -1
- package/dist/preview/types.js +2 -0
- package/dist/preview/types.js.map +1 -1
- package/dist/prompt/files.d.ts +4 -1
- package/dist/prompt/files.d.ts.map +1 -1
- package/dist/prompt/files.js +23 -8
- package/dist/prompt/files.js.map +1 -1
- package/dist/settings/user.d.ts +2 -0
- package/dist/settings/user.d.ts.map +1 -1
- package/dist/settings/user.js.map +1 -1
- package/dist/skills/tools.d.ts +26 -0
- package/dist/skills/tools.d.ts.map +1 -0
- package/dist/skills/tools.js +34 -0
- package/dist/skills/tools.js.map +1 -0
- package/dist/state/agent.d.ts +2 -2
- package/dist/state/session.d.ts +9 -5
- package/dist/state/session.d.ts.map +1 -1
- package/dist/state/session.js +1 -0
- package/dist/state/session.js.map +1 -1
- package/package.json +3 -1
- package/schema/api.json +3017 -45
- package/vendor/darwin-arm64/build.json +62 -0
- package/vendor/darwin-arm64/ffmpeg +0 -0
- package/vendor/darwin-arm64/ffprobe +0 -0
- package/vendor/darwin-arm64/licenses/README.md +13 -0
- package/vendor/darwin-arm64/licenses/ffmpeg-LGPL-2.1.txt +502 -0
- package/vendor/darwin-arm64/licenses/whisper.cpp-MIT.txt +21 -0
- package/vendor/darwin-arm64/voices.bin +0 -0
- package/vendor/darwin-arm64/whisper-cli +0 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { lstat } from 'node:fs/promises';
|
|
2
|
+
import { extname, join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* The first name free in `folder`, as the Finder names a copy: with a word, `box copy.tsx`, then `box copy 2.tsx`;
|
|
5
|
+
* without one, `box.tsx` itself, then `box 2.tsx`.
|
|
6
|
+
*/
|
|
7
|
+
export async function freeName(folder, name, word) {
|
|
8
|
+
const extension = extname(name);
|
|
9
|
+
const stem = name.slice(0, name.length - extension.length);
|
|
10
|
+
for (let count = 1;; count++) {
|
|
11
|
+
const suffix = [word, count > 1 ? String(count) : ''].filter(Boolean).join(' ');
|
|
12
|
+
const candidate = suffix ? `${stem} ${suffix}${extension}` : name;
|
|
13
|
+
const taken = await lstat(join(folder, candidate)).then(() => true, () => false);
|
|
14
|
+
if (!taken)
|
|
15
|
+
return candidate;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/files/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,IAAY;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE3D,KAAK,IAAI,KAAK,GAAG,CAAC,GAAI,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAElE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CACrD,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;QAEF,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { FileCreated, FilesCopied, FilesMoved, FilesRestored, Trashed } from './types.js';
|
|
2
|
+
/** Why an operation was refused, for the API to tell as its own error. */
|
|
3
|
+
export declare class FileProblem extends Error {
|
|
4
|
+
readonly kind: 'missing' | 'taken' | 'invalid';
|
|
5
|
+
readonly path?: string | undefined;
|
|
6
|
+
constructor(kind: 'missing' | 'taken' | 'invalid', message: string, path?: string | undefined);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* What can change which files a folder holds: each keeps to the folder, by real paths, so neither `..` nor a link
|
|
10
|
+
* leads out of it, and a name already taken is refused unless `replace` says to move what holds it to the Trash.
|
|
11
|
+
*/
|
|
12
|
+
export declare class FolderFiles {
|
|
13
|
+
private readonly root;
|
|
14
|
+
private constructor();
|
|
15
|
+
static of(folder: string): Promise<FolderFiles>;
|
|
16
|
+
/** A file, empty or with `content`, or a folder; the folders it is in are made as needed. */
|
|
17
|
+
create(path: string, { folder, content, replace }: {
|
|
18
|
+
folder?: boolean;
|
|
19
|
+
content?: Buffer;
|
|
20
|
+
replace?: boolean;
|
|
21
|
+
}): Promise<FileCreated>;
|
|
22
|
+
/** Gives a file or folder another name where it is. */
|
|
23
|
+
rename(path: string, name: string, replace?: boolean): Promise<FilesMoved>;
|
|
24
|
+
/**
|
|
25
|
+
* Moves files and folders into a folder of the session's, each keeping its name; with `keepBoth`, one whose name is
|
|
26
|
+
* taken there takes the next free one, as the Finder's Keep Both names it, `box 2.tsx`.
|
|
27
|
+
*/
|
|
28
|
+
move(paths: string[], into: string, replace?: boolean, keepBoth?: boolean): Promise<FilesMoved>;
|
|
29
|
+
/**
|
|
30
|
+
* Copies files and folders into a folder of the session's: ones of the folder by their paths in it, others, as files
|
|
31
|
+
* dropped from the Finder, by their whole paths. Copied into the folder it is in, a copy takes a name of its own, as
|
|
32
|
+
* one whose name is taken does with `keepBoth`.
|
|
33
|
+
*/
|
|
34
|
+
copy(paths: string[], into: string, replace?: boolean, keepBoth?: boolean): Promise<FilesCopied>;
|
|
35
|
+
/** Moves files and folders to the Trash. */
|
|
36
|
+
delete(paths: string[]): Promise<{
|
|
37
|
+
path: string;
|
|
38
|
+
trash: string;
|
|
39
|
+
}[]>;
|
|
40
|
+
/** Puts back what `delete` or a replace sent to the Trash, at the path it had. */
|
|
41
|
+
restore(items: Trashed[], replace?: boolean): Promise<FilesRestored>;
|
|
42
|
+
/** A folder of the session's by its path there, `''` for the folder itself, as a whole path. */
|
|
43
|
+
folderAt(path: string): Promise<string>;
|
|
44
|
+
private relocate;
|
|
45
|
+
private notInto;
|
|
46
|
+
/** What holds `target`, to the Trash when `replace` says so. */
|
|
47
|
+
private clear;
|
|
48
|
+
private existing;
|
|
49
|
+
private outside;
|
|
50
|
+
/** Where something new goes: under the deepest folder of its path that is there, which has to be in the folder. */
|
|
51
|
+
private target;
|
|
52
|
+
private named;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/files/operations.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAS,OAAO,EAAE,MAAM,YAAY,CAAC;AAEtG,0EAA0E;AAC1E,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;IAE9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IAHxB,YACW,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,EAC9C,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA,EAGvB;CACF;AAED;;;GAGG;AACH,qBAAa,WAAW;IACF,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAzC,OAAO,eAA8C;IAErD,OAAa,EAAE,CAAC,MAAM,EAAE,MAAM,wBAE7B;IAED,6FAA6F;IACvF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAc,EAAE,OAAO,EAAE,OAAe,EAAE,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAUxJ;IAED,uDAAuD;IACjD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ7E;IAED;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAQhG;IAED;;;;OAIG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAkBjG;IAED,4CAA4C;IACtC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;;;SAO3B;IAED,kFAAkF;IAC5E,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAcvE;IAED,gGAAgG;IAC1F,QAAQ,CAAC,IAAI,EAAE,MAAM,mBAO1B;YAEa,QAAQ;IAiBtB,OAAO,CAAC,OAAO;IAIf,gEAAgE;YAClD,KAAK;YAQL,QAAQ;YAUR,OAAO;IAMrB,mHAAmH;YACrG,MAAM;IAcpB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { cp, lstat, mkdir, realpath, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { within } from '../lib/paths.js';
|
|
4
|
+
import { freeName } from './names.js';
|
|
5
|
+
import { fromTrash, moveAcross, restorable, toTrash } from './trash.js';
|
|
6
|
+
/** Why an operation was refused, for the API to tell as its own error. */
|
|
7
|
+
export class FileProblem extends Error {
|
|
8
|
+
kind;
|
|
9
|
+
path;
|
|
10
|
+
constructor(kind, message, path) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.kind = kind;
|
|
13
|
+
this.path = path;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* What can change which files a folder holds: each keeps to the folder, by real paths, so neither `..` nor a link
|
|
18
|
+
* leads out of it, and a name already taken is refused unless `replace` says to move what holds it to the Trash.
|
|
19
|
+
*/
|
|
20
|
+
export class FolderFiles {
|
|
21
|
+
root;
|
|
22
|
+
constructor(root) {
|
|
23
|
+
this.root = root;
|
|
24
|
+
}
|
|
25
|
+
static async of(folder) {
|
|
26
|
+
return new FolderFiles(await realpath(folder));
|
|
27
|
+
}
|
|
28
|
+
/** A file, empty or with `content`, or a folder; the folders it is in are made as needed. */
|
|
29
|
+
async create(path, { folder = false, content, replace = false }) {
|
|
30
|
+
const target = await this.target(path);
|
|
31
|
+
const replaced = await this.clear(target, replace);
|
|
32
|
+
await mkdir(dirname(target), { recursive: true });
|
|
33
|
+
if (folder)
|
|
34
|
+
await mkdir(target);
|
|
35
|
+
else
|
|
36
|
+
await writeFile(target, content ?? '', { flag: 'wx' });
|
|
37
|
+
return { path: this.named(target), replaced };
|
|
38
|
+
}
|
|
39
|
+
/** Gives a file or folder another name where it is. */
|
|
40
|
+
async rename(path, name, replace = false) {
|
|
41
|
+
if (!name || name === '.' || name === '..' || name.includes('/') || name.includes(sep)) {
|
|
42
|
+
throw new FileProblem('invalid', `“${name}” can't be a file's name.`);
|
|
43
|
+
}
|
|
44
|
+
const source = await this.existing(path);
|
|
45
|
+
return this.relocate([[source, join(dirname(source), name)]], replace);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Moves files and folders into a folder of the session's, each keeping its name; with `keepBoth`, one whose name is
|
|
49
|
+
* taken there takes the next free one, as the Finder's Keep Both names it, `box 2.tsx`.
|
|
50
|
+
*/
|
|
51
|
+
async move(paths, into, replace = false, keepBoth = false) {
|
|
52
|
+
const folder = await this.folderAt(into);
|
|
53
|
+
const sources = await Promise.all(paths.map((path) => this.existing(path)));
|
|
54
|
+
const pairs = [];
|
|
55
|
+
for (const source of sources)
|
|
56
|
+
pairs.push([source, join(folder, keepBoth && dirname(source) !== folder ? await freeName(folder, basename(source), '') : basename(source))]);
|
|
57
|
+
return this.relocate(pairs, replace);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Copies files and folders into a folder of the session's: ones of the folder by their paths in it, others, as files
|
|
61
|
+
* dropped from the Finder, by their whole paths. Copied into the folder it is in, a copy takes a name of its own, as
|
|
62
|
+
* one whose name is taken does with `keepBoth`.
|
|
63
|
+
*/
|
|
64
|
+
async copy(paths, into, replace = false, keepBoth = false) {
|
|
65
|
+
const folder = await this.folderAt(into);
|
|
66
|
+
const copied = [];
|
|
67
|
+
const replaced = [];
|
|
68
|
+
for (const path of paths) {
|
|
69
|
+
const source = isAbsolute(path) && within(path, this.root) === undefined ? await this.outside(path) : await this.existing(path);
|
|
70
|
+
const own = dirname(source) === folder;
|
|
71
|
+
const name = own ? await freeName(folder, basename(source), 'copy') : keepBoth ? await freeName(folder, basename(source), '') : basename(source);
|
|
72
|
+
const target = join(folder, name);
|
|
73
|
+
this.notInto(source, target);
|
|
74
|
+
replaced.push(...(await this.clear(target, replace)));
|
|
75
|
+
await cp(source, target, { recursive: true, verbatimSymlinks: true, errorOnExist: true, force: false });
|
|
76
|
+
copied.push({ from: within(source, this.root) === undefined ? source : this.named(source), to: this.named(target) });
|
|
77
|
+
}
|
|
78
|
+
return { copied, replaced };
|
|
79
|
+
}
|
|
80
|
+
/** Moves files and folders to the Trash. */
|
|
81
|
+
async delete(paths) {
|
|
82
|
+
const sources = await Promise.all(paths.map((path) => this.existing(path)));
|
|
83
|
+
const trashed = [];
|
|
84
|
+
for (const source of sources)
|
|
85
|
+
trashed.push({ path: this.named(source), trash: await toTrash(source) });
|
|
86
|
+
return trashed;
|
|
87
|
+
}
|
|
88
|
+
/** Puts back what `delete` or a replace sent to the Trash, at the path it had. */
|
|
89
|
+
async restore(items, replace = false) {
|
|
90
|
+
const restored = [];
|
|
91
|
+
const replaced = [];
|
|
92
|
+
for (const { path, trash } of items) {
|
|
93
|
+
const target = await this.target(path);
|
|
94
|
+
if (!(await restorable(trash)))
|
|
95
|
+
throw new FileProblem('missing', `${path} isn't in the Trash any more.`, path);
|
|
96
|
+
replaced.push(...(await this.clear(target, replace)));
|
|
97
|
+
await fromTrash(trash, target);
|
|
98
|
+
restored.push(this.named(target));
|
|
99
|
+
}
|
|
100
|
+
return { restored, replaced };
|
|
101
|
+
}
|
|
102
|
+
/** A folder of the session's by its path there, `''` for the folder itself, as a whole path. */
|
|
103
|
+
async folderAt(path) {
|
|
104
|
+
const folder = path === '' || path === '.' ? this.root : await this.existing(path).then((each) => realpath(each));
|
|
105
|
+
const info = await lstat(folder);
|
|
106
|
+
if (!info.isDirectory() || within(folder, this.root) === undefined)
|
|
107
|
+
throw new FileProblem('missing', `${path} isn't a folder in this session's folder.`, path);
|
|
108
|
+
return folder;
|
|
109
|
+
}
|
|
110
|
+
async relocate(pairs, replace) {
|
|
111
|
+
const moved = [];
|
|
112
|
+
const replaced = [];
|
|
113
|
+
for (const [source, target] of pairs) {
|
|
114
|
+
if (source === target)
|
|
115
|
+
continue;
|
|
116
|
+
this.notInto(source, target);
|
|
117
|
+
// A name that differs only in case is the same file on a disk that ignores case, which is no clash.
|
|
118
|
+
if (!(await sameFile(source, target)))
|
|
119
|
+
replaced.push(...(await this.clear(target, replace)));
|
|
120
|
+
await moveAcross(source, target);
|
|
121
|
+
moved.push({ from: this.named(source), to: this.named(target) });
|
|
122
|
+
}
|
|
123
|
+
return { moved, replaced };
|
|
124
|
+
}
|
|
125
|
+
notInto(source, target) {
|
|
126
|
+
if (target.startsWith(`${source}${sep}`))
|
|
127
|
+
throw new FileProblem('invalid', `${this.named(source)} can't go into itself.`, this.named(source));
|
|
128
|
+
}
|
|
129
|
+
/** What holds `target`, to the Trash when `replace` says so. */
|
|
130
|
+
async clear(target, replace) {
|
|
131
|
+
if (!(await lstat(target).catch(() => undefined)))
|
|
132
|
+
return [];
|
|
133
|
+
if (!replace)
|
|
134
|
+
throw new FileProblem('taken', `${this.named(target)} is already there.`, this.named(target));
|
|
135
|
+
return [{ path: this.named(target), trash: await toTrash(target) }];
|
|
136
|
+
}
|
|
137
|
+
// A path that is there, its last part not followed, so a link is moved itself rather than what it points at.
|
|
138
|
+
async existing(path) {
|
|
139
|
+
const absolute = resolve(this.root, path);
|
|
140
|
+
const parent = within(absolute, this.root) === undefined ? undefined : await realpath(dirname(absolute)).catch(() => undefined);
|
|
141
|
+
const file = parent && join(parent, basename(absolute));
|
|
142
|
+
const there = file && file !== this.root && within(file, this.root) !== undefined && (await lstat(file).catch(() => undefined));
|
|
143
|
+
if (!file || !there)
|
|
144
|
+
throw new FileProblem('missing', `${path} isn't in this session's folder.`, path);
|
|
145
|
+
return file;
|
|
146
|
+
}
|
|
147
|
+
async outside(path) {
|
|
148
|
+
if (!(await lstat(path).catch(() => undefined)))
|
|
149
|
+
throw new FileProblem('missing', `${path} isn't there.`, path);
|
|
150
|
+
return path;
|
|
151
|
+
}
|
|
152
|
+
/** Where something new goes: under the deepest folder of its path that is there, which has to be in the folder. */
|
|
153
|
+
async target(path) {
|
|
154
|
+
const absolute = resolve(this.root, path);
|
|
155
|
+
if (within(absolute, this.root) === undefined || absolute === this.root)
|
|
156
|
+
throw new FileProblem('missing', `${path} isn't in this session's folder.`, path);
|
|
157
|
+
let base = dirname(absolute);
|
|
158
|
+
while (!(await lstat(base).catch(() => undefined)))
|
|
159
|
+
base = dirname(base);
|
|
160
|
+
const real = await realpath(base);
|
|
161
|
+
if (within(real, this.root) === undefined)
|
|
162
|
+
throw new FileProblem('missing', `${path} isn't in this session's folder.`, path);
|
|
163
|
+
return join(real, relative(base, absolute));
|
|
164
|
+
}
|
|
165
|
+
named(file) {
|
|
166
|
+
return relative(this.root, file);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function sameFile(one, other) {
|
|
170
|
+
const [a, b] = await Promise.all([lstat(one), lstat(other).catch(() => undefined)]);
|
|
171
|
+
return b !== undefined && a.dev === b.dev && a.ino === b.ino;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/files/operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Replaced, SearchQuery, SearchResults } from './types.js';
|
|
2
|
+
/** What `query` asks for as a regular expression; throws one that isn't valid. */
|
|
3
|
+
export declare function patternOf({ query, caseSensitive, wholeWord, regex }: SearchQuery): RegExp;
|
|
4
|
+
/** Every line of the folder's files the query finds, file by file in the order git lists them, up to a limit. */
|
|
5
|
+
export declare function searchFiles(folder: string, search: SearchQuery): Promise<SearchResults>;
|
|
6
|
+
/**
|
|
7
|
+
* Replaces what the query finds with `replacement` in the folder's files, or in `paths` of them only, and writes those
|
|
8
|
+
* it changed. In a regular expression `$1` and the like stand for what it caught; otherwise the text goes in as it is.
|
|
9
|
+
*/
|
|
10
|
+
export declare function replaceInFiles(folder: string, search: SearchQuery, replacement: string, paths?: string[]): Promise<Replaced>;
|
|
11
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/files/search.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAe,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AASpF,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,WAAW,UAIhF;AAED,iHAAiH;AACjH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAqB7F;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBlI"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { readFile, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { matchesGlob } from '../lib/glob.js';
|
|
4
|
+
import { listProjectFiles } from '../prompt/files.js';
|
|
5
|
+
// Large enough for any source file; a bigger one is data, a bundle or a log, and would slow every search down.
|
|
6
|
+
const MAX_BYTES = 1024 * 1024;
|
|
7
|
+
const MAX_MATCHES = 5000;
|
|
8
|
+
const MAX_LINE = 500;
|
|
9
|
+
// Files read at once: enough to keep the disk busy, few enough not to run out of handles in a large project.
|
|
10
|
+
const AT_ONCE = 32;
|
|
11
|
+
/** What `query` asks for as a regular expression; throws one that isn't valid. */
|
|
12
|
+
export function patternOf({ query, caseSensitive, wholeWord, regex }) {
|
|
13
|
+
const source = regex ? query : query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
14
|
+
return new RegExp(wholeWord ? `\\b(?:${source})\\b` : source, caseSensitive ? 'g' : 'gi');
|
|
15
|
+
}
|
|
16
|
+
/** Every line of the folder's files the query finds, file by file in the order git lists them, up to a limit. */
|
|
17
|
+
export async function searchFiles(folder, search) {
|
|
18
|
+
const pattern = patternOf(search);
|
|
19
|
+
const files = [];
|
|
20
|
+
let found = 0;
|
|
21
|
+
await eachText(folder, await candidates(folder, search), (path, text) => {
|
|
22
|
+
if (found >= MAX_MATCHES)
|
|
23
|
+
return false;
|
|
24
|
+
const matches = matchesIn(text, pattern, MAX_MATCHES - found);
|
|
25
|
+
if (matches.length > 0) {
|
|
26
|
+
files.push({ path, matches });
|
|
27
|
+
found += matches.reduce((sum, match) => sum + match.ranges.length, 0);
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
files.sort((a, b) => a.path.localeCompare(b.path));
|
|
32
|
+
return { files, truncated: found >= MAX_MATCHES };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Replaces what the query finds with `replacement` in the folder's files, or in `paths` of them only, and writes those
|
|
36
|
+
* it changed. In a regular expression `$1` and the like stand for what it caught; otherwise the text goes in as it is.
|
|
37
|
+
*/
|
|
38
|
+
export async function replaceInFiles(folder, search, replacement, paths) {
|
|
39
|
+
// Line by line, as the search found them: `^` and `$` stand for a line's start and end.
|
|
40
|
+
const pattern = new RegExp(patternOf(search).source, `${patternOf(search).flags}m`);
|
|
41
|
+
const text = search.regex ? replacement : replacement.replaceAll('$', '$$$$');
|
|
42
|
+
const chosen = (await candidates(folder, search)).filter((path) => !paths || paths.includes(path));
|
|
43
|
+
const changed = [];
|
|
44
|
+
let replacements = 0;
|
|
45
|
+
await eachText(folder, chosen, (path, content) => {
|
|
46
|
+
const count = [...content.matchAll(pattern)].filter((found) => found[0] !== '').length;
|
|
47
|
+
if (count > 0) {
|
|
48
|
+
changed.push({ path, text: content.replace(pattern, text) });
|
|
49
|
+
replacements += count;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
await Promise.all(changed.map(({ path, text: next }) => writeFile(join(folder, path), next)));
|
|
54
|
+
return { files: changed.length, replacements };
|
|
55
|
+
}
|
|
56
|
+
/** The folder's files the search's globs let in, as git lists them, so ignored ones stay out. */
|
|
57
|
+
async function candidates(folder, { include, exclude }) {
|
|
58
|
+
const included = globsOf(include);
|
|
59
|
+
const excluded = globsOf(exclude);
|
|
60
|
+
return (await listProjectFiles(folder)).filter((path) => !path.endsWith('/') && (included.length === 0 || included.some((glob) => fits(glob, path))) && !excluded.some((glob) => fits(glob, path)));
|
|
61
|
+
}
|
|
62
|
+
/** Each file's text, a few at a time, till `each` says to stop; one too large or not text is passed. */
|
|
63
|
+
async function eachText(folder, paths, each) {
|
|
64
|
+
for (let start = 0; start < paths.length; start += AT_ONCE) {
|
|
65
|
+
const read = await Promise.all(paths.slice(start, start + AT_ONCE).map(async (path) => {
|
|
66
|
+
const file = join(folder, path);
|
|
67
|
+
const info = await stat(file).catch(() => undefined);
|
|
68
|
+
if (!info?.isFile() || info.size > MAX_BYTES)
|
|
69
|
+
return undefined;
|
|
70
|
+
const text = await readFile(file, 'utf8').catch(() => undefined);
|
|
71
|
+
return text === undefined || text.includes('\u0000') ? undefined : { path, text };
|
|
72
|
+
}));
|
|
73
|
+
for (const file of read)
|
|
74
|
+
if (file && !each(file.path, file.text))
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function matchesIn(text, pattern, room) {
|
|
79
|
+
const matches = [];
|
|
80
|
+
const lines = text.split(/\r?\n/);
|
|
81
|
+
let left = room;
|
|
82
|
+
for (let index = 0; index < lines.length && left > 0; index++) {
|
|
83
|
+
const line = lines[index];
|
|
84
|
+
const ranges = [];
|
|
85
|
+
pattern.lastIndex = 0;
|
|
86
|
+
for (let found = pattern.exec(line); found && left > 0; found = pattern.exec(line)) {
|
|
87
|
+
// One that finds nothing, as `^`, would find it again at the same place for ever.
|
|
88
|
+
if (found[0] === '') {
|
|
89
|
+
pattern.lastIndex++;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (found.index < MAX_LINE)
|
|
93
|
+
ranges.push([found.index, Math.min(found.index + found[0].length, MAX_LINE)]);
|
|
94
|
+
left--;
|
|
95
|
+
}
|
|
96
|
+
if (ranges.length > 0)
|
|
97
|
+
matches.push({ line: index + 1, text: line.slice(0, MAX_LINE), ranges });
|
|
98
|
+
}
|
|
99
|
+
return matches;
|
|
100
|
+
}
|
|
101
|
+
function globsOf(list) {
|
|
102
|
+
return (list ?? '')
|
|
103
|
+
.split(',')
|
|
104
|
+
.map((glob) => glob.trim())
|
|
105
|
+
.filter(Boolean);
|
|
106
|
+
}
|
|
107
|
+
/** A glob fits a file itself, or a folder it is in, as `src` lets in everything under it. */
|
|
108
|
+
function fits(glob, path) {
|
|
109
|
+
const parts = path.split('/');
|
|
110
|
+
return parts.some((_, index) => matchesGlob(glob, parts.slice(0, index + 1).join('/')));
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/files/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class TrashUnsupported extends Error {
|
|
2
|
+
}
|
|
3
|
+
/** Moves a file or folder to the Trash, as the Finder would, under a name free there; where it went. */
|
|
4
|
+
export declare function toTrash(path: string): Promise<string>;
|
|
5
|
+
/** Whether `fromTrash` can put it back: `toTrash` moved it there, and it is still there. */
|
|
6
|
+
export declare function restorable(trash: string): Promise<boolean>;
|
|
7
|
+
/** Puts what `toTrash` moved back at `path`, once `restorable` said it can. */
|
|
8
|
+
export declare function fromTrash(trash: string, path: string): Promise<void>;
|
|
9
|
+
/** A rename, or a copy and a removal where the two are on different disks, as a project on another volume is. */
|
|
10
|
+
export declare function moveAcross(from: string, to: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=trash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trash.d.ts","sourceRoot":"","sources":["../../src/files/trash.ts"],"names":[],"mappings":"AAQA,qBAAa,gBAAiB,SAAQ,KAAK;CAAG;AAE9C,wGAAwG;AACxG,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,mBAiBzC;AAED,4FAA4F;AAC5F,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,oBAE7C;AAED,+EAA+E;AAC/E,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAO1D;AAED,iHAAiH;AACjH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,iBASxD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { cp, lstat, mkdir, rename, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { basename, dirname, join } from 'node:path';
|
|
4
|
+
import { freeName } from './names.js';
|
|
5
|
+
/** What this process put in the Trash, so only that can be taken back out through it. */
|
|
6
|
+
const trashed = new Set();
|
|
7
|
+
export class TrashUnsupported extends Error {
|
|
8
|
+
}
|
|
9
|
+
/** Moves a file or folder to the Trash, as the Finder would, under a name free there; where it went. */
|
|
10
|
+
export async function toTrash(path) {
|
|
11
|
+
const { files, info } = trashFolders();
|
|
12
|
+
await mkdir(files, { recursive: true });
|
|
13
|
+
const name = await freeName(files, basename(path), '');
|
|
14
|
+
const trash = join(files, name);
|
|
15
|
+
if (info) {
|
|
16
|
+
await mkdir(info, { recursive: true });
|
|
17
|
+
await writeFile(join(info, `${name}.trashinfo`), `[Trash Info]\nPath=${encodeURI(path)}\nDeletionDate=${localDate(new Date())}\n`);
|
|
18
|
+
}
|
|
19
|
+
await moveAcross(path, trash);
|
|
20
|
+
trashed.add(trash);
|
|
21
|
+
return trash;
|
|
22
|
+
}
|
|
23
|
+
/** Whether `fromTrash` can put it back: `toTrash` moved it there, and it is still there. */
|
|
24
|
+
export async function restorable(trash) {
|
|
25
|
+
return trashed.has(trash) && (await lstat(trash).then(() => true, () => false));
|
|
26
|
+
}
|
|
27
|
+
/** Puts what `toTrash` moved back at `path`, once `restorable` said it can. */
|
|
28
|
+
export async function fromTrash(trash, path) {
|
|
29
|
+
const { info } = trashFolders();
|
|
30
|
+
await mkdir(dirname(path), { recursive: true });
|
|
31
|
+
await moveAcross(trash, path);
|
|
32
|
+
trashed.delete(trash);
|
|
33
|
+
if (info)
|
|
34
|
+
await rm(join(info, `${basename(trash)}.trashinfo`), { force: true });
|
|
35
|
+
}
|
|
36
|
+
/** A rename, or a copy and a removal where the two are on different disks, as a project on another volume is. */
|
|
37
|
+
export async function moveAcross(from, to) {
|
|
38
|
+
try {
|
|
39
|
+
await rename(from, to);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error.code !== 'EXDEV')
|
|
43
|
+
throw error;
|
|
44
|
+
await cp(from, to, { recursive: true, verbatimSymlinks: true, errorOnExist: true, force: false });
|
|
45
|
+
await rm(from, { recursive: true, force: true });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// The Finder's Trash takes what is moved into it without the record its own Put Back reads, which only the Finder
|
|
49
|
+
// writes; Jinion puts back what it trashed itself. Elsewhere, the trash freedesktop.org describes, record and all.
|
|
50
|
+
function trashFolders() {
|
|
51
|
+
if (process.env.JINION_TRASH)
|
|
52
|
+
return { files: process.env.JINION_TRASH };
|
|
53
|
+
if (process.platform === 'darwin')
|
|
54
|
+
return { files: join(homedir(), '.Trash') };
|
|
55
|
+
if (process.platform === 'win32')
|
|
56
|
+
throw new TrashUnsupported("Moving to the Recycle Bin isn't supported on Windows yet.");
|
|
57
|
+
const trash = join(process.env.XDG_DATA_HOME ?? join(homedir(), '.local', 'share'), 'Trash');
|
|
58
|
+
return { files: join(trash, 'files'), info: join(trash, 'info') };
|
|
59
|
+
}
|
|
60
|
+
function localDate(date) {
|
|
61
|
+
const two = (value) => String(value).padStart(2, '0');
|
|
62
|
+
return `${date.getFullYear()}-${two(date.getMonth() + 1)}-${two(date.getDate())}T${two(date.getHours())}:${two(date.getMinutes())}:${two(date.getSeconds())}`;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=trash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trash.js","sourceRoot":"","sources":["../../src/files/trash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,yFAAyF;AACzF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;AAElC,MAAM,OAAO,gBAAiB,SAAQ,KAAK;CAAG;AAE9C,wGAAwG;AACxG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY;IACxC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IAEvC,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEhC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,YAAY,CAAC,EAAE,sBAAsB,SAAS,CAAC,IAAI,CAAC,kBAAkB,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IACrI,CAAC;IAED,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,IAAY;IACzD,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IAEhC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,IAAI;QAAE,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,iHAAiH;AACjH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,EAAU;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,KAAK,CAAC;QAEnE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClG,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,kHAAkH;AAClH,mHAAmH;AACnH,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IACzE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;IAC/E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,IAAI,gBAAgB,CAAC,2DAA2D,CAAC,CAAC;IAE1H,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAE7F,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,SAAS,CAAC,IAAU;IAC3B,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE9D,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AAChK,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** What to find in the folder's files, and in which of them. */
|
|
3
|
+
export declare const SearchQuery: z.ZodObject<{
|
|
4
|
+
query: z.ZodString;
|
|
5
|
+
caseSensitive: z.ZodOptional<z.ZodBoolean>;
|
|
6
|
+
wholeWord: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
regex: z.ZodOptional<z.ZodBoolean>;
|
|
8
|
+
include: z.ZodOptional<z.ZodString>;
|
|
9
|
+
exclude: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type SearchQuery = z.infer<typeof SearchQuery>;
|
|
12
|
+
/** A line with what was found in it, as `[start, end)` places in `text`, counted from 0. */
|
|
13
|
+
export declare const SearchMatch: z.ZodObject<{
|
|
14
|
+
line: z.ZodNumber;
|
|
15
|
+
text: z.ZodString;
|
|
16
|
+
ranges: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export type SearchMatch = z.infer<typeof SearchMatch>;
|
|
19
|
+
export declare const FileMatches: z.ZodObject<{
|
|
20
|
+
path: z.ZodString;
|
|
21
|
+
matches: z.ZodArray<z.ZodObject<{
|
|
22
|
+
line: z.ZodNumber;
|
|
23
|
+
text: z.ZodString;
|
|
24
|
+
ranges: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
export type FileMatches = z.infer<typeof FileMatches>;
|
|
28
|
+
/** `truncated` when there were more than are given. */
|
|
29
|
+
export declare const SearchResults: z.ZodObject<{
|
|
30
|
+
files: z.ZodArray<z.ZodObject<{
|
|
31
|
+
path: z.ZodString;
|
|
32
|
+
matches: z.ZodArray<z.ZodObject<{
|
|
33
|
+
line: z.ZodNumber;
|
|
34
|
+
text: z.ZodString;
|
|
35
|
+
ranges: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
|
|
36
|
+
}, z.core.$strip>>;
|
|
37
|
+
}, z.core.$strip>>;
|
|
38
|
+
truncated: z.ZodBoolean;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export type SearchResults = z.infer<typeof SearchResults>;
|
|
41
|
+
export declare const Replaced: z.ZodObject<{
|
|
42
|
+
files: z.ZodNumber;
|
|
43
|
+
replacements: z.ZodNumber;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export type Replaced = z.infer<typeof Replaced>;
|
|
46
|
+
/**
|
|
47
|
+
* A file a client watches changed on disk: its time now, none once it is gone. Moved or renamed through the API, with
|
|
48
|
+
* `movedTo`, its path now, which is watched from then on in its place.
|
|
49
|
+
*/
|
|
50
|
+
export declare const FileChanged: z.ZodObject<{
|
|
51
|
+
session: z.ZodString;
|
|
52
|
+
path: z.ZodString;
|
|
53
|
+
modified: z.ZodOptional<z.ZodNumber>;
|
|
54
|
+
movedTo: z.ZodOptional<z.ZodString>;
|
|
55
|
+
by: z.ZodOptional<z.ZodEnum<{
|
|
56
|
+
agent: "agent";
|
|
57
|
+
other: "other";
|
|
58
|
+
}>>;
|
|
59
|
+
}, z.core.$strip>;
|
|
60
|
+
export type FileChanged = z.infer<typeof FileChanged>;
|
|
61
|
+
/** A file or folder moved, renamed or copied, by its paths in the session's folder; a copy from outside it, by its whole path. */
|
|
62
|
+
export declare const Moved: z.ZodObject<{
|
|
63
|
+
from: z.ZodString;
|
|
64
|
+
to: z.ZodString;
|
|
65
|
+
}, z.core.$strip>;
|
|
66
|
+
export type Moved = z.infer<typeof Moved>;
|
|
67
|
+
/** What went to the Trash: its path in the session's folder, and its whole path in the Trash, by which it is put back. */
|
|
68
|
+
export declare const Trashed: z.ZodObject<{
|
|
69
|
+
path: z.ZodString;
|
|
70
|
+
trash: z.ZodString;
|
|
71
|
+
}, z.core.$strip>;
|
|
72
|
+
export type Trashed = z.infer<typeof Trashed>;
|
|
73
|
+
/** What a call did, so a client can undo it; `replaced`, what was in the way and went to the Trash for it. */
|
|
74
|
+
export declare const FilesMoved: z.ZodObject<{
|
|
75
|
+
moved: z.ZodArray<z.ZodObject<{
|
|
76
|
+
from: z.ZodString;
|
|
77
|
+
to: z.ZodString;
|
|
78
|
+
}, z.core.$strip>>;
|
|
79
|
+
replaced: z.ZodArray<z.ZodObject<{
|
|
80
|
+
path: z.ZodString;
|
|
81
|
+
trash: z.ZodString;
|
|
82
|
+
}, z.core.$strip>>;
|
|
83
|
+
}, z.core.$strip>;
|
|
84
|
+
export type FilesMoved = z.infer<typeof FilesMoved>;
|
|
85
|
+
export declare const FilesCopied: z.ZodObject<{
|
|
86
|
+
copied: z.ZodArray<z.ZodObject<{
|
|
87
|
+
from: z.ZodString;
|
|
88
|
+
to: z.ZodString;
|
|
89
|
+
}, z.core.$strip>>;
|
|
90
|
+
replaced: z.ZodArray<z.ZodObject<{
|
|
91
|
+
path: z.ZodString;
|
|
92
|
+
trash: z.ZodString;
|
|
93
|
+
}, z.core.$strip>>;
|
|
94
|
+
}, z.core.$strip>;
|
|
95
|
+
export type FilesCopied = z.infer<typeof FilesCopied>;
|
|
96
|
+
export declare const FileCreated: z.ZodObject<{
|
|
97
|
+
path: z.ZodString;
|
|
98
|
+
replaced: z.ZodArray<z.ZodObject<{
|
|
99
|
+
path: z.ZodString;
|
|
100
|
+
trash: z.ZodString;
|
|
101
|
+
}, z.core.$strip>>;
|
|
102
|
+
}, z.core.$strip>;
|
|
103
|
+
export type FileCreated = z.infer<typeof FileCreated>;
|
|
104
|
+
export declare const FilesRestored: z.ZodObject<{
|
|
105
|
+
restored: z.ZodArray<z.ZodString>;
|
|
106
|
+
replaced: z.ZodArray<z.ZodObject<{
|
|
107
|
+
path: z.ZodString;
|
|
108
|
+
trash: z.ZodString;
|
|
109
|
+
}, z.core.$strip>>;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
export type FilesRestored = z.infer<typeof FilesRestored>;
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/files/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gEAAgE;AAChE,eAAO,MAAM,WAAW;;;;;;;iBAWtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,4FAA4F;AAC5F,eAAO,MAAM,WAAW;;;;iBAKtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,WAAW;;;;;;;iBAAgE,CAAC;AAEzF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,uDAAuD;AACvD,eAAO,MAAM,aAAa;;;;;;;;;;iBAAoE,CAAC;AAE/F,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,eAAO,MAAM,QAAQ;;;iBAAwE,CAAC;AAE9F,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;iBAOtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,kIAAkI;AAClI,eAAO,MAAM,KAAK;;;iBAAiD,CAAC;AAEpE,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;AAE1C,0HAA0H;AAC1H,eAAO,MAAM,OAAO;;;iBAAoD,CAAC;AAEzE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAE9C,8GAA8G;AAC9G,eAAO,MAAM,UAAU;;;;;;;;;iBAAkE,CAAC;AAE1F,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,WAAW;;;;;;;;;iBAAmE,CAAC;AAE5F,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,WAAW;;;;;;iBAA6D,CAAC;AAEtF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,aAAa;;;;;;iBAA0E,CAAC;AAErG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
|