diff --git a/packages/dedupe/README.md b/packages/dedupe/README.md new file mode 100644 index 00000000..5d3e19c3 --- /dev/null +++ b/packages/dedupe/README.md @@ -0,0 +1,17 @@ +# Dedupe + +A package manager helper tool for debug list of defined (imported) packages in your ecosystem and prevent to duplicate import (install) multiple versions of the same package in your project (deduplicate packages). + +## Example usage + +```ts +import {definePackage} from '@alwatr/dedupe'; + +definePackage('@alwatr/logger', '2.0.0'); +``` + +You can use __package_version__ to automatically obtain the version of the package if you are using @alwatr/nano-build to build your package. + +```ts +definePackage('@alwatr/logger', __package_version__); +``` diff --git a/packages/dedupe/demo/dedupe.mjs b/packages/dedupe/demo/dedupe.mjs new file mode 100644 index 00000000..06250964 --- /dev/null +++ b/packages/dedupe/demo/dedupe.mjs @@ -0,0 +1,14 @@ +import {definePackage, definedPackageList} from '@alwatr/dedupe'; + +// Must throw an error + +console.log('define test1 package') +definePackage('@scope/test1'); + +console.log('define test2 package') +definePackage('@scope/test2', 'v1.0.0'); + +console.log('definedPackageList:', definedPackageList) + +console.log('redefine test2 package') +definePackage('@scope/test2'); diff --git a/packages/dedupe/package.json b/packages/dedupe/package.json new file mode 100644 index 00000000..13084c51 --- /dev/null +++ b/packages/dedupe/package.json @@ -0,0 +1,77 @@ +{ + "name": "@alwatr/dedupe", + "version": "2.4.1", + "description": "A package manager helper tool for debug list of defined (imported) packages in your ecosystem and prevent to duplicate import (install) multiple versions of the same package in your project (deduplicate packages).", + "author": "S. Ali Mihandoost ", + "keywords": [ + "dedupe", + "define-package", + "deduplicate", + "package", + "package-manager", + "cross-platform", + "ECMAScript", + "typescript", + "javascript", + "node", + "nodejs", + "esm", + "module", + "utility", + "util", + "utils", + "nanolib", + "alwatr" + ], + "type": "module", + "main": "./dist/main.cjs", + "module": "./dist/main.mjs", + "types": "./dist/main.d.ts", + "exports": { + ".": { + "import": "./dist/main.mjs", + "require": "./dist/main.cjs", + "types": "./dist/main.d.ts" + } + }, + "license": "MIT", + "files": [ + "**/*.{js,mjs,cjs,map,d.ts,html,md}", + "!demo/**/*" + ], + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/Alwatr/nanolib", + "directory": "packages/dedupe" + }, + "homepage": "https://github.com/Alwatr/nanolib/tree/next/packages/dedupe#readme", + "bugs": { + "url": "https://github.com/Alwatr/nanolib/issues" + }, + "prettier": "@alwatr/prettier-config", + "scripts": { + "b": "yarn run build", + "w": "yarn run watch", + "c": "yarn run clean", + "cb": "yarn run clean && yarn run build", + "d": "yarn run build:es && DEBUG=1 yarn node", + "build": "yarn run build:ts & yarn run build:es", + "build:es": "nano-build --preset=module", + "build:ts": "tsc --build", + "watch": "yarn run watch:ts & yarn run watch:es", + "watch:es": "yarn run build:es --watch", + "watch:ts": "yarn run build:ts --watch --preserveWatchOutput", + "clean": "rm -rfv dist *.tsbuildinfo" + }, + "devDependencies": { + "@alwatr/nano-build": "workspace:^", + "@alwatr/prettier-config": "workspace:^", + "@alwatr/tsconfig-base": "workspace:^", + "@alwatr/type-helper": "workspace:^", + "@types/node": "^20.10.6", + "typescript": "^5.3.3" + } +} diff --git a/packages/dedupe/src/main.ts b/packages/dedupe/src/main.ts new file mode 100644 index 00000000..a53f3aed --- /dev/null +++ b/packages/dedupe/src/main.ts @@ -0,0 +1,37 @@ +import type {Dictionary} from '@alwatr/type-helper' + +declare global { + // eslint-disable-next-line no-var + var __dedupe__: true; + + // eslint-disable-next-line no-var + var __package_version__: string; +} + +if (typeof __dedupe__ !== 'undefined') { + throw new Error('duplicate_dedupe'); +} + +export const definedPackageList: Dictionary = {}; + +/** + * Global define package for managing package versions to prevent version conflicts. + * @param packageName package name including scope. e.g. `@scope/package-name` + * @param version package version (optional) + * + * @example + * ```typescript + * definePackage('@scope/package-name', __package_version__); + * ``` + */ +export function definePackage (packageName: string, version = 'v?'): void { + if (packageName in definedPackageList) { + throw new Error('duplicate_package', { + cause: packageName, + }); + } + + definedPackageList[packageName] = version; +} + +definePackage('@alwatr/dedupe', __package_version__); diff --git a/packages/dedupe/tsconfig.json b/packages/dedupe/tsconfig.json new file mode 100644 index 00000000..879b4c5c --- /dev/null +++ b/packages/dedupe/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@alwatr/tsconfig-base/tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "emitDeclarationOnly": true, + "composite": true, + }, + "include": ["src/**/*.ts"], + "references": [] +} diff --git a/packages/logger/README.md b/packages/logger/README.md index e3e7e9ff..45c637c2 100644 --- a/packages/logger/README.md +++ b/packages/logger/README.md @@ -1,4 +1,4 @@ -# Alwatr Logger - `@alwatr/logger` +# Logger Fancy colorful console debugger with custom scope written in tiny TypeScript, ES module. diff --git a/packages/logger/package.json b/packages/logger/package.json index 0744576e..c1984bde 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -65,14 +65,15 @@ "watch:ts": "yarn run build:ts --watch --preserveWatchOutput", "clean": "rm -rfv dist *.tsbuildinfo" }, + "dependencies": { + "@alwatr/dedupe": "workspace:^", + "@alwatr/platform-info": "workspace:^" + }, "devDependencies": { "@alwatr/nano-build": "workspace:^", "@alwatr/prettier-config": "workspace:^", "@alwatr/tsconfig-base": "workspace:^", "@types/node": "^20.10.6", "typescript": "^5.3.3" - }, - "dependencies": { - "@alwatr/platform-info": "workspace:^" } } diff --git a/packages/logger/src/main.ts b/packages/logger/src/main.ts index a7852117..de8e611b 100644 --- a/packages/logger/src/main.ts +++ b/packages/logger/src/main.ts @@ -1,7 +1,10 @@ +import {definePackage} from '@alwatr/dedupe'; import {platformInfo} from '@alwatr/platform-info'; import type {AlwatrLogger} from './type.js'; +definePackage('@alwatr/logger', __package_version__); + export const debugMode = platformInfo.development || platformInfo.isCli ? process.env.DEBUG !== undefined && process.env.DEBUG !== '' : typeof localStorage !== 'undefined' && localStorage.getItem('debug') === '1'; diff --git a/packages/nano-build/README.md b/packages/nano-build/README.md index 1b3d0f65..b26f3dcd 100644 --- a/packages/nano-build/README.md +++ b/packages/nano-build/README.md @@ -43,7 +43,7 @@ Add the following scripts to your `package.json`: js: "/* @package_name v@package_version */" }, define: { - __package_version: `'@package_version'`, + __package_version__: `'@package_version'`, }, } ``` diff --git a/packages/nano-build/global.d.ts b/packages/nano-build/global.d.ts new file mode 100644 index 00000000..6e775516 --- /dev/null +++ b/packages/nano-build/global.d.ts @@ -0,0 +1,5 @@ +export {}; + +declare global { + var __package_version__: string; +} diff --git a/packages/nano-build/nano-build.cjs b/packages/nano-build/nano-build.cjs index 5357c1b7..f020bfe4 100755 --- a/packages/nano-build/nano-build.cjs +++ b/packages/nano-build/nano-build.cjs @@ -36,7 +36,7 @@ const defaultOptions = { js: '/* ' + packageJson.name + ' v' + packageJson.version + ' */', }, define: { - __package_version: `'${packageJson.version}'`, + __package_version__: `'${packageJson.version}'`, }, }; diff --git a/packages/nano-build/package.json b/packages/nano-build/package.json index 0647f43e..0f2e8f0e 100644 --- a/packages/nano-build/package.json +++ b/packages/nano-build/package.json @@ -24,6 +24,8 @@ ], "type": "commonjs", "bin": "./nano-build.cjs", + "main": "", + "types": "./global.d.ts", "license": "MIT", "files": [ "**/*.{js,mjs,cjs,map,d.ts,html,md}", diff --git a/yarn.lock b/yarn.lock index 98d528d9..5eafa5b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,6 +26,19 @@ __metadata: languageName: unknown linkType: soft +"@alwatr/dedupe@workspace:^, @alwatr/dedupe@workspace:packages/dedupe": + version: 0.0.0-use.local + resolution: "@alwatr/dedupe@workspace:packages/dedupe" + dependencies: + "@alwatr/nano-build": "workspace:^" + "@alwatr/prettier-config": "workspace:^" + "@alwatr/tsconfig-base": "workspace:^" + "@alwatr/type-helper": "workspace:^" + "@types/node": "npm:^20.10.6" + typescript: "npm:^5.3.3" + languageName: unknown + linkType: soft + "@alwatr/deep-clone@workspace:packages/deep-clone": version: 0.0.0-use.local resolution: "@alwatr/deep-clone@workspace:packages/deep-clone" @@ -110,6 +123,7 @@ __metadata: version: 0.0.0-use.local resolution: "@alwatr/logger@workspace:packages/logger" dependencies: + "@alwatr/dedupe": "workspace:^" "@alwatr/nano-build": "workspace:^" "@alwatr/platform-info": "workspace:^" "@alwatr/prettier-config": "workspace:^"