sa2kit 1.2.1 → 1.4.0

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 (53) hide show
  1. package/dist/{UniversalFileService-C1rUWWU-.d.ts → UniversalFileService-BuHN-jrR.d.ts} +46 -2
  2. package/dist/{UniversalFileService-DrCK0-NL.d.mts → UniversalFileService-CGGzYeeF.d.mts} +46 -2
  3. package/dist/{chunk-3XG5OHFD.mjs → chunk-CIVO4R6N.mjs} +2 -2
  4. package/dist/{chunk-3XG5OHFD.mjs.map → chunk-CIVO4R6N.mjs.map} +1 -1
  5. package/dist/chunk-EV6BCVOQ.mjs +204 -0
  6. package/dist/chunk-EV6BCVOQ.mjs.map +1 -0
  7. package/dist/chunk-W35VTQAW.js +211 -0
  8. package/dist/chunk-W35VTQAW.js.map +1 -0
  9. package/dist/{chunk-HWJ34NL6.js → chunk-ZRAW3HXA.js} +2 -2
  10. package/dist/{chunk-HWJ34NL6.js.map → chunk-ZRAW3HXA.js.map} +1 -1
  11. package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
  12. package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
  13. package/dist/mmd/admin/index.d.mts +8 -1115
  14. package/dist/mmd/admin/index.d.ts +8 -1115
  15. package/dist/mmd/admin/index.js +98 -248
  16. package/dist/mmd/admin/index.js.map +1 -1
  17. package/dist/mmd/admin/index.mjs +75 -244
  18. package/dist/mmd/admin/index.mjs.map +1 -1
  19. package/dist/mmd/index.d.mts +265 -3
  20. package/dist/mmd/index.d.ts +265 -3
  21. package/dist/mmd/index.js +1266 -15
  22. package/dist/mmd/index.js.map +1 -1
  23. package/dist/mmd/index.mjs +1261 -16
  24. package/dist/mmd/index.mjs.map +1 -1
  25. package/dist/mmd/server/index.d.mts +138 -0
  26. package/dist/mmd/server/index.d.ts +138 -0
  27. package/dist/mmd/server/index.js +245 -0
  28. package/dist/mmd/server/index.js.map +1 -0
  29. package/dist/mmd/server/index.mjs +207 -0
  30. package/dist/mmd/server/index.mjs.map +1 -0
  31. package/dist/testYourself/index.d.mts +145 -0
  32. package/dist/testYourself/index.d.ts +145 -0
  33. package/dist/testYourself/index.js +1004 -0
  34. package/dist/testYourself/index.js.map +1 -0
  35. package/dist/testYourself/index.mjs +993 -0
  36. package/dist/testYourself/index.mjs.map +1 -0
  37. package/dist/{types-C2ale3d9.d.mts → types-Bc_p-zAR.d.mts} +1 -1
  38. package/dist/{types-C2ale3d9.d.ts → types-Bc_p-zAR.d.ts} +1 -1
  39. package/dist/{types-Dg-U_chI.d.mts → types-CK4We_aI.d.mts} +13 -1
  40. package/dist/{types-Dg-U_chI.d.ts → types-CK4We_aI.d.ts} +13 -1
  41. package/dist/universalFile/index.d.mts +3 -3
  42. package/dist/universalFile/index.d.ts +3 -3
  43. package/dist/universalFile/index.js +48 -10
  44. package/dist/universalFile/index.js.map +1 -1
  45. package/dist/universalFile/index.mjs +43 -5
  46. package/dist/universalFile/index.mjs.map +1 -1
  47. package/dist/universalFile/server/index.d.mts +3 -3
  48. package/dist/universalFile/server/index.d.ts +3 -3
  49. package/dist/universalFile/server/index.js +239 -7
  50. package/dist/universalFile/server/index.js.map +1 -1
  51. package/dist/universalFile/server/index.mjs +234 -2
  52. package/dist/universalFile/server/index.mjs.map +1 -1
  53. package/package.json +19 -1
@@ -1,22 +1,24 @@
1
1
  'use strict';
2
2
 
3
+ var chunkW35VTQAW_js = require('../../chunk-W35VTQAW.js');
3
4
  require('../../chunk-DGUM43GV.js');
4
5
  var React2 = require('react');
5
6
  var lucideReact = require('lucide-react');
6
- var drizzleOrm = require('drizzle-orm');
7
- var pgCore = require('drizzle-orm/pg-core');
7
+ var JSZip = require('jszip');
8
8
 
9
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
10
 
11
11
  var React2__default = /*#__PURE__*/_interopDefault(React2);
12
+ var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
12
13
 
