pypeline 1.3.0 → 1.3.1
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/lib/commands/pypeline/init.d.ts +9 -0
- package/lib/commands/pypeline/init.js +125 -74
- package/lib/commands/pypeline/init.js.map +1 -1
- package/lib/config.d.ts +6 -0
- package/lib/config.js +22 -1
- package/lib/config.js.map +1 -1
- package/messages/pypeline.init.md +8 -10
- package/oclif.lock +418 -375
- package/oclif.manifest.json +5 -5
- package/package.json +2 -1
|
@@ -2,6 +2,7 @@ import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
|
2
2
|
export type InitResult = {
|
|
3
3
|
baselineCreated: boolean;
|
|
4
4
|
gitignoreUpdated: boolean;
|
|
5
|
+
branchConfigured: string | null;
|
|
5
6
|
orgsFound: string[];
|
|
6
7
|
orgsMissing: string[];
|
|
7
8
|
};
|
|
@@ -10,4 +11,12 @@ export default class Init extends SfCommand<InitResult> {
|
|
|
10
11
|
static readonly description: string;
|
|
11
12
|
static readonly examples: string[];
|
|
12
13
|
run(): Promise<InitResult>;
|
|
14
|
+
private setupBranch;
|
|
15
|
+
private detectActiveBranch;
|
|
16
|
+
private setupBaseline;
|
|
17
|
+
private setupGitignore;
|
|
18
|
+
private createGitignore;
|
|
19
|
+
private appendGitignore;
|
|
20
|
+
private checkOrgs;
|
|
21
|
+
private printSummary;
|
|
13
22
|
}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process';
|
|
2
2
|
import { existsSync, readFileSync, writeFileSync, appendFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
import { input } from '@inquirer/prompts';
|
|
4
5
|
import { Messages } from '@salesforce/core';
|
|
5
6
|
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
7
|
+
import { readPypelineConfig, writePypelineConfig } from '../../config.js';
|
|
6
8
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
7
9
|
const messages = Messages.loadMessages('pypeline', 'pypeline.init');
|
|
8
10
|
const GITIGNORE_BLOCK = `
|
|
9
11
|
# ── pypeline — arquivos gerados pelo pipeline ────────────────────────────────
|
|
12
|
+
.pypeline.json
|
|
10
13
|
baseline.txt
|
|
11
14
|
build_deploy/
|
|
12
15
|
lista_arquivos_adicionados.txt
|
|
@@ -18,6 +21,7 @@ deploy_prd_output.log
|
|
|
18
21
|
deploy_training_output.log
|
|
19
22
|
`;
|
|
20
23
|
const PYPELINE_ENTRIES = [
|
|
24
|
+
'.pypeline.json',
|
|
21
25
|
'baseline.txt',
|
|
22
26
|
'build_deploy/',
|
|
23
27
|
'lista_arquivos_adicionados.txt',
|
|
@@ -35,78 +39,124 @@ export default class Init extends SfCommand {
|
|
|
35
39
|
static examples = messages.getMessages('examples');
|
|
36
40
|
async run() {
|
|
37
41
|
const cwd = process.cwd();
|
|
38
|
-
const result = {
|
|
39
|
-
baselineCreated: false,
|
|
40
|
-
gitignoreUpdated: false,
|
|
41
|
-
orgsFound: [],
|
|
42
|
-
orgsMissing: [],
|
|
43
|
-
};
|
|
44
42
|
this.log('\n── pypeline init ───────────────────────────────────────────\n');
|
|
45
|
-
|
|
43
|
+
const branchConfigured = await this.setupBranch(cwd);
|
|
44
|
+
this.log('');
|
|
45
|
+
const baselineCreated = await this.setupBaseline(cwd);
|
|
46
|
+
this.log('');
|
|
47
|
+
const gitignoreUpdated = await this.setupGitignore(cwd);
|
|
48
|
+
this.log('');
|
|
49
|
+
const { orgsFound, orgsMissing } = this.checkOrgs();
|
|
50
|
+
this.printSummary(cwd, orgsMissing);
|
|
51
|
+
return { baselineCreated, gitignoreUpdated, branchConfigured, orgsFound, orgsMissing };
|
|
52
|
+
}
|
|
53
|
+
// ── Branch ───────────────────────────────────────────────────────────────
|
|
54
|
+
async setupBranch(cwd) {
|
|
55
|
+
const existingConfig = readPypelineConfig();
|
|
56
|
+
const currentBranch = existingConfig.branch ?? 'main';
|
|
57
|
+
this.log(`Branch default atual: ${currentBranch}`);
|
|
58
|
+
const change = await this.confirm({
|
|
59
|
+
message: `Deseja alterar a branch default? (atual: ${currentBranch})`,
|
|
60
|
+
defaultAnswer: false,
|
|
61
|
+
});
|
|
62
|
+
if (!change) {
|
|
63
|
+
this.log(`✔ Branch default mantida: ${currentBranch}`);
|
|
64
|
+
return currentBranch;
|
|
65
|
+
}
|
|
66
|
+
const suggestion = this.detectActiveBranch(cwd) ?? currentBranch;
|
|
67
|
+
const branch = await input({
|
|
68
|
+
message: 'Nome da branch default:',
|
|
69
|
+
default: suggestion,
|
|
70
|
+
validate: (v) => v.trim().length > 0 || 'O nome da branch não pode ser vazio.',
|
|
71
|
+
});
|
|
72
|
+
const trimmed = branch.trim();
|
|
73
|
+
writePypelineConfig({ ...existingConfig, branch: trimmed });
|
|
74
|
+
this.log(`✔ Branch default salva em .pypeline.json → ${trimmed}`);
|
|
75
|
+
return trimmed;
|
|
76
|
+
}
|
|
77
|
+
detectActiveBranch(cwd) {
|
|
78
|
+
try {
|
|
79
|
+
const branches = execSync('git branch -a', { encoding: 'utf8', cwd })
|
|
80
|
+
.split('\n').map((b) => b.replace('*', '').trim()).filter(Boolean);
|
|
81
|
+
if (branches.length > 0) {
|
|
82
|
+
this.log(` Branches disponíveis:\n${branches.map((b) => ` - ${b}`).join('\n')}`);
|
|
83
|
+
}
|
|
84
|
+
return execSync('git branch --show-current', { encoding: 'utf8', cwd }).trim() || null;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// ── Baseline ─────────────────────────────────────────────────────────────
|
|
91
|
+
async setupBaseline(cwd) {
|
|
46
92
|
const baselinePath = join(cwd, 'baseline.txt');
|
|
47
93
|
if (existsSync(baselinePath)) {
|
|
48
94
|
const hash = readFileSync(baselinePath, 'utf8').trim();
|
|
49
95
|
this.log(`✔ baseline.txt já existe (${hash.slice(0, 8)}...)`);
|
|
96
|
+
return false;
|
|
50
97
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const hash = execSync('git rev-parse HEAD', { encoding: 'utf8', cwd }).trim();
|
|
59
|
-
writeFileSync(baselinePath, hash + '\n', 'utf8');
|
|
60
|
-
result.baselineCreated = true;
|
|
61
|
-
this.log(`✔ baseline.txt criado → ${hash.slice(0, 8)}...`);
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
this.warn('Não foi possível obter o commit HEAD. Certifique-se de estar em um repositório git.');
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
this.log(' baseline.txt ignorado. Crie manualmente com: git rev-parse HEAD > baseline.txt');
|
|
69
|
-
}
|
|
98
|
+
const confirm = await this.confirm({
|
|
99
|
+
message: 'baseline.txt não encontrado. Criar agora com o commit HEAD atual?',
|
|
100
|
+
defaultAnswer: true,
|
|
101
|
+
});
|
|
102
|
+
if (!confirm) {
|
|
103
|
+
this.log(' baseline.txt ignorado. Crie manualmente com: git rev-parse HEAD > baseline.txt');
|
|
104
|
+
return false;
|
|
70
105
|
}
|
|
71
|
-
|
|
72
|
-
|
|
106
|
+
try {
|
|
107
|
+
const hash = execSync('git rev-parse HEAD', { encoding: 'utf8', cwd }).trim();
|
|
108
|
+
writeFileSync(baselinePath, hash + '\n', 'utf8');
|
|
109
|
+
this.log(`✔ baseline.txt criado → ${hash.slice(0, 8)}...`);
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
this.warn('Não foi possível obter o commit HEAD. Certifique-se de estar em um repositório git.');
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ── .gitignore ────────────────────────────────────────────────────────────
|
|
118
|
+
async setupGitignore(cwd) {
|
|
73
119
|
const gitignorePath = join(cwd, '.gitignore');
|
|
74
120
|
if (!existsSync(gitignorePath)) {
|
|
75
|
-
|
|
76
|
-
message: '.gitignore não encontrado. Criar com as entradas do pypeline?',
|
|
77
|
-
defaultAnswer: true,
|
|
78
|
-
});
|
|
79
|
-
if (confirm) {
|
|
80
|
-
writeFileSync(gitignorePath, GITIGNORE_BLOCK.trimStart(), 'utf8');
|
|
81
|
-
result.gitignoreUpdated = true;
|
|
82
|
-
this.log('✔ .gitignore criado com entradas do pypeline.');
|
|
83
|
-
}
|
|
121
|
+
return this.createGitignore(gitignorePath);
|
|
84
122
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.log('✔ .gitignore já contém todas as entradas do pypeline.');
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
this.log(` Entradas ausentes no .gitignore:\n${missing.map((e) => ` - ${e}`).join('\n')}`);
|
|
93
|
-
const confirm = await this.confirm({
|
|
94
|
-
message: 'Adicionar entradas do pypeline ao .gitignore?',
|
|
95
|
-
defaultAnswer: true,
|
|
96
|
-
});
|
|
97
|
-
if (confirm) {
|
|
98
|
-
appendFileSync(gitignorePath, GITIGNORE_BLOCK, 'utf8');
|
|
99
|
-
result.gitignoreUpdated = true;
|
|
100
|
-
this.log('✔ Entradas adicionadas ao .gitignore.');
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
this.log(' .gitignore não foi alterado.');
|
|
104
|
-
}
|
|
105
|
-
}
|
|
123
|
+
const missing = PYPELINE_ENTRIES.filter((e) => !readFileSync(gitignorePath, 'utf8').includes(e));
|
|
124
|
+
if (missing.length === 0) {
|
|
125
|
+
this.log('✔ .gitignore já contém todas as entradas do pypeline.');
|
|
126
|
+
return false;
|
|
106
127
|
}
|
|
107
|
-
|
|
108
|
-
|
|
128
|
+
return this.appendGitignore(gitignorePath, missing);
|
|
129
|
+
}
|
|
130
|
+
async createGitignore(gitignorePath) {
|
|
131
|
+
const confirm = await this.confirm({
|
|
132
|
+
message: '.gitignore não encontrado. Criar com as entradas do pypeline?',
|
|
133
|
+
defaultAnswer: true,
|
|
134
|
+
});
|
|
135
|
+
if (!confirm)
|
|
136
|
+
return false;
|
|
137
|
+
writeFileSync(gitignorePath, GITIGNORE_BLOCK.trimStart(), 'utf8');
|
|
138
|
+
this.log('✔ .gitignore criado com entradas do pypeline.');
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
async appendGitignore(gitignorePath, missing) {
|
|
142
|
+
this.log(` Entradas ausentes no .gitignore:\n${missing.map((e) => ` - ${e}`).join('\n')}`);
|
|
143
|
+
const confirm = await this.confirm({
|
|
144
|
+
message: 'Adicionar entradas do pypeline ao .gitignore?',
|
|
145
|
+
defaultAnswer: true,
|
|
146
|
+
});
|
|
147
|
+
if (!confirm) {
|
|
148
|
+
this.log(' .gitignore não foi alterado.');
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
appendFileSync(gitignorePath, GITIGNORE_BLOCK, 'utf8');
|
|
152
|
+
this.log('✔ Entradas adicionadas ao .gitignore.');
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
// ── Orgs ─────────────────────────────────────────────────────────────────
|
|
156
|
+
checkOrgs() {
|
|
109
157
|
this.log('Verificando orgs autenticadas...');
|
|
158
|
+
const orgsFound = [];
|
|
159
|
+
const orgsMissing = [];
|
|
110
160
|
try {
|
|
111
161
|
const output = execSync('sf org list --json', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
112
162
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
@@ -116,11 +166,11 @@ export default class Init extends SfCommand {
|
|
|
116
166
|
const aliases = nonScratch.map((o) => o.alias).filter(Boolean);
|
|
117
167
|
for (const alias of DEFAULT_ORGS) {
|
|
118
168
|
if (aliases.includes(alias)) {
|
|
119
|
-
|
|
169
|
+
orgsFound.push(alias);
|
|
120
170
|
this.log(`✔ Org '${alias}' autenticada.`);
|
|
121
171
|
}
|
|
122
172
|
else {
|
|
123
|
-
|
|
173
|
+
orgsMissing.push(alias);
|
|
124
174
|
this.warn(`Org '${alias}' não encontrada. Execute: sf org login web --alias ${alias}`);
|
|
125
175
|
}
|
|
126
176
|
}
|
|
@@ -128,22 +178,23 @@ export default class Init extends SfCommand {
|
|
|
128
178
|
catch {
|
|
129
179
|
this.warn('Não foi possível verificar as orgs. Execute "sf org list" para checar manualmente.');
|
|
130
180
|
}
|
|
131
|
-
|
|
181
|
+
return { orgsFound, orgsMissing };
|
|
182
|
+
}
|
|
183
|
+
// ── Resumo ────────────────────────────────────────────────────────────────
|
|
184
|
+
printSummary(cwd, orgsMissing) {
|
|
132
185
|
this.log('\n────────────────────────────────────────────────────────────');
|
|
133
|
-
|
|
186
|
+
const baselineOk = existsSync(join(cwd, 'baseline.txt'));
|
|
187
|
+
if (orgsMissing.length === 0 && baselineOk) {
|
|
134
188
|
this.log('✔ Workspace pronto. Execute sf pypeline run para iniciar o pipeline.\n');
|
|
189
|
+
return;
|
|
135
190
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
for (const alias of result.orgsMissing) {
|
|
142
|
-
this.log(` - Autentique a org: sf org login web --alias ${alias}`);
|
|
143
|
-
}
|
|
144
|
-
this.log('');
|
|
191
|
+
this.log(' Alguns itens precisam de atenção antes de rodar o pipeline:');
|
|
192
|
+
if (!baselineOk)
|
|
193
|
+
this.log(' - Crie o baseline.txt: git rev-parse HEAD > baseline.txt');
|
|
194
|
+
for (const alias of orgsMissing) {
|
|
195
|
+
this.log(` - Autentique a org: sf org login web --alias ${alias}`);
|
|
145
196
|
}
|
|
146
|
-
|
|
197
|
+
this.log('');
|
|
147
198
|
}
|
|
148
199
|
}
|
|
149
200
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/pypeline/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/pypeline/init.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export declare const PROJECT_DIR: () => string;
|
|
2
2
|
export declare const LOCAL_DIR: () => string;
|
|
3
3
|
export declare const SCRIPT_DIR: string;
|
|
4
|
+
export declare const PYPELINE_CONFIG_FILE: () => string;
|
|
5
|
+
export type PypelineConfig = {
|
|
6
|
+
branch?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function readPypelineConfig(): PypelineConfig;
|
|
9
|
+
export declare function writePypelineConfig(config: PypelineConfig): void;
|
|
4
10
|
export declare const PROJECT_NAME = "build_deploy";
|
|
5
11
|
export declare const BRANCH: string;
|
|
6
12
|
export declare const BUILD_DIR: () => string;
|
package/lib/config.js
CHANGED
|
@@ -9,9 +9,30 @@ import * as path from 'node:path';
|
|
|
9
9
|
export const PROJECT_DIR = () => process.cwd();
|
|
10
10
|
export const LOCAL_DIR = () => process.cwd();
|
|
11
11
|
export const SCRIPT_DIR = path.dirname(new URL(import.meta.url).pathname);
|
|
12
|
+
// ── Arquivo de configuração local ─────────────────────────────────────────
|
|
13
|
+
//
|
|
14
|
+
// .pypeline.json na raiz do projeto Salesforce persiste as preferências
|
|
15
|
+
// definidas pelo usuário no sf pypeline init.
|
|
16
|
+
// Ordem de precedência: flag CLI → env var → .pypeline.json → default 'main'
|
|
17
|
+
export const PYPELINE_CONFIG_FILE = () => path.join(process.cwd(), '.pypeline.json');
|
|
18
|
+
export function readPypelineConfig() {
|
|
19
|
+
const configFile = PYPELINE_CONFIG_FILE();
|
|
20
|
+
if (!fs.existsSync(configFile))
|
|
21
|
+
return {};
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(fs.readFileSync(configFile, 'utf8'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function writePypelineConfig(config) {
|
|
30
|
+
fs.writeFileSync(PYPELINE_CONFIG_FILE(), JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
31
|
+
}
|
|
12
32
|
// ── Nomes e pastas ─────────────────────────────────────────────────────────
|
|
13
33
|
export const PROJECT_NAME = 'build_deploy';
|
|
14
|
-
|
|
34
|
+
// Branch: flag CLI > PYPELINE_BRANCH env var > .pypeline.json > 'main'
|
|
35
|
+
export const BRANCH = process.env['PYPELINE_BRANCH'] ?? readPypelineConfig().branch ?? 'main';
|
|
15
36
|
export const BUILD_DIR = () => path.join(process.cwd(), PROJECT_NAME);
|
|
16
37
|
export const SOURCE_DIR = () => path.join(BUILD_DIR(), 'force-app', 'main', 'default');
|
|
17
38
|
// ── Arquivos de estado ─────────────────────────────────────────────────────
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,6EAA6E;AAC7E,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,8DAA8D;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAI,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,SAAS,GAAM,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,UAAU,GAAK,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE5E,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
# summary
|
|
2
|
-
|
|
3
|
-
Initialize the pypeline workspace: create baseline.txt, update .gitignore and verify org authentication.
|
|
2
|
+
Inicializa o workspace do pypeline: configura branch default, cria baseline.txt, atualiza .gitignore e verifica autenticação das orgs.
|
|
4
3
|
|
|
5
4
|
# description
|
|
5
|
+
Executa o setup interativo do pypeline no diretório do projeto Salesforce:
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
- Checks that the default orgs (devops and treino) are authenticated
|
|
7
|
+
- Pergunta e salva a branch default em .pypeline.json
|
|
8
|
+
- Cria baseline.txt com o commit HEAD atual (se não existir)
|
|
9
|
+
- Adiciona entradas do pypeline ao .gitignore (se ausentes)
|
|
10
|
+
- Verifica se as orgs padrão (devops e treino) estão autenticadas
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
Execute este comando uma vez ao configurar um novo workspace. Para alterar a branch default posteriormente, basta rodar sf pypeline init novamente.
|
|
14
13
|
|
|
15
14
|
# examples
|
|
16
|
-
|
|
17
|
-
- Initialize the workspace in the current directory:
|
|
15
|
+
- Inicializar o workspace no diretório atual:
|
|
18
16
|
|
|
19
17
|
<%= config.bin %> <%= command.id %>
|