Compare commits

..

No commits in common. "92d7fb4ca6bfe09b42380392c25f51960f93414d" and "13e2ca5235ec7ce5e53fb7e441e8310de62ad8ed" have entirely different histories.

46 changed files with 658 additions and 315 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@erp/factuges-server", "name": "@erp/factuges-server",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "tsup src/index.ts --config tsup.config.ts", "build": "tsup src/index.ts --config tsup.config.ts",
@ -55,7 +55,10 @@
"passport": "^0.7.0", "passport": "^0.7.0",
"passport-jwt": "^4.0.1", "passport-jwt": "^4.0.1",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"path": "^0.12.7",
"pg-hstore": "^2.3.4", "pg-hstore": "^2.3.4",
"puppeteer": "^24.20.0",
"puppeteer-report": "^3.2.0",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"response-time": "^2.3.3", "response-time": "^2.3.3",
"sequelize": "^6.37.5", "sequelize": "^6.37.5",

View File

@ -1,7 +1,7 @@
{ {
"name": "@erp/factuges-web", "name": "@erp/factuges-web",
"private": true, "private": true,
"version": "0.0.5", "version": "0.0.4",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite --host --clearScreen false", "dev": "vite --host --clearScreen false",
@ -20,8 +20,6 @@
"@types/react": "^19.1.2", "@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3", "@types/react-dom": "^19.1.3",
"@vitejs/plugin-react": "^4.4.1", "@vitejs/plugin-react": "^4.4.1",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "~5.8.3", "typescript": "~5.8.3",
"vite": "^6.3.5" "vite": "^6.3.5"
}, },
@ -33,11 +31,13 @@
"@repo/rdx-ui": "workspace:*", "@repo/rdx-ui": "workspace:*",
"@repo/shadcn-ui": "workspace:*", "@repo/shadcn-ui": "workspace:*",
"@tailwindcss/vite": "^4.1.11", "@tailwindcss/vite": "^4.1.11",
"@tanstack/react-query": "^5.90.6", "@tanstack/react-query": "^5.74.11",
"axios": "^1.9.0", "axios": "^1.9.0",
"dinero.js": "^1.9.1", "dinero.js": "^1.9.1",
"i18next": "^25.0.2", "i18next": "^25.0.2",
"i18next-browser-languagedetector": "^8.1.0", "i18next-browser-languagedetector": "^8.1.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-error-boundary": "^6.0.0", "react-error-boundary": "^6.0.0",
"react-hook-form": "^7.56.4", "react-hook-form": "^7.56.4",
"react-i18next": "^15.0.1", "react-i18next": "^15.0.1",

View File

@ -28,5 +28,5 @@
"allowUnreachableCode": true "allowUnreachableCode": true
}, },
"include": ["src"], "include": ["src"],
"exclude": ["node_modules", "dist"] "exclude": ["node_modules"]
} }

View File

