@varlock/cloudflare-integration 0.1.0 → 0.1.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/dist/varlock-wrangler.js
CHANGED
|
@@ -228,7 +228,7 @@ async function handleDeploy(args) {
|
|
|
228
228
|
const varCount = varFlags.length / 2;
|
|
229
229
|
const secretCount = Object.keys(secretsObj).filter((k) => !k.startsWith("__VARLOCK_ENV")).length;
|
|
230
230
|
console.log(`\x1B[36m\u2728 Deploying with varlock: ${varCount} var${varCount !== 1 ? "s" : ""}, ${secretCount} secret${secretCount !== 1 ? "s" : ""} \u{1F9D9}\u{1F512}\x1B[0m`);
|
|
231
|
-
let exitCode = 0;
|
|
231
|
+
let exitCode = process.exitCode ?? 0;
|
|
232
232
|
try {
|
|
233
233
|
debug("deploy: spawning wrangler");
|
|
234
234
|
exitCode = await spawnWrangler([...args, ...varFlags, "--secrets-file", tmp.filePath, "--keep-vars=false"]);
|
|
@@ -257,7 +257,7 @@ async function handleTypes(args) {
|
|
|
257
257
|
const tmp = createServingTempFile("varlock-types-env");
|
|
258
258
|
debug("types: starting FIFO serve");
|
|
259
259
|
const handle = tmp.startServing(() => envFileLines.join("\n"));
|
|
260
|
-
let exitCode = 0;
|
|
260
|
+
let exitCode = process.exitCode ?? 0;
|
|
261
261
|
try {
|
|
262
262
|
debug("types: spawning wrangler");
|
|
263
263
|
exitCode = await spawnWrangler([...args, "--env-file", tmp.filePath]);
|
|
@@ -311,20 +311,34 @@ async function handleDev(args) {
|
|
|
311
311
|
cleanup();
|
|
312
312
|
process.exit(1);
|
|
313
313
|
});
|
|
314
|
+
const DEBOUNCE_MS = 300;
|
|
315
|
+
const FORCE_RESTART_IDLE_MS = 5e3;
|
|
314
316
|
let restartTimeout;
|
|
317
|
+
let cachedGraphJson = loaded.json;
|
|
318
|
+
let lastRestartAt = Date.now();
|
|
315
319
|
function scheduleRestart() {
|
|
316
320
|
if (restartTimeout) clearTimeout(restartTimeout);
|
|
317
321
|
restartTimeout = setTimeout(() => {
|
|
318
322
|
try {
|
|
319
323
|
const freshLoaded = loadSerializedGraph();
|
|
324
|
+
const now = Date.now();
|
|
325
|
+
const idleSinceLastRestart = now - lastRestartAt > FORCE_RESTART_IDLE_MS;
|
|
326
|
+
if (freshLoaded.json === cachedGraphJson && !idleSinceLastRestart) {
|
|
327
|
+
restartTimeout = void 0;
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
cachedGraphJson = freshLoaded.json;
|
|
331
|
+
loaded = freshLoaded;
|
|
332
|
+
lastRestartAt = now;
|
|
320
333
|
cachedContent = formatEnvFileContent(freshLoaded);
|
|
321
334
|
handle.update(cachedContent);
|
|
322
335
|
console.log("[varlock-wrangler] env changed, restarting wrangler...");
|
|
323
336
|
wranglerChild?.kill();
|
|
324
337
|
} catch (err) {
|
|
338
|
+
restartTimeout = void 0;
|
|
325
339
|
console.error("[varlock-wrangler] failed to re-resolve env:", err.message);
|
|
326
340
|
}
|
|
327
|
-
},
|
|
341
|
+
}, DEBOUNCE_MS);
|
|
328
342
|
}
|
|
329
343
|
if (loaded.graph.basePath) {
|
|
330
344
|
for (const source of loaded.graph.sources) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/varlock-wrangler.ts"],"names":[],"mappings":"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","file":"varlock-wrangler.js","sourcesContent":["/* eslint-disable no-console */\n\nimport {\n writeFileSync, unlinkSync, watch, existsSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { spawn, execSync } from 'node:child_process';\n\nimport { execSyncVarlock } from 'varlock/exec-sync-varlock';\n\nconst isWindows = process.platform === 'win32';\nconst debugEnabled = !!process.env.VARLOCK_DEBUG;\nfunction debug(...args: Array<any>) {\n if (debugEnabled) console.log('[varlock-wrangler]', ...args);\n}\n\n/** Detect the package manager exec command from npm_config_user_agent */\nfunction getExecPrefix(): string {\n const ua = process.env.npm_config_user_agent || '';\n if (ua.startsWith('pnpm/')) return 'pnpm exec ';\n if (ua.startsWith('yarn/')) return 'yarn exec ';\n if (ua.startsWith('bun/')) return 'bunx ';\n if (ua.startsWith('npm/')) return 'npx ';\n return '';\n}\n\n// --- shared helpers ---\n\nfunction spawnWrangler(args: Array<string>): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn('wrangler', args, {\n stdio: 'inherit',\n shell: isWindows,\n });\n child.on('error', (err) => {\n if ((err as any).code === 'ENOENT') {\n console.error('Error: wrangler not found. Install it with your package manager:');\n console.error(' Install it with your package manager, e.g.: npm install wrangler');\n }\n reject(err);\n });\n child.on('exit', (code, signal) => {\n resolve(code ?? (signal ? 1 : 0));\n });\n });\n}\n\nfunction loadSerializedGraph() {\n const serializedGraphJson = execSyncVarlock('load --format json-full --compact', {\n showLogsOnError: true,\n });\n return {\n json: serializedGraphJson,\n graph: JSON.parse(serializedGraphJson) as {\n basePath?: string,\n sources: Array<{ label: string, enabled: boolean, path?: string }>,\n config: Record<string, { value: unknown, isSensitive: boolean }>,\n },\n };\n}\n\nfunction tmpPath(prefix: string) {\n return join(tmpdir(), `${prefix}-${randomBytes(8).toString('hex')}`);\n}\n\n/**\n * Creates a named pipe (FIFO) for long-running commands (dev).\n * On Unix: data only exists in a kernel buffer — secrets never touch disk.\n * On Windows: falls back to a regular temp file.\n */\nfunction createServingTempFile(prefix: string) {\n const filePath = tmpPath(prefix);\n\n if (!isWindows) {\n execSync(`mkfifo -m 0600 \"${filePath}\"`);\n }\n\n function cleanup() {\n try {\n unlinkSync(filePath);\n } catch {\n // may already be deleted\n }\n }\n\n /**\n * Start serving content via the FIFO (or write a regular file on Windows).\n * On Unix: spawns a child process that writes to the FIFO in a loop.\n * Using a child process means the blocked libuv thread lives in the child —\n * killing the child cleanly releases it, allowing our main process to exit.\n * On Windows: writes a regular file, with refresh() to update it.\n */\n function startServing(getContent: () => string) {\n if (isWindows) {\n writeFileSync(filePath, getContent());\n return {\n update(content: string) { writeFileSync(filePath, content); },\n stop() {\n /* noop on Windows */\n },\n };\n }\n\n // spawn a child process to serve the FIFO\n // the child reads content from stdin, then writes it to the FIFO in a loop\n const fifoServer = spawn(process.execPath, [\n '-e', `\n const fs = require('fs');\n const path = ${JSON.stringify(filePath)};\n let content = '';\n process.stdin.on('data', d => content += d);\n process.stdin.on('end', () => {\n (function serve() {\n try { fs.writeFileSync(path, content); setImmediate(serve); }\n catch { process.exit(); }\n })();\n });\n `,\n ], {\n stdio: ['pipe', 'ignore', 'ignore'],\n });\n fifoServer.stdin!.write(getContent());\n fifoServer.stdin!.end();\n\n return {\n /** Kill and respawn the FIFO server with new content */\n update(content: string) {\n fifoServer.kill();\n const replacement = startServing(() => content);\n // swap the stop/update methods on this handle\n this.stop = replacement.stop;\n this.update = replacement.update;\n },\n stop() {\n fifoServer.kill();\n },\n };\n }\n\n return {\n filePath, cleanup, startServing,\n };\n}\n\n// Cloudflare secrets are limited to 5KB each.\n// __VARLOCK_ENV can exceed this, so we split it into chunks.\nconst CF_SECRET_MAX_BYTES = 5120;\n\n/**\n * Split a string into chunks where each chunk's UTF-8 byte length ≤ maxBytes.\n * Unlike slicing a Buffer, this never splits a multi-byte character.\n */\nfunction chunkString(str: string, maxBytes: number): Array<string> {\n const chunks: Array<string> = [];\n let current = '';\n let currentBytes = 0;\n for (const char of str) {\n const charBytes = Buffer.byteLength(char);\n if (currentBytes + charBytes > maxBytes && current) {\n chunks.push(current);\n current = '';\n currentBytes = 0;\n }\n current += char;\n currentBytes += charBytes;\n }\n if (current) chunks.push(current);\n return chunks;\n}\n\nfunction formatEnvLine(key: string, value: string): string {\n if (!value.includes(\"'\")) {\n // single quotes — literal, no escaping needed\n return `${key}='${value}'`;\n }\n // fall back to double quotes with escaping\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n');\n return `${key}=\"${escaped}\"`;\n}\n\n/**\n * Adds __VARLOCK_ENV to a key-value record, splitting into chunks if needed.\n * If the value fits in one secret: sets __VARLOCK_ENV directly.\n * If too large: sets __VARLOCK_ENV_CHUNKS=N and __VARLOCK_ENV_0, __VARLOCK_ENV_1, etc.\n */\nfunction addVarlockEnvToRecord(record: Record<string, string>, json: string) {\n if (Buffer.byteLength(json) <= CF_SECRET_MAX_BYTES) {\n record.__VARLOCK_ENV = json;\n return;\n }\n const chunks = chunkString(json, CF_SECRET_MAX_BYTES);\n record.__VARLOCK_ENV_CHUNKS = String(chunks.length);\n for (let i = 0; i < chunks.length; i++) {\n record[`__VARLOCK_ENV_${i}`] = chunks[i];\n }\n debug(`__VARLOCK_ENV split into ${chunks.length} chunks (${Buffer.byteLength(json)} bytes)`);\n}\n\n/**\n * Adds __VARLOCK_ENV lines to a dotenv-format array, splitting into chunks if needed.\n */\nfunction addVarlockEnvToLines(lines: Array<string>, json: string) {\n if (Buffer.byteLength(json) <= CF_SECRET_MAX_BYTES) {\n lines.push(formatEnvLine('__VARLOCK_ENV', json));\n return;\n }\n const chunks = chunkString(json, CF_SECRET_MAX_BYTES);\n lines.push(formatEnvLine('__VARLOCK_ENV_CHUNKS', String(chunks.length)));\n for (let i = 0; i < chunks.length; i++) {\n lines.push(formatEnvLine(`__VARLOCK_ENV_${i}`, chunks[i]));\n }\n debug(`__VARLOCK_ENV split into ${chunks.length} chunks (${Buffer.byteLength(json)} bytes)`);\n}\n\nfunction formatEnvFileContent(graph: ReturnType<typeof loadSerializedGraph>) {\n // output as dotenv format using single quotes — single-quoted values are\n // treated as literal strings with no escape processing, which avoids issues\n // with double quotes in JSON blobs and special characters in values.\n // values containing single quotes are double-quoted with escaping instead.\n const lines: Array<string> = [\n '# ⚠️ AUTO-GENERATED BY VARLOCK — DO NOT EDIT',\n `# ${isWindows ? 'This is a temporary file and will be cleaned up automatically.' : 'This file is served via a named pipe (FIFO) and exists only in memory.'}`,\n '# Your .env files and .env.schema are the source of truth.',\n '# See https://varlock.dev/integrations/cloudflare/ for details.',\n '',\n ];\n for (const key in graph.graph.config) {\n const item = graph.graph.config[key];\n if (item.value === undefined) continue;\n const strValue = typeof item.value === 'string' ? item.value : JSON.stringify(item.value);\n lines.push(formatEnvLine(key, strValue));\n }\n // include __VARLOCK_ENV for the varlock runtime (compact JSON, no newlines)\n // split into chunks if it exceeds CF's 5KB secret limit\n addVarlockEnvToLines(lines, graph.json);\n return lines.join('\\n');\n}\n\n// --- command detection ---\n\nfunction isDeployCommand(args: Array<string>) {\n if (args[0] === 'deploy') return true;\n if (args[0] === 'versions' && args[1] === 'upload') return true;\n return false;\n}\n\nfunction isTypesCommand(args: Array<string>) {\n return args[0] === 'types';\n}\n\n// --- command handlers ---\n\nasync function handleDeploy(args: Array<string>) {\n if (args.includes('--secrets-file')) {\n console.error('Error: --secrets-file is managed automatically by varlock-wrangler.');\n console.error('Remove --secrets-file from your command and let varlock handle it.');\n process.exitCode = 1;\n return;\n }\n\n let loaded;\n try {\n loaded = loadSerializedGraph();\n } catch {\n console.error('Failed to resolve environment variables');\n process.exitCode = 1;\n return;\n }\n\n // split resolved vars into:\n // - non-sensitive → --var flags (visible in CF dashboard as environment variables)\n // - sensitive → --secrets-file (stored as CF secrets)\n // - __VARLOCK_ENV blob → always a secret (contains full graph including sensitive values)\n const varFlags: Array<string> = [];\n const secretsObj: Record<string, string> = {};\n\n for (const key in loaded.graph.config) {\n const item = loaded.graph.config[key];\n if (item.value === undefined) continue;\n const strValue = typeof item.value === 'string' ? item.value : JSON.stringify(item.value);\n\n if (item.isSensitive) {\n secretsObj[key] = strValue;\n } else {\n // wrangler splits KEY:VALUE on the first `:` only, so colons in values are safe\n // spawn args array passes newlines/special chars without shell escaping issues\n varFlags.push('--var', `${key}:${strValue}`);\n }\n }\n // split into chunks if it exceeds CF's 5KB secret limit\n addVarlockEnvToRecord(secretsObj, loaded.json);\n\n const tmp = createServingTempFile('varlock-secrets');\n const content = JSON.stringify(secretsObj);\n debug('deploy: starting FIFO serve');\n const handle = tmp.startServing(() => content);\n\n process.on('SIGINT', () => {\n handle.stop();\n tmp.cleanup();\n process.exit(1);\n });\n process.on('SIGTERM', () => {\n handle.stop();\n tmp.cleanup();\n process.exit(1);\n });\n\n const varCount = varFlags.length / 2; // each var is two entries: --var, KEY:VALUE\n // count only user secrets (exclude __VARLOCK_ENV and chunk keys)\n const secretCount = Object.keys(secretsObj).filter((k) => !k.startsWith('__VARLOCK_ENV')).length;\n console.log(`\\x1b[36m✨ Deploying with varlock: ${varCount} var${varCount !== 1 ? 's' : ''}, ${secretCount} secret${secretCount !== 1 ? 's' : ''} 🧙🔒\\x1b[0m`);\n\n let exitCode = 0;\n try {\n debug('deploy: spawning wrangler');\n exitCode = await spawnWrangler([...args, ...varFlags, '--secrets-file', tmp.filePath, '--keep-vars=false']);\n debug('deploy: wrangler exited with code', exitCode);\n } finally {\n debug('deploy: cleaning up');\n handle.stop();\n tmp.cleanup();\n }\n}\n\nasync function handleTypes(args: Array<string>) {\n debug('types: resolving env');\n let loaded;\n try {\n loaded = loadSerializedGraph();\n } catch {\n console.error('Failed to resolve environment variables');\n process.exitCode = 1;\n return;\n }\n\n debug('types: resolved', Object.keys(loaded.graph.config).length, 'env vars');\n // generate a temp env file with just key names (no real values)\n // wrangler types reads this to discover which vars to include in the Env interface\n const envFileLines: Array<string> = [];\n for (const key in loaded.graph.config) {\n envFileLines.push(`${key}=`);\n }\n\n const tmp = createServingTempFile('varlock-types-env');\n debug('types: starting FIFO serve');\n const handle = tmp.startServing(() => envFileLines.join('\\n'));\n\n let exitCode = 0;\n try {\n debug('types: spawning wrangler');\n exitCode = await spawnWrangler([...args, '--env-file', tmp.filePath]);\n debug('types: wrangler exited with code', exitCode);\n } finally {\n debug('types: cleaning up');\n handle.stop();\n tmp.cleanup();\n }\n}\n\nasync function handleDev(args: Array<string>) {\n // .dev.vars would conflict with our env injection via --env-file\n if (existsSync('.dev.vars')) {\n console.error([\n 'Error: a .dev.vars file was detected in your project.',\n 'This conflicts with varlock-wrangler which manages env vars automatically.',\n 'Remove .dev.vars and define your variables in .env files with a .env.schema instead.',\n ].join('\\n'));\n process.exitCode = 1;\n return;\n }\n\n debug('dev: resolving env');\n let loaded;\n try {\n loaded = loadSerializedGraph();\n } catch (err) {\n console.error('Failed to resolve environment variables');\n console.error(err);\n process.exitCode = 1;\n return;\n }\n debug('dev: resolved', Object.keys(loaded.graph.config).length, 'env vars');\n\n const tmp = createServingTempFile('varlock-dev-env');\n debug('dev: created FIFO at', tmp.filePath);\n\n let cachedContent = formatEnvFileContent(loaded);\n let wranglerChild: ReturnType<typeof spawn> | undefined;\n const watchers: Array<ReturnType<typeof watch>> = [];\n\n debug('dev: starting FIFO serve');\n const handle = tmp.startServing(() => cachedContent);\n\n function cleanup() {\n handle.stop();\n for (const w of watchers) w.close();\n tmp.cleanup();\n }\n\n process.on('SIGINT', () => {\n wranglerChild?.kill();\n cleanup();\n process.exit(1);\n });\n process.on('SIGTERM', () => {\n wranglerChild?.kill();\n cleanup();\n process.exit(1);\n });\n\n // watch env source files for changes and restart wrangler with fresh data\n let restartTimeout: ReturnType<typeof setTimeout> | undefined;\n function scheduleRestart() {\n // debounce — multiple files may change at once\n if (restartTimeout) clearTimeout(restartTimeout);\n restartTimeout = setTimeout(() => {\n try {\n const freshLoaded = loadSerializedGraph();\n cachedContent = formatEnvFileContent(freshLoaded);\n handle.update(cachedContent);\n console.log('[varlock-wrangler] env changed, restarting wrangler...');\n wranglerChild?.kill();\n } catch (err) {\n console.error('[varlock-wrangler] failed to re-resolve env:', (err as Error).message);\n }\n }, 300);\n }\n\n // set up watchers on env source files\n if (loaded.graph.basePath) {\n for (const source of loaded.graph.sources) {\n if (!source.enabled || !source.path) continue;\n const fullPath = join(loaded.graph.basePath, source.path);\n try {\n const w = watch(fullPath, () => scheduleRestart());\n watchers.push(w);\n debug('dev: watching', fullPath);\n } catch {\n // file may not exist yet (e.g., optional env-specific file)\n }\n }\n }\n\n try {\n // outer loop: (re)spawn wrangler each time it exits\n // on env file changes, the watcher kills wrangler, which causes it to respawn\n // with the fresh data (FIFO serves fresh content, Windows file is refreshed)\n while (true) {\n debug('dev: spawning wrangler');\n wranglerChild = spawn('wrangler', [...args, '--env-file', tmp.filePath], {\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: isWindows,\n // force color output since piped stdio loses TTY detection\n env: { ...process.env, FORCE_COLOR: '1' },\n });\n\n // pipe wrangler output with rewrites:\n // - replace FIFO path reference with a friendlier message\n // - strip env var binding rows (other bindings like KV, D1 are preserved)\n const tmpBasename = tmp.filePath.split(/[/\\\\]/).pop()!;\n const loadCmd = `${getExecPrefix()}varlock load`;\n const envVarCount = Object.keys(loaded.graph.config).length;\n let shownVarlockNotice = false;\n const varlockNotice = `\\x1b[36m✨ ${envVarCount} env var${envVarCount !== 1 ? 's' : ''} managed by varlock 🧙🔒\\x1b[0m\\n`\n + `\\x1b[2m run \\`${loadCmd}\\` to inspect\\x1b[0m\\n`;\n const rewriteOutput = (stream: NodeJS.WriteStream) => (chunk: Buffer) => {\n let str = chunk.toString();\n // strip the FIFO path line entirely\n if (str.includes(tmpBasename)) {\n str = str.replace(/.*varlock-dev-env-[a-f0-9]+.*\\n?/g, '');\n }\n // replace env var binding rows with a single varlock notice\n // (other bindings like KV, D1 are preserved)\n if (str.includes('Environment Variable')) {\n if (!shownVarlockNotice) {\n str = str.replace(/.*Environment Variable.*\\n?/, varlockNotice);\n shownVarlockNotice = true;\n }\n str = str.replace(/.*Environment Variable.*\\n?/g, '');\n }\n // rewrite wrangler types hint to use varlock-wrangler\n if (str.includes('wrangler types')) {\n str = str.replace(/wrangler types/g, 'varlock-wrangler types');\n }\n if (str) stream.write(str);\n };\n wranglerChild.stdout?.on('data', rewriteOutput(process.stdout));\n wranglerChild.stderr?.on('data', rewriteOutput(process.stderr));\n\n const child = wranglerChild;\n const exitCode = await new Promise<number>((resolve) => {\n child.on('error', (err) => {\n if ((err as any).code === 'ENOENT') {\n console.error('Error: wrangler not found. Install it with your package manager:');\n console.error(' Install it with your package manager, e.g.: npm install wrangler');\n }\n resolve(1);\n });\n child.on('exit', (code, signal) => {\n resolve(code ?? (signal ? 1 : 0));\n });\n });\n\n // if wrangler exited on its own (not killed by us for restart), stop\n if (!restartTimeout) {\n debug('dev: wrangler exited with code', exitCode);\n process.exitCode = exitCode;\n break;\n }\n debug('dev: restarting wrangler due to env change');\n }\n } finally {\n cleanup();\n }\n}\n\n// --- main ---\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0) {\n console.log('varlock-wrangler: a drop-in replacement for `wrangler` that injects resolved env');\n console.log('Usage: varlock-wrangler <wrangler-command> [options]');\n console.log('');\n console.log('Enhanced commands:');\n console.log(' dev - injects resolved env via named pipe (no secrets on disk)');\n console.log(' deploy / versions upload - uploads env as Cloudflare vars and secrets');\n console.log(' types - generates types including varlock-managed env vars');\n console.log('');\n console.log('All other commands are passed through to wrangler unchanged.');\n return;\n }\n\n if (isDeployCommand(args)) {\n await handleDeploy(args);\n } else if (isTypesCommand(args)) {\n await handleTypes(args);\n } else if (args[0] === 'dev') {\n await handleDev(args);\n } else {\n // pass through to wrangler unchanged\n const exitCode = await spawnWrangler(args);\n process.exitCode = exitCode;\n }\n}\n\nmain().catch((err) => {\n console.error('varlock-wrangler: unexpected error:', err);\n process.exitCode = 1;\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/varlock-wrangler.ts"],"names":[],"mappings":"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","file":"varlock-wrangler.js","sourcesContent":["/* eslint-disable no-console */\n\nimport {\n writeFileSync, unlinkSync, watch, existsSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { spawn, execSync } from 'node:child_process';\n\nimport { execSyncVarlock } from 'varlock/exec-sync-varlock';\n\nconst isWindows = process.platform === 'win32';\nconst debugEnabled = !!process.env.VARLOCK_DEBUG;\nfunction debug(...args: Array<any>) {\n if (debugEnabled) console.log('[varlock-wrangler]', ...args);\n}\n\n/** Detect the package manager exec command from npm_config_user_agent */\nfunction getExecPrefix(): string {\n const ua = process.env.npm_config_user_agent || '';\n if (ua.startsWith('pnpm/')) return 'pnpm exec ';\n if (ua.startsWith('yarn/')) return 'yarn exec ';\n if (ua.startsWith('bun/')) return 'bunx ';\n if (ua.startsWith('npm/')) return 'npx ';\n return '';\n}\n\n// --- shared helpers ---\n\nfunction spawnWrangler(args: Array<string>): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn('wrangler', args, {\n stdio: 'inherit',\n shell: isWindows,\n });\n child.on('error', (err) => {\n if ((err as any).code === 'ENOENT') {\n console.error('Error: wrangler not found. Install it with your package manager:');\n console.error(' Install it with your package manager, e.g.: npm install wrangler');\n }\n reject(err);\n });\n child.on('exit', (code, signal) => {\n resolve(code ?? (signal ? 1 : 0));\n });\n });\n}\n\nfunction loadSerializedGraph() {\n const serializedGraphJson = execSyncVarlock('load --format json-full --compact', {\n showLogsOnError: true,\n });\n return {\n json: serializedGraphJson,\n graph: JSON.parse(serializedGraphJson) as {\n basePath?: string,\n sources: Array<{ label: string, enabled: boolean, path?: string }>,\n config: Record<string, { value: unknown, isSensitive: boolean }>,\n },\n };\n}\n\nfunction tmpPath(prefix: string) {\n return join(tmpdir(), `${prefix}-${randomBytes(8).toString('hex')}`);\n}\n\n/**\n * Creates a named pipe (FIFO) for long-running commands (dev).\n * On Unix: data only exists in a kernel buffer — secrets never touch disk.\n * On Windows: falls back to a regular temp file.\n */\nfunction createServingTempFile(prefix: string) {\n const filePath = tmpPath(prefix);\n\n if (!isWindows) {\n execSync(`mkfifo -m 0600 \"${filePath}\"`);\n }\n\n function cleanup() {\n try {\n unlinkSync(filePath);\n } catch {\n // may already be deleted\n }\n }\n\n /**\n * Start serving content via the FIFO (or write a regular file on Windows).\n * On Unix: spawns a child process that writes to the FIFO in a loop.\n * Using a child process means the blocked libuv thread lives in the child —\n * killing the child cleanly releases it, allowing our main process to exit.\n * On Windows: writes a regular file, with refresh() to update it.\n */\n function startServing(getContent: () => string) {\n if (isWindows) {\n writeFileSync(filePath, getContent());\n return {\n update(content: string) { writeFileSync(filePath, content); },\n stop() {\n /* noop on Windows */\n },\n };\n }\n\n // spawn a child process to serve the FIFO\n // the child reads content from stdin, then writes it to the FIFO in a loop\n const fifoServer = spawn(process.execPath, [\n '-e', `\n const fs = require('fs');\n const path = ${JSON.stringify(filePath)};\n let content = '';\n process.stdin.on('data', d => content += d);\n process.stdin.on('end', () => {\n (function serve() {\n try { fs.writeFileSync(path, content); setImmediate(serve); }\n catch { process.exit(); }\n })();\n });\n `,\n ], {\n stdio: ['pipe', 'ignore', 'ignore'],\n });\n fifoServer.stdin!.write(getContent());\n fifoServer.stdin!.end();\n\n return {\n /** Kill and respawn the FIFO server with new content */\n update(content: string) {\n fifoServer.kill();\n const replacement = startServing(() => content);\n // swap the stop/update methods on this handle\n this.stop = replacement.stop;\n this.update = replacement.update;\n },\n stop() {\n fifoServer.kill();\n },\n };\n }\n\n return {\n filePath, cleanup, startServing,\n };\n}\n\n// Cloudflare secrets are limited to 5KB each.\n// __VARLOCK_ENV can exceed this, so we split it into chunks.\nconst CF_SECRET_MAX_BYTES = 5120;\n\n/**\n * Split a string into chunks where each chunk's UTF-8 byte length ≤ maxBytes.\n * Unlike slicing a Buffer, this never splits a multi-byte character.\n */\nfunction chunkString(str: string, maxBytes: number): Array<string> {\n const chunks: Array<string> = [];\n let current = '';\n let currentBytes = 0;\n for (const char of str) {\n const charBytes = Buffer.byteLength(char);\n if (currentBytes + charBytes > maxBytes && current) {\n chunks.push(current);\n current = '';\n currentBytes = 0;\n }\n current += char;\n currentBytes += charBytes;\n }\n if (current) chunks.push(current);\n return chunks;\n}\n\nfunction formatEnvLine(key: string, value: string): string {\n if (!value.includes(\"'\")) {\n // single quotes — literal, no escaping needed\n return `${key}='${value}'`;\n }\n // fall back to double quotes with escaping\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n');\n return `${key}=\"${escaped}\"`;\n}\n\n/**\n * Adds __VARLOCK_ENV to a key-value record, splitting into chunks if needed.\n * If the value fits in one secret: sets __VARLOCK_ENV directly.\n * If too large: sets __VARLOCK_ENV_CHUNKS=N and __VARLOCK_ENV_0, __VARLOCK_ENV_1, etc.\n */\nfunction addVarlockEnvToRecord(record: Record<string, string>, json: string) {\n if (Buffer.byteLength(json) <= CF_SECRET_MAX_BYTES) {\n record.__VARLOCK_ENV = json;\n return;\n }\n const chunks = chunkString(json, CF_SECRET_MAX_BYTES);\n record.__VARLOCK_ENV_CHUNKS = String(chunks.length);\n for (let i = 0; i < chunks.length; i++) {\n record[`__VARLOCK_ENV_${i}`] = chunks[i];\n }\n debug(`__VARLOCK_ENV split into ${chunks.length} chunks (${Buffer.byteLength(json)} bytes)`);\n}\n\n/**\n * Adds __VARLOCK_ENV lines to a dotenv-format array, splitting into chunks if needed.\n */\nfunction addVarlockEnvToLines(lines: Array<string>, json: string) {\n if (Buffer.byteLength(json) <= CF_SECRET_MAX_BYTES) {\n lines.push(formatEnvLine('__VARLOCK_ENV', json));\n return;\n }\n const chunks = chunkString(json, CF_SECRET_MAX_BYTES);\n lines.push(formatEnvLine('__VARLOCK_ENV_CHUNKS', String(chunks.length)));\n for (let i = 0; i < chunks.length; i++) {\n lines.push(formatEnvLine(`__VARLOCK_ENV_${i}`, chunks[i]));\n }\n debug(`__VARLOCK_ENV split into ${chunks.length} chunks (${Buffer.byteLength(json)} bytes)`);\n}\n\nfunction formatEnvFileContent(graph: ReturnType<typeof loadSerializedGraph>) {\n // output as dotenv format using single quotes — single-quoted values are\n // treated as literal strings with no escape processing, which avoids issues\n // with double quotes in JSON blobs and special characters in values.\n // values containing single quotes are double-quoted with escaping instead.\n const lines: Array<string> = [\n '# ⚠️ AUTO-GENERATED BY VARLOCK — DO NOT EDIT',\n `# ${isWindows ? 'This is a temporary file and will be cleaned up automatically.' : 'This file is served via a named pipe (FIFO) and exists only in memory.'}`,\n '# Your .env files and .env.schema are the source of truth.',\n '# See https://varlock.dev/integrations/cloudflare/ for details.',\n '',\n ];\n for (const key in graph.graph.config) {\n const item = graph.graph.config[key];\n if (item.value === undefined) continue;\n const strValue = typeof item.value === 'string' ? item.value : JSON.stringify(item.value);\n lines.push(formatEnvLine(key, strValue));\n }\n // include __VARLOCK_ENV for the varlock runtime (compact JSON, no newlines)\n // split into chunks if it exceeds CF's 5KB secret limit\n addVarlockEnvToLines(lines, graph.json);\n return lines.join('\\n');\n}\n\n// --- command detection ---\n\nfunction isDeployCommand(args: Array<string>) {\n if (args[0] === 'deploy') return true;\n if (args[0] === 'versions' && args[1] === 'upload') return true;\n return false;\n}\n\nfunction isTypesCommand(args: Array<string>) {\n return args[0] === 'types';\n}\n\n// --- command handlers ---\n\nasync function handleDeploy(args: Array<string>) {\n if (args.includes('--secrets-file')) {\n console.error('Error: --secrets-file is managed automatically by varlock-wrangler.');\n console.error('Remove --secrets-file from your command and let varlock handle it.');\n process.exitCode = 1;\n return;\n }\n\n let loaded;\n try {\n loaded = loadSerializedGraph();\n } catch {\n console.error('Failed to resolve environment variables');\n process.exitCode = 1;\n return;\n }\n\n // split resolved vars into:\n // - non-sensitive → --var flags (visible in CF dashboard as environment variables)\n // - sensitive → --secrets-file (stored as CF secrets)\n // - __VARLOCK_ENV blob → always a secret (contains full graph including sensitive values)\n const varFlags: Array<string> = [];\n const secretsObj: Record<string, string> = {};\n\n for (const key in loaded.graph.config) {\n const item = loaded.graph.config[key];\n if (item.value === undefined) continue;\n const strValue = typeof item.value === 'string' ? item.value : JSON.stringify(item.value);\n\n if (item.isSensitive) {\n secretsObj[key] = strValue;\n } else {\n // wrangler splits KEY:VALUE on the first `:` only, so colons in values are safe\n // spawn args array passes newlines/special chars without shell escaping issues\n varFlags.push('--var', `${key}:${strValue}`);\n }\n }\n // split into chunks if it exceeds CF's 5KB secret limit\n addVarlockEnvToRecord(secretsObj, loaded.json);\n\n const tmp = createServingTempFile('varlock-secrets');\n const content = JSON.stringify(secretsObj);\n debug('deploy: starting FIFO serve');\n const handle = tmp.startServing(() => content);\n\n process.on('SIGINT', () => {\n handle.stop();\n tmp.cleanup();\n process.exit(1);\n });\n process.on('SIGTERM', () => {\n handle.stop();\n tmp.cleanup();\n process.exit(1);\n });\n\n const varCount = varFlags.length / 2; // each var is two entries: --var, KEY:VALUE\n // count only user secrets (exclude __VARLOCK_ENV and chunk keys)\n const secretCount = Object.keys(secretsObj).filter((k) => !k.startsWith('__VARLOCK_ENV')).length;\n console.log(`\\x1b[36m✨ Deploying with varlock: ${varCount} var${varCount !== 1 ? 's' : ''}, ${secretCount} secret${secretCount !== 1 ? 's' : ''} 🧙🔒\\x1b[0m`);\n\n let exitCode = process.exitCode ?? 0;\n try {\n debug('deploy: spawning wrangler');\n exitCode = await spawnWrangler([...args, ...varFlags, '--secrets-file', tmp.filePath, '--keep-vars=false']);\n debug('deploy: wrangler exited with code', exitCode);\n } finally {\n debug('deploy: cleaning up');\n handle.stop();\n tmp.cleanup();\n }\n}\n\nasync function handleTypes(args: Array<string>) {\n debug('types: resolving env');\n let loaded;\n try {\n loaded = loadSerializedGraph();\n } catch {\n console.error('Failed to resolve environment variables');\n process.exitCode = 1;\n return;\n }\n\n debug('types: resolved', Object.keys(loaded.graph.config).length, 'env vars');\n // generate a temp env file with just key names (no real values)\n // wrangler types reads this to discover which vars to include in the Env interface\n const envFileLines: Array<string> = [];\n for (const key in loaded.graph.config) {\n envFileLines.push(`${key}=`);\n }\n\n const tmp = createServingTempFile('varlock-types-env');\n debug('types: starting FIFO serve');\n const handle = tmp.startServing(() => envFileLines.join('\\n'));\n\n let exitCode = process.exitCode ?? 0;\n try {\n debug('types: spawning wrangler');\n exitCode = await spawnWrangler([...args, '--env-file', tmp.filePath]);\n debug('types: wrangler exited with code', exitCode);\n } finally {\n debug('types: cleaning up');\n handle.stop();\n tmp.cleanup();\n }\n}\n\nasync function handleDev(args: Array<string>) {\n // .dev.vars would conflict with our env injection via --env-file\n if (existsSync('.dev.vars')) {\n console.error([\n 'Error: a .dev.vars file was detected in your project.',\n 'This conflicts with varlock-wrangler which manages env vars automatically.',\n 'Remove .dev.vars and define your variables in .env files with a .env.schema instead.',\n ].join('\\n'));\n process.exitCode = 1;\n return;\n }\n\n debug('dev: resolving env');\n let loaded;\n try {\n loaded = loadSerializedGraph();\n } catch (err) {\n console.error('Failed to resolve environment variables');\n console.error(err);\n process.exitCode = 1;\n return;\n }\n debug('dev: resolved', Object.keys(loaded.graph.config).length, 'env vars');\n\n const tmp = createServingTempFile('varlock-dev-env');\n debug('dev: created FIFO at', tmp.filePath);\n\n let cachedContent = formatEnvFileContent(loaded);\n let wranglerChild: ReturnType<typeof spawn> | undefined;\n const watchers: Array<ReturnType<typeof watch>> = [];\n\n debug('dev: starting FIFO serve');\n const handle = tmp.startServing(() => cachedContent);\n\n function cleanup() {\n handle.stop();\n for (const w of watchers) w.close();\n tmp.cleanup();\n }\n\n process.on('SIGINT', () => {\n wranglerChild?.kill();\n cleanup();\n process.exit(1);\n });\n process.on('SIGTERM', () => {\n wranglerChild?.kill();\n cleanup();\n process.exit(1);\n });\n\n // watch env source files for changes and restart wrangler with fresh data\n const DEBOUNCE_MS = 300;\n // force a restart if the last save event was more than this long after the previous restart,\n // even when the resolved env is identical — handles repeated saves of an unchanged file\n const FORCE_RESTART_IDLE_MS = 5000;\n let restartTimeout: ReturnType<typeof setTimeout> | undefined;\n let cachedGraphJson = loaded.json;\n let lastRestartAt = Date.now();\n function scheduleRestart() {\n // debounce — multiple files may change at once (e.g. editor saves multiple files,\n // or macOS fs.watch() emits extra events for unchanged files)\n if (restartTimeout) clearTimeout(restartTimeout);\n restartTimeout = setTimeout(() => {\n try {\n const freshLoaded = loadSerializedGraph();\n const now = Date.now();\n const idleSinceLastRestart = now - lastRestartAt > FORCE_RESTART_IDLE_MS;\n // skip restart only when env is unchanged AND a restart happened recently\n if (freshLoaded.json === cachedGraphJson && !idleSinceLastRestart) {\n restartTimeout = undefined;\n return;\n }\n cachedGraphJson = freshLoaded.json;\n loaded = freshLoaded;\n lastRestartAt = now;\n cachedContent = formatEnvFileContent(freshLoaded);\n handle.update(cachedContent);\n console.log('[varlock-wrangler] env changed, restarting wrangler...');\n wranglerChild?.kill();\n // NOTE: restartTimeout stays truthy so the exit handler knows this was a restart-kill\n } catch (err) {\n restartTimeout = undefined;\n console.error('[varlock-wrangler] failed to re-resolve env:', (err as Error).message);\n }\n }, DEBOUNCE_MS);\n }\n\n // set up watchers on env source files\n if (loaded.graph.basePath) {\n for (const source of loaded.graph.sources) {\n if (!source.enabled || !source.path) continue;\n const fullPath = join(loaded.graph.basePath, source.path);\n try {\n const w = watch(fullPath, () => scheduleRestart());\n watchers.push(w);\n debug('dev: watching', fullPath);\n } catch {\n // file may not exist yet (e.g., optional env-specific file)\n }\n }\n }\n\n try {\n // outer loop: (re)spawn wrangler each time it exits\n // on env file changes, the watcher kills wrangler, which causes it to respawn\n // with the fresh data (FIFO serves fresh content, Windows file is refreshed)\n while (true) {\n debug('dev: spawning wrangler');\n wranglerChild = spawn('wrangler', [...args, '--env-file', tmp.filePath], {\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: isWindows,\n // force color output since piped stdio loses TTY detection\n env: { ...process.env, FORCE_COLOR: '1' },\n });\n\n // pipe wrangler output with rewrites:\n // - replace FIFO path reference with a friendlier message\n // - strip env var binding rows (other bindings like KV, D1 are preserved)\n const tmpBasename = tmp.filePath.split(/[/\\\\]/).pop()!;\n const loadCmd = `${getExecPrefix()}varlock load`;\n const envVarCount = Object.keys(loaded.graph.config).length;\n let shownVarlockNotice = false;\n const varlockNotice = `\\x1b[36m✨ ${envVarCount} env var${envVarCount !== 1 ? 's' : ''} managed by varlock 🧙🔒\\x1b[0m\\n`\n + `\\x1b[2m run \\`${loadCmd}\\` to inspect\\x1b[0m\\n`;\n const rewriteOutput = (stream: NodeJS.WriteStream) => (chunk: Buffer) => {\n let str = chunk.toString();\n // strip the FIFO path line entirely\n if (str.includes(tmpBasename)) {\n str = str.replace(/.*varlock-dev-env-[a-f0-9]+.*\\n?/g, '');\n }\n // replace env var binding rows with a single varlock notice\n // (other bindings like KV, D1 are preserved)\n if (str.includes('Environment Variable')) {\n if (!shownVarlockNotice) {\n str = str.replace(/.*Environment Variable.*\\n?/, varlockNotice);\n shownVarlockNotice = true;\n }\n str = str.replace(/.*Environment Variable.*\\n?/g, '');\n }\n // rewrite wrangler types hint to use varlock-wrangler\n if (str.includes('wrangler types')) {\n str = str.replace(/wrangler types/g, 'varlock-wrangler types');\n }\n if (str) stream.write(str);\n };\n wranglerChild.stdout?.on('data', rewriteOutput(process.stdout));\n wranglerChild.stderr?.on('data', rewriteOutput(process.stderr));\n\n const child = wranglerChild;\n const exitCode = await new Promise<number>((resolve) => {\n child.on('error', (err) => {\n if ((err as any).code === 'ENOENT') {\n console.error('Error: wrangler not found. Install it with your package manager:');\n console.error(' Install it with your package manager, e.g.: npm install wrangler');\n }\n resolve(1);\n });\n child.on('exit', (code, signal) => {\n resolve(code ?? (signal ? 1 : 0));\n });\n });\n\n // if wrangler exited on its own (not killed by us for restart), stop\n if (!restartTimeout) {\n debug('dev: wrangler exited with code', exitCode);\n process.exitCode = exitCode;\n break;\n }\n debug('dev: restarting wrangler due to env change');\n }\n } finally {\n cleanup();\n }\n}\n\n// --- main ---\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0) {\n console.log('varlock-wrangler: a drop-in replacement for `wrangler` that injects resolved env');\n console.log('Usage: varlock-wrangler <wrangler-command> [options]');\n console.log('');\n console.log('Enhanced commands:');\n console.log(' dev - injects resolved env via named pipe (no secrets on disk)');\n console.log(' deploy / versions upload - uploads env as Cloudflare vars and secrets');\n console.log(' types - generates types including varlock-managed env vars');\n console.log('');\n console.log('All other commands are passed through to wrangler unchanged.');\n return;\n }\n\n if (isDeployCommand(args)) {\n await handleDeploy(args);\n } else if (isTypesCommand(args)) {\n await handleTypes(args);\n } else if (args[0] === 'dev') {\n await handleDev(args);\n } else {\n // pass through to wrangler unchanged\n const exitCode = await spawnWrangler(args);\n process.exitCode = exitCode;\n }\n}\n\nmain().catch((err) => {\n console.error('varlock-wrangler: unexpected error:', err);\n process.exitCode = 1;\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@varlock/cloudflare-integration",
|
|
3
3
|
"description": "Cloudflare Workers integration for varlock - deploy secrets via wrangler and auto-configure Vite",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.1",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/dmno-dev/varlock.git",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"node": ">=22"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
|
-
"varlock": "^0.9.
|
|
47
|
+
"varlock": "^0.9.1",
|
|
48
48
|
"vite": ">=5",
|
|
49
49
|
"wrangler": ">=3",
|
|
50
50
|
"@cloudflare/vite-plugin": ">=1"
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@types/node": "25.3.2",
|
|
65
65
|
"@varlock/vite-integration": "^0.2.10",
|
|
66
66
|
"tsup": "^8.5.1",
|
|
67
|
-
"varlock": "^0.9.
|
|
67
|
+
"varlock": "^0.9.1",
|
|
68
68
|
"vite": "^7.1.0",
|
|
69
69
|
"vitest": "^4.0.18"
|
|
70
70
|
}
|