-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathclone.ts
More file actions
60 lines (51 loc) · 1.75 KB
/
clone.ts
File metadata and controls
60 lines (51 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
export type CloneRequest =
| { readonly _tag: "Clone"; readonly args: ReadonlyArray<string> }
| { readonly _tag: "Open"; readonly args: ReadonlyArray<string> }
| { readonly _tag: "None" }
const emptyRequest: CloneRequest = { _tag: "None" }
const toCloneRequest = (args: ReadonlyArray<string>): CloneRequest => ({
_tag: "Clone",
args
})
const toOpenRequest = (args: ReadonlyArray<string>): CloneRequest => ({
_tag: "Open",
args
})
const resolveLifecycleArgs = (
argv: ReadonlyArray<string>,
command: "clone" | "open"
): ReadonlyArray<string> => {
if (argv.length === 0) {
return []
}
const [first, ...rest] = argv
return first === command ? rest : argv
}
// CHANGE: resolve clone/open shortcut requests from argv + npm lifecycle metadata
// WHY: support pnpm run clone/open <url> without requiring "--"
// QUOTE(ТЗ): "Добавить команду open. ... Просто открывает существующий по ссылке"
// REF: user-request-2026-01-27
// SOURCE: n/a
// FORMAT THEOREM: forall a,e: resolve(a,e) -> deterministic
// PURITY: CORE
// EFFECT: Effect<CloneRequest, never, never>
// INVARIANT: command requested only when argv[0] or npmLifecycleEvent is clone/open
// COMPLEXITY: O(n)
export const resolveCloneRequest = (
argv: ReadonlyArray<string>,
npmLifecycleEvent: string | undefined
): CloneRequest => {
if (npmLifecycleEvent === "clone") {
return toCloneRequest(resolveLifecycleArgs(argv, "clone"))
}
if (npmLifecycleEvent === "open") {
return toOpenRequest(resolveLifecycleArgs(argv, "open"))
}
if (argv.length > 0 && argv[0] === "clone") {
return toCloneRequest(argv.slice(1))
}
if (argv.length > 0 && argv[0] === "open") {
return toOpenRequest(argv.slice(1))
}
return emptyRequest
}