envware 1.0.10
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 +98 -0
- package/dist/app.controller.d.ts +6 -0
- package/dist/app.controller.js +35 -0
- package/dist/app.controller.js.map +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +40 -0
- package/dist/app.module.js.map +1 -0
- package/dist/app.service.d.ts +3 -0
- package/dist/app.service.js +20 -0
- package/dist/app.service.js.map +1 -0
- package/dist/commands/accept.command.d.ts +11 -0
- package/dist/commands/accept.command.js +74 -0
- package/dist/commands/accept.command.js.map +1 -0
- package/dist/commands/login.command.d.ts +9 -0
- package/dist/commands/login.command.js +61 -0
- package/dist/commands/login.command.js.map +1 -0
- package/dist/commands/project.command.d.ts +12 -0
- package/dist/commands/project.command.js +121 -0
- package/dist/commands/project.command.js.map +1 -0
- package/dist/commands/pull.command.d.ts +16 -0
- package/dist/commands/pull.command.js +120 -0
- package/dist/commands/pull.command.js.map +1 -0
- package/dist/commands/push.command.d.ts +16 -0
- package/dist/commands/push.command.js +153 -0
- package/dist/commands/push.command.js.map +1 -0
- package/dist/commands/share.command.d.ts +16 -0
- package/dist/commands/share.command.js +125 -0
- package/dist/commands/share.command.js.map +1 -0
- package/dist/commands/signup.command.d.ts +9 -0
- package/dist/commands/signup.command.js +61 -0
- package/dist/commands/signup.command.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +17 -0
- package/dist/main.js.map +1 -0
- package/dist/services/api.service.d.ts +8 -0
- package/dist/services/api.service.js +53 -0
- package/dist/services/api.service.js.map +1 -0
- package/dist/services/config.service.d.ts +11 -0
- package/dist/services/config.service.js +130 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/encryption.service.d.ts +20 -0
- package/dist/services/encryption.service.js +178 -0
- package/dist/services/encryption.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,120 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.PullCommand = void 0;
|
|
49
|
+
const nest_commander_1 = require("nest-commander");
|
|
50
|
+
const api_service_1 = require("../services/api.service");
|
|
51
|
+
const config_service_1 = require("../services/config.service");
|
|
52
|
+
const encryption_service_1 = require("../services/encryption.service");
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
56
|
+
let PullCommand = class PullCommand extends nest_commander_1.CommandRunner {
|
|
57
|
+
apiService;
|
|
58
|
+
encryptionService;
|
|
59
|
+
configService;
|
|
60
|
+
constructor(apiService, encryptionService, configService) {
|
|
61
|
+
super();
|
|
62
|
+
this.apiService = apiService;
|
|
63
|
+
this.encryptionService = encryptionService;
|
|
64
|
+
this.configService = configService;
|
|
65
|
+
}
|
|
66
|
+
async run(passedParams, options) {
|
|
67
|
+
const activeProjectId = this.configService.getLocalProject();
|
|
68
|
+
if (activeProjectId) {
|
|
69
|
+
console.log(chalk_1.default.cyan(`Current project: ${activeProjectId}\n`));
|
|
70
|
+
}
|
|
71
|
+
const [projectIdParam] = passedParams;
|
|
72
|
+
const projectId = projectIdParam || activeProjectId || process.env.ENVWARE_PROJECT;
|
|
73
|
+
const environment = options?.env || '.env';
|
|
74
|
+
if (!projectId) {
|
|
75
|
+
console.log(chalk_1.default.red('Project ID or Alias is required. Usage: pull <projectId|alias>'));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const { data } = await this.apiService.instance.get('/secrets', { params: { projectId, environment } });
|
|
80
|
+
if (!data.encryptedProjectKey) {
|
|
81
|
+
console.log(chalk_1.default.yellow('Warning: No encrypted project key found. This project might not be using E2EE yet or you do not have access.'));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const projectKey = this.encryptionService.decryptProjectKey(data.encryptedProjectKey);
|
|
85
|
+
const envContent = data.secrets
|
|
86
|
+
.map((s) => {
|
|
87
|
+
const decryptedValue = this.encryptionService.decrypt({ value: s.value, iv: s.iv, tag: s.tag }, projectKey);
|
|
88
|
+
return `${s.key}=${decryptedValue}`;
|
|
89
|
+
})
|
|
90
|
+
.join('\n');
|
|
91
|
+
const envPath = path.join(process.cwd(), environment);
|
|
92
|
+
fs.writeFileSync(envPath, envContent);
|
|
93
|
+
console.log(chalk_1.default.green(`Successfully pulled and decrypted ${environment}`));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.log(chalk_1.default.red('Pull failed: ' + (error.response?.data?.message || error.message)));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
parseEnv(val) {
|
|
100
|
+
return val;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
exports.PullCommand = PullCommand;
|
|
104
|
+
__decorate([
|
|
105
|
+
(0, nest_commander_1.Option)({
|
|
106
|
+
flags: '-e, --env [environment]',
|
|
107
|
+
description: 'The environment file to pull (default: .env)',
|
|
108
|
+
defaultValue: '.env',
|
|
109
|
+
}),
|
|
110
|
+
__metadata("design:type", Function),
|
|
111
|
+
__metadata("design:paramtypes", [String]),
|
|
112
|
+
__metadata("design:returntype", String)
|
|
113
|
+
], PullCommand.prototype, "parseEnv", null);
|
|
114
|
+
exports.PullCommand = PullCommand = __decorate([
|
|
115
|
+
(0, nest_commander_1.Command)({ name: 'pull', description: 'Download project .env (E2EE)' }),
|
|
116
|
+
__metadata("design:paramtypes", [api_service_1.ApiService,
|
|
117
|
+
encryption_service_1.EncryptionService,
|
|
118
|
+
config_service_1.ConfigService])
|
|
119
|
+
], PullCommand);
|
|
120
|
+
//# sourceMappingURL=pull.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.command.js","sourceRoot":"","sources":["../../src/commands/pull.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
import { ApiService } from '../services/api.service';
|
|
3
|
+
import { ConfigService } from '../services/config.service';
|
|
4
|
+
import { EncryptionService } from '../services/encryption.service';
|
|
5
|
+
interface PushOptions {
|
|
6
|
+
env: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class PushCommand extends CommandRunner {
|
|
9
|
+
private apiService;
|
|
10
|
+
private encryptionService;
|
|
11
|
+
private configService;
|
|
12
|
+
constructor(apiService: ApiService, encryptionService: EncryptionService, configService: ConfigService);
|
|
13
|
+
run(passedParams: string[], options?: PushOptions): Promise<void>;
|
|
14
|
+
parseEnv(val: string): string;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,153 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.PushCommand = void 0;
|
|
49
|
+
const nest_commander_1 = require("nest-commander");
|
|
50
|
+
const api_service_1 = require("../services/api.service");
|
|
51
|
+
const config_service_1 = require("../services/config.service");
|
|
52
|
+
const encryption_service_1 = require("../services/encryption.service");
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
56
|
+
const dotenv = __importStar(require("dotenv"));
|
|
57
|
+
let PushCommand = class PushCommand extends nest_commander_1.CommandRunner {
|
|
58
|
+
apiService;
|
|
59
|
+
encryptionService;
|
|
60
|
+
configService;
|
|
61
|
+
constructor(apiService, encryptionService, configService) {
|
|
62
|
+
super();
|
|
63
|
+
this.apiService = apiService;
|
|
64
|
+
this.encryptionService = encryptionService;
|
|
65
|
+
this.configService = configService;
|
|
66
|
+
}
|
|
67
|
+
async run(passedParams, options) {
|
|
68
|
+
const activeProjectId = this.configService.getLocalProject();
|
|
69
|
+
if (activeProjectId) {
|
|
70
|
+
console.log(chalk_1.default.cyan(`Current project: ${activeProjectId}\n`));
|
|
71
|
+
}
|
|
72
|
+
const [projectIdParam] = passedParams;
|
|
73
|
+
const projectId = projectIdParam || activeProjectId || process.env.ENVWARE_PROJECT;
|
|
74
|
+
const environment = options?.env || '.env';
|
|
75
|
+
if (!projectId) {
|
|
76
|
+
console.log(chalk_1.default.red('Project ID or Alias is required. Usage: push <projectId|alias>'));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const envPath = path.join(process.cwd(), environment);
|
|
80
|
+
if (!fs.existsSync(envPath)) {
|
|
81
|
+
console.log(chalk_1.default.red(`File ${environment} not found in current directory`));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
let projectKey;
|
|
86
|
+
const response = await this.apiService.instance.get('/secrets', { params: { projectId, environment } });
|
|
87
|
+
const data = response.data;
|
|
88
|
+
if (data.encryptedProjectKey) {
|
|
89
|
+
projectKey = this.encryptionService.decryptProjectKey(data.encryptedProjectKey);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log(chalk_1.default.yellow('First push: Generating project key...'));
|
|
93
|
+
projectKey = this.encryptionService.generateProjectKey();
|
|
94
|
+
const publicKey = this.encryptionService.getPublicKey();
|
|
95
|
+
await this.apiService.instance.post('/secrets/public-key', {
|
|
96
|
+
publicKey,
|
|
97
|
+
});
|
|
98
|
+
const encryptedProjectKey = this.encryptionService.encryptProjectKey(projectKey, publicKey);
|
|
99
|
+
await this.apiService.instance.post('/secrets/project-key', {
|
|
100
|
+
projectId,
|
|
101
|
+
encryptedProjectKey,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const fileContent = fs.readFileSync(envPath);
|
|
105
|
+
const envConfig = dotenv.parse(fileContent);
|
|
106
|
+
const secrets = Object.entries(envConfig).map(([key, value]) => {
|
|
107
|
+
const encrypted = this.encryptionService.encrypt(value, projectKey);
|
|
108
|
+
return {
|
|
109
|
+
key,
|
|
110
|
+
value: encrypted.value,
|
|
111
|
+
iv: encrypted.iv,
|
|
112
|
+
tag: encrypted.tag,
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
await this.apiService.instance.post('/secrets/upsert-many', {
|
|
116
|
+
projectId,
|
|
117
|
+
environment,
|
|
118
|
+
secrets,
|
|
119
|
+
});
|
|
120
|
+
console.log(chalk_1.default.green(`Successfully pushed encrypted secrets from ${environment} to project ${projectId}`));
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const message = error.response?.data?.message || error.message;
|
|
124
|
+
console.log(chalk_1.default.red('Push failed: ' + message));
|
|
125
|
+
if (message &&
|
|
126
|
+
typeof message === 'string' &&
|
|
127
|
+
message.includes('Public Key not found')) {
|
|
128
|
+
console.log(chalk_1.default.blue('Tip: Ensure you have an SSH key at ~/.ssh/id_rsa.pub'));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
parseEnv(val) {
|
|
133
|
+
return val;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
exports.PushCommand = PushCommand;
|
|
137
|
+
__decorate([
|
|
138
|
+
(0, nest_commander_1.Option)({
|
|
139
|
+
flags: '-e, --env [environment]',
|
|
140
|
+
description: 'The environment file to push (default: .env)',
|
|
141
|
+
defaultValue: '.env',
|
|
142
|
+
}),
|
|
143
|
+
__metadata("design:type", Function),
|
|
144
|
+
__metadata("design:paramtypes", [String]),
|
|
145
|
+
__metadata("design:returntype", String)
|
|
146
|
+
], PushCommand.prototype, "parseEnv", null);
|
|
147
|
+
exports.PushCommand = PushCommand = __decorate([
|
|
148
|
+
(0, nest_commander_1.Command)({ name: 'push', description: 'Upload local .env to a project (E2EE)' }),
|
|
149
|
+
__metadata("design:paramtypes", [api_service_1.ApiService,
|
|
150
|
+
encryption_service_1.EncryptionService,
|
|
151
|
+
config_service_1.ConfigService])
|
|
152
|
+
], PushCommand);
|
|
153
|
+
//# sourceMappingURL=push.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.command.js","sourceRoot":"","sources":["../../src/commands/push.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
import { ApiService } from '../services/api.service';
|
|
3
|
+
import { ConfigService } from '../services/config.service';
|
|
4
|
+
import { EncryptionService } from '../services/encryption.service';
|
|
5
|
+
interface ShareOptions {
|
|
6
|
+
role: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ShareCommand extends CommandRunner {
|
|
9
|
+
private apiService;
|
|
10
|
+
private encryptionService;
|
|
11
|
+
private configService;
|
|
12
|
+
constructor(apiService: ApiService, encryptionService: EncryptionService, configService: ConfigService);
|
|
13
|
+
run(passedParams: string[], options?: ShareOptions): Promise<void>;
|
|
14
|
+
parseRole(val: string): string;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ShareCommand = void 0;
|
|
16
|
+
const nest_commander_1 = require("nest-commander");
|
|
17
|
+
const api_service_1 = require("../services/api.service");
|
|
18
|
+
const config_service_1 = require("../services/config.service");
|
|
19
|
+
const encryption_service_1 = require("../services/encryption.service");
|
|
20
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
21
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
22
|
+
let ShareCommand = class ShareCommand extends nest_commander_1.CommandRunner {
|
|
23
|
+
apiService;
|
|
24
|
+
encryptionService;
|
|
25
|
+
configService;
|
|
26
|
+
constructor(apiService, encryptionService, configService) {
|
|
27
|
+
super();
|
|
28
|
+
this.apiService = apiService;
|
|
29
|
+
this.encryptionService = encryptionService;
|
|
30
|
+
this.configService = configService;
|
|
31
|
+
}
|
|
32
|
+
async run(passedParams, options) {
|
|
33
|
+
const activeProjectId = this.configService.getLocalProject();
|
|
34
|
+
if (activeProjectId) {
|
|
35
|
+
console.log(chalk_1.default.cyan(`Current project: ${activeProjectId}\n`));
|
|
36
|
+
}
|
|
37
|
+
const [projectIdParam, email] = passedParams;
|
|
38
|
+
const projectId = projectIdParam || activeProjectId || process.env.ENVWARE_PROJECT;
|
|
39
|
+
const role = options?.role || 'DEVELOPER';
|
|
40
|
+
if (!projectId || !email) {
|
|
41
|
+
console.log(chalk_1.default.red('Usage: share <projectId|alias> <email> [--role ADMINISTRATOR|DEVELOPER]'));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
await this.apiService.instance.post('/projects/share', {
|
|
46
|
+
projectId,
|
|
47
|
+
email,
|
|
48
|
+
role,
|
|
49
|
+
});
|
|
50
|
+
const { data: pullData } = await this.apiService.instance.get('/secrets', {
|
|
51
|
+
params: { projectId },
|
|
52
|
+
});
|
|
53
|
+
if (!pullData.encryptedProjectKey) {
|
|
54
|
+
throw new Error('Project does not have an E2EE key. Push secrets first.');
|
|
55
|
+
}
|
|
56
|
+
const projectKey = this.encryptionService.decryptProjectKey(pullData.encryptedProjectKey);
|
|
57
|
+
const { data: userData } = await this.apiService.instance.get('/secrets/public-key', { params: { email } });
|
|
58
|
+
if (!userData.publicKey) {
|
|
59
|
+
console.log(chalk_1.default.yellow(`User ${email} has not registered their SSH key yet.`));
|
|
60
|
+
const { confirmInvite } = await inquirer_1.default.prompt([
|
|
61
|
+
{
|
|
62
|
+
type: 'confirm',
|
|
63
|
+
name: 'confirmInvite',
|
|
64
|
+
message: `Would you like to invite ${email} to collaborate? they will receive an email.`,
|
|
65
|
+
default: true,
|
|
66
|
+
}
|
|
67
|
+
]);
|
|
68
|
+
if (!confirmInvite)
|
|
69
|
+
return;
|
|
70
|
+
const inviteCode = Math.random().toString(36).substring(2, 8).toUpperCase();
|
|
71
|
+
const encryptedForInvite = this.encryptionService.encryptSymmetric(projectKey, inviteCode);
|
|
72
|
+
await this.apiService.instance.post('/projects/invite', {
|
|
73
|
+
projectId,
|
|
74
|
+
email,
|
|
75
|
+
role,
|
|
76
|
+
encryptedProjectKey: encryptedForInvite,
|
|
77
|
+
inviteCode,
|
|
78
|
+
});
|
|
79
|
+
console.log(chalk_1.default.green(`Successfully invited ${email}! Invite code: ${chalk_1.default.bold(inviteCode)}`));
|
|
80
|
+
console.log(chalk_1.default.blue(`They will be able to join using: ${chalk_1.default.white(`envw accept ${inviteCode}`)} after signing up.`));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const encryptedForRecipient = this.encryptionService.encryptProjectKey(projectKey, userData.publicKey);
|
|
84
|
+
await this.apiService.instance.post('/secrets/project-key', {
|
|
85
|
+
projectId,
|
|
86
|
+
encryptedProjectKey: encryptedForRecipient,
|
|
87
|
+
targetEmail: email,
|
|
88
|
+
});
|
|
89
|
+
console.log(chalk_1.default.green(`Successfully shared ${role} access with ${email}`));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const errorMessage = error.response?.data?.message || error.message || String(error);
|
|
93
|
+
console.log(chalk_1.default.red('Share failed: ' + errorMessage));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
parseRole(val) {
|
|
97
|
+
const upper = val.toUpperCase();
|
|
98
|
+
if (upper === 'ADMIN')
|
|
99
|
+
return 'ADMINISTRATOR';
|
|
100
|
+
if (upper === 'DEV')
|
|
101
|
+
return 'DEVELOPER';
|
|
102
|
+
return upper;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
exports.ShareCommand = ShareCommand;
|
|
106
|
+
__decorate([
|
|
107
|
+
(0, nest_commander_1.Option)({
|
|
108
|
+
flags: '-r, --role [role]',
|
|
109
|
+
description: 'The role to grant (ADMINISTRATOR or DEVELOPER)',
|
|
110
|
+
defaultValue: 'DEVELOPER',
|
|
111
|
+
}),
|
|
112
|
+
__metadata("design:type", Function),
|
|
113
|
+
__metadata("design:paramtypes", [String]),
|
|
114
|
+
__metadata("design:returntype", String)
|
|
115
|
+
], ShareCommand.prototype, "parseRole", null);
|
|
116
|
+
exports.ShareCommand = ShareCommand = __decorate([
|
|
117
|
+
(0, nest_commander_1.Command)({
|
|
118
|
+
name: 'share',
|
|
119
|
+
description: 'Share project access with another user (E2EE)',
|
|
120
|
+
}),
|
|
121
|
+
__metadata("design:paramtypes", [api_service_1.ApiService,
|
|
122
|
+
encryption_service_1.EncryptionService,
|
|
123
|
+
config_service_1.ConfigService])
|
|
124
|
+
], ShareCommand);
|
|
125
|
+
//# sourceMappingURL=share.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.command.js","sourceRoot":"","sources":["../../src/commands/share.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
import { ApiService } from '../services/api.service';
|
|
3
|
+
import { ConfigService } from '../services/config.service';
|
|
4
|
+
export declare class SignupCommand extends CommandRunner {
|
|
5
|
+
private apiService;
|
|
6
|
+
private configService;
|
|
7
|
+
constructor(apiService: ApiService, configService: ConfigService);
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SignupCommand = void 0;
|
|
16
|
+
const nest_commander_1 = require("nest-commander");
|
|
17
|
+
const api_service_1 = require("../services/api.service");
|
|
18
|
+
const config_service_1 = require("../services/config.service");
|
|
19
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
20
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
21
|
+
let SignupCommand = class SignupCommand extends nest_commander_1.CommandRunner {
|
|
22
|
+
apiService;
|
|
23
|
+
configService;
|
|
24
|
+
constructor(apiService, configService) {
|
|
25
|
+
super();
|
|
26
|
+
this.apiService = apiService;
|
|
27
|
+
this.configService = configService;
|
|
28
|
+
}
|
|
29
|
+
async run() {
|
|
30
|
+
const activeProjectId = this.configService.getLocalProject();
|
|
31
|
+
if (activeProjectId) {
|
|
32
|
+
console.log(chalk_1.default.cyan(`Current project: ${activeProjectId}\n`));
|
|
33
|
+
}
|
|
34
|
+
const answers = await inquirer_1.default.prompt([
|
|
35
|
+
{ type: 'input', name: 'email', message: 'Enter your email:' },
|
|
36
|
+
{ type: 'password', name: 'password', message: 'Enter your password:' },
|
|
37
|
+
]);
|
|
38
|
+
try {
|
|
39
|
+
const response = await this.apiService.instance.post('/auth/signup', {
|
|
40
|
+
email: answers.email,
|
|
41
|
+
password: answers.password,
|
|
42
|
+
});
|
|
43
|
+
this.configService.set('token', response.data.access_token);
|
|
44
|
+
console.log(chalk_1.default.green('Successfully signed up and logged in!'));
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const err = error;
|
|
48
|
+
const statusSuffix = err.response?.status
|
|
49
|
+
? ` (Status: ${err.response.status})`
|
|
50
|
+
: '';
|
|
51
|
+
console.log(chalk_1.default.red(`Signup failed: ${err.response?.data?.message || err.message}${statusSuffix}`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
exports.SignupCommand = SignupCommand;
|
|
56
|
+
exports.SignupCommand = SignupCommand = __decorate([
|
|
57
|
+
(0, nest_commander_1.Command)({ name: 'signup', description: 'Create a new envware account' }),
|
|
58
|
+
__metadata("design:paramtypes", [api_service_1.ApiService,
|
|
59
|
+
config_service_1.ConfigService])
|
|
60
|
+
], SignupCommand);
|
|
61
|
+
//# sourceMappingURL=signup.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.command.js","sourceRoot":"","sources":["../../src/commands/signup.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mDAAwD;AACxD,yDAAqD;AACrD,+DAA2D;AAC3D,kDAA0B;AAC1B,wDAAgC;AAGzB,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,8BAAa;IAEpC;IACA;IAFV,YACU,UAAsB,EACtB,aAA4B;QAEpC,KAAK,EAAE,CAAC;QAHA,eAAU,GAAV,UAAU,CAAY;QACtB,kBAAa,GAAb,aAAa,CAAe;IAGtC,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;QAC7D,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,eAAe,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE;YAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE;SACxE,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAEjD,cAAc,EAAE;gBACjB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,KAGX,CAAC;YACF,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM;gBACvC,CAAC,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG;gBACrC,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CACP,kBAAkB,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,OAAO,GAAG,YAAY,EAAE,CAC9E,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AA5CY,sCAAa;wBAAb,aAAa;IADzB,IAAA,wBAAO,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;qCAGjD,wBAAU;QACP,8BAAa;GAH3B,aAAa,CA4CzB"}
|
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const nest_commander_1 = require("nest-commander");
|
|
5
|
+
const app_module_1 = require("./app.module");
|
|
6
|
+
const { version } = require('../package.json');
|
|
7
|
+
async function bootstrap() {
|
|
8
|
+
await nest_commander_1.CommandFactory.run(app_module_1.AppModule, {
|
|
9
|
+
version,
|
|
10
|
+
logger: ['warn', 'error'],
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
bootstrap().catch((err) => {
|
|
14
|
+
console.error(err);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;AACA,mDAAgD;AAChD,6CAAyC;AAGzC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,KAAK,UAAU,SAAS;IACtB,MAAM,+BAAc,CAAC,GAAG,CAAC,sBAAS,EAAE;QAClC,OAAO;QACP,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ApiService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const axios_1 = __importDefault(require("axios"));
|
|
18
|
+
const config_service_1 = require("./config.service");
|
|
19
|
+
let ApiService = class ApiService {
|
|
20
|
+
configService;
|
|
21
|
+
axiosInstance;
|
|
22
|
+
constructor(configService) {
|
|
23
|
+
this.configService = configService;
|
|
24
|
+
const baseUrl = process.env.ENVWARE_API_URL ||
|
|
25
|
+
this.configService.get('ENVWARE_API_URL') ||
|
|
26
|
+
this.configService.get('apiUrl') ||
|
|
27
|
+
'https://www.envware.dev/api';
|
|
28
|
+
this.axiosInstance = axios_1.default.create({
|
|
29
|
+
baseURL: baseUrl,
|
|
30
|
+
});
|
|
31
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
32
|
+
console.log(`Connecting to: ${baseUrl}`);
|
|
33
|
+
}
|
|
34
|
+
this.axiosInstance.interceptors.request.use((config) => {
|
|
35
|
+
const token = this.configService.get('token');
|
|
36
|
+
if (token) {
|
|
37
|
+
if (config.headers) {
|
|
38
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return config;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
get instance() {
|
|
45
|
+
return this.axiosInstance;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.ApiService = ApiService;
|
|
49
|
+
exports.ApiService = ApiService = __decorate([
|
|
50
|
+
(0, common_1.Injectable)(),
|
|
51
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService])
|
|
52
|
+
], ApiService);
|
|
53
|
+
//# sourceMappingURL=api.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.service.js","sourceRoot":"","sources":["../../src/services/api.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,kDAA6C;AAC7C,qDAAiD;AAG1C,IAAM,UAAU,GAAhB,MAAM,UAAU;IAGD;IAFZ,aAAa,CAAgB;IAErC,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAC9C,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,eAAe;YAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChC,6BAA6B,CAAC;QAEhC,IAAI,CAAC,aAAa,GAAG,eAAK,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAGpC,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;gBACnD,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;CACF,CAAA;AAlCY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;qCAIwB,8BAAa;GAHrC,UAAU,CAkCtB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class ConfigService {
|
|
2
|
+
private readonly homeConfigPath;
|
|
3
|
+
private readonly localConfigPath;
|
|
4
|
+
private readonly projectConfigPath;
|
|
5
|
+
private getConfigPath;
|
|
6
|
+
get(key: string): string | null;
|
|
7
|
+
set(key: string, value: string): void;
|
|
8
|
+
delete(key: string): void;
|
|
9
|
+
getLocalProject(): string | null;
|
|
10
|
+
setLocalProject(projectId: string): void;
|
|
11
|
+
}
|