Gmagl commited on
Commit
21b315e
·
1 Parent(s): 65d613a

fix: corregir ESLint v10→v9, bug de slug en Character, eliminar webhook duplicado, añadir páginas success/cancel, limpiar build.log

Browse files
package-lock.json CHANGED
@@ -68,7 +68,7 @@
68
  "@types/node": "25.3.2",
69
  "@types/react": "^19",
70
  "@types/react-dom": "^19",
71
- "eslint": "^10.0.2",
72
  "eslint-config-next": "^16.1.6",
73
  "tailwindcss": "^4",
74
  "typescript": "^5"
@@ -442,68 +442,180 @@
442
  }
443
  },
444
  "node_modules/@eslint/config-array": {
445
- "version": "0.23.2",
446
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.2.tgz",
447
- "integrity": "sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==",
448
  "dev": true,
449
  "license": "Apache-2.0",
450
  "dependencies": {
451
- "@eslint/object-schema": "^3.0.2",
452
  "debug": "^4.3.1",
453
- "minimatch": "^10.2.1"
454
  },
455
  "engines": {
456
- "node": "^20.19.0 || ^22.13.0 || >=24"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
457
  }
458
  },
459
  "node_modules/@eslint/config-helpers": {
460
- "version": "0.5.2",
461
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz",
462
- "integrity": "sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==",
463
  "dev": true,
464
  "license": "Apache-2.0",
465
  "dependencies": {
466
- "@eslint/core": "^1.1.0"
467
  },
468
  "engines": {
469
- "node": "^20.19.0 || ^22.13.0 || >=24"
470
  }
471
  },
472
  "node_modules/@eslint/core": {
473
- "version": "1.1.0",
474
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz",
475
- "integrity": "sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==",
476
  "dev": true,
477
  "license": "Apache-2.0",
478
  "dependencies": {
479
  "@types/json-schema": "^7.0.15"
480
  },
481
  "engines": {
482
- "node": "^20.19.0 || ^22.13.0 || >=24"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
483
  }
484
  },
485
  "node_modules/@eslint/object-schema": {
486
- "version": "3.0.2",
487
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.2.tgz",
488
- "integrity": "sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==",
489
  "dev": true,
490
  "license": "Apache-2.0",
491
  "engines": {
492
- "node": "^20.19.0 || ^22.13.0 || >=24"
493
  }
494
  },
495
  "node_modules/@eslint/plugin-kit": {
496
- "version": "0.6.0",
497
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz",
498
- "integrity": "sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==",
499
  "dev": true,
500
  "license": "Apache-2.0",
501
  "dependencies": {
502
- "@eslint/core": "^1.1.0",
503
  "levn": "^0.4.1"
504
  },
505
  "engines": {
506
- "node": "^20.19.0 || ^22.13.0 || >=24"
507
  }
508
  },
509
  "node_modules/@floating-ui/core": {
@@ -3469,13 +3581,6 @@
3469
  "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
3470
  "license": "MIT"
3471
  },
3472
- "node_modules/@types/esrecurse": {
3473
- "version": "4.3.1",
3474
- "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
3475
- "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
3476
- "dev": true,
3477
- "license": "MIT"
3478
- },
3479
  "node_modules/@types/estree": {
3480
  "version": "1.0.8",
3481
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -4072,6 +4177,29 @@
4072
  "url": "https://github.com/sponsors/epoberezkin"
4073
  }
4074
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4075
  "node_modules/aria-hidden": {
4076
  "version": "1.2.6",
4077
  "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
@@ -4468,6 +4596,16 @@
4468
  "url": "https://github.com/sponsors/ljharb"
4469
  }
4470
  },
 
 
 
 
 
 
 
 
 
 
4471
  "node_modules/caniuse-lite": {
4472
  "version": "1.0.30001774",
4473
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz",
@@ -4488,6 +4626,23 @@
4488
  ],
4489
  "license": "CC-BY-4.0"
4490
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4491
  "node_modules/chokidar": {
4492
  "version": "4.0.3",
4493
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
@@ -4555,6 +4710,26 @@
4555
  "react-dom": "^18 || ^19 || ^19.0.0-rc"
4556
  }
4557
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4558
  "node_modules/concat-map": {
4559
  "version": "0.0.1",
4560
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -5234,30 +5409,33 @@
5234
  }
5235
  },
