hereya-cli 0.13.1 → 0.14.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 +19 -19
- package/dist/commands/add/index.js +124 -67
- package/dist/commands/deploy/index.js +258 -95
- package/dist/commands/down/index.js +132 -58
- package/dist/commands/remove/index.js +114 -61
- package/dist/commands/undeploy/index.js +179 -51
- package/dist/commands/up/index.js +195 -103
- package/dist/infrastructure/index.d.ts +1 -0
- package/dist/lib/log.js +4 -20
- package/dist/lib/package/common.d.ts +2 -0
- package/dist/lib/package/github.d.ts +1 -0
- package/dist/lib/package/github.js +31 -2
- package/dist/lib/package/index.js +4 -19
- package/dist/lib/shell.d.ts +1 -0
- package/dist/lib/shell.js +8 -0
- package/oclif.manifest.json +40 -40
- package/package.json +3 -3
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { Listr, ListrLogLevels, ListrLogger } from 'listr2';
|
|
2
3
|
import { getBackend } from '../../backend/index.js';
|
|
3
4
|
import { destroyPackage, provisionPackage } from '../../infrastructure/index.js';
|
|
4
5
|
import { getConfigManager } from '../../lib/config/index.js';
|
|
5
6
|
import { getEnvManager } from '../../lib/env/index.js';
|
|
6
|
-
import { getLogger } from '../../lib/log.js';
|
|
7
7
|
import { getParameterManager } from '../../lib/parameter/index.js';
|
|
8
|
-
import { setDebug } from '../../lib/shell.js';
|
|
8
|
+
import { delay, setDebug } from '../../lib/shell.js';
|
|
9
9
|
export default class Up extends Command {
|
|
10
10
|
static description = 'Provision all packages in the project.';
|
|
11
11
|
static examples = ['<%= config.bin %> <%= command.id %>'];
|
|
@@ -31,109 +31,201 @@ export default class Up extends Command {
|
|
|
31
31
|
async run() {
|
|
32
32
|
const { flags } = await this.parse(Up);
|
|
33
33
|
setDebug(flags.debug);
|
|
34
|
-
const logger = getLogger();
|
|
35
34
|
const projectRootDir = flags.chdir || process.env.HEREYA_PROJECT_ROOT_DIR;
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
const myLogger = new ListrLogger({ useIcons: false });
|
|
36
|
+
const task = new Listr([
|
|
37
|
+
{
|
|
38
|
+
async task(ctx, task) {
|
|
39
|
+
return task.newListr([
|
|
40
|
+
{
|
|
41
|
+
async task(ctx) {
|
|
42
|
+
const configManager = getConfigManager();
|
|
43
|
+
const loadConfigOutput = await configManager.loadConfig({ projectRootDir });
|
|
44
|
+
if (!loadConfigOutput.found) {
|
|
45
|
+
throw new Error("Project not initialized. Run 'hereya init' first.");
|
|
46
|
+
}
|
|
47
|
+
ctx.configOutput = loadConfigOutput;
|
|
48
|
+
await delay(500);
|
|
49
|
+
},
|
|
50
|
+
title: 'Loading project config',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
async task(ctx) {
|
|
54
|
+
const backend = await getBackend();
|
|
55
|
+
const workspace = flags.workspace || ctx.configOutput.config.workspace;
|
|
56
|
+
const getWorkspaceEnvOutput = await backend.getWorkspaceEnv({
|
|
57
|
+
project: ctx.configOutput.config.project,
|
|
58
|
+
workspace,
|
|
59
|
+
});
|
|
60
|
+
if (!getWorkspaceEnvOutput.success) {
|
|
61
|
+
throw new Error(getWorkspaceEnvOutput.reason);
|
|
62
|
+
}
|
|
63
|
+
ctx.workspaceEnvOutput = getWorkspaceEnvOutput;
|
|
64
|
+
ctx.workspace = workspace;
|
|
65
|
+
await delay(500);
|
|
66
|
+
},
|
|
67
|
+
title: 'Loading workspace environment variables',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
async task(ctx) {
|
|
71
|
+
const backend = await getBackend();
|
|
72
|
+
const savedStateOutput = await backend.getState({
|
|
73
|
+
project: ctx.configOutput.config.project,
|
|
74
|
+
});
|
|
75
|
+
if (savedStateOutput.found) {
|
|
76
|
+
ctx.savedStateOutput = savedStateOutput;
|
|
77
|
+
}
|
|
78
|
+
await delay(500);
|
|
79
|
+
},
|
|
80
|
+
title: 'Loading project current state',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
async task(ctx) {
|
|
84
|
+
const packages = Object.keys(ctx.configOutput.config.packages ?? {});
|
|
85
|
+
const savedPackages = Object.keys(ctx.savedStateOutput?.config?.packages ?? {});
|
|
86
|
+
const removedPackages = savedPackages.filter((packageName) => !packages.includes(packageName));
|
|
87
|
+
ctx.removedPackages = removedPackages;
|
|
88
|
+
ctx.packages = packages;
|
|
89
|
+
await delay(500);
|
|
90
|
+
},
|
|
91
|
+
title: 'Searching for removed packages',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
skip: (ctx) => !ctx.removedPackages || ctx.removedPackages.length === 0,
|
|
95
|
+
async task(ctx) {
|
|
96
|
+
const { configOutput, removed, removedPackages, workspace, workspaceEnvOutput } = ctx;
|
|
97
|
+
if (!removedPackages || removedPackages.length === 0) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
return task.newListr(removedPackages.map((packageName) => ({
|
|
101
|
+
async task() {
|
|
102
|
+
const parameterManager = getParameterManager();
|
|
103
|
+
const { parameters } = await parameterManager.getPackageParameters({
|
|
104
|
+
package: packageName,
|
|
105
|
+
projectRootDir,
|
|
106
|
+
workspace,
|
|
107
|
+
});
|
|
108
|
+
const destroyOutput = await destroyPackage({
|
|
109
|
+
env: workspaceEnvOutput.env,
|
|
110
|
+
isDeploying: flags.deploy,
|
|
111
|
+
package: packageName,
|
|
112
|
+
parameters,
|
|
113
|
+
project: configOutput.config.project,
|
|
114
|
+
workspace,
|
|
115
|
+
});
|
|
116
|
+
if (!destroyOutput.success) {
|
|
117
|
+
throw new Error(destroyOutput.reason);
|
|
118
|
+
}
|
|
119
|
+
const { env, metadata } = destroyOutput;
|
|
120
|
+
const output = removed || [];
|
|
121
|
+
output.push({ env, metadata, packageName });
|
|
122
|
+
ctx.removed = output;
|
|
123
|
+
},
|
|
124
|
+
title: `Destroying ${packageName}`,
|
|
125
|
+
})), { concurrent: true });
|
|
126
|
+
},
|
|
127
|
+
title: `Destroying removed packages`,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
skip: (ctx) => !ctx.packages || ctx.packages.length === 0,
|
|
131
|
+
async task(ctx) {
|
|
132
|
+
if (!ctx.packages || ctx.packages.length === 0) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
return task.newListr(ctx.packages.map((packageName) => ({
|
|
136
|
+
async task() {
|
|
137
|
+
const parameterManager = getParameterManager();
|
|
138
|
+
const { parameters } = await parameterManager.getPackageParameters({
|
|
139
|
+
package: packageName,
|
|
140
|
+
projectRootDir,
|
|
141
|
+
workspace: ctx.workspace,
|
|
142
|
+
});
|
|
143
|
+
const provisionOutput = await provisionPackage({
|
|
144
|
+
env: ctx.workspaceEnvOutput.env,
|
|
145
|
+
isDeploying: flags.deploy,
|
|
146
|
+
package: packageName,
|
|
147
|
+
parameters,
|
|
148
|
+
project: ctx.configOutput.config.project,
|
|
149
|
+
workspace: ctx.workspace,
|
|
150
|
+
});
|
|
151
|
+
if (!provisionOutput.success) {
|
|
152
|
+
throw new Error(provisionOutput.reason);
|
|
153
|
+
}
|
|
154
|
+
const { env, metadata } = provisionOutput;
|
|
155
|
+
const output = ctx.added || [];
|
|
156
|
+
output.push({ env, metadata, packageName });
|
|
157
|
+
ctx.added = output;
|
|
158
|
+
},
|
|
159
|
+
title: `Provisioning ${packageName}`,
|
|
160
|
+
})), { concurrent: true });
|
|
161
|
+
},
|
|
162
|
+
title: `Provisioning packages`,
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
skip: (ctx) => !ctx.removed || ctx.removed.length === 0,
|
|
166
|
+
async task(ctx) {
|
|
167
|
+
const { removed, workspace } = ctx;
|
|
168
|
+
if (!removed || removed.length === 0) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const envManager = getEnvManager();
|
|
172
|
+
for (const { env, metadata } of removed) {
|
|
173
|
+
// eslint-disable-next-line no-await-in-loop
|
|
174
|
+
await Promise.all([
|
|
175
|
+
envManager.removeProjectEnv({
|
|
176
|
+
env,
|
|
177
|
+
infra: metadata.originalInfra ?? metadata.infra,
|
|
178
|
+
projectRootDir,
|
|
179
|
+
workspace,
|
|
180
|
+
}),
|
|
181
|
+
]);
|
|
182
|
+
}
|
|
183
|
+
await delay(500);
|
|
184
|
+
},
|
|
185
|
+
title: 'Removing env vars from removed packages',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
skip: (ctx) => !ctx.added || ctx.added.length === 0,
|
|
189
|
+
async task(ctx) {
|
|
190
|
+
if (!ctx.added || ctx.added.length === 0) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const envManager = getEnvManager();
|
|
194
|
+
for (const { env, metadata } of ctx.added) {
|
|
195
|
+
// eslint-disable-next-line no-await-in-loop
|
|
196
|
+
await envManager.addProjectEnv({
|
|
197
|
+
env,
|
|
198
|
+
infra: metadata.originalInfra ?? metadata.infra,
|
|
199
|
+
projectRootDir,
|
|
200
|
+
workspace: ctx.workspace,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
await delay(500);
|
|
204
|
+
},
|
|
205
|
+
title: 'Adding env vars from added packages',
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
async task() {
|
|
209
|
+
const backend = await getBackend();
|
|
210
|
+
const configManager = getConfigManager();
|
|
211
|
+
const { config: newConfig } = await configManager.loadConfig({ projectRootDir });
|
|
212
|
+
await backend.saveState(newConfig);
|
|
213
|
+
await delay(500);
|
|
214
|
+
},
|
|
215
|
+
title: 'Saving state',
|
|
216
|
+
},
|
|
217
|
+
], { concurrent: false });
|
|
218
|
+
},
|
|
219
|
+
title: 'Waking up the project',
|
|
220
|
+
},
|
|
221
|
+
]);
|
|
222
|
+
try {
|
|
223
|
+
await task.run();
|
|
224
|
+
myLogger.log(ListrLogLevels.COMPLETED, 'Project waked up successfully');
|
|
41
225
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const savedStateOutput = await backend.getState({
|
|
46
|
-
project: config.project,
|
|
47
|
-
});
|
|
48
|
-
let savedPackages = [];
|
|
49
|
-
if (savedStateOutput.found) {
|
|
50
|
-
savedPackages = Object.keys(savedStateOutput.config.packages ?? {});
|
|
226
|
+
catch (error) {
|
|
227
|
+
myLogger.log(ListrLogLevels.FAILED, error);
|
|
228
|
+
this.error(error.message);
|
|
51
229
|
}
|
|
52
|
-
const removedPackages = savedPackages.filter((packageName) => !packages.includes(packageName));
|
|
53
|
-
const workspace = flags.workspace || config.workspace;
|
|
54
|
-
const getWorkspaceEnvOutput = await backend.getWorkspaceEnv({
|
|
55
|
-
project: config.project,
|
|
56
|
-
workspace,
|
|
57
|
-
});
|
|
58
|
-
if (!getWorkspaceEnvOutput.success) {
|
|
59
|
-
this.error(getWorkspaceEnvOutput.reason);
|
|
60
|
-
}
|
|
61
|
-
const { env: workspaceEnv } = getWorkspaceEnvOutput;
|
|
62
|
-
const parameterManager = getParameterManager();
|
|
63
|
-
if (removedPackages.length > 0) {
|
|
64
|
-
logger.log(`Destroying ${removedPackages.length} removed packages`);
|
|
65
|
-
}
|
|
66
|
-
const removed = await Promise.all(removedPackages.map(async (packageName) => {
|
|
67
|
-
const { parameters } = await parameterManager.getPackageParameters({
|
|
68
|
-
package: packageName,
|
|
69
|
-
projectRootDir,
|
|
70
|
-
workspace,
|
|
71
|
-
});
|
|
72
|
-
const destroyOutput = await destroyPackage({
|
|
73
|
-
env: workspaceEnv,
|
|
74
|
-
isDeploying: flags.deploy,
|
|
75
|
-
package: packageName,
|
|
76
|
-
parameters,
|
|
77
|
-
project: config.project,
|
|
78
|
-
workspace,
|
|
79
|
-
});
|
|
80
|
-
if (!destroyOutput.success) {
|
|
81
|
-
this.error(destroyOutput.reason);
|
|
82
|
-
}
|
|
83
|
-
const { env, metadata } = destroyOutput;
|
|
84
|
-
return { env, metadata, packageName };
|
|
85
|
-
}));
|
|
86
|
-
if (removedPackages.length > 0) {
|
|
87
|
-
logger.done(`Destroyed ${removedPackages.length} removed packages`);
|
|
88
|
-
}
|
|
89
|
-
logger.log(`Provisioning ${packages.length} packages`);
|
|
90
|
-
const added = await Promise.all(packages.map(async (packageName) => {
|
|
91
|
-
const { parameters } = await parameterManager.getPackageParameters({
|
|
92
|
-
package: packageName,
|
|
93
|
-
projectRootDir,
|
|
94
|
-
workspace,
|
|
95
|
-
});
|
|
96
|
-
const provisionOutput = await provisionPackage({
|
|
97
|
-
env: workspaceEnv,
|
|
98
|
-
isDeploying: flags.deploy,
|
|
99
|
-
package: packageName,
|
|
100
|
-
parameters,
|
|
101
|
-
project: config.project,
|
|
102
|
-
workspace,
|
|
103
|
-
});
|
|
104
|
-
if (!provisionOutput.success) {
|
|
105
|
-
this.error(provisionOutput.reason);
|
|
106
|
-
}
|
|
107
|
-
const { env, metadata } = provisionOutput;
|
|
108
|
-
return { env, metadata, packageName };
|
|
109
|
-
}));
|
|
110
|
-
logger.done(`Provisioned ${packages.length} packages`);
|
|
111
|
-
const envManager = getEnvManager();
|
|
112
|
-
for (const { env, metadata } of removed) {
|
|
113
|
-
// eslint-disable-next-line no-await-in-loop
|
|
114
|
-
await Promise.all([
|
|
115
|
-
envManager.removeProjectEnv({
|
|
116
|
-
env,
|
|
117
|
-
infra: metadata.originalInfra ?? metadata.infra,
|
|
118
|
-
projectRootDir,
|
|
119
|
-
workspace,
|
|
120
|
-
}),
|
|
121
|
-
]);
|
|
122
|
-
}
|
|
123
|
-
if (removedPackages.length > 0) {
|
|
124
|
-
logger.done(`Removed env vars from ${removedPackages.length} removed packages`);
|
|
125
|
-
}
|
|
126
|
-
for (const { env, metadata } of added) {
|
|
127
|
-
// eslint-disable-next-line no-await-in-loop
|
|
128
|
-
await envManager.addProjectEnv({
|
|
129
|
-
env,
|
|
130
|
-
infra: metadata.originalInfra ?? metadata.infra,
|
|
131
|
-
projectRootDir,
|
|
132
|
-
workspace,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
logger.done('Saved exported environment variables');
|
|
136
|
-
const { config: newConfig } = await configManager.loadConfig({ projectRootDir });
|
|
137
|
-
await backend.saveState(newConfig);
|
|
138
230
|
}
|
|
139
231
|
}
|
package/dist/lib/log.js
CHANGED
|
@@ -1,27 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
let spinner = null;
|
|
1
|
+
import { ListrLogLevels, ListrLogger } from 'listr2';
|
|
2
|
+
const myLogger = new ListrLogger({ useIcons: false });
|
|
4
3
|
const logger = {
|
|
5
4
|
done(message) {
|
|
6
|
-
|
|
7
|
-
spinner = ora({
|
|
8
|
-
spinner: cliSpinners.aesthetic,
|
|
9
|
-
text: message,
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
spinner.succeed(message);
|
|
13
|
-
spinner = null;
|
|
5
|
+
myLogger.log(ListrLogLevels.COMPLETED, message);
|
|
14
6
|
},
|
|
15
7
|
log(message) {
|
|
16
|
-
|
|
17
|
-
spinner.text = message;
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
spinner = ora({
|
|
21
|
-
spinner: cliSpinners.aesthetic,
|
|
22
|
-
text: message,
|
|
23
|
-
});
|
|
24
|
-
spinner.start();
|
|
8
|
+
myLogger.log(ListrLogLevels.OUTPUT, message);
|
|
25
9
|
},
|
|
26
10
|
};
|
|
27
11
|
export function getLogger() {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export interface PackageManager {
|
|
2
|
+
downloadPackage: (pkgUrl: string, destPath: string) => Promise<string>;
|
|
2
3
|
getRepoContent: (input: GetRepoContentInput) => Promise<GetRepoContentOutput>;
|
|
3
4
|
}
|
|
4
5
|
export type GetRepoContentInput = {
|
|
@@ -9,6 +10,7 @@ export type GetRepoContentInput = {
|
|
|
9
10
|
export type GetRepoContentOutput = {
|
|
10
11
|
content: string;
|
|
11
12
|
found: true;
|
|
13
|
+
pkgUrl: string;
|
|
12
14
|
} | {
|
|
13
15
|
found: false;
|
|
14
16
|
reason: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GetRepoContentInput, GetRepoContentOutput, PackageManager } from './common.js';
|
|
2
2
|
export declare class GitHubPackageManager implements PackageManager {
|
|
3
|
+
downloadPackage(pkgUrl: string, destPath: string): Promise<string>;
|
|
3
4
|
getRepoContent({ owner, path: filePath, repo }: GetRepoContentInput): Promise<GetRepoContentOutput>;
|
|
4
5
|
}
|
|
@@ -1,13 +1,33 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
1
7
|
import fs from 'node:fs/promises';
|
|
2
8
|
import os from 'node:os';
|
|
3
9
|
import path from 'node:path';
|
|
4
|
-
import {
|
|
10
|
+
import { simpleGit } from 'simple-git';
|
|
11
|
+
import { BackOffPolicy, Retryable } from 'typescript-retry-decorator';
|
|
12
|
+
import { isNotEmpty } from '../filesystem.js';
|
|
5
13
|
export class GitHubPackageManager {
|
|
14
|
+
// eslint-disable-next-line new-cap
|
|
15
|
+
async downloadPackage(pkgUrl, destPath) {
|
|
16
|
+
if (await isNotEmpty(destPath)) {
|
|
17
|
+
return destPath;
|
|
18
|
+
}
|
|
19
|
+
await fs.mkdir(destPath, { recursive: true });
|
|
20
|
+
// Initialize simple-git
|
|
21
|
+
const git = simpleGit();
|
|
22
|
+
// Clone repository into temp directory
|
|
23
|
+
await git.clone(pkgUrl, destPath, ['--depth=1']);
|
|
24
|
+
return destPath;
|
|
25
|
+
}
|
|
6
26
|
async getRepoContent({ owner, path: filePath, repo }) {
|
|
7
27
|
const pkgUrl = `https://github.com/${owner}/${repo}`;
|
|
8
28
|
const tmpFolder = path.join(os.tmpdir(), 'hereya', 'github', owner, repo);
|
|
9
29
|
try {
|
|
10
|
-
const destPath = await downloadPackage(pkgUrl, tmpFolder);
|
|
30
|
+
const destPath = await this.downloadPackage(pkgUrl, tmpFolder);
|
|
11
31
|
if (await fs.stat(path.join(destPath, filePath))) {
|
|
12
32
|
const content = await fs.readFile(path.join(destPath, filePath), 'utf8');
|
|
13
33
|
// remove the tmp folder
|
|
@@ -15,6 +35,7 @@ export class GitHubPackageManager {
|
|
|
15
35
|
return {
|
|
16
36
|
content,
|
|
17
37
|
found: true,
|
|
38
|
+
pkgUrl,
|
|
18
39
|
};
|
|
19
40
|
}
|
|
20
41
|
return {
|
|
@@ -30,3 +51,11 @@ export class GitHubPackageManager {
|
|
|
30
51
|
}
|
|
31
52
|
}
|
|
32
53
|
}
|
|
54
|
+
__decorate([
|
|
55
|
+
Retryable({
|
|
56
|
+
backOff: 1000,
|
|
57
|
+
backOffPolicy: BackOffPolicy.ExponentialBackOffPolicy,
|
|
58
|
+
exponentialOption: { maxInterval: 4000, multiplier: 3 },
|
|
59
|
+
maxAttempts: 3,
|
|
60
|
+
})
|
|
61
|
+
], GitHubPackageManager.prototype, "downloadPackage", null);
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import * as fs from 'node:fs/promises';
|
|
2
|
-
import { simpleGit } from 'simple-git';
|
|
3
1
|
import * as yaml from 'yaml';
|
|
4
2
|
import { z } from 'zod';
|
|
5
3
|
import { IacType } from '../../iac/common.js';
|
|
6
4
|
import { InfrastructureType } from '../../infrastructure/common.js';
|
|
7
|
-
import { isNotEmpty } from '../filesystem.js';
|
|
8
5
|
import { GitHubPackageManager } from './github.js';
|
|
9
6
|
export const packageManager = new GitHubPackageManager();
|
|
10
7
|
export function getPackageManager() {
|
|
@@ -16,14 +13,13 @@ export async function resolvePackage(input) {
|
|
|
16
13
|
return { found: false, reason: 'Invalid package format. Use owner/repository' };
|
|
17
14
|
}
|
|
18
15
|
const [owner, repo] = pkgParts;
|
|
19
|
-
const pkgUrl = `https://github.com/${input.package}`;
|
|
20
16
|
const packageManager = getPackageManager();
|
|
21
17
|
const metadataContentCandidates = (await Promise.all([
|
|
22
18
|
packageManager.getRepoContent({ owner, path: 'hereyarc.yaml', repo }),
|
|
23
19
|
packageManager.getRepoContent({ owner, path: 'hereyarc.yml', repo }),
|
|
24
20
|
])).filter((content$) => content$.found);
|
|
25
21
|
if (metadataContentCandidates.length === 0) {
|
|
26
|
-
return { found: false, reason: `No hereya metadata file found in ${
|
|
22
|
+
return { found: false, reason: `No hereya metadata file found in ${input.package}` };
|
|
27
23
|
}
|
|
28
24
|
const metadataContent$ = metadataContentCandidates[0];
|
|
29
25
|
try {
|
|
@@ -34,15 +30,11 @@ export async function resolvePackage(input) {
|
|
|
34
30
|
if (input.isDeploying && metadata.onDeploy) {
|
|
35
31
|
return resolvePackage({ package: metadata.onDeploy.pkg });
|
|
36
32
|
}
|
|
37
|
-
// if (process.env.HEREYA_OVERRIDE_INFRA) {
|
|
38
|
-
// metadata.originalInfra = metadata.infra
|
|
39
|
-
// metadata.infra = process.env.HEREYA_OVERRIDE_INFRA as InfrastructureType
|
|
40
|
-
// }
|
|
41
33
|
return {
|
|
42
34
|
canonicalName: getPackageCanonicalName(input.package),
|
|
43
35
|
found: true,
|
|
44
36
|
metadata,
|
|
45
|
-
packageUri: pkgUrl,
|
|
37
|
+
packageUri: metadataContent$.pkgUrl,
|
|
46
38
|
pkgName: input.package,
|
|
47
39
|
};
|
|
48
40
|
}
|
|
@@ -54,15 +46,8 @@ export function getPackageCanonicalName(packageName) {
|
|
|
54
46
|
return packageName.replace('/', '-');
|
|
55
47
|
}
|
|
56
48
|
export async function downloadPackage(pkgUrl, destPath) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
await fs.mkdir(destPath, { recursive: true });
|
|
61
|
-
// Initialize simple-git
|
|
62
|
-
const git = simpleGit();
|
|
63
|
-
// Clone repository into temp directory
|
|
64
|
-
await git.clone(pkgUrl, destPath, ['--depth=1']);
|
|
65
|
-
return destPath;
|
|
49
|
+
const packageManager = getPackageManager();
|
|
50
|
+
return packageManager.downloadPackage(pkgUrl, destPath);
|
|
66
51
|
}
|
|
67
52
|
export const PackageMetadata = z.object({
|
|
68
53
|
dependencies: z.record(z.string()).optional(),
|
package/dist/lib/shell.d.ts
CHANGED
package/dist/lib/shell.js
CHANGED
package/oclif.manifest.json
CHANGED
|
@@ -768,26 +768,51 @@
|
|
|
768
768
|
"index.js"
|
|
769
769
|
]
|
|
770
770
|
},
|
|
771
|
-
"workspace:env:
|
|
771
|
+
"workspace:env:set": {
|
|
772
772
|
"aliases": [],
|
|
773
773
|
"args": {},
|
|
774
|
-
"description": "
|
|
774
|
+
"description": "set an env var for a workspace",
|
|
775
775
|
"examples": [
|
|
776
|
-
"<%= config.bin %> <%= command.id %> -w my-workspace -n myVar"
|
|
776
|
+
"<%= config.bin %> <%= command.id %> -w my-workspace -n myVar -v my-value -i aws -s"
|
|
777
777
|
],
|
|
778
778
|
"flags": {
|
|
779
|
+
"infra": {
|
|
780
|
+
"char": "i",
|
|
781
|
+
"description": "the infrastructure to store the env var in",
|
|
782
|
+
"name": "infra",
|
|
783
|
+
"required": true,
|
|
784
|
+
"hasDynamicHelp": false,
|
|
785
|
+
"multiple": false,
|
|
786
|
+
"type": "option"
|
|
787
|
+
},
|
|
779
788
|
"name": {
|
|
780
789
|
"char": "n",
|
|
781
|
-
"description": "name of the env var to
|
|
790
|
+
"description": "name of the env var to set",
|
|
782
791
|
"name": "name",
|
|
783
792
|
"required": true,
|
|
784
793
|
"hasDynamicHelp": false,
|
|
785
794
|
"multiple": false,
|
|
786
795
|
"type": "option"
|
|
787
796
|
},
|
|
797
|
+
"sensitive": {
|
|
798
|
+
"char": "s",
|
|
799
|
+
"description": "whether the env var is sensitive",
|
|
800
|
+
"name": "sensitive",
|
|
801
|
+
"allowNo": false,
|
|
802
|
+
"type": "boolean"
|
|
803
|
+
},
|
|
804
|
+
"value": {
|
|
805
|
+
"char": "v",
|
|
806
|
+
"description": "value of the env var to set",
|
|
807
|
+
"name": "value",
|
|
808
|
+
"required": true,
|
|
809
|
+
"hasDynamicHelp": false,
|
|
810
|
+
"multiple": false,
|
|
811
|
+
"type": "option"
|
|
812
|
+
},
|
|
788
813
|
"workspace": {
|
|
789
814
|
"char": "w",
|
|
790
|
-
"description": "name of the workspace to
|
|
815
|
+
"description": "name of the workspace to set an env var for",
|
|
791
816
|
"name": "workspace",
|
|
792
817
|
"required": true,
|
|
793
818
|
"hasDynamicHelp": false,
|
|
@@ -797,7 +822,7 @@
|
|
|
797
822
|
},
|
|
798
823
|
"hasDynamicHelp": false,
|
|
799
824
|
"hiddenAliases": [],
|
|
800
|
-
"id": "workspace:env:
|
|
825
|
+
"id": "workspace:env:set",
|
|
801
826
|
"pluginAlias": "hereya-cli",
|
|
802
827
|
"pluginName": "hereya-cli",
|
|
803
828
|
"pluginType": "core",
|
|
@@ -809,55 +834,30 @@
|
|
|
809
834
|
"commands",
|
|
810
835
|
"workspace",
|
|
811
836
|
"env",
|
|
812
|
-
"
|
|
837
|
+
"set",
|
|
813
838
|
"index.js"
|
|
814
839
|
]
|
|
815
840
|
},
|
|
816
|
-
"workspace:env:
|
|
841
|
+
"workspace:env:unset": {
|
|
817
842
|
"aliases": [],
|
|
818
843
|
"args": {},
|
|
819
|
-
"description": "
|
|
844
|
+
"description": "unset an env var for a workspace",
|
|
820
845
|
"examples": [
|
|
821
|
-
"<%= config.bin %> <%= command.id %> -w my-workspace -n myVar
|
|
846
|
+
"<%= config.bin %> <%= command.id %> -w my-workspace -n myVar"
|
|
822
847
|
],
|
|
823
848
|
"flags": {
|
|
824
|
-
"infra": {
|
|
825
|
-
"char": "i",
|
|
826
|
-
"description": "the infrastructure to store the env var in",
|
|
827
|
-
"name": "infra",
|
|
828
|
-
"required": true,
|
|
829
|
-
"hasDynamicHelp": false,
|
|
830
|
-
"multiple": false,
|
|
831
|
-
"type": "option"
|
|
832
|
-
},
|
|
833
849
|
"name": {
|
|
834
850
|
"char": "n",
|
|
835
|
-
"description": "name of the env var to
|
|
851
|
+
"description": "name of the env var to unset",
|
|
836
852
|
"name": "name",
|
|
837
853
|
"required": true,
|
|
838
854
|
"hasDynamicHelp": false,
|
|
839
855
|
"multiple": false,
|
|
840
856
|
"type": "option"
|
|
841
857
|
},
|
|
842
|
-
"sensitive": {
|
|
843
|
-
"char": "s",
|
|
844
|
-
"description": "whether the env var is sensitive",
|
|
845
|
-
"name": "sensitive",
|
|
846
|
-
"allowNo": false,
|
|
847
|
-
"type": "boolean"
|
|
848
|
-
},
|
|
849
|
-
"value": {
|
|
850
|
-
"char": "v",
|
|
851
|
-
"description": "value of the env var to set",
|
|
852
|
-
"name": "value",
|
|
853
|
-
"required": true,
|
|
854
|
-
"hasDynamicHelp": false,
|
|
855
|
-
"multiple": false,
|
|
856
|
-
"type": "option"
|
|
857
|
-
},
|
|
858
858
|
"workspace": {
|
|
859
859
|
"char": "w",
|
|
860
|
-
"description": "name of the workspace to
|
|
860
|
+
"description": "name of the workspace to unset an env var for",
|
|
861
861
|
"name": "workspace",
|
|
862
862
|
"required": true,
|
|
863
863
|
"hasDynamicHelp": false,
|
|
@@ -867,7 +867,7 @@
|
|
|
867
867
|
},
|
|
868
868
|
"hasDynamicHelp": false,
|
|
869
869
|
"hiddenAliases": [],
|
|
870
|
-
"id": "workspace:env:
|
|
870
|
+
"id": "workspace:env:unset",
|
|
871
871
|
"pluginAlias": "hereya-cli",
|
|
872
872
|
"pluginName": "hereya-cli",
|
|
873
873
|
"pluginType": "core",
|
|
@@ -879,10 +879,10 @@
|
|
|
879
879
|
"commands",
|
|
880
880
|
"workspace",
|
|
881
881
|
"env",
|
|
882
|
-
"
|
|
882
|
+
"unset",
|
|
883
883
|
"index.js"
|
|
884
884
|
]
|
|
885
885
|
}
|
|
886
886
|
},
|
|
887
|
-
"version": "0.
|
|
887
|
+
"version": "0.14.0"
|
|
888
888
|
}
|