@projitect/cli-internals 0.0.0-stage → 1.0.1
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/LICENSE +21 -0
- package/dist/applier.d.ts +12 -0
- package/dist/applier.d.ts.map +1 -0
- package/dist/applier.js +69 -0
- package/dist/applier.js.map +1 -0
- package/dist/commands/add.d.ts +34 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +64 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/build.d.ts +39 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +108 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dispatch.d.ts +5 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +211 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/explain.d.ts +10 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +46 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/init.d.ts +34 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +153 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect-json.d.ts +51 -0
- package/dist/commands/inspect-json.d.ts.map +1 -0
- package/dist/commands/inspect-json.js +58 -0
- package/dist/commands/inspect-json.js.map +1 -0
- package/dist/commands/inspect.d.ts +41 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +74 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/remodel.d.ts +22 -0
- package/dist/commands/remodel.d.ts.map +1 -0
- package/dist/commands/remodel.js +49 -0
- package/dist/commands/remodel.js.map +1 -0
- package/dist/config-cascade.d.ts +25 -0
- package/dist/config-cascade.d.ts.map +1 -0
- package/dist/config-cascade.js +45 -0
- package/dist/config-cascade.js.map +1 -0
- package/dist/differ.d.ts +31 -0
- package/dist/differ.d.ts.map +1 -0
- package/dist/differ.js +134 -0
- package/dist/differ.js.map +1 -0
- package/dist/edit-pjt.d.ts +19 -0
- package/dist/edit-pjt.d.ts.map +1 -0
- package/dist/edit-pjt.js +40 -0
- package/dist/edit-pjt.js.map +1 -0
- package/dist/filesystem-impl.d.ts +25 -0
- package/dist/filesystem-impl.d.ts.map +1 -0
- package/dist/filesystem-impl.js +153 -0
- package/dist/filesystem-impl.js.map +1 -0
- package/dist/git.d.ts +29 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +63 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/client.d.ts +11 -0
- package/dist/ipc/client.d.ts.map +1 -0
- package/dist/ipc/client.js +45 -0
- package/dist/ipc/client.js.map +1 -0
- package/dist/ipc/index.d.ts +5 -0
- package/dist/ipc/index.d.ts.map +1 -0
- package/dist/ipc/index.js +5 -0
- package/dist/ipc/index.js.map +1 -0
- package/dist/ipc/protocol.d.ts +251 -0
- package/dist/ipc/protocol.d.ts.map +1 -0
- package/dist/ipc/protocol.js +41 -0
- package/dist/ipc/protocol.js.map +1 -0
- package/dist/ipc/server.d.ts +9 -0
- package/dist/ipc/server.d.ts.map +1 -0
- package/dist/ipc/server.js +23 -0
- package/dist/ipc/server.js.map +1 -0
- package/dist/ipc/transport.d.ts +12 -0
- package/dist/ipc/transport.d.ts.map +1 -0
- package/dist/ipc/transport.js +19 -0
- package/dist/ipc/transport.js.map +1 -0
- package/dist/loader.d.ts +45 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +65 -0
- package/dist/loader.js.map +1 -0
- package/dist/lockfile.d.ts +22 -0
- package/dist/lockfile.d.ts.map +1 -0
- package/dist/lockfile.js +59 -0
- package/dist/lockfile.js.map +1 -0
- package/dist/permissions.d.ts +20 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +86 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plan.d.ts +278 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +212 -0
- package/dist/plan.js.map +1 -0
- package/dist/platform/file-system.d.ts +3 -0
- package/dist/platform/file-system.d.ts.map +1 -0
- package/dist/platform/file-system.js +109 -0
- package/dist/platform/file-system.js.map +1 -0
- package/dist/platform/index.d.ts +17 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +20 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/process-runner.d.ts +41 -0
- package/dist/platform/process-runner.d.ts.map +1 -0
- package/dist/platform/process-runner.js +120 -0
- package/dist/platform/process-runner.js.map +1 -0
- package/dist/platform/stdio.d.ts +9 -0
- package/dist/platform/stdio.d.ts.map +1 -0
- package/dist/platform/stdio.js +11 -0
- package/dist/platform/stdio.js.map +1 -0
- package/dist/platform/terminal.d.ts +3 -0
- package/dist/platform/terminal.d.ts.map +1 -0
- package/dist/platform/terminal.js +81 -0
- package/dist/platform/terminal.js.map +1 -0
- package/dist/pm.d.ts +36 -0
- package/dist/pm.d.ts.map +1 -0
- package/dist/pm.js +95 -0
- package/dist/pm.js.map +1 -0
- package/dist/post-apply.d.ts +20 -0
- package/dist/post-apply.d.ts.map +1 -0
- package/dist/post-apply.js +29 -0
- package/dist/post-apply.js.map +1 -0
- package/dist/project-file.d.ts +8 -0
- package/dist/project-file.d.ts.map +1 -0
- package/dist/project-file.js +12 -0
- package/dist/project-file.js.map +1 -0
- package/dist/region.d.ts +105 -0
- package/dist/region.d.ts.map +1 -0
- package/dist/region.js +94 -0
- package/dist/region.js.map +1 -0
- package/dist/remover.d.ts +16 -0
- package/dist/remover.d.ts.map +1 -0
- package/dist/remover.js +88 -0
- package/dist/remover.js.map +1 -0
- package/package.json +52 -3
- package/src/applier.ts +91 -0
- package/src/commands/add.ts +88 -0
- package/src/commands/build.ts +156 -0
- package/src/commands/dispatch.ts +345 -0
- package/src/commands/explain.ts +81 -0
- package/src/commands/init.ts +233 -0
- package/src/commands/inspect-json.ts +68 -0
- package/src/commands/inspect.ts +106 -0
- package/src/commands/remodel.ts +72 -0
- package/src/config-cascade.ts +60 -0
- package/src/differ.ts +188 -0
- package/src/edit-pjt.ts +56 -0
- package/src/filesystem-impl.ts +230 -0
- package/src/git.ts +87 -0
- package/src/index.ts +54 -0
- package/src/ipc/client.ts +108 -0
- package/src/ipc/index.ts +12 -0
- package/src/ipc/protocol.ts +48 -0
- package/src/ipc/server.ts +62 -0
- package/src/ipc/transport.ts +28 -0
- package/src/loader.ts +115 -0
- package/src/lockfile.ts +81 -0
- package/src/permissions.ts +106 -0
- package/src/plan.ts +459 -0
- package/src/platform/file-system.ts +155 -0
- package/src/platform/index.ts +26 -0
- package/src/platform/process-runner.ts +150 -0
- package/src/platform/stdio.ts +11 -0
- package/src/platform/terminal.ts +89 -0
- package/src/pm.ts +163 -0
- package/src/post-apply.ts +45 -0
- package/src/project-file.ts +15 -0
- package/src/region.ts +139 -0
- package/src/remover.ts +127 -0
- package/README.md +0 -3
package/dist/plan.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { Array, Data, Effect, Match, Option, Record, Result, Schema, pipe } from "effect";
|
|
2
|
+
import { NonNullableX, PredicateX, RecordX, StructX } from "@nunofyobiz/effect-extras";
|
|
3
|
+
import { ChangeSet, Errors, PjtLock } from "@projitect/core";
|
|
4
|
+
import { isDirectoryBlueprint } from "@projitect/blueprint";
|
|
5
|
+
import { makeRealLayer } from "./filesystem-impl.js";
|
|
6
|
+
export const FilePlan = Data.taggedEnum();
|
|
7
|
+
const flattenTree = (tree, prefix) => Array.flatMap(tree, (node) => isDirectoryBlueprint(node)
|
|
8
|
+
? flattenTree(node.children, prefix === "" ? node.name : `${prefix}/${node.name}`)
|
|
9
|
+
: [{ blueprint: node, directoryPrefix: prefix }]);
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Run each blueprint's plan Effect with its own permission-gated FS layer,
|
|
12
|
+
// collect operations, and reduce them into a ProjectPlan + per-blueprint lockfile entries
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const rebasePath = (prefix, p) => (prefix ? `${prefix}/${p}` : p);
|
|
15
|
+
const rebaseOp = (prefix, op) => {
|
|
16
|
+
// An Exec op has no path, and its command always runs from the project root.
|
|
17
|
+
if (!prefix || op._tag === "Exec") {
|
|
18
|
+
return op;
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
...op,
|
|
22
|
+
path: rebasePath(prefix, op.path),
|
|
23
|
+
...(op._tag === "Owned"
|
|
24
|
+
? StructX.defined("ownedDir", op.ownedDir === undefined ? undefined : rebasePath(prefix, op.ownedDir))
|
|
25
|
+
: {}),
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
const asFileOp = (attributed) => attributed.op._tag === "Exec"
|
|
29
|
+
? Result.failVoid
|
|
30
|
+
: Result.succeed({ ...attributed, op: attributed.op });
|
|
31
|
+
const asExecOp = (attributed) => attributed.op._tag === "Exec"
|
|
32
|
+
? Result.succeed({ ...attributed, op: attributed.op })
|
|
33
|
+
: Result.failVoid;
|
|
34
|
+
/**
|
|
35
|
+
* Build the project plan by running every blueprint, collecting their ops, reducing them with
|
|
36
|
+
* conflict detection, and producing the per-blueprint lockfile entries.
|
|
37
|
+
*/
|
|
38
|
+
export const buildPlan = (params) => {
|
|
39
|
+
const { tree, projectRoot } = params;
|
|
40
|
+
const flat = flattenTree(tree, "");
|
|
41
|
+
return Effect.gen(function* () {
|
|
42
|
+
const attributed = yield* Effect.forEach(flat, ({ blueprint, directoryPrefix }) => blueprint.plan.pipe(Effect.provide(makeRealLayer({
|
|
43
|
+
blueprintId: blueprint.id,
|
|
44
|
+
permissions: blueprint.permissions,
|
|
45
|
+
projectRoot,
|
|
46
|
+
})), Effect.map((changeSet) => Array.map(changeSet.operations, (op) => ({
|
|
47
|
+
blueprintId: blueprint.id,
|
|
48
|
+
blueprintVersion: blueprint.version,
|
|
49
|
+
permissions: blueprint.permissions,
|
|
50
|
+
op: rebaseOp(directoryPrefix, op),
|
|
51
|
+
}))))).pipe(Effect.map(Array.flatten));
|
|
52
|
+
const fileOps = Array.filterMap(attributed, asFileOp);
|
|
53
|
+
const files = yield* reduceOps(Array.map(fileOps, (a) => a.op));
|
|
54
|
+
const commands = Array.map(Array.filterMap(attributed, asExecOp), (a) => ({
|
|
55
|
+
ownerId: a.op.ownerId,
|
|
56
|
+
command: a.op.command,
|
|
57
|
+
...StructX.defined("check", a.op.check),
|
|
58
|
+
permissions: a.permissions,
|
|
59
|
+
}));
|
|
60
|
+
// Exec ops are not recorded in the lockfile: commands re-run on every remodel.
|
|
61
|
+
const byBlueprint = groupByBlueprint(fileOps);
|
|
62
|
+
return { plan: { files: files.files, commands }, byBlueprint };
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Diff the previous lockfile against the current blueprint set. Returns:
|
|
67
|
+
* - `removals`: ops from blueprints present in the lockfile but absent from the current tree,
|
|
68
|
+
* plus owned files a still-present blueprint no longer ships (a new version dropping a file).
|
|
69
|
+
* The applier deletes the matching regions / merge keys / owned files in a follow-up step.
|
|
70
|
+
* - `upgrades`: blueprints present in both, with different versions. Informational only — the
|
|
71
|
+
* actual content is regenerated from the current blueprint, so applying handles upgrade
|
|
72
|
+
* content automatically; this list is for `inspect`'s human output.
|
|
73
|
+
*/
|
|
74
|
+
export const diffLockfile = (params) => {
|
|
75
|
+
const { previous, current } = params;
|
|
76
|
+
return NonNullableX.match(previous, {
|
|
77
|
+
whenNullable: () => ({
|
|
78
|
+
removals: Array.empty(),
|
|
79
|
+
upgrades: Array.empty(),
|
|
80
|
+
}),
|
|
81
|
+
whenNotNullable: (lock) => {
|
|
82
|
+
const entries = Record.toEntries(lock.blueprints);
|
|
83
|
+
const livePaths = new Set(Array.flatMap(Record.values(current), (live) => Array.map(live.operations, (op) => op.path)));
|
|
84
|
+
const removals = Array.filter(Array.flatMap(entries, ([id, prior]) => Option.match(Record.get(current, id), {
|
|
85
|
+
onNone: () => prior.operations,
|
|
86
|
+
onSome: (live) => droppedOwnedOps(prior, live),
|
|
87
|
+
})),
|
|
88
|
+
// A path some blueprint still plans (e.g. reassigned to another owner) is not an orphan.
|
|
89
|
+
(op) => op._tag !== "Owned" || !livePaths.has(op.path));
|
|
90
|
+
const upgrades = Array.flatMap(entries, ([id, prior]) => Record.get(current, id).pipe(Option.filter((live) => live.version !== prior.version), Option.map((live) => [{ blueprintId: id, from: prior.version, to: live.version }]), Option.getOrElse(() => Array.empty())));
|
|
91
|
+
return { removals, upgrades };
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
/** Owned files the prior lock entry had but the live entry no longer plans. */
|
|
96
|
+
const droppedOwnedOps = (prior, live) => Array.filter(prior.operations, (op) => op._tag === "Owned" && !Array.some(live.operations, (l) => l.path === op.path));
|
|
97
|
+
const groupByBlueprint = (attributed) => Record.map(Array.groupBy(attributed, (a) => a.blueprintId), (group) => ({
|
|
98
|
+
version: Array.headNonEmpty(group).blueprintVersion,
|
|
99
|
+
operations: Array.map(group, (a) => toLockOp(a.op)),
|
|
100
|
+
}));
|
|
101
|
+
const toLockOp = (op) => Match.valueTags(op, {
|
|
102
|
+
Region: (region) => PjtLock.LockRegionOp.make({
|
|
103
|
+
path: region.path,
|
|
104
|
+
ownerId: region.ownerId,
|
|
105
|
+
commentPrefix: region.commentPrefix,
|
|
106
|
+
// Only record commentSuffix when non-empty — empty/absent decode the same per the schema.
|
|
107
|
+
...StructX.defined("commentSuffix", PredicateX.isNonEmptyString(region.commentSuffix) ? region.commentSuffix : undefined),
|
|
108
|
+
}),
|
|
109
|
+
Merge: (merge) => PjtLock.LockMergeOp.make({ path: merge.path, ownedKeys: merge.ownedKeys }),
|
|
110
|
+
Owned: (owned) => PjtLock.LockOwnedOp.make({
|
|
111
|
+
path: owned.path,
|
|
112
|
+
ownerId: owned.ownerId,
|
|
113
|
+
...StructX.defined("ownedDir", owned.ownedDir),
|
|
114
|
+
}),
|
|
115
|
+
Seed: (seed) => PjtLock.LockSeedOp.make({ path: seed.path, ownerId: seed.ownerId }),
|
|
116
|
+
});
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Reduce raw ops into a ProjectPlan, detecting conflicts as we go
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
const reduceOps = (ops) => pipe(Array.groupBy(ops, (op) => op.path), Record.toEntries, Effect.forEach(([path, group]) => reduceGroup(path, group)), Effect.map((files) => ({ files })));
|
|
121
|
+
/** Closing sentence of every plan-conflict message: the command-level way out. */
|
|
122
|
+
const conflictNextStep = "Remove one of the conflicting blueprints from `.pjt.ts`, then run `pjt remodel`.";
|
|
123
|
+
/**
|
|
124
|
+
* Reduce one path's operations into a single FilePlan. Every op on a path must share an
|
|
125
|
+
* ownership mode (`_tag`); a mixed group is a `pjt.plan.conflict-owned`.
|
|
126
|
+
*/
|
|
127
|
+
const reduceGroup = (path, group) => {
|
|
128
|
+
const head = Array.headNonEmpty(group);
|
|
129
|
+
return Array.findFirst(group, (op) => op._tag !== head._tag).pipe(Option.match({
|
|
130
|
+
onSome: (offender) => Effect.fail(new Errors.PlanConflictOwned({
|
|
131
|
+
id: "pjt.plan.conflict-owned",
|
|
132
|
+
path,
|
|
133
|
+
ownerA: head.ownerId,
|
|
134
|
+
ownerB: offender.ownerId,
|
|
135
|
+
message: `Blueprints ${head.ownerId} (${head._tag}) and ${offender.ownerId} (${offender._tag}) both target ${path} with incompatible modes. ${conflictNextStep}`,
|
|
136
|
+
})),
|
|
137
|
+
onNone: () => Match.value(head).pipe(Match.tag("Region", () => reduceRegion(path, Array.filter(group, Schema.is(ChangeSet.RegionOp)))), Match.tag("Merge", () => reduceMerge(path, Array.filter(group, Schema.is(ChangeSet.MergeOp)))), Match.tag("Owned", () => reduceSole("owned", path, Array.filter(group, Schema.is(ChangeSet.OwnedOp)))), Match.tag("Seed", () => reduceSole("seed", path, Array.filter(group, Schema.is(ChangeSet.SeedOp)))), Match.exhaustive),
|
|
138
|
+
}));
|
|
139
|
+
};
|
|
140
|
+
const duplicateOwner = (ops) => pipe(Array.groupBy(ops, (op) => op.ownerId), Record.toEntries, Array.findFirst(([, claims]) => claims.length > 1), Option.map(([ownerId]) => ownerId));
|
|
141
|
+
const reduceRegion = (path, ops) => Option.match(duplicateOwner(ops), {
|
|
142
|
+
onSome: (ownerId) => Effect.fail(new Errors.PlanConflictRegion({
|
|
143
|
+
id: "pjt.plan.conflict-region",
|
|
144
|
+
path,
|
|
145
|
+
ownerA: ownerId,
|
|
146
|
+
ownerB: ownerId,
|
|
147
|
+
message: `Multiple blueprints share ownerId ${ownerId} for region in ${path}. ${conflictNextStep}`,
|
|
148
|
+
})),
|
|
149
|
+
onNone: () => {
|
|
150
|
+
// Last-write-wins on comment style — all ops on one file should use the same anyway.
|
|
151
|
+
const style = Array.last(ops).pipe(Option.map((op) => ({
|
|
152
|
+
commentPrefix: op.commentPrefix,
|
|
153
|
+
commentSuffix: op.commentSuffix ?? "",
|
|
154
|
+
})), Option.getOrElse(() => ({ commentPrefix: "#", commentSuffix: "" })));
|
|
155
|
+
return Effect.succeed(FilePlan.Region({
|
|
156
|
+
path,
|
|
157
|
+
commentPrefix: style.commentPrefix,
|
|
158
|
+
commentSuffix: style.commentSuffix,
|
|
159
|
+
regions: Array.map(ops, (op) => ({ ownerId: op.ownerId, content: op.content })),
|
|
160
|
+
}));
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
/**
|
|
164
|
+
* Fold the merge ops' `ownedKeys` into a `key → ownerId` map, failing if two distinct owners claim
|
|
165
|
+
* the same key — the conflict-checked keyed merge behind merge-mode ownership.
|
|
166
|
+
*/
|
|
167
|
+
const reconcileOwnership = (path, ops) => Effect.gen(function* () {
|
|
168
|
+
const ownership = new Map();
|
|
169
|
+
for (const op of ops) {
|
|
170
|
+
for (const key of op.ownedKeys) {
|
|
171
|
+
const prior = ownership.get(key);
|
|
172
|
+
if (prior !== undefined && prior !== op.ownerId) {
|
|
173
|
+
return yield* new Errors.PlanConflictMerge({
|
|
174
|
+
id: "pjt.plan.conflict-merge",
|
|
175
|
+
path,
|
|
176
|
+
key,
|
|
177
|
+
ownerA: prior,
|
|
178
|
+
ownerB: op.ownerId,
|
|
179
|
+
message: `Blueprints ${prior} and ${op.ownerId} both claim key "${key}" in ${path}. ${conflictNextStep}`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
ownership.set(key, op.ownerId);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return ownership;
|
|
186
|
+
});
|
|
187
|
+
const reduceMerge = (path, ops) => Effect.gen(function* () {
|
|
188
|
+
const ownership = yield* reconcileOwnership(path, ops);
|
|
189
|
+
const value = RecordX.deepMergeReducer.combineAll(Array.map(ops, (op) => op.value));
|
|
190
|
+
return FilePlan.Merge({ path, value, ownership });
|
|
191
|
+
});
|
|
192
|
+
/** Owned and seed both demand a single owner per path. */
|
|
193
|
+
const reduceSole = (kind, path, ops) => {
|
|
194
|
+
const [first, second] = ops;
|
|
195
|
+
if (first !== undefined && second !== undefined) {
|
|
196
|
+
return Effect.fail(new Errors.PlanConflictOwned({
|
|
197
|
+
id: "pjt.plan.conflict-owned",
|
|
198
|
+
path,
|
|
199
|
+
ownerA: first.ownerId,
|
|
200
|
+
ownerB: second.ownerId,
|
|
201
|
+
message: kind === "owned"
|
|
202
|
+
? `Multiple blueprints claim full ownership of ${path}. ${conflictNextStep}`
|
|
203
|
+
: `Multiple blueprints try to seed ${path}. ${conflictNextStep}`,
|
|
204
|
+
}));
|
|
205
|
+
}
|
|
206
|
+
return first === undefined
|
|
207
|
+
? Effect.die(new Error(`unreachable: empty ${kind} group for ${path}`))
|
|
208
|
+
: Effect.succeed(kind === "owned"
|
|
209
|
+
? FilePlan.Owned({ path, ownerId: first.ownerId, content: first.content })
|
|
210
|
+
: FilePlan.Seed({ path, ownerId: first.ownerId, content: first.content }));
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=plan.js.map
|
package/dist/plan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/platform/file-system.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAE,KAAK,EAAkB,MAAM,QAAQ,CAAA;AAmJlE,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAG7D,CAAA"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as nodeFs from "node:fs/promises";
|
|
2
|
+
import nodePath from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as PlatformError from "effect/PlatformError";
|
|
5
|
+
import { Effect, FileSystem, Layer, Option, Stream } from "effect";
|
|
6
|
+
/**
|
|
7
|
+
* Node-backed `FileSystem` Layer.
|
|
8
|
+
*
|
|
9
|
+
* Implements the common methods (`readFile`, `writeFile`, `access`, `readDirectory`,
|
|
10
|
+
* `makeDirectory`, `remove`, `stat`, `rename`, `symlink`, `link`, `chmod`, `chown`, `glob`,
|
|
11
|
+
* `realPath`, `readLink`, `copy`, `copyFile`, `truncate`, `utimes`, `makeTempFile`,
|
|
12
|
+
* `makeTempDirectory`) using `node:fs/promises`. The derived methods (`exists`,
|
|
13
|
+
* `readFileString`, `writeFileString`, `stream`, `sink`) come for free from `FileSystem.make`.
|
|
14
|
+
*
|
|
15
|
+
* The complex methods (`open` returning a low-level File handle, `watch` returning a Stream of
|
|
16
|
+
* watch events, the `*Scoped` temp helpers requiring Effect.Scope) are wired to `Effect.die`
|
|
17
|
+
* with a clear "not implemented in projitect v0.1" message. The CLI flow doesn't exercise them;
|
|
18
|
+
* if a future consumer needs them we'll fill them in.
|
|
19
|
+
*/
|
|
20
|
+
const sysError = (method, cause) => {
|
|
21
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
22
|
+
const code = cause.code;
|
|
23
|
+
return PlatformError.systemError({
|
|
24
|
+
_tag: code === "ENOENT" ? "NotFound" : code === "EACCES" ? "PermissionDenied" : "Unknown",
|
|
25
|
+
module: "FileSystem",
|
|
26
|
+
method,
|
|
27
|
+
description: message,
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const tryEffect = (method, p) => Effect.tryPromise({ try: p, catch: (e) => sysError(method, e) });
|
|
31
|
+
// Compatibility shim: older Node versions (22.12) reject an array `exclude` and only accept a
|
|
32
|
+
// predicate. A predicate gives the same matches on every version, so we always pass one. Delete
|
|
33
|
+
// this once support for the Node versions that reject an array `exclude` is dropped, and pass the
|
|
34
|
+
// patterns straight through.
|
|
35
|
+
const excludeOption = (patterns) => patterns === undefined || patterns.length === 0
|
|
36
|
+
? undefined
|
|
37
|
+
: (path) => patterns.some((pattern) => nodePath.matchesGlob(path, pattern));
|
|
38
|
+
const dieNotImpl = (method) => Effect.die(new Error(`FileSystem.${method} is not implemented in projitect's Node Layer (v0.1). File an issue if you need it.`));
|
|
39
|
+
const make = FileSystem.make({
|
|
40
|
+
access: (path, options) => tryEffect("access", () => nodeFs.access(path, options?.readable === true ? nodeFs.constants.R_OK : undefined)),
|
|
41
|
+
copy: (fromPath, toPath, _options) => tryEffect("copy", () => nodeFs.cp(fromPath, toPath, { recursive: true })),
|
|
42
|
+
copyFile: (fromPath, toPath) => tryEffect("copyFile", () => nodeFs.copyFile(fromPath, toPath)),
|
|
43
|
+
chmod: (path, mode) => tryEffect("chmod", () => nodeFs.chmod(path, mode)),
|
|
44
|
+
chown: (path, uid, gid) => tryEffect("chown", () => nodeFs.chown(path, uid, gid)),
|
|
45
|
+
glob: (pattern, options) => tryEffect("glob", async () => {
|
|
46
|
+
const paths = [];
|
|
47
|
+
for await (const path of nodeFs.glob(pattern, {
|
|
48
|
+
cwd: options?.root,
|
|
49
|
+
exclude: excludeOption(options?.exclude),
|
|
50
|
+
})) {
|
|
51
|
+
paths.push(path);
|
|
52
|
+
}
|
|
53
|
+
return paths;
|
|
54
|
+
}),
|
|
55
|
+
link: (fromPath, toPath) => tryEffect("link", () => nodeFs.link(fromPath, toPath)),
|
|
56
|
+
makeDirectory: (path, options) => tryEffect("makeDirectory", () => nodeFs.mkdir(path, { recursive: options?.recursive ?? false }).then(() => undefined)),
|
|
57
|
+
makeTempDirectory: (options) => tryEffect("makeTempDirectory", () => nodeFs.mkdtemp(nodePath.join(options?.directory ?? os.tmpdir(), options?.prefix ?? "pjt-"))),
|
|
58
|
+
makeTempDirectoryScoped: () => dieNotImpl("makeTempDirectoryScoped"),
|
|
59
|
+
makeTempFile: (options) => tryEffect("makeTempFile", async () => {
|
|
60
|
+
const direction = await nodeFs.mkdtemp(nodePath.join(options?.directory ?? os.tmpdir(), options?.prefix ?? "pjt-"));
|
|
61
|
+
const file = nodePath.join(direction, "tmp");
|
|
62
|
+
await nodeFs.writeFile(file, "");
|
|
63
|
+
return file;
|
|
64
|
+
}),
|
|
65
|
+
makeTempFileScoped: () => dieNotImpl("makeTempFileScoped"),
|
|
66
|
+
open: () => dieNotImpl("open"),
|
|
67
|
+
readDirectory: (path, _options) => tryEffect("readDirectory", () => nodeFs.readdir(path)),
|
|
68
|
+
readFile: (path) => tryEffect("readFile", async () => {
|
|
69
|
+
const buf = await nodeFs.readFile(path);
|
|
70
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
71
|
+
}),
|
|
72
|
+
readLink: (path) => tryEffect("readLink", () => nodeFs.readlink(path)),
|
|
73
|
+
realPath: (path) => tryEffect("realPath", () => nodeFs.realpath(path)),
|
|
74
|
+
remove: (path, options) => tryEffect("remove", () => nodeFs.rm(path, { recursive: options?.recursive ?? false, force: options?.force ?? false })),
|
|
75
|
+
rename: (oldPath, newPath) => tryEffect("rename", () => nodeFs.rename(oldPath, newPath)),
|
|
76
|
+
stat: (path) => tryEffect("stat", async () => {
|
|
77
|
+
const s = await nodeFs.stat(path);
|
|
78
|
+
const type = s.isFile()
|
|
79
|
+
? "File"
|
|
80
|
+
: s.isDirectory()
|
|
81
|
+
? "Directory"
|
|
82
|
+
: s.isSymbolicLink()
|
|
83
|
+
? "SymbolicLink"
|
|
84
|
+
: "Other";
|
|
85
|
+
return {
|
|
86
|
+
type,
|
|
87
|
+
mtime: Option.some(s.mtime),
|
|
88
|
+
atime: Option.some(s.atime),
|
|
89
|
+
birthtime: Option.some(s.birthtime),
|
|
90
|
+
dev: s.dev,
|
|
91
|
+
ino: Option.some(s.ino),
|
|
92
|
+
mode: s.mode,
|
|
93
|
+
nlink: Option.some(s.nlink),
|
|
94
|
+
uid: Option.some(s.uid),
|
|
95
|
+
gid: Option.some(s.gid),
|
|
96
|
+
rdev: Option.some(s.rdev),
|
|
97
|
+
size: FileSystem.Size(BigInt(s.size)),
|
|
98
|
+
blksize: Option.some(FileSystem.Size(BigInt(s.blksize))),
|
|
99
|
+
blocks: Option.some(s.blocks),
|
|
100
|
+
};
|
|
101
|
+
}),
|
|
102
|
+
symlink: (fromPath, toPath) => tryEffect("symlink", () => nodeFs.symlink(fromPath, toPath)),
|
|
103
|
+
truncate: (path, length) => tryEffect("truncate", () => nodeFs.truncate(path, length === undefined ? 0 : Number(length))),
|
|
104
|
+
utimes: (path, atime, mtime) => tryEffect("utimes", () => nodeFs.utimes(path, atime, mtime)),
|
|
105
|
+
watch: () => Stream.die(new Error("FileSystem.watch is not implemented in projitect's Node Layer (v0.1). File an issue if you need it.")),
|
|
106
|
+
writeFile: (path, data, _options) => tryEffect("writeFile", () => nodeFs.writeFile(path, data)),
|
|
107
|
+
});
|
|
108
|
+
export const FileSystemLive = Layer.succeed(FileSystem.FileSystem, make);
|
|
109
|
+
//# sourceMappingURL=file-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/platform/file-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Layer, Path } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* The full Node-backed platform Layer satisfying every service `effect/unstable/cli`'s
|
|
4
|
+
* `Command.Environment` declares. Provided by the `pjt` bin shim to `Command.run`.
|
|
5
|
+
*
|
|
6
|
+
* `Path.layer` ships with effect core (POSIX implementation; no IO). `FileSystem`, `Terminal`,
|
|
7
|
+
* and `Stdio` are hand-rolled in sibling files. `ChildProcessSpawner` is intentionally absent —
|
|
8
|
+
* `Command.run` does not consume it for our use cases, and our own shell-out needs (git status,
|
|
9
|
+
* package-manager add) use `node:child_process` directly via `git.ts` / `pm.ts` Effect wrappers.
|
|
10
|
+
* If a future need surfaces, this is where it'll land.
|
|
11
|
+
*/
|
|
12
|
+
export declare const NodePlatformLive: Layer.Layer<import("effect/FileSystem").FileSystem | Path.Path | import("effect/Terminal").Terminal | import("effect/Stdio").Stdio, never, never>;
|
|
13
|
+
export { FileSystemLive } from "./file-system.js";
|
|
14
|
+
export { StdioLive } from "./stdio.js";
|
|
15
|
+
export { TerminalLive } from "./terminal.js";
|
|
16
|
+
export { runCommand, nodeSpawner, type ProcessSpawner, type CommandOutput, } from "./process-runner.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAKpC;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,mJAAsE,CAAA;AAEnG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EACL,UAAU,EACV,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Layer, Path } from "effect";
|
|
2
|
+
import { FileSystemLive } from "./file-system.js";
|
|
3
|
+
import { StdioLive } from "./stdio.js";
|
|
4
|
+
import { TerminalLive } from "./terminal.js";
|
|
5
|
+
/**
|
|
6
|
+
* The full Node-backed platform Layer satisfying every service `effect/unstable/cli`'s
|
|
7
|
+
* `Command.Environment` declares. Provided by the `pjt` bin shim to `Command.run`.
|
|
8
|
+
*
|
|
9
|
+
* `Path.layer` ships with effect core (POSIX implementation; no IO). `FileSystem`, `Terminal`,
|
|
10
|
+
* and `Stdio` are hand-rolled in sibling files. `ChildProcessSpawner` is intentionally absent —
|
|
11
|
+
* `Command.run` does not consume it for our use cases, and our own shell-out needs (git status,
|
|
12
|
+
* package-manager add) use `node:child_process` directly via `git.ts` / `pm.ts` Effect wrappers.
|
|
13
|
+
* If a future need surfaces, this is where it'll land.
|
|
14
|
+
*/
|
|
15
|
+
export const NodePlatformLive = Layer.mergeAll(FileSystemLive, TerminalLive, StdioLive, Path.layer);
|
|
16
|
+
export { FileSystemLive } from "./file-system.js";
|
|
17
|
+
export { StdioLive } from "./stdio.js";
|
|
18
|
+
export { TerminalLive } from "./terminal.js";
|
|
19
|
+
export { runCommand, nodeSpawner, } from "./process-runner.js";
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;AAEnG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EACL,UAAU,EACV,WAAW,GAGZ,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Effect, Option } from "effect";
|
|
2
|
+
import { Errors } from "@projitect/core";
|
|
3
|
+
import type { Permission } from "@projitect/core";
|
|
4
|
+
export interface CommandOutput {
|
|
5
|
+
readonly stdout: string;
|
|
6
|
+
readonly stderr: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Starts a process and resolves with its exit code and captured output. `exitCode` is `undefined`
|
|
10
|
+
* only when the process never started (spawn failure); the failure carries the reason. Injected
|
|
11
|
+
* into `runCommand` so tests can use a fake instead of a real process.
|
|
12
|
+
*/
|
|
13
|
+
export type ProcessSpawner = (program: string, args: readonly string[], cwd: string) => Effect.Effect<CommandOutput & {
|
|
14
|
+
readonly exitCode: number;
|
|
15
|
+
}, string>;
|
|
16
|
+
/** Real spawner: `node:child_process` without a shell, so `&&`, `;` and pipes are plain arguments. */
|
|
17
|
+
export declare const nodeSpawner: ProcessSpawner;
|
|
18
|
+
/**
|
|
19
|
+
* Argv contract (no shell): arguments are separated by unquoted whitespace; `'...'` and `"..."`
|
|
20
|
+
* group characters (including whitespace) into one argument and the quotes are dropped. There are
|
|
21
|
+
* no escapes, globs, variables or operators — everything else is literal. An unterminated quote,
|
|
22
|
+
* or a command with no program, is unsupported and yields `None`. The permission is matched
|
|
23
|
+
* against the raw string, so exactly what was declared is what gets parsed and run.
|
|
24
|
+
*/
|
|
25
|
+
export declare const parseArgv: (command: string) => Option.Option<readonly string[]>;
|
|
26
|
+
/** The refusal for a command no declared `exec` permission names exactly. */
|
|
27
|
+
export declare const commandNotPermitted: (command: string) => Errors.CommandNotPermitted;
|
|
28
|
+
/**
|
|
29
|
+
* Runs `command` (parsed per `parseArgv`) in `cwd`, after checking it against
|
|
30
|
+
* the declared `exec` permissions. A command no permission names exactly fails with
|
|
31
|
+
* `CommandNotPermitted` and the spawner is never called; a non-zero exit or spawn failure fails
|
|
32
|
+
* with `CommandFailed` carrying the exit code and captured output; so does a command `parseArgv`
|
|
33
|
+
* rejects (the spawner is not called).
|
|
34
|
+
*/
|
|
35
|
+
export declare const runCommand: (params: {
|
|
36
|
+
readonly permissions: readonly Permission.Permission[];
|
|
37
|
+
readonly command: string;
|
|
38
|
+
readonly cwd: string;
|
|
39
|
+
readonly spawner: ProcessSpawner;
|
|
40
|
+
}) => Effect.Effect<CommandOutput, Errors.CommandFailed | Errors.CommandNotPermitted>;
|
|
41
|
+
//# sourceMappingURL=process-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-runner.d.ts","sourceRoot":"","sources":["../../src/platform/process-runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,CAAC,CAAA;AAEzE,sGAAsG;AACtG,eAAO,MAAM,WAAW,EAAE,cAqBtB,CAAA;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,CA8B1E,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,mBAKzD,CAAA;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,CAAC,UAAU,EAAE,CAAA;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CACjC,KAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,mBAAmB,CA4CjF,CAAA"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { Effect, Option } from "effect";
|
|
3
|
+
import { Errors } from "@projitect/core";
|
|
4
|
+
import { isCommandPermitted } from "../permissions.js";
|
|
5
|
+
/** Real spawner: `node:child_process` without a shell, so `&&`, `;` and pipes are plain arguments. */
|
|
6
|
+
export const nodeSpawner = (program, args, cwd) => Effect.callback((resume) => {
|
|
7
|
+
const child = spawn(program, args, { cwd, shell: false });
|
|
8
|
+
let stdout = "";
|
|
9
|
+
let stderr = "";
|
|
10
|
+
child.stdout.on("data", (chunk) => {
|
|
11
|
+
stdout = stdout + chunk.toString("utf8");
|
|
12
|
+
});
|
|
13
|
+
child.stderr.on("data", (chunk) => {
|
|
14
|
+
stderr = stderr + chunk.toString("utf8");
|
|
15
|
+
});
|
|
16
|
+
child.on("error", (error) => {
|
|
17
|
+
resume(Effect.fail(error.message));
|
|
18
|
+
});
|
|
19
|
+
child.on("close", (code) => {
|
|
20
|
+
resume(Effect.succeed({ exitCode: code ?? 1, stdout, stderr }));
|
|
21
|
+
});
|
|
22
|
+
// On interruption, terminate the child we own so it doesn't outlive the fiber.
|
|
23
|
+
return Effect.sync(() => {
|
|
24
|
+
child.kill("SIGKILL");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Argv contract (no shell): arguments are separated by unquoted whitespace; `'...'` and `"..."`
|
|
29
|
+
* group characters (including whitespace) into one argument and the quotes are dropped. There are
|
|
30
|
+
* no escapes, globs, variables or operators — everything else is literal. An unterminated quote,
|
|
31
|
+
* or a command with no program, is unsupported and yields `None`. The permission is matched
|
|
32
|
+
* against the raw string, so exactly what was declared is what gets parsed and run.
|
|
33
|
+
*/
|
|
34
|
+
export const parseArgv = (command) => {
|
|
35
|
+
const argv = [];
|
|
36
|
+
let current;
|
|
37
|
+
let quote;
|
|
38
|
+
for (const ch of command) {
|
|
39
|
+
if (quote !== undefined) {
|
|
40
|
+
if (ch === quote) {
|
|
41
|
+
quote = undefined;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
current = (current ?? "") + ch;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (ch === "'" || ch === '"') {
|
|
48
|
+
quote = ch;
|
|
49
|
+
current = current ?? "";
|
|
50
|
+
}
|
|
51
|
+
else if (/\s/u.test(ch)) {
|
|
52
|
+
if (current !== undefined) {
|
|
53
|
+
argv.push(current);
|
|
54
|
+
current = undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
current = (current ?? "") + ch;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (quote !== undefined) {
|
|
62
|
+
return Option.none();
|
|
63
|
+
}
|
|
64
|
+
if (current !== undefined) {
|
|
65
|
+
argv.push(current);
|
|
66
|
+
}
|
|
67
|
+
return argv[0] === undefined || argv[0] === "" ? Option.none() : Option.some(argv);
|
|
68
|
+
};
|
|
69
|
+
/** The refusal for a command no declared `exec` permission names exactly. */
|
|
70
|
+
export const commandNotPermitted = (command) => new Errors.CommandNotPermitted({
|
|
71
|
+
id: "pjt.exec.command-not-permitted",
|
|
72
|
+
command,
|
|
73
|
+
message: `No declared exec permission covers \`${command}\``,
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Runs `command` (parsed per `parseArgv`) in `cwd`, after checking it against
|
|
77
|
+
* the declared `exec` permissions. A command no permission names exactly fails with
|
|
78
|
+
* `CommandNotPermitted` and the spawner is never called; a non-zero exit or spawn failure fails
|
|
79
|
+
* with `CommandFailed` carrying the exit code and captured output; so does a command `parseArgv`
|
|
80
|
+
* rejects (the spawner is not called).
|
|
81
|
+
*/
|
|
82
|
+
export const runCommand = (params) => {
|
|
83
|
+
const { permissions, command, cwd, spawner } = params;
|
|
84
|
+
return Effect.gen(function* () {
|
|
85
|
+
if (!isCommandPermitted(permissions, command)) {
|
|
86
|
+
return yield* commandNotPermitted(command);
|
|
87
|
+
}
|
|
88
|
+
const [program = "", ...args] = yield* Option.match(parseArgv(command), {
|
|
89
|
+
onNone: () => Effect.fail(new Errors.CommandFailed({
|
|
90
|
+
id: "pjt.exec.command-failed",
|
|
91
|
+
command,
|
|
92
|
+
stdout: "",
|
|
93
|
+
stderr: "",
|
|
94
|
+
cause: "unsupported command syntax: empty program or unterminated quote",
|
|
95
|
+
message: `Cannot run \`${command}\`: empty program or unterminated quote`,
|
|
96
|
+
})),
|
|
97
|
+
onSome: Effect.succeed,
|
|
98
|
+
});
|
|
99
|
+
const result = yield* Effect.mapError(spawner(program, args, cwd), (cause) => new Errors.CommandFailed({
|
|
100
|
+
id: "pjt.exec.command-failed",
|
|
101
|
+
command,
|
|
102
|
+
stdout: "",
|
|
103
|
+
stderr: "",
|
|
104
|
+
cause,
|
|
105
|
+
message: `Failed to start \`${command}\`: ${cause}`,
|
|
106
|
+
}));
|
|
107
|
+
if (result.exitCode !== 0) {
|
|
108
|
+
return yield* new Errors.CommandFailed({
|
|
109
|
+
id: "pjt.exec.command-failed",
|
|
110
|
+
command,
|
|
111
|
+
exitCode: result.exitCode,
|
|
112
|
+
stdout: result.stdout,
|
|
113
|
+
stderr: result.stderr,
|
|
114
|
+
message: `\`${command}\` exited with code ${String(result.exitCode)}`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return { stdout: result.stdout, stderr: result.stderr };
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=process-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-runner.js","sourceRoot":"","sources":["../../src/platform/process-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAkBtD,sGAAsG;AACtG,MAAM,CAAC,MAAM,WAAW,GAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAChE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACzD,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACxC,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACxC,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IACF,+EAA+E;IAC/E,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAoC,EAAE;IAC7E,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,IAAI,OAA2B,CAAA;IAC/B,IAAI,KAAyB,CAAA;IAC7B,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjB,KAAK,GAAG,SAAS,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,EAAE,CAAA;YAChC,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,KAAK,GAAG,EAAE,CAAA;YACV,OAAO,GAAG,OAAO,IAAI,EAAE,CAAA;QACzB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAClB,OAAO,GAAG,SAAS,CAAA;YACrB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,EAAE,CAAA;QAChC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpF,CAAC,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAA8B,EAAE,CACjF,IAAI,MAAM,CAAC,mBAAmB,CAAC;IAC7B,EAAE,EAAE,gCAAgC;IACpC,OAAO;IACP,OAAO,EAAE,wCAAwC,OAAO,IAAI;CAC7D,CAAC,CAAA;AAEJ;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAK1B,EAAmF,EAAE;IACpF,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IACrD,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAC5C,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;YACtE,MAAM,EAAE,GAAG,EAAE,CACX,MAAM,CAAC,IAAI,CACT,IAAI,MAAM,CAAC,aAAa,CAAC;gBACvB,EAAE,EAAE,yBAAyB;gBAC7B,OAAO;gBACP,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,iEAAiE;gBACxE,OAAO,EAAE,gBAAgB,OAAO,yCAAyC;aAC1E,CAAC,CACH;YACH,MAAM,EAAE,MAAM,CAAC,OAAO;SACvB,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CACnC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,EAC3B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,MAAM,CAAC,aAAa,CAAC;YACvB,EAAE,EAAE,yBAAyB;YAC7B,OAAO;YACP,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,KAAK;YACL,OAAO,EAAE,qBAAqB,OAAO,OAAO,KAAK,EAAE;SACpD,CAAC,CACL,CAAA;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC;gBACrC,EAAE,EAAE,yBAAyB;gBAC7B,OAAO;gBACP,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,KAAK,OAAO,uBAAuB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;aACtE,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;IACzD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Stdio } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Node-backed `Stdio` Layer. We only need `args` to satisfy `Command.run`'s argv source;
|
|
4
|
+
* the stdout/stderr sinks and stdin stream from `layerTest` (drain sinks + empty stream) are
|
|
5
|
+
* adequate because all our output goes through `Terminal.display` and we don't currently read
|
|
6
|
+
* from stdin outside the `Prompt` module (which uses `Terminal.readLine` / `Terminal.readInput`).
|
|
7
|
+
*/
|
|
8
|
+
export declare const StdioLive: import("effect/Layer").Layer<Stdio.Stdio, never, never>;
|
|
9
|
+
//# sourceMappingURL=stdio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/platform/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,SAAS,yDAEpB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect, Stdio } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Node-backed `Stdio` Layer. We only need `args` to satisfy `Command.run`'s argv source;
|
|
4
|
+
* the stdout/stderr sinks and stdin stream from `layerTest` (drain sinks + empty stream) are
|
|
5
|
+
* adequate because all our output goes through `Terminal.display` and we don't currently read
|
|
6
|
+
* from stdin outside the `Prompt` module (which uses `Terminal.readLine` / `Terminal.readInput`).
|
|
7
|
+
*/
|
|
8
|
+
export const StdioLive = Stdio.layerTest({
|
|
9
|
+
args: Effect.succeed(process.argv.slice(2)),
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/platform/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAC5C,CAAC,CAAA"}
|