5236
  "node_modules/eslint": {
5237
- "version": "10.0.2",
5238
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.2.tgz",
5239
- "integrity": "sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==",
5240
  "dev": true,
5241
  "license": "MIT",
5242
  "dependencies": {
5243
  "@eslint-community/eslint-utils": "^4.8.0",
5244
- "@eslint-community/regexpp": "^4.12.2",
5245
- "@eslint/config-array": "^0.23.2",
5246
- "@eslint/config-helpers": "^0.5.2",
5247
- "@eslint/core": "^1.1.0",
5248
- "@eslint/plugin-kit": "^0.6.0",
 
 
5249
  "@humanfs/node": "^0.16.6",
5250
  "@humanwhocodes/module-importer": "^1.0.1",
5251
  "@humanwhocodes/retry": "^0.4.2",
5252
  "@types/estree": "^1.0.6",
5253
- "ajv": "^6.14.0",
 
5254
  "cross-spawn": "^7.0.6",
5255
  "debug": "^4.3.2",
5256
  "escape-string-regexp": "^4.0.0",
5257
- "eslint-scope": "^9.1.1",
5258
- "eslint-visitor-keys": "^5.0.1",
5259
- "espree": "^11.1.1",
5260
- "esquery": "^1.7.0",
5261
  "esutils": "^2.0.2",
5262
  "fast-deep-equal": "^3.1.3",
5263
  "file-entry-cache": "^8.0.0",
@@ -5267,7 +5445,8 @@
5267
  "imurmurhash": "^0.1.4",
5268
  "is-glob": "^4.0.0",
5269
  "json-stable-stringify-without-jsonify": "^1.0.1",
5270
- "minimatch": "^10.2.1",
 
5271
  "natural-compare": "^1.4.0",
5272
  "optionator": "^0.9.3"
5273
  },
@@ -5275,7 +5454,7 @@
5275
  "eslint": "bin/eslint.js"
5276
  },
5277
  "engines": {
5278
- "node": "^20.19.0 || ^22.13.0 || >=24"
5279
  },
5280
  "funding": {
5281
  "url": "https://eslint.org/donate"
@@ -5594,19 +5773,17 @@
5594
  }
5595
  },
5596
  "node_modules/eslint-scope": {
5597
- "version": "9.1.1",
5598
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.1.tgz",
5599
- "integrity": "sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==",
5600
  "dev": true,
5601
  "license": "BSD-2-Clause",
5602
  "dependencies": {
5603
- "@types/esrecurse": "^4.3.1",
5604
- "@types/estree": "^1.0.8",
5605
  "esrecurse": "^4.3.0",
5606
  "estraverse": "^5.2.0"
5607
  },
5608
  "engines": {
5609
- "node": "^20.19.0 || ^22.13.0 || >=24"
5610
  },
5611
  "funding": {
5612
  "url": "https://opencollective.com/eslint"
@@ -5625,19 +5802,76 @@
5625
  "url": "https://opencollective.com/eslint"
5626
  }
5627
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5628
  "node_modules/espree": {
5629
- "version": "11.1.1",
5630
- "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.1.tgz",
5631
- "integrity": "sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==",
5632
  "dev": true,
5633
  "license": "BSD-2-Clause",
5634
  "dependencies": {
5635
- "acorn": "^8.16.0",
5636
  "acorn-jsx": "^5.3.2",
5637
- "eslint-visitor-keys": "^5.0.1"
5638
  },
5639
  "engines": {
5640
- "node": "^20.19.0 || ^22.13.0 || >=24"
 
 
 
 
 
 
 
 
 
 
 
 
 
5641
  },
5642
  "funding": {
5643
  "url": "https://opencollective.com/eslint"
@@ -6124,6 +6358,16 @@
6124
  "url": "https://github.com/sponsors/ljharb"
6125
  }
6126
  },
 
 
 
 
 
 
 
 
 
 
6127
  "node_modules/has-property-descriptors": {
6128
  "version": "1.0.2",
6129
  "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
@@ -6232,6 +6476,23 @@
6232
  "url": "https://opencollective.com/immer"
6233
  }
6234
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6235
  "node_modules/imurmurhash": {
6236
  "version": "0.1.4",
6237
  "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -6726,6 +6987,19 @@
6726
  "dev": true,
6727
  "license": "MIT"
6728
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
6729
  "node_modules/jsesc": {
6730
  "version": "3.1.0",
6731
  "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -7110,6 +7384,13 @@
7110
  "url": "https://github.com/sponsors/sindresorhus"
7111
  }
7112
  },
 
 
 
 
 
 
 
7113
  "node_modules/loose-envify": {
7114
  "version": "1.4.0",
7115
  "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -7627,6 +7908,19 @@
7627
  "url": "https://github.com/sponsors/sindresorhus"
7628
  }
7629
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
7630
  "node_modules/path-exists": {
7631
  "version": "4.0.0",
7632
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -8143,6 +8437,16 @@
8143
  "url": "https://github.com/sponsors/ljharb"
8144
  }
8145
  },
 
 
 
 
 
 
 
 
 
 
