Skip to content

Commit 327f322

Browse files
committed
fix: satisfy effect lint for session sync resolution
1 parent babbf8d commit 327f322

2 files changed

Lines changed: 72 additions & 44 deletions

File tree

packages/app/src/lib/shell/files.ts

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
import type { PlatformError } from "@effect/platform/Error"
33
import type * as FileSystem from "@effect/platform/FileSystem"
44
import type * as Path from "@effect/platform/Path"
5-
import { createRequire } from "node:module"
6-
import nodePath from "node:path"
75
import { Effect, Match } from "effect"
86

97
import { dockerGitScriptNames } from "../core/docker-git-scripts.js"
@@ -17,8 +15,8 @@ import { resolveWorkspaceRoot } from "./workspace-root.js"
1715
const ensureParentDir = (path: Path.Path, fs: FileSystem.FileSystem, filePath: string) =>
1816
fs.makeDirectory(path.dirname(filePath), { recursive: true })
1917

20-
const require = createRequire(import.meta.url)
2118
const sessionSyncToolRelativePath = ".docker-git-tools/docker-git-session-sync"
19+
const sessionSyncPackageJsonSpecifier = "@prover-coder-ai/docker-git-session-sync/package.json"
2220

2321
const fallbackHostResources = {
2422
cpuCount: 1,
@@ -145,26 +143,37 @@ const provisionDockerGitScripts = (
145143
}
146144
})
147145

