Skip to content

Commit 6418f8f

Browse files
authored
Merge pull request #27 from NaverPayDev/feat/25_2
[publint] 개선
2 parents 3ba7a17 + 8701371 commit 6418f8f

File tree

6 files changed

+61
-76
lines changed

6 files changed

+61
-76
lines changed

.changeset/unlucky-toys-shop.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@naverpay/publint': minor
3+
---
4+
5+
- 에러 메시지 글로벌화
6+
- 에러 로깅 제거

packages/publint/src/errors.ts

+12-21
Original file line numberDiff line numberDiff line change
@@ -7,51 +7,49 @@ export class PackageJsonError extends Error {
77

88
export class NoPackageJsonError extends PackageJsonError {
99
constructor() {
10-
super('추가하려는 패키지에 package.json을 추가해주세요.')
10+
super(`Please add a 'package.json'`)
1111
this.name = 'NoPackageJsonError'
1212
}
1313
}
1414

1515
export class NoFilesFieldError extends PackageJsonError {
1616
constructor() {
17-
super('package.json에 file 필드가 필요합니다. 이 필드는 npm publish 시에 배포되는 파일 목록입니다.')
17+
super(`The 'files' in 'package.json' is required to specify published files`)
1818
this.name = 'NoFilesFieldError'
1919
}
2020
}
2121

2222
export class NoMainFieldError extends PackageJsonError {
2323
constructor() {
24-
super('package.json에 main 필드를 추가해주세요.')
24+
super(`Please add the 'main' to 'package.json'`)
2525
this.name = 'NoMainFieldError'
2626
}
2727
}
2828

2929
export class NoExportsFieldError extends PackageJsonError {
3030
constructor() {
31-
super(
32-
'더 나은 패키지 개발을 위해 package.json에 export map을 작성해주세요. 참고: https://nodejs.org/api/packages.html#exports',
33-
)
31+
super(`For better package development, please define an 'exports' in package.json`)
3432
this.name = 'NoExportsFieldError'
3533
}
3634
}
3735

3836
export class NoSideEffectsFieldError extends PackageJsonError {
3937
constructor() {
40-
super('원활한 tree shaking을 위해, sideEffects 필드를 false 혹은 배열을 추가해주세요.')
38+
super(`For tree shaking, set the 'sideEffects' to 'false' or an array`)
4139
this.name = 'NoSideEffectsFieldError'
4240
}
4341
}
4442

4543
export class DualPackageModuleFieldError extends PackageJsonError {
4644
constructor() {
47-
super('dual 패키지에서는 package.json에 module 필드를 추가해주세요.')
45+
super(`In a dual package, please add the 'module' to 'package.json'`)
4846
this.name = 'DualPackageModuleFieldError'
4947
}
5048
}
5149

5250
export class TypescriptTypesFieldError extends PackageJsonError {
5351
constructor() {
54-
super('tsconfig가 존재합니다. package.json에 types 필드를 적어주세요.')
52+
super(`A 'tsconfig' is present. Please add the 'types' to 'package.json'`)
5553
this.name = 'TypescriptTypesFieldError'
5654
}
5755
}
@@ -63,16 +61,9 @@ export class TypescriptExportMapError extends PackageJsonError {
6361
}
6462
}
6563