8146
  "node_modules/resolve-pkg-maps": {
8147
  "version": "1.0.0",
8148
  "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
@@ -8618,6 +8922,19 @@
8618
  "node": ">=4"
8619
  }
8620
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
8621
  "node_modules/stripe": {
8622
  "version": "20.4.0",
8623
  "resolved": "https://registry.npmjs.org/stripe/-/stripe-20.4.0.tgz",
@@ -8658,6 +8975,19 @@
8658
  }
8659
  }
8660
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
8661
  "node_modules/supports-preserve-symlinks-flag": {
8662
  "version": "1.0.0",
8663
  "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
 
68
  "@types/node": "25.3.2",
69
  "@types/react": "^19",
70
  "@types/react-dom": "^19",
71
+ "eslint": "^9.0.0",
72
  "eslint-config-next": "^16.1.6",
73
  "tailwindcss": "^4",
74
  "typescript": "^5"
 
442
  }
443
  },
444
  "node_modules/@eslint/config-array": {
445
+ "version": "0.21.1",
446
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
447
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
448
  "dev": true,
449
  "license": "Apache-2.0",
450
  "dependencies": {
451
+ "@eslint/object-schema": "^2.1.7",
452
  "debug": "^4.3.1",
453
+ "minimatch": "^3.1.2"
454
  },
455
  "engines": {
456
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
457
+ }
458
+ },
459
+ "node_modules/@eslint/config-array/node_modules/balanced-match": {
460
+ "version": "1.0.2",
461
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
462
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
463
+ "dev": true,
464
+ "license": "MIT"
465
+ },
466
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
467
+ "version": "1.1.12",
468
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
469
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
470
+ "dev": true,
471
+ "license": "MIT",
472
+ "dependencies": {
473
+ "balanced-match": "^1.0.0",
474
+ "concat-map": "0.0.1"
475
+ }
476
+ },
477
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
478
+ "version": "3.1.5",
479
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
480
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
481
+ "dev": true,
482
+ "license": "ISC",
483
+ "dependencies": {
484
+ "brace-expansion": "^1.1.7"
485
+ },
486
+ "engines": {
487
+ "node": "*"
488
  }
489
  },
490
  "node_modules/@eslint/config-helpers": {
491
+ "version": "0.4.2",
492
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
493
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
494
  "dev": true,
495
  "license": "Apache-2.0",
496
  "dependencies": {
497
+ "@eslint/core": "^0.17.0"
498
  },
499
  "engines": {
500
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
501
  }
502
  },
503
  "node_modules/@eslint/core": {
504
+ "version": "0.17.0",
505
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
506
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
507
  "dev": true,
508
  "license": "Apache-2.0",
509
  "dependencies": {
510
  "@types/json-schema": "^7.0.15"
511
  },
512
  "engines": {
513
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
514
+ }
515
+ },
516
+ "node_modules/@eslint/eslintrc": {
517
+ "version": "3.3.4",
518
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz",
519
+ "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==",
520
+ "dev": true,
521
+ "license": "MIT",
522
+ "dependencies": {
523
+ "ajv": "^6.14.0",
524
+ "debug": "^4.3.2",
525
+ "espree": "^10.0.1",
526
+ "globals": "^14.0.0",
527
+ "ignore": "^5.2.0",
528
+ "import-fresh": "^3.2.1",
529
+ "js-yaml": "^4.1.1",
530
+ "minimatch": "^3.1.3",
531
+ "strip-json-comments": "^3.1.1"
532
+ },
533
+ "engines": {
534
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
535
+ },
536
+ "funding": {
537
+ "url": "https://opencollective.com/eslint"
538
+ }
539
+ },
540
+ "node_modules/@eslint/eslintrc/node_modules/balanced-match": {
541
+ "version": "1.0.2",
542
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
543
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
544
+ "dev": true,
545
+ "license": "MIT"
546
+ },
547
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
548
+ "version": "1.1.12",
549
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
550
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
551
+ "dev": true,
552
+ "license": "MIT",
553
+ "dependencies": {
554
+ "balanced-match": "^1.0.0",
555
+ "concat-map": "0.0.1"
556
+ }
557
+ },
558
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
559
+ "version": "14.0.0",
560
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
561
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
562
+ "dev": true,
563
+ "license": "MIT",
564
+ "engines": {
565
+ "node": ">=18"
566
+ },
567
+ "funding": {
568
+ "url": "https://github.com/sponsors/sindresorhus"
569
+ }
570
+ },
571
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
572
+ "version": "3.1.5",
573
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
574
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
575
+ "dev": true,
576
+ "license": "ISC",
577
+ "dependencies": {
578
+ "brace-expansion": "^1.1.7"
579
+ },
580
+ "engines": {
581
+ "node": "*"
582
+ }
583
+ },
584
+ "node_modules/@eslint/js": {
585
+ "version": "9.39.3",
586
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz",
587
+ "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==",
588
+ "dev": true,
589
+ "license": "MIT",
590
+ "engines": {
591
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
592
+ },
593
+ "funding": {
594
+ "url": "https://eslint.org/donate"
595
  }
596
  },
