create-sonamu 0.1.7 → 0.1.9

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.
package/catalog.json ADDED
@@ -0,0 +1,210 @@
1
+ {
2
+ "@adonisjs/ace": "^13.3.0",
3
+ "@adonisjs/tsconfig": "^1.4.1",
4
+ "@ai-sdk/anthropic": "^3.0.0",
5
+ "@ai-sdk/openai": "^3.0.0",
6
+ "@ai-sdk/provider": "^3.0.0",
7
+ "@ai-sdk/provider-utils": "^4.0.0",
8
+ "@ai-sdk/react": "^2.0.104",
9
+ "@aws-sdk/client-ecr-public": "^3.958.0",
10
+ "@aws-sdk/client-s3": "^3.958.0",
11
+ "@aws-sdk/ecr-public": "^3.958.0",
12
+ "@aws-sdk/lib-storage": "^3.971.0",
13
+ "@aws-sdk/s3-request-presigner": "^3.958.0",
14
+ "@better-auth/passkey": "^1.4.18",
15
+ "@better-auth/sso": "^1.4.18",
16
+ "@biomejs/biome": "^2.3.13",
17
+ "@biomejs/js-api": "^4.0.0",
18
+ "@biomejs/wasm-nodejs": "^2.3.7",
19
+ "@changesets/cli": "^2.29.4",
20
+ "@dagrejs/dagre": "^1.1.8",
21
+ "@dnd-kit/core": "^4.0.3",
22
+ "@dnd-kit/sortable": "^5.1.0",
23
+ "@dnd-kit/utilities": "^3.2.2",
24
+ "@faker-js/faker": "^9.2.0",
25
+ "@fastify/compress": "^7.0.3",
26
+ "@fastify/cors": "^8.1.0",
27
+ "@fastify/formbody": "^7.1.0",
28
+ "@fastify/middie": "^8.3.0",
29
+ "@fastify/multipart": "^8",
30
+ "@fastify/passport": "^2.2.0",
31
+ "@fastify/static": "^7",
32
+ "@hookform/resolvers": "^5.2.2",
33
+ "@iconify-json/lucide": "^1.2.82",
34
+ "@iconify-json/mdi": "^1.2.3",
35
+ "@iconify/json": "^2.2.421",
36
+ "@iconify/react": "^6.0.2",
37
+ "@japa/assert": "^4.1.1",
38
+ "@japa/file-system": "^2.3.2",
39
+ "@japa/runner": "^4.4.0",
40
+ "@japa/snapshot": "^2.0.9",
41
+ "@julr/tooling-configs": "^4.0.0",
42
+ "@loaderkit/resolve": "^1.0.4",
43
+ "@logtape/fastify": "2.0.0",
44
+ "@logtape/logtape": "2.0.0",
45
+ "@logtape/pretty": "2.0.0",
46
+ "@logtape/redaction": "2.0.0",
47
+ "@radix-ui/react-accordion": "^1.2.12",
48
+ "@radix-ui/react-alert-dialog": "^1.1.15",
49
+ "@radix-ui/react-aspect-ratio": "^1.1.8",
50
+ "@radix-ui/react-avatar": "^1.1.11",
51
+ "@radix-ui/react-checkbox": "^1.3.3",
52
+ "@radix-ui/react-collapsible": "^1.1.12",
53
+ "@radix-ui/react-context-menu": "^2.2.16",
54
+ "@radix-ui/react-dialog": "^1.1.15",
55
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
56
+ "@radix-ui/react-hover-card": "^1.1.15",
57
+ "@radix-ui/react-label": "^2.1.8",
58
+ "@radix-ui/react-menubar": "^1.1.16",
59
+ "@radix-ui/react-navigation-menu": "^1.2.14",
60
+ "@radix-ui/react-popover": "^1.1.15",
61
+ "@radix-ui/react-progress": "^1.1.8",
62
+ "@radix-ui/react-radio-group": "^1.3.8",
63
+ "@radix-ui/react-scroll-area": "^1.2.10",
64
+ "@radix-ui/react-select": "^2.2.6",
65
+ "@radix-ui/react-separator": "^1.1.8",
66
+ "@radix-ui/react-slider": "^1.3.6",
67
+ "@radix-ui/react-slot": "^1.1.1",
68
+ "@radix-ui/react-switch": "^1.2.6",
69
+ "@radix-ui/react-tabs": "^1.1.13",
70
+ "@radix-ui/react-toast": "^1.2.15",
71
+ "@radix-ui/react-toggle": "^1.1.10",
72
+ "@radix-ui/react-toggle-group": "^1.1.11",
73
+ "@radix-ui/react-tooltip": "^1.2.8",
74
+ "@sheetkit/node": "^0.5.0",
75
+ "@svgr/core": "^8.1.0",
76
+ "@svgr/plugin-jsx": "^8.1.0",
77
+ "@svgr/plugin-svgo": "^8.1.0",
78
+ "@swc/cli": "^0.7.8",
79
+ "@swc/core": "^1.13.5",
80
+ "@tailwindcss/postcss": "^4.0.0",
81
+ "@tailwindcss/vite": "^4.1.17",
82
+ "@tanstack/react-query": "^5.90.12",
83
+ "@tanstack/react-query-devtools": "^5.91.1",
84
+ "@tanstack/react-router": "1.143.11",
85
+ "@tanstack/react-router-devtools": "1.143.11",
86
+ "@tanstack/router-plugin": "1.143.11",
87
+ "@types/bcrypt": "^6",
88
+ "@types/fs-extra": "^11.0.4",
89
+ "@types/inflection": "^2.0.0",
90
+ "@types/lodash-es": "^4.17.12",
91
+ "@types/luxon": "^3.0.3",
92
+ "@types/mime-types": "^3.0.1",
93
+ "@types/node": "25.0.7",
94
+ "@types/pg": "^8.15.6",
95
+ "@types/picomatch": "^4.0.0",
96
+ "@types/prompts": "^2.0.14",
97
+ "@types/prop-types": "^15.7.15",
98
+ "@types/qs": "^6.14.0",
99
+ "@types/react": "^19.2.7",
100
+ "@types/react-dom": "^19.2.3",
101
+ "@types/react-syntax-highlighter": "^15.5.13",
102
+ "@types/supertest": "^6.0.3",
103
+ "@typescript/native-preview": "^7.0.0-dev.20251225.1",
104
+ "@vitejs/plugin-react": "4.7.0",
105
+ "@vitejs/plugin-react-swc": "^4.1.3",
106
+ "@vitest/coverage-v8": "^4.0.12",
107
+ "@xyflow/react": "^12.9.3",
108
+ "ai": "^6.0.1",
109
+ "autoprefixer": "^10.4.20",
110
+ "axios": "^1.13.2",
111
+ "bcrypt": "^6.0.0",
112
+ "bentocache": "^1.5.0",
113
+ "better-auth": "^1.4.18",
114
+ "c12": "^3.3.2",
115
+ "c8": "^10.1.3",
116
+ "chalk": "^4.1.2",
117
+ "chokidar": "^4.0.3",
118
+ "class-variance-authority": "^0.7.1",
119
+ "classnames": "^2.3.2",
120
+ "clsx": "^2.1.1",
121
+ "cmdk": "^1.1.1",
122
+ "corepack": "^0.34.1",
123
+ "date-fns": "^4.1.0",
124
+ "date-fns-tz": "^3.2.0",
125
+ "debug": "^4.3.7",
126
+ "del-cli": "^6.0.0",
127
+ "desm": "^1.3.1",
128
+ "dotenv": "^16",
129
+ "embla-carousel-react": "^8.6.0",
130
+ "esbuild": "^0.27.0",
131
+ "eventsource": "^4.1.0",
132
+ "execa": "^8.0.1",
133
+ "fast-deep-equal": "^3.1.3",
134
+ "fast-glob": "^3.3.3",
135
+ "fastify": "^4",
136
+ "fastify-file-upload": "^4.0.0",
137
+ "fastify-qs": "^4.0.0",
138
+ "fastify-sse-v2": "^4.2.1",
139
+ "flydrive": "^1.3.0",
140
+ "fs-extra": "^11.3.0",
141
+ "inflection": "^3.0.2",
142
+ "input-otp": "^1.4.2",
143
+ "ioredis": "^5.8.2",
144
+ "jotai": "^2.14.0",
145
+ "json5": "^2.2.3",
146
+ "knex": "^3.1.0",
147
+ "lodash-es": "^4.17.21",
148
+ "lucide-react": "^0.462.0",
149
+ "luxon": "^3.0.3",
150
+ "mime-types": "^3.0.1",
151
+ "minimatch": "^10.0.3",
152
+ "minimist": "^1.2.8",
153
+ "next-themes": "^0.4.6",
154
+ "node-cron": "^4.2.1",
155
+ "node-sql-parser": "^5.2.0",
156
+ "nodemon": "^3.1.10",
157
+ "npm-run-all": "^4.1.5",
158
+ "p-event": "^6.0.1",
159
+ "p-timeout": "^6.1.4",
160
+ "parse-imports": "^2.2.1",
161
+ "pg": "^8.16.3",
162
+ "pg-native": "^3.5.2",
163
+ "pgvector": "^0.2.1",
164
+ "picomatch": "^4.0.2",
165
+ "postcss": "^8.4.49",
166
+ "prompts": "^2.4.2",
167
+ "prop-types": "^15.8.1",
168
+ "qs": "^6.14.1",
169
+ "radashi": "^12.2.0",
170
+ "react": "^19.2.3",
171
+ "react-day-picker": "^8.10.1",
172
+ "react-dom": "^19.2.3",
173
+ "react-draggable": "^4.5.0",
174
+ "react-hook-form": "^7.66.1",
175
+ "react-markdown": "^9.0.1",
176
+ "react-resizable-panels": "^3.0.6",
177
+ "react-router-dom": "^6.30.2",
178
+ "react-semantic-ui-datepickers": "^2.17.1",
179
+ "react-syntax-highlighter": "^15.5.0",
180
+ "read-package-up": "^11.0.0",
181
+ "rou3": "^0.7.10",
182
+ "sass": "^1.92.1",
183
+ "scss": "^0.2.4",
184
+ "semantic-ui-css": "^2.5.0",
185
+ "semantic-ui-react": "^2.1.3",
186
+ "sharp": "^0.34.5",
187
+ "sonner": "^2.0.7",
188
+ "supertest": "^7.1.1",
189
+ "supports-color": "^10.2.2",
190
+ "swr": "^2.3.7",
191
+ "tailwind-merge": "^3.4.0",
192
+ "tailwindcss": "^4.0.0",
193
+ "ts-node": "^10.9.2",
194
+ "tsdown": "^0.12.5",
195
+ "tsicli": "^1.0.5",
196
+ "tsup": "^8.1.0",
197
+ "tsx": "^4.20.6",
198
+ "typescript": "^5.9.3",
199
+ "unplugin-icons": "0.20.2",
200
+ "uuid": "^13.0.0",
201
+ "vaul": "^1.1.2",
202
+ "vite": "7.3.0",
203
+ "vite-plugin-dts": "4.5.4",
204
+ "vite-tsconfig-paths": "^5.1.4",
205
+ "vitest": "^4.0.10",
206
+ "voyageai": "^0.0.8",
207
+ "xlsx": "^0.18.5",
208
+ "zod": "^4.3.6",
209
+ "zx": "^8.8.5"
210
+ }
package/index.js CHANGED
@@ -45,16 +45,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
45
45
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
46
  }
