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.
Files changed (102) hide show
  1. package/README.md +567 -0
  2. package/dist/cli.d.ts +7 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +203 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/add.d.ts +11 -0
  7. package/dist/commands/add.d.ts.map +1 -0
  8. package/dist/commands/add.js +77 -0
  9. package/dist/commands/add.js.map +1 -0
  10. package/dist/commands/delete.d.ts +6 -0
  11. package/dist/commands/delete.d.ts.map +1 -0
  12. package/dist/commands/delete.js +78 -0
  13. package/dist/commands/delete.js.map +1 -0
  14. package/dist/commands/edit.d.ts +13 -0
  15. package/dist/commands/edit.d.ts.map +1 -0
  16. package/dist/commands/edit.js +364 -0
  17. package/dist/commands/edit.js.map +1 -0
  18. package/dist/commands/import.d.ts +11 -0
  19. package/dist/commands/import.d.ts.map +1 -0
  20. package/dist/commands/import.js +103 -0
  21. package/dist/commands/import.js.map +1 -0
  22. package/dist/commands/init.d.ts +8 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +237 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/link.d.ts +16 -0
  27. package/dist/commands/link.d.ts.map +1 -0
  28. package/dist/commands/link.js +157 -0
  29. package/dist/commands/link.js.map +1 -0
  30. package/dist/commands/list.d.ts +9 -0
  31. package/dist/commands/list.d.ts.map +1 -0
  32. package/dist/commands/list.js +73 -0
  33. package/dist/commands/list.js.map +1 -0
  34. package/dist/commands/lock.d.ts +16 -0
  35. package/dist/commands/lock.d.ts.map +1 -0
  36. package/dist/commands/lock.js +245 -0
  37. package/dist/commands/lock.js.map +1 -0
  38. package/dist/commands/rotate.d.ts +15 -0
  39. package/dist/commands/rotate.d.ts.map +1 -0
  40. package/dist/commands/rotate.js +406 -0
  41. package/dist/commands/rotate.js.map +1 -0
  42. package/dist/commands/show.d.ts +9 -0
  43. package/dist/commands/show.d.ts.map +1 -0
  44. package/dist/commands/show.js +72 -0
  45. package/dist/commands/show.js.map +1 -0
  46. package/dist/commands/sync.d.ts +13 -0
  47. package/dist/commands/sync.d.ts.map +1 -0
  48. package/dist/commands/sync.js +174 -0
  49. package/dist/commands/sync.js.map +1 -0
  50. package/dist/commands/use.d.ts +19 -0
  51. package/dist/commands/use.d.ts.map +1 -0
  52. package/dist/commands/use.js +238 -0
  53. package/dist/commands/use.js.map +1 -0
  54. package/dist/constants.d.ts +20 -0
  55. package/dist/constants.d.ts.map +1 -0
  56. package/dist/constants.js +47 -0
  57. package/dist/constants.js.map +1 -0
  58. package/dist/index.d.ts +15 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +21 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/services/config.d.ts +64 -0
  63. package/dist/services/config.d.ts.map +1 -0
  64. package/dist/services/config.js +133 -0
  65. package/dist/services/config.js.map +1 -0
  66. package/dist/services/encryption.d.ts +30 -0
  67. package/dist/services/encryption.d.ts.map +1 -0
  68. package/dist/services/encryption.js +146 -0
  69. package/dist/services/encryption.js.map +1 -0
  70. package/dist/services/envfile.d.ts +76 -0
  71. package/dist/services/envfile.d.ts.map +1 -0
  72. package/dist/services/envfile.js +247 -0
  73. package/dist/services/envfile.js.map +1 -0
  74. package/dist/services/git.d.ts +60 -0
  75. package/dist/services/git.d.ts.map +1 -0
  76. package/dist/services/git.js +239 -0
  77. package/dist/services/git.js.map +1 -0
  78. package/dist/services/linker.d.ts +46 -0
  79. package/dist/services/linker.d.ts.map +1 -0
  80. package/dist/services/linker.js +222 -0
  81. package/dist/services/linker.js.map +1 -0
  82. package/dist/services/protection.d.ts +32 -0
  83. package/dist/services/protection.d.ts.map +1 -0
  84. package/dist/services/protection.js +190 -0
  85. package/dist/services/protection.js.map +1 -0
  86. package/dist/types/index.d.ts +73 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +5 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/utils/display.d.ts +74 -0
  91. package/dist/utils/display.d.ts.map +1 -0
  92. package/dist/utils/display.js +138 -0
  93. package/dist/utils/display.js.map +1 -0
  94. package/dist/utils/editor.d.ts +22 -0
  95. package/dist/utils/editor.d.ts.map +1 -0
  96. package/dist/utils/editor.js +159 -0
  97. package/dist/utils/editor.js.map +1 -0
  98. package/dist/utils/prompts.d.ts +41 -0
  99. package/dist/utils/prompts.d.ts.map +1 -0
  100. package/dist/utils/prompts.js +222 -0
  101. package/dist/utils/prompts.js.map +1 -0
  102. 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"}
@@ -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":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGxD,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,UAAU,GAAG,EAAE,CAAC,CAAC,WAAW;AAClC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,WAAW;AACjC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B;;GAEG;AACH,KAAK,UAAU,OAAO;IACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAElD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3E,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IAChD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAE7B,qDAAqD;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7E,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAA0B;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACnD,OAAO,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtD,OAAO,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,OAA0B;IACpE,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAEzD,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpC,wCAAwC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,EAAE;QACF,OAAO;QACP,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;KACjC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,aAAqB,EAAE,OAA0B;IAC7E,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAEtD,6CAA6C;IAC7C,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7D,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7B,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEzD,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAA0B;IAE1B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAA0B;IAE1B,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA0B;IAC/D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,4BAA4B,CAAC;QAC9C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,SAAS,KAAK,QAAQ,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -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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"}