597
  "node_modules/@eslint/object-schema": {
598
+ "version": "2.1.7",
599
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
600
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
601
  "dev": true,
602
  "license": "Apache-2.0",
603
  "engines": {
604
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
605
  }
606
  },
607
  "node_modules/@eslint/plugin-kit": {
608
+ "version": "0.4.1",
609
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
610
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
611
  "dev": true,
612
  "license": "Apache-2.0",
613
  "dependencies": {
614
+ "@eslint/core": "^0.17.0",
615
  "levn": "^0.4.1"
616
  },
617
  "engines": {
618
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
619
  }
620
  },
621
  "node_modules/@floating-ui/core": {
 
3581
  "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
3582
  "license": "MIT"
3583
  },
 
 
 
 
 
 
 
3584
  "node_modules/@types/estree": {
3585
  "version": "1.0.8",
3586
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
 
4177
  "url": "https://github.com/sponsors/epoberezkin"
4178
  }
4179
  },
4180
+ "node_modules/ansi-styles": {
4181
+ "version": "4.3.0",
4182
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
4183
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
4184
+ "dev": true,
4185
+ "license": "MIT",
4186
+ "dependencies": {
4187
+ "color-convert": "^2.0.1"
4188
+ },
4189
+ "engines": {
4190
+ "node": ">=8"
4191
+ },
4192
+ "funding": {
4193
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
4194
+ }
4195
+ },
4196
+ "node_modules/argparse": {
4197
+ "version": "2.0.1",
4198
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
4199
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
4200
+ "dev": true,
4201
+ "license": "Python-2.0"
4202
+ },
4203
  "node_modules/aria-hidden": {
4204
  "version": "1.2.6",
4205
  "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
 
4596
  "url": "https://github.com/sponsors/ljharb"
4597
  }
4598
  },
4599
+ "node_modules/callsites": {
4600
+ "version": "3.1.0",
4601
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
4602
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
4603
+ "dev": true,
4604
+ "license": "MIT",
4605
+ "engines": {
4606
+ "node": ">=6"
4607
+ }
4608
+ },
4609
  "node_modules/caniuse-lite": {
4610
  "version": "1.0.30001774",
4611
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz",
 
4626
  ],
4627
  "license": "CC-BY-4.0"
4628
  },
4629
+ "node_modules/chalk": {
4630
+ "version": "4.1.2",
4631
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
4632
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
4633
+ "dev": true,
4634
+ "license": "MIT",
4635
+ "dependencies": {
4636
+ "ansi-styles": "^4.1.0",
4637
+ "supports-color": "^7.1.0"
4638
+ },
4639
+ "engines": {
4640
+ "node": ">=10"
4641
+ },
4642
+ "funding": {
4643
+ "url": "https://github.com/chalk/chalk?sponsor=1"
4644
+ }
4645
+ },
4646
  "node_modules/chokidar": {
4647
  "version": "4.0.3",
4648
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
 
4710
  "react-dom": "^18 || ^19 || ^19.0.0-rc"
4711
  }
4712
  },