148-
const resolveInstalledSessionSyncTool = (): string | null => {
149-
try {
150-
const packageJsonPath = require.resolve("@prover-coder-ai/docker-git-session-sync/package.json")
151-
return nodePath.join(nodePath.dirname(packageJsonPath), "dist", "docker-git-session-sync.js")
152-
} catch {
153-
return null
154-
}
146+
const resolveFileUrlPath = (fileUrl: string): string => {
147+
const url = new URL(fileUrl)
148+
return url.protocol === "file:" ? decodeURIComponent(url.pathname) : fileUrl
155149
}
156150

157-
const sessionSyncToolCandidates = (path: Path.Path, workspaceRoot: string): ReadonlyArray<string> => {
158-
const installed = resolveInstalledSessionSyncTool()
159-
const workspaceCandidate = path.join(
160-
workspaceRoot,
161-
"packages",
162-
"docker-git-session-sync",
163-
"dist",
164-
"docker-git-session-sync.js"
151+
const resolveInstalledSessionSyncTool = (path: Path.Path): Effect.Effect<string | null> =>
152+
Effect.try(() => import.meta.resolve(sessionSyncPackageJsonSpecifier)).pipe(
153+
Effect.match({
154+
onFailure: () => null,
155+
onSuccess: (packageJsonUrl) => {
156+
const packageJsonPath = resolveFileUrlPath(packageJsonUrl)
157+
return path.join(path.dirname(packageJsonPath), "dist", "docker-git-session-sync.js")
158+
}
159+
})
165160
)
166-
return installed === null ? [workspaceCandidate] : [workspaceCandidate, installed]
167-
}
161+
162+
const sessionSyncToolCandidates = (
163+
path: Path.Path,
164+
workspaceRoot: string
165+
): Effect.Effect<ReadonlyArray<string>> =>
166+
Effect.gen(function*(_) {
167+
const installed = yield* _(resolveInstalledSessionSyncTool(path))
168+
const workspaceCandidate = path.join(
169+
workspaceRoot,
170+
"packages",
171+
"docker-git-session-sync",
172+
"dist",
173+
"docker-git-session-sync.js"
174+
)
175+
return installed === null ? [workspaceCandidate] : [workspaceCandidate, installed]
176+
})
168177

169178
// CHANGE: provision standalone session sync tool into the Docker build context
170179
// WHY: generated containers call docker-git-session-sync directly after git push
@@ -181,7 +190,8 @@ const provisionDockerGitSessionSyncTool = (
181190
Effect.gen(function*(_) {
182191
const workspaceRoot = yield* _(resolveWorkspaceRoot(process.cwd()))
183192
const targetPath = path.join(baseDir, sessionSyncToolRelativePath)
184-
for (const sourcePath of sessionSyncToolCandidates(path, workspaceRoot)) {
193+
const candidates = yield* _(sessionSyncToolCandidates(path, workspaceRoot))
194+
for (const sourcePath of candidates) {
185195
const exists = yield* _(fs.exists(sourcePath))
186196
if (exists) {
187197
const contents = yield* _(fs.readFileString(sourcePath))
@@ -190,7 +200,11 @@ const provisionDockerGitSessionSyncTool = (
190200
return
191201
}
192202
}
193-
yield* _(Effect.dieMessage("docker-git-session-sync build artifact not found; run bun run --cwd packages/docker-git-session-sync build"))
203+
yield* _(
204+
Effect.dieMessage(
205+
"docker-git-session-sync build artifact not found; run bun run --cwd packages/docker-git-session-sync build"
206+
)
207+
)
194208
})
195209

196210
// CHANGE: write generated docker-git files to disk

packages/lib/src/shell/files.ts

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import type { PlatformError } from "@effect/platform/Error"
22
import type * as FileSystem from "@effect/platform/FileSystem"
33
import type * as Path from "@effect/platform/Path"
4-
import { createRequire } from "node:module"
5-
import nodePath from "node:path"
64
import { Effect, Match } from "effect"
75

86
import { dockerGitScriptNames } from "../core/docker-git-scripts.js"
@@ -16,8 +14,8 @@ import { resolveWorkspaceRoot } from "./workspace-root.js"
1614
const ensureParentDir = (path: Path.Path, fs: FileSystem.FileSystem, filePath: string) =>
1715
fs.makeDirectory(path.dirname(filePath), { recursive: true })
1816

19-
const require = createRequire(import.meta.url)
2017
const sessionSyncToolRelativePath = ".docker-git-tools/docker-git-session-sync"
18+
const sessionSyncPackageJsonSpecifier = "@prover-coder-ai/docker-git-session-sync/package.json"
2119

2220
const fallbackHostResources = {
2321
cpuCount: 1,
@@ -144,26 +142,37 @@ const provisionDockerGitScripts = (
144142
}
145143
})
146144

147-
const resolveInstalledSessionSyncTool = (): string | null => {
148-
try {
149-
const packageJsonPath = require.resolve("@prover-coder-ai/docker-git-session-sync/package.json")
150-
return nodePath.join(nodePath.dirname(packageJsonPath), "dist", "docker-git-session-sync.js")
151-
} catch {
152-
return null
153-
}
145+
const resolveFileUrlPath = (fileUrl: string): string => {
146+
const url = new URL(fileUrl)
147+
return url.protocol === "file:" ? decodeURIComponent(url.pathname) : fileUrl
154148
}
155149

156-
const sessionSyncToolCandidates = (path: Path.Path, workspaceRoot: string): ReadonlyArray<string> => {
157-
const installed = resolveInstalledSessionSyncTool()
158-
const workspaceCandidate = path.join(
159-
workspaceRoot,
160-
"packages",
161-
"docker-git-session-sync",
162-
"dist",
163-
"docker-git-session-sync.js"
150+
const resolveInstalledSessionSyncTool = (path: Path.Path): Effect.Effect<string | null> =>
151+
Effect.try(() => import.meta.resolve(sessionSyncPackageJsonSpecifier)).pipe(
152+
Effect.match({
153+
onFailure: () => null,
154+
onSuccess: (packageJsonUrl) => {
155+
const packageJsonPath = resolveFileUrlPath(packageJsonUrl)
156+
return path.join(path.dirname(packageJsonPath), "dist", "docker-git-session-sync.js")
157+
}
158+
})
164159
)
165-
return installed === null ? [workspaceCandidate] : [workspaceCandidate, installed]
166-
}
160+
161+
const sessionSyncToolCandidates = (
162+
path: Path.Path,
163+
workspaceRoot: string
164+
): Effect.Effect<ReadonlyArray<string>> =>
165+
Effect.gen(function*(_) {
166+
const installed = yield* _(resolveInstalledSessionSyncTool(path))
167+
const workspaceCandidate = path.join(
168+
workspaceRoot,
169+
"packages",
170+
"docker-git-session-sync",
171+
"dist",
172+
"docker-git-session-sync.js"
173+
)
174+
return installed === null ? [workspaceCandidate] : [workspaceCandidate, installed]
175+
})
167176

168177
// CHANGE: provision standalone session sync tool into the Docker build context
169178
// WHY: generated containers call docker-git-session-sync directly after git push
@@ -180,7 +189,8 @@ const provisionDockerGitSessionSyncTool = (
180189
Effect.gen(function*(_) {
181190
const workspaceRoot = yield* _(resolveWorkspaceRoot(process.cwd()))
182191
const targetPath = path.join(baseDir, sessionSyncToolRelativePath)
183-
for (const sourcePath of sessionSyncToolCandidates(path, workspaceRoot)) {
192+
const candidates = yield* _(sessionSyncToolCandidates(path, workspaceRoot))
193+
for (const sourcePath of candidates) {
184194
const exists = yield* _(fs.exists(sourcePath))
185195
if (exists) {
186196
const contents = yield* _(fs.readFileString(sourcePath))
@@ -189,7 +199,11 @@ const provisionDockerGitSessionSyncTool = (
189199
return
190200
}
191201
}
192-
yield* _(Effect.dieMessage("docker-git-session-sync build artifact not found; run bun run --cwd packages/docker-git-session-sync build"))
202+
yield* _(
203+
Effect.dieMessage(
204+
"docker-git-session-sync build artifact not found; run bun run --cwd packages/docker-git-session-sync build"
205+
)
206+
)
193207
})
194208

195209
// CHANGE: write generated docker-git files to disk

0 commit comments

Comments
 (0)