@ -1,6 +1,9 @@
{ {
"files": [], "files": [],
"references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }], "references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
],
"compilerOptions": { "compilerOptions": {
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {

View File

@ -10,7 +10,6 @@ export default defineConfig({
}, },
plugins: [react(), tailwindcss()], plugins: [react(), tailwindcss()],
resolve: { resolve: {
dedupe: ["react", "react-dom"],
alias: { alias: {
"@": path.resolve(__dirname, "./src"), "@": path.resolve(__dirname, "./src"),
}, },

View File

@ -1,6 +1,6 @@
{ {
"name": "@erp/auth", "name": "@erp/auth",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,
@ -16,16 +16,17 @@
"./client": "./src/web/index.ts" "./client": "./src/web/index.ts"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^19.1.0", "@erp/core": "workspace:*",
"react-dom": "^19.1.0" "dinero.js": "^1.9.1",
"express": "^4.18.2",
"i18next": "^25.1.1",
"zod": "^3.25.67"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.3.1", "@biomejs/biome": "^2.3.1",
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"@types/react": "^19.1.2", "@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3", "@types/react-dom": "^19.1.3",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.9.3" "typescript": "^5.9.3"
}, },
"dependencies": { "dependencies": {
@ -33,8 +34,9 @@
"@repo/rdx-ddd": "workspace:*", "@repo/rdx-ddd": "workspace:*",
"@repo/rdx-ui": "workspace:*", "@repo/rdx-ui": "workspace:*",
"@repo/shadcn-ui": "workspace:*", "@repo/shadcn-ui": "workspace:*",
"@tanstack/react-query": "^5.90.6", "@tanstack/react-query": "^5.74.11",
"i18next": "^25.1.1", "react": "^19.1.0",
"react-dom": "^19.1.0",
"react-hook-form": "^7.56.2", "react-hook-form": "^7.56.2",
"react-router-dom": "^6.26.0", "react-router-dom": "^6.26.0",
"react-secure-storage": "^1.3.2" "react-secure-storage": "^1.3.2"

View File

@ -1,6 +1,6 @@
{ {
"name": "@erp/core", "name": "@erp/core",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,
@ -20,16 +20,14 @@
"./hooks": "./src/web/hooks/index.ts" "./hooks": "./src/web/hooks/index.ts"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^19.1.0", "dinero.js": "^1.9.1",
"react-dom": "^19.1.0" "react": "^19.1.0"
}, },
"devDependencies": { "devDependencies": {
"@hookform/devtools": "^4.4.0", "@hookform/devtools": "^4.4.0",
"@types/dinero.js": "^1.9.4", "@types/dinero.js": "^1.9.4",
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"@types/react": "^19.1.2", "@types/react": "^19.1.2",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.9.3" "typescript": "^5.9.3"
}, },
"dependencies": { "dependencies": {
@ -42,7 +40,6 @@
"@repo/shadcn-ui": "workspace:*", "@repo/shadcn-ui": "workspace:*",
"@tanstack/react-query": "^5.75.4", "@tanstack/react-query": "^5.75.4",
"axios": "^1.9.0", "axios": "^1.9.0",
"dinero.js": "^1.9.1",
"express": "^4.18.2", "express": "^4.18.2",
"http-status": "^2.1.0", "http-status": "^2.1.0",
"i18next": "^25.1.1", "i18next": "^25.1.1",
@ -50,7 +47,6 @@
"react-hook-form": "^7.58.1", "react-hook-form": "^7.58.1",
"react-i18next": "^15.5.1", "react-i18next": "^15.5.1",
"react-router-dom": "^6.26.0", "react-router-dom": "^6.26.0",
"sequelize": "^6.37.5",
"zod": "^4.1.11" "zod": "^4.1.11"
} }
} }

View File

@ -1,4 +1,4 @@
import { Criteria, CriteriaFromUrlConverter } from "@repo/rdx-criteria/server"; import { Criteria, CriteriaFromUrlConverter } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd"; import { UniqueID } from "@repo/rdx-ddd";
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import httpStatus from "http-status"; import httpStatus from "http-status";
@ -175,7 +175,7 @@ export abstract class ExpressController {
// ─────────────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────────────
// Guards API // Guards API
protected registerGuards(...guards: GuardFn[]): this { protected useGuards(...guards: GuardFn[]): this {
this.guards.push(...guards); this.guards.push(...guards);
return this; return this;
} }

View File

@ -1,4 +1,4 @@
import { Criteria } from "@repo/rdx-criteria/server"; import { Criteria } from "@repo/rdx-criteria";
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import { ApiError, ForbiddenApiError, UnauthorizedApiError, ValidationApiError } from "./errors"; import { ApiError, ForbiddenApiError, UnauthorizedApiError, ValidationApiError } from "./errors";
import { ExpressController } from "./express-controller"; import { ExpressController } from "./express-controller";

View File

@ -1,4 +1,4 @@
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server"; import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria";
import { IAggregateRootRepository, UniqueID } from "@repo/rdx-ddd"; import { IAggregateRootRepository, UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils"; import { Result } from "@repo/rdx-utils";
import { FindOptions, ModelDefined, Sequelize, Transaction } from "sequelize"; import { FindOptions, ModelDefined, Sequelize, Transaction } from "sequelize";

View File

@ -1,5 +1,5 @@
{ {
"extends": "../../tsconfig.json", "extends": "@repo/typescript-config/buildless.json",
"compilerOptions": { "compilerOptions": {
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {

View File

@ -15,10 +15,6 @@
"./client": "./src/web/manifest.ts", "./client": "./src/web/manifest.ts",
"./globals.css": "./src/web/globals.css" "./globals.css": "./src/web/globals.css"
}, },
"peerDependencies": {
"react": "^19.1.0",
"react-dom": "^19.1.0"
},
"devDependencies": { "devDependencies": {
"@hookform/devtools": "^4.4.0", "@hookform/devtools": "^4.4.0",
"@types/dinero.js": "^1.9.4", "@types/dinero.js": "^1.9.4",
@ -26,11 +22,10 @@
"@types/react": "^19.1.2", "@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3", "@types/react-dom": "^19.1.3",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.9.3" "typescript": "^5.9.3"
}, },
"dependencies": { "dependencies": {
"@ag-grid-community/locale": "34.0.0",
"@dnd-kit/core": "^6.3.1", "@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0", "@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2", "@dnd-kit/utilities": "^3.2.2",
@ -44,8 +39,10 @@
"@repo/rdx-ui": "workspace:*", "@repo/rdx-ui": "workspace:*",
"@repo/rdx-utils": "workspace:*", "@repo/rdx-utils": "workspace:*",
"@repo/shadcn-ui": "workspace:*", "@repo/shadcn-ui": "workspace:*",
"@tanstack/react-query": "^5.90.6", "@tanstack/react-query": "^5.74.11",
"@tanstack/react-table": "^8.21.3", "@tanstack/react-table": "^8.21.3",
"ag-grid-community": "^33.3.0",
"ag-grid-react": "^33.3.0",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"dinero.js": "^1.9.1", "dinero.js": "^1.9.1",
@ -54,13 +51,13 @@
"i18next": "^25.1.1", "i18next": "^25.1.1",
"libphonenumber-js": "^1.12.7", "libphonenumber-js": "^1.12.7",
"lucide-react": "^0.503.0", "lucide-react": "^0.503.0",
"pg-hstore": "^2.3.4",
"puppeteer": "^24.20.0", "puppeteer": "^24.20.0",
"puppeteer-report": "^3.2.0", "puppeteer-report": "^3.2.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-hook-form": "^7.58.1", "react-hook-form": "^7.58.1",
"react-i18next": "^15.5.1", "react-i18next": "^15.5.1",
"react-router-dom": "^6.26.0", "react-router-dom": "^6.26.0",
"sequelize": "^6.37.5",
"zod": "^4.1.11" "zod": "^4.1.11"
} }
} }

View File

@ -3,7 +3,7 @@ import path from "node:path";
import { Presenter } from "@erp/core/api"; import { Presenter } from "@erp/core/api";
import * as handlebars from "handlebars"; import * as handlebars from "handlebars";
import { CustomerInvoice } from "../../../../domain"; import { CustomerInvoice } from "../../../../domain";
import { CustomerInvoiceFullPresenter, CustomerInvoiceReportPresenter } from "../../../presenters"; import { CustomerInvoiceReportPresenter, CustomerInvoiceFullPresenter } from "../../../presenters";
export class CustomerInvoiceReportHTMLPresenter extends Presenter { export class CustomerInvoiceReportHTMLPresenter extends Presenter {
toOutput(customerInvoice: CustomerInvoice): string { toOutput(customerInvoice: CustomerInvoice): string {

View File

@ -7,7 +7,7 @@ export class CreateCustomerInvoiceController extends ExpressController {
public constructor(private readonly useCase: CreateCustomerInvoiceUseCase) { public constructor(private readonly useCase: CreateCustomerInvoiceUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
protected async executeImpl() { protected async executeImpl() {

View File

@ -8,7 +8,7 @@ export class DeleteCustomerInvoiceController extends ExpressController {
) { ) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
async executeImpl() { async executeImpl() {

View File

@ -5,7 +5,7 @@ export class GetCustomerInvoiceController extends ExpressController {
public constructor(private readonly useCase: GetCustomerInvoiceUseCase) { public constructor(private readonly useCase: GetCustomerInvoiceUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
protected async executeImpl() { protected async executeImpl() {

View File

@ -8,7 +8,7 @@ export class IssueCustomerInvoiceController extends ExpressController {
) { ) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
async executeImpl() { async executeImpl() {

View File

@ -1,12 +1,12 @@
import { authGuard, ExpressController, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api"; import { authGuard, ExpressController, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server"; import { Criteria } from "@repo/rdx-criteria";
import { ListCustomerInvoicesUseCase } from "../../../application"; import { ListCustomerInvoicesUseCase } from "../../../application";
export class ListCustomerInvoicesController extends ExpressController { export class ListCustomerInvoicesController extends ExpressController {
public constructor(private readonly useCase: ListCustomerInvoicesUseCase) { public constructor(private readonly useCase: ListCustomerInvoicesUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
private getCriteriaWithDefaultOrder() { private getCriteriaWithDefaultOrder() {

View File

@ -5,7 +5,7 @@ export class ReportCustomerInvoiceController extends ExpressController {
public constructor(private readonly useCase: ReportCustomerInvoiceUseCase) { public constructor(private readonly useCase: ReportCustomerInvoiceUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
protected async executeImpl() { protected async executeImpl() {

View File

@ -6,7 +6,7 @@ export class UpdateCustomerInvoiceController extends ExpressController {
public constructor(private readonly useCase: UpdateCustomerInvoiceUseCase) { public constructor(private readonly useCase: UpdateCustomerInvoiceUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
async executeImpl(): Promise<any> { async executeImpl(): Promise<any> {

View File

@ -4,7 +4,7 @@ import {
SequelizeRepository, SequelizeRepository,
translateSequelizeError, translateSequelizeError,
} from "@erp/core/api"; } from "@erp/core/api";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server"; import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd"; import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils"; import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize"; import { Transaction } from "sequelize";
@ -14,10 +14,10 @@ import {
ICustomerInvoiceDomainMapper, ICustomerInvoiceDomainMapper,
ICustomerInvoiceListMapper, ICustomerInvoiceListMapper,
} from "../mappers"; } from "../mappers";
import { CustomerInvoiceModel } from "./models/customer-invoice.model";
import { CustomerInvoiceItemModel } from "./models/customer-invoice-item.model";
import { CustomerInvoiceItemTaxModel } from "./models/customer-invoice-item-tax.model"; import { CustomerInvoiceItemTaxModel } from "./models/customer-invoice-item-tax.model";
import { CustomerInvoiceItemModel } from "./models/customer-invoice-item.model";
import { CustomerInvoiceTaxModel } from "./models/customer-invoice-tax.model"; import { CustomerInvoiceTaxModel } from "./models/customer-invoice-tax.model";
import { CustomerInvoiceModel } from "./models/customer-invoice.model";
export class CustomerInvoiceRepository export class CustomerInvoiceRepository
extends SequelizeRepository<CustomerInvoice> extends SequelizeRepository<CustomerInvoice>

View File

@ -1,13 +1,15 @@
{ {
"name": "@erp/customers", "name": "@erp/customers",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,
"scripts": { "scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit", "typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist" "clean": "rimraf .turbo node_modules dist"
}, },
"exports": { "exports": {
".": "./src/common/index.ts", ".": "./src/common/index.ts",
"./common": "./src/common/index.ts", "./common": "./src/common/index.ts",
@ -16,19 +18,28 @@
"./globals.css": "./src/web/globals.css", "./globals.css": "./src/web/globals.css",
"./components": "./src/web/components/index.ts" "./components": "./src/web/components/index.ts"
}, },
"peerDependencies": { "peerDependencies": {
"@tanstack/react-query": "^5.74.11",
"ag-grid-community": "^33.3.0",
"dinero.js": "^1.9.1",
"express": "^4.18.2",
"i18next": "^25.1.1",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0" "react-dom": "^19.1.0",
"react-hook-form": "^7.58.1",
"react-i18next": "^15.5.1",
"zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"@types/react": "^19.1.2", "@types/react": "^19.1.2",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
"react": "^19.1.0", "typescript": "^5.9.3",
"react-dom": "^19.1.0", "vitest": "^3.2.4"
"typescript": "^5.9.3"
}, },
"dependencies": { "dependencies": {
"@ag-grid-community/locale": "34.0.0",
"@erp/auth": "workspace:*", "@erp/auth": "workspace:*",
"@erp/core": "workspace:*", "@erp/core": "workspace:*",
"@hookform/resolvers": "^5.0.1", "@hookform/resolvers": "^5.0.1",
@ -38,16 +49,11 @@
"@repo/rdx-ui": "workspace:*", "@repo/rdx-ui": "workspace:*",
"@repo/rdx-utils": "workspace:*", "@repo/rdx-utils": "workspace:*",
"@repo/shadcn-ui": "workspace:*", "@repo/shadcn-ui": "workspace:*",
"@tanstack/react-query": "^5.90.6",
"@tanstack/react-table": "^8.21.3", "@tanstack/react-table": "^8.21.3",
"i18next": "^25.6.0", "ag-grid-react": "^33.3.0",
"lucide-react": "^0.503.0", "lucide-react": "^0.503.0",
"react-data-table-component": "^7.7.0", "react-data-table-component": "^7.7.0",
"react-hook-form": "^7.58.1",
"react-i18next": "^16.2.4",
"react-router-dom": "^6.26.0", "react-router-dom": "^6.26.0",
"sequelize": "^6.37.5", "use-debounce": "^10.0.5"
"use-debounce": "^10.0.5",
"zod": "^4.1.11"
} }
} }

View File

@ -6,7 +6,7 @@ export class CreateCustomerController extends ExpressController {
public constructor(private readonly useCase: CreateCustomerUseCase) { public constructor(private readonly useCase: CreateCustomerUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
protected async executeImpl() { protected async executeImpl() {

View File

@ -5,7 +5,7 @@ export class DeleteCustomerController extends ExpressController {
public constructor(private readonly useCase: DeleteCustomerUseCase) { public constructor(private readonly useCase: DeleteCustomerUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
async executeImpl(): Promise<any> { async executeImpl(): Promise<any> {

View File

@ -5,7 +5,7 @@ export class GetCustomerController extends ExpressController {
public constructor(private readonly useCase: GetCustomerUseCase) { public constructor(private readonly useCase: GetCustomerUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
protected async executeImpl() { protected async executeImpl() {

View File

@ -1,12 +1,12 @@
import { authGuard, ExpressController, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api"; import { authGuard, ExpressController, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server"; import { Criteria } from "@repo/rdx-criteria";
import { ListCustomersUseCase } from "../../../application"; import { ListCustomersUseCase } from "../../../application";
export class ListCustomersController extends ExpressController { export class ListCustomersController extends ExpressController {
public constructor(private readonly listCustomers: ListCustomersUseCase) { public constructor(private readonly listCustomers: ListCustomersUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
private getCriteriaWithDefaultOrder() { private getCriteriaWithDefaultOrder() {

View File

@ -6,7 +6,7 @@ export class UpdateCustomerController extends ExpressController {
public constructor(private readonly useCase: UpdateCustomerUseCase) { public constructor(private readonly useCase: UpdateCustomerUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
protected async executeImpl() { protected async executeImpl() {

View File

@ -4,7 +4,7 @@ import {
SequelizeRepository, SequelizeRepository,
translateSequelizeError, translateSequelizeError,
} from "@erp/core/api"; } from "@erp/core/api";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server"; import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd"; import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils"; import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize"; import { Transaction } from "sequelize";

View File

@ -1,13 +1,13 @@
import { PageHeader } from "@erp/core/components"; import { PageHeader } from '@erp/core/components';
import { AppContent, AppHeader, BackHistoryButton, useDebounce } from "@repo/rdx-ui/components"; import { AppContent, AppHeader, BackHistoryButton, useDebounce } from "@repo/rdx-ui/components";
import { Button } from "@repo/shadcn-ui/components"; import { Button } from "@repo/shadcn-ui/components";
import { PlusIcon } from "lucide-react"; import { PlusIcon } from "lucide-react";
import { useMemo, useState } from "react"; import { useMemo, useState } from 'react';
import { Outlet, useNavigate } from "react-router-dom"; import { Outlet, useNavigate } from "react-router-dom";
import { ErrorAlert } from "../../components"; import { ErrorAlert } from '../../components';
import { useCustomerListQuery } from "../../hooks"; import { useCustomerListQuery } from '../../hooks';
import { useTranslation } from "../../i18n"; import { useTranslation } from "../../i18n";
import { CustomersListGrid } from "./customers-list-grid"; import { CustomersListGrid } from './customers-list-grid';
export const CustomersListPage = () => { export const CustomersListPage = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -28,7 +28,13 @@ export const CustomersListPage = () => {
[pageSize, pageIndex, debouncedQ] [pageSize, pageIndex, debouncedQ]
); );
const { data: customersPageData, isLoading, isError, error } = useCustomerListQuery({ criteria });
const {
data: customersPageData,
isLoading,
isError,
error,
} = useCustomerListQuery({ criteria });
const handlePageChange = (newPageIndex: number) => { const handlePageChange = (newPageIndex: number) => {
setPageIndex(newPageIndex); setPageIndex(newPageIndex);
@ -45,6 +51,7 @@ export const CustomersListPage = () => {
setPageIndex(0); setPageIndex(0);
}; };
if (isError || !customersPageData) { if (isError || !customersPageData) {
return ( return (
<AppContent> <AppContent>
@ -67,11 +74,11 @@ export const CustomersListPage = () => {
<div className='flex items-center space-x-2'> <div className='flex items-center space-x-2'>
<Button <Button
onClick={() => navigate("/customers/create")} onClick={() => navigate("/customers/create")}
variant={"default"} variant={'default'}
aria-label={t("pages.create.title")} aria-label={t("pages.create.title")}
className='cursor-pointer' className='cursor-pointer'
> >
<PlusIcon className='mr-2 h-4 w-4' aria-hidden /> <PlusIcon className="mr-2 h-4 w-4" aria-hidden />
{t("pages.create.title")} {t("pages.create.title")}
</Button> </Button>
</div> </div>

View File

@ -1,6 +1,3 @@
import { formHasAnyDirty, pickFormDirtyValues } from "@erp/core/client";
import { UnsavedChangesProvider, useHookForm } from "@erp/core/hooks";
import { showErrorToast, showSuccessToast, showWarningToast } from "@repo/rdx-ui/helpers";
import { import {
Button, Button,
Dialog, Dialog,
@ -14,13 +11,18 @@ import {
TabsTrigger, TabsTrigger,
} from "@repo/shadcn-ui/components"; } from "@repo/shadcn-ui/components";
import { X } from "lucide-react"; import { X } from "lucide-react";
import { FieldErrors, FormProvider } from "react-hook-form";
import { useNavigate } from "react-router-dom"; import { FieldErrors, FormProvider } from "react-hook-form";
import { CustomerEditorSkeleton } from "../../components";
import { CustomerAdditionalConfigFields } from "../../components/editor/customer-additional-config-fields"; import { CustomerAdditionalConfigFields } from "../../components/editor/customer-additional-config-fields";
import { CustomerAddressFields } from "../../components/editor/customer-address-fields"; import { CustomerAddressFields } from "../../components/editor/customer-address-fields";
import { CustomerBasicInfoFields } from "../../components/editor/customer-basic-info-fields"; import { CustomerBasicInfoFields } from "../../components/editor/customer-basic-info-fields";
import { useNavigate } from "react-router-dom";
import { formHasAnyDirty, pickFormDirtyValues } from "@erp/core/client";
import { UnsavedChangesProvider, useHookForm } from "@erp/core/hooks";
import { showErrorToast, showSuccessToast, showWarningToast } from "@repo/rdx-ui/helpers";
import { CustomerEditorSkeleton } from "../../components";
import { useCustomerQuery, useUpdateCustomer } from "../../hooks"; import { useCustomerQuery, useUpdateCustomer } from "../../hooks";
import { useTranslation } from "../../i18n"; import { useTranslation } from "../../i18n";
import { CustomerFormData, CustomerFormSchema, defaultCustomerFormData } from "../../schemas"; import { CustomerFormData, CustomerFormSchema, defaultCustomerFormData } from "../../schemas";

View File

@ -1,14 +1,5 @@
import { PageHeader } from "@erp/core/components";
import { useUrlParamId } from "@erp/core/hooks";
import { AppContent, AppHeader, BackHistoryButton } from "@repo/rdx-ui/components"; import { AppContent, AppHeader, BackHistoryButton } from "@repo/rdx-ui/components";
import { import { Button, Card, CardContent, CardHeader, CardTitle } from "@repo/shadcn-ui/components";
Badge,
Button,
Card,
CardContent,
CardHeader,
CardTitle,
} from "@repo/shadcn-ui/components";
import { import {
Banknote, Banknote,
EditIcon, EditIcon,
@ -19,9 +10,13 @@ import {
MapPin, MapPin,
MoreVertical, MoreVertical,
Phone, Phone,
Smartphone, Smartphone
} from "lucide-react"; } from "lucide-react";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { PageHeader } from '@erp/core/components';
import { useUrlParamId } from "@erp/core/hooks";
import { Badge } from "@repo/shadcn-ui/components";
import { CustomerEditorSkeleton, ErrorAlert } from "../../components"; import { CustomerEditorSkeleton, ErrorAlert } from "../../components";
import { useCustomerQuery } from "../../hooks"; import { useCustomerQuery } from "../../hooks";
import { useTranslation } from "../../i18n"; import { useTranslation } from "../../i18n";
@ -68,22 +63,13 @@ export const CustomerViewPage = () => {
<AppHeader> <AppHeader>
<PageHeader <PageHeader
backIcon backIcon
title={ title={(<div className="flex flex-wrap items-center gap-2">{customer?.name} {customer?.trade_name && <span className="text-muted-foreground">({customer.trade_name})</span>}</div>)}
<div className='flex flex-wrap items-center gap-2'> description={<div className='mt-2 flex items-center gap-3'>
{customer?.name}{" "} <Badge variant='secondary' className='font-mono'>
{customer?.trade_name && ( {customer?.tin}
<span className='text-muted-foreground'>({customer.trade_name})</span> </Badge>
)} <Badge variant='outline'>{customer?.is_company ? "Empresa" : "Persona"}</Badge>
</div> </div>}
}
description={
<div className='mt-2 flex items-center gap-3'>
<Badge variant='secondary' className='font-mono'>
{customer?.tin}
</Badge>
<Badge variant='outline'>{customer?.is_company ? "Empresa" : "Persona"}</Badge>
</div>
}
rightSlot={ rightSlot={
<div className='flex gap-2'> <div className='flex gap-2'>
<Button variant='outline' size='icon' onClick={() => navigate("/customers/list")}> <Button variant='outline' size='icon' onClick={() => navigate("/customers/list")}>
@ -115,20 +101,20 @@ export const CustomerViewPage = () => {
</div> </div>
<div> <div>
<dt className='text-sm font-medium text-muted-foreground'>Referencia</dt> <dt className='text-sm font-medium text-muted-foreground'>Referencia</dt>
<dd className='mt-1 font-mono text-base text-foreground'>{customer?.reference}</dd> <dd className='mt-1 font-mono text-base text-foreground'>
{customer?.reference}
</dd>
</div> </div>
<div> <div>
<dt className='text-sm font-medium text-muted-foreground'>Registro Legal</dt> <dt className='text-sm font-medium text-muted-foreground'>Registro Legal</dt>
<dd className='mt-1 text-base text-foreground'>{customer?.legal_record}</dd> <dd className='mt-1 text-base text-foreground'>{customer?.legal_record}</dd>
</div> </div>
<div> <div>
<dt className='text-sm font-medium text-muted-foreground'>Impuestos por Defecto</dt> <dt className='text-sm font-medium text-muted-foreground'>
Impuestos por Defecto
</dt>
<dd className='mt-1'> <dd className='mt-1'>
{customer?.default_taxes.map((tax) => ( {customer?.default_taxes.map((tax) => (<Badge key={tax} variant={"secondary"}>{tax}</Badge>))}
<Badge key={tax} variant={"secondary"}>
{tax}
</Badge>
))}
</dd> </dd>
</div> </div>
</CardContent> </CardContent>
@ -273,9 +259,15 @@ export const CustomerViewPage = () => {
<div className='flex items-start gap-3'> <div className='flex items-start gap-3'>
<Globe className='mt-0.5 h-4 w-4 text-muted-foreground' /> <Globe className='mt-0.5 h-4 w-4 text-muted-foreground' />
<div className='flex-1'> <div className='flex-1'>
<dt className='text-sm font-medium text-muted-foreground'>Sitio Web</dt> <dt className='text-sm font-medium text-muted-foreground'>
Sitio Web
</dt>
<dd className='mt-1 text-base text-primary hover:underline'> <dd className='mt-1 text-base text-primary hover:underline'>
<a href={customer?.website} target='_blank' rel='noopener noreferrer'> <a
href={customer?.website}
target='_blank'
rel='noopener noreferrer'
>
{customer?.website} {customer?.website}
</a> </a>
</dd> </dd>
@ -311,14 +303,18 @@ export const CustomerViewPage = () => {
<div className='flex items-start gap-3'> <div className='flex items-start gap-3'>
<Languages className='mt-0.5 h-4 w-4 text-muted-foreground' /> <Languages className='mt-0.5 h-4 w-4 text-muted-foreground' />
<div className='flex-1'> <div className='flex-1'>
<dt className='text-sm font-medium text-muted-foreground'>Idioma Preferido</dt> <dt className='text-sm font-medium text-muted-foreground'>
Idioma Preferido
</dt>
<dd className='mt-1 text-base text-foreground'>{customer?.language_code}</dd> <dd className='mt-1 text-base text-foreground'>{customer?.language_code}</dd>
</div> </div>
</div> </div>
<div className='flex items-start gap-3'> <div className='flex items-start gap-3'>
<Banknote className='mt-0.5 h-4 w-4 text-muted-foreground' /> <Banknote className='mt-0.5 h-4 w-4 text-muted-foreground' />
<div className='flex-1'> <div className='flex-1'>
<dt className='text-sm font-medium text-muted-foreground'>Moneda Preferida</dt> <dt className='text-sm font-medium text-muted-foreground'>
Moneda Preferida
</dt>
<dd className='mt-1 text-base text-foreground'>{customer?.currency_code}</dd> <dd className='mt-1 text-base text-foreground'>{customer?.currency_code}</dd>
</div> </div>
</div> </div>
@ -326,7 +322,7 @@ export const CustomerViewPage = () => {
</CardContent> </CardContent>
</Card> </Card>
</div> </div>
</AppContent> </AppContent >
</> </>
); );
}; };

View File

@ -1,3 +1,3 @@
export * from "./customer-resume.form.schema";
export * from "./customer.api.schema"; export * from "./customer.api.schema";
export * from "./customer.form.schema"; export * from "./customer.form.schema";
export * from "./customer-resume.form.schema";

View File

@ -1,6 +1,6 @@
{ {
"name": "@erp/doc-numbering", "name": "@erp/doc-numbering",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,
@ -13,14 +13,11 @@
"./api": "./src/api/index.ts" "./api": "./src/api/index.ts"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^19.1.0", "express": "^4.18.2",
"react-dom": "^19.1.0" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.21", "@types/express": "^4.17.21"
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.9.3"
}, },
"dependencies": { "dependencies": {
"@erp/auth": "workspace:*", "@erp/auth": "workspace:*",

View File

@ -1,6 +1,6 @@
{ {
"name": "@erp/verifactu", "name": "@erp/verifactu",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,
@ -14,14 +14,11 @@
"./common": "./src/common/index.ts" "./common": "./src/common/index.ts"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^19.1.0", "express": "^4.18.2",
"react-dom": "^19.1.0" "zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^4.17.21", "@types/express": "^4.17.21"
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.9.3"
}, },
"dependencies": { "dependencies": {
"@erp/auth": "workspace:*", "@erp/auth": "workspace:*",

View File

@ -1,11 +1,11 @@
import { authGuard, ExpressController, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api"; import { ExpressController, authGuard, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api";
import { SendInvoiceUseCase } from "@erp/customer-invoices/api/application"; import { SendInvoiceUseCase } from "@erp/customer-invoices/api/application";
export class SendInvoiceVerifactuController extends ExpressController { export class SendInvoiceVerifactuController extends ExpressController {
public constructor(private readonly useCase: SendInvoiceUseCase) { public constructor(private readonly useCase: SendInvoiceUseCase) {
super(); super();
// 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query // 🔐 Reutiliza guards de auth/tenant y prohíbe 'companyId' en query
this.registerGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId"));
} }
protected async executeImpl() { protected async executeImpl() {

View File

@ -1,6 +1,6 @@
{ {
"name": "@repo/rdx-criteria", "name": "@repo/rdx-criteria",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,

View File

@ -1,6 +1,6 @@
{ {
"name": "@repo/rdx-ddd", "name": "@repo/rdx-ddd",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,

View File

@ -1,6 +1,6 @@
{ {
"name": "@repo/rdx-logger", "name": "@repo/rdx-logger",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,

View File

@ -18,8 +18,13 @@
] ]
}, },
"peerDependencies": { "peerDependencies": {
"date-fns": "^4.1.0",
"i18next": "^25.1.1",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0" "react-dom": "^19.1.0",
"react-hook-form": "^7.58.1",
"typescript": "^5.9.3",
"zod": "^4.1.11"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.3.1", "@biomejs/biome": "^2.3.1",
@ -32,9 +37,6 @@
"@vitejs/plugin-react": "^4.4.1", "@vitejs/plugin-react": "^4.4.1",
"esbuild-plugin-react18": "^0.2.6", "esbuild-plugin-react18": "^0.2.6",
"esbuild-plugin-react18-css": "^0.0.4", "esbuild-plugin-react18-css": "^0.0.4",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.6.0",
"tailwindcss": "^4.1.5", "tailwindcss": "^4.1.5",
"tsup": "^8.4.0", "tsup": "^8.4.0",
"tw-animate-css": "^1.2.9", "tw-animate-css": "^1.2.9",

View File

@ -1,6 +1,6 @@
{ {
"name": "@repo/rdx-utils", "name": "@repo/rdx-utils",
"version": "0.0.5", "version": "0.0.4",
"private": true, "private": true,
"type": "module", "type": "module",
"sideEffects": false, "sideEffects": false,

View File

@ -20,8 +20,10 @@
"ui:add": "pnpm dlx shadcn@latest add" "ui:add": "pnpm dlx shadcn@latest add"
}, },
"peerDependencies": { "peerDependencies": {
"lucide-react": "^0.503.0",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0" "react-dom": "^19.1.0",
"typescript": "^5.9.3"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.3.1", "@biomejs/biome": "^2.3.1",
@ -31,11 +33,7 @@
"@types/node": "^22.15.12", "@types/node": "^22.15.12",
"@types/react": "^19.1.2", "@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3", "@types/react-dom": "^19.1.3",
"postcss": "^8.5.3", "postcss": "^8.5.3"
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.6.0",
"tailwindcss": "^4.1.5"
}, },
"dependencies": { "dependencies": {
"@hookform/resolvers": "^5.2.2", "@hookform/resolvers": "^5.2.2",
@ -77,12 +75,15 @@
"lucide-react": "^0.503.0", "lucide-react": "^0.503.0",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"pnpm": "^10.10.0", "pnpm": "^10.10.0",
"react": "^19.1.0",
"react-day-picker": "9.11.1", "react-day-picker": "9.11.1",
"react-dom": "^19.1.0",
"react-hook-form": "^7.65.0", "react-hook-form": "^7.65.0",
"react-resizable-panels": "^3.0.6", "react-resizable-panels": "^3.0.6",
"recharts": "^2.15.4", "recharts": "^2.15.4",
"sonner": "^2.0.7", "sonner": "^2.0.7",
"tailwind-merge": "^3.2.0", "tailwind-merge": "^3.2.0",
"tailwindcss": "^4.1.5",
"tw-animate-css": "^1.2.9", "tw-animate-css": "^1.2.9",
"vaul": "^1.1.2", "vaul": "^1.1.2",
"zod": "^3.25.76" "zod": "^3.25.76"

View File

@ -1,5 +1,3 @@
"use client"
import * as React from "react" import * as React from "react"
import * as SeparatorPrimitive from "@radix-ui/react-separator" import * as SeparatorPrimitive from "@radix-ui/react-separator"

View File

@ -1,6 +1,5 @@
{ {
"$schema": "https://json.schemastore.org/tsconfig", "$schema": "https://json.schemastore.org/tsconfig",
"display": "Default",
"compilerOptions": { "compilerOptions": {
"composite": false, "composite": false,
"declaration": true, "declaration": true,
@ -9,18 +8,13 @@
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"inlineSources": false, "inlineSources": false,
"isolatedModules": true, "isolatedModules": true,
"incremental": false,
"lib": ["es2022", "DOM", "DOM.Iterable"],
"module": "NodeNext", "module": "NodeNext",
"moduleResolution": "NodeNext", "moduleResolution": "NodeNext",
"noUnusedLocals": false, "noUnusedLocals": false,
"noUnusedParameters": false, "noUnusedParameters": false,
"preserveWatchOutput": true, "preserveWatchOutput": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true, "strict": true
"moduleDetection": "force", },
"noUncheckedIndexedAccess": true, "exclude": ["node_modules"]
"resolveJsonModule": true,
"target": "ES2022"
}
} }

View File

@ -1,16 +1,16 @@
{ {
"extends": "./base.json", "extends": "./base.json",
"compilerOptions": { "compilerOptions": {
"target": "ESNext", "target": "ESNext",
"useDefineForClassFields": true, "useDefineForClassFields": true,
"module": "ESNext", "module": "ESNext",
"lib": ["ESNext", "DOM"], "lib": ["ESNext", "DOM"],
"sourceMap": true, "sourceMap": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"noEmit": true, "noEmit": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"noImplicitReturns": true "noImplicitReturns": true
}, },
"exclude": ["node_modules"] "exclude": ["node_modules"]
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
SCRIPT_VERSION="1.0.5" SCRIPT_VERSION="1.0.4"
# ===================================================== # =====================================================
# FACTUGES Build Script # FACTUGES Build Script