4713
+ "node_modules/color-convert": {
4714
+ "version": "2.0.1",
4715
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
4716
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
4717
+ "dev": true,
4718
+ "license": "MIT",
4719
+ "dependencies": {
4720
+ "color-name": "~1.1.4"
4721
+ },
4722
+ "engines": {
4723
+ "node": ">=7.0.0"
4724
+ }
4725
+ },
4726
+ "node_modules/color-name": {
4727
+ "version": "1.1.4",
4728
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
4729
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
4730
+ "dev": true,
4731
+ "license": "MIT"
4732
+ },
4733
  "node_modules/concat-map": {
4734
  "version": "0.0.1",
4735
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 
5409
  }
5410
  },
5411
  "node_modules/eslint": {
5412
+ "version": "9.39.3",
5413
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz",
5414
+ "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
5415
  "dev": true,
5416
  "license": "MIT",
5417
  "dependencies": {
5418
  "@eslint-community/eslint-utils": "^4.8.0",
5419
+ "@eslint-community/regexpp": "^4.12.1",
5420
+ "@eslint/config-array": "^0.21.1",
5421
+ "@eslint/config-helpers": "^0.4.2",
5422
+ "@eslint/core": "^0.17.0",
5423
+ "@eslint/eslintrc": "^3.3.1",
5424
+ "@eslint/js": "9.39.3",
5425
+ "@eslint/plugin-kit": "^0.4.1",
5426
  "@humanfs/node": "^0.16.6",
5427
  "@humanwhocodes/module-importer": "^1.0.1",
5428
  "@humanwhocodes/retry": "^0.4.2",
5429
  "@types/estree": "^1.0.6",
5430
+ "ajv": "^6.12.4",
5431
+ "chalk": "^4.0.0",
5432
  "cross-spawn": "^7.0.6",
5433
  "debug": "^4.3.2",
5434
  "escape-string-regexp": "^4.0.0",
5435
+ "eslint-scope": "^8.4.0",
5436
+ "eslint-visitor-keys": "^4.2.1",
5437
+ "espree": "^10.4.0",
5438
+ "esquery": "^1.5.0",
5439
  "esutils": "^2.0.2",
5440
  "fast-deep-equal": "^3.1.3",
5441
  "file-entry-cache": "^8.0.0",
 
5445
  "imurmurhash": "^0.1.4",
5446
  "is-glob": "^4.0.0",
5447
  "json-stable-stringify-without-jsonify": "^1.0.1",
5448
+ "lodash.merge": "^4.6.2",
5449
+ "minimatch": "^3.1.2",
5450
  "natural-compare": "^1.4.0",
5451
  "optionator": "^0.9.3"
5452
  },
 
5454
  "eslint": "bin/eslint.js"
5455
  },
5456
  "engines": {
5457
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5458
  },
5459
  "funding": {
5460
  "url": "https://eslint.org/donate"
 
5773
  }
5774
  },
5775
  "node_modules/eslint-scope": {
5776
+ "version": "8.4.0",
5777
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
5778
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
5779
  "dev": true,
5780
  "license": "BSD-2-Clause",
5781
  "dependencies": {
 
 
5782
  "esrecurse": "^4.3.0",
5783
  "estraverse": "^5.2.0"
5784
  },
5785
  "engines": {
5786
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5787
  },
5788
  "funding": {
5789
  "url": "https://opencollective.com/eslint"
 
5802
  "url": "https://opencollective.com/eslint"
5803
  }
5804
  },
5805
+ "node_modules/eslint/node_modules/balanced-match": {
5806
+ "version": "1.0.2",
5807
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
5808
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
5809
+ "dev": true,
5810
+ "license": "MIT"
5811
+ },
5812
+ "node_modules/eslint/node_modules/brace-expansion": {
5813
+ "version": "1.1.12",
5814
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
5815
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
5816
+ "dev": true,
5817
+ "license": "MIT",
5818
+ "dependencies": {
5819
+ "balanced-match": "^1.0.0",
5820
+ "concat-map": "0.0.1"
5821
+ }
5822
+ },
5823
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
5824
+ "version": "4.2.1",
5825
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
5826
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
5827
+ "dev": true,
5828
+ "license": "Apache-2.0",
5829
+ "engines": {
5830
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5831
+ },
5832
+ "funding": {
5833
+ "url": "https://opencollective.com/eslint"
5834
+ }
5835
+ },
5836
+ "node_modules/eslint/node_modules/minimatch": {
5837
+ "version": "3.1.5",
5838
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
5839
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
5840
+ "dev": true,
5841
+ "license": "ISC",
5842
+ "dependencies": {
5843
+ "brace-expansion": "^1.1.7"
5844
+ },
5845
+ "engines": {
5846
+ "node": "*"
5847
+ }
5848
+ },
5849
  "node_modules/espree": {
5850
+ "version": "10.4.0",
5851
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
5852
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
5853
  "dev": true,
5854
  "license": "BSD-2-Clause",
5855
  "dependencies": {
5856
+ "acorn": "^8.15.0",
5857
  "acorn-jsx": "^5.3.2",
5858
+ "eslint-visitor-keys": "^4.2.1"
5859
  },
5860
  "engines": {
5861
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5862
+ },
5863
+ "funding": {
5864
+ "url": "https://opencollective.com/eslint"
5865
+ }
5866
+ },
5867
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
5868
+ "version": "4.2.1",
5869
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
5870
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
5871
+ "dev": true,
5872
+ "license": "Apache-2.0",
5873
+ "engines": {
5874
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5875
  },
