@git.zone/cli 2.19.8 → 2.21.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/assets/templates/asset_deno_binary_installer/install.sh +506 -0
- package/assets/templates/asset_deno_binary_postinstall/bin/wrapper.js +37 -0
- package/assets/templates/asset_deno_binary_postinstall/scripts/install-binary.js +123 -0
- package/assets/templates/asset_deno_binary_release_gitea/.gitea/workflows/release.yml +154 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/helpers.workflow.d.ts +1 -0
- package/dist_ts/helpers.workflow.js +2 -1
- package/dist_ts/mod_commit/index.js +10 -3
- package/dist_ts/mod_config/index.js +91 -1
- package/dist_ts/mod_format/classes.baseformatter.d.ts +5 -2
- package/dist_ts/mod_format/classes.baseformatter.js +49 -7
- package/dist_ts/mod_format/formatters/assets.formatter.d.ts +14 -0
- package/dist_ts/mod_format/formatters/assets.formatter.js +384 -0
- package/dist_ts/mod_format/formatters/packagejson.formatter.js +40 -2
- package/dist_ts/mod_format/index.js +4 -1
- package/dist_ts/mod_format/interfaces.format.d.ts +3 -0
- package/dist_ts/mod_format/interfaces.format.js +2 -1
- package/package.json +4 -4
- package/readme.md +95 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/helpers.workflow.ts +2 -0
- package/ts/mod_commit/index.ts +12 -2
- package/ts/mod_config/index.ts +95 -0
- package/ts/mod_format/classes.baseformatter.ts +47 -6
- package/ts/mod_format/formatters/assets.formatter.ts +451 -0
- package/ts/mod_format/formatters/packagejson.formatter.ts +43 -1
- package/ts/mod_format/index.ts +3 -0
- package/ts/mod_format/interfaces.format.ts +4 -0
|
@@ -44,7 +44,31 @@ export class BaseFormatter {
|
|
|
44
44
|
async postExecute() {
|
|
45
45
|
// Override in subclasses if needed
|
|
46
46
|
}
|
|
47
|
-
|
|
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
|
-
|
|
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 &&
|
|
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.
|
|
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,
|
|
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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
|