dotdo 0.0.2 → 0.1.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/cli/README.md +238 -0
- package/cli/agent.ts +72 -0
- package/cli/bin.js +44 -0
- package/cli/bin.ts +38 -0
- package/cli/build.ts +157 -0
- package/cli/commands/auth/login.ts +14 -0
- package/cli/commands/auth/logout.ts +6 -0
- package/cli/commands/auth/whoami.ts +16 -0
- package/cli/commands/deploy-multi.ts +245 -0
- package/cli/commands/dev/deploy.ts +100 -0
- package/cli/commands/dev/dev.ts +95 -0
- package/cli/commands/dev/logs.ts +91 -0
- package/cli/commands/dev-local.ts +88 -0
- package/cli/commands/do-ops.ts +314 -0
- package/cli/commands/index.ts +100 -0
- package/cli/commands/init.ts +247 -0
- package/cli/commands/introspect/emitter.ts +315 -0
- package/cli/commands/introspect/index.ts +193 -0
- package/cli/commands/link.ts +598 -0
- package/cli/commands/snippets.ts +415 -0
- package/cli/commands/tunnel.ts +239 -0
- package/cli/device-auth.ts +289 -0
- package/cli/fallback.ts +12 -0
- package/cli/index.ts +121 -0
- package/cli/main.ts +246 -0
- package/cli/mcp-stdio.ts +790 -0
- package/cli/package.json +62 -0
- package/cli/runtime/do-registry.ts +193 -0
- package/cli/runtime/embedded-db.ts +344 -0
- package/cli/runtime/index.ts +9 -0
- package/cli/runtime/miniflare-adapter.ts +162 -0
- package/cli/sandbox.ts +82 -0
- package/cli/src/args.ts +174 -0
- package/cli/src/auth.ts +55 -0
- package/cli/src/commands/call.ts +84 -0
- package/cli/src/commands/charge.ts +96 -0
- package/cli/src/commands/config.ts +115 -0
- package/cli/src/commands/email.ts +112 -0
- package/cli/src/commands/llm.ts +115 -0
- package/cli/src/commands/queue.ts +134 -0
- package/cli/src/commands/text.ts +86 -0
- package/cli/src/config.ts +185 -0
- package/cli/src/output.ts +246 -0
- package/cli/src/rpc.ts +192 -0
- package/cli/utils/config.ts +282 -0
- package/cli/utils/detect.ts +73 -0
- package/cli/utils/index.ts +15 -0
- package/cli/utils/logger.ts +232 -0
- package/dist/ai/template-literals.js +2 -2
- package/dist/ai/template-literals.js.map +1 -1
- package/dist/api/middleware/auth.js +3 -2
- package/dist/api/middleware/auth.js.map +1 -1
- package/dist/db/iceberg/inverted-index.js +1 -1
- package/dist/db/iceberg/inverted-index.js.map +1 -1
- package/dist/db/iceberg/puffin.js.map +1 -1
- package/dist/db/json-indexes.js.map +1 -1
- package/dist/db/objects.js.map +1 -1
- package/dist/db/primitives/dag-scheduler/index.js +1 -1
- package/dist/db/primitives/dag-scheduler/index.js.map +1 -1
- package/dist/db/primitives/observability.js.map +1 -1
- package/dist/db/primitives/schema-evolution.js.map +1 -1
- package/dist/db/primitives/temporal-store.js.map +1 -1
- package/dist/db/primitives/typed-column-store.js.map +1 -1
- package/dist/db/primitives/utils/duration.js.map +1 -1
- package/dist/db/primitives/utils/murmur3.js +12 -14
- package/dist/db/primitives/utils/murmur3.js.map +1 -1
- package/dist/db/primitives/window-manager.js.map +1 -1
- package/dist/db/stores.js.map +1 -1
- package/dist/db/things.js.map +1 -1
- package/dist/lib/DODispatcher.js +2 -2
- package/dist/lib/DODispatcher.js.map +1 -1
- package/dist/lib/auto-wiring.js.map +1 -1
- package/dist/lib/channels/email.js +1 -1
- package/dist/lib/channels/email.js.map +1 -1
- package/dist/lib/channels/slack-blockkit.js.map +1 -1
- package/dist/lib/cloudflare/ai.js +1 -1
- package/dist/lib/cloudflare/ai.js.map +1 -1
- package/dist/lib/cloudflare/kv.js +1 -1
- package/dist/lib/cloudflare/kv.js.map +1 -1
- package/dist/lib/cloudflare/r2.js +3 -3
- package/dist/lib/cloudflare/r2.js.map +1 -1
- package/dist/lib/cloudflare/vectorize.js.map +1 -1
- package/dist/lib/cloudflare/workflows.js.map +1 -1
- package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -1
- package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -1
- package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -1
- package/dist/lib/executors/HumanFunctionExecutor.js +1 -1
- package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -1
- package/dist/lib/executors/ParallelStepExecutor.js.map +1 -1
- package/dist/lib/experiments.js.map +1 -1
- package/dist/lib/flags/store.js.map +1 -1
- package/dist/lib/functions/FunctionComposition.js.map +1 -1
- package/dist/lib/functions/FunctionMiddleware.js.map +1 -1
- package/dist/lib/functions/FunctionRegistry.js.map +1 -1
- package/dist/lib/humans/templates.js.map +1 -1
- package/dist/lib/identity.js +2 -2
- package/dist/lib/identity.js.map +1 -1
- package/dist/lib/logging/index.js.map +1 -1
- package/dist/lib/mixins/bash.js +1 -73
- package/dist/lib/mixins/bash.js.map +1 -1
- package/dist/lib/mixins/git.js +0 -5
- package/dist/lib/mixins/git.js.map +1 -1
- package/dist/lib/mixins/npm.js.map +1 -1
- package/dist/lib/noun-id.js.map +1 -1
- package/dist/lib/rate-limit/sliding-window.js.map +1 -1
- package/dist/lib/rpc/bindings.js.map +1 -1
- package/dist/lib/safe-stringify.js.map +1 -1
- package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -1
- package/dist/lib/sqids.js.map +1 -1
- package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -1
- package/dist/lib/sql/adapters/pgsql-parser.js +19 -18
- package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -1
- package/dist/metrics/hunch.js.map +1 -1
- package/dist/objects/API.js +1 -1
- package/dist/objects/API.js.map +1 -1
- package/dist/objects/Agent.js.map +1 -1
- package/dist/objects/Browser.js.map +1 -1
- package/dist/objects/CLI.js.map +1 -1
- package/dist/objects/DOBase.js.map +1 -1
- package/dist/objects/DOCache.js +153 -0
- package/dist/objects/DOCache.js.map +1 -0
- package/dist/objects/DOFull.js.map +1 -1
- package/dist/objects/Entity.js.map +1 -1
- package/dist/objects/Human.js.map +1 -1
- package/dist/objects/IcebergMetadataDO.js.map +1 -1
- package/dist/objects/IntegrationsDO.js.map +1 -1
- package/dist/objects/ObservabilityBroadcaster.js.map +1 -1
- package/dist/objects/Package.js.map +1 -1
- package/dist/objects/Product.js +1 -1
- package/dist/objects/Product.js.map +1 -1
- package/dist/objects/SaaS.js.map +1 -1
- package/dist/objects/SandboxDO.js.map +1 -1
- package/dist/objects/Service.js.map +1 -1
- package/dist/objects/VectorShardDO.js +9 -7
- package/dist/objects/VectorShardDO.js.map +1 -1
- package/dist/objects/Workflow.js.map +1 -1
- package/dist/objects/WorkflowFactory.js.map +1 -1
- package/dist/objects/WorkflowRuntime.js.map +1 -1
- package/dist/objects/lifecycle/Branch.js.map +1 -1
- package/dist/objects/lifecycle/Clone.js +1 -1
- package/dist/objects/lifecycle/Clone.js.map +1 -1
- package/dist/objects/lifecycle/Compact.js.map +1 -1
- package/dist/objects/lifecycle/Shard.js.map +1 -1
- package/dist/objects/persistence/checkpoint-manager.js.map +1 -1
- package/dist/objects/persistence/migration-runner.js.map +1 -1
- package/dist/objects/persistence/replication-manager.js +2 -2
- package/dist/objects/persistence/replication-manager.js.map +1 -1
- package/dist/objects/persistence/tiered-storage-manager.js.map +1 -1
- package/dist/objects/persistence/wal-manager.js.map +1 -1
- package/dist/objects/transport/auth-layer.js.map +1 -1
- package/dist/objects/transport/chain.js.map +1 -1
- package/dist/objects/transport/mcp-server.js +7 -6
- package/dist/objects/transport/mcp-server.js.map +1 -1
- package/dist/objects/transport/rest-autowire.js +3 -2
- package/dist/objects/transport/rest-autowire.js.map +1 -1
- package/dist/objects/transport/rest-router.js.map +1 -1
- package/dist/objects/transport/rpc-server.js +18 -15
- package/dist/objects/transport/rpc-server.js.map +1 -1
- package/dist/objects/transport/shared.js +2 -1
- package/dist/objects/transport/shared.js.map +1 -1
- package/dist/snippets/artifacts-ingest.js.map +1 -1
- package/dist/snippets/artifacts-serve.js.map +1 -1
- package/dist/snippets/search.js.map +1 -1
- package/dist/workflows/ScheduleManager.js.map +1 -1
- package/dist/workflows/StepResultStorage.js.map +1 -1
- package/dist/workflows/WaitForEventManager.js.map +1 -1
- package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -1
- package/dist/workflows/compat/inngest/index.js.map +1 -1
- package/dist/workflows/compat/qstash/index.js.map +1 -1
- package/dist/workflows/compat/temporal/client.js.map +1 -1
- package/dist/workflows/compat/temporal/index.js.map +1 -1
- package/dist/workflows/compat/trigger/index.js.map +1 -1
- package/dist/workflows/compat/utils/index.js.map +1 -1
- package/dist/workflows/context/correlation.js +2 -2
- package/dist/workflows/context/correlation.js.map +1 -1
- package/dist/workflows/context/experiment.js +1 -1
- package/dist/workflows/context/experiment.js.map +1 -1
- package/dist/workflows/context/flag.js +1 -1
- package/dist/workflows/context/flag.js.map +1 -1
- package/dist/workflows/context/measure.js +1 -1
- package/dist/workflows/context/measure.js.map +1 -1
- package/dist/workflows/context/rate-limit.js.map +1 -1
- package/dist/workflows/data/entity-events/entity-events.js.map +1 -1
- package/dist/workflows/data/experiment/index.js.map +1 -1
- package/dist/workflows/data/goal/context.js +1 -1
- package/dist/workflows/data/goal/context.js.map +1 -1
- package/dist/workflows/data/measure/index.js +1 -1
- package/dist/workflows/data/measure/index.js.map +1 -1
- package/dist/workflows/data/stream/index.js +10 -76
- package/dist/workflows/data/stream/index.js.map +1 -1
- package/dist/workflows/data/track/context.js.map +1 -1
- package/dist/workflows/data/view/context.js.map +1 -1
- package/dist/workflows/domain.js.map +1 -1
- package/dist/workflows/flags.js +1 -1
- package/dist/workflows/flags.js.map +1 -1
- package/dist/workflows/hash.js.map +1 -1
- package/dist/workflows/on.js +1 -1
- package/dist/workflows/on.js.map +1 -1
- package/dist/workflows/schedule-builder.js.map +1 -1
- package/dist/workflows/visibility/index.js +0 -2
- package/dist/workflows/visibility/index.js.map +1 -1
- package/dist/workflows/visibility/query-parser.js.map +1 -1
- package/package.json +18 -3
- package/dist/api/analytics/router.js +0 -601
- package/dist/api/analytics/router.js.map +0 -1
- package/dist/api/index.js +0 -158
- package/dist/api/index.js.map +0 -1
- package/dist/api/middleware/error-handling.js +0 -176
- package/dist/api/middleware/error-handling.js.map +0 -1
- package/dist/api/middleware/request-id.js +0 -21
- package/dist/api/middleware/request-id.js.map +0 -1
- package/dist/api/pages.js +0 -1180
- package/dist/api/pages.js.map +0 -1
- package/dist/api/routes/api.js +0 -612
- package/dist/api/routes/api.js.map +0 -1
- package/dist/api/routes/browsers.js +0 -471
- package/dist/api/routes/browsers.js.map +0 -1
- package/dist/api/routes/do.js +0 -188
- package/dist/api/routes/do.js.map +0 -1
- package/dist/api/routes/mcp.js +0 -459
- package/dist/api/routes/mcp.js.map +0 -1
- package/dist/api/routes/obs.js +0 -445
- package/dist/api/routes/obs.js.map +0 -1
- package/dist/api/routes/openapi.js +0 -794
- package/dist/api/routes/openapi.js.map +0 -1
- package/dist/api/routes/rpc.js +0 -1103
- package/dist/api/routes/rpc.js.map +0 -1
- package/dist/api/routes/sandboxes.js +0 -389
- package/dist/api/routes/sandboxes.js.map +0 -1
- package/dist/api/test-do.js +0 -38
- package/dist/api/test-do.js.map +0 -1
- package/dist/api/types.js +0 -11
- package/dist/api/types.js.map +0 -1
- package/dist/cli/bin.js +0 -2
- package/dist/cli/main.js +0 -52342
- package/dist/do/bash.js +0 -35
- package/dist/do/bash.js.map +0 -1
- package/dist/do/fs.js +0 -25
- package/dist/do/fs.js.map +0 -1
- package/dist/do/full.js +0 -61
- package/dist/do/full.js.map +0 -1
- package/dist/do/git.js +0 -28
- package/dist/do/git.js.map +0 -1
- package/dist/do/index.js +0 -52
- package/dist/do/index.js.map +0 -1
- package/dist/lib/agent/tools/bash.js +0 -336
- package/dist/lib/agent/tools/bash.js.map +0 -1
- package/dist/lib/agent/tools/edit.js +0 -157
- package/dist/lib/agent/tools/edit.js.map +0 -1
- package/dist/lib/agent/tools/glob.js +0 -137
- package/dist/lib/agent/tools/glob.js.map +0 -1
- package/dist/lib/agent/tools/grep.js +0 -315
- package/dist/lib/agent/tools/grep.js.map +0 -1
- package/dist/lib/agent/tools/index.js +0 -71
- package/dist/lib/agent/tools/index.js.map +0 -1
- package/dist/lib/agent/tools/read.js +0 -212
- package/dist/lib/agent/tools/read.js.map +0 -1
- package/dist/lib/agent/tools/types.js +0 -197
- package/dist/lib/agent/tools/types.js.map +0 -1
- package/dist/lib/agent/tools/write.js +0 -159
- package/dist/lib/agent/tools/write.js.map +0 -1
- package/dist/lib/mixins/index.js +0 -29
- package/dist/lib/mixins/index.js.map +0 -1
- package/dist/primitives/bashx/src/ast/analyze.js +0 -1472
- package/dist/primitives/bashx/src/ast/analyze.js.map +0 -1
- package/dist/primitives/bashx/src/ast/parser.js +0 -1488
- package/dist/primitives/bashx/src/ast/parser.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/crypto.js +0 -1954
- package/dist/primitives/bashx/src/do/commands/crypto.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/data-processing.js +0 -1812
- package/dist/primitives/bashx/src/do/commands/data-processing.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/extended-utils.js +0 -804
- package/dist/primitives/bashx/src/do/commands/extended-utils.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/math-control.js +0 -1122
- package/dist/primitives/bashx/src/do/commands/math-control.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/posix-utils.js +0 -1015
- package/dist/primitives/bashx/src/do/commands/posix-utils.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/system-utils.js +0 -687
- package/dist/primitives/bashx/src/do/commands/system-utils.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/test-command.js +0 -523
- package/dist/primitives/bashx/src/do/commands/test-command.js.map +0 -1
- package/dist/primitives/bashx/src/do/commands/text-processing.js +0 -1550
- package/dist/primitives/bashx/src/do/commands/text-processing.js.map +0 -1
- package/dist/primitives/bashx/src/do/container-executor.js +0 -429
- package/dist/primitives/bashx/src/do/container-executor.js.map +0 -1
- package/dist/primitives/bashx/src/do/index.js +0 -668
- package/dist/primitives/bashx/src/do/index.js.map +0 -1
- package/dist/primitives/bashx/src/do/tiered-executor.js +0 -2647
- package/dist/primitives/bashx/src/do/tiered-executor.js.map +0 -1
- package/dist/primitives/bashx/src/do/worker.js +0 -352
- package/dist/primitives/bashx/src/do/worker.js.map +0 -1
- package/dist/primitives/bashx/src/types.js +0 -10
- package/dist/primitives/bashx/src/types.js.map +0 -1
- package/dist/primitives/fsx/core/backend.js +0 -480
- package/dist/primitives/fsx/core/backend.js.map +0 -1
- package/dist/primitives/fsx/core/constants.js +0 -140
- package/dist/primitives/fsx/core/constants.js.map +0 -1
- package/dist/primitives/fsx/core/fsx.js +0 -1184
- package/dist/primitives/fsx/core/fsx.js.map +0 -1
- package/dist/primitives/fsx/core/glob/glob.js +0 -438
- package/dist/primitives/fsx/core/glob/glob.js.map +0 -1
- package/dist/primitives/fsx/core/glob/index.js +0 -8
- package/dist/primitives/fsx/core/glob/index.js.map +0 -1
- package/dist/primitives/fsx/core/glob/match.js +0 -392
- package/dist/primitives/fsx/core/glob/match.js.map +0 -1
- package/dist/primitives/fsx/core/types.js +0 -307
- package/dist/primitives/fsx/core/types.js.map +0 -1
- package/dist/sdk/capnweb-compat.js +0 -42
- package/dist/sdk/capnweb-compat.js.map +0 -1
- package/dist/sdk/client.js +0 -20
- package/dist/sdk/client.js.map +0 -1
- package/dist/sdk/index.js +0 -17
- package/dist/sdk/index.js.map +0 -1
|
@@ -1,480 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FsBackend Interface
|
|
3
|
-
*
|
|
4
|
-
* The pluggable storage backend interface for @dotdo/fsx.
|
|
5
|
-
* Implement this interface to create custom storage backends
|
|
6
|
-
* (SQLite, R2, Memory, Node.js fs, etc.)
|
|
7
|
-
*
|
|
8
|
-
* @module backend
|
|
9
|
-
*/
|
|
10
|
-
// =============================================================================
|
|
11
|
-
// Memory Backend (for testing)
|
|
12
|
-
// =============================================================================
|
|
13
|
-
/**
|
|
14
|
-
* In-memory filesystem backend for testing.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const backend = new MemoryBackend()
|
|
19
|
-
* const fs = new FSx(backend)
|
|
20
|
-
*
|
|
21
|
-
* await fs.write('/test.txt', 'Hello')
|
|
22
|
-
* const content = await fs.read('/test.txt', { encoding: 'utf-8' })
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export class MemoryBackend {
|
|
26
|
-
files = new Map();
|
|
27
|
-
directories = new Set(['/']);
|
|
28
|
-
/**
|
|
29
|
-
* Normalize a path by resolving . and .., removing duplicate slashes,
|
|
30
|
-
* and stripping trailing slashes (except for root).
|
|
31
|
-
*/
|
|
32
|
-
normalizePath(path) {
|
|
33
|
-
if (!path) {
|
|
34
|
-
throw new Error('ENOENT: path cannot be empty');
|
|
35
|
-
}
|
|
36
|
-
// Handle double slashes by replacing with single slash
|
|
37
|
-
path = path.replace(/\/+/g, '/');
|
|
38
|
-
// Split and resolve . and ..
|
|
39
|
-
const parts = path.split('/');
|
|
40
|
-
const resolved = [];
|
|
41
|
-
for (const part of parts) {
|
|
42
|
-
if (part === '..') {
|
|
43
|
-
resolved.pop();
|
|
44
|
-
}
|
|
45
|
-
else if (part !== '.' && part !== '') {
|
|
46
|
-
resolved.push(part);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// Reconstruct path
|
|
50
|
-
let result = '/' + resolved.join('/');
|
|
51
|
-
// Strip trailing slash (except for root)
|
|
52
|
-
if (result !== '/' && result.endsWith('/')) {
|
|
53
|
-
result = result.slice(0, -1);
|
|
54
|
-
}
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Get the parent directory of a path.
|
|
59
|
-
*/
|
|
60
|
-
getParentDir(path) {
|
|
61
|
-
const normalized = this.normalizePath(path);
|
|
62
|
-
if (normalized === '/')
|
|
63
|
-
return '/';
|
|
64
|
-
const lastSlash = normalized.lastIndexOf('/');
|
|
65
|
-
return lastSlash === 0 ? '/' : normalized.slice(0, lastSlash);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Check if parent directory exists and path components are valid.
|
|
69
|
-
* Returns error type or null if valid.
|
|
70
|
-
*/
|
|
71
|
-
validatePath(path) {
|
|
72
|
-
const normalized = this.normalizePath(path);
|
|
73
|
-
if (normalized === '/')
|
|
74
|
-
return null;
|
|
75
|
-
const parts = normalized.split('/').filter(Boolean);
|
|
76
|
-
let current = '';
|
|
77
|
-
// Check all parent components
|
|
78
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
79
|
-
current += '/' + parts[i];
|
|
80
|
-
// If a file exists at this path, it's ENOTDIR
|
|
81
|
-
if (this.files.has(current)) {
|
|
82
|
-
return 'ENOTDIR';
|
|
83
|
-
}
|
|
84
|
-
// If neither file nor directory exists, it's ENOENT
|
|
85
|
-
if (!this.directories.has(current)) {
|
|
86
|
-
return 'ENOENT';
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
async readFile(path) {
|
|
92
|
-
const normalized = this.normalizePath(path);
|
|
93
|
-
// Check if it's a directory first
|
|
94
|
-
if (this.directories.has(normalized)) {
|
|
95
|
-
throw new Error(`EISDIR: illegal operation on a directory: ${path}`);
|
|
96
|
-
}
|
|
97
|
-
const file = this.files.get(normalized);
|
|
98
|
-
if (!file) {
|
|
99
|
-
throw new Error(`ENOENT: no such file: ${path}`);
|
|
100
|
-
}
|
|
101
|
-
return file.data;
|
|
102
|
-
}
|
|
103
|
-
async writeFile(path, data, options) {
|
|
104
|
-
const normalized = this.normalizePath(path);
|
|
105
|
-
// Check if path is a directory
|
|
106
|
-
if (this.directories.has(normalized)) {
|
|
107
|
-
throw new Error(`EISDIR: illegal operation on a directory: ${path}`);
|
|
108
|
-
}
|
|
109
|
-
// Validate parent path
|
|
110
|
-
const pathError = this.validatePath(normalized);
|
|
111
|
-
if (pathError === 'ENOTDIR') {
|
|
112
|
-
throw new Error(`ENOTDIR: not a directory: ${path}`);
|
|
113
|
-
}
|
|
114
|
-
if (pathError === 'ENOENT') {
|
|
115
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
116
|
-
}
|
|
117
|
-
const now = Date.now();
|
|
118
|
-
const mode = options?.mode ?? 0o644;
|
|
119
|
-
const existing = this.files.get(normalized);
|
|
120
|
-
const ino = existing?.stats.ino ?? this.files.size + 1;
|
|
121
|
-
const birthtimeMs = existing?.stats.birthtimeMs ?? now;
|
|
122
|
-
this.files.set(normalized, {
|
|
123
|
-
data,
|
|
124
|
-
stats: {
|
|
125
|
-
dev: 1,
|
|
126
|
-
ino,
|
|
127
|
-
mode: 0o100000 | mode, // S_IFREG | mode
|
|
128
|
-
nlink: 1,
|
|
129
|
-
uid: 0,
|
|
130
|
-
gid: 0,
|
|
131
|
-
rdev: 0,
|
|
132
|
-
size: data.length,
|
|
133
|
-
blksize: 4096,
|
|
134
|
-
blocks: Math.ceil(data.length / 512),
|
|
135
|
-
atimeMs: now,
|
|
136
|
-
mtimeMs: now,
|
|
137
|
-
ctimeMs: now,
|
|
138
|
-
birthtimeMs,
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
return { bytesWritten: data.length, tier: 'hot' };
|
|
142
|
-
}
|
|
143
|
-
async appendFile(path, data) {
|
|
144
|
-
const normalized = this.normalizePath(path);
|
|
145
|
-
const existing = this.files.get(normalized);
|
|
146
|
-
if (existing) {
|
|
147
|
-
const newData = new Uint8Array(existing.data.length + data.length);
|
|
148
|
-
newData.set(existing.data);
|
|
149
|
-
newData.set(data, existing.data.length);
|
|
150
|
-
existing.data = newData;
|
|
151
|
-
existing.stats.size = newData.length;
|
|
152
|
-
existing.stats.mtimeMs = Date.now();
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
await this.writeFile(path, data);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
async unlink(path) {
|
|
159
|
-
const normalized = this.normalizePath(path);
|
|
160
|
-
// Check if it's a directory
|
|
161
|
-
if (this.directories.has(normalized)) {
|
|
162
|
-
throw new Error(`EISDIR: illegal operation on a directory: ${path}`);
|
|
163
|
-
}
|
|
164
|
-
if (!this.files.has(normalized)) {
|
|
165
|
-
throw new Error(`ENOENT: no such file: ${path}`);
|
|
166
|
-
}
|
|
167
|
-
this.files.delete(normalized);
|
|
168
|
-
}
|
|
169
|
-
async rename(oldPath, newPath) {
|
|
170
|
-
const normalizedOld = this.normalizePath(oldPath);
|
|
171
|
-
const normalizedNew = this.normalizePath(newPath);
|
|
172
|
-
// Check destination parent exists
|
|
173
|
-
const destParent = this.getParentDir(normalizedNew);
|
|
174
|
-
if (destParent !== '/' && !this.directories.has(destParent)) {
|
|
175
|
-
throw new Error(`ENOENT: no such file or directory: ${newPath}`);
|
|
176
|
-
}
|
|
177
|
-
// Check if source is a directory
|
|
178
|
-
if (this.directories.has(normalizedOld)) {
|
|
179
|
-
// Rename directory
|
|
180
|
-
const oldPrefix = normalizedOld === '/' ? '/' : normalizedOld + '/';
|
|
181
|
-
// Collect all paths to rename
|
|
182
|
-
const filesToRename = [];
|
|
183
|
-
const dirsToRename = [];
|
|
184
|
-
for (const [filePath, file] of this.files) {
|
|
185
|
-
if (filePath.startsWith(oldPrefix)) {
|
|
186
|
-
const newFilePath = normalizedNew + filePath.slice(normalizedOld.length);
|
|
187
|
-
filesToRename.push({ old: filePath, new: newFilePath, file });
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
for (const dirPath of this.directories) {
|
|
191
|
-
if (dirPath === normalizedOld || dirPath.startsWith(oldPrefix)) {
|
|
192
|
-
const newDirPath = normalizedNew + dirPath.slice(normalizedOld.length);
|
|
193
|
-
dirsToRename.push({ old: dirPath, new: newDirPath });
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// Apply renames
|
|
197
|
-
for (const { old, new: newPath, file } of filesToRename) {
|
|
198
|
-
this.files.delete(old);
|
|
199
|
-
this.files.set(newPath, file);
|
|
200
|
-
}
|
|
201
|
-
for (const { old, new: newPath } of dirsToRename) {
|
|
202
|
-
this.directories.delete(old);
|
|
203
|
-
this.directories.add(newPath);
|
|
204
|
-
}
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
// Rename file
|
|
208
|
-
const file = this.files.get(normalizedOld);
|
|
209
|
-
if (!file) {
|
|
210
|
-
throw new Error(`ENOENT: no such file: ${oldPath}`);
|
|
211
|
-
}
|
|
212
|
-
// Remove destination if it exists (overwrite)
|
|
213
|
-
this.files.delete(normalizedNew);
|
|
214
|
-
this.files.set(normalizedNew, file);
|
|
215
|
-
this.files.delete(normalizedOld);
|
|
216
|
-
}
|
|
217
|
-
async copyFile(src, dest) {
|
|
218
|
-
const normalizedSrc = this.normalizePath(src);
|
|
219
|
-
const normalizedDest = this.normalizePath(dest);
|
|
220
|
-
// Check if source is a directory
|
|
221
|
-
if (this.directories.has(normalizedSrc)) {
|
|
222
|
-
throw new Error(`EISDIR: illegal operation on a directory: ${src}`);
|
|
223
|
-
}
|
|
224
|
-
const file = this.files.get(normalizedSrc);
|
|
225
|
-
if (!file) {
|
|
226
|
-
throw new Error(`ENOENT: no such file: ${src}`);
|
|
227
|
-
}
|
|
228
|
-
// Check destination parent exists
|
|
229
|
-
const destParent = this.getParentDir(normalizedDest);
|
|
230
|
-
if (destParent !== '/' && !this.directories.has(destParent)) {
|
|
231
|
-
throw new Error(`ENOENT: no such file or directory: ${dest}`);
|
|
232
|
-
}
|
|
233
|
-
const now = Date.now();
|
|
234
|
-
this.files.set(normalizedDest, {
|
|
235
|
-
data: new Uint8Array(file.data),
|
|
236
|
-
stats: { ...file.stats, atimeMs: now, mtimeMs: now, ctimeMs: now },
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
async mkdir(path, options) {
|
|
240
|
-
const normalized = this.normalizePath(path);
|
|
241
|
-
// Check if file exists at path
|
|
242
|
-
if (this.files.has(normalized)) {
|
|
243
|
-
throw new Error(`EEXIST: file exists: ${path}`);
|
|
244
|
-
}
|
|
245
|
-
if (options?.recursive) {
|
|
246
|
-
// With recursive, we don't throw if directory exists
|
|
247
|
-
if (this.directories.has(normalized)) {
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
const parts = normalized.split('/').filter(Boolean);
|
|
251
|
-
let current = '';
|
|
252
|
-
for (const part of parts) {
|
|
253
|
-
current += '/' + part;
|
|
254
|
-
// Check if a file exists in the path
|
|
255
|
-
if (this.files.has(current)) {
|
|
256
|
-
throw new Error(`ENOTDIR: not a directory: ${current}`);
|
|
257
|
-
}
|
|
258
|
-
this.directories.add(current);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
// Non-recursive: check if already exists
|
|
263
|
-
if (this.directories.has(normalized)) {
|
|
264
|
-
throw new Error(`EEXIST: directory exists: ${path}`);
|
|
265
|
-
}
|
|
266
|
-
// Check parent exists and is valid
|
|
267
|
-
const pathError = this.validatePath(normalized);
|
|
268
|
-
if (pathError === 'ENOTDIR') {
|
|
269
|
-
throw new Error(`ENOTDIR: not a directory: ${path}`);
|
|
270
|
-
}
|
|
271
|
-
if (pathError === 'ENOENT') {
|
|
272
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
273
|
-
}
|
|
274
|
-
this.directories.add(normalized);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
async rmdir(path, options) {
|
|
278
|
-
const normalized = this.normalizePath(path);
|
|
279
|
-
// Cannot remove root
|
|
280
|
-
if (normalized === '/') {
|
|
281
|
-
throw new Error('EPERM: operation not permitted: /');
|
|
282
|
-
}
|
|
283
|
-
// Check if it's a file
|
|
284
|
-
if (this.files.has(normalized)) {
|
|
285
|
-
throw new Error(`ENOTDIR: not a directory: ${path}`);
|
|
286
|
-
}
|
|
287
|
-
if (!this.directories.has(normalized)) {
|
|
288
|
-
throw new Error(`ENOENT: no such directory: ${path}`);
|
|
289
|
-
}
|
|
290
|
-
// Check if directory is empty
|
|
291
|
-
const prefix = normalized + '/';
|
|
292
|
-
const hasChildren = [...this.files.keys(), ...this.directories].some((p) => p !== normalized && p.startsWith(prefix));
|
|
293
|
-
if (hasChildren && !options?.recursive) {
|
|
294
|
-
throw new Error(`ENOTEMPTY: directory not empty: ${path}`);
|
|
295
|
-
}
|
|
296
|
-
if (options?.recursive) {
|
|
297
|
-
for (const file of this.files.keys()) {
|
|
298
|
-
if (file.startsWith(prefix)) {
|
|
299
|
-
this.files.delete(file);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
for (const dir of this.directories) {
|
|
303
|
-
if (dir.startsWith(prefix)) {
|
|
304
|
-
this.directories.delete(dir);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
this.directories.delete(normalized);
|
|
309
|
-
}
|
|
310
|
-
async readdir(path, options) {
|
|
311
|
-
const normalized = this.normalizePath(path);
|
|
312
|
-
// Check if it's a file
|
|
313
|
-
if (this.files.has(normalized)) {
|
|
314
|
-
throw new Error(`ENOTDIR: not a directory: ${path}`);
|
|
315
|
-
}
|
|
316
|
-
// Check if directory exists
|
|
317
|
-
if (!this.directories.has(normalized)) {
|
|
318
|
-
throw new Error(`ENOENT: no such directory: ${path}`);
|
|
319
|
-
}
|
|
320
|
-
const prefix = normalized === '/' ? '/' : normalized + '/';
|
|
321
|
-
const entries = new Set();
|
|
322
|
-
// Find direct children
|
|
323
|
-
for (const file of this.files.keys()) {
|
|
324
|
-
if (file.startsWith(prefix)) {
|
|
325
|
-
const relative = file.slice(prefix.length);
|
|
326
|
-
const firstPart = relative.split('/')[0];
|
|
327
|
-
if (firstPart)
|
|
328
|
-
entries.add(firstPart);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
for (const dir of this.directories) {
|
|
332
|
-
if (dir.startsWith(prefix) && dir !== normalized) {
|
|
333
|
-
const relative = dir.slice(prefix.length);
|
|
334
|
-
const firstPart = relative.split('/')[0];
|
|
335
|
-
if (firstPart)
|
|
336
|
-
entries.add(firstPart);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
if (options?.withFileTypes) {
|
|
340
|
-
const { Dirent: DirentClass } = await import('./types.js');
|
|
341
|
-
const result = [];
|
|
342
|
-
for (const name of entries) {
|
|
343
|
-
const fullPath = prefix + name;
|
|
344
|
-
const isDir = this.directories.has(fullPath);
|
|
345
|
-
result.push(new DirentClass(name, normalized, isDir ? 'directory' : 'file'));
|
|
346
|
-
}
|
|
347
|
-
return result;
|
|
348
|
-
}
|
|
349
|
-
return [...entries];
|
|
350
|
-
}
|
|
351
|
-
async stat(path) {
|
|
352
|
-
const normalized = this.normalizePath(path);
|
|
353
|
-
// Check if it's a file
|
|
354
|
-
const file = this.files.get(normalized);
|
|
355
|
-
if (file) {
|
|
356
|
-
const { Stats } = await import('./types.js');
|
|
357
|
-
return new Stats(file.stats);
|
|
358
|
-
}
|
|
359
|
-
// Check if it's a directory
|
|
360
|
-
if (this.directories.has(normalized)) {
|
|
361
|
-
const { Stats } = await import('./types.js');
|
|
362
|
-
const now = Date.now();
|
|
363
|
-
return new Stats({
|
|
364
|
-
dev: 1,
|
|
365
|
-
ino: 0,
|
|
366
|
-
mode: 0o40755, // S_IFDIR | 0o755
|
|
367
|
-
nlink: 2,
|
|
368
|
-
uid: 0,
|
|
369
|
-
gid: 0,
|
|
370
|
-
rdev: 0,
|
|
371
|
-
size: 4096,
|
|
372
|
-
blksize: 4096,
|
|
373
|
-
blocks: 8,
|
|
374
|
-
atimeMs: now,
|
|
375
|
-
mtimeMs: now,
|
|
376
|
-
ctimeMs: now,
|
|
377
|
-
birthtimeMs: now,
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
381
|
-
}
|
|
382
|
-
async lstat(path) {
|
|
383
|
-
return this.stat(path);
|
|
384
|
-
}
|
|
385
|
-
async exists(path) {
|
|
386
|
-
const normalized = this.normalizePath(path);
|
|
387
|
-
return this.files.has(normalized) || this.directories.has(normalized);
|
|
388
|
-
}
|
|
389
|
-
async access(path, _mode) {
|
|
390
|
-
const normalized = this.normalizePath(path);
|
|
391
|
-
if (!this.files.has(normalized) && !this.directories.has(normalized)) {
|
|
392
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
393
|
-
}
|
|
394
|
-
// In a full implementation, we'd check mode against file permissions
|
|
395
|
-
}
|
|
396
|
-
async chmod(path, mode) {
|
|
397
|
-
const normalized = this.normalizePath(path);
|
|
398
|
-
const file = this.files.get(normalized);
|
|
399
|
-
if (file) {
|
|
400
|
-
file.stats.mode = 0o100000 | (mode & 0o777); // S_IFREG | mode
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
if (this.directories.has(normalized)) {
|
|
404
|
-
// Directories don't store stats in our simple implementation
|
|
405
|
-
// but we accept the call
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
409
|
-
}
|
|
410
|
-
async chown(path, uid, gid) {
|
|
411
|
-
const normalized = this.normalizePath(path);
|
|
412
|
-
const file = this.files.get(normalized);
|
|
413
|
-
if (file) {
|
|
414
|
-
file.stats.uid = uid;
|
|
415
|
-
file.stats.gid = gid;
|
|
416
|
-
return;
|
|
417
|
-
}
|
|
418
|
-
if (this.directories.has(normalized)) {
|
|
419
|
-
// Directories don't store stats in our simple implementation
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
423
|
-
}
|
|
424
|
-
async utimes(path, atime, mtime) {
|
|
425
|
-
const normalized = this.normalizePath(path);
|
|
426
|
-
const atimeMs = atime instanceof Date ? atime.getTime() : atime;
|
|
427
|
-
const mtimeMs = mtime instanceof Date ? mtime.getTime() : mtime;
|
|
428
|
-
const file = this.files.get(normalized);
|
|
429
|
-
if (file) {
|
|
430
|
-
file.stats.atimeMs = atimeMs;
|
|
431
|
-
file.stats.mtimeMs = mtimeMs;
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
if (this.directories.has(normalized)) {
|
|
435
|
-
// Directories don't store stats in our simple implementation
|
|
436
|
-
return;
|
|
437
|
-
}
|
|
438
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
439
|
-
}
|
|
440
|
-
async symlink(_target, _path) {
|
|
441
|
-
throw new Error('Symlinks not supported in memory backend');
|
|
442
|
-
}
|
|
443
|
-
async link(_existingPath, _newPath) {
|
|
444
|
-
throw new Error('Hard links not supported in memory backend');
|
|
445
|
-
}
|
|
446
|
-
async readlink(_path) {
|
|
447
|
-
throw new Error('Symlinks not supported in memory backend');
|
|
448
|
-
}
|
|
449
|
-
async realpath(path) {
|
|
450
|
-
const normalized = this.normalizePath(path);
|
|
451
|
-
if (!this.files.has(normalized) && !this.directories.has(normalized)) {
|
|
452
|
-
throw new Error(`ENOENT: no such file or directory: ${path}`);
|
|
453
|
-
}
|
|
454
|
-
return normalized;
|
|
455
|
-
}
|
|
456
|
-
async mkdtemp(prefix) {
|
|
457
|
-
const random = Math.random().toString(36).substring(2, 8);
|
|
458
|
-
const path = `${prefix}${random}`;
|
|
459
|
-
await this.mkdir(path);
|
|
460
|
-
return path;
|
|
461
|
-
}
|
|
462
|
-
async open(_path, _flags, _mode) {
|
|
463
|
-
throw new Error('File handles not supported in basic MemoryBackend. Use MockBackend instead.');
|
|
464
|
-
}
|
|
465
|
-
// Optional tiering operations
|
|
466
|
-
async getTier(path) {
|
|
467
|
-
const normalized = this.normalizePath(path);
|
|
468
|
-
if (!this.files.has(normalized)) {
|
|
469
|
-
throw new Error(`ENOENT: no such file: ${path}`);
|
|
470
|
-
}
|
|
471
|
-
return 'hot';
|
|
472
|
-
}
|
|
473
|
-
async promote(_path, _tier) {
|
|
474
|
-
// No-op for memory backend - everything is already "hot"
|
|
475
|
-
}
|
|
476
|
-
async demote(_path, _tier) {
|
|
477
|
-
// No-op for memory backend
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
//# sourceMappingURL=backend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../../primitives/fsx/core/backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Filesystem constants (POSIX-compatible)
|
|
3
|
-
*/
|
|
4
|
-
export const constants = {
|
|
5
|
-
// File access modes
|
|
6
|
-
F_OK: 0, // File exists
|
|
7
|
-
R_OK: 4, // Read permission
|
|
8
|
-
W_OK: 2, // Write permission
|
|
9
|
-
X_OK: 1, // Execute permission
|
|
10
|
-
// File open flags
|
|
11
|
-
O_RDONLY: 0, // Open for reading only
|
|
12
|
-
O_WRONLY: 1, // Open for writing only
|
|
13
|
-
O_RDWR: 2, // Open for reading and writing
|
|
14
|
-
O_CREAT: 64, // Create if doesn't exist
|
|
15
|
-
O_EXCL: 128, // Fail if exists (with O_CREAT)
|
|
16
|
-
O_TRUNC: 512, // Truncate to zero length
|
|
17
|
-
O_APPEND: 1024, // Append mode
|
|
18
|
-
O_SYNC: 4096, // Synchronous writes
|
|
19
|
-
O_DIRECTORY: 65536, // Must be a directory
|
|
20
|
-
O_NOFOLLOW: 131072, // Don't follow symlinks
|
|
21
|
-
// File types (mode bits)
|
|
22
|
-
S_IFMT: 0o170000, // File type mask
|
|
23
|
-
S_IFREG: 0o100000, // Regular file
|
|
24
|
-
S_IFDIR: 0o040000, // Directory
|
|
25
|
-
S_IFLNK: 0o120000, // Symbolic link
|
|
26
|
-
S_IFBLK: 0o060000, // Block device
|
|
27
|
-
S_IFCHR: 0o020000, // Character device
|
|
28
|
-
S_IFIFO: 0o010000, // FIFO (named pipe)
|
|
29
|
-
S_IFSOCK: 0o140000, // Socket
|
|
30
|
-
// File permission bits
|
|
31
|
-
S_IRWXU: 0o700, // Owner: rwx
|
|
32
|
-
S_IRUSR: 0o400, // Owner: read
|
|
33
|
-
S_IWUSR: 0o200, // Owner: write
|
|
34
|
-
S_IXUSR: 0o100, // Owner: execute
|
|
35
|
-
S_IRWXG: 0o070, // Group: rwx
|
|
36
|
-
S_IRGRP: 0o040, // Group: read
|
|
37
|
-
S_IWGRP: 0o020, // Group: write
|
|
38
|
-
S_IXGRP: 0o010, // Group: execute
|
|
39
|
-
S_IRWXO: 0o007, // Others: rwx
|
|
40
|
-
S_IROTH: 0o004, // Others: read
|
|
41
|
-
S_IWOTH: 0o002, // Others: write
|
|
42
|
-
S_IXOTH: 0o001, // Others: execute
|
|
43
|
-
// Special bits
|
|
44
|
-
S_ISUID: 0o4000, // Set user ID on execution
|
|
45
|
-
S_ISGID: 0o2000, // Set group ID on execution
|
|
46
|
-
S_ISVTX: 0o1000, // Sticky bit
|
|
47
|
-
// Copy flags
|
|
48
|
-
COPYFILE_EXCL: 1, // Fail if destination exists
|
|
49
|
-
COPYFILE_FICLONE: 2, // Use copy-on-write if supported
|
|
50
|
-
COPYFILE_FICLONE_FORCE: 4, // Require copy-on-write
|
|
51
|
-
// Seek modes
|
|
52
|
-
SEEK_SET: 0, // Absolute position
|
|
53
|
-
SEEK_CUR: 1, // Relative to current position
|
|
54
|
-
SEEK_END: 2, // Relative to end of file
|
|
55
|
-
};
|
|
56
|
-
// Mode Detection Helpers
|
|
57
|
-
// These use bitwise AND with the file type mask to extract the file type,
|
|
58
|
-
// then compare against the specific file type constant
|
|
59
|
-
/**
|
|
60
|
-
* Check if mode represents a regular file
|
|
61
|
-
*/
|
|
62
|
-
export function isFile(mode) {
|
|
63
|
-
return (mode & constants.S_IFMT) === constants.S_IFREG;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Check if mode represents a directory
|
|
67
|
-
*/
|
|
68
|
-
export function isDirectory(mode) {
|
|
69
|
-
return (mode & constants.S_IFMT) === constants.S_IFDIR;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Check if mode represents a symbolic link
|
|
73
|
-
*/
|
|
74
|
-
export function isSymlink(mode) {
|
|
75
|
-
return (mode & constants.S_IFMT) === constants.S_IFLNK;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Check if mode represents a block device
|
|
79
|
-
*/
|
|
80
|
-
export function isBlockDevice(mode) {
|
|
81
|
-
return (mode & constants.S_IFMT) === constants.S_IFBLK;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Check if mode represents a character device
|
|
85
|
-
*/
|
|
86
|
-
export function isCharacterDevice(mode) {
|
|
87
|
-
return (mode & constants.S_IFMT) === constants.S_IFCHR;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Check if mode represents a FIFO (named pipe)
|
|
91
|
-
*/
|
|
92
|
-
export function isFIFO(mode) {
|
|
93
|
-
return (mode & constants.S_IFMT) === constants.S_IFIFO;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Check if mode represents a socket
|
|
97
|
-
*/
|
|
98
|
-
export function isSocket(mode) {
|
|
99
|
-
return (mode & constants.S_IFMT) === constants.S_IFSOCK;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Check if mode has read permission for the specified entity
|
|
103
|
-
*/
|
|
104
|
-
export function hasReadPermission(mode, who) {
|
|
105
|
-
switch (who) {
|
|
106
|
-
case 'user':
|
|
107
|
-
return (mode & constants.S_IRUSR) !== 0;
|
|
108
|
-
case 'group':
|
|
109
|
-
return (mode & constants.S_IRGRP) !== 0;
|
|
110
|
-
case 'other':
|
|
111
|
-
return (mode & constants.S_IROTH) !== 0;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Check if mode has write permission for the specified entity
|
|
116
|
-
*/
|
|
117
|
-
export function hasWritePermission(mode, who) {
|
|
118
|
-
switch (who) {
|
|
119
|
-
case 'user':
|
|
120
|
-
return (mode & constants.S_IWUSR) !== 0;
|
|
121
|
-
case 'group':
|
|
122
|
-
return (mode & constants.S_IWGRP) !== 0;
|
|
123
|
-
case 'other':
|
|
124
|
-
return (mode & constants.S_IWOTH) !== 0;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Check if mode has execute permission for the specified entity
|
|
129
|
-
*/
|
|
130
|
-
export function hasExecutePermission(mode, who) {
|
|
131
|
-
switch (who) {
|
|
132
|
-
case 'user':
|
|
133
|
-
return (mode & constants.S_IXUSR) !== 0;
|
|
134
|
-
case 'group':
|
|
135
|
-
return (mode & constants.S_IXGRP) !== 0;
|
|
136
|
-
case 'other':
|
|
137
|
-
return (mode & constants.S_IXOTH) !== 0;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../primitives/fsx/core/constants.ts"],"names":[],"mappings":"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"}
|