13
14
  // src/mmd/admin/types.ts
14
15
  var MMD_RESOURCE_TYPE_CONFIGS = {
15
16
  model: {
16
17
  moduleId: "mmd-models",
17
- acceptedTypes: [".pmx", ".pmd"],
18
- maxFileSize: 50,
19
- description: "MMD\u6A21\u578B\u6587\u4EF6"
18
+ acceptedTypes: [".zip"],
19
+ maxFileSize: 150,
20
+ description: "MMD\u6A21\u578B\u538B\u7F29\u5305 (ZIP)",
21
+ hint: "\u8BF7\u4E0A\u4F20\u5305\u542B PMX/\u8D34\u56FE\u7B49\u5B8C\u6574\u76EE\u5F55\u7684 ZIP \u538B\u7F29\u5305\uFF0C\u4FDD\u6301\u539F\u59CB\u6587\u4EF6\u7ED3\u6784"
20
22
  },
21
23
  motion: {
22
24
  moduleId: "mmd-motions",
@@ -38,9 +40,10 @@ var MMD_RESOURCE_TYPE_CONFIGS = {
38
40
  },
39
41
  stage: {
40
42
  moduleId: "mmd-stages",
41
- acceptedTypes: [".pmx", ".pmd", ".x"],
42
- maxFileSize: 100,
43
- description: "MMD\u821E\u53F0/\u573A\u666F\u6A21\u578B"
43
+ acceptedTypes: [".zip"],
44
+ maxFileSize: 200,
45
+ description: "\u821E\u53F0/\u573A\u666F\u538B\u7F29\u5305 (ZIP)",
46
+ hint: "\u9700\u5C06\u821E\u53F0\u6A21\u578B\u4E0E\u4F9D\u8D56\u8D34\u56FE\u4E00\u8D77\u6253\u5305 ZIP\uFF0C\u5E76\u4FDD\u6301\u76EE\u5F55\u7ED3\u6784"
44
47
  },
45
48
  thumbnail: {
46
49
  moduleId: "mmd-thumbnails",
@@ -66,6 +69,7 @@ var MmdResourceSelector = ({
66
69
  const [uploading, setUploading] = React2.useState(false);
67
70
  const [searchTerm, setSearchTerm] = React2.useState("");
68
71
  const [showUploader, setShowUploader] = React2.useState(false);
72
+ const [zipValidationError, setZipValidationError] = React2.useState(null);
69
73
  const config = MMD_RESOURCE_TYPE_CONFIGS[resourceType];
70
74
  if (!config) {
71
75
  return /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-4 bg-red-50 text-red-600 rounded-lg" }, "\u672A\u627E\u5230\u8D44\u6E90\u7C7B\u578B\u914D\u7F6E\uFF1A", resourceType);
@@ -117,10 +121,32 @@ var MmdResourceSelector = ({
117
121
  setSelectedFile(file);
118
122
  fileService.getFileUrl(file.id).then((url) => onChange(file.id, url)).catch((error) => console.error("\u83B7\u53D6\u6587\u4EF6URL\u5931\u8D25:", error));
119
123
  };
124
+ const validateZipContents = async (buffer, type) => {
125
+ const zip = await JSZip__default.default.loadAsync(buffer);
126
+ const entries = Object.keys(zip.files);
127
+ if (!entries.length) {
128
+ throw new Error("\u538B\u7F29\u5305\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u5185\u5BB9");
129
+ }
130
+ const hasModel = entries.some((name) => /\.[pP][mM][xX]$/.test(name)) || type === "stage" && entries.some((name) => /\.[pP][mM][dD]$/.test(name));
131
+ const hasAssets = entries.some(
132
+ (name) => /\.(png|jpg|jpeg|bmp|tga|dds|spa|sph)$/i.test(name)
133
+ );
134
+ if (!hasModel) {
135
+ throw new Error(type === "stage" ? "\u538B\u7F29\u5305\u4E2D\u672A\u627E\u5230 PMX/PMD \u821E\u53F0\u6A21\u578B\u6587\u4EF6" : "\u538B\u7F29\u5305\u4E2D\u672A\u627E\u5230 PMX \u6A21\u578B\u6587\u4EF6");
136
+ }
137
+ if (!hasAssets) {
138
+ throw new Error("\u538B\u7F29\u5305\u4E2D\u672A\u53D1\u73B0\u8D34\u56FE\u6587\u4EF6\uFF0C\u8BF7\u786E\u8BA4\u662F\u5426\u5305\u542B texture \u76EE\u5F55");
139
+ }
140
+ };
120
141
  const handleFileUpload = async (file) => {
121
142
  if (!fileService) return;
122
143
  setUploading(true);
144
+ setZipValidationError(null);
123
145
  try {
146
+ if (resourceType === "model" || resourceType === "stage") {
147
+ const arrayBuffer = await file.arrayBuffer();
148
+ await validateZipContents(arrayBuffer, resourceType);
149
+ }
124
150
  const fileMetadata = await fileService.uploadFile({
125
151
  file,
126
152
  moduleId: config.moduleId,
@@ -132,7 +158,9 @@ var MmdResourceSelector = ({
132
158
  setShowUploader(false);
133
159
  } catch (error) {
134
160
  console.error("\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25:", error);
135
- alert(`\u4E0A\u4F20\u5931\u8D25: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`);
161
+ const message = error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF";
162
+ setZipValidationError(message);
163
+ alert(`\u4E0A\u4F20\u5931\u8D25: ${message}`);
136
164
  } finally {
137
165
  setUploading(false);
138
166
  }
@@ -159,7 +187,7 @@ var MmdResourceSelector = ({
159
187
  className: "p-1 hover:bg-white/50 dark:hover:bg-black/20 rounded transition-colors"
160
188
  },
161
189
  /* @__PURE__ */ React2__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
162
- )), showUploader && /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-4 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-sm text-gray-600 dark:text-gray-400 mb-3" }, "\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ", config.acceptedTypes.join(", "), /* @__PURE__ */ React2__default.default.createElement("br", null), "\u6700\u5927\u6587\u4EF6\u5927\u5C0F: ", config.maxFileSize, "MB"), /* @__PURE__ */ React2__default.default.createElement(
190
+ )), showUploader && /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-4 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-sm text-gray-600 dark:text-gray-400 mb-3 space-y-1" }, /* @__PURE__ */ React2__default.default.createElement("p", null, "\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ", config.acceptedTypes.join(", ")), /* @__PURE__ */ React2__default.default.createElement("p", null, "\u6700\u5927\u6587\u4EF6\u5927\u5C0F: ", config.maxFileSize, "MB"), config.hint && /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-amber-600 dark:text-amber-400" }, config.hint)), /* @__PURE__ */ React2__default.default.createElement(
163
191
  "input",
164
192
  {
165
193
  type: "file",
@@ -177,7 +205,7 @@ var MmdResourceSelector = ({
177
205
  disabled: uploading,
178
206
  className: "w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100 disabled:opacity-50"
179
207
  }
180
- ), uploading && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mt-3 flex items-center gap-2 text-sm text-blue-600" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }), "\u4E0A\u4F20\u4E2D...")), /* @__PURE__ */ React2__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400" }), /* @__PURE__ */ React2__default.default.createElement(
208
+ ), uploading && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mt-3 flex items-center gap-2 text-sm text-blue-600" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }), "\u4E0A\u4F20\u4E2D..."), zipValidationError && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mt-3 flex items-center gap-2 text-sm text-amber-600 dark:text-amber-400" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.AlertTriangle, { className: "w-4 h-4" }), zipValidationError)), /* @__PURE__ */ React2__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React2__default.default.createElement(lucideReact.Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400" }), /* @__PURE__ */ React2__default.default.createElement(
181
209
  "input",
182
210
  {
183
211
  type: "text",
@@ -225,50 +253,50 @@ var MmdPlaylistEditor = ({
225
253
  setNodes([...nodes, newNode]);
226
254
  setExpandedNodes(/* @__PURE__ */ new Set([...expandedNodes, nodes.length]));
227
255
  };
228
- const removeNode = (index2) => {
229
- const newNodes = nodes.filter((_, i) => i !== index2);
256
+ const removeNode = (index) => {
257
+ const newNodes = nodes.filter((_, i) => i !== index);
230
258
  newNodes.forEach((node, i) => {
231
259
  node.sortOrder = i;
232
260
  });
233
261
  setNodes(newNodes);
234
262
  const newExpanded = /* @__PURE__ */ new Set();
235
263
  expandedNodes.forEach((i) => {
236
- if (i < index2) newExpanded.add(i);
237
- else if (i > index2) newExpanded.add(i - 1);
264
+ if (i < index) newExpanded.add(i);
265
+ else if (i > index) newExpanded.add(i - 1);
238
266
  });
239
267
  setExpandedNodes(newExpanded);
240
268
  };
241
- const moveNode = (index2, direction) => {
269
+ const moveNode = (index, direction) => {
242
270
  const newNodes = [...nodes];
243
- const targetIndex = direction === "up" ? index2 - 1 : index2 + 1;
271
+ const targetIndex = direction === "up" ? index - 1 : index + 1;
244
272
  if (targetIndex < 0 || targetIndex >= newNodes.length) return;
245
- if (!newNodes[index2] || !newNodes[targetIndex]) return;
246
- [newNodes[index2], newNodes[targetIndex]] = [newNodes[targetIndex], newNodes[index2]];
273
+ if (!newNodes[index] || !newNodes[targetIndex]) return;
274
+ [newNodes[index], newNodes[targetIndex]] = [newNodes[targetIndex], newNodes[index]];
247
275
  newNodes.forEach((node, i) => {
248
276
  node.sortOrder = i;
249
277
  });
250
278
  setNodes(newNodes);
251
279
  const newExpanded = /* @__PURE__ */ new Set();
252
280
  expandedNodes.forEach((i) => {
253
- if (i === index2) newExpanded.add(targetIndex);
254
- else if (i === targetIndex) newExpanded.add(index2);
281
+ if (i === index) newExpanded.add(targetIndex);
282
+ else if (i === targetIndex) newExpanded.add(index);
255
283
  else newExpanded.add(i);
256
284
  });
257
285
  setExpandedNodes(newExpanded);
258
286
  };
259
- const toggleNode = (index2) => {
287
+ const toggleNode = (index) => {
260
288
  const newExpanded = new Set(expandedNodes);
261
- if (newExpanded.has(index2)) {
262
- newExpanded.delete(index2);
289
+ if (newExpanded.has(index)) {
290
+ newExpanded.delete(index);
263
291
  } else {
264
- newExpanded.add(index2);
292
+ newExpanded.add(index);
265
293
  }
266
294
  setExpandedNodes(newExpanded);
267
295
  };
268
- const updateNode = (index2, updates) => {
296
+ const updateNode = (index, updates) => {
269
297
  const newNodes = [...nodes];
270
- if (!newNodes[index2]) return;
271
- newNodes[index2] = { ...newNodes[index2], ...updates };
298
+ if (!newNodes[index]) return;
299
+ newNodes[index] = { ...newNodes[index], ...updates };
272
300
  setNodes(newNodes);
273
301
  };
274
302
  const validateForm = () => {
@@ -392,10 +420,10 @@ var MmdPlaylistEditor = ({
392
420
  },
393
421
  /* @__PURE__ */ React2__default.default.createElement(lucideReact.Plus, { className: "w-4 h-4" }),
394
422
  "\u6DFB\u52A0\u8282\u70B9"
395
- )), nodes.length === 0 ? /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-8 text-center text-gray-500 border-2 border-dashed border-gray-300 dark:border-gray-700 rounded-lg" }, '\u6682\u65E0\u8282\u70B9\uFF0C\u8BF7\u70B9\u51FB"\u6DFB\u52A0\u8282\u70B9"\u6309\u94AE\u5F00\u59CB') : nodes.map((node, index2) => /* @__PURE__ */ React2__default.default.createElement(
423
+ )), nodes.length === 0 ? /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-8 text-center text-gray-500 border-2 border-dashed border-gray-300 dark:border-gray-700 rounded-lg" }, '\u6682\u65E0\u8282\u70B9\uFF0C\u8BF7\u70B9\u51FB"\u6DFB\u52A0\u8282\u70B9"\u6309\u94AE\u5F00\u59CB') : nodes.map((node, index) => /* @__PURE__ */ React2__default.default.createElement(
396
424
  "div",
397
425
  {
398
- key: index2,
426
+ key: index,
399
427
  className: "border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden"
400
428
  },
401
429
  /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center gap-3 p-4 bg-gray-50 dark:bg-gray-800" }, /* @__PURE__ */ React2__default.default.createElement(
@@ -408,16 +436,16 @@ var MmdPlaylistEditor = ({
408
436
  ), /* @__PURE__ */ React2__default.default.createElement(
409
437
  "button",
410
438
  {
411
- onClick: () => toggleNode(index2),
439
+ onClick: () => toggleNode(index),
412
440
  className: "flex-1 flex items-center justify-between text-left"
413
441
  },
414
- /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium text-gray-900 dark:text-white" }, index2 + 1, ". ", node.name || "\u672A\u547D\u540D\u8282\u70B9"),
415
- expandedNodes.has(index2) ? /* @__PURE__ */ React2__default.default.createElement(lucideReact.ChevronUp, { className: "w-5 h-5 text-gray-400" }) : /* @__PURE__ */ React2__default.default.createElement(lucideReact.ChevronDown, { className: "w-5 h-5 text-gray-400" })
442
+ /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium text-gray-900 dark:text-white" }, index + 1, ". ", node.name || "\u672A\u547D\u540D\u8282\u70B9"),
443
+ expandedNodes.has(index) ? /* @__PURE__ */ React2__default.default.createElement(lucideReact.ChevronUp, { className: "w-5 h-5 text-gray-400" }) : /* @__PURE__ */ React2__default.default.createElement(lucideReact.ChevronDown, { className: "w-5 h-5 text-gray-400" })
416
444
  ), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React2__default.default.createElement(
417
445
  "button",
418
446
  {
419
- onClick: () => moveNode(index2, "up"),
420
- disabled: index2 === 0,
447
+ onClick: () => moveNode(index, "up"),
448
+ disabled: index === 0,
421
449
  className: "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-30",
422
450
  title: "\u4E0A\u79FB"
423
451
  },
@@ -425,8 +453,8 @@ var MmdPlaylistEditor = ({
425
453
  ), /* @__PURE__ */ React2__default.default.createElement(
426
454
  "button",
427
455
  {
428
- onClick: () => moveNode(index2, "down"),
429
- disabled: index2 === nodes.length - 1,
456
+ onClick: () => moveNode(index, "down"),
457
+ disabled: index === nodes.length - 1,
430
458
  className: "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-30",
431
459
  title: "\u4E0B\u79FB"
432
460
  },
@@ -434,18 +462,18 @@ var MmdPlaylistEditor = ({
434
462
  ), /* @__PURE__ */ React2__default.default.createElement(
435
463
  "button",
436
464
  {
437
- onClick: () => removeNode(index2),
465
+ onClick: () => removeNode(index),
438
466
  className: "p-1 text-red-400 hover:text-red-600 dark:hover:text-red-300",
439
467
  title: "\u5220\u9664"
440
468
  },
441
469
  /* @__PURE__ */ React2__default.default.createElement(lucideReact.Trash2, { className: "w-5 h-5" })
442
470
  ))),
443
- expandedNodes.has(index2) && /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-6 space-y-6 bg-white dark:bg-gray-900" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" }, "\u8282\u70B9\u540D\u79F0 ", /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React2__default.default.createElement(
471
+ expandedNodes.has(index) && /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-6 space-y-6 bg-white dark:bg-gray-900" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" }, "\u8282\u70B9\u540D\u79F0 ", /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React2__default.default.createElement(
444
472
  "input",
445
473
  {
446
474
  type: "text",
447
475
  value: node.name,
448
- onChange: (e) => updateNode(index2, { name: e.target.value }),
476
+ onChange: (e) => updateNode(index, { name: e.target.value }),
449
477
  className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent"
450
478
  }
451
479
  )), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" }, "\u65F6\u957F\uFF08\u79D2\uFF09"), /* @__PURE__ */ React2__default.default.createElement(
@@ -453,14 +481,14 @@ var MmdPlaylistEditor = ({
453
481
  {
454
482
  type: "number",
455
483
  value: node.duration || "",
456
- onChange: (e) => updateNode(index2, { duration: parseInt(e.target.value) || void 0 }),
484
+ onChange: (e) => updateNode(index, { duration: parseInt(e.target.value) || void 0 }),
457
485
  className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent"
458
486
  }
459
487
  ))), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" }, "\u63CF\u8FF0"), /* @__PURE__ */ React2__default.default.createElement(
460
488
  "textarea",
461
489
  {
462
490
  value: node.description || "",
463
- onChange: (e) => updateNode(index2, { description: e.target.value }),
491
+ onChange: (e) => updateNode(index, { description: e.target.value }),
464
492
  rows: 2,
465
493
  className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent"
466
494
  }
@@ -469,7 +497,7 @@ var MmdPlaylistEditor = ({
469
497
  {
470
498
  type: "checkbox",
471
499
  checked: node.loop,
472
- onChange: (e) => updateNode(index2, { loop: e.target.checked }),
500
+ onChange: (e) => updateNode(index, { loop: e.target.checked }),
473
501
  className: "w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
474
502
  }
475
503
  ), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm text-gray-700 dark:text-gray-300" }, "\u5355\u66F2\u5FAA\u73AF")), /* @__PURE__ */ React2__default.default.createElement("div", { className: "grid grid-cols-1 gap-6 pt-4 border-t border-gray-200 dark:border-gray-700" }, /* @__PURE__ */ React2__default.default.createElement(
@@ -479,7 +507,7 @@ var MmdPlaylistEditor = ({
479
507
  fileService,
480
508
  userId,
481
509
  value: node.modelFileId,
482
- onChange: (fileId) => updateNode(index2, { modelFileId: fileId }),
510
+ onChange: (fileId) => updateNode(index, { modelFileId: fileId }),
483
511
  required: true
484
512
  }
485
513
  ), /* @__PURE__ */ React2__default.default.createElement(
@@ -489,7 +517,7 @@ var MmdPlaylistEditor = ({
489
517
  fileService,
490
518
  userId,
491
519
  value: node.motionFileId,
492
- onChange: (fileId) => updateNode(index2, { motionFileId: fileId })
520
+ onChange: (fileId) => updateNode(index, { motionFileId: fileId })
493
521
  }
494
522
  ), /* @__PURE__ */ React2__default.default.createElement(
495
523
  MmdResourceSelector,
@@ -498,7 +526,7 @@ var MmdPlaylistEditor = ({
498
526
  fileService,
499
527
  userId,
500
528
  value: node.audioFileId,
501
- onChange: (fileId) => updateNode(index2, { audioFileId: fileId })
529
+ onChange: (fileId) => updateNode(index, { audioFileId: fileId })
502
530
  }
503
531
  )))
504
532
  ))));
@@ -795,203 +823,31 @@ function extractPathsFromMmdResources(resources) {
795
823
  if (resources.additionalMotions) paths.push(...resources.additionalMotions);
796
824
  return paths;
797
825
  }
798
- var mmdPlaylists = pgCore.pgTable(
799
- "mmd_playlists",
800
- {
801
- /** 主键ID */
802
- id: pgCore.uuid("id").primaryKey().defaultRandom(),
803
- /** 播放列表名称 */
804
- name: pgCore.varchar("name", { length: 255 }).notNull(),
805
- /** 播放列表描述 */
806
- description: pgCore.text("description"),
807
- /** 是否启用列表循环 */
808
- loop: pgCore.boolean("loop").notNull().default(false),
809
- /** 预加载策略: none, next, all */
810
- preloadStrategy: pgCore.varchar("preload_strategy", { length: 20 }).notNull().default("none"),
811
- /** 是否自动播放 */
812
- autoPlay: pgCore.boolean("auto_play").notNull().default(false),
813
- /** 播放列表缩略图文件ID (关联 file_metadata.id) */
814
- thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
815
- /** 播放列表状态: draft, published, archived */
816
- status: pgCore.varchar("status", { length: 20 }).notNull().default("draft"),
817
- /** 显示顺序 */
818
- sortOrder: pgCore.integer("sort_order").notNull().default(0),
819
- /** 额外配置(JSON格式,存储舞台配置等) */
820
- config: pgCore.json("config"),
821
- /** 创建者ID */
822
- createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
823
- /** 创建时间 */
824
- createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
825
- /** 更新时间 */
826
- updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull(),
827
- /** 删除时间(软删除) */
828
- deletedAt: pgCore.timestamp("deleted_at")
829
- },
830
- (table) => ({
831
- /** 按状态查询的索引 */
832
- statusIndex: pgCore.index("mmd_playlists_status_idx").on(table.status),
833
- /** 按创建者查询的索引 */
834
- createdByIndex: pgCore.index("mmd_playlists_created_by_idx").on(table.createdBy),
835
- /** 按删除状态查询的索引 */
836
- deletedAtIndex: pgCore.index("mmd_playlists_deleted_at_idx").on(table.deletedAt),
837
- /** 按排序查询的索引 */
838
- sortOrderIndex: pgCore.index("mmd_playlists_sort_order_idx").on(table.sortOrder)
839
- })
840
- );
841
- var mmdPlaylistNodes = pgCore.pgTable(
842
- "mmd_playlist_nodes",
843
- {
844
- /** 主键ID */
845
- id: pgCore.uuid("id").primaryKey().defaultRandom(),
846
- /** 所属播放列表ID */
847
- playlistId: pgCore.uuid("playlist_id").references(() => mmdPlaylists.id, { onDelete: "cascade" }).notNull(),
848
- /** 节点名称 */
849
- name: pgCore.varchar("name", { length: 255 }).notNull(),
850
- /** 节点描述 */
851
- description: pgCore.text("description"),
852
- /** 是否启用节点循环 */
853
- loop: pgCore.boolean("loop").notNull().default(false),
854
- /** 预计时长(秒) */
855
- duration: pgCore.integer("duration"),
856
- /** 节点缩略图文件ID */
857
- thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
858
- /** 显示顺序 */
859
- sortOrder: pgCore.integer("sort_order").notNull().default(0),
860
- /** 模型文件ID (关联 file_metadata.id) */
861
- modelFileId: pgCore.uuid("model_file_id").notNull(),
862
- /** 动作文件ID */
863
- motionFileId: pgCore.uuid("motion_file_id"),
864
- /** 相机动画文件ID */
865
- cameraFileId: pgCore.uuid("camera_file_id"),
866
- /** 音频文件ID */
867
- audioFileId: pgCore.uuid("audio_file_id"),
868
- /** 舞台模型文件ID */
869
- stageModelFileId: pgCore.uuid("stage_model_file_id"),
870
- /** 附加动作文件ID列表(JSON数组) */
871
- additionalMotionFileIds: pgCore.json("additional_motion_file_ids").$type(),
872
- /** 额外配置(JSON格式) */
873
- config: pgCore.json("config"),
874
- /** 创建时间 */
875
- createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
876
- /** 更新时间 */
877
- updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
878
- },
879
- (table) => ({
880
- /** 按播放列表查询的索引 */
881
- playlistIndex: pgCore.index("mmd_playlist_nodes_playlist_idx").on(table.playlistId),
882
- /** 按排序查询的索引 */
883
- sortOrderIndex: pgCore.index("mmd_playlist_nodes_sort_order_idx").on(table.sortOrder),
884
- /** 按模型文件查询的索引 */
885
- modelFileIndex: pgCore.index("mmd_playlist_nodes_model_file_idx").on(table.modelFileId),
886
- /** 组合索引:播放列表+排序 */
887
- playlistSortIndex: pgCore.index("mmd_playlist_nodes_playlist_sort_idx").on(
888
- table.playlistId,
889
- table.sortOrder
890
- )
891
- })
892
- );
893
- var mmdResourceOptions = pgCore.pgTable(
894
- "mmd_resource_options",
895
- {
896
- /** 主键ID */
897
- id: pgCore.uuid("id").primaryKey().defaultRandom(),
898
- /** 资源名称 */
899
- name: pgCore.varchar("name", { length: 255 }).notNull(),
900
- /** 资源描述 */
901
- description: pgCore.text("description"),
902
- /** 资源类型: model, motion, camera, audio, stage */
903
- resourceType: pgCore.varchar("resource_type", { length: 20 }).notNull(),
904
- /** 文件ID (关联 file_metadata.id) */
905
- fileId: pgCore.uuid("file_id").notNull(),
906
- /** 缩略图文件ID */
907
- thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
908
- /** 资源标签(JSON数组,用于分类和筛选) */
909
- tags: pgCore.json("tags").$type(),
910
- /** 显示顺序 */
911
- sortOrder: pgCore.integer("sort_order").notNull().default(0),
912
- /** 是否启用 */
913
- isActive: pgCore.boolean("is_active").notNull().default(true),
914
- /** 创建者ID */
915
- createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
916
- /** 创建时间 */
917
- createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
918
- /** 更新时间 */
919
- updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
920
- },
921
- (table) => ({
922
- /** 按资源类型查询的索引 */
923
- resourceTypeIndex: pgCore.index("mmd_resource_options_resource_type_idx").on(table.resourceType),
924
- /** 按文件ID查询的索引 */
925
- fileIdIndex: pgCore.index("mmd_resource_options_file_id_idx").on(table.fileId),
926
- /** 按活跃状态查询的索引 */
927
- isActiveIndex: pgCore.index("mmd_resource_options_is_active_idx").on(table.isActive),
928
- /** 按创建者查询的索引 */
929
- createdByIndex: pgCore.index("mmd_resource_options_created_by_idx").on(table.createdBy),
930
- /** 组合索引:资源类型+活跃状态+排序 */
931
- typeActiveSortIndex: pgCore.index("mmd_resource_options_type_active_sort_idx").on(
932
- table.resourceType,
933
- table.isActive,
934
- table.sortOrder
935
- )
936
- })
937
- );
938
- var mmdPresetItems = pgCore.pgTable(
939
- "mmd_preset_items",
940
- {
941
- /** 主键ID */
942
- id: pgCore.uuid("id").primaryKey().defaultRandom(),
943
- /** 预设名称 */
944
- name: pgCore.varchar("name", { length: 255 }).notNull(),
945
- /** 预设描述 */
946
- description: pgCore.text("description"),
947
- /** 缩略图文件ID */
948
- thumbnailFileId: pgCore.uuid("thumbnail_file_id"),
949
- /** 模型文件ID */
950
- modelFileId: pgCore.uuid("model_file_id").notNull(),
951
- /** 动作文件ID */
952
- motionFileId: pgCore.uuid("motion_file_id"),
953
- /** 相机动画文件ID */
954
- cameraFileId: pgCore.uuid("camera_file_id"),
955
- /** 音频文件ID */
956
- audioFileId: pgCore.uuid("audio_file_id"),
957
- /** 舞台模型文件ID */
958
- stageModelFileId: pgCore.uuid("stage_model_file_id"),
959
- /** 附加动作文件ID列表(JSON数组) */
960
- additionalMotionFileIds: pgCore.json("additional_motion_file_ids").$type(),
961
- /** 显示顺序 */
962
- sortOrder: pgCore.integer("sort_order").notNull().default(0),
963
- /** 是否启用 */
964
- isActive: pgCore.boolean("is_active").notNull().default(true),
965
- /** 预设标签(JSON数组) */
966
- tags: pgCore.json("tags").$type(),
967
- /** 创建者ID */
968
- createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
969
- /** 创建时间 */
970
- createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
971
- /** 更新时间 */
972
- updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
973
- },
974
- (table) => ({
975
- /** 按活跃状态查询的索引 */
976
- isActiveIndex: pgCore.index("mmd_preset_items_is_active_idx").on(table.isActive),
977
- /** 按排序查询的索引 */
978
- sortOrderIndex: pgCore.index("mmd_preset_items_sort_order_idx").on(table.sortOrder),
979
- /** 按创建者查询的索引 */
980
- createdByIndex: pgCore.index("mmd_preset_items_created_by_idx").on(table.createdBy),
981
- /** 按模型文件查询的索引 */
982
- modelFileIndex: pgCore.index("mmd_preset_items_model_file_idx").on(table.modelFileId)
983
- })
984
- );
985
- var mmdPlaylistsRelations = drizzleOrm.relations(mmdPlaylists, ({ many }) => ({
986
- nodes: many(mmdPlaylistNodes)
987
- }));
988
- var mmdPlaylistNodesRelations = drizzleOrm.relations(mmdPlaylistNodes, ({ one }) => ({
989
- playlist: one(mmdPlaylists, {
990
- fields: [mmdPlaylistNodes.playlistId],
991
- references: [mmdPlaylists.id]
992
- })
993
- }));
994
826
 
827
+ Object.defineProperty(exports, "mmdPlaylistNodes", {
828
+ enumerable: true,
829
+ get: function () { return chunkW35VTQAW_js.mmdPlaylistNodes; }
830
+ });
831
+ Object.defineProperty(exports, "mmdPlaylistNodesRelations", {
832
+ enumerable: true,
833
+ get: function () { return chunkW35VTQAW_js.mmdPlaylistNodesRelations; }
834
+ });
835
+ Object.defineProperty(exports, "mmdPlaylists", {
836
+ enumerable: true,
837
+ get: function () { return chunkW35VTQAW_js.mmdPlaylists; }
838
+ });
839
+ Object.defineProperty(exports, "mmdPlaylistsRelations", {
840
+ enumerable: true,
841
+ get: function () { return chunkW35VTQAW_js.mmdPlaylistsRelations; }
842
+ });
843
+ Object.defineProperty(exports, "mmdPresetItems", {
844
+ enumerable: true,
845
+ get: function () { return chunkW35VTQAW_js.mmdPresetItems; }
846
+ });
847
+ Object.defineProperty(exports, "mmdResourceOptions", {
848
+ enumerable: true,
849
+ get: function () { return chunkW35VTQAW_js.mmdResourceOptions; }
850
+ });
995
851
  exports.MMD_RESOURCE_TYPE_CONFIGS = MMD_RESOURCE_TYPE_CONFIGS;
996
852
  exports.MmdAdminPanel = MmdAdminPanel;
997
853
  exports.MmdPlaylistEditor = MmdPlaylistEditor;
@@ -1010,12 +866,6 @@ exports.extractFileIdsFromResourceOptions = extractFileIdsFromResourceOptions;
1010
866
  exports.extractPathsFromMmdResources = extractPathsFromMmdResources;
1011
867
  exports.generateMockFileUrls = generateMockFileUrls;
1012
868
  exports.mergeFileUrlMaps = mergeFileUrlMaps;
1013
- exports.mmdPlaylistNodes = mmdPlaylistNodes;
1014
- exports.mmdPlaylistNodesRelations = mmdPlaylistNodesRelations;
1015
- exports.mmdPlaylists = mmdPlaylists;
1016
- exports.mmdPlaylistsRelations = mmdPlaylistsRelations;
1017
- exports.mmdPresetItems = mmdPresetItems;
1018
- exports.mmdResourceOptions = mmdResourceOptions;
1019
869
  exports.validateFileUrls = validateFileUrls;
1020
870
  //# sourceMappingURL=index.js.map
1021
871
  //# sourceMappingURL=index.js.map