youngsuk 2023-05-18
230518 서영석 typeScript 추가
@2b607df1d42733c89a2c0185f312366ef68519bd
client/views/index.html
--- client/views/index.html
+++ client/views/index.html
@@ -14,7 +14,6 @@
 
     <body>
         <div id="root"></div>
-        <script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '/';</script>
         <script src="/client/build/bundle.js"></script>
     </body>
 </html>
 
client/views/index.js (deleted)
--- client/views/index.js
@@ -1,29 +0,0 @@
-/**
- * @author : 서영석
- * @since : 2023.02.28
- * @dscription : Vue를 활용한 Client단 구현의 시작점(Index) Component 입니다.
- */
- import { createApp } from 'vue';
-
- //Router
- import AppRouter from './pages/AppRouter.js';
- import AppStore from './pages/AppStore.js';
- import AppFilters from './pages/AppFilters.js';
- 
- //Application Root Vue Component
- import App from './pages/App.vue';
- 
- const app = createApp(App);
- app.use(AppStore)
- app.use(AppRouter)
- 
- app.config.globalProperties.$filters = AppFilters
- app.mount('#root');
- 
- //index.html에 정의된 window.AppUserHttpRequestURL을 활용하여, 사용자가 요청한 초기 페이지로 이동
- if (!APP_USER_HTTP_REQUEST_URL && APP_USER_HTTP_REQUEST_URL != '/') {
-     console.log('index.js APP_USER_HTTP_REQUEST_URL : ', APP_USER_HTTP_REQUEST_URL);
-     AppRouter.push({ path: APP_USER_HTTP_REQUEST_URL, query: {}})
- }
- 
- (파일 끝에 줄바꿈 문자 없음)
 
