varlock 0.0.0 → 0.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.
Files changed (70) hide show
  1. package/README.md +46 -0
  2. package/bin/cli.js +2 -0
  3. package/dist/auto-load.d.ts +2 -0
  4. package/dist/auto-load.js +11 -0
  5. package/dist/auto-load.js.map +1 -0
  6. package/dist/chunk-33ROL4J5.js +1013 -0
  7. package/dist/chunk-33ROL4J5.js.map +1 -0
  8. package/dist/chunk-35HGPX6I.js +98 -0
  9. package/dist/chunk-35HGPX6I.js.map +1 -0
  10. package/dist/chunk-7UQXFWKN.js +82 -0
  11. package/dist/chunk-7UQXFWKN.js.map +1 -0
  12. package/dist/chunk-B4UBSMSZ.js +142 -0
  13. package/dist/chunk-B4UBSMSZ.js.map +1 -0
  14. package/dist/chunk-BRP5MZU6.js +70 -0
  15. package/dist/chunk-BRP5MZU6.js.map +1 -0
  16. package/dist/chunk-BS3AGAHF.js +53 -0
  17. package/dist/chunk-BS3AGAHF.js.map +1 -0
  18. package/dist/chunk-CPA2D42B.js +146 -0
  19. package/dist/chunk-CPA2D42B.js.map +1 -0
  20. package/dist/chunk-DAZNZPLN.js +675 -0
  21. package/dist/chunk-DAZNZPLN.js.map +1 -0
  22. package/dist/chunk-EMPXU5TW.js +681 -0
  23. package/dist/chunk-EMPXU5TW.js.map +1 -0
  24. package/dist/chunk-HZADDTO5.js +2310 -0
  25. package/dist/chunk-HZADDTO5.js.map +1 -0
  26. package/dist/chunk-LQZ6ICSS.js +21 -0
  27. package/dist/chunk-LQZ6ICSS.js.map +1 -0
  28. package/dist/chunk-NZDUC7Q3.js +69 -0
  29. package/dist/chunk-NZDUC7Q3.js.map +1 -0
  30. package/dist/chunk-QCC3P7BT.js +39 -0
  31. package/dist/chunk-QCC3P7BT.js.map +1 -0
  32. package/dist/chunk-QTYVZQSF.js +225 -0
  33. package/dist/chunk-QTYVZQSF.js.map +1 -0
  34. package/dist/chunk-R53MTEAM.js +32 -0
  35. package/dist/chunk-R53MTEAM.js.map +1 -0
  36. package/dist/chunk-RCHPHIHX.js +15 -0
  37. package/dist/chunk-RCHPHIHX.js.map +1 -0
  38. package/dist/chunk-XN24GZXQ.js +35 -0
  39. package/dist/chunk-XN24GZXQ.js.map +1 -0
  40. package/dist/cli/cli-executable.d.ts +2 -0
  41. package/dist/cli/cli-executable.js +206 -0
  42. package/dist/cli/cli-executable.js.map +1 -0
  43. package/dist/doctor.command-N5JAIXRM.js +6 -0
  44. package/dist/doctor.command-N5JAIXRM.js.map +1 -0
  45. package/dist/dotenv-compat.d.ts +2 -0
  46. package/dist/dotenv-compat.js +11 -0
  47. package/dist/dotenv-compat.js.map +1 -0
  48. package/dist/en-US-TSGNDI2P.js +22 -0
  49. package/dist/en-US-TSGNDI2P.js.map +1 -0
  50. package/dist/encrypt.command-VGJABHNK.js +6 -0
  51. package/dist/encrypt.command-VGJABHNK.js.map +1 -0
  52. package/dist/help.command-YZDL2VEQ.js +5 -0
  53. package/dist/help.command-YZDL2VEQ.js.map +1 -0
  54. package/dist/index.d.ts +37 -0
  55. package/dist/index.js +8 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/init.command-7BSALNL5.js +10 -0
  58. package/dist/init.command-7BSALNL5.js.map +1 -0
  59. package/dist/ja-JP-UBPCQAAD.js +22 -0
  60. package/dist/ja-JP-UBPCQAAD.js.map +1 -0
  61. package/dist/load.command-4MJR5J43.js +9 -0
  62. package/dist/load.command-4MJR5J43.js.map +1 -0
  63. package/dist/login.command-22RUZJLR.js +7 -0
  64. package/dist/login.command-22RUZJLR.js.map +1 -0
  65. package/dist/opt-out.command-Y4KUQ6PQ.js +5 -0
  66. package/dist/opt-out.command-Y4KUQ6PQ.js.map +1 -0
  67. package/dist/run.command-ASKXIWBC.js +9 -0
  68. package/dist/run.command-ASKXIWBC.js.map +1 -0
  69. package/package.json +50 -3
  70. package/notes.md +0 -3
