@git.zone/tspublish 1.10.3 → 1.11.2

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tspublish',
6
- version: '1.10.3',
6
+ version: '1.11.2',
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
- this.options.tsPublishJson = plugins.smartfile.fs.toObjectSync(plugins.path.join(this.options.packageSubFolderFullPath, 'tspublish.json'));
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 monoRepoPackageJson = JSON.parse(plugins.smartfile.fs.toStringSync(plugins.path.join(this.options.monoRepoDir, 'package.json')));
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 originalTsConfig = plugins.smartfile.fs.toObjectSync(plugins.path.join(paths.cwd, 'tsconfig.json'));
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
- await plugins.smartfile.fs.ensureEmptyDir(this.options.publishModDirFullPath);
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 packageJson = await plugins.smartfile.SmartFile.fromString(plugins.path.join(this.options.publishModDirFullPath, 'package.json'), await this.createPackageJson(), 'utf8');
133
- await packageJson.write();
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 tsconfigJson = await plugins.smartfile.SmartFile.fromString(plugins.path.join(this.options.publishModDirFullPath, 'tsconfig.json'), await this.createTsconfigJson(), 'utf8');
136
- await tsconfigJson.write();
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
- await plugins.smartfile.fs.copy(this.options.packageSubFolderFullPath, plugins.path.join(this.options.publishModDirFullPath, this.options.packageSubFolder));
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
- await plugins.smartfile.fs.copy(plugins.path.join(this.options.packageSubFolderFullPath, 'readme.md'), plugins.path.join(this.options.publishModDirFullPath, 'readme.md'));
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
- await plugins.smartfile.fs.copy(plugins.path.join(this.options.monoRepoDir, 'license'), plugins.path.join(this.options.publishModDirFullPath, 'license'));
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
- await plugins.smartfile.memory.toFs(fileContent, plugins.path.join(this.options.publishModDirFullPath, 'cli.js'));
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
- logPublish(`Publishing ${this.options.name} v${this.options.version}...`);
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 this.options.tsPublishJson.registries) {
169
- const registryArray = registry.split(':');
170
- const registryUrl = registryArray[0];
171
- const registryAccessLevel = registryArray[1];
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wdWJsaXNobW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5wdWJsaXNobW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkksT0FBTyxFQUF1QixNQUFNLHVCQUF1QixDQUFDO0FBbUI1RCxNQUFNLE9BQU8sYUFBYTtJQUd4QixZQUFZLFlBQXVCLEVBQUUsT0FBOEI7UUFDakUsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQzlCLENBQUM7UUFFRixxQkFBcUI7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBOEIsQ0FBQyxDQUFDO1FBRXhFLDJDQUEyQztRQUMzQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNwRixNQUFNLGtCQUFrQixHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9GLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBNEIsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHO1lBQzFCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZO1lBQzVCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1AsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7Z0JBQzlCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ2pFLElBQUksbUJBQW1CLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7d0JBQ2pELGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDaEYsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztvQkFDL0QsQ0FBQztnQkFDSCxDQUFDO2dCQUNELE9BQU8sa0JBQWtCLENBQUM7WUFDNUIsQ0FBQyxDQUFDLEVBQUU7U0FDTCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztRQUVuRCxpSEFBaUg7UUFDakgsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO1FBQ3ZGLElBQUksV0FBd0MsQ0FBQztRQUM3QyxJQUFJLENBQUM7WUFDSCxXQUFXLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSwwREFBMEQsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFGLE9BQU8sQ0FBQywwQkFBMEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4RixJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELFFBQVEsQ0FDTixXQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxnQ0FBZ0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FDbkYsQ0FBQztnQkFDRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxJQUFZO1FBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtRQUN2RixNQUFNLFdBQVcsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksWUFBWSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDNUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0I7UUFDN0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNuRSxJQUFJLGdCQUFnQixHQUFRLElBQUksQ0FBQztRQUNqQyxJQUFJLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUN0RCxNQUFNLGVBQWUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6RixnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQXlCLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDN0MsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUNwQyxJQUFJLENBQ0wsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHO1lBQ25CLGVBQWUsRUFBRTtnQkFDZixzQkFBc0IsRUFBRSxJQUFJO2dCQUM1Qix1QkFBdUIsRUFBRSxLQUFLO2dCQUM5QixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGdCQUFnQixFQUFFLFVBQVU7Z0JBQzVCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLEtBQUs7YUFDaEQ7WUFDRCxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztTQUM5QixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUI7UUFDNUIsTUFBTSxXQUFXLEdBQUc7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO1lBQzdCLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLEVBQUU7WUFDZixPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxFQUFFO29CQUNILE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLFdBQVc7aUJBQzNEO2FBQ0Y7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLHNDQUFzQzthQUM5QztZQUNELFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVk7WUFDdkMsZUFBZSxFQUFFO2dCQUNmLG1CQUFtQixFQUFFLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDO2FBQy9FO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLFNBQVM7Z0JBQ1QsV0FBVztnQkFDWCxXQUFXO2dCQUNYLGFBQWE7Z0JBQ2IsY0FBYztnQkFDZCxrQkFBa0I7Z0JBQ2xCLGFBQWE7Z0JBQ2IsUUFBUTtnQkFDUixlQUFlO2dCQUNmLFdBQVc7YUFDWjtZQUNELEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFO29CQUNULE1BQU0sU0FBUyxHQUE0QixFQUFFLENBQUM7b0JBQzlDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2pELFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7b0JBQzlCLENBQUM7b0JBQ0QsT0FBTyxTQUFTLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxFQUFFO2FBQ0wsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUNQLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQjtRQUNqQyxVQUFVLENBQUMsa0NBQWtDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDeEIsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FDaEQsQ0FBQztRQUVGLHlCQUF5QjtRQUN6QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDakYsSUFBSSxNQUFNLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxNQUFNLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUV0QyxlQUFlO1FBQ2YsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM5RixNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBRW5HLGdCQUFnQjtRQUNoQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDaEcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBRXJHLGlGQUFpRjtRQUNqRixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMzRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdkcsU0FBUztRQUNULE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEYsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RixNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV2RCxVQUFVO1FBQ1YsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRixNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6RCxZQUFZO1FBQ1osSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLFFBQVEsQ0FBQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDM0QsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixvQkFBb0IsQ0FBQyxDQUFDO1FBQzVGLFVBQVUsQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxLQUFLLENBQUMsaUJBQWlCO1FBQzVCLE1BQU0sZUFBZSxHQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHO1lBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQ2hFLFVBQVUsRUFDVixLQUFLLEVBQ0wsNkJBQTZCLENBQzlCLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLFdBQVcsQ0FBQztRQUNyRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQjtRQUM3QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO1FBRW5FLDBCQUEwQjtRQUMxQixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNELElBQUksY0FBYyxHQUFhLEVBQUUsQ0FBQztRQUNsQyxJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFFL0Isb0RBQW9EO1FBQ3BELElBQUksVUFBVSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBTSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekUsY0FBYyxHQUFHLGFBQWEsRUFBRSxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUMxRCxlQUFlLEdBQUcsYUFBYSxFQUFFLE9BQU8sRUFBRSxXQUFXLElBQUksUUFBUSxDQUFDO1lBRWxFLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYixrSUFBa0ksQ0FDbkksQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsdURBQXVEO1FBQ3ZELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsTUFBTSxVQUFVLEdBQUcsYUFBYTtpQkFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtZQUUvQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXhGLHNDQUFzQztZQUN0QyxNQUFNLE1BQU0sR0FBd0IsY0FBYztpQkFDL0MsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXpELDBCQUEwQjtZQUMxQixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztZQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTztRQUNsQixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRWxELDBCQUEwQjtRQUMxQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUkscUJBQXFCLENBQUMsQ0FBQztZQUNoRixPQUFPO1FBQ1QsQ0FBQztRQUVELFVBQVUsQ0FBQyxjQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxPQUFPLFVBQVUsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLENBQUM7UUFDaEgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQzNELFFBQVEsRUFBRSxNQUFNO1NBQ2pCLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25HLFVBQVUsQ0FBQyxpQkFBaUIsV0FBVyxLQUFLLENBQUMsQ0FBQztZQUM5QyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FDM0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixvQkFDdEMsUUFBUSxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUMxRCwrQkFBK0IsV0FBVyxFQUFFLENBQzdDLENBQUM7UUFDSixDQUFDO1FBQ0QsVUFBVSxDQUFDLDBCQUEwQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDdEYsQ0FBQztDQUNGIn0=
@@ -37,23 +37,27 @@ export class TsPublish {
37
37
  }
38
38
  }