47
47
  };
48
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
- if (ar || !(i in from)) {
51
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
- ar[i] = from[i];
53
- }
54
- }
55
- return to.concat(ar || Array.prototype.slice.call(from));
56
- };
57
- import { execSync, spawn } from "node:child_process";
48
+ import { spawn } from "node:child_process";
58
49
  import * as fs from "node:fs";
59
50
  import * as path from "node:path";
60
51
  import { fileURLToPath } from "node:url";
@@ -65,69 +56,16 @@ import prompts from "prompts";
65
56
  // 생성된 파일/디렉토리 전역에서 추적하기 위한 변수
66
57
  var createdTargetRoot = null;
67
58
  var isCleaningUp = false;
68
- // Helper: package.json에서 catalog 패키지 추출
69
- function extractCatalogPackages(packageJsonPath) {
70
- var packages = new Set();
71
- if (!fs.existsSync(packageJsonPath))
72
- return packages;
73
- var pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
74
- var allDeps = __assign(__assign({}, pkg.dependencies), pkg.devDependencies);
75
- for (var _i = 0, _a = Object.entries(allDeps); _i < _a.length; _i++) {
76
- var _b = _a[_i], name_1 = _b[0], version = _b[1];
77
- if (version === "catalog:") {
78
- packages.add(name_1);
79
- }
80
- }
81
- return packages;
82
- }
83
- // Helper: pnpm-workspace.yaml에서 catalog 파싱
84
- function parseCatalogFromWorkspace(workspacePath) {
85
- if (!fs.existsSync(workspacePath))
59
+ // Helper: catalog.json에서 catalog 파싱
60
+ function loadCatalogJson() {
61
+ var catalogPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "catalog.json");
62
+ if (!fs.existsSync(catalogPath))
86
63
  return {};
87
- var content = fs.readFileSync(workspacePath, "utf-8");
88
- var catalog = {};
89
- var lines = content.split("\n");
90
- var inCatalog = false;
91
- for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
92
- var line = lines_1[_i];
93
- if (line.trim() === "catalog:") {
94
- inCatalog = true;
95
- continue;
96
- }
97
- if (inCatalog) {
98
- // catalog 섹션이 끝나면 중단
99
- if (line && !line.startsWith(" ") && !line.startsWith("\t")) {
100
- break;
101
- }
102
- // 패키지 파싱: " package-name: version"
103
- var match = line.match(/^\s+["']?([^"':]+)["']?:\s*(.+)$/);
104
- if (match) {
105
- var name_2 = match[1], version = match[2];
106
- catalog[name_2.trim()] = version.trim();
107
- }
108
- }
109
- }
110
- return catalog;
111
- }
112
- // Helper: workspace 패키지의 실제 버전 가져오기
113
- function getWorkspacePackageVersion(packageName, workspaceRoot) {
114
- var packagePath = path.join(workspaceRoot, "modules", packageName, "package.json");
115
- if (fs.existsSync(packagePath)) {
116
- var pkg = JSON.parse(fs.readFileSync(packagePath, "utf-8"));
117
- return "^".concat(pkg.version);
118
- }
119
- // fallback: npm에서 최신 버전 가져오기
120
- try {
121
- var result = execSync("npm view ".concat(packageName, " version"), { encoding: "utf-8" });
122
- return "^".concat(result.trim());
123
- }
124
- catch (_a) {
125
- return "workspace:^";
126
- }
64
+ return JSON.parse(fs.readFileSync(catalogPath, "utf-8"));
127
65
  }
