@xfilecom/core-sdk 1.3.23

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.
Files changed (96) hide show
  1. package/README.md +664 -0
  2. package/dist/core.module.d.ts +39 -0
  3. package/dist/core.module.js +188 -0
  4. package/dist/core.module.js.map +1 -0
  5. package/dist/database/database.constants.d.ts +2 -0
  6. package/dist/database/database.constants.js +6 -0
  7. package/dist/database/database.constants.js.map +1 -0
  8. package/dist/database/database.module.d.ts +19 -0
  9. package/dist/database/database.module.js +56 -0
  10. package/dist/database/database.module.js.map +1 -0
  11. package/dist/database/database.query.d.ts +103 -0
  12. package/dist/database/database.query.example.d.ts +36 -0
  13. package/dist/database/database.query.example.js +148 -0
  14. package/dist/database/database.query.example.js.map +1 -0
  15. package/dist/database/database.query.js +369 -0
  16. package/dist/database/database.query.js.map +1 -0
  17. package/dist/database/database.service.d.ts +18 -0
  18. package/dist/database/database.service.js +110 -0
  19. package/dist/database/database.service.js.map +1 -0
  20. package/dist/database/example-usage.d.ts +0 -0
  21. package/dist/database/example-usage.js +1 -0
  22. package/dist/database/example-usage.js.map +1 -0
  23. package/dist/decorators/public.decorator.d.ts +2 -0
  24. package/dist/decorators/public.decorator.js +8 -0
  25. package/dist/decorators/public.decorator.js.map +1 -0
  26. package/dist/decorators/roles.decorator.d.ts +2 -0
  27. package/dist/decorators/roles.decorator.js +8 -0
  28. package/dist/decorators/roles.decorator.js.map +1 -0
  29. package/dist/decorators/user.decorator.d.ts +7 -0
  30. package/dist/decorators/user.decorator.js +10 -0
  31. package/dist/decorators/user.decorator.js.map +1 -0
  32. package/dist/filters/exception.filter.d.ts +36 -0
  33. package/dist/filters/exception.filter.js +201 -0
  34. package/dist/filters/exception.filter.js.map +1 -0
  35. package/dist/guards/jwt-auth.guard.d.ts +14 -0
  36. package/dist/guards/jwt-auth.guard.js +103 -0
  37. package/dist/guards/jwt-auth.guard.js.map +1 -0
  38. package/dist/guards/roles.guard.d.ts +7 -0
  39. package/dist/guards/roles.guard.js +47 -0
  40. package/dist/guards/roles.guard.js.map +1 -0
  41. package/dist/index.d.ts +29 -0
  42. package/dist/index.js +91 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/interceptors/database-check.interceptor.d.ts +12 -0
  45. package/dist/interceptors/database-check.interceptor.js +60 -0
  46. package/dist/interceptors/database-check.interceptor.js.map +1 -0
  47. package/dist/interceptors/error-handling.interceptor.d.ts +8 -0
  48. package/dist/interceptors/error-handling.interceptor.js +33 -0
  49. package/dist/interceptors/error-handling.interceptor.js.map +1 -0
  50. package/dist/interceptors/logging.interceptor.d.ts +21 -0
  51. package/dist/interceptors/logging.interceptor.js +167 -0
  52. package/dist/interceptors/logging.interceptor.js.map +1 -0
  53. package/dist/interceptors/response-transform.interceptor.d.ts +5 -0
  54. package/dist/interceptors/response-transform.interceptor.js +30 -0
  55. package/dist/interceptors/response-transform.interceptor.js.map +1 -0
  56. package/dist/utils/auth.helpers.d.ts +19 -0
  57. package/dist/utils/auth.helpers.js +77 -0
  58. package/dist/utils/auth.helpers.js.map +1 -0
  59. package/dist/utils/config-loader.utils.d.ts +22 -0
  60. package/dist/utils/config-loader.utils.js +77 -0
  61. package/dist/utils/config-loader.utils.js.map +1 -0
  62. package/dist/utils/config.validator.d.ts +13 -0
  63. package/dist/utils/config.validator.js +82 -0
  64. package/dist/utils/config.validator.js.map +1 -0
  65. package/dist/utils/controller.helpers.d.ts +58 -0
  66. package/dist/utils/controller.helpers.js +104 -0
  67. package/dist/utils/controller.helpers.js.map +1 -0
  68. package/dist/utils/crypto.utils.d.ts +12 -0
  69. package/dist/utils/crypto.utils.js +53 -0
  70. package/dist/utils/crypto.utils.js.map +1 -0
  71. package/dist/utils/email-hash.utils.d.ts +7 -0
  72. package/dist/utils/email-hash.utils.js +42 -0
  73. package/dist/utils/email-hash.utils.js.map +1 -0
  74. package/dist/utils/env.utils.d.ts +8 -0
  75. package/dist/utils/env.utils.js +27 -0
  76. package/dist/utils/env.utils.js.map +1 -0
  77. package/dist/utils/error.utils.d.ts +6 -0
  78. package/dist/utils/error.utils.js +65 -0
  79. package/dist/utils/error.utils.js.map +1 -0
  80. package/dist/utils/hash-verification.utils.d.ts +35 -0
  81. package/dist/utils/hash-verification.utils.js +133 -0
  82. package/dist/utils/hash-verification.utils.js.map +1 -0
  83. package/dist/utils/logger.helpers.d.ts +71 -0
  84. package/dist/utils/logger.helpers.js +293 -0
  85. package/dist/utils/logger.helpers.js.map +1 -0
  86. package/dist/utils/logging.config.d.ts +6 -0
  87. package/dist/utils/logging.config.js +42 -0
  88. package/dist/utils/logging.config.js.map +1 -0
  89. package/dist/utils/service.helpers.d.ts +22 -0
  90. package/dist/utils/service.helpers.js +73 -0
  91. package/dist/utils/service.helpers.js.map +1 -0
  92. package/dist/utils/yaml-config.loader.d.ts +15 -0
  93. package/dist/utils/yaml-config.loader.js +219 -0
  94. package/dist/utils/yaml-config.loader.js.map +1 -0
  95. package/package.json +47 -0
  96. package/scripts/publish-to-gitlab.mjs +209 -0
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_SOURCE_ENV_KEY = exports.ENV_CONFIG_FILENAME_PATTERN = exports.DEFAULT_CONFIG_FILENAMES = void 0;
4
+ exports.loadApplicationYaml = loadApplicationYaml;
5
+ exports.loadApplicationYamlSync = loadApplicationYamlSync;
6
+ const fs = require("fs");
7
+ const path = require("path");
8
+ const yaml = require("js-yaml");
9
+ exports.DEFAULT_CONFIG_FILENAMES = ['application.yml', 'application.yaml'];
10
+ exports.ENV_CONFIG_FILENAME_PATTERN = 'application-{env}.yml';
11
+ exports.CONFIG_SOURCE_ENV_KEY = 'CONFIG_SOURCE';
12
+ function getByPath(obj, dotPath) {
13
+ const parts = dotPath.split('.').filter(Boolean);
14
+ let cur = obj;
15
+ for (const p of parts) {
16
+ if (cur == null || typeof cur !== 'object')
17
+ return undefined;
18
+ cur = cur[p];
19
+ }
20
+ return cur;
21
+ }
22
+ function applySyncEnvKeys(config, syncEnvKeys) {
23
+ if (typeof process === 'undefined')
24
+ return;
25
+ for (const [envKey, dotPath] of Object.entries(syncEnvKeys)) {
26
+ const value = getByPath(config, dotPath);
27
+ if (value !== undefined && value !== null) {
28
+ process.env[envKey] = String(value);
29
+ }
30
+ }
31
+ }
32
+ function buildConfigFromEnv() {
33
+ const env = typeof process !== 'undefined' ? process.env : {};
34
+ const get = (key) => env[key];
35
+ const num = (key, def) => {
36
+ const v = get(key);
37
+ if (v == null || v === '')
38
+ return def;
39
+ const n = parseInt(v, 10);
40
+ return Number.isNaN(n) ? def : n;
41
+ };
42
+ return {
43
+ database: {
44
+ host: get('DB_HOST') ?? 'localhost',
45
+ port: num('DB_PORT', 3306),
46
+ user: get('DB_USER') ?? 'root',
47
+ password: get('DB_PASSWORD'),
48
+ database: get('DB_NAME') ?? get('DB_DATABASE') ?? 'test',
49
+ ssl: get('DB_SSL') === 'true' || get('DB_SSL') === '1',
50
+ connectionLimit: num('DB_CONNECTION_LIMIT', 10),
51
+ },
52
+ jwt: {
53
+ secret: get('JWT_SECRET'),
54
+ expiresIn: get('JWT_EXPIRES_IN') ?? '7d',
55
+ },
56
+ hashVerification: {
57
+ default: {
58
+ algorithm: 'sha256',
59
+ secret: get('HASH_VERIFICATION_SECRET'),
60
+ encoding: 'hex',
61
+ },
62
+ profiles: {
63
+ email: {
64
+ secret: get('EMAIL_HASH_SECRET') ?? get('HASH_VERIFICATION_SECRET'),
65
+ normalizer: 'email',
66
+ },
67
+ },
68
+ },
69
+ };
70
+ }
71
+ function applyEnvOverrides(config) {
72
+ const env = typeof process !== 'undefined' ? process.env : {};
73
+ const get = (key) => env[key];
74
+ if (get('DB_HOST') != null) {
75
+ if (!config.database)
76
+ config.database = {};
77
+ config.database.host = get('DB_HOST');
78
+ }
79
+ if (get('DB_PORT') != null) {
80
+ if (!config.database)
81
+ config.database = {};
82
+ config.database.port = parseInt(get('DB_PORT'), 10) || 3306;
83
+ }
84
+ if (get('DB_USER') != null) {
85
+ if (!config.database)
86
+ config.database = {};
87
+ config.database.user = get('DB_USER');
88
+ }
89
+ if (get('DB_PASSWORD') !== undefined) {
90
+ if (!config.database)
91
+ config.database = {};
92
+ config.database.password = get('DB_PASSWORD');
93
+ }
94
+ if (get('DB_NAME') != null || get('DB_DATABASE') != null) {
95
+ if (!config.database)
96
+ config.database = {};
97
+ config.database.database = get('DB_NAME') ?? get('DB_DATABASE');
98
+ }
99
+ if (get('JWT_SECRET') != null) {
100
+ if (!config.jwt)
101
+ config.jwt = {};
102
+ config.jwt.secret = get('JWT_SECRET');
103
+ }
104
+ if (get('JWT_EXPIRES_IN') != null) {
105
+ if (!config.jwt)
106
+ config.jwt = {};
107
+ config.jwt.expiresIn = get('JWT_EXPIRES_IN');
108
+ }
109
+ if (get('HASH_VERIFICATION_SECRET') != null) {
110
+ if (!config.hashVerification)
111
+ config.hashVerification = {};
112
+ if (!config.hashVerification.default)
113
+ config.hashVerification.default = {};
114
+ config.hashVerification.default.secret = get('HASH_VERIFICATION_SECRET');
115
+ }
116
+ if (get('EMAIL_HASH_SECRET') != null) {
117
+ if (!config.hashVerification)
118
+ config.hashVerification = {};
119
+ if (!config.hashVerification.profiles)
120
+ config.hashVerification.profiles = {};
121
+ if (!config.hashVerification.profiles.email)
122
+ config.hashVerification.profiles.email = {};
123
+ config.hashVerification.profiles.email.secret = get('EMAIL_HASH_SECRET');
124
+ }
125
+ }
126
+ async function loadApplicationYaml(options = {}) {
127
+ const fromEnv = typeof process !== 'undefined' ? process.env[exports.CONFIG_SOURCE_ENV_KEY] : undefined;
128
+ const configSource = options.configSource ?? fromEnv ?? 'yaml';
129
+ if (configSource === 'env') {
130
+ const config = buildConfigFromEnv();
131
+ if (options.syncEnvKeys)
132
+ applySyncEnvKeys(config, options.syncEnvKeys);
133
+ return config;
134
+ }
135
+ const rootDir = path.resolve(options.rootDir ?? process.cwd());
136
+ const encoding = options.encoding ?? 'utf8';
137
+ const readYamlFile = async (filename) => {
138
+ const filePath = path.join(rootDir, filename);
139
+ try {
140
+ const content = await fs.promises.readFile(filePath, encoding);
141
+ const parsed = yaml.load(content);
142
+ return parsed != null && typeof parsed === 'object' && !Array.isArray(parsed)
143
+ ? parsed
144
+ : {};
145
+ }
146
+ catch {
147
+ return null;
148
+ }
149
+ };
150
+ const base = (await readYamlFile('application.yml')) ?? (await readYamlFile('application.yaml')) ?? {};
151
+ let config = base;
152
+ if (options.env?.trim()) {
153
+ const envFile = (await readYamlFile(`application-${options.env}.yml`)) ??
154
+ (await readYamlFile(`application-${options.env}.yaml`)) ??
155
+ {};
156
+ config = deepMerge({}, base, envFile);
157
+ }
158
+ if (configSource === 'yamlWithEnvOverrides') {
159
+ applyEnvOverrides(config);
160
+ }
161
+ if (options.syncEnvKeys)
162
+ applySyncEnvKeys(config, options.syncEnvKeys);
163
+ return config;
164
+ }
165
+ function deepMerge(target, ...sources) {
166
+ for (const source of sources) {
167
+ for (const key of Object.keys(source)) {
168
+ const src = source[key];
169
+ if (src != null && typeof src === 'object' && !Array.isArray(src)) {
170
+ if (target[key] == null || typeof target[key] !== 'object' || Array.isArray(target[key])) {
171
+ target[key] = {};
172
+ }
173
+ deepMerge(target[key], src);
174
+ }
175
+ else {
176
+ target[key] = src;
177
+ }
178
+ }
179
+ }
180
+ return target;
181
+ }
182
+ function loadApplicationYamlSync(options = {}) {
183
+ const fromEnv = typeof process !== 'undefined' ? process.env[exports.CONFIG_SOURCE_ENV_KEY] : undefined;
184
+ const configSource = options.configSource ?? fromEnv ?? 'yaml';
185
+ if (configSource === 'env') {
186
+ const config = buildConfigFromEnv();
187
+ if (options.syncEnvKeys)
188
+ applySyncEnvKeys(config, options.syncEnvKeys);
189
+ return config;
190
+ }
191
+ const rootDir = path.resolve(options.rootDir ?? process.cwd());
192
+ const encoding = options.encoding ?? 'utf8';
193
+ const readSync = (filename) => {
194
+ const filePath = path.join(rootDir, filename);
195
+ try {
196
+ const content = fs.readFileSync(filePath, encoding);
197
+ const parsed = yaml.load(content);
198
+ return parsed != null && typeof parsed === 'object' && !Array.isArray(parsed)
199
+ ? parsed
200
+ : {};
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ };
206
+ const base = readSync('application.yml') ?? readSync('application.yaml') ?? {};
207
+ let config = base;
208
+ if (options.env?.trim()) {
209
+ const envFile = readSync(`application-${options.env}.yml`) ?? readSync(`application-${options.env}.yaml`) ?? {};
210
+ config = deepMerge({}, base, envFile);
211
+ }
212
+ if (configSource === 'yamlWithEnvOverrides') {
213
+ applyEnvOverrides(config);
214
+ }
215
+ if (options.syncEnvKeys)
216
+ applySyncEnvKeys(config, options.syncEnvKeys);
217
+ return config;
218
+ }
219
+ //# sourceMappingURL=yaml-config.loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-config.loader.js","sourceRoot":"","sources":["../../src/utils/yaml-config.loader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@xfilecom/core-sdk",
3
+ "version": "1.3.23",
4
+ "description": "Core SDK for NestJS microservices - 통합 개발 키트",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepublishOnly": "npm run build",
10
+ "publish:gitlab": "node scripts/publish-to-gitlab.mjs"
11
+ },
12
+ "dependencies": {
13
+ "@nestjs/common": "^10.0.0",
14
+ "@nestjs/core": "^10.0.0",
15
+ "@nestjs/passport": "^10.0.0",
16
+ "bcrypt": "^5.1.1",
17
+ "drizzle-orm": "^0.45.1",
18
+ "js-yaml": "^4.1.1",
19
+ "jsonwebtoken": "^9.0.2",
20
+ "mysql2": "^3.6.0",
21
+ "rxjs": "^7.8.0"
22
+ },
23
+ "optionalDependencies": {
24
+ "passport-jwt": "^4.0.1",
25
+ "winston": "^3.11.0",
26
+ "winston-daily-rotate-file": "^5.0.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@nestjs/common": "^10.0.0",
30
+ "@nestjs/core": "^10.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/bcrypt": "^5.0.2",
34
+ "@types/express": "^4.17.21",
35
+ "@types/jsonwebtoken": "^9.0.5",
36
+ "@types/node": "^20.0.0",
37
+ "@types/passport-jwt": "^4.0.1",
38
+ "typescript": "^5.0.0"
39
+ },
40
+ "publishConfig": {
41
+ "registry": "https://registry.npmjs.org/",
42
+ "access": "public"
43
+ },
44
+ "overrides": {
45
+ "tar": "^7.5.4"
46
+ }
47
+ }
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * GitLab에 Core SDK 프로젝트 생성 및 배포 스크립트
5
+ */
6
+
7
+ import { execSync } from 'child_process';
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+
11
+ const GITLAB_URL = process.env.GITLAB_URL || 'https://gitlab.kcpg.co.kr';
12
+ // GITLAB_TOKEN을 환경 변수에서 우선적으로 읽기
13
+ let GITLAB_TOKEN = process.env.GITLAB_TOKEN;
14
+ if (!GITLAB_TOKEN) {
15
+ try {
16
+ const npmrcPath = path.join(process.env.HOME || process.env.USERPROFILE || '', '.npmrc');
17
+ if (fs.existsSync(npmrcPath)) {
18
+ const npmrcContent = fs.readFileSync(npmrcPath, 'utf8');
19
+ // ~/.npmrc에서 _authToken 값 추출 (환경 변수나 실제 값)
20
+ const match = npmrcContent.match(/\/\/gitlab\.kcpg\.co\.kr\/api\/v4\/packages\/npm\/:_authToken=(.+)/);
21
+ if (match) {
22
+ const tokenValue = match[1].trim().replace(/^["']|["']$/g, '');
23
+ // ${GITLAB_TOKEN} 형식이면 환경 변수에서 읽기 시도
24
+ if (tokenValue === '${GITLAB_TOKEN}' || tokenValue.startsWith('${')) {
25
+ GITLAB_TOKEN = process.env.GITLAB_TOKEN;
26
+ } else {
27
+ GITLAB_TOKEN = tokenValue;
28
+ }
29
+ }
30
+ }
31
+ } catch (e) {
32
+ // ignore
33
+ }
34
+ }
35
+ const GROUP = 'xfilecom';
36
+ const PROJECT_NAME = 'core-sdk';
37
+
38
+ async function createGitLabProject() {
39
+ if (!GITLAB_TOKEN) {
40
+ console.error('❌ GITLAB_TOKEN 환경 변수가 설정되지 않았습니다.');
41
+ process.exit(1);
42
+ }
43
+
44
+ console.log('🚀 GitLab에 Core SDK 프로젝트 생성 및 배포\n');
45
+
46
+ const gitlabHost = GITLAB_URL.replace(/^https?:\/\//, '');
47
+ const projectPath = `${GROUP}/${PROJECT_NAME}`;
48
+ const apiUrl = `${GITLAB_URL}/api/v4/projects`;
49
+
50
+ // 1. GitLab 프로젝트 생성
51
+ console.log(`📦 Creating GitLab project: ${projectPath}...`);
52
+ try {
53
+ const namespaceResponse = await fetch(
54
+ `${GITLAB_URL}/api/v4/namespaces?search=${GROUP}`,
55
+ {
56
+ headers: {
57
+ 'PRIVATE-TOKEN': GITLAB_TOKEN,
58
+ },
59
+ }
60
+ );
61
+
62
+ let namespaceId = null;
63
+ if (namespaceResponse.ok) {
64
+ const namespaces = await namespaceResponse.json();
65
+ const found = namespaces.find((n) => n.path === GROUP);
66
+ if (found) {
67
+ namespaceId = found.id;
68
+ }
69
+ }
70
+
71
+ const response = await fetch(apiUrl, {
72
+ method: 'POST',
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ 'PRIVATE-TOKEN': GITLAB_TOKEN,
76
+ },
77
+ body: JSON.stringify({
78
+ name: PROJECT_NAME,
79
+ path: PROJECT_NAME,
80
+ namespace_id: namespaceId,
81
+ visibility: 'private',
82
+ description: 'Core SDK for NestJS microservices - 통합 개발 키트',
83
+ initialize_with_readme: false,
84
+ }),
85
+ });
86
+
87
+ if (response.ok) {
88
+ console.log(`✅ GitLab project created: ${projectPath}`);
89
+ } else {
90
+ const error = await response.text();
91
+ if (error.includes('has already been taken')) {
92
+ console.log(`ℹ️ Project already exists: ${projectPath}`);
93
+ } else {
94
+ console.error(`⚠️ Failed to create project: ${error}`);
95
+ }
96
+ }
97
+ } catch (error) {
98
+ console.error(`⚠️ Error creating project: ${error.message}`);
99
+ }
100
+
101
+ // 2. Git 초기화 및 Push
102
+ const currentDir = process.cwd();
103
+ console.log(`\n📤 Pushing code to GitLab...`);
104
+
105
+ try {
106
+ // Git 초기화 (이미 있으면 스킵)
107
+ if (!fs.existsSync(path.join(currentDir, '.git'))) {
108
+ execSync('git init', { stdio: 'pipe', cwd: currentDir });
109
+ execSync('git add .', { stdio: 'pipe', cwd: currentDir });
110
+ execSync('git commit -m "Initial commit: Core SDK"', {
111
+ stdio: 'pipe',
112
+ cwd: currentDir,
113
+ });
114
+ }
115
+
116
+ // Remote 설정
117
+ const remoteUrl = `https://oauth2:${GITLAB_TOKEN}@${gitlabHost}/${projectPath}.git`;
118
+ try {
119
+ execSync('git remote remove origin', { stdio: 'pipe', cwd: currentDir });
120
+ } catch (e) {
121
+ // remote가 없으면 무시
122
+ }
123
+ execSync(`git remote add origin ${remoteUrl}`, {
124
+ stdio: 'pipe',
125
+ cwd: currentDir,
126
+ });
127
+
128
+ // Push
129
+ execSync('git push -u origin main || git push -u origin master', {
130
+ stdio: 'inherit',
131
+ cwd: currentDir,
132
+ });
133
+
134
+ console.log(`✅ Code pushed to GitLab: ${projectPath}`);
135
+ } catch (error) {
136
+ console.error(`⚠️ Failed to push: ${error.message}`);
137
+ }
138
+
139
+ // 3. 프로젝트 ID 가져오기
140
+ let projectId = null;
141
+ try {
142
+ const projectResponse = await fetch(
143
+ `${GITLAB_URL}/api/v4/projects/${encodeURIComponent(projectPath)}`,
144
+ {
145
+ headers: {
146
+ 'PRIVATE-TOKEN': GITLAB_TOKEN,
147
+ },
148
+ }
149
+ );
150
+ if (projectResponse.ok) {
151
+ const project = await projectResponse.json();
152
+ projectId = project.id;
153
+ console.log(`✅ Project ID: ${projectId}`);
154
+ }
155
+ } catch (error) {
156
+ console.warn(`⚠️ Could not get project ID: ${error.message}`);
157
+ }
158
+
159
+ // 4. package.json에 publishConfig 추가 (프로젝트 ID가 있는 경우)
160
+ if (projectId) {
161
+ const packageJsonPath = path.join(currentDir, 'package.json');
162
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
163
+ packageJson.publishConfig = {
164
+ '@xfilecom:registry': `${GITLAB_URL}/api/v4/projects/${projectId}/packages/npm/`,
165
+ };
166
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
167
+ console.log(`✅ Updated package.json with project-specific registry`);
168
+ }
169
+
170
+ // 5. .npmrc 업데이트
171
+ const npmrcPath = path.join(currentDir, '.npmrc');
172
+ const npmrcContent = projectId
173
+ ? `@xfilecom:registry=${GITLAB_URL}/api/v4/projects/${projectId}/packages/npm/
174
+ //${gitlabHost}/api/v4/projects/${projectId}/packages/npm/:_authToken=${GITLAB_TOKEN}
175
+ `
176
+ : `@xfilecom:registry=${GITLAB_URL}/api/v4/packages/npm/
177
+ //${gitlabHost}/api/v4/packages/npm/:_authToken=${GITLAB_TOKEN}
178
+ `;
179
+ fs.writeFileSync(npmrcPath, npmrcContent);
180
+ console.log(`✅ Updated .npmrc`);
181
+
182
+ // 6. npm publish
183
+ console.log(`\n📦 Publishing to GitLab Package Registry...`);
184
+ try {
185
+ execSync('npm publish', {
186
+ stdio: 'inherit',
187
+ cwd: currentDir,
188
+ env: {
189
+ ...process.env,
190
+ GITLAB_TOKEN,
191
+ },
192
+ });
193
+ console.log(`\n✅ Core SDK published successfully!`);
194
+ console.log(`\n📦 Package URL: ${GITLAB_URL}/${projectPath}/-/packages`);
195
+ } catch (error) {
196
+ console.error(`\n⚠️ Failed to publish: ${error.message}`);
197
+ console.log(`\n수동으로 배포하려면:`);
198
+ console.log(` cd ${currentDir}`);
199
+ console.log(` npm publish`);
200
+ console.log(`\n또는 GitLab 웹에서 확인:`);
201
+ console.log(` ${GITLAB_URL}/${projectPath}/-/packages`);
202
+ }
203
+ }
204
+
205
+ createGitLabProject().catch((error) => {
206
+ console.error('❌ Error:', error.message);
207
+ process.exit(1);
208
+ });
209
+