39
39
  async getModuleSubDirs(dirArg) {
40
- const subDirs = await plugins.smartfile.fs.listFolders(dirArg);
40
+ // List all directories
41
+ const dirContents = await plugins.smartfs.directory(dirArg).list();
41
42
  const publishModules = {};
42
- for (const subDir of subDirs) {
43
- if (!subDir.startsWith('ts')) {
43
+ for (const entry of dirContents) {
44
+ const subDirName = entry.name;
45
+ if (!subDirName.startsWith('ts')) {
44
46
  continue;
45
47
  }
46
- const fileTree = await plugins.smartfile.fs.listFileTree(subDir, '**/*');
47
- const hasPublishJson = fileTree.includes('tspublish.json');
48
- if (!hasPublishJson) {
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', subDir);
52
- publishModules[subDir] = JSON.parse(plugins.smartfile.fs.toStringSync(plugins.path.join(subDir, 'tspublish.json')));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c3B1Ymxpc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnRzcHVibGlzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuSixPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsTUFBTSxPQUFPLFNBQVM7SUFHcEI7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDekMsWUFBWSxFQUFFLDBCQUEwQjtTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFzQjtRQUN6QyxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUMxQyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRSxPQUFPLENBQUMsU0FBUyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxZQUFZLEVBQUUsQ0FBQztRQUNmLEtBQUssTUFBTSxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3hELFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxhQUFhLE1BQU0sY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElB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
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c3B1Ymxpc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnRzcHVibGlzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuSixPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsTUFBTSxPQUFPLFNBQVM7SUFHcEI7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDekMsWUFBWSxFQUFFLDBCQUEwQjtTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFzQjtRQUN6QyxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUMxQyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRSxPQUFPLENBQUMsU0FBUyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxZQUFZLEVBQUUsQ0FBQztRQUNmLEtBQUssTUFBTSxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3hELFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxhQUFhLE1BQU0sY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElB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
@@ -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
- export { consolecolor, smartfile, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };
14
+ declare const smartfs: SmartFs;
15
+ export { consolecolor, npmextra, smartfile, smartfs, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };
@@ -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
- export { consolecolor, smartfile, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMifQ==
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
- "gitzone": {
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
- "npmci": {
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.10.3",
3
+ "version": "1.11.2",
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": "^2.6.6",
16
- "@git.zone/tsbundle": "^2.5.1",
17
- "@git.zone/tsrun": "^1.3.3",
18
- "@git.zone/tstest": "^2.3.4",
19
- "@types/node": "^22.8.7"
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,14 +48,16 @@
43
48
  ],
44
49
  "dependencies": {
45
50
  "@push.rocks/consolecolor": "^2.0.3",
46
- "@push.rocks/smartcli": "^4.0.11",
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": "^11.2.7",
49
- "@push.rocks/smartlog": "^3.1.8",
54
+ "@push.rocks/smartfile": "^13.1.2",
55
+ "@push.rocks/smartfs": "^1.3.1",
56
+ "@push.rocks/smartlog": "^3.1.10",
50
57
  "@push.rocks/smartnpm": "^2.0.6",
51
58
  "@push.rocks/smartpath": "^6.0.0",
52
- "@push.rocks/smartrequest": "^4.2.2",
53
- "@push.rocks/smartshell": "^3.3.0"
59
+ "@push.rocks/smartrequest": "^5.0.1",
60
+ "@push.rocks/smartshell": "^3.3.7"
54
61
  },
55
62
  "keywords": [
56
63
  "typescript",
@@ -64,9 +71,5 @@
64
71
  "module-management",
65
72
  "developer-tools"
66
73
  ],
67
- "scripts": {
68
- "test": "(tstest test/ --verbose --testlog --timeout 30)",
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
- ## 🔮 Future Features
350
-
351
- - 🎯 Selective publishing with pattern matching
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 that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
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. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
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 court Bremen HRB 35230 HB, Germany
407
+ Task Venture Capital GmbH
408
+ Registered at District Court Bremen HRB 35230 HB, Germany
372
409
 
373
- For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
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.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tspublish',
6
- version: '1.10.3',
6
+ version: '1.11.2',
7
7
  description: 'A tool to publish multiple, concise, and small packages from monorepos, specifically for TypeScript projects within a git environment.'
8
8
  }
@@ -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
- this.options.tsPublishJson = plugins.smartfile.fs.toObjectSync(
38
- plugins.path.join(this.options.packageSubFolderFullPath, 'tspublish.json')
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 monoRepoPackageJson = JSON.parse(
43
- plugins.smartfile.fs.toStringSync(plugins.path.join(this.options.monoRepoDir, 'package.json'))
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 originalTsConfig = plugins.smartfile.fs.toObjectSync(
95
- plugins.path.join(paths.cwd, 'tsconfig.json')
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
- await plugins.smartfile.fs.ensureEmptyDir(this.options.publishModDirFullPath);
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 packageJson = await plugins.smartfile.SmartFile.fromString(
173
- plugins.path.join(this.options.publishModDirFullPath, 'package.json'),
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 tsconfigJson = await plugins.smartfile.SmartFile.fromString(
181
- plugins.path.join(this.options.publishModDirFullPath, 'tsconfig.json'),
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
- await plugins.smartfile.fs.copy(
189
- this.options.packageSubFolderFullPath,
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
- await plugins.smartfile.fs.copy(
195
- plugins.path.join(this.options.packageSubFolderFullPath, 'readme.md'),
196
- plugins.path.join(this.options.publishModDirFullPath, 'readme.md')
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
- await plugins.smartfile.fs.copy(
201
- plugins.path.join(this.options.monoRepoDir, 'license'),
202
- plugins.path.join(this.options.publishModDirFullPath, 'license')
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
- await plugins.smartfile.memory.toFs(fileContent, plugins.path.join(this.options.publishModDirFullPath, 'cli.js'));
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
- logPublish(`Publishing ${this.options.name} v${this.options.version}...`);
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
- for (const registry of this.options.tsPublishJson.registries) {
239
- const registryArray = registry.split(':');
240
- const registryUrl = registryArray[0];
241
- const registryAccessLevel = registryArray[1];
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
- registryAccessLevel === 'public' ? '--access public' : ''
245
- } --no-git-checks --registry https://${registryUrl}`
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}!`);
@@ -43,22 +43,27 @@ export class TsPublish {
43
43
  }
44
44
 
45
45
  public async getModuleSubDirs(dirArg: string) {
46
- const subDirs = await plugins.smartfile.fs.listFolders(dirArg);
46
+ // List all directories
47
+ const dirContents = await plugins.smartfs.directory(dirArg).list();
47
48
  const publishModules: { [key: string]: interfaces.ITsPublishJson } = {};
48
- for (const subDir of subDirs) {
49
- if (!subDir.startsWith('ts')) {
49
+
50
+ for (const entry of dirContents) {
51
+ const subDirName = entry.name;
52
+ if (!subDirName.startsWith('ts')) {
50
53
  continue;
51
54
  }
52
- const fileTree = await plugins.smartfile.fs.listFileTree(subDir, '**/*');
53
- const hasPublishJson = fileTree.includes('tspublish.json');
54
- if (!hasPublishJson) {
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', subDir);
59
- publishModules[subDir] = JSON.parse(
60
- plugins.smartfile.fs.toStringSync(plugins.path.join(subDir, 'tspublish.json'))
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
- export { consolecolor, smartfile, smartcli, smartdelay, smartlog, smartnpm, smartpath, smartrequest, smartshell };
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 };