128
66
  function init() {
129
67
  return __awaiter(this, void 0, void 0, function () {
130
- var shutdownHandler, argv, argProjectName, useDefaults, parseYesNo, result, e_1, targetDir, targetRoot, overwrite, result_1, templateRoot, copy, write, files, _i, _a, file, workspaceRoot, parentWorkspacePath, rootPkgPath, pkg, apiPkgPath, webPkgPath, apiPackages, webPackages, allCatalogPackages, parentCatalog, catalogEntries, _b, _c, pkgName, version, workspaceContent, isPnpm, pnpmOption, result_2, error_1, isDatabase, dockerOption, result_3, useDbDefaults, answers, error_2, env, initSqlPath, initSql;
68
+ var shutdownHandler, argv, argProjectName, useDefaults, parseYesNo, result, e_1, targetDir, targetRoot, overwrite, result_1, templateRoot, copy, write, files, _i, _a, file, rootPkgPath, pkg, parentCatalog, catalogEntries, _b, _c, pkgName, workspaceContent, isPnpm, pnpmOption, result_2, error_1, isDatabase, dockerOption, result_3, useDbDefaults, answers, error_2, env, initSqlPath, initSql;
131
69
  var _d;
132
70
  return __generator(this, function (_e) {
133
71
  switch (_e.label) {
@@ -285,33 +223,16 @@ function init() {
285
223
  file = _a[_i];
286
224
  write(file);
287
225
  }
288
- workspaceRoot = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
226
+ // 2. Copy package.json and modify name
289
227
  ["packages/api", "packages/web"].forEach(function (dir) {
290
228
  var pkgPath = path.join(templateRoot, dir, "package.json");
291
229
  if (fs.existsSync(pkgPath)) {
292
230
  var pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
293
- // Extract just "api" or "web" from "packages/api"
294
231
  var pkgType = dir.split("/")[1];
295
232
  pkg.name = "".concat(targetDir, "-").concat(pkgType);
296
- // Replace workspace:^ with actual versions
297
- var replaceDeps = function (deps) {
298
- if (!deps)
299
- return;
300
- for (var _i = 0, _a = Object.entries(deps); _i < _a.length; _i++) {
301
- var _b = _a[_i], name_3 = _b[0], version = _b[1];
302
- if (version === "workspace:^") {
303
- // Extract package name from scoped package (e.g., @sonamu-kit/react-sui -> react-sui)
304
- var pkgName = name_3.includes("/") ? name_3.split("/")[1] : name_3;
305
- deps[name_3] = getWorkspacePackageVersion(pkgName, workspaceRoot);
306
- }
307
- }
308
- };
309
- replaceDeps(pkg.dependencies);
310
- replaceDeps(pkg.devDependencies);
311
233
  fs.writeFileSync(path.join(targetRoot, dir, "package.json"), JSON.stringify(pkg, null, 2));
312
234
  }
313
235
  });
314
- parentWorkspacePath = path.join(workspaceRoot, "pnpm-workspace.yaml");
315
236
  rootPkgPath = path.join(templateRoot, "package.json");
316
237
  if (fs.existsSync(rootPkgPath)) {
317
238
  pkg = JSON.parse(fs.readFileSync(rootPkgPath, "utf-8"));
@@ -319,19 +240,11 @@ function init() {
319
240
  fs.writeFileSync(path.join(targetRoot, "package.json"), JSON.stringify(pkg, null, 2));
320
241
  console.log("".concat(chalk.green("CREATE"), " ").concat(path.join(targetRoot, "package.json")));
321
242
  }
322
- apiPkgPath = path.join(templateRoot, "packages", "api", "package.json");
323
- webPkgPath = path.join(templateRoot, "packages", "web", "package.json");
324
- apiPackages = extractCatalogPackages(apiPkgPath);
325
- webPackages = extractCatalogPackages(webPkgPath);
326
- allCatalogPackages = new Set(__spreadArray(__spreadArray([], Array.from(apiPackages), true), Array.from(webPackages), true));
327
- parentCatalog = parseCatalogFromWorkspace(parentWorkspacePath);
243
+ parentCatalog = loadCatalogJson();
328
244
  catalogEntries = [];
329
- for (_b = 0, _c = Array.from(allCatalogPackages).sort(); _b < _c.length; _b++) {
245
+ for (_b = 0, _c = Object.keys(parentCatalog).sort(); _b < _c.length; _b++) {
330
246
  pkgName = _c[_b];
331
- version = parentCatalog[pkgName];
332
- if (version) {
333
- catalogEntries.push(" \"".concat(pkgName, "\": ").concat(version));
334
- }
247
+ catalogEntries.push(" \"".concat(pkgName, "\": ").concat(parentCatalog[pkgName]));
335
248
  }
336
249
  workspaceContent = "packages:\n - packages/api\n - packages/web\n\ncatalog:\n".concat(catalogEntries.join("\n"), "\n\nonlyBuiltDependencies:\n - \"@parcel/watcher\"\n - \"@swc/core\"\n - bcrypt\n - esbuild\n - libpq\n - sharp\n - sodium-native\n - unrs-resolver\n\noverrides:\n axios@<0.30.0: \">=0.30.0\"\n axios@<0.30.2: \">=0.30.2\"\n axios@>=0.8.1 <0.28.0: \">=0.28.0\"\n mdast-util-to-hast@>=13.0.0 <13.2.1: \">=13.2.1\"\n prismjs@<1.30.0: \">=1.30.0\"\n");
337
250
  fs.writeFileSync(path.join(targetRoot, "pnpm-workspace.yaml"), workspaceContent);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-sonamu",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Create a new Sonamu project",
5
5
  "keywords": [
6
6
  "sonamu",
@@ -17,6 +17,7 @@
17
17
  },
18
18
  "files": [
19
19
  "index.js",
20
+ "catalog.json",
20
21
  "template"
21
22
  ],
22
23
  "engines": {
@@ -39,7 +39,7 @@
39
39
  "knex": "^3.1.0",
40
40
  "pg": "^8.16.3",
41
41
  "radashi": "^12.2.0",
42
- "sonamu": "^0.8.5",
42
+ "sonamu": "^0.8.7",
43
43
  "zod": "^4.3.6"
44
44
  },
45
45
  "devDependencies": {
@@ -51,23 +51,27 @@ declare module "@tanstack/react-router" {
51
51
  }
52
52
  }
53
53
 
54
- await router.load();
54
+ // async IIFE로 감싸서 top-level await 제거
55
+ // (top-level await가 있으면 Vite 빌드 시 코드 스플릿 청크가 메인 엔트리를 import하면서 순환 의존성 데드락 발생)
56
+ (async () => {
57
+ await router.load();
55
58
 
56
- // SSR/CSR 모두 document 전체에 렌더링
57
- if (document.documentElement.innerHTML && dehydratedState) {
58
- // SSR 페이지
59
- if (ssrConfig?.disableHydrate) {
60
- // disableHydrate: document 전체 새로 렌더링
61
- console.log("[Sonamu] Hydration disabled, rendering as CSR");
62
- ReactDOM.createRoot(document).render(<RouterProvider router={router} />);
59
+ // SSR/CSR 모두 document 전체에 렌더링
60
+ if (document.documentElement.innerHTML && dehydratedState) {
61
+ // SSR 페이지
62
+ if (ssrConfig?.disableHydrate) {
63
+ // disableHydrate: document 전체 새로 렌더링
64
+ console.log("[Sonamu] Hydration disabled, rendering as CSR");
65
+ ReactDOM.createRoot(document).render(<RouterProvider router={router} />);
66
+ } else {
67
+ // 정상 hydration: document 전체 hydrate
68
+ ReactDOM.hydrateRoot(document, <RouterProvider router={router} />);
69
+ }
63
70
  } else {
64
- // 정상 hydration: document 전체 hydrate
65
- ReactDOM.hydrateRoot(document, <RouterProvider router={router} />);
71
+ // Pure CSR 페이지: document 전체 렌더링
72
+ ReactDOM.createRoot(document).render(<RouterProvider router={router} />);
66
73
  }
67
- } else {
68
- // Pure CSR 페이지: document 전체 렌더링
69
- ReactDOM.createRoot(document).render(<RouterProvider router={router} />);
70
- }
74
+ })();
71
75
 
72
76
  // Chrome Extension용 Devtools
73
77
  declare global {