@git.zone/tspublish 1.10.2 → 1.11.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.publishmodule.d.ts +12 -0
- package/dist_ts/classes.publishmodule.js +102 -19
- package/dist_ts/classes.tspublish.js +13 -9
- package/dist_ts/plugins.d.ts +4 -1
- package/dist_ts/plugins.js +6 -2
- package/npmextra.json +10 -4
- package/package.json +20 -17
- package/readme.md +51 -14
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.publishmodule.ts +126 -42
- package/ts/classes.tspublish.ts +15 -10
- package/ts/plugins.ts +6 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tspublish',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.11.0',
|
|
7
7
|
description: 'A tool to publish multiple, concise, and small packages from monorepos, specifically for TypeScript projects within a git environment.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHdJQUF3STtDQUN0SixDQUFBIn0=
|
|
@@ -12,6 +12,10 @@ export interface IPublishModuleOptions {
|
|
|
12
12
|
[key: string]: string;
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
+
export interface IResolvedRegistry {
|
|
16
|
+
url: string;
|
|
17
|
+
accessLevel: string;
|
|
18
|
+
}
|
|
15
19
|
export declare class PublishModule {
|
|
16
20
|
tsPublishRef: TsPublish;
|
|
17
21
|
options: IPublishModuleOptions;
|
|
@@ -23,5 +27,13 @@ export declare class PublishModule {
|
|
|
23
27
|
createPublishModuleDir(): Promise<void>;
|
|
24
28
|
build(): Promise<void>;
|
|
25
29
|
createBinCliSetup(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Resolves the registries to publish to based on tspublish.json configuration.
|
|
32
|
+
* Supports:
|
|
33
|
+
* - "useBase": Use only registries from npmextra.json
|
|
34
|
+
* - "extendBase": Use base registries + additions, with exclusions via "-" prefix
|
|
35
|
+
* - Explicit registries: Direct registry URLs in format "url:accessLevel"
|
|
36
|
+
*/
|
|
37
|
+
private resolveRegistries;
|
|
26
38
|
publish(): Promise<void>;
|
|
27
39
|
}
|
|
@@ -13,9 +13,13 @@ export class PublishModule {
|
|
|
13
13
|
if (!this.options.packageSubFolder.startsWith('ts')) {
|
|
14
14
|
throw new Error('subFolder must start with "ts"');
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
const tspublishJsonPath = plugins.path.join(this.options.packageSubFolderFullPath, 'tspublish.json');
|
|
17
|
+
const tspublishJsonContent = await plugins.smartfs.file(tspublishJsonPath).encoding('utf8').read();
|
|
18
|
+
this.options.tsPublishJson = JSON.parse(tspublishJsonContent);
|
|
17
19
|
// the package.json of the parent mono repo
|
|
18
|
-
const
|
|
20
|
+
const packageJsonPath = plugins.path.join(this.options.monoRepoDir, 'package.json');
|
|
21
|
+
const packageJsonContent = await plugins.smartfs.file(packageJsonPath).encoding('utf8').read();
|
|
22
|
+
const monoRepoPackageJson = JSON.parse(packageJsonContent);
|
|
19
23
|
this.options.dependencies = {
|
|
20
24
|
...this.options.dependencies,
|
|
21
25
|
...(() => {
|
|
@@ -61,7 +65,12 @@ export class PublishModule {
|
|
|
61
65
|
return packageInfo.allVersions[0].version;
|
|
62
66
|
}
|
|
63
67
|
async createTsconfigJson() {
|
|
64
|
-
const
|
|
68
|
+
const tsconfigPath = plugins.path.join(paths.cwd, 'tsconfig.json');
|
|
69
|
+
let originalTsConfig = null;
|
|
70
|
+
if (await plugins.smartfs.file(tsconfigPath).exists()) {
|
|
71
|
+
const tsconfigContent = await plugins.smartfs.file(tsconfigPath).encoding('utf8').read();
|
|
72
|
+
originalTsConfig = JSON.parse(tsconfigContent);
|
|
73
|
+
}
|
|
65
74
|
if (originalTsConfig?.compilerOptions?.paths) {
|
|
66
75
|
for (const path of Object.keys(originalTsConfig.compilerOptions.paths)) {
|
|
67
76
|
originalTsConfig.compilerOptions.paths[path][0] = `.${originalTsConfig.compilerOptions.paths[path][0]}`;
|
|
@@ -127,19 +136,29 @@ export class PublishModule {
|
|
|
127
136
|
async createPublishModuleDir() {
|
|
128
137
|
logOngoing(`Creating publish directory for ${this.options.name}`);
|
|
129
138
|
this.options.publishModDirFullPath = plugins.path.join(this.options.monoRepoDir, `dist_publish_${this.options.packageSubFolder}`);
|
|
130
|
-
|
|
139
|
+
// Ensure empty directory
|
|
140
|
+
const publishDir = plugins.smartfs.directory(this.options.publishModDirFullPath);
|
|
141
|
+
if (await publishDir.exists()) {
|
|
142
|
+
await publishDir.recursive().delete();
|
|
143
|
+
}
|
|
144
|
+
await publishDir.recursive().create();
|
|
131
145
|
// package.json
|
|
132
|
-
const
|
|
133
|
-
await
|
|
146
|
+
const packageJsonPath = plugins.path.join(this.options.publishModDirFullPath, 'package.json');
|
|
147
|
+
await plugins.smartfs.file(packageJsonPath).encoding('utf8').write(await this.createPackageJson());
|
|
134
148
|
// tsconfig.json
|
|
135
|
-
const
|
|
136
|
-
await
|
|
149
|
+
const tsconfigJsonPath = plugins.path.join(this.options.publishModDirFullPath, 'tsconfig.json');
|
|
150
|
+
await plugins.smartfs.file(tsconfigJsonPath).encoding('utf8').write(await this.createTsconfigJson());
|
|
137
151
|
// ts subfolder, the folder that contains the source code and is being transpiled
|
|
138
|
-
|
|
152
|
+
const destSubFolder = plugins.path.join(this.options.publishModDirFullPath, this.options.packageSubFolder);
|
|
153
|
+
await plugins.smartfs.directory(this.options.packageSubFolderFullPath).recursive().copy(destSubFolder);
|
|
139
154
|
// readme
|
|
140
|
-
|
|
155
|
+
const readmeSrc = plugins.path.join(this.options.packageSubFolderFullPath, 'readme.md');
|
|
156
|
+
const readmeDest = plugins.path.join(this.options.publishModDirFullPath, 'readme.md');
|
|
157
|
+
await plugins.smartfs.file(readmeSrc).copy(readmeDest);
|
|
141
158
|
// license
|
|
142
|
-
|
|
159
|
+
const licenseSrc = plugins.path.join(this.options.monoRepoDir, 'license');
|
|
160
|
+
const licenseDest = plugins.path.join(this.options.publishModDirFullPath, 'license');
|
|
161
|
+
await plugins.smartfs.file(licenseSrc).copy(licenseDest);
|
|
143
162
|
// cli stuff
|
|
144
163
|
this.createBinCliSetup();
|
|
145
164
|
}
|
|
@@ -158,20 +177,84 @@ export class PublishModule {
|
|
|
158
177
|
const files = await this.tsPublishRef.giteaAssetsInstance.getFiles('git.zone', 'cli', 'assets/templates/cli/cli.js');
|
|
159
178
|
const indexPath = `./dist_${this.options.packageSubFolder}/index.js`;
|
|
160
179
|
const fileContent = atob(files[0].base64Content).replace('./dist_ts/index.js', indexPath);
|
|
161
|
-
|
|
180
|
+
const cliJsPath = plugins.path.join(this.options.publishModDirFullPath, 'cli.js');
|
|
181
|
+
await plugins.smartfs.file(cliJsPath).encoding('utf8').write(fileContent);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Resolves the registries to publish to based on tspublish.json configuration.
|
|
185
|
+
* Supports:
|
|
186
|
+
* - "useBase": Use only registries from npmextra.json
|
|
187
|
+
* - "extendBase": Use base registries + additions, with exclusions via "-" prefix
|
|
188
|
+
* - Explicit registries: Direct registry URLs in format "url:accessLevel"
|
|
189
|
+
*/
|
|
190
|
+
async resolveRegistries() {
|
|
191
|
+
const rawRegistries = this.options.tsPublishJson?.registries || [];
|
|
192
|
+
// Empty → skip publishing
|
|
193
|
+
if (rawRegistries.length === 0) {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
const hasUseBase = rawRegistries.includes('useBase');
|
|
197
|
+
const hasExtendBase = rawRegistries.includes('extendBase');
|
|
198
|
+
let baseRegistries = [];
|
|
199
|
+
let baseAccessLevel = 'public';
|
|
200
|
+
// Load base registries from npmextra.json if needed
|
|
201
|
+
if (hasUseBase || hasExtendBase) {
|
|
202
|
+
const npmextraInstance = new plugins.npmextra.Npmextra(this.options.monoRepoDir);
|
|
203
|
+
const gitzoneConfig = npmextraInstance.dataFor('@git.zone/cli', {});
|
|
204
|
+
baseRegistries = gitzoneConfig?.release?.registries || [];
|
|
205
|
+
baseAccessLevel = gitzoneConfig?.release?.accessLevel || 'public';
|
|
206
|
+
if (baseRegistries.length === 0) {
|
|
207
|
+
throw new Error(`useBase/extendBase specified in tspublish.json but no registries configured in npmextra.json at @git.zone/cli.release.registries`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// useBase: Only base registries
|
|
211
|
+
if (hasUseBase) {
|
|
212
|
+
return baseRegistries.map((url) => ({ url, accessLevel: baseAccessLevel }));
|
|
213
|
+
}
|
|
214
|
+
// extendBase: Base registries + additions - exclusions
|
|
215
|
+
if (hasExtendBase) {
|
|
216
|
+
const exclusions = rawRegistries
|
|
217
|
+
.filter((r) => r.startsWith('-'))
|
|
218
|
+
.map((r) => r.slice(1)); // remove '-' prefix
|
|
219
|
+
const additions = rawRegistries.filter((r) => r !== 'extendBase' && !r.startsWith('-'));
|
|
220
|
+
// Filter out excluded base registries
|
|
221
|
+
const result = baseRegistries
|
|
222
|
+
.filter((url) => !exclusions.includes(url))
|
|
223
|
+
.map((url) => ({ url, accessLevel: baseAccessLevel }));
|
|
224
|
+
// Add explicit registries
|
|
225
|
+
for (const addition of additions) {
|
|
226
|
+
const parts = addition.split(':');
|
|
227
|
+
const url = parts[0];
|
|
228
|
+
const access = parts[1] || 'public';
|
|
229
|
+
result.push({ url, accessLevel: access });
|
|
230
|
+
}
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
// Explicit registries only (original behavior)
|
|
234
|
+
return rawRegistries.map((r) => {
|
|
235
|
+
const parts = r.split(':');
|
|
236
|
+
const url = parts[0];
|
|
237
|
+
const access = parts[1] || 'public';
|
|
238
|
+
return { url, accessLevel: access };
|
|
239
|
+
});
|
|
162
240
|
}
|
|
163
241
|
async publish() {
|
|
164
|
-
|
|
242
|
+
const registries = await this.resolveRegistries();
|
|
243
|
+
// Handle empty registries
|
|
244
|
+
if (registries.length === 0) {
|
|
245
|
+
logWarn(`No registries configured for ${this.options.name}. Skipping publish.`);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
logPublish(`Publishing ${this.options.name} v${this.options.version} to ${registries.length} registry(ies)...`);
|
|
165
249
|
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
166
250
|
executor: 'bash',
|
|
167
251
|
});
|
|
168
|
-
for (const registry of
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
await smartshellInstance.exec(`cd ${this.options.publishModDirFullPath} && pnpm publish ${registryAccessLevel === 'public' ? '--access public' : ''} --no-git-checks --registry https://${registryUrl}`);
|
|
252
|
+
for (const registry of registries) {
|
|
253
|
+
const registryUrl = registry.url.startsWith('https://') ? registry.url : `https://${registry.url}`;
|
|
254
|
+
logOngoing(`Publishing to ${registryUrl}...`);
|
|
255
|
+
await smartshellInstance.exec(`cd ${this.options.publishModDirFullPath} && pnpm publish ${registry.accessLevel === 'public' ? '--access public' : ''} --no-git-checks --registry ${registryUrl}`);
|
|
173
256
|
}
|
|
174
257
|
logSuccess(`Successfully published ${this.options.name} v${this.options.version}!`);
|
|
175
258
|
}
|
|
176
259
|
}
|
|
177
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wdWJsaXNobW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5wdWJsaXNobW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkksT0FBTyxFQUF1QixNQUFNLHVCQUF1QixDQUFDO0FBYzVELE1BQU0sT0FBTyxhQUFhO0lBR3hCLFlBQVksWUFBdUIsRUFBRSxPQUE4QjtRQUNqRSxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FDOUIsQ0FBQztRQUVGLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJ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
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wdWJsaXNobW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5wdWJsaXNobW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkksT0FBTyxFQUF1QixNQUFNLHVCQUF1QixDQUFDO0FBbUI1RCxNQUFNLE9BQU8sYUFBYTtJQUd4QixZQUFZLFlBQXVCLEVBQUUsT0FBOEI7UUFDakUsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQzlCLENBQUM7UUFFRixxQkFBcUI7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FB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
|
|
@@ -37,23 +37,27 @@ export class TsPublish {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
async getModuleSubDirs(dirArg) {
|
|
40
|
-
|
|
40
|
+
// List all directories
|
|
41
|
+
const dirContents = await plugins.smartfs.directory(dirArg).list();
|
|
41
42
|
const publishModules = {};
|
|
42
|
-
for (const
|
|
43
|
-
|
|
43
|
+
for (const entry of dirContents) {
|
|
44
|
+
const subDirName = entry.name;
|
|
45
|
+
if (!subDirName.startsWith('ts')) {
|
|
44
46
|
continue;
|
|
45
47
|
}
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
48
|
+
// Check if this is a directory and has tspublish.json
|
|
49
|
+
const subDirPath = plugins.path.join(dirArg, subDirName);
|
|
50
|
+
const tspublishJsonPath = plugins.path.join(subDirPath, 'tspublish.json');
|
|
51
|
+
if (!(await plugins.smartfs.file(tspublishJsonPath).exists())) {
|
|
49
52
|
continue;
|
|
50
53
|
}
|
|
51
|
-
logPackage('Found module',
|
|
52
|
-
|
|
54
|
+
logPackage('Found module', subDirName);
|
|
55
|
+
const tspublishContent = await plugins.smartfs.file(tspublishJsonPath).encoding('utf8').read();
|
|
56
|
+
publishModules[subDirName] = JSON.parse(tspublishContent);
|
|
53
57
|
}
|
|
54
58
|
logSuccess(`Found ${Object.keys(publishModules).length} publish modules`);
|
|
55
59
|
logInfo('Ordering publish modules...');
|
|
56
60
|
return publishModules;
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c3B1Ymxpc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnRzcHVibGlzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuSixPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsTUFBTSxPQUFPLFNBQVM7SUFHcEI7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDekMsWUFBWSxFQUFFLDBCQUEwQjtTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFzQjtRQUN6QyxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUMxQyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRSxPQUFPLENBQUMsU0FBUyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxZQUFZLEVBQUUsQ0FBQztRQUNmLEtBQUssTUFBTSxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3hELFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxhQUFhLE1BQU0sY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElB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
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
export { path };
|
|
3
3
|
import * as consolecolor from '@push.rocks/consolecolor';
|
|
4
|
+
import * as npmextra from '@push.rocks/npmextra';
|
|
4
5
|
import * as smartfile from '@push.rocks/smartfile';
|
|
6
|
+
import { SmartFs } from '@push.rocks/smartfs';
|
|
5
7
|
import * as smartcli from '@push.rocks/smartcli';
|
|
6
8
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
7
9
|
import * as smartlog from '@push.rocks/smartlog';
|
|
@@ -9,4 +11,5 @@ import * as smartnpm from '@push.rocks/smartnpm';
|
|
|
9
11
|
import * as smartpath from '@push.rocks/smartpath';
|
|
10
12
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
11
13
|
import * as smartshell from '@push.rocks/smartshell';
|
|
12
|
-
|
|
14
|
+
declare const smartfs: SmartFs;
|
|
15
|
+
export { consolecolor, npmextra, smartfile, smartfs, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -3,7 +3,9 @@ import * as path from 'path';
|
|
|
3
3
|
export { path };
|
|
4
4
|
// @push.rocks scope
|
|
5
5
|
import * as consolecolor from '@push.rocks/consolecolor';
|
|
6
|
+
import * as npmextra from '@push.rocks/npmextra';
|
|
6
7
|
import * as smartfile from '@push.rocks/smartfile';
|
|
8
|
+
import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs';
|
|
7
9
|
import * as smartcli from '@push.rocks/smartcli';
|
|
8
10
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
9
11
|
import * as smartlog from '@push.rocks/smartlog';
|
|
@@ -11,5 +13,7 @@ import * as smartnpm from '@push.rocks/smartnpm';
|
|
|
11
13
|
import * as smartpath from '@push.rocks/smartpath';
|
|
12
14
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
13
15
|
import * as smartshell from '@push.rocks/smartshell';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
// Create a pre-configured SmartFs instance for Node.js filesystem operations
|
|
17
|
+
const smartfs = new SmartFs(new SmartFsProviderNode());
|
|
18
|
+
export { consolecolor, npmextra, smartfile, smartfs, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsNkVBQTZFO0FBQzdFLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMifQ==
|
package/npmextra.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"@git.zone/cli": {
|
|
3
3
|
"projectType": "npm",
|
|
4
4
|
"module": {
|
|
5
5
|
"githost": "code.foss.global",
|
|
@@ -21,10 +21,16 @@
|
|
|
21
21
|
"module-management",
|
|
22
22
|
"developer-tools"
|
|
23
23
|
]
|
|
24
|
+
},
|
|
25
|
+
"release": {
|
|
26
|
+
"registries": [
|
|
27
|
+
"https://verdaccio.lossless.digital",
|
|
28
|
+
"https://registry.npmjs.org"
|
|
29
|
+
],
|
|
30
|
+
"accessLevel": "public"
|
|
24
31
|
}
|
|
25
32
|
},
|
|
26
|
-
"
|
|
27
|
-
"npmGlobalTools": []
|
|
28
|
-
"npmAccessLevel": "public"
|
|
33
|
+
"@ship.zone/szci": {
|
|
34
|
+
"npmGlobalTools": []
|
|
29
35
|
}
|
|
30
36
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tspublish",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A tool to publish multiple, concise, and small packages from monorepos, specifically for TypeScript projects within a git environment.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -8,15 +8,20 @@
|
|
|
8
8
|
"type": "module",
|
|
9
9
|
"author": "Task Venture Capital GmbH",
|
|
10
10
|
"license": "MIT",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"test": "(tstest test/ --verbose --testlog --timeout 30)",
|
|
13
|
+
"build": "(tsbuild --web --allowimplicitany)",
|
|
14
|
+
"buildDocs": "(tsdoc)"
|
|
15
|
+
},
|
|
11
16
|
"bin": {
|
|
12
17
|
"tspublish": "./cli.js"
|
|
13
18
|
},
|
|
14
19
|
"devDependencies": {
|
|
15
|
-
"@git.zone/tsbuild": "^
|
|
16
|
-
"@git.zone/tsbundle": "^2.
|
|
17
|
-
"@git.zone/tsrun": "^
|
|
18
|
-
"@git.zone/tstest": "^
|
|
19
|
-
"@types/node": "^
|
|
20
|
+
"@git.zone/tsbuild": "^4.0.2",
|
|
21
|
+
"@git.zone/tsbundle": "^2.6.3",
|
|
22
|
+
"@git.zone/tsrun": "^2.0.1",
|
|
23
|
+
"@git.zone/tstest": "^3.1.3",
|
|
24
|
+
"@types/node": "^25.0.2"
|
|
20
25
|
},
|
|
21
26
|
"repository": {
|
|
22
27
|
"type": "git",
|
|
@@ -43,13 +48,15 @@
|
|
|
43
48
|
],
|
|
44
49
|
"dependencies": {
|
|
45
50
|
"@push.rocks/consolecolor": "^2.0.3",
|
|
46
|
-
"@push.rocks/
|
|
51
|
+
"@push.rocks/npmextra": "^5.3.3",
|
|
52
|
+
"@push.rocks/smartcli": "^4.0.19",
|
|
47
53
|
"@push.rocks/smartdelay": "^3.0.5",
|
|
48
|
-
"@push.rocks/smartfile": "^
|
|
49
|
-
"@push.rocks/
|
|
50
|
-
"@push.rocks/
|
|
54
|
+
"@push.rocks/smartfile": "^13.1.2",
|
|
55
|
+
"@push.rocks/smartfs": "^1.3.1",
|
|
56
|
+
"@push.rocks/smartlog": "^3.1.10",
|
|
57
|
+
"@push.rocks/smartnpm": "^2.0.6",
|
|
51
58
|
"@push.rocks/smartpath": "^6.0.0",
|
|
52
|
-
"@push.rocks/smartrequest": "^
|
|
59
|
+
"@push.rocks/smartrequest": "^5.0.1",
|
|
53
60
|
"@push.rocks/smartshell": "^3.3.0"
|
|
54
61
|
},
|
|
55
62
|
"keywords": [
|
|
@@ -64,9 +71,5 @@
|
|
|
64
71
|
"module-management",
|
|
65
72
|
"developer-tools"
|
|
66
73
|
],
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
"build": "(tsbuild --web --allowimplicitany)",
|
|
70
|
-
"buildDocs": "(tsdoc)"
|
|
71
|
-
}
|
|
72
|
-
}
|
|
74
|
+
"packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977"
|
|
75
|
+
}
|
package/readme.md
CHANGED
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
|
|
10
10
|
`@git.zone/tspublish` is your Swiss Army knife for managing and publishing multiple TypeScript packages from a monorepo. It automates the tedious parts of package publishing while giving you full control over the process. Whether you're maintaining a suite of microservices, a component library, or any collection of related packages, tspublish makes your life easier.
|
|
11
11
|
|
|
12
|
+
## Issue Reporting and Security
|
|
13
|
+
|
|
14
|
+
For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly.
|
|
15
|
+
|
|
12
16
|
### ✨ Key Features
|
|
13
17
|
|
|
14
18
|
- 📦 **Automatic Package Discovery** - Scans your monorepo for publishable packages
|
|
@@ -149,7 +153,11 @@ for (const [name, config] of Object.entries(modules)) {
|
|
|
149
153
|
|
|
150
154
|
### Registry Configuration
|
|
151
155
|
|
|
152
|
-
TSPublish supports multiple registries with different access levels:
|
|
156
|
+
TSPublish supports multiple registries with different access levels. You have three approaches:
|
|
157
|
+
|
|
158
|
+
#### 1️⃣ Explicit Registries
|
|
159
|
+
|
|
160
|
+
Define specific registries directly in your `tspublish.json`:
|
|
153
161
|
|
|
154
162
|
```json
|
|
155
163
|
{
|
|
@@ -161,6 +169,38 @@ TSPublish supports multiple registries with different access levels:
|
|
|
161
169
|
}
|
|
162
170
|
```
|
|
163
171
|
|
|
172
|
+
#### 2️⃣ Use Base Configuration (`useBase`)
|
|
173
|
+
|
|
174
|
+
Inherit registries from your project's `npmextra.json` configuration (managed by `gitzone config`):
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"registries": ["useBase"]
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
This reads from `npmextra.json` under `@git.zone/cli.release.registries`.
|
|
183
|
+
|
|
184
|
+
#### 3️⃣ Extend Base Configuration (`extendBase`)
|
|
185
|
+
|
|
186
|
+
Start with base registries and add/remove specific ones:
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"registries": [
|
|
191
|
+
"extendBase",
|
|
192
|
+
"custom-registry.example.com:public",
|
|
193
|
+
"-https://registry.npmjs.org" // Exclude this registry
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
The `-` prefix excludes a registry from the base configuration.
|
|
199
|
+
|
|
200
|
+
#### Empty Registries
|
|
201
|
+
|
|
202
|
+
If no registries are configured, the package will be built but **not published** (a warning is logged).
|
|
203
|
+
|
|
164
204
|
### Build Order Management
|
|
165
205
|
|
|
166
206
|
When packages depend on each other, use the `order` field to ensure correct build sequence:
|
|
@@ -346,30 +386,27 @@ interface ITsPublishJson {
|
|
|
346
386
|
- Check that all dependencies are installed
|
|
347
387
|
- Review the build output for specific errors
|
|
348
388
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
-
|
|
352
|
-
- 🔄 Automatic version bumping strategies
|
|
353
|
-
- 📊 Dry-run mode with detailed preview
|
|
354
|
-
- 🏷️ Git tag integration
|
|
355
|
-
- 📝 Changelog generation
|
|
356
|
-
- 🔐 Enhanced authentication handling
|
|
389
|
+
**useBase/extendBase error**
|
|
390
|
+
- Ensure your `npmextra.json` has registries configured at `@git.zone/cli.release.registries`
|
|
391
|
+
- Use `gitzone config add <registry-url>` to configure base registries
|
|
357
392
|
|
|
358
393
|
## License and Legal Information
|
|
359
394
|
|
|
360
|
-
This repository contains open-source code
|
|
395
|
+
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file.
|
|
361
396
|
|
|
362
397
|
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
|
363
398
|
|
|
364
399
|
### Trademarks
|
|
365
400
|
|
|
366
|
-
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein.
|
|
401
|
+
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.
|
|
402
|
+
|
|
403
|
+
Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.
|
|
367
404
|
|
|
368
405
|
### Company Information
|
|
369
406
|
|
|
370
|
-
Task Venture Capital GmbH
|
|
371
|
-
Registered at District
|
|
407
|
+
Task Venture Capital GmbH
|
|
408
|
+
Registered at District Court Bremen HRB 35230 HB, Germany
|
|
372
409
|
|
|
373
|
-
For any legal inquiries or
|
|
410
|
+
For any legal inquiries or further information, please contact us via email at hello@task.vc.
|
|
374
411
|
|
|
375
412
|
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -16,6 +16,11 @@ export interface IPublishModuleOptions {
|
|
|
16
16
|
dependencies?: { [key: string]: string };
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
export interface IResolvedRegistry {
|
|
20
|
+
url: string;
|
|
21
|
+
accessLevel: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
19
24
|
export class PublishModule {
|
|
20
25
|
tsPublishRef: TsPublish;
|
|
21
26
|
public options: IPublishModuleOptions;
|
|
@@ -34,14 +39,14 @@ export class PublishModule {
|
|
|
34
39
|
if (!this.options.packageSubFolder.startsWith('ts')) {
|
|
35
40
|
throw new Error('subFolder must start with "ts"');
|
|
36
41
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
);
|
|
42
|
+
const tspublishJsonPath = plugins.path.join(this.options.packageSubFolderFullPath, 'tspublish.json');
|
|
43
|
+
const tspublishJsonContent = await plugins.smartfs.file(tspublishJsonPath).encoding('utf8').read();
|
|
44
|
+
this.options.tsPublishJson = JSON.parse(tspublishJsonContent as string);
|
|
40
45
|
|
|
41
46
|
// the package.json of the parent mono repo
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
);
|
|
47
|
+
const packageJsonPath = plugins.path.join(this.options.monoRepoDir, 'package.json');
|
|
48
|
+
const packageJsonContent = await plugins.smartfs.file(packageJsonPath).encoding('utf8').read();
|
|
49
|
+
const monoRepoPackageJson = JSON.parse(packageJsonContent as string);
|
|
45
50
|
|
|
46
51
|
this.options.dependencies = {
|
|
47
52
|
...this.options.dependencies,
|
|
@@ -91,9 +96,12 @@ export class PublishModule {
|
|
|
91
96
|
}
|
|
92
97
|
|
|
93
98
|
public async createTsconfigJson() {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
)
|
|
99
|
+
const tsconfigPath = plugins.path.join(paths.cwd, 'tsconfig.json');
|
|
100
|
+
let originalTsConfig: any = null;
|
|
101
|
+
if (await plugins.smartfs.file(tsconfigPath).exists()) {
|
|
102
|
+
const tsconfigContent = await plugins.smartfs.file(tsconfigPath).encoding('utf8').read();
|
|
103
|
+
originalTsConfig = JSON.parse(tsconfigContent as string);
|
|
104
|
+
}
|
|
97
105
|
if (originalTsConfig?.compilerOptions?.paths) {
|
|
98
106
|
for (const path of Object.keys(originalTsConfig.compilerOptions.paths)) {
|
|
99
107
|
originalTsConfig.compilerOptions.paths[
|
|
@@ -166,41 +174,35 @@ export class PublishModule {
|
|
|
166
174
|
this.options.monoRepoDir,
|
|
167
175
|
`dist_publish_${this.options.packageSubFolder}`
|
|
168
176
|
);
|
|
169
|
-
|
|
177
|
+
|
|
178
|
+
// Ensure empty directory
|
|
179
|
+
const publishDir = plugins.smartfs.directory(this.options.publishModDirFullPath);
|
|
180
|
+
if (await publishDir.exists()) {
|
|
181
|
+
await publishDir.recursive().delete();
|
|
182
|
+
}
|
|
183
|
+
await publishDir.recursive().create();
|
|
170
184
|
|
|
171
185
|
// package.json
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
await this.createPackageJson(),
|
|
175
|
-
'utf8'
|
|
176
|
-
);
|
|
177
|
-
await packageJson.write();
|
|
186
|
+
const packageJsonPath = plugins.path.join(this.options.publishModDirFullPath, 'package.json');
|
|
187
|
+
await plugins.smartfs.file(packageJsonPath).encoding('utf8').write(await this.createPackageJson());
|
|
178
188
|
|
|
179
189
|
// tsconfig.json
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
await this.createTsconfigJson(),
|
|
183
|
-
'utf8'
|
|
184
|
-
);
|
|
185
|
-
await tsconfigJson.write();
|
|
190
|
+
const tsconfigJsonPath = plugins.path.join(this.options.publishModDirFullPath, 'tsconfig.json');
|
|
191
|
+
await plugins.smartfs.file(tsconfigJsonPath).encoding('utf8').write(await this.createTsconfigJson());
|
|
186
192
|
|
|
187
193
|
// ts subfolder, the folder that contains the source code and is being transpiled
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
plugins.path.join(this.options.publishModDirFullPath, this.options.packageSubFolder)
|
|
191
|
-
);
|
|
194
|
+
const destSubFolder = plugins.path.join(this.options.publishModDirFullPath, this.options.packageSubFolder);
|
|
195
|
+
await plugins.smartfs.directory(this.options.packageSubFolderFullPath).recursive().copy(destSubFolder);
|
|
192
196
|
|
|
193
197
|
// readme
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
);
|
|
198
|
+
const readmeSrc = plugins.path.join(this.options.packageSubFolderFullPath, 'readme.md');
|
|
199
|
+
const readmeDest = plugins.path.join(this.options.publishModDirFullPath, 'readme.md');
|
|
200
|
+
await plugins.smartfs.file(readmeSrc).copy(readmeDest);
|
|
198
201
|
|
|
199
202
|
// license
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
);
|
|
203
|
+
const licenseSrc = plugins.path.join(this.options.monoRepoDir, 'license');
|
|
204
|
+
const licenseDest = plugins.path.join(this.options.publishModDirFullPath, 'license');
|
|
205
|
+
await plugins.smartfs.file(licenseSrc).copy(licenseDest);
|
|
204
206
|
|
|
205
207
|
// cli stuff
|
|
206
208
|
this.createBinCliSetup();
|
|
@@ -227,22 +229,104 @@ export class PublishModule {
|
|
|
227
229
|
);
|
|
228
230
|
const indexPath = `./dist_${this.options.packageSubFolder}/index.js`;
|
|
229
231
|
const fileContent = atob(files[0].base64Content).replace('./dist_ts/index.js', indexPath);
|
|
230
|
-
|
|
232
|
+
const cliJsPath = plugins.path.join(this.options.publishModDirFullPath, 'cli.js');
|
|
233
|
+
await plugins.smartfs.file(cliJsPath).encoding('utf8').write(fileContent);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Resolves the registries to publish to based on tspublish.json configuration.
|
|
238
|
+
* Supports:
|
|
239
|
+
* - "useBase": Use only registries from npmextra.json
|
|
240
|
+
* - "extendBase": Use base registries + additions, with exclusions via "-" prefix
|
|
241
|
+
* - Explicit registries: Direct registry URLs in format "url:accessLevel"
|
|
242
|
+
*/
|
|
243
|
+
private async resolveRegistries(): Promise<IResolvedRegistry[]> {
|
|
244
|
+
const rawRegistries = this.options.tsPublishJson?.registries || [];
|
|
245
|
+
|
|
246
|
+
// Empty → skip publishing
|
|
247
|
+
if (rawRegistries.length === 0) {
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const hasUseBase = rawRegistries.includes('useBase');
|
|
252
|
+
const hasExtendBase = rawRegistries.includes('extendBase');
|
|
253
|
+
|
|
254
|
+
let baseRegistries: string[] = [];
|
|
255
|
+
let baseAccessLevel = 'public';
|
|
256
|
+
|
|
257
|
+
// Load base registries from npmextra.json if needed
|
|
258
|
+
if (hasUseBase || hasExtendBase) {
|
|
259
|
+
const npmextraInstance = new plugins.npmextra.Npmextra(this.options.monoRepoDir);
|
|
260
|
+
const gitzoneConfig = npmextraInstance.dataFor<any>('@git.zone/cli', {});
|
|
261
|
+
baseRegistries = gitzoneConfig?.release?.registries || [];
|
|
262
|
+
baseAccessLevel = gitzoneConfig?.release?.accessLevel || 'public';
|
|
263
|
+
|
|
264
|
+
if (baseRegistries.length === 0) {
|
|
265
|
+
throw new Error(
|
|
266
|
+
`useBase/extendBase specified in tspublish.json but no registries configured in npmextra.json at @git.zone/cli.release.registries`
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// useBase: Only base registries
|
|
272
|
+
if (hasUseBase) {
|
|
273
|
+
return baseRegistries.map((url) => ({ url, accessLevel: baseAccessLevel }));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// extendBase: Base registries + additions - exclusions
|
|
277
|
+
if (hasExtendBase) {
|
|
278
|
+
const exclusions = rawRegistries
|
|
279
|
+
.filter((r) => r.startsWith('-'))
|
|
280
|
+
.map((r) => r.slice(1)); // remove '-' prefix
|
|
281
|
+
|
|
282
|
+
const additions = rawRegistries.filter((r) => r !== 'extendBase' && !r.startsWith('-'));
|
|
283
|
+
|
|
284
|
+
// Filter out excluded base registries
|
|
285
|
+
const result: IResolvedRegistry[] = baseRegistries
|
|
286
|
+
.filter((url) => !exclusions.includes(url))
|
|
287
|
+
.map((url) => ({ url, accessLevel: baseAccessLevel }));
|
|
288
|
+
|
|
289
|
+
// Add explicit registries
|
|
290
|
+
for (const addition of additions) {
|
|
291
|
+
const parts = addition.split(':');
|
|
292
|
+
const url = parts[0];
|
|
293
|
+
const access = parts[1] || 'public';
|
|
294
|
+
result.push({ url, accessLevel: access });
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return result;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Explicit registries only (original behavior)
|
|
301
|
+
return rawRegistries.map((r) => {
|
|
302
|
+
const parts = r.split(':');
|
|
303
|
+
const url = parts[0];
|
|
304
|
+
const access = parts[1] || 'public';
|
|
305
|
+
return { url, accessLevel: access };
|
|
306
|
+
});
|
|
231
307
|
}
|
|
232
308
|
|
|
233
309
|
public async publish() {
|
|
234
|
-
|
|
310
|
+
const registries = await this.resolveRegistries();
|
|
311
|
+
|
|
312
|
+
// Handle empty registries
|
|
313
|
+
if (registries.length === 0) {
|
|
314
|
+
logWarn(`No registries configured for ${this.options.name}. Skipping publish.`);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
logPublish(`Publishing ${this.options.name} v${this.options.version} to ${registries.length} registry(ies)...`);
|
|
235
319
|
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
236
320
|
executor: 'bash',
|
|
237
321
|
});
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
const registryUrl =
|
|
241
|
-
|
|
322
|
+
|
|
323
|
+
for (const registry of registries) {
|
|
324
|
+
const registryUrl = registry.url.startsWith('https://') ? registry.url : `https://${registry.url}`;
|
|
325
|
+
logOngoing(`Publishing to ${registryUrl}...`);
|
|
242
326
|
await smartshellInstance.exec(
|
|
243
327
|
`cd ${this.options.publishModDirFullPath} && pnpm publish ${
|
|
244
|
-
|
|
245
|
-
} --no-git-checks --registry
|
|
328
|
+
registry.accessLevel === 'public' ? '--access public' : ''
|
|
329
|
+
} --no-git-checks --registry ${registryUrl}`
|
|
246
330
|
);
|
|
247
331
|
}
|
|
248
332
|
logSuccess(`Successfully published ${this.options.name} v${this.options.version}!`);
|
package/ts/classes.tspublish.ts
CHANGED
|
@@ -43,22 +43,27 @@ export class TsPublish {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
public async getModuleSubDirs(dirArg: string) {
|
|
46
|
-
|
|
46
|
+
// List all directories
|
|
47
|
+
const dirContents = await plugins.smartfs.directory(dirArg).list();
|
|
47
48
|
const publishModules: { [key: string]: interfaces.ITsPublishJson } = {};
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
|
|
50
|
+
for (const entry of dirContents) {
|
|
51
|
+
const subDirName = entry.name;
|
|
52
|
+
if (!subDirName.startsWith('ts')) {
|
|
50
53
|
continue;
|
|
51
54
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
|
|
56
|
+
// Check if this is a directory and has tspublish.json
|
|
57
|
+
const subDirPath = plugins.path.join(dirArg, subDirName);
|
|
58
|
+
const tspublishJsonPath = plugins.path.join(subDirPath, 'tspublish.json');
|
|
59
|
+
|
|
60
|
+
if (!(await plugins.smartfs.file(tspublishJsonPath).exists())) {
|
|
55
61
|
continue;
|
|
56
62
|
}
|
|
57
63
|
|
|
58
|
-
logPackage('Found module',
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
);
|
|
64
|
+
logPackage('Found module', subDirName);
|
|
65
|
+
const tspublishContent = await plugins.smartfs.file(tspublishJsonPath).encoding('utf8').read();
|
|
66
|
+
publishModules[subDirName] = JSON.parse(tspublishContent as string);
|
|
62
67
|
}
|
|
63
68
|
logSuccess(`Found ${Object.keys(publishModules).length} publish modules`);
|
|
64
69
|
logInfo('Ordering publish modules...');
|
package/ts/plugins.ts
CHANGED
|
@@ -4,7 +4,9 @@ export { path };
|
|
|
4
4
|
|
|
5
5
|
// @push.rocks scope
|
|
6
6
|
import * as consolecolor from '@push.rocks/consolecolor';
|
|
7
|
+
import * as npmextra from '@push.rocks/npmextra';
|
|
7
8
|
import * as smartfile from '@push.rocks/smartfile';
|
|
9
|
+
import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs';
|
|
8
10
|
import * as smartcli from '@push.rocks/smartcli';
|
|
9
11
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
10
12
|
import * as smartlog from '@push.rocks/smartlog';
|
|
@@ -13,4 +15,7 @@ import * as smartpath from '@push.rocks/smartpath';
|
|
|
13
15
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
14
16
|
import * as smartshell from '@push.rocks/smartshell';
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
// Create a pre-configured SmartFs instance for Node.js filesystem operations
|
|
19
|
+
const smartfs = new SmartFs(new SmartFsProviderNode());
|
|
20
|
+
|
|
21
|
+
export { consolecolor, npmextra, smartfile, smartfs, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };
|