66-
export class InvalidExportPathError extends PackageJsonError {
67-
constructor(type: string) {
68-
super(`export map 하위에 ${type} 경로를 제대로 작성해주세요.`)
69-
this.name = 'InvalidExportPathError'
70-
}
71-
}
72-
7364
export class MissingExportPathError extends PackageJsonError {
7465
constructor(type: string) {
75-
super(`export map 하위에 ${type} 파일이 위치할 경로를 추가해주세요.`)
66+
super(`Please add the path for ${type} files in the 'exports'`)
7667
this.name = 'MissingExportPathError'
7768
}
7869
}
@@ -86,14 +77,14 @@ export class InvalidFileExtensionError extends PackageJsonError {
8677

8778
export class InvalidModuleExtensionError extends Error {
8879
constructor() {
89-
super('module 필드의 파일 확장자는 .cjs가 될 수 없습니다.')
80+
super(`The extension of 'module' cannot be '.cjs'`)
9081
this.name = 'InvalidModuleExtensionError'
9182
}
9283
}
9384

9485
export class InvalidTypesFileError extends Error {
9586
constructor(field: string) {
96-
super(`${field}.d.ts 파일을 가리켜야 합니다.`)
87+
super(`${field} must have a '.d.ts' extension`)
9788
this.name = 'InvalidTypesFileError'
9889
}
9990
}
@@ -114,15 +105,15 @@ export class InvalidModuleTypeError extends PackageJsonError {
114105

115106
export class InvalidPathError extends PackageJsonError {
116107
constructor(path: string) {
117-
super(`파일 경로는 './'로 시작해야 합니다: ${path}`)
108+
super(`The file path must start with './': ${path}`)
118109
this.name = 'InvalidPathError'
119110
}
120111
}
121112

122113
export class MissingPackageJsonExportError extends Error {
123114
constructor() {
124115
super(
125-
'exports 필드에 "./package.json": "./package.json" 엔트리가 없습니다. 이 정보가 있어야 외부에서 해당 패키지의 메타데이터를 읽어올 수 있습니다.',
116+
`The 'exports' is missing {"./package.json": "./package.json"}. This is required for external access to the package metadata`,
126117
)
127118
this.name = 'MissingPackageJsonExportError'
128119
}

packages/publint/src/index.ts

+26-34
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,40 @@ interface PackageVerificationResult {
2020
}
2121

2222
export function verifyPackageJSON(packageDir: string): PackageVerificationResult {
23-
try {
24-
// packagae.json 존재 여부 확인
25-
const packageJSONPath = path.join(packageDir, PACKAGE_JSON)
26-
if (!fs.existsSync(packageJSONPath)) {
27-
throw new NoPackageJsonError()
28-
}
23+
// package.json 존재 여부 확인
24+
const packageJSONPath = path.join(packageDir, PACKAGE_JSON)
25+
if (!fs.existsSync(packageJSONPath)) {
26+
throw new NoPackageJsonError()
27+
}
2928

30-
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, 'utf-8')) as IPackageJson
29+
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, 'utf-8')) as IPackageJson
3130

32-
// exports 필드 검증
33-
verifyExports(packageJSON.exports)
31+
// exports 필드 검증
32+
verifyExports(packageJSON.exports)
3433

35-
// 필수 필드 확인
36-
verifyRequiredFields(packageJSON)
34+
// 필수 필드 확인
35+
verifyRequiredFields(packageJSON)
3736

38-
// 패키지 타입 확인 후 각 타입에 맞는 구조를 가지고 있는지 확인
39-
const packageType = verifyPackageType(packageJSON)
37+
// 패키지 타입 확인 후 각 타입에 맞는 구조를 가지고 있는지 확인
38+
const packageType = verifyPackageType(packageJSON)
4039

41-
// dual package 면 `module` 필드를 갖도록 선언
42-
verifyPackageStructure(packageJSON, packageType)
40+
// dual package 면 `module` 필드를 갖도록 선언
41+
verifyPackageStructure(packageJSON, packageType)
4342

44-
// TypeScript 패키지인 경우 타입 정의 파일이 있는지 확인
45-
const tsConfigPath = path.join(packageDir, TSCONFIG_JSON)
46-
const writtenByTypescript = fs.existsSync(tsConfigPath)
43+
// TypeScript 패키지인 경우 타입 정의 파일이 있는지 확인
44+
const tsConfigPath = path.join(packageDir, TSCONFIG_JSON)
45+
const writtenByTypescript = fs.existsSync(tsConfigPath)
4746

48-
if (writtenByTypescript) {
49-
verifyTypescriptPackage(packageJSON, packageType)
50-
}
47+
if (writtenByTypescript) {
48+
verifyTypescriptPackage(packageJSON, packageType)
49+
}
5150

52-
// exports 필드에 정의된 출력 경로가 올바른지 확인
53-
verifyOutputPaths(packageJSON, packageType, writtenByTypescript)
51+
// exports 필드에 정의된 출력 경로가 올바른지 확인
52+
verifyOutputPaths(packageJSON, packageType, writtenByTypescript)
5453

55-
return {
56-
writtenByTypescript,
57-
packageJSON,
58-
isDualPackage: packageType === 'dual',
59-
}
60-
} catch (error) {
61-
if (error instanceof Error) {
62-
// eslint-disable-next-line no-console
63-
console.error(`Package.json 검증 실패: ${error.message}`)
64-
}
65-
throw error
54+
return {
55+
writtenByTypescript,
56+
packageJSON,
57+
isDualPackage: packageType === 'dual',
6658
}
6759
}

packages/publint/src/verify/exports.ts

+8-10
Original file line numberDiff line numberDiff line change
@@ -19,40 +19,38 @@ export function verifyExports(exports: IPackageJson['exports']): void {
1919
}
2020

2121
if (typeof value !== 'object' || value === null) {
22-
throw new InvalidExportError(
23-
`"${key}"에 대한 export가 올바르지 않습니다: export는 객체 또는 문자열이어야 합니다`,
24-
)
22+
throw new InvalidExportError(`Export for the '${key}' is invalid. It must be an 'object' or a 'string'`)
2523
}
2624

2725
if (!value.import && !value.require && !value.default) {
2826
throw new InvalidExportError(
29-
`"${key}"에 대한 export는 "import", "require", "default" 중 하나 이상을 포함해야 합니다`,
27+
`Export for the '${key}' must include at least one of 'import', 'require', or 'default'`,
3028
)
3129
}
3230

3331
if (value.import && typeof value.import !== 'string' && typeof value.import !== 'object') {
34-
throw new InvalidExportError(`"${key}"에 대한 "import" 필드가 올바르지 않습니다`)
32+
throw new InvalidExportError(`The 'import' for '${key}' is invalid`)
3533
}
3634

