Modulo makers3d desarrollado con codex V 0.0.1

This commit is contained in:
Ryuk Mike
2026-07-29 23:58:58 +02:00
commit 2bedf7cbb7
171 changed files with 29421 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
{
"name": "@makers3d/shared",
"version": "0.1.0",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"scripts": {
"build": "tsc -p tsconfig.json",
"test": "node --import tsx --test src/**/*.test.ts",
"typecheck": "tsc -p tsconfig.json --noEmit"
}
}
+4
View File
@@ -0,0 +1,4 @@
export * from "./lib/catalogs.js";
export * from "./lib/maker.js";
export * from "./lib/types.js";
+27
View File
@@ -0,0 +1,27 @@
export const serviceCategories = [
"Impresion FDM",
"Impresion Resina",
"Diseno 3D",
"Escaneo 3D",
"Prototipado",
"Produccion corta"
] as const;
export const materialOptions = [
"PLA",
"PETG",
"ABS",
"TPU",
"Resina estandar",
"Resina alta definicion",
"Nylon"
] as const;
export const provinceOptions = [
"Buenos Aires",
"CABA",
"Cordoba",
"Santa Fe",
"Mendoza"
] as const;
+31
View File
@@ -0,0 +1,31 @@
import test from "node:test";
import assert from "node:assert/strict";
import { buildPublishChecklist, isPublishReady, maskCoordinates, slugify } from "./maker.js";
test("slugify crea slugs sencillos", () => {
assert.equal(slugify("Maker Córdoba 3D"), "maker-cordoba-3d");
});
test("maskCoordinates protege precision", () => {
assert.deepEqual(maskCoordinates(-34.603722, -58.381592), {
latitude: -34.6,
longitude: -58.38
});
});
test("isPublishReady solo devuelve true si todo esta completo", () => {
const checklist = buildPublishChecklist({
businessName: "Maker Demo",
description: "Servicio",
province: "CABA",
city: "Buenos Aires",
servicesCount: 1,
worksCount: 1,
publicContactEmail: "demo@maker.com",
subscriptionStatus: "active"
});
assert.equal(isPublishReady(checklist), true);
});
+45
View File
@@ -0,0 +1,45 @@
import type { PublishChecklist } from "./types.js";
export function slugify(value: string): string {
return value
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.toLowerCase()
.trim()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-+|-+$/g, "")
.slice(0, 60);
}
export function maskCoordinates(latitude: number, longitude: number): { latitude: number; longitude: number } {
const roundedLat = Number(latitude.toFixed(2));
const roundedLng = Number(longitude.toFixed(2));
return { latitude: roundedLat, longitude: roundedLng };
}
export function buildPublishChecklist(input: {
businessName?: string | null;
description?: string | null;
province?: string | null;
city?: string | null;
servicesCount: number;
worksCount: number;
publicContactEmail?: string | null;
publicWhatsapp?: string | null;
subscriptionStatus?: string | null;
}): PublishChecklist {
return {
hasBusinessName: Boolean(input.businessName?.trim()),
hasDescription: Boolean(input.description?.trim()),
hasLocation: Boolean(input.province?.trim() && input.city?.trim()),
hasService: input.servicesCount > 0,
hasWork: input.worksCount > 0,
hasContact: Boolean(input.publicContactEmail?.trim() || input.publicWhatsapp?.trim()),
hasSubscription: input.subscriptionStatus === "active"
};
}
export function isPublishReady(checklist: PublishChecklist): boolean {
return Object.values(checklist).every(Boolean);
}
+15
View File
@@ -0,0 +1,15 @@
export type MakerStatus = "draft" | "published" | "suspended";
export type Availability = "available" | "limited" | "unavailable";
export type InquiryStatus = "open" | "rejected" | "completed";
export type SubscriptionStatus = "inactive" | "pending" | "active" | "grace" | "cancelled";
export type PublishChecklist = {
hasBusinessName: boolean;
hasDescription: boolean;
hasLocation: boolean;
hasService: boolean;
hasWork: boolean;
hasContact: boolean;
hasSubscription: boolean;
};
+10
View File
@@ -0,0 +1,10 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src",
"declaration": true
},
"include": ["src/**/*.ts"]
}