sync-cf-secrets 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/copy.d.ts +9 -0
- package/dist/commands/copy.js +84 -0
- package/dist/commands/copy.js.map +1 -0
- package/dist/commands/diff.d.ts +7 -0
- package/dist/commands/diff.js +63 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +128 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.js +21 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/pull.d.ts +8 -0
- package/dist/commands/pull.js +42 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +8 -0
- package/dist/commands/push.js +68 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +136 -0
- package/dist/config.js.map +1 -0
- package/dist/providers/bitwarden.d.ts +10 -0
- package/dist/providers/bitwarden.js +98 -0
- package/dist/providers/bitwarden.js.map +1 -0
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.js +47 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/onepassword.d.ts +15 -0
- package/dist/providers/onepassword.js +84 -0
- package/dist/providers/onepassword.js.map +1 -0
- package/dist/providers/types.d.ts +25 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +29 -0
- package/dist/utils.js.map +1 -0
- package/dist/wrangler.d.ts +19 -0
- package/dist/wrangler.js +87 -0
- package/dist/wrangler.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ExecSyncOptions } from "node:child_process";
|
|
2
|
+
export declare function exec(cmd: string, opts?: ExecSyncOptions): string;
|
|
3
|
+
export declare function execSilent(cmd: string): string | null;
|
|
4
|
+
export declare function cliExists(name: string): boolean;
|
|
5
|
+
export declare function log(msg: string): void;
|
|
6
|
+
export declare function warn(msg: string): void;
|
|
7
|
+
export declare function error(msg: string): void;
|
|
8
|
+
export declare function success(msg: string): void;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
export function exec(cmd, opts) {
|
|
3
|
+
const result = execSync(cmd, { encoding: "utf-8", ...opts });
|
|
4
|
+
return result.trim();
|
|
5
|
+
}
|
|
6
|
+
export function execSilent(cmd) {
|
|
7
|
+
try {
|
|
8
|
+
return exec(cmd, { stdio: ["pipe", "pipe", "pipe"] });
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function cliExists(name) {
|
|
15
|
+
return execSilent(`which ${name}`) !== null;
|
|
16
|
+
}
|
|
17
|
+
export function log(msg) {
|
|
18
|
+
console.log(msg);
|
|
19
|
+
}
|
|
20
|
+
export function warn(msg) {
|
|
21
|
+
console.error(`⚠ ${msg}`);
|
|
22
|
+
}
|
|
23
|
+
export function error(msg) {
|
|
24
|
+
console.error(`✘ ${msg}`);
|
|
25
|
+
}
|
|
26
|
+
export function success(msg) {
|
|
27
|
+
console.log(`✔ ${msg}`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwB,MAAM,oBAAoB,CAAC;AAEpE,MAAM,UAAU,IAAI,CAClB,GAAW,EACX,IAAsB;IAEtB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAQ,MAAiB,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get var names defined in the wrangler config for a given environment.
|
|
3
|
+
* These are non-secret bindings that should NOT be stored in the password manager.
|
|
4
|
+
* Includes both top-level vars and environment-specific vars.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getWranglerVars(env: string, wranglerConfig: string): Set<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Ensure wrangler CLI is available.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateWrangler(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Push a single secret to a Cloudflare Workers environment.
|
|
13
|
+
* Value is piped via stdin to avoid exposure in process args.
|
|
14
|
+
*/
|
|
15
|
+
export declare function putSecret(name: string, value: string, env: string, wranglerConfig: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* List secret names deployed to a Cloudflare Workers environment.
|
|
18
|
+
*/
|
|
19
|
+
export declare function listSecrets(env: string, wranglerConfig: string): string[];
|
package/dist/wrangler.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { cliExists, exec } from "./utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Parse a JSONC wrangler config, stripping comments and trailing commas.
|
|
6
|
+
*/
|
|
7
|
+
function parseWranglerConfig(configPath) {
|
|
8
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
9
|
+
const json = raw
|
|
10
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
11
|
+
.replace(/^(\s*)\/\/.*/gm, "$1")
|
|
12
|
+
.replace(/,(\s*[}\]])/g, "$1");
|
|
13
|
+
return JSON.parse(json);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get var names defined in the wrangler config for a given environment.
|
|
17
|
+
* These are non-secret bindings that should NOT be stored in the password manager.
|
|
18
|
+
* Includes both top-level vars and environment-specific vars.
|
|
19
|
+
*/
|
|
20
|
+
export function getWranglerVars(env, wranglerConfig) {
|
|
21
|
+
const varNames = new Set();
|
|
22
|
+
try {
|
|
23
|
+
const config = parseWranglerConfig(wranglerConfig);
|
|
24
|
+
// Top-level vars
|
|
25
|
+
const topVars = config.vars;
|
|
26
|
+
if (topVars) {
|
|
27
|
+
for (const name of Object.keys(topVars)) {
|
|
28
|
+
varNames.add(name);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Environment-specific vars
|
|
32
|
+
if (env !== "local") {
|
|
33
|
+
const envConfig = config.env?.[env];
|
|
34
|
+
const envVars = envConfig?.vars;
|
|
35
|
+
if (envVars) {
|
|
36
|
+
for (const name of Object.keys(envVars)) {
|
|
37
|
+
varNames.add(name);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// If we can't parse, return empty — don't block operations
|
|
44
|
+
}
|
|
45
|
+
return varNames;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Ensure wrangler CLI is available.
|
|
49
|
+
*/
|
|
50
|
+
export function validateWrangler() {
|
|
51
|
+
if (!cliExists("wrangler") && !cliExists("npx")) {
|
|
52
|
+
throw new Error("Wrangler CLI not found.\n" +
|
|
53
|
+
"Install: npm install -g wrangler\n" +
|
|
54
|
+
"Or add as a devDependency: npm install -D wrangler");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function wranglerBin() {
|
|
58
|
+
return cliExists("wrangler") ? "wrangler" : "npx wrangler";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Push a single secret to a Cloudflare Workers environment.
|
|
62
|
+
* Value is piped via stdin to avoid exposure in process args.
|
|
63
|
+
*/
|
|
64
|
+
export function putSecret(name, value, env, wranglerConfig) {
|
|
65
|
+
const envFlag = env === "local" ? "" : ` --env ${env}`;
|
|
66
|
+
execSync(`${wranglerBin()} secret put ${name}${envFlag} --config "${wranglerConfig}"`, {
|
|
67
|
+
input: value,
|
|
68
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* List secret names deployed to a Cloudflare Workers environment.
|
|
73
|
+
*/
|
|
74
|
+
export function listSecrets(env, wranglerConfig) {
|
|
75
|
+
const envFlag = env === "local" ? "" : ` --env ${env}`;
|
|
76
|
+
try {
|
|
77
|
+
const raw = exec(`${wranglerBin()} secret list${envFlag} --config "${wranglerConfig}"`, { stdio: ["pipe", "pipe", "pipe"] });
|
|
78
|
+
// Wrangler outputs JSON array of { name, type }
|
|
79
|
+
const parsed = JSON.parse(raw);
|
|
80
|
+
return parsed.map((s) => s.name).sort();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Older wrangler versions output plain text
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=wrangler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrangler.js","sourceRoot":"","sources":["../src/wrangler.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sync-cf-secrets",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Sync Cloudflare Workers secrets from 1Password or Bitwarden. Push, pull, and diff secrets across environments.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"sync-cf-secrets": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsc --watch",
|
|
15
|
+
"prepublishOnly": "tsc"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"cloudflare",
|
|
19
|
+
"cloudflare-workers",
|
|
20
|
+
"workers",
|
|
21
|
+
"secrets",
|
|
22
|
+
"secret-management",
|
|
23
|
+
"environment-variables",
|
|
24
|
+
"env",
|
|
25
|
+
"1password",
|
|
26
|
+
"bitwarden",
|
|
27
|
+
"wrangler",
|
|
28
|
+
"password-manager",
|
|
29
|
+
"devops",
|
|
30
|
+
"cli"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/lecstor/sync-cf-secrets"
|
|
35
|
+
},
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18.3.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"wrangler": ">=3.0.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"wrangler": {
|
|
45
|
+
"optional": true
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^25.5.2",
|
|
50
|
+
"typescript": "^5.7.0"
|
|
51
|
+
}
|
|
52
|
+
}
|