create-ait-app 0.0.2 → 0.0.3

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 (112) hide show
  1. package/README.md +38 -38
  2. package/package.json +5 -8
  3. package/src/cli.js +52 -0
  4. package/src/main.js +95 -444
  5. package/src/sample-configs.js +140 -0
  6. package/src/sample-inject.js +65 -0
  7. package/src/scaffold.js +111 -0
  8. package/src/skills.js +66 -0
  9. package/src/templates.js +88 -0
  10. package/src/utils/copy-dir.js +19 -0
  11. package/src/utils/fetch-text.js +47 -0
  12. package/src/utils/package-name.js +26 -0
  13. package/templates/js/eslint.config.js +14 -0
  14. package/templates/js/index.html +12 -0
  15. package/templates/js/package.json +20 -0
  16. package/templates/js/samples/iaa/src/lib/inAppAds.js +119 -0
  17. package/templates/js/samples/iaa/src/pages/InAppAdsPage.js +83 -0
  18. package/templates/js/samples/iap/src/lib/inAppPurchase.js +105 -0
  19. package/templates/js/samples/iap/src/pages/InAppPurchasePage.js +102 -0
  20. package/templates/js/src/app.js +58 -0
  21. package/templates/js/src/main.js +2 -0
  22. package/templates/js/vite.config.js +3 -0
  23. package/templates/react/README.md +26 -0
  24. package/templates/react/eslint.config.js +30 -0
  25. package/templates/react/granite.config.ts +20 -0
  26. package/templates/react/index.html +12 -0
  27. package/templates/react/package.json +27 -0
  28. package/templates/react/public/appsintoss-logo.png +0 -0
  29. package/templates/react/samples/iaa/src/hooks/useInAppAds.js +102 -0
  30. package/templates/react/samples/iaa/src/pages/InAppAdsPage.css +72 -0
  31. package/templates/react/samples/iaa/src/pages/InAppAdsPage.jsx +75 -0
  32. package/templates/react/samples/iap/public/icon-document.png +0 -0
  33. package/templates/react/samples/iap/src/hooks/useInAppPurchase.js +95 -0
  34. package/templates/react/samples/iap/src/pages/InAppPurchasePage.css +115 -0
  35. package/templates/react/samples/iap/src/pages/InAppPurchasePage.jsx +115 -0
  36. package/templates/react/src/App.css +104 -0
  37. package/templates/react/src/App.jsx +45 -0
  38. package/templates/react/src/index.css +27 -0
  39. package/templates/react/src/main.jsx +10 -0
  40. package/templates/react/vite.config.js +6 -0
  41. package/templates/react-ts/README.md +26 -0
  42. package/templates/react-ts/eslint.config.js +28 -0
  43. package/templates/react-ts/granite.config.ts +20 -0
  44. package/templates/react-ts/index.html +12 -0
  45. package/templates/react-ts/public/appsintoss-logo.png +0 -0
  46. package/templates/react-ts/samples/iaa/src/pages/InAppAdsPage.css +72 -0
  47. package/templates/react-ts/samples/iap/public/icon-document.png +0 -0
  48. package/templates/react-ts/samples/iap/src/pages/InAppPurchasePage.css +115 -0
  49. package/templates/react-ts/src/App.css +104 -0
  50. package/templates/react-ts/src/index.css +27 -0
  51. package/templates/react-ts/src/vite-env.d.ts +6 -0
  52. package/templates/react-ts/tsconfig.app.json +22 -0
  53. package/templates/react-ts/tsconfig.json +7 -0
  54. package/templates/react-ts/tsconfig.node.json +20 -0
  55. package/templates/react-ts/vite.config.ts +6 -0
  56. package/templates/react-ts-tds/README.md +26 -0
  57. package/templates/react-ts-tds/granite.config.ts +20 -0
  58. package/templates/react-ts-tds/package.json +35 -0
  59. package/templates/react-ts-tds/public/appsintoss-logo.png +0 -0
  60. package/templates/ts/README.md +26 -0
  61. package/templates/ts/eslint.config.js +15 -0
  62. package/templates/ts/granite.config.ts +20 -0
  63. package/templates/ts/index.html +12 -0
  64. package/templates/ts/package.json +22 -0
  65. package/templates/ts/public/appsintoss-logo.png +0 -0
  66. package/templates/ts/samples/iaa/src/lib/inAppAds.ts +132 -0
  67. package/templates/ts/samples/iaa/src/pages/InAppAdsPage.css +72 -0
  68. package/templates/ts/samples/iaa/src/pages/InAppAdsPage.ts +85 -0
  69. package/templates/ts/samples/iap/public/icon-document.png +0 -0
  70. package/templates/ts/samples/iap/src/lib/inAppPurchase.ts +114 -0
  71. package/templates/ts/samples/iap/src/pages/InAppPurchasePage.css +115 -0
  72. package/templates/ts/samples/iap/src/pages/InAppPurchasePage.ts +105 -0
  73. package/templates/ts/src/App.css +104 -0
  74. package/templates/ts/src/app.ts +60 -0
  75. package/templates/ts/src/index.css +27 -0
  76. package/templates/ts/src/main.ts +2 -0
  77. package/templates/ts/src/vite-env.d.ts +1 -0
  78. package/templates/ts/tsconfig.app.json +22 -0
  79. package/templates/ts/tsconfig.json +7 -0
  80. package/templates/ts/tsconfig.node.json +20 -0
  81. package/templates/ts/vite.config.ts +3 -0
  82. /package/{template → templates/js}/README.md +0 -0
  83. /package/{template → templates/js}/granite.config.ts +0 -0
  84. /package/{template → templates/js}/public/appsintoss-logo.png +0 -0
  85. /package/{template/__default/__samples → templates/js/samples}/iaa/src/pages/InAppAdsPage.css +0 -0
  86. /package/{template/__default/__samples → templates/js/samples}/iap/public/icon-document.png +0 -0
  87. /package/{template/__default/__samples → templates/js/samples}/iap/src/pages/InAppPurchasePage.css +0 -0
  88. /package/{template/__default → templates/js}/src/App.css +0 -0
  89. /package/{template/__default → templates/js}/src/index.css +0 -0
  90. /package/{template → templates/react-ts}/package.json +0 -0
  91. /package/{template/__default/__samples → templates/react-ts/samples}/iaa/src/hooks/useInAppAds.tsx +0 -0
  92. /package/{template/__default/__samples → templates/react-ts/samples}/iaa/src/pages/InAppAdsPage.tsx +0 -0
  93. /package/{template/__default/__samples → templates/react-ts/samples}/iap/src/hooks/useInAppPurchase.ts +0 -0
  94. /package/{template/__default/__samples → templates/react-ts/samples}/iap/src/pages/InAppPurchasePage.tsx +0 -0
  95. /package/{template/__default → templates/react-ts}/src/App.tsx +0 -0
  96. /package/{template/__default → templates/react-ts}/src/main.tsx +0 -0
  97. /package/{template → templates/react-ts-tds}/eslint.config.js +0 -0
  98. /package/{template → templates/react-ts-tds}/index.html +0 -0
  99. /package/{template/__tds/__samples → templates/react-ts-tds/samples}/iaa/src/hooks/useInAppAds.tsx +0 -0
  100. /package/{template/__tds/__samples → templates/react-ts-tds/samples}/iaa/src/pages/InAppAdsPage.tsx +0 -0
  101. /package/{template/__tds/__samples → templates/react-ts-tds/samples}/iap/public/icon-document.png +0 -0
  102. /package/{template/__tds/__samples → templates/react-ts-tds/samples}/iap/src/hooks/useInAppPurchase.ts +0 -0
  103. /package/{template/__tds/__samples → templates/react-ts-tds/samples}/iap/src/pages/InAppPurchasePage.tsx +0 -0
  104. /package/{template/__tds → templates/react-ts-tds}/src/App.css +0 -0
  105. /package/{template/__tds → templates/react-ts-tds}/src/App.tsx +0 -0
  106. /package/{template/__tds → templates/react-ts-tds}/src/index.css +0 -0
  107. /package/{template/__tds → templates/react-ts-tds}/src/main.tsx +0 -0
  108. /package/{template → templates/react-ts-tds}/src/vite-env.d.ts +0 -0
  109. /package/{template → templates/react-ts-tds}/tsconfig.app.json +0 -0
  110. /package/{template → templates/react-ts-tds}/tsconfig.json +0 -0
  111. /package/{template → templates/react-ts-tds}/tsconfig.node.json +0 -0
  112. /package/{template → templates/react-ts-tds}/vite.config.ts +0 -0
