@mxpicture/build-api 0.2.7 โ†’ 0.2.8

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.
@@ -1,6 +1,7 @@
1
1
  import { basename, dirname, join, relative } from "node:path";
2
2
  import { readdir, rm, writeFile } from "node:fs/promises";
3
3
  import { Pkg } from "../pkg/Pkg.js";
4
+ import { logInfo, logSuccess } from "../logger/Logger.js";
4
5
  // /** File patterns to exclude from barrel exports */
5
6
  export const DEFAULT_EXCLUDED_PATTERNS = [
6
7
  /\.test\.ts$/,
@@ -93,18 +94,18 @@ export class Barrel {
93
94
  try {
94
95
  const pkgJson = new Pkg(packageJsonPath);
95
96
  const pkgName = relative(this.packagesDir, packageDir);
96
- console.log(`๐Ÿ“ฆ updating ${pkgName} package.json ...`);
97
+ logInfo(`๐Ÿ“ฆ updating ${pkgName} package.json ...`);
97
98
  const pkg = await pkgJson.readJson();
98
99
  if (!this.hasExportsChanged(exports, pkg.exports)) {
99
- console.log(`๐Ÿงน No changes in ${pkgName}, nothing to do`);
100
+ logInfo(`๐Ÿงน No changes in ${pkgName}, nothing to do`);
100
101
  return;
101
102
  }
102
103
  pkg.exports = { ...exports };
103
104
  await pkgJson.writeJson(pkg);
104
- console.log(`โœ… ${pkgName} update successful`);
105
+ logSuccess(`โœ… ${pkgName} update successful`);
105
106
  }
106
107
  catch (error) {
107
- console.log(error);
108
+ logInfo(error);
108
109
  }
109
110
  }
110
111
  hasExportsChanged(a, b) {
@@ -1,18 +1,10 @@
1
- import { ToBeDeleted, ToCleanup } from "../types/types.cleanup.js";
1
+ import { CleanupParams, ToBeDeleted, ToCleanup } from "../types/types.cleanup.js";
2
2
  import { WorkspacePaths } from "../workspace/WorkspacePaths.js";
3
- import { Logger } from "../types/types.workspace.js";
4
- export interface CleanupParams {
5
- repoRoot: string;
6
- workspacesName?: string;
7
- logger?: Logger;
8
- toBeDeleted?: ToBeDeleted[];
9
- }
10
3
  export declare const runCleanup: (params: CleanupParams) => Promise<void>;
11
4
  export declare class Cleanup {
12
5
  protected readonly paths: WorkspacePaths;
13
- protected readonly log: Logger;
14
6
  protected readonly toBeDeleted: ToBeDeleted[];
15
- constructor(paths: WorkspacePaths, log: Logger, toBeDeleted: ToBeDeleted[]);
7
+ constructor(paths: WorkspacePaths, toBeDeleted: ToBeDeleted[]);
16
8
  run(): Promise<void>;
17
9
  read(): Promise<ToCleanup[]>;
18
10
  cleanup(toCleanups: ToCleanup[]): Promise<void>;
@@ -1,6 +1,7 @@
1
1
  import { readdir, rename, rm } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { WorkspacePaths } from "../workspace/WorkspacePaths.js";
4
+ import { logError, logInfo, logSuccess } from "../logger/Logger.js";
4
5
  // moveSuffix: e.g. mv node_modules node_modules_tmp && rm -rf node_modules_tmp (async)
5
6
  const DEFAULT_TO_BE_DELETED = [
6
7
  { name: "node_modules", moveSuffix: "_tmp" },
@@ -8,14 +9,12 @@ const DEFAULT_TO_BE_DELETED = [
8
9
  { name: "tsconfig.tsbuildinfo" },
9
10
  { name: ".tsbuildinfo" },
10
11
  ];
11
- export const runCleanup = async (params) => new Cleanup(WorkspacePaths.instance(params.repoRoot, params.workspacesName), params.logger ?? (() => { }), params.toBeDeleted ?? DEFAULT_TO_BE_DELETED).run();
12
+ export const runCleanup = async (params) => new Cleanup(WorkspacePaths.instance(params.repoRoot, params.workspacesName), params.toBeDeleted ?? DEFAULT_TO_BE_DELETED).run();
12
13
  export class Cleanup {
13
14
  paths;
14
- log;
15
15
  toBeDeleted;
16
- constructor(paths, log, toBeDeleted) {
16
+ constructor(paths, toBeDeleted) {
17
17
  this.paths = paths;
18
- this.log = log;
19
18
  this.toBeDeleted = toBeDeleted;
20
19
  }
21
20
  async run() {
@@ -34,24 +33,24 @@ export class Cleanup {
34
33
  await Promise.all(toCleanups.map(async (x) => this.cleanupSingle(x)));
35
34
  }
36
35
  async cleanupSingle(toCleanup) {
37
- this.log(`๐Ÿงน Cleanup started ${toCleanup.name} ...`);
36
+ logInfo(`๐Ÿงน Cleanup started ${toCleanup.name} ...`);
38
37
  try {
39
38
  if (!toCleanup.moveTo) {
40
39
  await this.remove(toCleanup);
41
- this.log(`โœ… ${toCleanup.name} removed sucessfully`);
40
+ logSuccess(`โœ… ${toCleanup.name} removed sucessfully`);
42
41
  return;
43
42
  }
44
- this.log(`๐Ÿ“ฆ Moving ${toCleanup.name} to ${toCleanup.name}${toCleanup.moveSuffix}`);
43
+ logInfo(`๐Ÿ“ฆ Moving ${toCleanup.name} to ${toCleanup.name}${toCleanup.moveSuffix}`);
45
44
  await this.move(toCleanup);
46
- this.log(`๐Ÿ“ฆ Start async removing ${toCleanup.name} (${toCleanup.name}${toCleanup.moveSuffix})`);
45
+ logInfo(`๐Ÿ“ฆ Start async removing ${toCleanup.name} (${toCleanup.name}${toCleanup.moveSuffix})`);
47
46
  this.remove(toCleanup)
48
- .then(() => this.log(`โœ… ${toCleanup.name} (async) removed sucessfully`))
47
+ .then(() => logSuccess(`โœ… ${toCleanup.name} (async) removed sucessfully`))
49
48
  .catch((e) => {
50
- this.log(`โŒ Removing ${toCleanup.name} (async) failed ${e}`);
49
+ logError(`โŒ Removing ${toCleanup.name} (async) failed ${e}`);
51
50
  });
52
51
  }
53
52
  catch (error) {
54
- this.log(`โŒ Removing ${toCleanup.name} failed ${error}`);
53
+ logError(`โŒ Removing ${toCleanup.name} failed ${error}`);
55
54
  }
56
55
  }
57
56
  async readDir(dir) {
@@ -1,10 +1,5 @@
1
- import { DepsProcessMode, DepsReplacementMode } from "../types/types.deps.js";
2
- import { FixWorkspaceDepsMain, FixWorkspaceDepsParams } from "../types/types.workspace.js";
3
- export declare const runFixDeps: (p: {
4
- repoRoot: string;
5
- mode: DepsProcessMode;
6
- replacement: DepsReplacementMode;
7
- }) => Promise<void>;
1
+ import { DepsProcessMode, DepsReplacementMode, FixWorkspaceDepsData, FixWorkspaceDepsMain, FixWorkspaceDepsParams } from "../types/types.deps.js";
2
+ export declare const runFixDeps: (p: FixWorkspaceDepsParams) => Promise<void>;
8
3
  export declare const instanceFixDeps: (p: {
9
4
  repoRoot: string;
10
5
  mode: DepsProcessMode;
@@ -14,17 +9,17 @@ export declare abstract class IFixWorkspaceDeps {
14
9
  readonly repoRoot: string;
15
10
  readonly mode: DepsProcessMode;
16
11
  constructor(repoRoot: string, mode: DepsProcessMode);
17
- protected abstract fixVersion(p: FixWorkspaceDepsParams): string | null;
18
- protected abstract restoreVersion(p: FixWorkspaceDepsParams): string | null;
12
+ protected abstract fixVersion(p: FixWorkspaceDepsData): string | null;
13
+ protected abstract restoreVersion(p: FixWorkspaceDepsData): string | null;
19
14
  run(): Promise<void>;
20
15
  protected handleDependencies(deps: Record<string, string> | undefined, p: FixWorkspaceDepsMain): boolean;
21
16
  protected runSingle(p: FixWorkspaceDepsMain): boolean;
22
17
  }
23
18
  export declare class FixWorkspaceDepsVersion extends IFixWorkspaceDeps {
24
- protected fixVersion(p: FixWorkspaceDepsParams): string | null;
25
- protected restoreVersion(p: FixWorkspaceDepsParams): string | null;
19
+ protected fixVersion(p: FixWorkspaceDepsData): string | null;
20
+ protected restoreVersion(p: FixWorkspaceDepsData): string | null;
26
21
  }
27
22
  export declare class FixWorkspaceDepsFile extends IFixWorkspaceDeps {
28
- protected fixVersion(p: FixWorkspaceDepsParams): string | null;
29
- protected restoreVersion(p: FixWorkspaceDepsParams): string | null;
23
+ protected fixVersion(p: FixWorkspaceDepsData): string | null;
24
+ protected restoreVersion(p: FixWorkspaceDepsData): string | null;
30
25
  }
@@ -1,4 +1,5 @@
1
- import { DepsReplacementMode } from "../types/types.deps.js";
1
+ import { logInfo, logSuccess } from "../logger/Logger.js";
2
+ import { DepsReplacementMode, } from "../types/types.deps.js";
2
3
  import { buildMapEntries, readPackageJsons, writePackageJsons, } from "../workspace/workspace.common.js";
3
4
  export const runFixDeps = async (p) => instanceFixDeps(p).run();
4
5
  export const instanceFixDeps = (p) => p.replacement === DepsReplacementMode.version
@@ -13,9 +14,9 @@ export class IFixWorkspaceDeps {
13
14
  }
14
15
  async run() {
15
16
  if (this.mode === "fix")
16
- console.log("๐Ÿ”ง Fixing workspace dependencies...\n");
17
+ logInfo("๐Ÿ”ง Fixing workspace dependencies...\n");
17
18
  else
18
- console.log("๐Ÿ”ง Restoring workspace dependencies...\n");
19
+ logInfo("๐Ÿ”ง Restoring workspace dependencies...\n");
19
20
  const pkgs = await readPackageJsons(this.repoRoot);
20
21
  const mapEntries = buildMapEntries(pkgs);
21
22
  const versionMap = new Map();
@@ -24,12 +25,12 @@ export class IFixWorkspaceDeps {
24
25
  versionMap.set(pkg.content.name, pkg.content.version);
25
26
  workspacePackages.add(pkg.content.name);
26
27
  }
27
- console.log("๐Ÿ“‹ Version map:");
28
+ logInfo("๐Ÿ“‹ Version map:");
28
29
  for (const map of mapEntries)
29
- console.log(` ${map.fromPkg.content.name} --> ${map.toPkg.content.name}: ${map.relPath}`);
30
- console.log();
30
+ logInfo(` ${map.fromPkg.content.name} --> ${map.toPkg.content.name}: ${map.relPath}`);
31
+ logInfo();
31
32
  for (const consumingPkg of pkgs) {
32
- console.log(`๐Ÿ“ฆ Processing ${consumingPkg.content.name}...`);
33
+ logInfo(`๐Ÿ“ฆ Processing ${consumingPkg.content.name}...`);
33
34
  try {
34
35
  consumingPkg.modified = this.runSingle({
35
36
  consumingPkg,
@@ -45,9 +46,9 @@ export class IFixWorkspaceDeps {
45
46
  }
46
47
  await writePackageJsons(pkgs);
47
48
  if (this.mode === "fix")
48
- console.log("โœ… Done fixing workspace dependencies!");
49
+ logSuccess("โœ… Done fixing workspace dependencies!");
49
50
  else
50
- console.log("โœ… Done restoring workspace dependencies!");
51
+ logSuccess("โœ… Done restoring workspace dependencies!");
51
52
  }
52
53
  // Replace workspace:* with file:...
53
54
  handleDependencies(deps, p) {
@@ -59,7 +60,7 @@ export class IFixWorkspaceDeps {
59
60
  const newVersion = handler({ ...p, pkg: name, version });
60
61
  if (!newVersion)
61
62
  continue;
62
- console.log(` โœ“ Replaced ${name}: ${version} โ†’ ${newVersion}`);
63
+ logInfo(` โœ“ Replaced ${name}: ${version} โ†’ ${newVersion}`);
63
64
  deps[name] = newVersion;
64
65
  modified = true;
65
66
  }
@@ -0,0 +1,12 @@
1
+ export type LoggerHandler = (...data: any[]) => void;
2
+ export interface Logger {
3
+ success: LoggerHandler;
4
+ error: LoggerHandler;
5
+ info: LoggerHandler;
6
+ }
7
+ export declare const setLogger: (log: Logger) => Logger;
8
+ export declare const logger: () => Logger;
9
+ export declare const logSuccess: LoggerHandler;
10
+ export declare const logError: LoggerHandler;
11
+ export declare const logInfo: LoggerHandler;
12
+ export declare const consoleLogger: Logger;
@@ -0,0 +1,19 @@
1
+ let __logger = null;
2
+ export const setLogger = (log) => (__logger = log);
3
+ export const logger = () => __logger ?? dummyLogger;
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ export const logSuccess = (...data) => logger().success(...data);
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ export const logError = (...data) => logger().error(...data);
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ export const logInfo = (...data) => logger().info(...data);
10
+ const dummyLogger = {
11
+ success: () => { },
12
+ error: () => { },
13
+ info: () => { },
14
+ };
15
+ export const consoleLogger = {
16
+ success: console.log,
17
+ error: console.error,
18
+ info: console.log,
19
+ };
@@ -0,0 +1 @@
1
+ export * from "./Logger.js";
@@ -0,0 +1,2 @@
1
+ // This file is auto-generated. Do not edit manually.
2
+ export * from "./Logger.js";
@@ -0,0 +1,8 @@
1
+ import { NpmPublisherParams } from "../types/types.npm.js";
2
+ export declare const runNpmPublisher: (params: NpmPublisherParams) => Promise<void>;
3
+ export declare class NpmPublisher {
4
+ protected readonly packagesDir: string;
5
+ constructor(packagesDir: string);
6
+ run(): Promise<void>;
7
+ protected runPackage(dir: string): Promise<void>;
8
+ }
@@ -0,0 +1,58 @@
1
+ import { readdir } from "fs/promises";
2
+ import { join } from "path";
3
+ import { readPackageJson } from "../workspace/workspace.common.js";
4
+ import { exec as execCb } from "node:child_process";
5
+ import { promisify } from "node:util";
6
+ import { logError, logInfo, logSuccess } from "../logger/Logger.js";
7
+ const exec = promisify(execCb);
8
+ export const runNpmPublisher = async (params) => new NpmPublisher(params.packagesDir).run();
9
+ export class NpmPublisher {
10
+ packagesDir;
11
+ constructor(packagesDir) {
12
+ this.packagesDir = packagesDir;
13
+ }
14
+ async run() {
15
+ const packageDirs = (await readdir(this.packagesDir, { withFileTypes: true }))
16
+ .filter((d) => d.isDirectory())
17
+ .map((d) => join(this.packagesDir, d.name));
18
+ const results = await Promise.allSettled(packageDirs.map((d) => this.runPackage(d)));
19
+ const failures = results.filter((r) => r.status === "rejected");
20
+ if (failures.length > 0) {
21
+ console.error(`\nโŒ ${failures.length} package(s) failed to publish:`);
22
+ failures.forEach((failure) => {
23
+ console.error(failure.reason);
24
+ });
25
+ process.exit(1);
26
+ }
27
+ }
28
+ async runPackage(dir) {
29
+ const pkg = await readPackageJson(join(dir, "package.json"));
30
+ if (!pkg || pkg.private)
31
+ return;
32
+ const { name, version } = pkg;
33
+ logInfo(`๐Ÿ“ฆ Publishing ${name}@${version} ... (${new Date().toISOString()})`);
34
+ // Check if this exact version is already published
35
+ try {
36
+ const { stdout } = await exec(`npm view ${name}@${version} version`);
37
+ const published = stdout.trim();
38
+ if (published === version) {
39
+ logInfo(`โญ๏ธ ${name}@${version} already published, skipping.`);
40
+ return;
41
+ }
42
+ }
43
+ catch {
44
+ // npm view exits non-zero if the package/version doesn't exist โ€” means we should publish
45
+ }
46
+ try {
47
+ await exec("npm publish --access public", {
48
+ cwd: dir,
49
+ });
50
+ logSuccess(`โœ… ${name}@${version} published successfully (${new Date().toISOString()}).`);
51
+ }
52
+ catch (err) {
53
+ const errorMessage = `Failed to publish ${name}@${version} (${new Date().toISOString()})`;
54
+ logError(`โŒ ${errorMessage}`);
55
+ throw new Error(errorMessage, { cause: err });
56
+ }
57
+ }
58
+ }
@@ -0,0 +1 @@
1
+ export * from "./NpmPublisher.js";
@@ -0,0 +1,2 @@
1
+ // This file is auto-generated. Do not edit manually.
2
+ export * from "./NpmPublisher.js";
@@ -1,6 +1,7 @@
1
1
  export * from "./types.barrel.js";
2
2
  export * from "./types.cleanup.js";
3
3
  export * from "./types.deps.js";
4
+ export * from "./types.npm.js";
4
5
  export * from "./types.os.js";
5
6
  export * from "./types.package.js";
6
7
  export * from "./types.vscode.js";
@@ -2,6 +2,7 @@
2
2
  export * from "./types.barrel.js";
3
3
  export * from "./types.cleanup.js";
4
4
  export * from "./types.deps.js";
5
+ export * from "./types.npm.js";
5
6
  export * from "./types.os.js";
6
7
  export * from "./types.package.js";
7
8
  export * from "./types.vscode.js";
@@ -6,3 +6,8 @@ export interface ToCleanup extends ToBeDeleted {
6
6
  path: string;
7
7
  moveTo?: string;
8
8
  }
9
+ export interface CleanupParams {
10
+ repoRoot: string;
11
+ workspacesName?: string;
12
+ toBeDeleted?: ToBeDeleted[];
13
+ }
@@ -1,3 +1,4 @@
1
+ import { MapEntry, PackageEntry } from "./types.package.js";
1
2
  export declare enum DepsProcessMode {
2
3
  fix = "fix",
3
4
  restore = "restore"
@@ -6,3 +7,18 @@ export declare enum DepsReplacementMode {
6
7
  version = "version",
7
8
  file = "file"
8
9
  }
10
+ export interface FixWorkspaceDepsMain {
11
+ mapEntries: MapEntry[];
12
+ consumingPkg: PackageEntry;
13
+ versionMap: Map<string, string>;
14
+ workspacePackages: Set<string>;
15
+ }
16
+ export interface FixWorkspaceDepsData extends FixWorkspaceDepsMain {
17
+ pkg: string;
18
+ version: string;
19
+ }
20
+ export interface FixWorkspaceDepsParams {
21
+ repoRoot: string;
22
+ mode: DepsProcessMode;
23
+ replacement: DepsReplacementMode;
24
+ }
@@ -0,0 +1,3 @@
1
+ export interface NpmPublisherParams {
2
+ packagesDir: string;
3
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,3 @@
1
- import { MapEntry, PackageEntry } from "./types.package.js";
2
- export type Logger = (...data: any[]) => void;
3
1
  export interface PnpmWorkspace {
4
2
  packages: string[];
5
3
  }
@@ -15,13 +13,3 @@ export interface WorkspaceFile {
15
13
  level: number;
16
14
  type: WorkspaceFileType;
17
15
  }
18
- export interface FixWorkspaceDepsMain {
19
- mapEntries: MapEntry[];
20
- consumingPkg: PackageEntry;
21
- versionMap: Map<string, string>;
22
- workspacePackages: Set<string>;
23
- }
24
- export interface FixWorkspaceDepsParams extends FixWorkspaceDepsMain {
25
- pkg: string;
26
- version: string;
27
- }
@@ -4,6 +4,7 @@ import { join, relative, resolve } from "path";
4
4
  import { splitVersion, compareVersions, concatVersion, } from "../pkg/pkg.common.js";
5
5
  import json5 from "json5";
6
6
  import { parse } from "yaml";
7
+ import { logInfo, logSuccess } from "../logger/Logger.js";
7
8
  export const DEFAULT_WORKSPACE_FILE_ENDING = ".code-workspace";
8
9
  export const getFileType = (filename) => filename.endsWith(DEFAULT_WORKSPACE_FILE_ENDING)
9
10
  ? WorkspaceFileType.workspace
@@ -118,10 +119,10 @@ export const readPackageJsons = async (repoRoot) => {
118
119
  export const writePackageJsons = async (entries) => Promise.all(entries.map(async (entry) => {
119
120
  if (entry.modified) {
120
121
  await writeFile(entry.jsonPath, JSON.stringify(entry.content, null, 2) + "\n", "utf8");
121
- console.log(` โœ… Updated ${entry.content.name}\n`);
122
+ logSuccess(` โœ… Updated ${entry.content.name}\n`);
122
123
  }
123
124
  else {
124
- console.log(` โญ๏ธ No workspace dependencies to fix. ${entry.content.name}\n`);
125
+ logInfo(` โญ๏ธ No workspace dependencies to fix. ${entry.content.name}\n`);
125
126
  }
126
127
  }));
127
128
  // Build a map of package names to their versions
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/build-api",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "Build utilities API",
5
5
  "type": "module",
6
6
  "author": "MXPicture",
@@ -13,6 +13,8 @@
13
13
  "./barrel": "./dist/barrel/index.js",
14
14
  "./cleanup": "./dist/cleanup/index.js",
15
15
  "./deps": "./dist/deps/index.js",
16
+ "./logger": "./dist/logger/index.js",
17
+ "./npmPublish": "./dist/npmPublish/index.js",
16
18
  "./osInfo": "./dist/osInfo/index.js",
17
19
  "./pkg": "./dist/pkg/index.js",
18
20
  "./types": "./dist/types/index.js",