zyket 1.2.11 → 1.2.12
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/.github/workflows/publish.yml +37 -37
- package/README.md +279 -279
- package/bin/cli.js +201 -201
- package/index.js +32 -32
- package/package.json +54 -50
- package/src/Middleware.js +3 -3
- package/src/extensions/Extension.js +10 -10
- package/src/extensions/bullboard/index.js +38 -38
- package/src/extensions/interactive-storage/index.js +162 -162
- package/src/extensions/interactive-storage/middlewares/MulterMiddleware.js +31 -31
- package/src/extensions/interactive-storage/routes/browse.js +31 -31
- package/src/extensions/interactive-storage/routes/create-folder.js +37 -37
- package/src/extensions/interactive-storage/routes/delete-folder.js +57 -57
- package/src/extensions/interactive-storage/routes/delete.js +41 -41
- package/src/extensions/interactive-storage/routes/download.js +47 -47
- package/src/extensions/interactive-storage/routes/info.js +37 -37
- package/src/extensions/interactive-storage/routes/upload.js +46 -46
- package/src/kernel/HTTPServer.js +31 -31
- package/src/kernel/index.js +78 -78
- package/src/services/Service.js +10 -10
- package/src/services/auth/auth.js +7 -7
- package/src/services/auth/index.js +199 -199
- package/src/services/bullmq/Worker.js +7 -7
- package/src/services/bullmq/index.js +92 -92
- package/src/services/cache/index.js +96 -96
- package/src/services/database/index.js +127 -127
- package/src/services/events/Event.js +6 -6
- package/src/services/events/index.js +59 -59
- package/src/services/express/Express.js +248 -248
- package/src/services/express/Middleware.js +7 -7
- package/src/services/express/RedirectResponse.js +8 -8
- package/src/services/express/Route.js +6 -6
- package/src/services/express/index.js +4 -4
- package/src/services/index.js +29 -29
- package/src/services/logger/index.js +80 -80
- package/src/services/s3/index.js +82 -82
- package/src/services/scheduler/Schedule.js +6 -6
- package/src/services/scheduler/index.js +47 -47
- package/src/services/socketio/Guard.js +10 -10
- package/src/services/socketio/Handler.js +10 -10
- package/src/services/socketio/SocketIO.js +159 -132
- package/src/services/socketio/index.js +4 -4
- package/src/services/template-manager/index.js +73 -73
- package/src/templates/default/config/cors.js +4 -4
- package/src/templates/default/config/swagger.js +15 -15
- package/src/templates/default/frontend/main.jsx +15 -15
- package/src/templates/default/frontend/src/hooks/useAuth.jsx +51 -51
- package/src/templates/default/frontend/src/hooks/useLayout.jsx +18 -18
- package/src/templates/default/frontend/src/layouts/auth/index.jsx +45 -45
- package/src/templates/default/frontend/src/layouts/auth/routes.js +17 -17
- package/src/templates/default/frontend/src/layouts/landing/index.jsx +61 -61
- package/src/templates/default/frontend/src/layouts/landing/routes.js +10 -10
- package/src/templates/default/frontend/src/layouts/panel/index.jsx +115 -115
- package/src/templates/default/frontend/src/layouts/panel/routes.js +10 -10
- package/src/templates/default/frontend/src/middlewares/LoggedMiddleware.jsx +21 -21
- package/src/templates/default/frontend/src/middlewares/NotLoggedMiddleware.jsx +14 -14
- package/src/templates/default/frontend/src/store/index.jsx +5 -5
- package/src/templates/default/frontend/src/store/storeAuth.jsx +14 -14
- package/src/templates/default/frontend/src/views/auth/index.jsx +4 -4
- package/src/templates/default/frontend/src/views/auth/register/index.jsx +4 -4
- package/src/templates/default/frontend/src/views/landing/index.jsx +4 -4
- package/src/templates/default/frontend/src/views/panel/dashboard/index.jsx +4 -4
- package/src/templates/default/frontend/styles.css +1 -1
- package/src/templates/default/src/guards/default.js +6 -6
- package/src/templates/default/src/handlers/connection.js +6 -6
- package/src/templates/default/src/handlers/message.js +8 -8
- package/src/templates/default/src/middlewares/default.js +7 -7
- package/src/templates/default/src/routes/[test]/message.js +26 -26
- package/src/templates/default/src/routes/index.js +22 -22
- package/src/templates/default/src/services/auth/auth.js +7 -7
- package/src/templates/default/src/services/auth/index.js +32 -32
- package/src/utils/EnvManager.js +65 -65
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { create } from "zustand";
|
|
2
|
-
import { createAuthClient } from "better-auth/react";
|
|
3
|
-
import { adminClient } from "better-auth/client/plugins"
|
|
4
|
-
|
|
5
|
-
export const useStoreAuth = create((set) => ({
|
|
6
|
-
client: createAuthClient({
|
|
7
|
-
plugins: [
|
|
8
|
-
adminClient()
|
|
9
|
-
],
|
|
10
|
-
baseURL: `${import.meta.env.VITE_API_BASE}/api/auth/`,
|
|
11
|
-
}),
|
|
12
|
-
|
|
13
|
-
setClient: (client) => set({ client }),
|
|
14
|
-
}));
|
|
1
|
+
import { create } from "zustand";
|
|
2
|
+
import { createAuthClient } from "better-auth/react";
|
|
3
|
+
import { adminClient } from "better-auth/client/plugins"
|
|
4
|
+
|
|
5
|
+
export const useStoreAuth = create((set) => ({
|
|
6
|
+
client: createAuthClient({
|
|
7
|
+
plugins: [
|
|
8
|
+
adminClient()
|
|
9
|
+
],
|
|
10
|
+
baseURL: `${import.meta.env.VITE_API_BASE}/api/auth/`,
|
|
11
|
+
}),
|
|
12
|
+
|
|
13
|
+
setClient: (client) => set({ client }),
|
|
14
|
+
}));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default function AuthView() {
|
|
2
|
-
return (<div>
|
|
3
|
-
Auth View
|
|
4
|
-
</div>);
|
|
1
|
+
export default function AuthView() {
|
|
2
|
+
return (<div>
|
|
3
|
+
Auth View
|
|
4
|
+
</div>);
|
|
5
5
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default function AuthRegisterView() {
|
|
2
|
-
return (<div>
|
|
3
|
-
Auth Register View
|
|
4
|
-
</div>);
|
|
1
|
+
export default function AuthRegisterView() {
|
|
2
|
+
return (<div>
|
|
3
|
+
Auth Register View
|
|
4
|
+
</div>);
|
|
5
5
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default function LandingView() {
|
|
2
|
-
return (<div>
|
|
3
|
-
Landing View
|
|
4
|
-
</div>);
|
|
1
|
+
export default function LandingView() {
|
|
2
|
+
return (<div>
|
|
3
|
+
Landing View
|
|
4
|
+
</div>);
|
|
5
5
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default function PanelDashboardView() {
|
|
2
|
-
return (<div>
|
|
3
|
-
Panel dashboard View
|
|
4
|
-
</div>);
|
|
1
|
+
export default function PanelDashboardView() {
|
|
2
|
+
return (<div>
|
|
3
|
+
Panel dashboard View
|
|
4
|
+
</div>);
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@import "tailwindcss";
|
|
1
|
+
@import "tailwindcss";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const { Guard } = require("zyket");
|
|
2
|
-
|
|
3
|
-
module.exports = class DefaultGuard extends Guard {
|
|
4
|
-
async handle({ container, socket, io }) {
|
|
5
|
-
container.get("logger").info("Default guard");
|
|
6
|
-
}
|
|
1
|
+
const { Guard } = require("zyket");
|
|
2
|
+
|
|
3
|
+
module.exports = class DefaultGuard extends Guard {
|
|
4
|
+
async handle({ container, socket, io }) {
|
|
5
|
+
container.get("logger").info("Default guard");
|
|
6
|
+
}
|
|
7
7
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const { Handler } = require("zyket");
|
|
2
|
-
|
|
3
|
-
module.exports = class ConnectionHandler extends Handler {
|
|
4
|
-
async handle({ container, socket, io }) {
|
|
5
|
-
container.get("logger").info("New connection");
|
|
6
|
-
}
|
|
1
|
+
const { Handler } = require("zyket");
|
|
2
|
+
|
|
3
|
+
module.exports = class ConnectionHandler extends Handler {
|
|
4
|
+
async handle({ container, socket, io }) {
|
|
5
|
+
container.get("logger").info("New connection");
|
|
6
|
+
}
|
|
7
7
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const { Handler } = require("zyket");
|
|
2
|
-
|
|
3
|
-
module.exports = class MessageHandler extends Handler {
|
|
4
|
-
guards = ["default"];
|
|
5
|
-
|
|
6
|
-
async handle({ container, socket, data, io }) {
|
|
7
|
-
container.get("logger").info("Message handler");
|
|
8
|
-
}
|
|
1
|
+
const { Handler } = require("zyket");
|
|
2
|
+
|
|
3
|
+
module.exports = class MessageHandler extends Handler {
|
|
4
|
+
guards = ["default"];
|
|
5
|
+
|
|
6
|
+
async handle({ container, socket, data, io }) {
|
|
7
|
+
container.get("logger").info("Message handler");
|
|
8
|
+
}
|
|
9
9
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const { Middleware } = require("zyket");
|
|
2
|
-
|
|
3
|
-
module.exports = class DefaultMiddleware extends Middleware {
|
|
4
|
-
async handle({ container, request, response, next }) {
|
|
5
|
-
container.get("logger").info("Default middleware");
|
|
6
|
-
next();
|
|
7
|
-
}
|
|
1
|
+
const { Middleware } = require("zyket");
|
|
2
|
+
|
|
3
|
+
module.exports = class DefaultMiddleware extends Middleware {
|
|
4
|
+
async handle({ container, request, response, next }) {
|
|
5
|
+
container.get("logger").info("Default middleware");
|
|
6
|
+
next();
|
|
7
|
+
}
|
|
8
8
|
};
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
const { Route } = require("zyket");
|
|
2
|
-
const DefaultMiddleware = require("../../middlewares/default");
|
|
3
|
-
|
|
4
|
-
module.exports = class DefaultRoute extends Route {
|
|
5
|
-
middlewares = {
|
|
6
|
-
post: [ new DefaultMiddleware() ],
|
|
7
|
-
get: [ new DefaultMiddleware() ]
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async post({ container, request }) {
|
|
11
|
-
const { test } = request.params;
|
|
12
|
-
container.get("logger").info("Default route GET");
|
|
13
|
-
|
|
14
|
-
return {
|
|
15
|
-
test: "Hello World GET! Param: " + test
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async get({ container, request }) {
|
|
20
|
-
const { test } = request.params;
|
|
21
|
-
container.get("logger").info("Default route GET");
|
|
22
|
-
|
|
23
|
-
return {
|
|
24
|
-
test: "Hello World GET! Param: " + test
|
|
25
|
-
}
|
|
26
|
-
}
|
|
1
|
+
const { Route } = require("zyket");
|
|
2
|
+
const DefaultMiddleware = require("../../middlewares/default");
|
|
3
|
+
|
|
4
|
+
module.exports = class DefaultRoute extends Route {
|
|
5
|
+
middlewares = {
|
|
6
|
+
post: [ new DefaultMiddleware() ],
|
|
7
|
+
get: [ new DefaultMiddleware() ]
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async post({ container, request }) {
|
|
11
|
+
const { test } = request.params;
|
|
12
|
+
container.get("logger").info("Default route GET");
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
test: "Hello World GET! Param: " + test
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async get({ container, request }) {
|
|
20
|
+
const { test } = request.params;
|
|
21
|
+
container.get("logger").info("Default route GET");
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
test: "Hello World GET! Param: " + test
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
27
|
};
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
const { Route } = require("zyket");
|
|
2
|
-
const DefaultMiddleware = require("../middlewares/default");
|
|
3
|
-
|
|
4
|
-
module.exports = class DefaultRoute extends Route {
|
|
5
|
-
middlewares = {
|
|
6
|
-
post: [ new DefaultMiddleware() ],
|
|
7
|
-
get: [ new DefaultMiddleware() ]
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async post({ container, request }) {
|
|
11
|
-
container.get("logger").info("Default route POST");
|
|
12
|
-
return {
|
|
13
|
-
test: "Hello World POST!"
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
async get({ container, request }) {
|
|
18
|
-
container.get("logger").info("Default route GET");
|
|
19
|
-
return {
|
|
20
|
-
test: "Hello World GET!"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
1
|
+
const { Route } = require("zyket");
|
|
2
|
+
const DefaultMiddleware = require("../middlewares/default");
|
|
3
|
+
|
|
4
|
+
module.exports = class DefaultRoute extends Route {
|
|
5
|
+
middlewares = {
|
|
6
|
+
post: [ new DefaultMiddleware() ],
|
|
7
|
+
get: [ new DefaultMiddleware() ]
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async post({ container, request }) {
|
|
11
|
+
container.get("logger").info("Default route POST");
|
|
12
|
+
return {
|
|
13
|
+
test: "Hello World POST!"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async get({ container, request }) {
|
|
18
|
+
container.get("logger").info("Default route GET");
|
|
19
|
+
return {
|
|
20
|
+
test: "Hello World GET!"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
23
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const AuthService = require('./index.js');
|
|
2
|
-
|
|
3
|
-
const auth = new AuthService({
|
|
4
|
-
get: (serviceName) => {
|
|
5
|
-
}
|
|
6
|
-
});
|
|
7
|
-
|
|
1
|
+
const AuthService = require('./index.js');
|
|
2
|
+
|
|
3
|
+
const auth = new AuthService({
|
|
4
|
+
get: (serviceName) => {
|
|
5
|
+
}
|
|
6
|
+
});
|
|
7
|
+
|
|
8
8
|
module.exports = auth.auth;
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
const { AuthService } = require('zyket');
|
|
2
|
-
|
|
3
|
-
module.exports = class CustomAuthService extends AuthService {
|
|
4
|
-
#container;
|
|
5
|
-
client;
|
|
6
|
-
|
|
7
|
-
constructor(container) {
|
|
8
|
-
super(container);
|
|
9
|
-
this.#container = container;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
get userAdditionalFields() {
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
get organizationAdditionalFields() {
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async sendResetPasswordEmail({ user, url, token }, request) {
|
|
19
|
-
throw new Error("sendResetPasswordEmail method not implemented");
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async sendVerificationEmail({ user, url, token }, request) {
|
|
23
|
-
throw new Error("sendVerificationEmail method not implemented");
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async sendInvitationEmail(data) {
|
|
27
|
-
throw new Error("sendInvitationEmail method not implemented");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async allowUserToCreateOrganization(user) {
|
|
31
|
-
throw new Error("allowUserToCreateOrganization method not implemented");
|
|
32
|
-
}
|
|
1
|
+
const { AuthService } = require('zyket');
|
|
2
|
+
|
|
3
|
+
module.exports = class CustomAuthService extends AuthService {
|
|
4
|
+
#container;
|
|
5
|
+
client;
|
|
6
|
+
|
|
7
|
+
constructor(container) {
|
|
8
|
+
super(container);
|
|
9
|
+
this.#container = container;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
get userAdditionalFields() {
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get organizationAdditionalFields() {
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async sendResetPasswordEmail({ user, url, token }, request) {
|
|
19
|
+
throw new Error("sendResetPasswordEmail method not implemented");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async sendVerificationEmail({ user, url, token }, request) {
|
|
23
|
+
throw new Error("sendVerificationEmail method not implemented");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async sendInvitationEmail(data) {
|
|
27
|
+
throw new Error("sendInvitationEmail method not implemented");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async allowUserToCreateOrganization(user) {
|
|
31
|
+
throw new Error("allowUserToCreateOrganization method not implemented");
|
|
32
|
+
}
|
|
33
33
|
}
|
package/src/utils/EnvManager.js
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
|
|
3
|
-
module.exports = class EnvManager {
|
|
4
|
-
static load(secretsPath) {
|
|
5
|
-
this.createEnvFile(secretsPath);
|
|
6
|
-
require("dotenv").config({ path: secretsPath });
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
static createEnvFile(secretsPath, overwrite = false) {
|
|
10
|
-
if (fs.existsSync(secretsPath) && !overwrite) return;
|
|
11
|
-
fs.writeFileSync(secretsPath, this.getDefaultSecrets());
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
static getDefaultSecrets() {
|
|
15
|
-
const header = `# Zyket Environment Configuration
|
|
16
|
-
# CACHE_URL: Leave empty or set to 'memory' for in-memory cache, or 'redis://localhost:6379' for Redis
|
|
17
|
-
`;
|
|
18
|
-
const envsToCreate = {
|
|
19
|
-
DEBUG: true,
|
|
20
|
-
PORT: 3000,
|
|
21
|
-
DISABLE_SOCKET: true,
|
|
22
|
-
DISABLE_EXPRESS: false,
|
|
23
|
-
DISABLE_EVENTS: true,
|
|
24
|
-
DISABLE_BULLMQ: true,
|
|
25
|
-
DISABLE_SCHEDULER: true,
|
|
26
|
-
DATABASE_URL: './database.sqlite',
|
|
27
|
-
DATABASE_DIALECT: 'sqlite',
|
|
28
|
-
CACHE_URL: '',
|
|
29
|
-
S3_ENDPOINT: '',
|
|
30
|
-
S3_PORT: '',
|
|
31
|
-
S3_USE_SSL: true,
|
|
32
|
-
S3_ACCESS_KEY: '',
|
|
33
|
-
S3_SECRET_KEY: '',
|
|
34
|
-
LOG_DIRECTORY: "./logs",
|
|
35
|
-
QUEUES: '',
|
|
36
|
-
VITE_ROOT: './frontend',
|
|
37
|
-
VITE_PORT: 5173,
|
|
38
|
-
DISABLE_VITE: true,
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return header + Object.entries(envsToCreate).reduce((acc, [key, value]) => {
|
|
42
|
-
return `${acc}${key}=${value}\n`;
|
|
43
|
-
}, "");
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
static addEnvVariable(secretsPath, key, value) {
|
|
47
|
-
// Create env file if it doesn't exist
|
|
48
|
-
if (!fs.existsSync(secretsPath)) {
|
|
49
|
-
this.createEnvFile(secretsPath);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Read existing content
|
|
53
|
-
let envContent = fs.readFileSync(secretsPath, 'utf-8');
|
|
54
|
-
|
|
55
|
-
// Check if the key already exists
|
|
56
|
-
const keyRegex = new RegExp(`^${key}=.*$`, 'm');
|
|
57
|
-
if (keyRegex.test(envContent)) {
|
|
58
|
-
return false; // Key already exists
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Add the new environment variable
|
|
62
|
-
envContent += `${key}=${value}\n`;
|
|
63
|
-
fs.writeFileSync(secretsPath, envContent);
|
|
64
|
-
return true; // Key added successfully
|
|
65
|
-
}
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
|
|
3
|
+
module.exports = class EnvManager {
|
|
4
|
+
static load(secretsPath) {
|
|
5
|
+
this.createEnvFile(secretsPath);
|
|
6
|
+
require("dotenv").config({ path: secretsPath });
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
static createEnvFile(secretsPath, overwrite = false) {
|
|
10
|
+
if (fs.existsSync(secretsPath) && !overwrite) return;
|
|
11
|
+
fs.writeFileSync(secretsPath, this.getDefaultSecrets());
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
static getDefaultSecrets() {
|
|
15
|
+
const header = `# Zyket Environment Configuration
|
|
16
|
+
# CACHE_URL: Leave empty or set to 'memory' for in-memory cache, or 'redis://localhost:6379' for Redis
|
|
17
|
+
`;
|
|
18
|
+
const envsToCreate = {
|
|
19
|
+
DEBUG: true,
|
|
20
|
+
PORT: 3000,
|
|
21
|
+
DISABLE_SOCKET: true,
|
|
22
|
+
DISABLE_EXPRESS: false,
|
|
23
|
+
DISABLE_EVENTS: true,
|
|
24
|
+
DISABLE_BULLMQ: true,
|
|
25
|
+
DISABLE_SCHEDULER: true,
|
|
26
|
+
DATABASE_URL: './database.sqlite',
|
|
27
|
+
DATABASE_DIALECT: 'sqlite',
|
|
28
|
+
CACHE_URL: '',
|
|
29
|
+
S3_ENDPOINT: '',
|
|
30
|
+
S3_PORT: '',
|
|
31
|
+
S3_USE_SSL: true,
|
|
32
|
+
S3_ACCESS_KEY: '',
|
|
33
|
+
S3_SECRET_KEY: '',
|
|
34
|
+
LOG_DIRECTORY: "./logs",
|
|
35
|
+
QUEUES: '',
|
|
36
|
+
VITE_ROOT: './frontend',
|
|
37
|
+
VITE_PORT: 5173,
|
|
38
|
+
DISABLE_VITE: true,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return header + Object.entries(envsToCreate).reduce((acc, [key, value]) => {
|
|
42
|
+
return `${acc}${key}=${value}\n`;
|
|
43
|
+
}, "");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static addEnvVariable(secretsPath, key, value) {
|
|
47
|
+
// Create env file if it doesn't exist
|
|
48
|
+
if (!fs.existsSync(secretsPath)) {
|
|
49
|
+
this.createEnvFile(secretsPath);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Read existing content
|
|
53
|
+
let envContent = fs.readFileSync(secretsPath, 'utf-8');
|
|
54
|
+
|
|
55
|
+
// Check if the key already exists
|
|
56
|
+
const keyRegex = new RegExp(`^${key}=.*$`, 'm');
|
|
57
|
+
if (keyRegex.test(envContent)) {
|
|
58
|
+
return false; // Key already exists
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Add the new environment variable
|
|
62
|
+
envContent += `${key}=${value}\n`;
|
|
63
|
+
fs.writeFileSync(secretsPath, envContent);
|
|
64
|
+
return true; // Key added successfully
|
|
65
|
+
}
|
|
66
66
|
}
|