@@ -0,0 +1,45 @@
1
+ import "./App.css";
2
+ {{SAMPLE_IMPORTS}}
3
+
4
+
5
+ function App() {
6
+ {{PAGE_STATE_AND_ROUTES}}
7
+ return (
8
+ <div className="app">
9
+ <header className="app-header">
10
+ <h1 className="page-title">반가워요</h1>
11
+ <p className="page-subtitle">앱인토스 개발을 시작해 보세요.</p>
12
+ </header>
13
+
14
+ <div className="app-actions">
15
+ <a
16
+ className="app-button app-button-primary"
17
+ href="https://developers-apps-in-toss.toss.im"
18
+ target="_blank"
19
+ rel="noopener noreferrer"
20
+ >
21
+ 개발자센터
22
+ </a>
23
+ <a
24
+ className="app-button app-button-primary"
25
+ href="https://techchat-apps-in-toss.toss.im"
26
+ target="_blank"
27
+ rel="noopener noreferrer"
28
+ >
29
+ 개발자 커뮤니티
30
+ </a>
31
+ {{SAMPLE_BUTTONS}}
32
+ </div>
33
+
34
+ <div className="app-logo-wrap">
35
+ <img
36
+ className="logo"
37
+ src={`${import.meta.env.BASE_URL}appsintoss-logo.png`}
38
+ alt="apps in toss"
39
+ />
40
+ </div>
41
+ </div>
42
+ );
43
+ }
44
+
45
+ export default App;
@@ -0,0 +1,27 @@
1
+ :root {
2
+ font-family: sans-serif;
3
+ }
4
+
5
+ * {
6
+ -webkit-tap-highlight-color: transparent;
7
+ }
8
+
9
+ body {
10
+ margin: 0;
11
+ min-width: 320px;
12
+ min-height: 100vh;
13
+ }
14
+
15
+ @media (min-width: 481px) {
16
+ body {
17
+ display: flex;
18
+ justify-content: center;
19
+ align-items: flex-start;
20
+ background-color: #f5f5f5;
21
+ }
22
+ }
23
+
24
+ h1 {
25
+ font-size: 3.2em;
26
+ line-height: 1.1;
27
+ }
@@ -0,0 +1,10 @@
1
+ import { StrictMode } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ import "./index.css";
4
+ import App from "./App.jsx";
5
+
6
+ createRoot(document.getElementById("root")).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ );
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ });
@@ -0,0 +1,26 @@
1
+ # {{APP_NAME}}
2
+
3
+ Apps in Toss 프로젝트입니다.
4
+
5
+ ## 시작하기
6
+
7
+ ```bash
8
+ {{PM_DEV}}
9
+ ```
10
+
11
+ ## 배포하기
12
+
13
+ - 앱인토스 배포 API 키는 [앱인토스 콘솔](https://apps-in-toss.toss.im/) > 워크스페이스 > API 키 > 콘솔 API 키 에서 발급받을 수 있어요.
14
+
15
+ ```bash
16
+ {{PM_BUILD}}
17
+ {{PM_DEPLOY}}
18
+ ```
19
+
20
+ ## 유용한 링크
21
+
22
+ - [앱인토스 콘솔](https://apps-in-toss.toss.im/)
23
+ - [앱인토스 개발자센터](https://developers-apps-in-toss.toss.im/)
24
+ - [앱인토스 개발자 커뮤니티](https://techchat-apps-in-toss.toss.im/)
25
+
26
+ AI를 사용하시는 경우 [여기](https://developers-apps-in-toss.toss.im/development/llms.html)를 확인해보세요.
@@ -0,0 +1,28 @@
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import tseslint from 'typescript-eslint'
6
+
7
+ export default tseslint.config(
8
+ { ignores: ['dist'] },
9
+ {
10
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
11
+ files: ['**/*.{ts,tsx}'],
12
+ languageOptions: {
13
+ ecmaVersion: 2020,
14
+ globals: globals.browser,
15
+ },
16
+ plugins: {
17
+ 'react-hooks': reactHooks,
18
+ 'react-refresh': reactRefresh,
19
+ },
20
+ rules: {
21
+ ...reactHooks.configs.recommended.rules,
22
+ 'react-refresh/only-export-components': [
23
+ 'warn',
24
+ { allowConstantExport: true },
25
+ ],
26
+ },
27
+ },
28
+ )
@@ -0,0 +1,20 @@
1
+ import { defineConfig } from "@apps-in-toss/web-framework/config";
2
+
3
+ export default defineConfig({
4
+ appName: "{{APP_NAME}}",
5
+ brand: {
6
+ displayName: "앱 이름", // 화면에 노출될 앱의 한글 이름으로 바꿔주세요.
7
+ primaryColor: "{{PRIMARY_COLOR}}", // 화면에 노출될 앱의 기본 색상으로 바꿔주세요.
8
+ icon: "", // 화면에 노출될 앱의 아이콘 이미지 주소로 바꿔주세요.
9
+ },
10
+ web: {
11
+ host: "localhost",
12
+ port: 5173,
13
+ commands: {
14
+ dev: "vite dev",
15
+ build: "vite build",
16
+ },
17
+ },
18
+ permissions: [],
19
+ outdir: "dist",
20
+ });
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>AIT App</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/main.tsx"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,72 @@
1
+ .iaa-section-list {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 6px;
5
+ }
6
+
7
+ .iaa-section {
8
+ padding: 20px 0;
9
+ display: flex;
10
+ flex-direction: column;
11
+ align-items: stretch;
12
+ gap: 0;
13
+ }
14
+
15
+ .iaa-section-row {
16
+ display: flex;
17
+ align-items: center;
18
+ gap: 16px;
19
+ }
20
+
21
+ .iaa-section-info {
22
+ flex: 1;
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: 4px;
26
+ }
27
+
28
+ .iaa-section-title {
29
+ margin: 0;
30
+ font-size: 18px;
31
+ font-weight: 600;
32
+ color: #333d4b;
33
+ }
34
+
35
+ .iaa-section-desc {
36
+ margin: 0;
37
+ font-size: 15px;
38
+ color: #8b95a1;
39
+ }
40
+
41
+ .iaa-section-button {
42
+ flex-shrink: 0;
43
+ height: fit-content;
44
+ padding: 10px 16px;
45
+ color: #1368cc;
46
+ background-color: #ecf3ff;
47
+ border: 0;
48
+ border-radius: 8px;
49
+ font-size: 15px;
50
+ font-weight: 500;
51
+ cursor: pointer;
52
+ }
53
+
54
+ .iaa-section-button:hover:not(:disabled) {
55
+ background-color: #d4e5ff;
56
+ }
57
+
58
+ .iaa-section-button:disabled {
59
+ opacity: 0.5;
60
+ cursor: not-allowed;
61
+ }
62
+
63
+ .iaa-reward-message {
64
+ margin: 8px 0 0;
65
+ font-size: 15px;
66
+ color: #3182f6;
67
+ }
68
+
69
+ /* 인앱결제 페이지 "← 홈으로"와 동일 스타일 */
70
+ .iaa-back-btn {
71
+ margin: 16px 0;
72
+ }
@@ -0,0 +1,115 @@
1
+ .iap-empty-state {
2
+ height: 300px;
3
+ display: flex;
4
+ flex-direction: column;
5
+ justify-content: center;
6
+ align-items: center;
7
+ gap: 16px;
8
+ }
9
+
10
+ .iap-empty-state-icon {
11
+ width: 64px;
12
+ }
13
+
14
+ .iap-empty-state-content {
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+ gap: 12px;
19
+ }
20
+
21
+ .iap-empty-state-title {
22
+ margin: 0;
23
+ font-size: 20px;
24
+ font-weight: 600;
25
+ color: #191f28;
26
+ }
27
+
28
+ .iap-empty-state-desc {
29
+ margin: 0;
30
+ font-size: 16px;
31
+ color: #4e5968;
32
+ }
33
+
34
+ .iap-empty-state-back-btn {
35
+ width: fit-content;
36
+ padding: 10px 16px;
37
+ border-radius: 10px;
38
+ background-color: #3e8cf5;
39
+ color: #fff;
40
+ border: none;
41
+ font-size: 14px;
42
+ cursor: pointer;
43
+ }
44
+
45
+ .iap-empty-state-back-btn:hover {
46
+ background-color: #2d7ae0;
47
+ }
48
+
49
+ .iap-product-list {
50
+ /* wrapper for product items */
51
+ }
52
+
53
+ .iap-product-item {
54
+ padding: 20px 0;
55
+ display: flex;
56
+ align-items: center;
57
+ gap: 6px;
58
+ }
59
+
60
+ .iap-product-info {
61
+ flex: 1;
62
+ display: flex;
63
+ align-items: center;
64
+ gap: 16px;
65
+ }
66
+
67
+ .iap-product-icon {
68
+ width: 36px;
69
+ height: 36px;
70
+ border-radius: 6px;
71
+ object-fit: cover;
72
+ }
73
+
74
+ .iap-product-details {
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: 4px;
78
+ }
79
+
80
+ .iap-product-name {
81
+ font-size: 18px;
82
+ font-weight: 600;
83
+ color: #333d4b;
84
+ }
85
+
86
+ .iap-product-description,
87
+ .iap-product-amount {
88
+ font-size: 15px;
89
+ color: #8b95a1;
90
+ }
91
+
92
+ .iap-product-buy-btn {
93
+ height: fit-content;
94
+ padding: 10px;
95
+ color: #1368cc;
96
+ background-color: #ecf3ff;
97
+ border: 0;
98
+ border-radius: 8px;
99
+ font-size: 15px;
100
+ font-weight: 500;
101
+ cursor: pointer;
102
+ }
103
+
104
+ .iap-product-buy-btn:hover:not(:disabled) {
105
+ background-color: #d4e5ff;
106
+ }
107
+
108
+ .iap-product-buy-btn:disabled {
109
+ opacity: 0.7;
110
+ cursor: not-allowed;
111
+ }
112
+
113
+ .iap-back-btn {
114
+ margin: 16px 0;
115
+ }
@@ -0,0 +1,104 @@
1
+ #root {
2
+ width: 100%;
3
+ min-height: 100vh;
4
+ box-sizing: border-box;
5
+ padding: 24px;
6
+ }
7
+
8
+ @media (min-width: 481px) {
9
+ #root {
10
+ background-color: #ffffff;
11
+ max-width: 480px;
12
+ margin: 0 auto;
13
+ }
14
+ }
15
+
16
+ .app {
17
+ display: flex;
18
+ flex-direction: column;
19
+ }
20
+
21
+ .app-header {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: 12px;
25
+ padding: 24px 0;
26
+ }
27
+
28
+ .page-title {
29
+ margin: 0;
30
+ font-size: 24px;
31
+ font-weight: 600;
32
+ color: #333d4b;
33
+ }
34
+
35
+ .page-subtitle {
36
+ margin: 0;
37
+ font-size: 18px;
38
+ color: #4e5968;
39
+ }
40
+
41
+ .app-actions {
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: 16px;
45
+ padding: 24px 0;
46
+ }
47
+
48
+ .app-button {
49
+ width: 100%;
50
+ border: none;
51
+ border-radius: 16px;
52
+ padding: 20px;
53
+ font-size: 18px;
54
+ font-weight: 500;
55
+ cursor: pointer;
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ box-sizing: border-box;
60
+ text-decoration: none;
61
+ }
62
+
63
+ .app-button:active {
64
+ transform: scale(0.96);
65
+ transition: transform 0.1s ease;
66
+ }
67
+
68
+ .app-button-primary {
69
+ background-color: #ebf2ff;
70
+ color: #2272eb;
71
+ }
72
+
73
+ .app-button-primary:hover {
74
+ background-color: #c9e2ff;
75
+ }
76
+
77
+ .app-button-ghost {
78
+ background-color: #f2f4f6;
79
+ color: #4b5563;
80
+ }
81
+
82
+ .app-button-ghost:hover {
83
+ background-color: #e5e8eb;
84
+ }
85
+
86
+ .text-button {
87
+ background: none;
88
+ border: none;
89
+ cursor: pointer;
90
+ font-size: 18px;
91
+ color: #3182f6;
92
+ }
93
+
94
+ .app-logo-wrap {
95
+ position: fixed;
96
+ bottom: 24px;
97
+ left: 50%;
98
+ transform: translateX(-50%);
99
+ }
100
+
101
+ .logo {
102
+ width: 160px;
103
+ height: auto;
104
+ }
@@ -0,0 +1,27 @@
1
+ :root {
2
+ font-family: sans-serif;
3
+ }
4
+
5
+ * {
6
+ -webkit-tap-highlight-color: transparent;
7
+ }
8
+
9
+ body {
10
+ margin: 0;
11
+ min-width: 320px;
12
+ min-height: 100vh;
13
+ }
14
+
15
+ @media (min-width: 481px) {
16
+ body {
17
+ display: flex;
18
+ justify-content: center;
19
+ align-items: flex-start;
20
+ background-color: #f5f5f5;
21
+ }
22
+ }
23
+
24
+ h1 {
25
+ font-size: 3.2em;
26
+ line-height: 1.1;
27
+ }
@@ -0,0 +1,6 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module '*.css' {
4
+ const content: Record<string, string>;
5
+ export default content;
6
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsBuildInfo",
4
+ "target": "ES2020",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "skipLibCheck": true,
9
+ "moduleResolution": "bundler",
10
+ "allowImportingTsExtensions": true,
11
+ "isolatedModules": true,
12
+ "moduleDetection": "force",
13
+ "noEmit": true,
14
+ "jsx": "react-jsx",
15
+ "strict": true,
16
+ "noUnusedLocals": true,
17
+ "noUnusedParameters": true,
18
+ "noFallthroughCasesInSwitch": true,
19
+ "noUncheckedSideEffectImports": true
20
+ },
21
+ "include": ["src"]
22
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsBuildInfo",
4
+ "target": "ES2022",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "allowImportingTsExtensions": true,
10
+ "isolatedModules": true,
11
+ "moduleDetection": "force",
12
+ "noEmit": true,
13
+ "strict": true,
14
+ "noUnusedLocals": true,
15
+ "noUnusedParameters": true,
16
+ "noFallthroughCasesInSwitch": true,
17
+ "noUncheckedSideEffectImports": true
18
+ },
19
+ "include": ["vite.config.ts"]
20
+ }
@@ -0,0 +1,6 @@
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ })
@@ -0,0 +1,26 @@
1
+ # {{APP_NAME}}
2
+
3
+ Apps in Toss 프로젝트입니다.
4
+
5
+ ## 시작하기
6
+
7
+ ```bash
8
+ {{PM_DEV}}
9
+ ```
10
+
11
+ ## 배포하기
12
+
13
+ - 앱인토스 배포 API 키는 [앱인토스 콘솔](https://apps-in-toss.toss.im/) > 워크스페이스 > API 키 > 콘솔 API 키 에서 발급받을 수 있어요.
14
+
15
+ ```bash
16
+ {{PM_BUILD}}
17
+ {{PM_DEPLOY}}
18
+ ```
19
+
20
+ ## 유용한 링크
21
+
22
+ - [앱인토스 콘솔](https://apps-in-toss.toss.im/)
23
+ - [앱인토스 개발자센터](https://developers-apps-in-toss.toss.im/)
24
+ - [앱인토스 개발자 커뮤니티](https://techchat-apps-in-toss.toss.im/)
25
+
26
+ AI를 사용하시는 경우 [여기](https://developers-apps-in-toss.toss.im/development/llms.html)를 확인해보세요.
@@ -0,0 +1,20 @@
1
+ import { defineConfig } from "@apps-in-toss/web-framework/config";
2
+
3
+ export default defineConfig({
4
+ appName: "{{APP_NAME}}",
5
+ brand: {
6
+ displayName: "앱 이름", // 화면에 노출될 앱의 한글 이름으로 바꿔주세요.
7
+ primaryColor: "{{PRIMARY_COLOR}}", // 화면에 노출될 앱의 기본 색상으로 바꿔주세요.
8
+ icon: "", // 화면에 노출될 앱의 아이콘 이미지 주소로 바꿔주세요.
9
+ },
10
+ web: {
11
+ host: "localhost",
12
+ port: 5173,
13
+ commands: {
14
+ dev: "vite dev",
15
+ build: "vite build",
16
+ },
17
+ },
18
+ permissions: [],
19
+ outdir: "dist",
20
+ });
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "{{APP_NAME}}",
3
+ "private": true,
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "granite dev",
8
+ "build": "ait build",
9
+ "deploy": "ait deploy",
10
+ "lint": "eslint .",
11
+ "format": "prettier --write ."
12
+ },
13
+ "dependencies": {
14
+ "@emotion/react": "^11.0.0",
15
+ "@toss/tds-colors": "latest",
16
+ "@toss/tds-mobile": "latest",
17
+ "@toss/tds-mobile-ait": "latest",
18
+ "react": "^18.0.0",
19
+ "react-dom": "^18.0.0"
20
+ },
21
+ "devDependencies": {
22
+ "@eslint/js": "^9.21.0",
23
+ "@types/react": "^18.0.0",
24
+ "@types/react-dom": "^18.0.0",
25
+ "@vitejs/plugin-react": "^4.3.4",
26
+ "eslint": "^9.21.0",
27
+ "eslint-plugin-react-hooks": "^5.1.0",
28
+ "eslint-plugin-react-refresh": "^0.4.19",
29
+ "globals": "^15.15.0",
30
+ "prettier": "^3.4.2",
31
+ "typescript": "~5.7.2",
32
+ "typescript-eslint": "^8.24.1",
33
+ "vite": "^6.2.0"
34
+ }
35
+ }
@@ -0,0 +1,26 @@
1
+ # {{APP_NAME}}
2
+
3
+ Apps in Toss 프로젝트입니다.
4
+
5
+ ## 시작하기
6
+
7
+ ```bash
8
+ {{PM_DEV}}
9
+ ```
10
+
11
+ ## 배포하기
12
+
13
+ - 앱인토스 배포 API 키는 [앱인토스 콘솔](https://apps-in-toss.toss.im/) > 워크스페이스 > API 키 > 콘솔 API 키 에서 발급받을 수 있어요.
14
+
15
+ ```bash
16
+ {{PM_BUILD}}
17
+ {{PM_DEPLOY}}
18
+ ```
19
+
20
+ ## 유용한 링크
21
+
22
+ - [앱인토스 콘솔](https://apps-in-toss.toss.im/)
23
+ - [앱인토스 개발자센터](https://developers-apps-in-toss.toss.im/)
24
+ - [앱인토스 개발자 커뮤니티](https://techchat-apps-in-toss.toss.im/)
25
+
26
+ AI를 사용하시는 경우 [여기](https://developers-apps-in-toss.toss.im/development/llms.html)를 확인해보세요.