5876
  "funding": {
5877
  "url": "https://opencollective.com/eslint"
 
6358
  "url": "https://github.com/sponsors/ljharb"
6359
  }
6360
  },
6361
+ "node_modules/has-flag": {
6362
+ "version": "4.0.0",
6363
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
6364
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
6365
+ "dev": true,
6366
+ "license": "MIT",
6367
+ "engines": {
6368
+ "node": ">=8"
6369
+ }
6370
+ },
6371
  "node_modules/has-property-descriptors": {
6372
  "version": "1.0.2",
6373
  "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
 
6476
  "url": "https://opencollective.com/immer"
6477
  }
6478
  },
6479
+ "node_modules/import-fresh": {
6480
+ "version": "3.3.1",
6481
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
6482
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
6483
+ "dev": true,
6484
+ "license": "MIT",
6485
+ "dependencies": {
6486
+ "parent-module": "^1.0.0",
6487
+ "resolve-from": "^4.0.0"
6488
+ },
6489
+ "engines": {
6490
+ "node": ">=6"
6491
+ },
6492
+ "funding": {
6493
+ "url": "https://github.com/sponsors/sindresorhus"
6494
+ }
6495
+ },
6496
  "node_modules/imurmurhash": {
6497
  "version": "0.1.4",
6498
  "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
 
6987
  "dev": true,
6988
  "license": "MIT"
6989
  },
6990
+ "node_modules/js-yaml": {
6991
+ "version": "4.1.1",
6992
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
6993
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
6994
+ "dev": true,
6995
+ "license": "MIT",
6996
+ "dependencies": {
6997
+ "argparse": "^2.0.1"
6998
+ },
6999
+ "bin": {
7000
+ "js-yaml": "bin/js-yaml.js"
7001
+ }
7002
+ },
7003
  "node_modules/jsesc": {
7004
  "version": "3.1.0",
7005
  "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
 
7384
  "url": "https://github.com/sponsors/sindresorhus"
7385
  }
7386
  },
7387
+ "node_modules/lodash.merge": {
7388
+ "version": "4.6.2",
7389
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
7390
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
7391
+ "dev": true,
7392
+ "license": "MIT"
7393
+ },
7394
  "node_modules/loose-envify": {
7395
  "version": "1.4.0",
7396
  "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
 
7908
  "url": "https://github.com/sponsors/sindresorhus"
7909
  }
7910
  },
7911
+ "node_modules/parent-module": {
7912
+ "version": "1.0.1",
7913
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
7914
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
7915
+ "dev": true,
7916
+ "license": "MIT",
7917
+ "dependencies": {
7918
+ "callsites": "^3.0.0"
7919
+ },
7920
+ "engines": {
7921
+ "node": ">=6"
7922
+ }
7923
+ },
7924
  "node_modules/path-exists": {
7925
  "version": "4.0.0",
7926
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 
8437
  "url": "https://github.com/sponsors/ljharb"
8438
  }
8439
  },
8440
+ "node_modules/resolve-from": {
8441
+ "version": "4.0.0",
8442
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
8443
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
8444
+ "dev": true,
8445
+ "license": "MIT",
8446
+ "engines": {
8447
+ "node": ">=4"
8448
+ }
8449
+ },
8450
  "node_modules/resolve-pkg-maps": {
8451
  "version": "1.0.0",
8452
  "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
 
8922
  "node": ">=4"
8923
  }
8924
  },
