envmatic 1.0.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/README.md +567 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +203 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +11 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +77 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +78 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/edit.d.ts +13 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +364 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/import.d.ts +11 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +103 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +237 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +16 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +157 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +73 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/lock.d.ts +16 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +245 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/rotate.d.ts +15 -0
- package/dist/commands/rotate.d.ts.map +1 -0
- package/dist/commands/rotate.js +406 -0
- package/dist/commands/rotate.js.map +1 -0
- package/dist/commands/show.d.ts +9 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +72 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +174 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/use.d.ts +19 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +238 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +47 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/services/config.d.ts +64 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +133 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/encryption.d.ts +30 -0
- package/dist/services/encryption.d.ts.map +1 -0
- package/dist/services/encryption.js +146 -0
- package/dist/services/encryption.js.map +1 -0
- package/dist/services/envfile.d.ts +76 -0
- package/dist/services/envfile.d.ts.map +1 -0
- package/dist/services/envfile.js +247 -0
- package/dist/services/envfile.js.map +1 -0
- package/dist/services/git.d.ts +60 -0
- package/dist/services/git.d.ts.map +1 -0
- package/dist/services/git.js +239 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/linker.d.ts +46 -0
- package/dist/services/linker.d.ts.map +1 -0
- package/dist/services/linker.js +222 -0
- package/dist/services/linker.js.map +1 -0
- package/dist/services/protection.d.ts +32 -0
- package/dist/services/protection.d.ts.map +1 -0
- package/dist/services/protection.js +190 -0
- package/dist/services/protection.js.map +1 -0
- package/dist/types/index.d.ts +73 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/display.d.ts +74 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +138 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/editor.d.ts +22 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +159 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/prompts.d.ts +41 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +222 -0
- package/dist/utils/prompts.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Envmatic Constants
|
|
5
|
+
*/
|
|
6
|
+
// Base directory for envmatic data
|
|
7
|
+
export const ENVMATIC_HOME = path.join(os.homedir(), '.envmatic');
|
|
8
|
+
// Config file path
|
|
9
|
+
export const CONFIG_PATH = path.join(ENVMATIC_HOME, 'config.json');
|
|
10
|
+
// Directory where git repo is cloned
|
|
11
|
+
export const VAULT_PATH = path.join(ENVMATIC_HOME, 'vault');
|
|
12
|
+
// Links registry (tracks symlinks and copies)
|
|
13
|
+
export const LINKS_PATH = path.join(ENVMATIC_HOME, 'links.json');
|
|
14
|
+
// Manifest file name (stored in repo)
|
|
15
|
+
export const MANIFEST_FILE = '.envmatic-manifest.json';
|
|
16
|
+
// Encryption salt file
|
|
17
|
+
export const SALT_FILE = '.envmatic-salt';
|
|
18
|
+
// File extension for encrypted files
|
|
19
|
+
export const ENCRYPTED_EXT = '.enc';
|
|
20
|
+
// Default branch name
|
|
21
|
+
export const DEFAULT_BRANCH = 'main';
|
|
22
|
+
// Version
|
|
23
|
+
export const VERSION = '1.0.0';
|
|
24
|
+
// Folder structure inside vault
|
|
25
|
+
export const VAULT_STRUCTURE = {
|
|
26
|
+
// Each project gets its own folder
|
|
27
|
+
// Inside each project folder, environments are organized
|
|
28
|
+
// Example: vault/myapp/development/.env
|
|
29
|
+
// vault/myapp/production/.env
|
|
30
|
+
// vault/shared/secrets/.env
|
|
31
|
+
};
|
|
32
|
+
// Environment presets
|
|
33
|
+
export const ENV_PRESETS = [
|
|
34
|
+
'development',
|
|
35
|
+
'staging',
|
|
36
|
+
'production',
|
|
37
|
+
'test',
|
|
38
|
+
'local',
|
|
39
|
+
'ci',
|
|
40
|
+
];
|
|
41
|
+
// CLI styling
|
|
42
|
+
export const BRAND = {
|
|
43
|
+
name: 'Envmatic',
|
|
44
|
+
tagline: 'Your secrets, your control.',
|
|
45
|
+
prefix: '◆',
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;GAEG;AAEH,mCAAmC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAElE,mBAAmB;AACnB,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAEnE,qCAAqC;AACrC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAE5D,8CAA8C;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AAEjE,sCAAsC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEvD,uBAAuB;AACvB,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAE1C,qCAAqC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AAEpC,sBAAsB;AACtB,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAErC,UAAU;AACV,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,gCAAgC;AAChC,MAAM,CAAC,MAAM,eAAe,GAAG;AAC7B,mCAAmC;AACnC,yDAAyD;AACzD,wCAAwC;AACxC,uCAAuC;AACvC,qCAAqC;CACtC,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa;IACb,SAAS;IACT,YAAY;IACZ,MAAM;IACN,OAAO;IACP,IAAI;CACI,CAAC;AAEX,cAAc;AACd,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,6BAA6B;IACtC,MAAM,EAAE,GAAG;CACZ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envmatic
|
|
3
|
+
* Cross-platform dotfile and secret manager
|
|
4
|
+
*
|
|
5
|
+
* This module exports the core functionality for programmatic usage.
|
|
6
|
+
*/
|
|
7
|
+
export type { EnvmaticConfig, EnvFile, EnvFileContent, EnvmaticManifest, LinkInfo, EncryptionOptions, } from './types/index.js';
|
|
8
|
+
export { ENVMATIC_HOME, VAULT_PATH, VERSION, } from './constants.js';
|
|
9
|
+
export { isConfigured, getConfig, saveConfig, updateConfig, getEnvmaticHome, } from './services/config.js';
|
|
10
|
+
export { encrypt, decrypt, verifyEncryption, } from './services/encryption.js';
|
|
11
|
+
export { isVaultInitialized, sync, pull, push, getStatus, } from './services/git.js';
|
|
12
|
+
export { createEnvFile, readEnvFile, updateEnvFile, deleteEnvFile, listEnvFiles, listProjects, importEnvFile, exportEnvFile, setVariable, removeVariable, getVariable, parseEnvContent, serializeEnvContent, } from './services/envfile.js';
|
|
13
|
+
export { createSymlink, createCopy, unlink, listLinks, syncCopies, } from './services/linker.js';
|
|
14
|
+
export { makeImmutable, makeMutable, isImmutable, } from './services/protection.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,cAAc,EACd,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,UAAU,EACV,OAAO,GACR,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,OAAO,EACP,OAAO,EACP,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,kBAAkB,EAClB,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,SAAS,GACV,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,cAAc,EACd,WAAW,EACX,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,UAAU,EACV,MAAM,EACN,SAAS,EACT,UAAU,GACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envmatic
|
|
3
|
+
* Cross-platform dotfile and secret manager
|
|
4
|
+
*
|
|
5
|
+
* This module exports the core functionality for programmatic usage.
|
|
6
|
+
*/
|
|
7
|
+
// Constants
|
|
8
|
+
export { ENVMATIC_HOME, VAULT_PATH, VERSION, } from './constants.js';
|
|
9
|
+
// Config management
|
|
10
|
+
export { isConfigured, getConfig, saveConfig, updateConfig, getEnvmaticHome, } from './services/config.js';
|
|
11
|
+
// Encryption
|
|
12
|
+
export { encrypt, decrypt, verifyEncryption, } from './services/encryption.js';
|
|
13
|
+
// Git operations
|
|
14
|
+
export { isVaultInitialized, sync, pull, push, getStatus, } from './services/git.js';
|
|
15
|
+
// Env file operations
|
|
16
|
+
export { createEnvFile, readEnvFile, updateEnvFile, deleteEnvFile, listEnvFiles, listProjects, importEnvFile, exportEnvFile, setVariable, removeVariable, getVariable, parseEnvContent, serializeEnvContent, } from './services/envfile.js';
|
|
17
|
+
// Linker operations
|
|
18
|
+
export { createSymlink, createCopy, unlink, listLinks, syncCopies, } from './services/linker.js';
|
|
19
|
+
// Protection
|
|
20
|
+
export { makeImmutable, makeMutable, isImmutable, } from './services/protection.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,YAAY;AACZ,OAAO,EACL,aAAa,EACb,UAAU,EACV,OAAO,GACR,MAAM,gBAAgB,CAAC;AAExB,oBAAoB;AACpB,OAAO,EACL,YAAY,EACZ,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EACL,OAAO,EACP,OAAO,EACP,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAClB,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,SAAS,GACV,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,cAAc,EACd,WAAW,EACX,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,oBAAoB;AACpB,OAAO,EACL,aAAa,EACb,UAAU,EACV,MAAM,EACN,SAAS,EACT,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Service
|
|
3
|
+
* Manages local Envmatic configuration
|
|
4
|
+
*/
|
|
5
|
+
import type { EnvmaticConfig, LinkInfo } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Ensure envmatic home directory exists
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureEnvmaticHome(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Check if envmatic is configured
|
|
12
|
+
*/
|
|
13
|
+
export declare function isConfigured(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Get current configuration
|
|
16
|
+
*/
|
|
17
|
+
export declare function getConfig(): Promise<EnvmaticConfig | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Save configuration
|
|
20
|
+
*/
|
|
21
|
+
export declare function saveConfig(config: EnvmaticConfig): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Update configuration partially
|
|
24
|
+
*/
|
|
25
|
+
export declare function updateConfig(updates: Partial<EnvmaticConfig>): Promise<EnvmaticConfig>;
|
|
26
|
+
/**
|
|
27
|
+
* Create initial configuration
|
|
28
|
+
*/
|
|
29
|
+
export declare function createInitialConfig(repoUrl: string, options?: {
|
|
30
|
+
encryptionEnabled?: boolean;
|
|
31
|
+
encryptionMethod?: 'password' | 'ssh';
|
|
32
|
+
sshKeyPath?: string;
|
|
33
|
+
immutableByDefault?: boolean;
|
|
34
|
+
branch?: string;
|
|
35
|
+
}): EnvmaticConfig;
|
|
36
|
+
/**
|
|
37
|
+
* Get all tracked links
|
|
38
|
+
*/
|
|
39
|
+
export declare function getLinks(): Promise<LinkInfo[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Save links registry
|
|
42
|
+
*/
|
|
43
|
+
export declare function saveLinks(links: LinkInfo[]): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Add a new link
|
|
46
|
+
*/
|
|
47
|
+
export declare function addLink(link: LinkInfo): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Remove a link by target path
|
|
50
|
+
*/
|
|
51
|
+
export declare function removeLink(targetPath: string): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Get links for a specific env file
|
|
54
|
+
*/
|
|
55
|
+
export declare function getLinksForEnvFile(sourceId: string): Promise<LinkInfo[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Clear all configuration (for reset)
|
|
58
|
+
*/
|
|
59
|
+
export declare function clearConfig(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Get envmatic home path
|
|
62
|
+
*/
|
|
63
|
+
export declare function getEnvmaticHome(): string;
|
|
64
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElE;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAExD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAErD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAUhE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAU5F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,cAAc,CAUtB;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAUpD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ3D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG9E;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAOjD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Service
|
|
3
|
+
* Manages local Envmatic configuration
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs-extra';
|
|
6
|
+
import { ENVMATIC_HOME, CONFIG_PATH, LINKS_PATH, DEFAULT_BRANCH } from '../constants.js';
|
|
7
|
+
/**
|
|
8
|
+
* Ensure envmatic home directory exists
|
|
9
|
+
*/
|
|
10
|
+
export async function ensureEnvmaticHome() {
|
|
11
|
+
await fs.ensureDir(ENVMATIC_HOME);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if envmatic is configured
|
|
15
|
+
*/
|
|
16
|
+
export async function isConfigured() {
|
|
17
|
+
return fs.pathExists(CONFIG_PATH);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get current configuration
|
|
21
|
+
*/
|
|
22
|
+
export async function getConfig() {
|
|
23
|
+
if (!(await isConfigured())) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return await fs.readJson(CONFIG_PATH);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Save configuration
|
|
35
|
+
*/
|
|
36
|
+
export async function saveConfig(config) {
|
|
37
|
+
await ensureEnvmaticHome();
|
|
38
|
+
await fs.writeJson(CONFIG_PATH, config, { spaces: 2 });
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Update configuration partially
|
|
42
|
+
*/
|
|
43
|
+
export async function updateConfig(updates) {
|
|
44
|
+
const current = await getConfig();
|
|
45
|
+
if (!current) {
|
|
46
|
+
throw new Error('Envmatic is not configured. Run `envmatic init` first.');
|
|
47
|
+
}
|
|
48
|
+
const updated = { ...current, ...updates };
|
|
49
|
+
await saveConfig(updated);
|
|
50
|
+
return updated;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create initial configuration
|
|
54
|
+
*/
|
|
55
|
+
export function createInitialConfig(repoUrl, options = {}) {
|
|
56
|
+
return {
|
|
57
|
+
repoUrl,
|
|
58
|
+
localPath: ENVMATIC_HOME,
|
|
59
|
+
encryptionEnabled: options.encryptionEnabled ?? true,
|
|
60
|
+
encryptionMethod: options.encryptionMethod,
|
|
61
|
+
sshKeyPath: options.sshKeyPath,
|
|
62
|
+
immutableByDefault: options.immutableByDefault ?? true,
|
|
63
|
+
branch: options.branch ?? DEFAULT_BRANCH,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get all tracked links
|
|
68
|
+
*/
|
|
69
|
+
export async function getLinks() {
|
|
70
|
+
if (!(await fs.pathExists(LINKS_PATH))) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
return await fs.readJson(LINKS_PATH);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Save links registry
|
|
82
|
+
*/
|
|
83
|
+
export async function saveLinks(links) {
|
|
84
|
+
await ensureEnvmaticHome();
|
|
85
|
+
await fs.writeJson(LINKS_PATH, links, { spaces: 2 });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Add a new link
|
|
89
|
+
*/
|
|
90
|
+
export async function addLink(link) {
|
|
91
|
+
const links = await getLinks();
|
|
92
|
+
// Remove existing link for same target
|
|
93
|
+
const filtered = links.filter(l => l.targetPath !== link.targetPath);
|
|
94
|
+
filtered.push(link);
|
|
95
|
+
await saveLinks(filtered);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Remove a link by target path
|
|
99
|
+
*/
|
|
100
|
+
export async function removeLink(targetPath) {
|
|
101
|
+
const links = await getLinks();
|
|
102
|
+
const filtered = links.filter(l => l.targetPath !== targetPath);
|
|
103
|
+
if (filtered.length === links.length) {
|
|
104
|
+
return false; // Link not found
|
|
105
|
+
}
|
|
106
|
+
await saveLinks(filtered);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get links for a specific env file
|
|
111
|
+
*/
|
|
112
|
+
export async function getLinksForEnvFile(sourceId) {
|
|
113
|
+
const links = await getLinks();
|
|
114
|
+
return links.filter(l => l.sourceId === sourceId);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Clear all configuration (for reset)
|
|
118
|
+
*/
|
|
119
|
+
export async function clearConfig() {
|
|
120
|
+
if (await fs.pathExists(CONFIG_PATH)) {
|
|
121
|
+
await fs.remove(CONFIG_PATH);
|
|
122
|
+
}
|
|
123
|
+
if (await fs.pathExists(LINKS_PATH)) {
|
|
124
|
+
await fs.remove(LINKS_PATH);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get envmatic home path
|
|
129
|
+
*/
|
|
130
|
+
export function getEnvmaticHome() {
|
|
131
|
+
return ENVMATIC_HOME;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encryption Service
|
|
3
|
+
* Handles AES-256-GCM encryption with password or SSH key derivation
|
|
4
|
+
*/
|
|
5
|
+
import type { EncryptionOptions } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Encrypt data using AES-256-GCM
|
|
8
|
+
*/
|
|
9
|
+
export declare function encrypt(data: string, options: EncryptionOptions): Promise<string>;
|
|
10
|
+
/**
|
|
11
|
+
* Decrypt data using AES-256-GCM
|
|
12
|
+
*/
|
|
13
|
+
export declare function decrypt(encryptedData: string, options: EncryptionOptions): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Encrypt a file in place
|
|
16
|
+
*/
|
|
17
|
+
export declare function encryptFile(filePath: string, options: EncryptionOptions): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Decrypt a file and return content (does not modify file)
|
|
20
|
+
*/
|
|
21
|
+
export declare function decryptFile(filePath: string, options: EncryptionOptions): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Verify that encryption options are valid (test encrypt/decrypt cycle)
|
|
24
|
+
*/
|
|
25
|
+
export declare function verifyEncryption(options: EncryptionOptions): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if SSH key file exists and is readable
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateSSHKey(sshKeyPath: string): Promise<boolean>;
|
|
30
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/services/encryption.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAsE3D;;GAEG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBvF;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBhG;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CASnF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQzE"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encryption Service
|
|
3
|
+
* Handles AES-256-GCM encryption with password or SSH key derivation
|
|
4
|
+
*/
|
|
5
|
+
import crypto from 'crypto';
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { VAULT_PATH, SALT_FILE } from '../constants.js';
|
|
9
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
10
|
+
const KEY_LENGTH = 32; // 256 bits
|
|
11
|
+
const IV_LENGTH = 16; // 128 bits
|
|
12
|
+
const SALT_LENGTH = 32;
|
|
13
|
+
const TAG_LENGTH = 16;
|
|
14
|
+
const ITERATIONS = 100000;
|
|
15
|
+
/**
|
|
16
|
+
* Get or create a persistent salt for key derivation
|
|
17
|
+
*/
|
|
18
|
+
async function getSalt() {
|
|
19
|
+
const saltPath = path.join(VAULT_PATH, SALT_FILE);
|
|
20
|
+
if (await fs.pathExists(saltPath)) {
|
|
21
|
+
return fs.readFile(saltPath);
|
|
22
|
+
}
|
|
23
|
+
const salt = crypto.randomBytes(SALT_LENGTH);
|
|
24
|
+
await fs.ensureDir(VAULT_PATH);
|
|
25
|
+
await fs.writeFile(saltPath, salt);
|
|
26
|
+
return salt;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Derive encryption key from password
|
|
30
|
+
*/
|
|
31
|
+
async function deriveKeyFromPassword(password) {
|
|
32
|
+
const salt = await getSalt();
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
crypto.pbkdf2(password, salt, ITERATIONS, KEY_LENGTH, 'sha512', (err, key) => {
|
|
35
|
+
if (err)
|
|
36
|
+
reject(err);
|
|
37
|
+
else
|
|
38
|
+
resolve(key);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Derive encryption key from SSH private key
|
|
44
|
+
*/
|
|
45
|
+
async function deriveKeyFromSSH(sshKeyPath) {
|
|
46
|
+
const keyContent = await fs.readFile(sshKeyPath, 'utf-8');
|
|
47
|
+
const salt = await getSalt();
|
|
48
|
+
// Use the SSH key content as the password for PBKDF2
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
crypto.pbkdf2(keyContent, salt, ITERATIONS, KEY_LENGTH, 'sha512', (err, key) => {
|
|
51
|
+
if (err)
|
|
52
|
+
reject(err);
|
|
53
|
+
else
|
|
54
|
+
resolve(key);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get encryption key based on options
|
|
60
|
+
*/
|
|
61
|
+
async function getEncryptionKey(options) {
|
|
62
|
+
if (options.method === 'ssh' && options.sshKeyPath) {
|
|
63
|
+
return deriveKeyFromSSH(options.sshKeyPath);
|
|
64
|
+
}
|
|
65
|
+
if (options.method === 'password' && options.password) {
|
|
66
|
+
return deriveKeyFromPassword(options.password);
|
|
67
|
+
}
|
|
68
|
+
throw new Error('Invalid encryption options: password or SSH key path required');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Encrypt data using AES-256-GCM
|
|
72
|
+
*/
|
|
73
|
+
export async function encrypt(data, options) {
|
|
74
|
+
const key = await getEncryptionKey(options);
|
|
75
|
+
const iv = crypto.randomBytes(IV_LENGTH);
|
|
76
|
+
const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
|
|
77
|
+
let encrypted = cipher.update(data, 'utf8', 'base64');
|
|
78
|
+
encrypted += cipher.final('base64');
|
|
79
|
+
const authTag = cipher.getAuthTag();
|
|
80
|
+
// Combine IV + AuthTag + Encrypted data
|
|
81
|
+
const combined = Buffer.concat([
|
|
82
|
+
iv,
|
|
83
|
+
authTag,
|
|
84
|
+
Buffer.from(encrypted, 'base64')
|
|
85
|
+
]);
|
|
86
|
+
return combined.toString('base64');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Decrypt data using AES-256-GCM
|
|
90
|
+
*/
|
|
91
|
+
export async function decrypt(encryptedData, options) {
|
|
92
|
+
const key = await getEncryptionKey(options);
|
|
93
|
+
const combined = Buffer.from(encryptedData, 'base64');
|
|
94
|
+
// Extract IV, AuthTag, and encrypted content
|
|
95
|
+
const iv = combined.subarray(0, IV_LENGTH);
|
|
96
|
+
const authTag = combined.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);
|
|
97
|
+
const encrypted = combined.subarray(IV_LENGTH + TAG_LENGTH);
|
|
98
|
+
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
|
|
99
|
+
decipher.setAuthTag(authTag);
|
|
100
|
+
let decrypted = decipher.update(encrypted);
|
|
101
|
+
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
102
|
+
return decrypted.toString('utf8');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Encrypt a file in place
|
|
106
|
+
*/
|
|
107
|
+
export async function encryptFile(filePath, options) {
|
|
108
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
109
|
+
const encrypted = await encrypt(content, options);
|
|
110
|
+
await fs.writeFile(filePath, encrypted);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Decrypt a file and return content (does not modify file)
|
|
114
|
+
*/
|
|
115
|
+
export async function decryptFile(filePath, options) {
|
|
116
|
+
const encrypted = await fs.readFile(filePath, 'utf-8');
|
|
117
|
+
return decrypt(encrypted, options);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Verify that encryption options are valid (test encrypt/decrypt cycle)
|
|
121
|
+
*/
|
|
122
|
+
export async function verifyEncryption(options) {
|
|
123
|
+
try {
|
|
124
|
+
const testData = 'envmatic-verification-test';
|
|
125
|
+
const encrypted = await encrypt(testData, options);
|
|
126
|
+
const decrypted = await decrypt(encrypted, options);
|
|
127
|
+
return decrypted === testData;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if SSH key file exists and is readable
|
|
135
|
+
*/
|
|
136
|
+
export async function validateSSHKey(sshKeyPath) {
|
|
137
|
+
try {
|
|
138
|
+
await fs.access(sshKeyPath, fs.constants.R_OK);
|
|
139
|
+
const content = await fs.readFile(sshKeyPath, 'utf-8');
|
|
140
|
+
return content.includes('PRIVATE KEY');
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/services/encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Env File Service
|
|
3
|
+
* Manages .env files in the vault
|
|
4
|
+
*/
|
|
5
|
+
import type { EnvFile, EnvFileContent, EncryptionOptions } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate file ID from project and environment
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateFileId(project: string, environment: string, name?: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Get the full path for an env file in the vault
|
|
12
|
+
*/
|
|
13
|
+
export declare function getEnvFilePath(fileId: string, encrypted?: boolean): string;
|
|
14
|
+
/**
|
|
15
|
+
* Parse .env content to key-value pairs
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseEnvContent(content: string): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Serialize key-value pairs to .env format
|
|
20
|
+
*/
|
|
21
|
+
export declare function serializeEnvContent(variables: Record<string, string>): string;
|
|
22
|
+
/**
|
|
23
|
+
* Create a new env file
|
|
24
|
+
*/
|
|
25
|
+
export declare function createEnvFile(project: string, environment: string, variables: Record<string, string>, options?: {
|
|
26
|
+
name?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
encryptionOptions?: EncryptionOptions;
|
|
29
|
+
immutable?: boolean;
|
|
30
|
+
}): Promise<EnvFile>;
|
|
31
|
+
/**
|
|
32
|
+
* Read an env file
|
|
33
|
+
*/
|
|
34
|
+
export declare function readEnvFile(fileId: string, encryptionOptions?: EncryptionOptions): Promise<EnvFileContent>;
|
|
35
|
+
/**
|
|
36
|
+
* Update an env file
|
|
37
|
+
*/
|
|
38
|
+
export declare function updateEnvFile(fileId: string, variables: Record<string, string>, encryptionOptions?: EncryptionOptions): Promise<EnvFile>;
|
|
39
|
+
/**
|
|
40
|
+
* Delete an env file
|
|
41
|
+
*/
|
|
42
|
+
export declare function deleteEnvFile(fileId: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* List all env files
|
|
45
|
+
*/
|
|
46
|
+
export declare function listEnvFiles(project?: string): Promise<EnvFile[]>;
|
|
47
|
+
/**
|
|
48
|
+
* List all projects
|
|
49
|
+
*/
|
|
50
|
+
export declare function listProjects(): Promise<string[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Import an existing .env file into the vault
|
|
53
|
+
*/
|
|
54
|
+
export declare function importEnvFile(sourcePath: string, project: string, environment: string, options?: {
|
|
55
|
+
name?: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
encryptionOptions?: EncryptionOptions;
|
|
58
|
+
immutable?: boolean;
|
|
59
|
+
}): Promise<EnvFile>;
|
|
60
|
+
/**
|
|
61
|
+
* Export an env file to a target path
|
|
62
|
+
*/
|
|
63
|
+
export declare function exportEnvFile(fileId: string, targetPath: string, encryptionOptions?: EncryptionOptions): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Add or update a single variable in an env file
|
|
66
|
+
*/
|
|
67
|
+
export declare function setVariable(fileId: string, key: string, value: string, encryptionOptions?: EncryptionOptions): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Remove a variable from an env file
|
|
70
|
+
*/
|
|
71
|
+
export declare function removeVariable(fileId: string, key: string, encryptionOptions?: EncryptionOptions): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Get a single variable value
|
|
74
|
+
*/
|
|
75
|
+
export declare function getVariable(fileId: string, key: string, encryptionOptions?: EncryptionOptions): Promise<string | undefined>;
|
|
76
|
+
//# sourceMappingURL=envfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envfile.d.ts","sourceRoot":"","sources":["../../src/services/envfile.ts"],"names":[],"mappings":"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"}
|