@git.zone/cli 2.20.0 → 2.22.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.
@@ -44,7 +44,31 @@ export class BaseFormatter {
44
44
  async postExecute() {
45
45
  // Override in subclasses if needed
46
46
  }
47
- async modifyFile(filepath, content) {
47
+ normalizeFileMode(mode) {
48
+ if (!mode)
49
+ return undefined;
50
+ const normalizedMode = mode.trim();
51
+ if (!/^[0-7]{3,4}$/.test(normalizedMode)) {
52
+ throw new Error(`Invalid file mode ${mode}`);
53
+ }
54
+ return normalizedMode.padStart(4, '0');
55
+ }
56
+ async getFileMode(filepath) {
57
+ try {
58
+ const stats = await plugins.fs.stat(filepath);
59
+ return (stats.mode & 0o777).toString(8).padStart(4, '0');
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }
65
+ async setFileMode(filepath, mode) {
66
+ const normalizedMode = this.normalizeFileMode(mode);
67
+ if (!normalizedMode)
68
+ return;
69
+ await plugins.fs.chmod(filepath, Number.parseInt(normalizedMode, 8));
70
+ }
71
+ async modifyFile(filepath, content, mode) {
48
72
  if (!filepath || filepath.trim() === '') {
49
73
  throw new Error(`Invalid empty filepath in modifyFile`);
50
74
  }
@@ -53,8 +77,11 @@ export class BaseFormatter {
53
77
  normalizedPath = './' + filepath;
54
78
  }
55
79
  await plugins.smartfs.file(normalizedPath).encoding('utf8').write(content);
80
+ if (mode) {
81
+ await this.setFileMode(normalizedPath, mode);
82
+ }
56
83
  }
57
- async createFile(filepath, content) {
84
+ async createFile(filepath, content, mode) {
58
85
  let normalizedPath = filepath;
59
86
  if (!plugins.path.parse(filepath).dir) {
60
87
  normalizedPath = './' + filepath;
@@ -65,6 +92,9 @@ export class BaseFormatter {
65
92
  await plugins.smartfs.directory(dir).recursive().create();
66
93
  }
67
94
  await plugins.smartfs.file(normalizedPath).encoding('utf8').write(content);
95
+ if (mode) {
96
+ await this.setFileMode(normalizedPath, mode);
97
+ }
68
98
  }
69
99
  async deleteFile(filepath) {
70
100
  await plugins.smartfs.file(filepath).delete();
@@ -88,12 +118,18 @@ export class BaseFormatter {
88
118
  currentContent = undefined;
89
119
  }
90
120
  const newContent = change.content;
91
- if (currentContent !== newContent && newContent !== undefined) {
121
+ const modeAfter = this.normalizeFileMode(change.mode);
122
+ const modeBefore = modeAfter ? await this.getFileMode(change.path) : undefined;
123
+ const hasContentDiff = currentContent !== newContent && newContent !== undefined;
124
+ const hasModeDiff = modeAfter !== undefined && modeBefore !== modeAfter;
125
+ if (hasContentDiff || hasModeDiff) {
92
126
  diffs.push({
93
127
  path: change.path,
94
128
  type: change.type,
95
129
  before: currentContent,
96
130
  after: newContent,
131
+ modeBefore,
132
+ modeAfter,
97
133
  });
98
134
  }
99
135
  }
@@ -119,14 +155,14 @@ export class BaseFormatter {
119
155
  }
120
156
  displayDiff(diff) {
121
157
  console.log(`\n--- ${diff.path}`);
122
- if (diff.before && diff.after) {
158
+ if (diff.before !== undefined && diff.after !== undefined) {
123
159
  console.log(plugins.smartdiff.formatUnifiedDiffForConsole(diff.before, diff.after, {
124
160
  originalFileName: diff.path,
125
161
  revisedFileName: diff.path,
126
162
  context: 3,
127
163
  }));
128
164
  }
129
- else if (diff.after && !diff.before) {
165
+ else if (diff.after !== undefined && diff.before === undefined) {
130
166
  console.log(' (new file)');
131
167
  const lines = diff.after.split('\n').slice(0, 10);
132
168
  lines.forEach(line => console.log(` + ${line}`));
@@ -134,9 +170,15 @@ export class BaseFormatter {
134
170
  console.log(' ... (truncated)');
135
171
  }
136
172
  }
137
- else if (diff.before && !diff.after) {
173
+ else if (diff.type === 'delete') {
138
174
  console.log(' (file will be deleted)');
139
175
  }
176
+ else if (diff.modeAfter) {
177
+ console.log(' (file content unchanged)');
178
+ }
179
+ if (diff.modeBefore !== diff.modeAfter && diff.modeAfter) {
180
+ console.log(` mode: ${diff.modeBefore || '(missing)'} -> ${diff.modeAfter}`);
181
+ }
140
182
  }
141
183
  displayAllDiffs(result) {
142
184
  if (!result.hasDiff) {
@@ -148,4 +190,4 @@ export class BaseFormatter {
148
190
  }
149
191
  }
150
192
  }
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5iYXNlZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2Zvcm1hdC9jbGFzc2VzLmJhc2Vmb3JtYXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxNQUFNLE9BQWdCLGFBQWE7SUFDdkIsT0FBTyxDQUFnQjtJQUN2QixPQUFPLENBQVU7SUFDakIsS0FBSyxDQUFjO0lBRTdCLFlBQVksT0FBc0IsRUFBRSxPQUFnQjtRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBTUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDWixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQXlCO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFeEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FB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
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5iYXNlZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2Zvcm1hdC9jbGFzc2VzLmJhc2Vmb3JtYXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxNQUFNLE9BQWdCLGFBQWE7SUFDdkIsT0FBTyxDQUFnQjtJQUN2QixPQUFPLENBQVU7SUFDakIsS0FBSyxDQUFjO0lBRTdCLFlBQVksT0FBc0IsRUFBRSxPQUFnQjtRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBTUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDWixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQXlCO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFeEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FB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
@@ -0,0 +1,14 @@
1
+ import { BaseFormatter } from '../classes.baseformatter.js';
2
+ import type { IFormatWarning, IPlannedChange } from '../interfaces.format.js';
3
+ export declare class AssetsFormatter extends BaseFormatter {
4
+ get name(): string;
5
+ analyze(): Promise<IPlannedChange[]>;
6
+ validate(): Promise<IFormatWarning[]>;
7
+ applyChange(change: IPlannedChange): Promise<void>;
8
+ private getTemplateEntries;
9
+ private renderTemplate;
10
+ private buildRenderData;
11
+ private normalizeInstallerConfig;
12
+ private normalizeNpmWrapperConfig;
13
+ private normalizeReleaseWorkflowConfig;
14
+ }
@@ -0,0 +1,384 @@
1
+ import { BaseFormatter } from '../classes.baseformatter.js';
2
+ import * as plugins from '../mod.plugins.js';
3
+ import * as paths from '../../paths.js';
4
+ import { logger, logVerbose } from '../../gitzone.logging.js';
5
+ import { getCliConfigValue, readSmartconfigFile } from '../../helpers.smartconfig.js';
6
+ const isPlainObject = (value) => {
7
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ };
9
+ const readJsonFile = async (filePath) => {
10
+ if (!(await plugins.smartfs.file(filePath).exists())) {
11
+ return {};
12
+ }
13
+ const content = (await plugins.smartfs.file(filePath).encoding('utf8').read());
14
+ return JSON.parse(content);
15
+ };
16
+ const uniqueStringArray = (value, fallback = []) => {
17
+ if (!Array.isArray(value)) {
18
+ return fallback;
19
+ }
20
+ const result = [];
21
+ for (const item of value) {
22
+ if (typeof item !== 'string' || !item.trim()) {
23
+ continue;
24
+ }
25
+ if (!result.includes(item)) {
26
+ result.push(item);
27
+ }
28
+ }
29
+ return result;
30
+ };
31
+ const normalizeRepository = (assetsConfig, moduleConfig) => {
32
+ const repository = isPlainObject(assetsConfig.repository) ? assetsConfig.repository : {};
33
+ const host = repository.host || moduleConfig.githost || 'code.foss.global';
34
+ const path = repository.path || [moduleConfig.gitscope, moduleConfig.gitrepo].filter(Boolean).join('/');
35
+ const branch = repository.branch || repository.rawBranch || assetsConfig.rawBranch || 'main';
36
+ const baseUrl = `https://${host}/${path}`;
37
+ return {
38
+ host,
39
+ path,
40
+ branch,
41
+ baseUrl,
42
+ apiBaseUrl: `https://${host}/api/v1/repos/${path}`,
43
+ gitUrl: `${baseUrl}.git`,
44
+ };
45
+ };
46
+ const normalizeOs = (target) => {
47
+ const rawValue = `${target.os || ''} ${target.target || ''} ${target.name || ''}`.toLowerCase();
48
+ if (rawValue.includes('apple') || rawValue.includes('darwin') || rawValue.includes('macos'))
49
+ return 'macos';
50
+ if (rawValue.includes('windows') || rawValue.includes('pc-windows') || rawValue.includes('-win'))
51
+ return 'windows';
52
+ return 'linux';
53
+ };
54
+ const normalizeArch = (target) => {
55
+ const rawValue = `${target.arch || ''} ${target.target || ''} ${target.name || ''}`.toLowerCase();
56
+ if (rawValue.includes('aarch64') || rawValue.includes('arm64'))
57
+ return 'arm64';
58
+ return 'x64';
59
+ };
60
+ const getNodePlatform = (os) => {
61
+ if (os === 'macos')
62
+ return 'darwin';
63
+ if (os === 'windows')
64
+ return 'win32';
65
+ return 'linux';
66
+ };
67
+ const getPlatformLabel = (target) => {
68
+ const osLabel = target.os === 'macos' ? 'macOS' : target.os === 'windows' ? 'Windows' : 'Linux';
69
+ const archLabel = target.arch === 'arm64' ? 'ARM64' : 'x64';
70
+ return `${osLabel} ${archLabel}`;
71
+ };
72
+ const normalizeBinaryTargets = (assetsConfig, smartconfigData) => {
73
+ const binaryConfig = isPlainObject(assetsConfig.binary) ? assetsConfig.binary : {};
74
+ const tsdenoConfig = smartconfigData['@git.zone/tsdeno'];
75
+ const targets = Array.isArray(binaryConfig.targets)
76
+ ? binaryConfig.targets
77
+ : isPlainObject(tsdenoConfig) && Array.isArray(tsdenoConfig.compileTargets)
78
+ ? tsdenoConfig.compileTargets
79
+ : [];
80
+ return targets
81
+ .filter((target) => isPlainObject(target) && typeof target.name === 'string')
82
+ .map((target) => {
83
+ const os = normalizeOs(target);
84
+ const arch = normalizeArch(target);
85
+ const isWindows = os === 'windows';
86
+ const assetName = isWindows && !target.name.endsWith('.exe') ? `${target.name}.exe` : target.name;
87
+ const result = {
88
+ name: target.name,
89
+ assetName,
90
+ os,
91
+ arch,
92
+ denoTarget: target.target || target.denoTarget || '',
93
+ nodeKey: `${getNodePlatform(os)}:${arch}`,
94
+ label: '',
95
+ };
96
+ result.label = getPlatformLabel(result);
97
+ return result;
98
+ });
99
+ };
100
+ const buildDefaultEntries = (assetsConfig, cliName) => {
101
+ if (assetsConfig.kind !== 'denoBinaryCli') {
102
+ return [];
103
+ }
104
+ const entries = [];
105
+ const installerConfig = isPlainObject(assetsConfig.installer) ? assetsConfig.installer : {};
106
+ const npmWrapperConfig = isPlainObject(assetsConfig.npmWrapper) ? assetsConfig.npmWrapper : {};
107
+ const releaseWorkflowConfig = isPlainObject(assetsConfig.releaseWorkflow)
108
+ ? assetsConfig.releaseWorkflow
109
+ : isPlainObject(assetsConfig.releaseAssets)
110
+ ? assetsConfig.releaseAssets
111
+ : {};
112
+ if (installerConfig.enabled !== false) {
113
+ entries.push({
114
+ template: 'asset_deno_binary_installer',
115
+ files: [{ from: 'install.sh', to: installerConfig.file || 'install.sh', mode: '0755' }],
116
+ });
117
+ }
118
+ if (npmWrapperConfig.enabled === true) {
119
+ entries.push({
120
+ template: 'asset_deno_binary_postinstall',
121
+ files: [
122
+ {
123
+ from: 'scripts/install-binary.js',
124
+ to: npmWrapperConfig.postinstallFile || 'scripts/install-binary.js',
125
+ mode: '0755',
126
+ },
127
+ {
128
+ from: 'bin/wrapper.js',
129
+ to: npmWrapperConfig.binFile || `bin/${cliName}-wrapper.js`,
130
+ mode: '0755',
131
+ },
132
+ ],
133
+ });
134
+ }
135
+ if (releaseWorkflowConfig.enabled !== false) {
136
+ entries.push({
137
+ template: 'asset_deno_binary_release_gitea',
138
+ files: [{ from: '.gitea/workflows/release.yml', to: releaseWorkflowConfig.file || '.gitea/workflows/release.yml' }],
139
+ });
140
+ }
141
+ return entries;
142
+ };
143
+ export class AssetsFormatter extends BaseFormatter {
144
+ get name() {
145
+ return 'assets';
146
+ }
147
+ async analyze() {
148
+ const assetsConfig = await getCliConfigValue('assets', undefined);
149
+ if (!isPlainObject(assetsConfig) || assetsConfig.enabled === false) {
150
+ logVerbose('No @git.zone/cli.assets config found, skipping');
151
+ return [];
152
+ }
153
+ const smartconfigData = await readSmartconfigFile(paths.cwd);
154
+ const renderData = await this.buildRenderData(assetsConfig, smartconfigData);
155
+ const entries = this.getTemplateEntries(assetsConfig, renderData.cliName);
156
+ const changes = [];
157
+ for (const entry of entries) {
158
+ if (entry.enabled === false) {
159
+ continue;
160
+ }
161
+ const renderedFiles = await this.renderTemplate(entry.template, {
162
+ ...renderData,
163
+ ...(entry.variables || {}),
164
+ });
165
+ for (const file of entry.files || []) {
166
+ const content = renderedFiles.get(file.from) || renderedFiles.get(file.to);
167
+ if (content === undefined) {
168
+ throw new Error(`Managed asset ${entry.template}/${file.from} did not render a file`);
169
+ }
170
+ const destExists = await plugins.smartfs.file(file.to).exists();
171
+ const currentContent = destExists
172
+ ? (await plugins.smartfs.file(file.to).encoding('utf8').read())
173
+ : '';
174
+ const normalizedMode = this.normalizeFileMode(file.mode);
175
+ const currentMode = normalizedMode ? await this.getFileMode(file.to) : undefined;
176
+ const needsContentChange = content !== currentContent;
177
+ const needsModeChange = normalizedMode !== undefined && currentMode !== normalizedMode;
178
+ if (needsContentChange || needsModeChange) {
179
+ changes.push({
180
+ type: destExists ? 'modify' : 'create',
181
+ path: file.to,
182
+ module: this.name,
183
+ description: `Apply managed asset ${entry.template}/${file.from}`,
184
+ content: needsContentChange ? content : undefined,
185
+ mode: normalizedMode,
186
+ });
187
+ }
188
+ }
189
+ }
190
+ return changes;
191
+ }
192
+ async validate() {
193
+ const assetsConfig = await getCliConfigValue('assets', undefined);
194
+ if (!isPlainObject(assetsConfig) || assetsConfig.enabled === false) {
195
+ return [];
196
+ }
197
+ if (assetsConfig.kind && assetsConfig.kind !== 'denoBinaryCli') {
198
+ return [{ level: 'error', module: this.name, message: `Unsupported managed asset kind: ${assetsConfig.kind}` }];
199
+ }
200
+ const installer = isPlainObject(assetsConfig.installer) ? assetsConfig.installer : {};
201
+ if (installer.distribution && !['rawBranch', 'releaseAsset'].includes(installer.distribution)) {
202
+ return [
203
+ {
204
+ level: 'error',
205
+ module: this.name,
206
+ message: `Unsupported installer distribution: ${installer.distribution}`,
207
+ },
208
+ ];
209
+ }
210
+ return [];
211
+ }
212
+ async applyChange(change) {
213
+ if (change.type === 'create') {
214
+ await this.createFile(change.path, change.content || '', change.mode);
215
+ }
216
+ else if (change.type === 'modify') {
217
+ if (change.content !== undefined) {
218
+ await this.modifyFile(change.path, change.content, change.mode);
219
+ }
220
+ else if (change.mode) {
221
+ await this.setFileMode(change.path, change.mode);
222
+ }
223
+ }
224
+ logger.log('info', `Applied managed asset to ${change.path}`);
225
+ }
226
+ getTemplateEntries(assetsConfig, cliName) {
227
+ if (Array.isArray(assetsConfig.managed)) {
228
+ return assetsConfig.managed
229
+ .filter((entry) => isPlainObject(entry) && typeof entry.template === 'string')
230
+ .map((entry) => ({
231
+ template: entry.template,
232
+ enabled: entry.enabled,
233
+ variables: isPlainObject(entry.variables) ? entry.variables : undefined,
234
+ files: Array.isArray(entry.files)
235
+ ? entry.files
236
+ .filter((file) => isPlainObject(file) && typeof file.from === 'string' && typeof file.to === 'string')
237
+ .map((file) => ({ from: file.from, to: file.to, mode: file.mode }))
238
+ : [],
239
+ }));
240
+ }
241
+ return buildDefaultEntries(assetsConfig, cliName);
242
+ }
243
+ async renderTemplate(templateName, variables) {
244
+ const templateDir = plugins.path.join(paths.templatesDir, templateName);
245
+ if (!(await plugins.smartfs.directory(templateDir).exists())) {
246
+ throw new Error(`Managed asset template does not exist: ${templateName}`);
247
+ }
248
+ const scafTemplate = new plugins.smartscaf.ScafTemplate(templateDir);
249
+ await scafTemplate.readTemplateFromDir();
250
+ await scafTemplate.supplyVariables(variables);
251
+ const renderedFiles = await scafTemplate.renderToMemory();
252
+ const fileMap = new Map();
253
+ for (const file of renderedFiles) {
254
+ fileMap.set(file.path, file.contents.toString());
255
+ }
256
+ return fileMap;
257
+ }
258
+ async buildRenderData(assetsConfig, smartconfigData) {
259
+ const packageJson = await readJsonFile(plugins.path.join(paths.cwd, 'package.json'));
260
+ const denoJson = await readJsonFile(plugins.path.join(paths.cwd, 'deno.json'));
261
+ const moduleConfig = this.project.gitzoneConfig?.data?.module || {};
262
+ const cliName = assetsConfig.cliName || packageJson.name?.split('/').pop() || moduleConfig.gitrepo || 'app';
263
+ const displayName = assetsConfig.displayName || cliName.toUpperCase();
264
+ const repository = normalizeRepository(assetsConfig, moduleConfig);
265
+ const npmPackageName = moduleConfig.npmPackagename || moduleConfig.npmPackageName;
266
+ const binaryTargets = normalizeBinaryTargets(assetsConfig, smartconfigData);
267
+ const binaryConfig = isPlainObject(assetsConfig.binary) ? assetsConfig.binary : {};
268
+ const installerConfig = this.normalizeInstallerConfig(assetsConfig, cliName, repository);
269
+ const npmWrapperConfig = this.normalizeNpmWrapperConfig(assetsConfig, cliName);
270
+ const releaseWorkflowConfig = this.normalizeReleaseWorkflowConfig(assetsConfig, binaryConfig, installerConfig);
271
+ return {
272
+ module: moduleConfig,
273
+ projectType: this.project.gitzoneConfig?.data?.projectType,
274
+ packageJson,
275
+ denoJson,
276
+ assets: assetsConfig,
277
+ cliName,
278
+ cliNameUpper: cliName.toUpperCase(),
279
+ displayName,
280
+ packageName: assetsConfig.packageName || packageJson.name || npmPackageName || cliName,
281
+ versionFallback: packageJson.version || denoJson.version || '0.0.0',
282
+ repository,
283
+ binary: {
284
+ ...binaryConfig,
285
+ outDir: binaryConfig.outDir || 'dist/binaries',
286
+ installFileName: binaryConfig.installFileName || cliName,
287
+ targets: binaryTargets,
288
+ supportedPlatformText: binaryTargets.map((target) => target.label).join(', '),
289
+ hasTargets: binaryTargets.length > 0,
290
+ },
291
+ installer: installerConfig,
292
+ npmWrapper: npmWrapperConfig,
293
+ releaseWorkflow: releaseWorkflowConfig,
294
+ };
295
+ }
296
+ normalizeInstallerConfig(assetsConfig, cliName, repository) {
297
+ const installer = isPlainObject(assetsConfig.installer) ? assetsConfig.installer : {};
298
+ const modes = isPlainObject(installer.modes) ? installer.modes : {};
299
+ const source = isPlainObject(modes.source) ? modes.source : isPlainObject(installer.source) ? installer.source : {};
300
+ const service = isPlainObject(installer.service) ? installer.service : {};
301
+ const file = installer.file || 'install.sh';
302
+ const releaseAssetName = plugins.path.basename(file);
303
+ const distribution = installer.distribution || installer.delivery || 'rawBranch';
304
+ const versionSelection = uniqueStringArray(installer.versionSelection, ['latest', 'version']);
305
+ const detectNames = uniqueStringArray(service.detectNames, service.name ? [service.name] : [cliName]);
306
+ const removeLegacyUnits = uniqueStringArray(service.removeLegacyUnits || service.legacyUnitNames || []);
307
+ const ensureDirs = uniqueStringArray(installer.ensureDirs);
308
+ const preservePaths = uniqueStringArray(installer.preservePaths);
309
+ const successHints = uniqueStringArray(installer.successHints, [`${cliName} --version`, `${cliName} --help`]);
310
+ const rawBranchInstallUrl = `${repository.baseUrl}/raw/branch/${repository.branch}/${file}`;
311
+ const releaseAssetInstallUrl = `${repository.baseUrl}/releases/download/<version>/${releaseAssetName}`;
312
+ const releaseNotesInstallUrl = `${repository.baseUrl}/releases/download/$VERSION/${releaseAssetName}`;
313
+ return {
314
+ ...installer,
315
+ enabled: installer.enabled !== false,
316
+ file,
317
+ distribution,
318
+ releaseAssetName,
319
+ publicInstallUrl: distribution === 'releaseAsset' ? releaseAssetInstallUrl : rawBranchInstallUrl,
320
+ releaseNotesInstallUrl: distribution === 'releaseAsset' ? releaseNotesInstallUrl : rawBranchInstallUrl,
321
+ installDir: installer.installDir || `/opt/${cliName}`,
322
+ binDir: installer.binDir || '/usr/local/bin',
323
+ defaultMode: modes.default || installer.defaultMode || 'binary',
324
+ versionSelection,
325
+ supportsMajor: versionSelection.includes('major'),
326
+ source: {
327
+ ...source,
328
+ enabled: source.enabled === true,
329
+ commands: uniqueStringArray(source.commands),
330
+ executable: source.executable || 'cli.js',
331
+ executableFiles: uniqueStringArray(source.executableFiles, source.executable ? [source.executable] : ['cli.js']),
332
+ validateCommand: source.validate || source.validateCommand || `node ${source.executable || 'cli.js'} --version`,
333
+ },
334
+ service: {
335
+ ...service,
336
+ detectNames,
337
+ removeLegacyUnits,
338
+ hasLegacyUnitRemoval: removeLegacyUnits.length > 0,
339
+ restartName: service.restartName || detectNames[0] || cliName,
340
+ hasRefreshCommand: typeof service.refreshCommand === 'string' && service.refreshCommand.trim().length > 0,
341
+ },
342
+ ensureDirs,
343
+ preservePaths,
344
+ primaryPreservePath: preservePaths[0],
345
+ hasPreservePaths: preservePaths.length > 0,
346
+ successHints,
347
+ };
348
+ }
349
+ normalizeNpmWrapperConfig(assetsConfig, cliName) {
350
+ const npmWrapper = isPlainObject(assetsConfig.npmWrapper) ? assetsConfig.npmWrapper : {};
351
+ return {
352
+ ...npmWrapper,
353
+ enabled: npmWrapper.enabled === true,
354
+ binFile: npmWrapper.binFile || `bin/${cliName}-wrapper.js`,
355
+ postinstallFile: npmWrapper.postinstallFile || 'scripts/install-binary.js',
356
+ binariesDir: npmWrapper.binariesDir || 'dist/binaries',
357
+ };
358
+ }
359
+ normalizeReleaseWorkflowConfig(assetsConfig, binaryConfig, installerConfig) {
360
+ const releaseWorkflow = isPlainObject(assetsConfig.releaseWorkflow)
361
+ ? assetsConfig.releaseWorkflow
362
+ : isPlainObject(assetsConfig.releaseAssets)
363
+ ? assetsConfig.releaseAssets
364
+ : {};
365
+ const binaryOutDir = binaryConfig.outDir || 'dist/binaries';
366
+ const assetGlobs = uniqueStringArray(releaseWorkflow.assetGlobs || releaseWorkflow.include, [`${binaryOutDir}/*`]);
367
+ const includeInstallerAsset = typeof releaseWorkflow.includeInstallerAsset === 'boolean'
368
+ ? releaseWorkflow.includeInstallerAsset
369
+ : installerConfig.enabled !== false && installerConfig.distribution === 'releaseAsset';
370
+ return {
371
+ ...releaseWorkflow,
372
+ enabled: releaseWorkflow.enabled !== false,
373
+ file: releaseWorkflow.file || '.gitea/workflows/release.yml',
374
+ installCommand: releaseWorkflow.installCommand || 'pnpm install --ignore-scripts',
375
+ compileCommand: releaseWorkflow.compileCommand || 'pnpm exec tsdeno compile',
376
+ packNpmArtifact: releaseWorkflow.packNpmArtifact === true,
377
+ includeInstallerAsset,
378
+ assetGlobs,
379
+ keepReleases: releaseWorkflow.keepReleases ?? 0,
380
+ binaryOutDir,
381
+ };
382
+ }
383
+ }
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLmZvcm1hdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21vZF9mb3JtYXQvZm9ybWF0dGVycy9hc3NldHMuZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU1RCxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQXlCdEYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQWdDLEVBQUU7SUFDckUsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLFFBQWdCLEVBQWdDLEVBQUU7SUFDNUUsSUFBSSxDQUFDLENBQUMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBVyxDQUFDO0lBQ3pGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixNQUFNLGlC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