8925
+ "node_modules/strip-json-comments": {
8926
+ "version": "3.1.1",
8927
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
8928
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
8929
+ "dev": true,
8930
+ "license": "MIT",
8931
+ "engines": {
8932
+ "node": ">=8"
8933
+ },
8934
+ "funding": {
8935
+ "url": "https://github.com/sponsors/sindresorhus"
8936
+ }
8937
+ },
8938
  "node_modules/stripe": {
8939
  "version": "20.4.0",
8940
  "resolved": "https://registry.npmjs.org/stripe/-/stripe-20.4.0.tgz",
 
8975
  }
8976
  }
8977
  },
8978
+ "node_modules/supports-color": {
8979
+ "version": "7.2.0",
8980
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
8981
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
8982
+ "dev": true,
8983
+ "license": "MIT",
8984
+ "dependencies": {
8985
+ "has-flag": "^4.0.0"
8986
+ },
8987
+ "engines": {
8988
+ "node": ">=8"
8989
+ }
8990
+ },
8991
  "node_modules/supports-preserve-symlinks-flag": {
8992
  "version": "1.0.0",
8993
  "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
package.json CHANGED
@@ -69,9 +69,9 @@
69
  "@types/node": "25.3.2",
70
  "@types/react": "^19",
71
  "@types/react-dom": "^19",
72
- "eslint": "^10.0.2",
73
  "eslint-config-next": "^16.1.6",
74
  "tailwindcss": "^4",
75
  "typescript": "^5"
76
  }
77
- }
 
69
  "@types/node": "25.3.2",
70
  "@types/react": "^19",
71
  "@types/react-dom": "^19",
72
+ "eslint": "^9.0.0",
73
  "eslint-config-next": "^16.1.6",
74
  "tailwindcss": "^4",
75
  "typescript": "^5"
76
  }
77
+ }
src/app/api/characters/route.ts CHANGED
@@ -20,6 +20,23 @@ export async function POST(request: NextRequest) {
20
  return NextResponse.json({ success: false, error: "Nombre requerido" }, { status: 400 });
21
  }
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  let referenceImage: string | null = null;
24
  let characterTraits: string | null = null;
25
 
@@ -45,10 +62,11 @@ export async function POST(request: NextRequest) {
45
  const character = await db.character.create({
46
  data: {
47
  name,
 
48
  description: description ? String(description) : null,
49
  referenceImage: referenceImage ? String(referenceImage) : null,
50
  traits: String(finalTraits)
51
- } as any
52
  });
53
 
54
  return NextResponse.json({ success: true, character });
 
20
  return NextResponse.json({ success: false, error: "Nombre requerido" }, { status: 400 });
21
  }
22
 
23
+ // Generate a unique slug from the name
24
+ const baseSlug = name
25
+ .toLowerCase()
26
+ .normalize("NFD")
27
+ .replace(/[\u0300-\u036f]/g, "") // Remove diacritics
28
+ .replace(/[^a-z0-9]+/g, "-")
29
+ .replace(/^-|-$/g, "");
30
+
31
+ let slug = baseSlug;
32
+ let slugExists = await db.character.findUnique({ where: { slug } });
33
+ let attempt = 0;
34
+ while (slugExists) {
35
+ attempt++;
36
+ slug = `${baseSlug}-${attempt}`;
37
+ slugExists = await db.character.findUnique({ where: { slug } });
38
+ }
39
+
40
  let referenceImage: string | null = null;
41
  let characterTraits: string | null = null;
42
 
 
62
  const character = await db.character.create({
63
  data: {
64
  name,
65
+ slug,
66
  description: description ? String(description) : null,
67
  referenceImage: referenceImage ? String(referenceImage) : null,
68
  traits: String(finalTraits)
69
+ }
70
  });
71
 
72
  return NextResponse.json({ success: true, character });