3735
if (value.require && typeof value.require !== 'string' && typeof value.require !== 'object') {
38-
throw new InvalidExportError(`"${key}"에 대한 "require" 필드가 올바르지 않습니다`)
36+
throw new InvalidExportError(`The 'require' for '${key}' is invalid`)
3937
}
4038

4139
if (typeof value.import === 'object') {
4240
if (!value.import.default || typeof value.import.default !== 'string') {
43-
throw new InvalidExportError(`"${key}"에 대한 "import.default" 필드가 올바르지 않습니다`)
41+
throw new InvalidExportError(`The 'import.default' for '${key}' is invalid`)
4442
}
4543
if (value.import.types && typeof value.import.types !== 'string') {
46-
throw new InvalidExportError(`"${key}"에 대한 "import.types" 필드가 올바르지 않습니다`)
44+
throw new InvalidExportError(`The 'import.types' for '${key}' is invalid`)
4745
}
4846
}
4947

5048
if (typeof value.require === 'object') {
5149
if (!value.require.default || typeof value.require.default !== 'string') {
52-
throw new InvalidExportError(`"${key}"에 대한 "require.default" 필드가 올바르지 않습니다`)
50+
throw new InvalidExportError(`The 'require.default' for '${key}' is invalid`)
5351
}
5452
if (value.require.types && typeof value.require.types !== 'string') {
55-
throw new InvalidExportError(`"${key}"에 대한 "require.types" 필드가 올바르지 않습니다`)
53+
throw new InvalidExportError(`The 'require.types' for '${key}' is invalid`)
5654
}
5755
}
5856
})

packages/publint/src/verify/outputPaths.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,7 @@ export function verifyOutputPaths(
100100
const cjsExt = path.extname(cjsOutputPath)
101101
const esmExt = path.extname(esmOutputPath)
102102
if (cjsExt === '.js' && esmExt === '.js') {
103-
throw new InvalidFileExtensionError(
104-
'Dual 패키지에서 CJS와 ESM 출력 파일은 서로 다른 확장자를 사용해야 합니다.',
105-
)
103+
throw new InvalidFileExtensionError('Dual package CJS and ESM output files must have different extensions')
106104
}
107105
}
108106

@@ -115,10 +113,10 @@ export function verifyOutputPaths(
115113

116114
if (writtenByTypescript) {
117115
if ((packageType === 'cjs' || packageType === 'dual') && !cjsTypes) {
118-
throw new TypescriptExportMapError('CJS TypeScript 패키지는 export map에 require.types를 포함해야 합니다.')
116+
throw new TypescriptExportMapError(`CJS TypeScript packages must include 'require.types' in the 'exports'`)
119117
}
120118
if ((packageType === 'esm' || packageType === 'dual') && !esmTypes) {
121-
throw new TypescriptExportMapError('ESM TypeScript 패키지는 export map에 import.types를 포함해야 합니다.')
119+
throw new TypescriptExportMapError(`ESM TypeScript packages must include 'import.types' in the 'exports'`)
122120
}
123121
}
124122
}

packages/publint/src/verify/typescriptPackage.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function verifyTypescriptPackage(packageJSON: IPackageJson, packageType:
2222
}
2323

2424
if (!endsWithDTs(packageJSON.types)) {
25-
throw new InvalidTypesFileError('types 필드')
25+
throw new InvalidTypesFileError(`'types'`)
2626
}
2727

2828
validatePath(packageJSON.types)
@@ -49,26 +49,26 @@ export function verifyTypescriptPackage(packageJSON: IPackageJson, packageType:
4949
esmTypes = esmTypes || packageJSON.types
5050

5151
if (cjsTypes && !endsWithDTs(cjsTypes)) {
52-
throw new InvalidTypesFileError('exports["."].require.types 또는 최상위 types 필드')
52+
throw new InvalidTypesFileError(`'exports["."].require.types' or the 'types'`)
5353
}
5454
if (esmTypes && !endsWithDTs(esmTypes)) {
55-
throw new InvalidTypesFileError('exports["."].import.types 또는 최상위 types 필드')
55+
throw new InvalidTypesFileError(`'exports["."].import.types' or the 'types'`)
5656
}
5757

5858
switch (packageType) {
5959
case 'cjs':
6060
if (!cjsTypes) {
61-
throw new TypescriptExportMapError('CommonJS용 types 필드가 필요합니다.')
61+
throw new TypescriptExportMapError(`The 'types' for CJS is required`)
6262
}
6363
break
6464
case 'esm':
6565
if (!esmTypes) {
66-
throw new TypescriptExportMapError('ESM용 types 필드가 필요합니다.')
66+
throw new TypescriptExportMapError(`The 'types' for ESM is required`)
6767
}
6868
break
6969
case 'dual':
7070
if (!(cjsTypes && esmTypes)) {
71-
throw new TypescriptExportMapError('CommonJS와 ESM 모두를 위한 types 필드가 필요합니다.')
71+
throw new TypescriptExportMapError(`The 'types' for both CJS and ESM is required`)
7272
}
7373
break
7474
}

0 commit comments

Comments
 (0)