@@ -0,0 +1,70 @@
1
+ import { checkForSchemaErrors, checkForConfigErrors } from './chunk-NZDUC7Q3.js';
2
+ import { define } from './chunk-33ROL4J5.js';
3
+ import { loadVarlockEnvGraph, getItemSummary } from './chunk-QTYVZQSF.js';
4
+ import { my_dash_default } from './chunk-HZADDTO5.js';
5
+ import { __name } from './chunk-XN24GZXQ.js';
6
+
7
+ // src/cli/commands/load.command.ts
8
+ var commandSpec = define({
9
+ name: "load",
10
+ description: "Load env according to schema and resolve values",
11
+ args: {
12
+ format: {
13
+ type: "string",
14
+ short: "f",
15
+ description: "Format of output (if not pretty printed to console)",
16
+ default: "pretty"
17
+ },
18
+ "show-all": {
19
+ type: "boolean",
20
+ description: "When load is fialing, show all items rather than only failing items"
21
+ }
22
+ }
23
+ });
24
+ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
25
+ const { format, "show-all": showAll } = ctx.values;
26
+ const envGraph = await loadVarlockEnvGraph();
27
+ checkForSchemaErrors(envGraph);
28
+ if (envGraph.schemaDataSource?.decorators.generateTypes) {
29
+ const typeGenSettings = envGraph.schemaDataSource?.decorators.generateTypes.bareFnArgs?.simplifiedValues;
30
+ if (!my_dash_default.isPlainObject(typeGenSettings)) {
31
+ throw new Error("@generateTypes - must be a fn call with key/value args");
32
+ }
33
+ if (!typeGenSettings.lang) throw new Error("@generateTypes - must set `lang` arg");
34
+ if (typeGenSettings.lang !== "ts") throw new Error(`@generateTypes - unsupported language: ${typeGenSettings.lang}`);
35
+ if (!typeGenSettings.path) throw new Error("@generateTypes - must set `path` arg");
36
+ if (!my_dash_default.isString(typeGenSettings.path)) throw new Error("@generateTypes - `path` arg must be a string");
37
+ await envGraph.generateTypes(typeGenSettings.lang, typeGenSettings.path);
38
+ }
39
+ await envGraph.resolveEnvValues();
40
+ checkForConfigErrors(envGraph, { showAll });
41
+ if (format === "pretty") {
42
+ for (const itemKey in envGraph.configSchema) {
43
+ const item = envGraph.configSchema[itemKey];
44
+ console.log(getItemSummary(item));
45
+ }
46
+ } else if (format === "json") {
47
+ const resolvedEnv = envGraph.getResolvedEnvObject();
48
+ console.log(JSON.stringify(resolvedEnv, null, 2));
49
+ } else if (format === "env") {
50
+ const resolvedEnv = envGraph.getResolvedEnvObject();
51
+ for (const key in resolvedEnv) {
52
+ const value = resolvedEnv[key];
53
+ let strValue;
54
+ if (value === void 0) {
55
+ strValue = "";
56
+ } else if (typeof value === "string") {
57
+ strValue = `"${value.replaceAll('"', '\\"').replaceAll("\n", "\\n")}"`;
58
+ } else {
59
+ strValue = JSON.stringify(value);
60
+ }
61
+ console.log(`${key}=${strValue}`);
62
+ }
63
+ } else {
64
+ throw new Error(`Unknown format: ${format}`);
65
+ }
66
+ }, "commandFn");
67
+
68
+ export { commandFn, commandSpec };
69
+ //# sourceMappingURL=chunk-BRP5MZU6.js.map
70
+ //# sourceMappingURL=chunk-BRP5MZU6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/load.command.ts"],"names":[],"mappings":"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","file":"chunk-BRP5MZU6.js","sourcesContent":["import { define } from 'gunshi';\nimport _ from '@env-spec/utils/my-dash';\n\nimport { loadVarlockEnvGraph } from '../../lib/load-graph';\nimport { getItemSummary } from '../../lib/formatting';\nimport { checkForConfigErrors, checkForSchemaErrors } from '../helpers/error-checks';\nimport { TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\n\nexport const commandSpec = define({\n name: 'load',\n description: 'Load env according to schema and resolve values',\n args: {\n format: {\n type: 'string',\n short: 'f',\n description: 'Format of output (if not pretty printed to console)',\n default: 'pretty',\n },\n 'show-all': {\n type: 'boolean',\n description: 'When load is fialing, show all items rather than only failing items',\n },\n },\n});\n\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const { format, 'show-all': showAll } = ctx.values;\n\n const envGraph = await loadVarlockEnvGraph();\n checkForSchemaErrors(envGraph);\n\n // TODO: move into a more general post-load hook system\n if (envGraph.schemaDataSource?.decorators.generateTypes) {\n // TODO: much of this logic should move to the definition of the decorator itself\n const typeGenSettings = envGraph.schemaDataSource?.decorators.generateTypes.bareFnArgs?.simplifiedValues;\n if (!_.isPlainObject(typeGenSettings)) {\n throw new Error('@generateTypes - must be a fn call with key/value args');\n }\n if (!typeGenSettings.lang) throw new Error('@generateTypes - must set `lang` arg');\n if (typeGenSettings.lang !== 'ts') throw new Error(`@generateTypes - unsupported language: ${typeGenSettings.lang}`);\n if (!typeGenSettings.path) throw new Error('@generateTypes - must set `path` arg');\n if (!_.isString(typeGenSettings.path)) throw new Error('@generateTypes - `path` arg must be a string');\n await envGraph.generateTypes(typeGenSettings.lang, typeGenSettings.path);\n }\n\n await envGraph.resolveEnvValues();\n checkForConfigErrors(envGraph, { showAll });\n\n if (format === 'pretty') {\n for (const itemKey in envGraph.configSchema) {\n const item = envGraph.configSchema[itemKey];\n console.log(getItemSummary(item));\n }\n } else if (format === 'json') {\n const resolvedEnv = envGraph.getResolvedEnvObject();\n console.log(JSON.stringify(resolvedEnv, null, 2));\n } else if (format === 'env') {\n const resolvedEnv = envGraph.getResolvedEnvObject();\n for (const key in resolvedEnv) {\n const value = resolvedEnv[key];\n let strValue: string;\n if (value === undefined) {\n strValue = '';\n } else if (typeof value === 'string') {\n strValue = `\"${value.replaceAll('\"', '\\\\\"').replaceAll('\\n', '\\\\n')}\"`;\n } else {\n strValue = JSON.stringify(value);\n }\n console.log(`${key}=${strValue}`);\n }\n } else {\n throw new Error(`Unknown format: ${format}`);\n }\n\n // const resolvedEnv = envGraph.getResolvedEnvObject();\n // console.log(resolvedEnv);\n};\n"]}
@@ -0,0 +1,53 @@
1
+ import { checkForConfigErrors } from './chunk-NZDUC7Q3.js';
2
+ import { loadVarlockEnvGraph, resetRedactionMap } from './chunk-QTYVZQSF.js';
3
+ import { __name } from './chunk-XN24GZXQ.js';
4
+
5
+ // src/index.ts
6
+ var envValues = {};
7
+ var publicKeys = [];
8
+ var EnvProxy = new Proxy({}, {
9
+ get(target, prop) {
10
+ if (typeof prop !== "string") throw new Error("prop keys cannot be symbols");
11
+ if (!(prop in envValues)) throw new Error(`Env key \`${prop}\` does not exist`);
12
+ return envValues[prop.toString()];
13
+ }
14
+ });
15
+ var PublicEnvProxy = new Proxy({}, {
16
+ get(target, prop) {
17
+ if (typeof prop !== "string") throw new Error("prop keys cannot be symbols");
18
+ if (!(prop in envValues)) throw new Error(`Env key \`${prop}\` does not exist`);
19
+ if (!publicKeys.includes(prop.toString())) throw new Error(`${prop.toString()} is sensitive, use ENV instead of PUBLIC_ENV`);
20
+ return envValues[prop.toString()];
21
+ }
22
+ });
23
+ var ENV = EnvProxy;
24
+ var PUBLIC_ENV = PublicEnvProxy;
25
+ function loadSync() {
26
+ throw new Error("Not yet supported");
27
+ }
28
+ __name(loadSync, "loadSync");
29
+ async function load() {
30
+ const envGraph = await loadVarlockEnvGraph();
31
+ await envGraph.resolveEnvValues();
32
+ checkForConfigErrors(envGraph);
33
+ const resolvedEnv = envGraph.getResolvedEnvObject();
34
+ resetRedactionMap(envGraph);
35
+ envValues = {};
36
+ publicKeys = [];
37
+ for (const key in resolvedEnv) {
38
+ if (!envGraph.configSchema[key].isSensitive) publicKeys.push(key);
39
+ const resolvedValue = resolvedEnv[key];
40
+ if (resolvedValue === void 0 || resolvedValue === null) {
41
+ envValues[key] = void 0;
42
+ process.env[key] = void 0;
43
+ } else {
44
+ envValues[key] = resolvedValue;
45
+ process.env[key] = resolvedValue.toString();
46
+ }
47
+ }
48
+ }
49
+ __name(load, "load");
50
+
51
+ export { ENV, PUBLIC_ENV, load, loadSync };
52
+ //# sourceMappingURL=chunk-BS3AGAHF.js.map
53
+ //# sourceMappingURL=chunk-BS3AGAHF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAKA,IAAI,YAAY,EAAC;AACjB,IAAI,aAAa,EAAC;AAMlB,IAAM,QAAW,GAAA,IAAI,KAAsB,CAAA,EAAI,EAAA;AAAA,EAC7C,GAAA,CAAI,QAAQ,IAAM,EAAA;AAChB,IAAA,IAAI,OAAO,IAAS,KAAA,QAAA,EAAgB,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAC3E,IAAI,IAAA,EAAE,QAAQ,SAAY,CAAA,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,UAAA,EAAa,IAAI,CAAmB,iBAAA,CAAA,CAAA;AAC9E,IAAO,OAAA,SAAA,CAAU,IAAK,CAAA,QAAA,EAAU,CAAA;AAAA;AAEpC,CAAC,CAAA;AACD,IAAM,cAAiB,GAAA,IAAI,KAA4B,CAAA,EAAI,EAAA;AAAA,EACzD,GAAA,CAAI,QAAQ,IAAM,EAAA;AAChB,IAAA,IAAI,OAAO,IAAS,KAAA,QAAA,EAAgB,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAC3E,IAAI,IAAA,EAAE,QAAQ,SAAY,CAAA,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,UAAA,EAAa,IAAI,CAAmB,iBAAA,CAAA,CAAA;AAC9E,IAAA,IAAI,CAAC,UAAA,CAAW,QAAS,CAAA,IAAA,CAAK,UAAU,CAAA,EAAS,MAAA,IAAI,KAAM,CAAA,CAAA,EAAG,IAAK,CAAA,QAAA,EAAU,CAA8C,4CAAA,CAAA,CAAA;AAC3H,IAAO,OAAA,SAAA,CAAU,IAAK,CAAA,QAAA,EAAU,CAAA;AAAA;AAEpC,CAAC,CAAA;AAEM,IAAM,GAAM,GAAA;AACZ,IAAM,UAAa,GAAA;AAEnB,SAAS,QAAW,GAAA;AACzB,EAAM,MAAA,IAAI,MAAM,mBAAmB,CAAA;AACrC;AAFgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAIhB,eAAsB,IAAO,GAAA;AAK3B,EAAM,MAAA,QAAA,GAAW,MAAM,mBAAoB,EAAA;AAC3C,EAAA,MAAM,SAAS,gBAAiB,EAAA;AAEhC,EAAA,oBAAA,CAAqB,QAAQ,CAAA;AAE7B,EAAM,MAAA,WAAA,GAAc,SAAS,oBAAqB,EAAA;AAElD,EAAA,iBAAA,CAAkB,QAAQ,CAAA;AAG1B,EAAA,SAAA,GAAY,EAAC;AACb,EAAA,UAAA,GAAa,EAAC;AAEd,EAAA,KAAA,MAAW,OAAO,WAAa,EAAA;AAC7B,IAAI,IAAA,CAAC,SAAS,YAAa,CAAA,GAAG,EAAE,WAAa,EAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAEhE,IAAM,MAAA,aAAA,GAAgB,YAAY,GAAG,CAAA;AACrC,IAAI,IAAA,aAAA,KAAkB,MAAa,IAAA,aAAA,KAAkB,IAAM,EAAA;AACzD,MAAA,SAAA,CAAU,GAAG,CAAI,GAAA,MAAA;AACjB,MAAQ,OAAA,CAAA,GAAA,CAAI,GAAG,CAAI,GAAA,MAAA;AAAA,KACd,MAAA;AACL,MAAA,SAAA,CAAU,GAAG,CAAI,GAAA,aAAA;AACjB,MAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAI,GAAA,aAAA,CAAc,QAAS,EAAA;AAAA;AAC5C;AAIJ;AAhCsB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA","file":"chunk-BS3AGAHF.js","sourcesContent":["import { checkForConfigErrors } from './cli/helpers/error-checks';\nimport { loadVarlockEnvGraph } from './lib/load-graph';\nimport { resetRedactionMap } from './lib/redaction-helpers';\n\n\nlet envValues = {} as Record<string, any>;\nlet publicKeys = [] as Array<string>;\n\n// these types will be overridden/augmented by the generated types\nexport interface TypedEnvSchema {}\nexport interface PublicTypedEnvSchema {}\n\nconst EnvProxy = new Proxy<TypedEnvSchema>({}, {\n get(target, prop) {\n if (typeof prop !== 'string') throw new Error('prop keys cannot be symbols');\n if (!(prop in envValues)) throw new Error(`Env key \\`${prop}\\` does not exist`);\n return envValues[prop.toString()];\n },\n});\nconst PublicEnvProxy = new Proxy<PublicTypedEnvSchema>({}, {\n get(target, prop) {\n if (typeof prop !== 'string') throw new Error('prop keys cannot be symbols');\n if (!(prop in envValues)) throw new Error(`Env key \\`${prop}\\` does not exist`);\n if (!publicKeys.includes(prop.toString())) throw new Error(`${prop.toString()} is sensitive, use ENV instead of PUBLIC_ENV`);\n return envValues[prop.toString()];\n },\n});\n\nexport const ENV = EnvProxy;\nexport const PUBLIC_ENV = PublicEnvProxy;\n\nexport function loadSync() {\n throw new Error('Not yet supported');\n}\n\nexport async function load() {\n // TODO: add some options\n // console.log('loading varlock (async)');\n\n\n const envGraph = await loadVarlockEnvGraph();\n await envGraph.resolveEnvValues();\n\n checkForConfigErrors(envGraph);\n\n const resolvedEnv = envGraph.getResolvedEnvObject();\n\n resetRedactionMap(envGraph);\n\n // reset env values\n envValues = {};\n publicKeys = [];\n\n for (const key in resolvedEnv) {\n if (!envGraph.configSchema[key].isSensitive) publicKeys.push(key);\n\n const resolvedValue = resolvedEnv[key];\n if (resolvedValue === undefined || resolvedValue === null) {\n envValues[key] = undefined;\n process.env[key] = undefined; // not sure what to do here\n } else {\n envValues[key] = resolvedValue;\n process.env[key] = resolvedValue.toString();\n }\n }\n\n // TODO: return resolved env and schema / meta info\n}\n\n// expose redaction utils\nexport { VarlockRedactor } from './lib/redaction-helpers';\n"]}
@@ -0,0 +1,146 @@
1
+ import { logLines } from './chunk-LQZ6ICSS.js';
2
+ import { define } from './chunk-33ROL4J5.js';
3
+ import { ansis_default } from './chunk-7UQXFWKN.js';
4
+ import { __name } from './chunk-XN24GZXQ.js';
5
+ import { setTimeout } from 'node:timers/promises';
6
+ import os from 'node:os';
7
+ import { spawn } from 'node:child_process';
8
+
9
+ // src/config.ts
10
+ var CONFIG = {
11
+ // VARLOCK_API_URL: 'http://localhost:8888',
12
+ VARLOCK_API_URL: "https://api.varlock.dev",
13
+ GITHUB_APP_CLIENT_ID: "Iv23li50gB8bMxLauiJQ",
14
+ // varlock.dev app
15
+ POSTHOG_API_KEY: "phc_bfzH97VIta8yQa8HrsgmitqS6rTydjMISs0m8aqJTnq",
16
+ POSTHOG_HOST: "https://ph.varlock.dev"
17
+ };
18
+ var platform = os.platform();
19
+ var isWindows = platform.match(/^win/i);
20
+ var isMac = platform.match(/^darwin/i);
21
+ var isLinux = !isWindows && !isMac;
22
+ function openUrl(url) {
23
+ if (isWindows) {
24
+ spawn("cmd", ["/c", "start", " ", url], { detached: true });
25
+ } else if (isMac) {
26
+ spawn("open", [url], { detached: true });
27
+ } else if (isLinux) {
28
+ spawn("xdg-open", [url], { detached: true });
29
+ }
30
+ }
31
+ __name(openUrl, "openUrl");
32
+
33
+ // src/cli/helpers/key-press.ts
34
+ async function keyPressed(keys = true) {
35
+ process.stdin.setRawMode(true);
36
+ return new Promise((resolve) => {
37
+ function keyPressHandler(d) {
38
+ const keyStr = d.toString();
39
+ if (["", ""].includes(keyStr)) {
40
+ process.exit(1);
41
+ }
42
+ if (keys === true || keys.includes(keyStr)) {
43
+ process.stdin.setRawMode(false);
44
+ process.stdin.off("data", keyPressHandler);
45
+ resolve();
46
+ }
47
+ }
48
+ __name(keyPressHandler, "keyPressHandler");
49
+ process.stdin.on("data", keyPressHandler);
50
+ });
51
+ }
52
+ __name(keyPressed, "keyPressed");
53
+
54
+ // src/cli/commands/login.command.ts
55
+ var commandSpec = define({
56
+ name: "login",
57
+ description: "Authenticate (using GitHub)",
58
+ args: {}
59
+ });
60
+ var commandFn = /* @__PURE__ */ __name(async (ctx) => {
61
+ const codeReq = await fetch("https://github.com/login/device/code", {
62
+ method: "POST",
63
+ body: JSON.stringify({
64
+ client_id: CONFIG.GITHUB_APP_CLIENT_ID
65
+ }),
66
+ headers: {
67
+ "Content-Type": "application/json",
68
+ Accept: "application/json"
69
+ }
70
+ });
71
+ if (codeReq.status !== 200) {
72
+ console.log("Failed to initiate GitHub device flow login!");
73
+ process.exit(1);
74
+ }
75
+ const ghCodeInfo = await codeReq.json();
76
+ logLines([
77
+ "\u{1F511} Authenticating using GitHub:",
78
+ "",
79
+ `First please copy this code: ${ansis_default.bold.magenta(ghCodeInfo.user_code)}`,
80
+ "",
81
+ `Log in @ ${ghCodeInfo.verification_uri}`,
82
+ "",
83
+ "Press ENTER to open in your default browser..."
84
+ ]);
85
+ await keyPressed(["\r"]);
86
+ console.log(ansis_default.italic.gray("... please complete login on github.com ..."));
87
+ openUrl(ghCodeInfo.verification_uri);
88
+ const pollMs = ghCodeInfo.interval * 1e3;
89
+ const expiresMs = ghCodeInfo.expires_in * 1e3;
90
+ const startAt = /* @__PURE__ */ new Date();
91
+ let oauthStatus;
92
+ while (true) {
93
+ await setTimeout(pollMs);
94
+ try {
95
+ const oauthStatusReq = await fetch("https://github.com/login/oauth/access_token", {
96
+ method: "POST",
97
+ body: JSON.stringify({
98
+ client_id: CONFIG.GITHUB_APP_CLIENT_ID,
99
+ device_code: ghCodeInfo.device_code,
100
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code"
101
+ }),
102
+ headers: {
103
+ "Content-Type": "application/json",
104
+ Accept: "application/json"
105
+ }
106
+ });
107
+ oauthStatus = await oauthStatusReq.json();
108
+ } catch (err) {
109
+ console.log(err);
110
+ }
111
+ if (oauthStatus.error === "access_denied") {
112
+ console.log("\u274C Login attempt was cancelled! Please try again.");
113
+ process.exit(1);
114
+ }
115
+ if (oauthStatus.access_token) break;
116
+ if ((/* @__PURE__ */ new Date()).getTime() - startAt.getTime() > expiresMs) {
117
+ console.log("\u274C Login timed out! Please try again.");
118
+ process.exit(1);
119
+ }
120
+ }
121
+ const authReq = await fetch(`${CONFIG.VARLOCK_API_URL}/github/auth-from-device-flow`, {
122
+ method: "POST",
123
+ body: JSON.stringify({
124
+ accessToken: oauthStatus.access_token,
125
+ refreshToken: oauthStatus.refresh_token,
126
+ accessTokenExpiresAt: new Date(Date.now() + oauthStatus.expires_in * 1e3).toISOString(),
127
+ refreshTokenExpiresAt: new Date(Date.now() + oauthStatus.refresh_token_expires_in * 1e3).toISOString(),
128
+ tokenType: oauthStatus.token_type,
129
+ scope: oauthStatus.scope
130
+ }),
131
+ headers: {
132
+ "Content-Type": "application/json",
133
+ Accept: "application/json"
134
+ }
135
+ });
136
+ if (authReq.status !== 200) {
137
+ console.log(await authReq.json());
138
+ process.exit(1);
139
+ }
140
+ const authRes = await authReq.json();
141
+ console.log(`\u2705 Logged in as ${authRes.user.githubUsername} (${authRes.user.name})!`);
142
+ }, "commandFn");
143
+
144
+ export { CONFIG, commandFn, commandSpec };
145
+ //# sourceMappingURL=chunk-CPA2D42B.js.map
146
+ //# sourceMappingURL=chunk-CPA2D42B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/cli/helpers/open-url.ts","../src/cli/helpers/key-press.ts","../src/cli/commands/login.command.ts"],"names":["delay"],"mappings":"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","file":"chunk-CPA2D42B.js","sourcesContent":["// TODO: figure out dev vs prod env vars... would be great to use varlock here!\n\n// NOTE - these keys are safe to publish\n\nexport const CONFIG = {\n // VARLOCK_API_URL: 'http://localhost:8888',\n VARLOCK_API_URL: 'https://api.varlock.dev',\n GITHUB_APP_CLIENT_ID: 'Iv23li50gB8bMxLauiJQ', // varlock.dev app\n POSTHOG_API_KEY: 'phc_bfzH97VIta8yQa8HrsgmitqS6rTydjMISs0m8aqJTnq',\n POSTHOG_HOST: 'https://ph.varlock.dev',\n};\n","import os from 'node:os';\nimport { spawn } from 'node:child_process';\n\nconst platform = os.platform();\n\nconst isWindows = platform.match(/^win/i);\nconst isMac = platform.match(/^darwin/i);\nconst isLinux = (!isWindows && !isMac);\n\n/** opens a url using the default browser */\nexport function openUrl(url: string) {\n if (isWindows) {\n spawn('cmd', ['/c', 'start', ' ', url], { detached: true });\n } else if (isMac) {\n spawn('open', [url], { detached: true });\n } else if (isLinux) {\n // TODO: maybe check for x-www-browser instead?\n spawn('xdg-open', [url], { detached: true });\n }\n}\n","\nexport async function keyPressed(keys: Array<string> | true = true) {\n process.stdin.setRawMode(true);\n return new Promise<void>((resolve) => {\n function keyPressHandler(d: Buffer) {\n const keyStr = d.toString();\n // exit on ctrl+c or ctrl+d\n if (['\\u0003', '\\u0004'].includes(keyStr)) {\n process.exit(1);\n }\n if (keys === true || keys.includes(keyStr)) {\n process.stdin.setRawMode(false);\n process.stdin.off('data', keyPressHandler);\n resolve();\n }\n }\n process.stdin.on('data', keyPressHandler);\n });\n}\n","\nimport { setTimeout as delay } from 'node:timers/promises';\nimport ansis from 'ansis';\nimport { define } from 'gunshi';\nimport { logLines } from '../helpers/pretty-format';\nimport { CONFIG } from '../../config';\nimport { openUrl } from '../helpers/open-url';\nimport { keyPressed } from '../helpers/key-press';\nimport { TypedGunshiCommandFn } from '../helpers/gunshi-type-utils';\n\n\nexport const commandSpec = define({\n name: 'login',\n description: 'Authenticate (using GitHub)',\n args: {},\n});\n\n\nexport const commandFn: TypedGunshiCommandFn<typeof commandSpec> = async (ctx) => {\n const codeReq = await fetch('https://github.com/login/device/code', {\n method: 'POST',\n body: JSON.stringify({\n client_id: CONFIG.GITHUB_APP_CLIENT_ID,\n }),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n });\n if (codeReq.status !== 200) {\n console.log('Failed to initiate GitHub device flow login!');\n process.exit(1);\n }\n\n const ghCodeInfo = await codeReq.json() as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in: number;\n interval: number;\n };\n\n logLines([\n '🔑 Authenticating using GitHub:',\n '',\n `First please copy this code: ${ansis.bold.magenta(ghCodeInfo.user_code)}`,\n '',\n `Log in @ ${ghCodeInfo.verification_uri}`,\n '',\n 'Press ENTER to open in your default browser...',\n ]);\n await keyPressed(['\\r']);\n console.log(ansis.italic.gray('... please complete login on github.com ...'));\n openUrl(ghCodeInfo.verification_uri);\n\n const pollMs = ghCodeInfo.interval * 1000;\n const expiresMs = ghCodeInfo.expires_in * 1000;\n const startAt = new Date();\n\n let oauthStatus: any;\n while (true) {\n await delay(pollMs);\n try {\n const oauthStatusReq = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n body: JSON.stringify({\n client_id: CONFIG.GITHUB_APP_CLIENT_ID,\n device_code: ghCodeInfo.device_code,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n });\n oauthStatus = await oauthStatusReq.json();\n } catch (err) {\n console.log(err);\n }\n\n // we are expecting to see { error: 'authorization_pending' }\n // probably a few more error types we could bail early on\n if (oauthStatus.error === 'access_denied') {\n console.log('❌ Login attempt was cancelled! Please try again.');\n process.exit(1);\n }\n\n // if we got the token, we break and continue\n if (oauthStatus.access_token) break;\n\n // if we've been polling for too long, give up\n if (new Date().getTime() - startAt.getTime() > expiresMs) {\n console.log('❌ Login timed out! Please try again.');\n process.exit(1);\n }\n }\n\n // oauthStatus when completed looks like:\n // {\n // access_token: 'ghu_abcxyz',\n // expires_in: 28800,\n // refresh_token: 'ghr_abcxyz',\n // refresh_token_expires_in: 15897600,\n // token_type: 'bearer',\n // scope: ''\n // }\n\n // pass along github auth info to API, which will fetch info from HG, handle login/signup, return JWT\n const authReq = await fetch(`${CONFIG.VARLOCK_API_URL}/github/auth-from-device-flow`, {\n method: 'POST',\n body: JSON.stringify({\n accessToken: oauthStatus.access_token,\n refreshToken: oauthStatus.refresh_token,\n accessTokenExpiresAt: new Date(Date.now() + oauthStatus.expires_in * 1000).toISOString(),\n refreshTokenExpiresAt: new Date(Date.now() + oauthStatus.refresh_token_expires_in * 1000).toISOString(),\n tokenType: oauthStatus.token_type,\n scope: oauthStatus.scope,\n }),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n });\n if (authReq.status !== 200) {\n console.log(await authReq.json());\n process.exit(1);\n }\n\n const authRes = await authReq.json() as {\n user: {\n githubUserId: string;\n githubUsername: string;\n name: string;\n },\n token: string;\n isNewUser: boolean;\n publicKey?: string;\n };\n\n // TODO: if app exists, pass off login info to it instead of storing in home folder\n // otherwise save login info in ~/.varlock/identity.json\n // also save it along with a new keypair if necessary, and send the public key to the api\n\n console.log(`✅ Logged in as ${authRes.user.githubUsername} (${authRes.user.name})!`);\n};\n"]}