src/app/api/payments/stripe-webhook/route.ts DELETED
@@ -1,40 +0,0 @@
1
- import { NextRequest, NextResponse } from "next/server";
2
- import { db } from "@/lib/db";
3
-
4
- // Webhook minimalista: espera eventos JSON con la forma { type: 'payment.succeeded', data: { userId, influencerId, tier, price, currency } }
5
- // No depende de la librería Stripe. Para producción, valida firma con STRIPE_WEBHOOK_SECRET.
6
-
7
- export async function POST(request: NextRequest) {
8
- try {
9
- const secret = process.env.STRIPE_WEBHOOK_SECRET || null;
10
- // TODO: validar firma si STRIPE_WEBHOOK_SECRET está presente
11
-
12
- const event = await request.json();
13
- if (!event || !event.type) return NextResponse.json({ success: false, error: "Evento inválido" }, { status: 400 });
14
-
15
- if (event.type === "payment.succeeded") {
16
- const d = event.data || {};
17
- const { userId, influencerId, tier, price, currency, expiresAt } = d;
18
- if (!userId || !influencerId || !tier) return NextResponse.json({ success: false, error: "Datos incompletos en evento" }, { status: 400 });
19
-
20
- // Crear suscripción en BD
21
- const subscription = await db.influencerSubscription.create({ data: {
22
- influencerId,
23
- userId,
24
- tier,
25
- price: price ?? null,
26
- currency: currency ?? "USD",
27
- expiresAt: expiresAt ? new Date(expiresAt) : null,
28
- }});
29
-
30
- try { await db.agentTask.create({ data: { type: "payment_webhook_subscribe", status: "completed", input: JSON.stringify(d), output: subscription.id, completedAt: new Date() } }); } catch { }
31
-
32
- return NextResponse.json({ success: true, subscription });
33
- }
34
-
35
- return NextResponse.json({ success: true, received: true });
36
- } catch (error) {
37
- const message = error instanceof Error ? error.message : "Error";
38
- return NextResponse.json({ success: false, error: message }, { status: 500 });
39
- }
40
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/app/cancel/page.tsx ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import { XCircle } from "lucide-react";
4
+ import { Button } from "@/components/ui/button";
5
+ import Link from "next/link";
6
+
7
+ export default function CancelPage() {
8
+ return (
9
+ <div className="min-h-screen bg-gradient-to-b from-slate-950 via-slate-900 to-slate-950 flex items-center justify-center p-6">
10
+ <div className="max-w-md w-full bg-slate-800/50 backdrop-blur-xl rounded-2xl border border-slate-700 p-8 text-center space-y-6">
11
+ <div className="flex justify-center">
12
+ <XCircle className="h-16 w-16 text-red-500" />
13
+ </div>
14
+ <h1 className="text-2xl font-bold text-white">Pago cancelado</h1>
15
+ <p className="text-slate-300">
16
+ El proceso de pago fue cancelado. No se ha realizado ningún cargo.
17
+ </p>
18
+ <Link href="/">
19
+ <Button className="w-full mt-4">Volver al Dashboard</Button>
20
+ </Link>
21
+ </div>
22
+ </div>
23
+ );
24
+ }
src/app/success/page.tsx ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import { useSearchParams } from "next/navigation";
4
+ import { Suspense } from "react";
5
+ import { CheckCircle } from "lucide-react";
6
+ import { Button } from "@/components/ui/button";
7
+ import Link from "next/link";
8
+
9
+ function SuccessContent() {
10
+ const searchParams = useSearchParams();
11
+ const sessionId = searchParams.get("session_id");
12
+
13
+ return (
14
+ <div className="min-h-screen bg-gradient-to-b from-slate-950 via-slate-900 to-slate-950 flex items-center justify-center p-6">
15
+ <div className="max-w-md w-full bg-slate-800/50 backdrop-blur-xl rounded-2xl border border-slate-700 p-8 text-center space-y-6">
16
+ <div className="flex justify-center">
17
+ <CheckCircle className="h-16 w-16 text-green-500" />
18
+ </div>
19
+ <h1 className="text-2xl font-bold text-white">¡Pago completado!</h1>
20
+ <p className="text-slate-300">
21
+ Tu suscripción se ha activado correctamente. Ya puedes disfrutar del contenido exclusivo.
22
+ </p>
23
+ {sessionId && (
24
+ <p className="text-xs text-slate-500 break-all">
25
+ ID de sesión: {sessionId}
26
+ </p>
27
+ )}
28
+ <Link href="/">
29
+ <Button className="w-full mt-4">Volver al Dashboard</Button>
30
+ </Link>
31
+ </div>
32
+ </div>
33
+ );
34
+ }
35
+
36
+ export default function SuccessPage() {
37
+ return (
38
+ <Suspense fallback={
39
+ <div className="min-h-screen bg-gradient-to-b from-slate-950 via-slate-900 to-slate-950 flex items-center justify-center">
40
+ <p className="text-white">Cargando...</p>
41
+ </div>
42
+ }>
43
+ <SuccessContent />
44
+ </Suspense>
45
+ );
46
+ }