client/views/index.ts (added)
+++ client/views/index.ts
@@ -0,0 +1,20 @@
+/**
+ * @author : 최정우
+ * @since : 2022.10.19
+ * @dscription : Vue를 활용한 Client단 구현의 시작점(Index) Component 입니다.
+ */
+import { createApp } from 'vue';
+
+import AppRouter from './pages/AppRouter';
+import AppStore from './pages/AppStore';
+import AppFilters from './pages/AppFilters';
+
+import App from './pages/App.vue';
+
+// const vue = createApp(App).use(AppRouter).mount('#root');
+const vue = createApp(App)
+vue.use(AppStore);
+vue.use(AppRouter);
+vue.config.globalProperties.$filters = AppFilters
+
+vue.mount('#root');
client/views/pages/AppFilters.ts (Renamed from client/views/pages/AppFilters.js)
--- client/views/pages/AppFilters.js
+++ client/views/pages/AppFilters.ts
@@ -9,13 +9,13 @@
 	var _filters = {
 		
 		/*전화번호*/
-		phone: function (phone) {
+		phone: function (phone : any) {
 			return phone.replace(/[^0-9]/g, '')
 						.replace(/(\d{3})(\d{4})(\d{4})/, '($1) $2-$3');
 		},
 
 		/* 반올림  */
-		math: function (param) {
+		math: function (param : any) {
 			if(param == 0){
 				return "-";
 			}
@@ -23,7 +23,7 @@
 		},
 
 		/* 특수문자 변형 */
-		specialCharacter: function (arr) {
+		specialCharacter: function (arr : any) {
 			arr = arr.replace(/&lt;/g, '<');
 			arr = arr.replace(/&gt;/g, '>');
 			arr = arr.replace(/&quot;/g, '"');
@@ -34,7 +34,7 @@
 		},
 
 		/* input text 제한 */
-		comma: function (text) {
+		comma: function (text : any) {
 			try {
 				return text.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
 			} catch (e) {
@@ -47,7 +47,7 @@
 		},
 
 		/* html text 제한 */
-		textLimit: function (text, limit) {
+		textLimit: function (text : any, limit : any) {
 			if (text === undefined || text === null || text === "" || text.length === 0) {
 				return text;
 			} else {
@@ -56,7 +56,7 @@
 		},
 
 		/* 파일 사이즈  */
-		fileSize: function (size) {
+		fileSize: function (size : any) {
 			var result = size + " bytes";
 			// optional code for multiples approximation
 			var type = ["KB", "MB", "GB"];
@@ -67,7 +67,7 @@
 		},
 
 		/* 숫자 한글 표현  */
-		numberSize: function (number) {
+		numberSize: function (number : any) {
 			var result = number;
 			// optional code for multiples approximation
 			var type = ["만", "억", "조", "경", "해"];
@@ -82,7 +82,7 @@
 			//return result;
 		},
 
-		isEmpty: function (data) {
+		isEmpty: function (data : any) {
 			if (data === undefined || data === null || data === "" || data.length === 0 || (data.constructor == Object && Object.keys(data).length === 0)) {
 				if ((typeof data) === "number") {
 					return false
@@ -95,7 +95,7 @@
 		},
 
 		/* 빈 데이터 표현 => '-'  */
-		emptyText: function (text) {
+		emptyText: function (text : any) {
 			if (text === undefined || text === null || text === "" || text.length === 0) {
 				return '-';
 			} else {
@@ -105,16 +105,19 @@
 
 		//클라이언트의 현재 일짜와 비교해서 더 작은 지에 대한 여부 확인
 		//param - dateText : yyyy-mm-dd (String)
-		isSmallerClientDate: function (dateText) {
+		isSmallerClientDate: function (dateText : any) {
 			const date = new Date(dateText);
 			let clientDate = new Date();
 
 			let yyyy = clientDate.getFullYear();
-			let mm = clientDate.getMonth() + 1;
+			let mm : any = clientDate.getMonth() + 1;
 			if (mm < 10) {
-				mm = "0" + mm;
+				let MM : String;
+				MM = "0" +  mm;
+				mm=String(mm);
 			}
-			let dd = clientDate.getDate();
+			
+			let dd : any = clientDate.getDate();
 			if (dd < 10) {
 				dd = "0" + dd;
 			}
@@ -131,7 +134,7 @@
 		DEFAULT_REPAIR_SIZE: -5,
 
 		/* 인하 횟수 => 인하 수치 */
-		repairMillimeter: function(repairCount) {
+		repairMillimeter: function(repairCount : any) {
 			const newRepairCount = !repairCount ? 0 : Number(repairCount);
 			const repairSize = this.DEFAULT_REPAIR_SIZE * newRepairCount;
 			return repairSize;
client/views/pages/AppRouter.ts (Renamed from client/views/pages/AppRouter.js)
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.ts
@@ -1,13 +1,10 @@
 import { createWebHistory, createRouter } from "vue-router";
 
 import Main from '../pages/main/Main.vue';
-import Main2 from '../pages/main/Main2.vue';
 
 const routes = [
     /* 메인화면 */
-    { path: "/", name: "Main", component: Main },
-    { path: "/Main2", name: "Main2", component: Main2},
-
+    { path: '/', name: '/', component: Main},
 ];
 
 const AppRouter = createRouter({
client/views/pages/AppStore.ts (Renamed from client/views/pages/AppStore.js)
--- client/views/pages/AppStore.js
+++ client/views/pages/AppStore.ts
@@ -8,16 +8,10 @@
         getLoginUser: function () {
 
         },
-        getKey: function () {
-
-        }
     },
     mutations: {
         setLoginUser: function (state, newValue) {
             state.loginUser = newValue;
         },
-        setKey: function (state, newValue) {
-            state.key = newValue;
-        }
     }
 });
(파일 끝에 줄바꿈 문자 없음)
 
client/views/vue-shim.d.ts (added)
+++ client/views/vue-shim.d.ts
@@ -0,0 +1,5 @@
+declare module '*.vue' {
+    import type { DefineComponent } from 'vue'
+    const component: DefineComponent<{}, {}, any>
+    export default component
+}(파일 끝에 줄바꿈 문자 없음)
package-lock.json
--- package-lock.json
+++ package-lock.json
@@ -1,5 +1,5 @@
 {
-  "name": "node_vue_web_server_framework_v1.0-master",
+  "name": "crosswalk",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
@@ -25,6 +25,10 @@
         "vuex": "^4.1.0",
         "webpack": "5.74.0",
         "webpack-cli": "4.10.0"
+      },
+      "devDependencies": {
+        "ts-loader": "^9.4.2",
+        "typescript": "^5.0.4"
       }
     },
     "node_modules/@ampproject/remapping": {
@@ -952,7 +956,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "optional": true,
+      "devOptional": true,
       "dependencies": {
         "fill-range": "^7.0.1"
       },
@@ -1561,7 +1565,7 @@
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "optional": true,
+      "devOptional": true,
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -1960,7 +1964,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "optional": true,
+      "devOptional": true,
       "engines": {
         "node": ">=0.12.0"
       }
@@ -2142,6 +2146,19 @@
       "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
       "engines": {
         "node": ">= 0.6"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "dev": true,
+      "dependencies": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
       }
     },
     "node_modules/mime": {
@@ -2431,7 +2448,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "optional": true,
+      "devOptional": true,
       "engines": {
         "node": ">=8.6"
       },
@@ -3024,7 +3041,7 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "optional": true,
+      "devOptional": true,
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -3040,6 +3057,101 @@
         "node": ">=0.6"
       }
     },
+    "node_modules/ts-loader": {
+      "version": "9.4.2",
+      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz",
+      "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "enhanced-resolve": "^5.0.0",
+        "micromatch": "^4.0.0",
+        "semver": "^7.3.4"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "typescript": "*",
+        "webpack": "^5.0.0"
+      }
+    },
+    "node_modules/ts-loader/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/ts-loader/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/ts-loader/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/ts-loader/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/ts-loader/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/ts-loader/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/type-is": {
       "version": "1.6.18",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -3050,6 +3162,19 @@
       },
       "engines": {
         "node": ">= 0.6"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
+      "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=12.20"
       }
     },
     "node_modules/unpipe": {
@@ -4218,7 +4343,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "optional": true,
+      "devOptional": true,
       "requires": {
         "fill-range": "^7.0.1"
       }
@@ -4660,7 +4785,7 @@
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "optional": true,
+      "devOptional": true,
       "requires": {
         "to-regex-range": "^5.0.1"
       }
@@ -4944,7 +5069,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "optional": true
+      "devOptional": true
     },
     "is-plain-object": {
       "version": "2.0.4",
@@ -5078,6 +5203,16 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
       "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
+    },
+    "micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "dev": true,
+      "requires": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      }
     },
     "mime": {
       "version": "1.6.0",
@@ -5287,7 +5422,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "optional": true
+      "devOptional": true
     },
     "pify": {
       "version": "4.0.1",
@@ -5683,7 +5818,7 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "optional": true,
+      "devOptional": true,
       "requires": {
         "is-number": "^7.0.0"
       }
@@ -5693,6 +5828,72 @@
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
     },
+    "ts-loader": {
+      "version": "9.4.2",
+      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz",
+      "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "enhanced-resolve": "^5.0.0",
+        "micromatch": "^4.0.0",
+        "semver": "^7.3.4"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+          "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "type-is": {
       "version": "1.6.18",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -5702,6 +5903,12 @@
         "mime-types": "~2.1.24"
       }
     },
+    "typescript": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
+      "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
+      "dev": true
+    },
     "unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
package.json
--- package.json
+++ package.json
@@ -1,6 +1,6 @@
 {
   "dependencies": {
-    "@babe~l/cli": "7.19.3",
+    "@babel/cli": "7.19.3",
     "@babel/core": "7.19.3",
     "axios": "^1.3.4",
     "babel-loader": "8.2.5",
@@ -30,5 +30,9 @@
     "linux-dev": "export NODE_ENV=development&&node ./server/modules/web/server.js",
     "webpack-build": "webpack",
     "webpack-build-watch": "webpack --watch"
+  },
+  "devDependencies": {
+    "ts-loader": "^9.4.2",
+    "typescript": "^5.0.4"
   }
 }
 
tsconfig.json (added)
+++ tsconfig.json
@@ -0,0 +1,21 @@
+{
+    "compilerOptions": {
+        /* "composite": true,
+        "target": "esnext",
+        "module": "esnext",
+        "strict": true,
+        "jsx": "preserve",
+        "moduleResolution": "node",
+        "allowImportingTsExtensions": true,
+        "emitDeclarationOnly": true */
+        /* "outDir": "./client/build/", */
+        "outDir": "./built/",
+        "strict": true,
+        "noImplicitAny": true,
+        "module": "es6",
+        "target": "es5",
+        "jsx": "preserve",
+        "allowJs": true,
+        "moduleResolution": "node",
+    }
+}(파일 끝에 줄바꿈 문자 없음)
webpack.config.js
--- webpack.config.js
+++ webpack.config.js
@@ -30,11 +30,22 @@
           fallback:require.resolve('file-loader')
         }
       }]
+    },{
+      test: /\.(ts|tsx)$/,
+      exclude: /node_modules/,
+      loader: 'ts-loader',
+      options: { appendTsSuffixTo: [/\.vue$/] }
     }],
   },
 
   plugins: [new VueLoaderPlugin()],
 
+  resolve: {
+    //확장자를 순서대로 해석, 여러 파일에서 이름이 동일하지만 다른 확장자를 가진 경우, webpack은 배열의 앞에서부터 파일을 해석하고 남은 것은 해석하지 않음
+    //import 시, 확장자 생략 가능
+    extensions: [ '.tsx', '.ts', '.jsx', '.js', '.vue', 'json' ],
+  },
+  
   output: {
     path: `${BASE_DIR}/client/build`,	// __dirname: webpack.config.js 파일이 위치한 경로
     filename: 'bundle.js'
Add a comment
List