trustlocal 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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -0
  3. package/dist/commands/init.d.ts +25 -0
  4. package/dist/commands/init.d.ts.map +1 -0
  5. package/dist/commands/init.js +289 -0
  6. package/dist/commands/init.js.map +1 -0
  7. package/dist/commands/renew.d.ts +16 -0
  8. package/dist/commands/renew.d.ts.map +1 -0
  9. package/dist/commands/renew.js +54 -0
  10. package/dist/commands/renew.js.map +1 -0
  11. package/dist/commands/status.d.ts +13 -0
  12. package/dist/commands/status.d.ts.map +1 -0
  13. package/dist/commands/status.js +140 -0
  14. package/dist/commands/status.js.map +1 -0
  15. package/dist/commands/sync.d.ts +13 -0
  16. package/dist/commands/sync.d.ts.map +1 -0
  17. package/dist/commands/sync.js +111 -0
  18. package/dist/commands/sync.js.map +1 -0
  19. package/dist/config/trustlocal.d.ts +40 -0
  20. package/dist/config/trustlocal.d.ts.map +1 -0
  21. package/dist/config/trustlocal.js +54 -0
  22. package/dist/config/trustlocal.js.map +1 -0
  23. package/dist/detector/framework.d.ts +14 -0
  24. package/dist/detector/framework.d.ts.map +1 -0
  25. package/dist/detector/framework.js +89 -0
  26. package/dist/detector/framework.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +69 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/injectors/astHelper.d.ts +35 -0
  32. package/dist/injectors/astHelper.d.ts.map +1 -0
  33. package/dist/injectors/astHelper.js +192 -0
  34. package/dist/injectors/astHelper.js.map +1 -0
  35. package/dist/injectors/express.d.ts +22 -0
  36. package/dist/injectors/express.d.ts.map +1 -0
  37. package/dist/injectors/express.js +59 -0
  38. package/dist/injectors/express.js.map +1 -0
  39. package/dist/injectors/nextjs.d.ts +24 -0
  40. package/dist/injectors/nextjs.d.ts.map +1 -0
  41. package/dist/injectors/nextjs.js +116 -0
  42. package/dist/injectors/nextjs.js.map +1 -0
  43. package/dist/injectors/nginx.d.ts +23 -0
  44. package/dist/injectors/nginx.d.ts.map +1 -0
  45. package/dist/injectors/nginx.js +61 -0
  46. package/dist/injectors/nginx.js.map +1 -0
  47. package/dist/injectors/plain.d.ts +12 -0
  48. package/dist/injectors/plain.d.ts.map +1 -0
  49. package/dist/injectors/plain.js +36 -0
  50. package/dist/injectors/plain.js.map +1 -0
  51. package/dist/injectors/vite.d.ts +24 -0
  52. package/dist/injectors/vite.d.ts.map +1 -0
  53. package/dist/injectors/vite.js +125 -0
  54. package/dist/injectors/vite.js.map +1 -0
  55. package/dist/mkcert/check.d.ts +13 -0
  56. package/dist/mkcert/check.d.ts.map +1 -0
  57. package/dist/mkcert/check.js +38 -0
  58. package/dist/mkcert/check.js.map +1 -0
  59. package/dist/mkcert/generate.d.ts +26 -0
  60. package/dist/mkcert/generate.d.ts.map +1 -0
  61. package/dist/mkcert/generate.js +111 -0
  62. package/dist/mkcert/generate.js.map +1 -0
  63. package/dist/mkcert/install.d.ts +7 -0
  64. package/dist/mkcert/install.d.ts.map +1 -0
  65. package/dist/mkcert/install.js +75 -0
  66. package/dist/mkcert/install.js.map +1 -0
  67. package/dist/utils/backup.d.ts +7 -0
  68. package/dist/utils/backup.d.ts.map +1 -0
  69. package/dist/utils/backup.js +16 -0
  70. package/dist/utils/backup.js.map +1 -0
  71. package/dist/utils/logger.d.ts +17 -0
  72. package/dist/utils/logger.d.ts.map +1 -0
  73. package/dist/utils/logger.js +38 -0
  74. package/dist/utils/logger.js.map +1 -0
  75. package/dist/utils/os.d.ts +4 -0
  76. package/dist/utils/os.d.ts.map +1 -0
  77. package/dist/utils/os.js +24 -0
  78. package/dist/utils/os.js.map +1 -0
  79. package/package.json +55 -0
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * Vite injector
4
+ *
5
+ * Adds `server.https` to vite.config.js / vite.config.ts using AST-based
6
+ * insertion. Uses fs.readFileSync in the injected code since Vite's
7
+ * server.https accepts https.ServerOptions (requires Buffer/string content,
8
+ * not file paths).
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.INJECTION_MARKER = void 0;
12
+ exports.injectVite = injectVite;
13
+ exports.injectIntoSource = injectIntoSource;
14
+ const promises_1 = require("fs/promises");
15
+ const backup_1 = require("../utils/backup");
16
+ const astHelper_1 = require("./astHelper");
17
+ exports.INJECTION_MARKER = '// trustlocal:https';
18
+ const CERT_DIR = '.trustlocal';
19
+ function buildHttpsBlock(indent) {
20
+ return `
21
+ ${indent}${exports.INJECTION_MARKER}
22
+ ${indent}server: {
23
+ ${indent} https: {
24
+ ${indent} key: fs.readFileSync('${CERT_DIR}/localhost-key.pem'),
25
+ ${indent} cert: fs.readFileSync('${CERT_DIR}/localhost.pem'),
26
+ ${indent} },
27
+ ${indent}},`;
28
+ }
29
+ function buildFsImport(source) {
30
+ // Return the import/require to prepend if fs is not already imported
31
+ if (/import\s+.*\bfs\b.*from\s+['"](?:node:)?fs['"]/.test(source))
32
+ return '';
33
+ if (/(?:const|var|let)\s+fs\s*=\s*require\(/.test(source))
34
+ return '';
35
+ // Detect module style
36
+ if (/^import\s/m.test(source)) {
37
+ return "import fs from 'node:fs';\n";
38
+ }
39
+ return "const fs = require('fs');\n";
40
+ }
41
+ function buildNewConfigFile() {
42
+ return `${exports.INJECTION_MARKER}
43
+ import { defineConfig } from 'vite';
44
+ import fs from 'node:fs';
45
+
46
+ export default defineConfig({
47
+ server: {
48
+ https: {
49
+ key: fs.readFileSync('${CERT_DIR}/localhost-key.pem'),
50
+ cert: fs.readFileSync('${CERT_DIR}/localhost.pem'),
51
+ },
52
+ },
53
+ });
54
+ `;
55
+ }
56
+ /**
57
+ * Inject HTTPS config into a Vite config file.
58
+ * Creates the file if it doesn't exist.
59
+ * Idempotent — safe to call multiple times.
60
+ */
61
+ async function injectVite(configPath) {
62
+ let content;
63
+ try {
64
+ content = await (0, promises_1.readFile)(configPath, 'utf-8');
65
+ }
66
+ catch {
67
+ await (0, promises_1.writeFile)(configPath, buildNewConfigFile(), 'utf-8');
68
+ return { alreadyConfigured: false, created: true };
69
+ }
70
+ // Idempotency check
71
+ if (content.includes(exports.INJECTION_MARKER)) {
72
+ return { alreadyConfigured: true, created: false };
73
+ }
74
+ try {
75
+ const ast = (0, astHelper_1.parseSource)(content);
76
+ const configObj = (0, astHelper_1.findTopLevelConfigObject)(ast);
77
+ if (configObj && (0, astHelper_1.hasNestedProperty)(configObj, ['server', 'https'])) {
78
+ return { alreadyConfigured: true, created: false };
79
+ }
80
+ }
81
+ catch {
82
+ // Parse error — proceed
83
+ }
84
+ await (0, backup_1.backupFile)(configPath);
85
+ const injected = injectIntoSource(content);
86
+ if (!injected) {
87
+ throw new Error(`trustlocal could not locate the config object in ${configPath}.\n` +
88
+ 'Please add the server.https block manually.');
89
+ }
90
+ await (0, promises_1.writeFile)(configPath, injected, 'utf-8');
91
+ return { alreadyConfigured: false, created: false };
92
+ }
93
+ /**
94
+ * Pure function: insert the HTTPS block into Vite config source.
95
+ */
96
+ function injectIntoSource(source) {
97
+ let ast;
98
+ try {
99
+ ast = (0, astHelper_1.parseSource)(source);
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ const configObj = (0, astHelper_1.findTopLevelConfigObject)(ast);
105
+ if (!configObj)
106
+ return null;
107
+ const insertPos = (0, astHelper_1.getObjectOpenBraceEnd)(configObj, source);
108
+ if (insertPos < 0)
109
+ return null;
110
+ const indent = detectIndent(source, configObj);
111
+ const block = buildHttpsBlock(indent);
112
+ // Prepend fs import if needed
113
+ const fsImport = buildFsImport(source);
114
+ const modified = source.slice(0, insertPos) + block + source.slice(insertPos);
115
+ return fsImport ? fsImport + modified : modified;
116
+ }
117
+ function detectIndent(source, configObj) {
118
+ if (configObj.start === null || configObj.start === undefined)
119
+ return ' ';
120
+ const bracePos = source.indexOf('{', configObj.start);
121
+ const afterBrace = source.slice(bracePos + 1);
122
+ const nextLineMatch = /\n(\s+)/.exec(afterBrace);
123
+ return nextLineMatch?.[1] ?? ' ';
124
+ }
125
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../../src/injectors/vite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface MkcertInfo {
2
+ installed: boolean;
3
+ version?: string;
4
+ caRoot?: string;
5
+ }
6
+ /** Check whether mkcert is installed and return version + CA root path. */
7
+ export declare function checkMkcert(): MkcertInfo;
8
+ /**
9
+ * Returns the local CA root directory from mkcert.
10
+ * Throws if mkcert is not installed.
11
+ */
12
+ export declare function getMkcertCARoot(): string;
13
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/mkcert/check.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,IAAI,UAAU,CAcxC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CASxC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkMkcert = checkMkcert;
4
+ exports.getMkcertCARoot = getMkcertCARoot;
5
+ const child_process_1 = require("child_process");
6
+ /** Check whether mkcert is installed and return version + CA root path. */
7
+ function checkMkcert() {
8
+ try {
9
+ const version = (0, child_process_1.execSync)('mkcert --version', {
10
+ encoding: 'utf-8',
11
+ stdio: 'pipe',
12
+ }).trim();
13
+ const caRoot = (0, child_process_1.execSync)('mkcert -CAROOT', {
14
+ encoding: 'utf-8',
15
+ stdio: 'pipe',
16
+ }).trim();
17
+ return { installed: true, version, caRoot };
18
+ }
19
+ catch {
20
+ return { installed: false };
21
+ }
22
+ }
23
+ /**
24
+ * Returns the local CA root directory from mkcert.
25
+ * Throws if mkcert is not installed.
26
+ */
27
+ function getMkcertCARoot() {
28
+ try {
29
+ return (0, child_process_1.execSync)('mkcert -CAROOT', {
30
+ encoding: 'utf-8',
31
+ stdio: 'pipe',
32
+ }).trim();
33
+ }
34
+ catch {
35
+ throw new Error('mkcert is not installed or not in PATH. Run: npx trustlocal init');
36
+ }
37
+ }
38
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/mkcert/check.ts"],"names":[],"mappings":";;AASA,kCAcC;AAMD,0CASC;AAtCD,iDAAyC;AAQzC,2EAA2E;AAC3E,SAAgB,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,wBAAQ,EAAC,kBAAkB,EAAE;YAC3C,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,gBAAgB,EAAE;YACxC,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe;IAC7B,IAAI,CAAC;QACH,OAAO,IAAA,wBAAQ,EAAC,gBAAgB,EAAE;YAChC,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface GenerateResult {
2
+ certFile: string;
3
+ keyFile: string;
4
+ domains: string[];
5
+ }
6
+ export declare const CERT_FILENAME = "localhost.pem";
7
+ export declare const KEY_FILENAME = "localhost-key.pem";
8
+ /**
9
+ * Generate trusted certificates for the given domains using mkcert.
10
+ * Cert files are written into certDir (relative to cwd).
11
+ * Returns paths relative to cwd.
12
+ */
13
+ export declare function generateCerts(certDir: string, domains: string[], cwd: string): Promise<GenerateResult>;
14
+ /**
15
+ * Install the local CA into the system/browser trust stores.
16
+ * May prompt for sudo on macOS/Linux.
17
+ */
18
+ export declare function installCA(): void;
19
+ /**
20
+ * Get the cert expiry date by shelling out to openssl.
21
+ * Falls back to "now + 2 years" if openssl is unavailable.
22
+ */
23
+ export declare function getCertExpiry(certPath: string): Date;
24
+ /** Delete old cert files so they can be regenerated. */
25
+ export declare function deleteCerts(certDir: string, cwd: string): Promise<void>;
26
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/mkcert/generate.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAEhD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,CAuBzB;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAepD;AAED,wDAAwD;AACxD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7E"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.KEY_FILENAME = exports.CERT_FILENAME = void 0;
37
+ exports.generateCerts = generateCerts;
38
+ exports.installCA = installCA;
39
+ exports.getCertExpiry = getCertExpiry;
40
+ exports.deleteCerts = deleteCerts;
41
+ const child_process_1 = require("child_process");
42
+ const promises_1 = require("fs/promises");
43
+ const path_1 = require("path");
44
+ exports.CERT_FILENAME = 'localhost.pem';
45
+ exports.KEY_FILENAME = 'localhost-key.pem';
46
+ /**
47
+ * Generate trusted certificates for the given domains using mkcert.
48
+ * Cert files are written into certDir (relative to cwd).
49
+ * Returns paths relative to cwd.
50
+ */
51
+ async function generateCerts(certDir, domains, cwd) {
52
+ const absoluteCertDir = (0, path_1.join)(cwd, certDir);
53
+ await (0, promises_1.mkdir)(absoluteCertDir, { recursive: true });
54
+ const certFile = (0, path_1.join)(certDir, exports.CERT_FILENAME);
55
+ const keyFile = (0, path_1.join)(certDir, exports.KEY_FILENAME);
56
+ const absoluteCertFile = (0, path_1.join)(cwd, certFile);
57
+ const absoluteKeyFile = (0, path_1.join)(cwd, keyFile);
58
+ // Shell out — never reimplement cert generation in JS
59
+ const domainArgs = domains.map((d) => `"${d}"`).join(' ');
60
+ const command = `mkcert -cert-file "${absoluteCertFile}" -key-file "${absoluteKeyFile}" ${domainArgs}`;
61
+ try {
62
+ (0, child_process_1.execSync)(command, { stdio: 'inherit', cwd });
63
+ }
64
+ catch (err) {
65
+ const output = err instanceof Error ? err.message : String(err);
66
+ throw new Error(`Certificate generation failed:\n${output}`);
67
+ }
68
+ return { certFile, keyFile, domains };
69
+ }
70
+ /**
71
+ * Install the local CA into the system/browser trust stores.
72
+ * May prompt for sudo on macOS/Linux.
73
+ */
74
+ function installCA() {
75
+ (0, child_process_1.execSync)('mkcert -install', { stdio: 'inherit' });
76
+ }
77
+ /**
78
+ * Get the cert expiry date by shelling out to openssl.
79
+ * Falls back to "now + 2 years" if openssl is unavailable.
80
+ */
81
+ function getCertExpiry(certPath) {
82
+ try {
83
+ const output = (0, child_process_1.execSync)(`openssl x509 -enddate -noout -in "${certPath}"`, {
84
+ encoding: 'utf-8',
85
+ stdio: 'pipe',
86
+ }).trim();
87
+ // e.g. "notAfter=Jan 10 00:00:00 2028 GMT"
88
+ const match = /notAfter=(.+)/.exec(output);
89
+ if (!match?.[1])
90
+ throw new Error('Unexpected openssl output');
91
+ return new Date(match[1]);
92
+ }
93
+ catch {
94
+ const date = new Date();
95
+ date.setFullYear(date.getFullYear() + 2);
96
+ return date;
97
+ }
98
+ }
99
+ /** Delete old cert files so they can be regenerated. */
100
+ async function deleteCerts(certDir, cwd) {
101
+ const { unlink } = await Promise.resolve().then(() => __importStar(require('fs/promises')));
102
+ for (const filename of [exports.CERT_FILENAME, exports.KEY_FILENAME]) {
103
+ try {
104
+ await unlink((0, path_1.join)(cwd, certDir, filename));
105
+ }
106
+ catch {
107
+ // File may not exist — that's fine
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/mkcert/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Auto-install mkcert for the detected OS.
3
+ * In CI environments, prints instructions and returns without throwing.
4
+ * Throws if installation fails on interactive terminals.
5
+ */
6
+ export declare function installMkcert(): void;
7
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/mkcert/install.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAiCpC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installMkcert = installMkcert;
4
+ const child_process_1 = require("child_process");
5
+ const os_1 = require("../utils/os");
6
+ const logger_1 = require("../utils/logger");
7
+ /**
8
+ * Auto-install mkcert for the detected OS.
9
+ * In CI environments, prints instructions and returns without throwing.
10
+ * Throws if installation fails on interactive terminals.
11
+ */
12
+ function installMkcert() {
13
+ const os = (0, os_1.detectOS)();
14
+ if ((0, os_1.isCI)()) {
15
+ logger_1.logger.warn('CI environment detected — skipping mkcert auto-install.');
16
+ logger_1.logger.info('Run `mkcert -install` manually before using trustlocal.');
17
+ printManualInstructions(os);
18
+ return;
19
+ }
20
+ logger_1.logger.step('Installing mkcert...');
21
+ try {
22
+ if (os === 'macos') {
23
+ (0, child_process_1.execSync)('brew install mkcert', { stdio: 'inherit' });
24
+ // nss is required for Firefox support on macOS
25
+ (0, child_process_1.execSync)('brew install nss', { stdio: 'inherit' });
26
+ }
27
+ else if (os === 'linux') {
28
+ installLinux();
29
+ }
30
+ else {
31
+ throw new Error(`Auto-install is not supported on ${os} in MVP. Please install mkcert manually.`);
32
+ }
33
+ logger_1.logger.success('mkcert installed successfully');
34
+ }
35
+ catch (err) {
36
+ const message = err instanceof Error ? err.message : String(err);
37
+ logger_1.logger.error(`Failed to auto-install mkcert: ${message}`);
38
+ logger_1.logger.info('');
39
+ logger_1.logger.info('Install manually:');
40
+ printManualInstructions(os);
41
+ throw new Error('mkcert installation failed');
42
+ }
43
+ }
44
+ function installLinux() {
45
+ // Install libnss3-tools (required for Chrome/Firefox support)
46
+ try {
47
+ (0, child_process_1.execSync)('sudo apt-get install -y libnss3-tools', { stdio: 'inherit' });
48
+ }
49
+ catch {
50
+ // Non-apt systems — continue anyway
51
+ }
52
+ // Download the latest mkcert binary directly
53
+ (0, child_process_1.execSync)('curl -fsSL "https://dl.filippo.io/mkcert/latest?for=linux/amd64" -o /tmp/mkcert && ' +
54
+ 'chmod +x /tmp/mkcert && ' +
55
+ 'sudo mv /tmp/mkcert /usr/local/bin/mkcert', { stdio: 'inherit', shell: '/bin/bash' });
56
+ }
57
+ function printManualInstructions(os) {
58
+ if (os === 'macos') {
59
+ logger_1.logger.info(' brew install mkcert');
60
+ logger_1.logger.info(' brew install nss # required for Firefox');
61
+ }
62
+ else if (os === 'linux') {
63
+ logger_1.logger.info(' sudo apt install libnss3-tools');
64
+ logger_1.logger.info(' # Then download mkcert from:');
65
+ logger_1.logger.info(' # https://github.com/FiloSottile/mkcert/releases');
66
+ }
67
+ else if (os === 'windows') {
68
+ logger_1.logger.info(' choco install mkcert');
69
+ logger_1.logger.info(' # or: https://github.com/FiloSottile/mkcert/releases');
70
+ }
71
+ else {
72
+ logger_1.logger.info(' Visit: https://github.com/FiloSottile/mkcert#installation');
73
+ }
74
+ }
75
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/mkcert/install.ts"],"names":[],"mappings":";;AASA,sCAiCC;AA1CD,iDAAyC;AACzC,oCAAsD;AACtD,4CAAyC;AAEzC;;;;GAIG;AACH,SAAgB,aAAa;IAC3B,MAAM,EAAE,GAAG,IAAA,aAAQ,GAAE,CAAC;IAEtB,IAAI,IAAA,SAAI,GAAE,EAAE,CAAC;QACX,eAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACvE,eAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACvE,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YACnB,IAAA,wBAAQ,EAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACtD,+CAA+C;YAC/C,IAAA,wBAAQ,EAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YAC1B,YAAY,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,oCAAoC,EAAE,0CAA0C,CACjF,CAAC;QACJ,CAAC;QACD,eAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,eAAM,CAAC,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;QAC1D,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,8DAA8D;IAC9D,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IAED,6CAA6C;IAC7C,IAAA,wBAAQ,EACN,qFAAqF;QACnF,0BAA0B;QAC1B,2CAA2C,EAC7C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CACzC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,EAAM;IACrC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,eAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1B,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,eAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;SAAM,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5B,eAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,eAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Creates a .trustlocal-backup copy of filePath before any mutation.
3
+ * Returns the backup path.
4
+ * Throws if the source file does not exist.
5
+ */
6
+ export declare function backupFile(filePath: string): Promise<string>;
7
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlE"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.backupFile = backupFile;
4
+ const promises_1 = require("fs/promises");
5
+ /**
6
+ * Creates a .trustlocal-backup copy of filePath before any mutation.
7
+ * Returns the backup path.
8
+ * Throws if the source file does not exist.
9
+ */
10
+ async function backupFile(filePath) {
11
+ await (0, promises_1.access)(filePath); // throws if missing — callers must check first
12
+ const backupPath = `${filePath}.trustlocal-backup`;
13
+ await (0, promises_1.copyFile)(filePath, backupPath);
14
+ return backupPath;
15
+ }
16
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":";;AAOA,gCAKC;AAZD,0CAA+C;AAE/C;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,IAAA,iBAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,+CAA+C;IACvE,MAAM,UAAU,GAAG,GAAG,QAAQ,oBAAoB,CAAC;IACnD,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const logger: {
2
+ /** Blue arrow — step in progress */
3
+ step: (msg: string) => void;
4
+ /** Green check — step completed successfully */
5
+ success: (msg: string) => void;
6
+ /** Yellow warning — non-fatal */
7
+ warn: (msg: string) => void;
8
+ /** Red cross — fatal error */
9
+ error: (msg: string) => void;
10
+ /** Plain info line (indented) */
11
+ info: (msg: string) => void;
12
+ /** Blank line */
13
+ blank: () => void;
14
+ /** Bold section title with surrounding blank lines */
15
+ title: (msg: string) => void;
16
+ };
17
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;IACjB,oCAAoC;gBACxB,MAAM,KAAG,IAAI;IAIzB,gDAAgD;mBACjC,MAAM,KAAG,IAAI;IAI5B,iCAAiC;gBACrB,MAAM,KAAG,IAAI;IAIzB,8BAA8B;iBACjB,MAAM,KAAG,IAAI;IAI1B,iCAAiC;gBACrB,MAAM,KAAG,IAAI;IAIzB,iBAAiB;iBACN,IAAI;IAIf,sDAAsD;iBACzC,MAAM,KAAG,IAAI;CAG3B,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ exports.logger = {
9
+ /** Blue arrow — step in progress */
10
+ step: (msg) => {
11
+ console.log(` ${chalk_1.default.blue('→')} ${msg}`);
12
+ },
13
+ /** Green check — step completed successfully */
14
+ success: (msg) => {
15
+ console.log(` ${chalk_1.default.green('✓')} ${chalk_1.default.green(msg)}`);
16
+ },
17
+ /** Yellow warning — non-fatal */
18
+ warn: (msg) => {
19
+ console.log(` ${chalk_1.default.yellow('⚠')} ${chalk_1.default.yellow(msg)}`);
20
+ },
21
+ /** Red cross — fatal error */
22
+ error: (msg) => {
23
+ console.log(` ${chalk_1.default.red('✗')} ${chalk_1.default.red(msg)}`);
24
+ },
25
+ /** Plain info line (indented) */
26
+ info: (msg) => {
27
+ console.log(` ${msg}`);
28
+ },
29
+ /** Blank line */
30
+ blank: () => {
31
+ console.log('');
32
+ },
33
+ /** Bold section title with surrounding blank lines */
34
+ title: (msg) => {
35
+ console.log(`\n ${chalk_1.default.bold(msg)}\n`);
36
+ },
37
+ };
38
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAEb,QAAA,MAAM,GAAG;IACpB,oCAAoC;IACpC,IAAI,EAAE,CAAC,GAAW,EAAQ,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,gDAAgD;IAChD,OAAO,EAAE,CAAC,GAAW,EAAQ,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,iCAAiC;IACjC,IAAI,EAAE,CAAC,GAAW,EAAQ,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,8BAA8B;IAC9B,KAAK,EAAE,CAAC,GAAW,EAAQ,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,iCAAiC;IACjC,IAAI,EAAE,CAAC,GAAW,EAAQ,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,KAAK,EAAE,GAAS,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,sDAAsD;IACtD,KAAK,EAAE,CAAC,GAAW,EAAQ,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type OS = 'macos' | 'linux' | 'windows' | 'unknown';
2
+ export declare function detectOS(): OS;
3
+ export declare function isCI(): boolean;
4
+ //# sourceMappingURL=os.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os.d.ts","sourceRoot":"","sources":["../../src/utils/os.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3D,wBAAgB,QAAQ,IAAI,EAAE,CAM7B;AAED,wBAAgB,IAAI,IAAI,OAAO,CAS9B"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectOS = detectOS;
4
+ exports.isCI = isCI;
5
+ const os_1 = require("os");
6
+ function detectOS() {
7
+ const p = (0, os_1.platform)();
8
+ if (p === 'darwin')
9
+ return 'macos';
10
+ if (p === 'linux')
11
+ return 'linux';
12
+ if (p === 'win32')
13
+ return 'windows';
14
+ return 'unknown';
15
+ }
16
+ function isCI() {
17
+ return (process.env['CI'] === 'true' ||
18
+ process.env['CONTINUOUS_INTEGRATION'] === 'true' ||
19
+ process.env['GITHUB_ACTIONS'] === 'true' ||
20
+ process.env['TRAVIS'] === 'true' ||
21
+ process.env['CIRCLECI'] === 'true' ||
22
+ process.env['JENKINS_URL'] !== undefined);
23
+ }
24
+ //# sourceMappingURL=os.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os.js","sourceRoot":"","sources":["../../src/utils/os.ts"],"names":[],"mappings":";;AAIA,4BAMC;AAED,oBASC;AArBD,2BAA8B;AAI9B,SAAgB,QAAQ;IACtB,MAAM,CAAC,GAAG,IAAA,aAAQ,GAAE,CAAC;IACrB,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAClC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,IAAI;IAClB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM;QAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,MAAM;QAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM;QACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,MAAM;QAChC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM;QAClC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,SAAS,CACzC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "trustlocal",
3
+ "version": "0.1.0",
4
+ "description": "One command. HTTPS everywhere. Zero config.",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "trustlocal": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist/"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsx src/index.ts",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest",
17
+ "lint": "eslint src --ext .ts",
18
+ "format": "prettier --write \"src/**/*.ts\"",
19
+ "prepublishOnly": "npm run build && npm test"
20
+ },
21
+ "dependencies": {
22
+ "@babel/parser": "^7.24.0",
23
+ "@babel/types": "^7.24.0",
24
+ "chalk": "^4.1.2",
25
+ "commander": "^12.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^20.0.0",
29
+ "@typescript-eslint/eslint-plugin": "^7.0.0",
30
+ "@typescript-eslint/parser": "^7.0.0",
31
+ "eslint": "^8.57.0",
32
+ "prettier": "^3.2.0",
33
+ "tsx": "^4.7.0",
34
+ "typescript": "^5.4.0",
35
+ "vitest": "^1.4.0"
36
+ },
37
+ "keywords": [
38
+ "https",
39
+ "ssl",
40
+ "localhost",
41
+ "mkcert",
42
+ "developer-tools",
43
+ "certificates"
44
+ ],
45
+ "license": "MIT",
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "author": "Sahil Kashyap",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/sahil26k/trustlocal.git"
53
+ },
54
+ "homepage": "https://github.com/sahil26k/trustlocal#readme"
55
+ }