@jysperu/schema-direccion 1.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 JYS Perú
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,403 @@
1
+ # @jysperu/schema-direccion
2
+
3
+ [![npm version](https://badge.fury.io/js/@jysperu%2Fschema-direccion.svg)](https://badge.fury.io/js/@jysperu%2Fschema-direccion)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@jysperu/schema-direccion)](https://www.npmjs.com/package/@jysperu/schema-direccion)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
7
+ [![Node.js](https://img.shields.io/badge/Node.js-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
8
+ [![MongoDB](https://img.shields.io/badge/MongoDB-47A248?logo=mongodb&logoColor=white)](https://www.mongodb.com/)
9
+ [![Joi](https://img.shields.io/badge/Joi-FF6B6B?logo=joi&logoColor=white)](https://joi.dev/)
10
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@jysperu/schema-direccion)](https://bundlephobia.com/package/@jysperu/schema-direccion)
11
+
12
+ Esquemas para direcciones con soporte para **Mongoose**, **JSON Schema** y **Joi**.
13
+
14
+ ## 🚀 Características
15
+
16
+ - 🏠 **Validación** de direcciones
17
+ - 🌍 **Soporte** para direcciones de Perú y otros países
18
+ - 🔧 **Desglose** automático de componentes de dirección
19
+ - 🏷️ **Clasificaciones** del tipo de dirección (Trabajo, Personal, etc.)
20
+ - ✅ **Estados** de validación y verificación
21
+ - 📍 **Coordenadas** GPS y ubigeo
22
+ - 🗺️ **División política** (departamento, provincia, distrito)
23
+
24
+ ## 📦 Instalación
25
+
26
+ ```bash
27
+ npm install @jysperu/schema-direccion
28
+ ```
29
+
30
+ ## ⚡ Inicio Rápido
31
+
32
+ ```typescript
33
+ import { MongoSchemaDireccion, JsonSchemaDireccion, JoiSchemaDireccion } from "@jysperu/schema-direccion";
34
+ import { IDireccion, ClasificacionDireccion } from "@jysperu/schema-direccion";
35
+
36
+ // Mongoose
37
+ const PersonaSchema = new Schema({
38
+ direcciones: [MongoSchemaDireccion],
39
+ });
40
+
41
+ // Joi Validation
42
+ const { error, value } = JoiSchemaDireccion.validate({
43
+ direccion_completa: "Av. Javier Prado Este 123, San Isidro, Lima",
44
+ tipo: "Personal",
45
+ pais: "Perú",
46
+ valida: true,
47
+ });
48
+
49
+ // JSON Schema
50
+ const validate = ajv.compile(JsonSchemaDireccion);
51
+ const isValid = validate(direccionData);
52
+ ```
53
+
54
+ ## 📚 Esquemas Disponibles
55
+
56
+ ### 1. 🍃 Mongoose Schema
57
+
58
+ ```typescript
59
+ import { MongoSchemaDireccion, IDireccion } from "@jysperu/schema-direccion";
60
+ import { Schema, model, Document } from "mongoose";
61
+
62
+ interface IPersona extends Document {
63
+ nombres: string;
64
+ direcciones: IDireccion[];
65
+ }
66
+
67
+ const PersonaSchema = new Schema<IPersona>({
68
+ nombres: { type: String, required: true },
69
+ direcciones: [MongoSchemaDireccion], // Array de direcciones
70
+ });
71
+
72
+ const PersonaModel = model<IPersona>("Persona", PersonaSchema);
73
+ ```
74
+
75
+ ### 2. 📋 JSON Schema
76
+
77
+ ```typescript
78
+ import { JsonSchemaDireccion } from "@jysperu/schema-direccion";
79
+ import Ajv from "ajv";
80
+
81
+ const ajv = new Ajv();
82
+ const validate = ajv.compile(JsonSchemaDireccion);
83
+
84
+ const direccion = {
85
+ direccion_completa: "Av. Javier Prado Este 123, San Isidro, Lima",
86
+ tipo: "Personal",
87
+ pais: "Perú",
88
+ departamento: "Lima",
89
+ provincia: "Lima",
90
+ distrito: "San Isidro",
91
+ valida: true,
92
+ };
93
+
94
+ const valid = validate(direccion);
95
+ if (!valid) console.log(validate.errors);
96
+ ```
97
+
98
+ ### 3. ✅ Joi Schema
99
+
100
+ ```typescript
101
+ import { JoiSchemaDireccion } from "@jysperu/schema-direccion";
102
+
103
+ // Validación individual
104
+ const { error, value } = JoiSchemaDireccion.validate({
105
+ direccion_completa: "Av. Arequipa 1234, Lince, Lima",
106
+ tipo: "Personal",
107
+ pais: "Perú",
108
+ departamento: "Lima",
109
+ valida: true,
110
+ });
111
+
112
+ if (error) {
113
+ error.details.forEach((err) => console.log(`❌ ${err.path}: ${err.message}`));
114
+ }
115
+
116
+ // Para arrays de direcciones
117
+ import Joi from "@jysperu/joi-spanish";
118
+
119
+ const personaSchema = Joi.object({
120
+ nombres: Joi.string().required(),
121
+ direcciones: Joi.array().items(JoiSchemaDireccion).default([]),
122
+ });
123
+ ```
124
+
125
+ ## 🛠️ Casos de Uso Avanzados
126
+
127
+ ### Crear persona con múltiples direcciones
128
+
129
+ ```typescript
130
+ import { MongoSchemaDireccion, IDireccion, ClasificacionDireccion } from "@jysperu/schema-direccion";
131
+
132
+ const persona = new PersonaModel({
133
+ nombres: "Ana García",
134
+ direcciones: [
135
+ {
136
+ direccion_completa: "Av. Javier Prado Este 4200, Surquillo, Lima",
137
+ tipo: ClasificacionDireccion.TRABAJO,
138
+ pais: "Perú",
139
+ pais_code: "PE",
140
+ departamento: "Lima",
141
+ provincia: "Lima",
142
+ distrito: "Surquillo",
143
+ via_tipo: "Avenida",
144
+ via_nombre: "Javier Prado Este",
145
+ nro: "4200",
146
+ valida: true,
147
+ verificada: true,
148
+ },
149
+ {
150
+ direccion_completa: "Jr. Los Olivos 123, Miraflores, Lima",
151
+ tipo: ClasificacionDireccion.PERSONAL,
152
+ pais: "Perú",
153
+ pais_code: "PE",
154
+ departamento: "Lima",
155
+ provincia: "Lima",
156
+ distrito: "Miraflores",
157
+ via_tipo: "Jirón",
158
+ via_nombre: "Los Olivos",
159
+ nro: "123",
160
+ valida: true,
161
+ },
162
+ ],
163
+ });
164
+
165
+ await persona.save();
166
+ ```
167
+
168
+ ### Operaciones con direcciones
169
+
170
+ ```typescript
171
+ // Buscar direcciones verificadas
172
+ const direccionesVerificadas = persona.direcciones.filter((direccion) => direccion.verificada);
173
+
174
+ // Encontrar direcciones de trabajo
175
+ const direccionesDeTrabajo = persona.direcciones.filter((direccion) => direccion.tipo === ClasificacionDireccion.TRABAJO);
176
+
177
+ // Agregar nueva dirección
178
+ persona.direcciones.push({
179
+ direccion_completa: "Calle Las Flores 456, Barranco, Lima",
180
+ tipo: "Secundaria",
181
+ pais: "Perú",
182
+ pais_code: "PE",
183
+ departamento: "Lima",
184
+ provincia: "Lima",
185
+ distrito: "Barranco",
186
+ valida: true,
187
+ });
188
+
189
+ await persona.save();
190
+ ```
191
+
192
+ ## 📊 Esquema de Datos
193
+
194
+ ### ✅ Campo Obligatorio (Al menos uno)
195
+
196
+ | Campo | Tipo | Validación | Descripción |
197
+ | -------------------- | -------- | ------------- | ----------- | ------------------------------------ |
198
+ | `direccion_completa` | `String` | Max 500 chars | - | Dirección completa formateada |
199
+ | `direccion_simple` | `String` | Max 300 chars | - | Versión simplificada de la dirección |
200
+ | `direccion` | `String` | Max 300 chars | - | Dirección principal o calle |
201
+
202
+ ### ⚙️ Campos Opcionales
203
+
204
+ | Campo | Tipo | Validación/Enum | Defecto | Descripción |
205
+ | -------------- | --------- | ------------------------------------ | ------------------- | ---------------------------------- |
206
+ | `tipo` | `String` | Min 1 char, personalizable | "Trabajo" | Clasificación (Trabajo/Personal) |
207
+ | `via_tipo` | `String` | Max 20 chars, lowercase | - | Tipo de vía (calle, avenida, etc.) |
208
+ | `via_nombre` | `String` | Max 150 chars, lowercase | - | Nombre de la vía |
209
+ | `nro` | `String` | Max 10 chars | - | Número de la dirección |
210
+ | `pais` | `String` | Required, trim, max 100 | Nombre del país |
211
+ | `pais_code` | `String` | Required, trim, 2-3 chars, uppercase | Código ISO del país |
212
+ | `departamento` | `String` | Max 100 chars | - | Departamento o estado |
213
+ | `provincia` | `String` | Max 100 chars | - | Provincia o región |
214
+ | `distrito` | `String` | Max 100 chars | - | Distrito o municipio |
215
+ | `ubigeo` | `String` | 6 dígitos | - | Código ubigeo de 6 dígitos |
216
+ | `gps` | `String` | Formato lat,lng | - | Coordenadas GPS |
217
+ | `valida` | `Boolean` | true/false | false | Formato de dirección válido |
218
+ | `verificada` | `Boolean` | true/false | false | Dirección verificada físicamente |
219
+
220
+ ### 🏷️ Clasificaciones de Direcciones
221
+
222
+ ```typescript
223
+ enum ClasificacionDireccion {
224
+ TRABAJO = "Trabajo", // 🏢 Dirección laboral
225
+ PERSONAL = "Personal", // 👤 Dirección personal
226
+ }
227
+ ```
228
+
229
+ ## 💡 Ejemplos de Datos
230
+
231
+ ### 🏠 Dirección Personal (Completa)
232
+
233
+ ```typescript
234
+ const direccionCompleta: IDireccion = {
235
+ direccion_completa: "Av. Javier Prado Este 123, Dpto. 501, San Isidro, Lima",
236
+ tipo: "Personal",
237
+ pais: "Perú",
238
+ pais_code: "PE",
239
+ continente: "América del Sur",
240
+ direccion: "Av. Javier Prado Este 123, Dpto. 501",
241
+ via_tipo: "Avenida",
242
+ via_nombre: "Javier Prado Este",
243
+ nro: "123",
244
+ interior: "Dpto. 501",
245
+ departamento: "Lima",
246
+ provincia: "Lima",
247
+ distrito: "San Isidro",
248
+ ubigeo: "150130",
249
+ gps: "-12.0964,-77.0428",
250
+ valida: true,
251
+ verificada: true,
252
+ };
253
+ ```
254
+
255
+ ### 🏢 Dirección de Trabajo
256
+
257
+ ```typescript
258
+ const direccionTrabajo: IDireccion = {
259
+ direccion_completa: "Av. El Sol 456, Piso 8, Oficina 802, Miraflores, Lima",
260
+ tipo: "Trabajo",
261
+ pais: "Perú",
262
+ pais_code: "PE",
263
+ direccion: "Av. El Sol 456",
264
+ via_tipo: "Avenida",
265
+ via_nombre: "El Sol",
266
+ nro: "456",
267
+ interior: "Piso 8, Oficina 802",
268
+ departamento: "Lima",
269
+ provincia: "Lima",
270
+ distrito: "Miraflores",
271
+ ubigeo: "150122",
272
+ valida: true,
273
+ verificada: false,
274
+ };
275
+ ```
276
+
277
+ ### 🏪 Dirección Comercial
278
+
279
+ ```typescript
280
+ const direccionComercial: IDireccion = {
281
+ direccion_completa: "Jr. Unión 789, Local 12, Cercado de Lima, Lima",
282
+ tipo: "Comercial",
283
+ pais: "Perú",
284
+ pais_code: "PE",
285
+ direccion: "Jr. Unión 789",
286
+ via_tipo: "Jirón",
287
+ via_nombre: "Unión",
288
+ nro: "789",
289
+ interior: "Local 12",
290
+ departamento: "Lima",
291
+ provincia: "Lima",
292
+ distrito: "Cercado de Lima",
293
+ ubigeo: "150101",
294
+ valida: true,
295
+ verificada: false,
296
+ };
297
+ ```
298
+
299
+ ### 🏫 Dirección Educativa
300
+
301
+ ```typescript
302
+ const direccionEducativa: IDireccion = {
303
+ direccion_completa: "Av. Universitaria 1801, San Martín de Porres, Lima",
304
+ tipo: "Educativo",
305
+ pais: "Perú",
306
+ pais_code: "PE",
307
+ direccion: "Av. Universitaria 1801",
308
+ via_tipo: "Avenida",
309
+ via_nombre: "Universitaria",
310
+ nro: "1801",
311
+ departamento: "Lima",
312
+ provincia: "Lima",
313
+ distrito: "San Martín de Porres",
314
+ ubigeo: "150132",
315
+ valida: true,
316
+ verificada: true,
317
+ };
318
+ ```
319
+
320
+ ## 🔧 Configuración del Esquema
321
+
322
+ ```typescript
323
+ // Configuración Mongoose
324
+ {
325
+ strict: false, // Permite campos adicionales
326
+ timestamps: true, // createdAt, updatedAt automáticos
327
+ _id: true // Cada correo tiene su propio ID
328
+ }
329
+
330
+ // Configuración Joi
331
+ {
332
+ stripUnknown: false, // Mantiene campos extra
333
+ allowUnknown: true, // Permite propiedades no definidas
334
+ convert: true, // Conversión automática de tipos
335
+ abortEarly: false // Muestra todos los errores
336
+ }
337
+ ```
338
+
339
+ ## 📋 JSON Schema Standalone
340
+
341
+ El archivo `direccion.schema.json` se genera automáticamente en cada build:
342
+
343
+ ```bash
344
+ # Usar direccion.schema.json directamente
345
+ curl -O https://gitlab.com/tiny.node/schema/direccion/-/raw/main/dist/direccion.schema.json
346
+
347
+ # Validar con cualquier validador JSON Schema
348
+ cat data.json | ajv validate -s direccion.schema.json
349
+ ```
350
+
351
+ ## 🧪 Testing y Validación
352
+
353
+ ```typescript
354
+ // Test básico con Joi
355
+ import { JoiSchemaDireccion } from "@jysperu/schema-direccion";
356
+
357
+ const testCases = [
358
+ { direccion_completa: "Av. Arequipa 123, Lima", pais: "Perú", pais_code: "PE", valid: true },
359
+ { direccion_completa: "", valid: false }, // Vacío
360
+ { pais: "", valid: false }, // Sin país
361
+ { pais_code: "X", valid: false }, // Código inválido
362
+ ];
363
+
364
+ testCases.forEach((test) => {
365
+ const result = JoiSchemaDireccion.validate(test);
366
+ console.log(`${test.direccion_completa || "Vacío"}: ${result.error ? "❌" : "✅"}`);
367
+ });
368
+ ```
369
+
370
+ ## 📦 Build y Distribución
371
+
372
+ ```bash
373
+ # Construir el proyecto
374
+ npm run build
375
+
376
+ # Genera automáticamente:
377
+ # └── dist/
378
+ # ├── direccion.es.js # ESM
379
+ # ├── direccion.cjs.js # CommonJS
380
+ # ├── direccion.umd.js # UMD
381
+ # ├── *.d.ts # TypeScript definitions
382
+ # └── direccion.schema.json # JSON Schema
383
+ ```
384
+
385
+ ## 🔗 Enlaces y Recursos
386
+
387
+ - 📘 **Repositorio**: [GitLab - schema-direccion](https://gitlab.com/tiny.node/schema/direccion)
388
+ - 🐛 **Issues**: [Reportar problemas](https://gitlab.com/tiny.node/schema/direccion/issues)
389
+ - 📦 **npm**: [@jysperu/schema-direccion](https://www.npmjs.com/package/@jysperu/schema-direccion)
390
+ - 📚 **Documentación Joi**: [@jysperu/joi-spanish](https://www.npmjs.com/package/@jysperu/joi-spanish)
391
+ - 🏢 **JYS Perú**: [www.jys.pe](https://www.jys.pe)
392
+
393
+ ## 📄 Licencia
394
+
395
+ **MIT License** - Consulta el archivo [LICENSE](./LICENSE) para detalles completos.
396
+
397
+ ```text
398
+ MIT License - Copyright (c) 2025 JYS Perú
399
+ ```
400
+
401
+ ---
402
+
403
+ Desarrollado con ❤️ por [**JYS Perú**](https://www.jys.pe)
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});var r=require("mongoose"),e=require("@jysperu/joi-spanish"),i=(e=>(e.TRABAJO="Trabajo",e.PERSONAL="Personal",e))(i||{});let t=new r.Schema({direccion_completa:{type:String,trim:!0,maxlength:[500,"La dirección completa es demasiado larga"],comment:"Dirección completa formateada para mostrar"},direccion_simple:{type:String,trim:!0,maxlength:[300,"La dirección simple es demasiado larga"],comment:"Versión simplificada de la dirección"},tipo:{type:String,default:"Trabajo",validate:{validator:function(e){return"string"==typeof e&&0<e.trim().length},message:"El tipo debe ser un texto no vacío. Valores sugeridos: "+Object.values(i).join(", ")},comment:"Tipo de dirección: trabajo, personal, comercial, etc."},pais:{type:String,default:"Perú",trim:!0,maxlength:[100,"El nombre del país es demasiado largo"]},pais_code:{type:String,default:"PE",uppercase:!0,trim:!0,minlength:[2,"El código del país debe tener al menos 2 caracteres"],maxlength:[3,"El código del país no puede tener más de 3 caracteres"]},continente:{type:String,default:"América del Sur",trim:!0,maxlength:[50,"El nombre del continente es demasiado largo"]},direccion:{type:String,trim:!0,maxlength:[300,"La dirección es demasiado larga"],comment:"Dirección principal o calle"},via_tipo:{type:String,trim:!0,maxlength:[20,"El tipo de vía es demasiado largo"],comment:"Tipo de vía: calle, avenida, jirón, etc."},via_nombre:{type:String,trim:!0,maxlength:[150,"El nombre de la vía es demasiado largo"],comment:"Nombre de la calle o avenida"},mz:{type:String,trim:!0,maxlength:[10,"La manzana es demasiado larga"],comment:"Manzana"},lt:{type:String,trim:!0,maxlength:[10,"El lote es demasiado largo"],comment:"Lote"},nro:{type:String,trim:!0,maxlength:[10,"El número es demasiado largo"],comment:"Número de la dirección"},interior:{type:String,trim:!0,maxlength:[20,"El interior es demasiado largo"],comment:"Departamento, oficina o interior"},urbanizacion:{type:String,trim:!0,maxlength:[150,"La urbanización es demasiado larga"],comment:"Urbanización, sector o zona"},referencia:{type:String,trim:!0,maxlength:[300,"La referencia es demasiado larga"],comment:"Referencia adicional para ubicar la dirección"},departamento:{type:String,trim:!0,maxlength:[100,"El departamento es demasiado largo"],comment:"Departamento o estado"},provincia:{type:String,trim:!0,maxlength:[100,"La provincia es demasiado larga"],comment:"Provincia o región"},distrito:{type:String,trim:!0,maxlength:[100,"El distrito es demasiado largo"],comment:"Distrito o municipio"},ubigeo:{type:String,trim:!0,validate:{validator:function(e){return!e||/^\d{6}$/.test(e)},message:"El ubigeo debe tener 6 dígitos"},comment:"Código ubigeo de 6 dígitos"},codigo_postal:{type:String,trim:!0,maxlength:[20,"El código postal es demasiado largo"],comment:"Código postal o ZIP"},gps:{type:String,trim:!0,validate:{validator:function(e){return!e||/^-?\d+\.?\d*,-?\d+\.?\d*$/.test(e.replace(/\s/g,""))},message:"Las coordenadas GPS deben estar en formato 'latitud,longitud'"},comment:"Coordenadas GPS en formato 'latitud,longitud'"},valida:{type:Boolean,default:!1,comment:"Indica si la dirección tiene un formato válido"},verificada:{type:Boolean,default:!1,comment:"Indica si la dirección ha sido verificada físicamente"}},{strict:!1,timestamps:!0}),n=e.object({direccion_completa:e.string().trim().max(500).messages({"string.max":"La dirección completa es demasiado larga"}),direccion_simple:e.string().trim().max(300).messages({"string.max":"La dirección simple es demasiado larga"}),tipo:e.string().trim().min(1).default("Trabajo").messages({"string.empty":"El tipo debe ser un texto no vacío","string.min":"El tipo debe ser un texto no vacío"}),pais:e.string().trim().max(100).default("Perú").messages({"string.max":"El nombre del país es demasiado largo"}),pais_code:e.string().trim().uppercase().min(2).max(3).default("PE").messages({"string.min":"El código del país debe tener al menos 2 caracteres","string.max":"El código del país no puede tener más de 3 caracteres"}),continente:e.string().trim().max(50).default("América del Sur").messages({"string.max":"El nombre del continente es demasiado largo"}),direccion:e.string().trim().max(300).messages({"string.max":"La dirección es demasiado larga"}),via_tipo:e.string().trim().max(20).messages({"string.max":"El tipo de vía es demasiado largo"}),via_nombre:e.string().trim().max(150).messages({"string.max":"El nombre de la vía es demasiado largo"}),mz:e.string().trim().max(10).messages({"string.max":"La manzana es demasiado larga"}),lt:e.string().trim().max(10).messages({"string.max":"El lote es demasiado largo"}),nro:e.string().trim().max(10).messages({"string.max":"El número es demasiado largo"}),interior:e.string().trim().max(20).messages({"string.max":"El interior es demasiado largo"}),urbanizacion:e.string().trim().max(150).messages({"string.max":"La urbanización es demasiado larga"}),referencia:e.string().trim().max(300).messages({"string.max":"La referencia es demasiado larga"}),departamento:e.string().trim().max(100).messages({"string.max":"El departamento es demasiado largo"}),provincia:e.string().trim().max(100).messages({"string.max":"La provincia es demasiado larga"}),distrito:e.string().trim().max(100).messages({"string.max":"El distrito es demasiado largo"}),ubigeo:e.string().trim().pattern(/^\d{6}$/).messages({"string.pattern.base":"El ubigeo debe tener 6 dígitos"}),codigo_postal:e.string().trim().max(20).messages({"string.max":"El código postal es demasiado largo"}),gps:e.string().trim().pattern(/^-?\d+\.?\d*,-?\d+\.?\d*$/).messages({"string.pattern.base":"Las coordenadas GPS deben estar en formato 'latitud,longitud'"}),valida:e.boolean().default(!1),verificada:e.boolean().default(!1)}).options({stripUnknown:!1,allowUnknown:!0}).or("direccion_completa","direccion_simple","direccion").messages({"object.missing":"Debe proporcionar una dirección válida"}),o={$schema:"http://json-schema.org/draft-07/schema#",type:"object",properties:{direccion_completa:{type:"string",maxLength:500,description:"Dirección completa formateada para mostrar"},direccion_simple:{type:"string",maxLength:300,description:"Versión simplificada de la dirección"},tipo:{type:"string",minLength:1,default:"Trabajo",enum:Object.values(i),description:"Tipo de dirección: trabajo, personal, comercial, etc."},pais:{type:"string",maxLength:100,default:"Perú",description:"Nombre del país"},pais_code:{type:"string",minLength:2,maxLength:3,default:"PE",pattern:"^[A-Z]{2,3}$",description:"Código ISO del país"},continente:{type:"string",maxLength:50,default:"América del Sur",description:"Nombre del continente"},direccion:{type:"string",maxLength:300,description:"Dirección principal o calle"},via_tipo:{type:"string",maxLength:20,description:"Tipo de vía: calle, avenida, jirón, etc."},via_nombre:{type:"string",maxLength:150,description:"Nombre de la calle o avenida"},mz:{type:"string",maxLength:10,description:"Manzana"},lt:{type:"string",maxLength:10,description:"Lote"},nro:{type:"string",maxLength:10,description:"Número de la dirección"},interior:{type:"string",maxLength:20,description:"Departamento, oficina o interior"},urbanizacion:{type:"string",maxLength:150,description:"Urbanización, sector o zona"},referencia:{type:"string",maxLength:300,description:"Referencia adicional para ubicar la dirección"},departamento:{type:"string",maxLength:100,description:"Departamento o estado"},provincia:{type:"string",maxLength:100,description:"Provincia o región"},distrito:{type:"string",maxLength:100,description:"Distrito o municipio"},ubigeo:{type:"string",pattern:"^\\d{6}$",description:"Código ubigeo de 6 dígitos"},codigo_postal:{type:"string",maxLength:20,description:"Código postal o ZIP"},gps:{type:"string",pattern:"^-?\\d+\\.?\\d*,-?\\d+\\.?\\d*$",description:"Coordenadas GPS en formato 'latitud,longitud'"},valida:{type:"boolean",default:!1,description:"Indica si la dirección tiene un formato válido"},verificada:{type:"boolean",default:!1,description:"Indica si la dirección ha sido verificada físicamente"}},anyOf:[{required:["direccion_completa"]},{required:["direccion_simple"]},{required:["direccion"]}],additionalProperties:!0,title:"Dirección",description:"Esquema para direcciones postales",errorMessage:{anyOf:"Debe proporcionar al menos uno de estos campos: direccion_completa, direccion_simple o direccion"}};exports.ClasificacionDireccion=i,exports.JoiSchemaDireccion=n,exports.JsonSchemaDireccion=o,exports.MongoSchemaDireccion=t,exports.default=t;
@@ -0,0 +1,193 @@
1
+ import { Schema } from 'mongoose';
2
+ import { default as Joi } from '@jysperu/joi-spanish';
3
+ export declare enum ClasificacionDireccion {
4
+ TRABAJO = "Trabajo",
5
+ PERSONAL = "Personal"
6
+ }
7
+ export interface IDireccion {
8
+ direccion_completa?: string;
9
+ direccion_simple?: string;
10
+ tipo?: string;
11
+ pais?: string;
12
+ pais_code?: string;
13
+ continente?: string;
14
+ direccion?: string;
15
+ via_tipo?: string;
16
+ via_nombre?: string;
17
+ mz?: string;
18
+ lt?: string;
19
+ nro?: string;
20
+ interior?: string;
21
+ urbanizacion?: string;
22
+ referencia?: string;
23
+ departamento?: string;
24
+ provincia?: string;
25
+ distrito?: string;
26
+ ubigeo?: string;
27
+ codigo_postal?: string;
28
+ gps?: string;
29
+ valida?: boolean;
30
+ verificada?: boolean;
31
+ }
32
+ /**
33
+ * Esquema de Mongoose para direcciones
34
+ */
35
+ export declare const MongoSchemaDireccion: Schema<IDireccion, import('mongoose').Model<IDireccion, any, any, any, import('mongoose').Document<unknown, any, IDireccion, any, {}> & IDireccion & {
36
+ _id: import("mongoose").Types.ObjectId;
37
+ } & {
38
+ __v: number;
39
+ }, any>, {}, {}, {}, {}, import('mongoose').DefaultSchemaOptions, IDireccion, import('mongoose').Document<unknown, {}, import('mongoose').FlatRecord<IDireccion>, {}, import('mongoose').ResolveSchemaOptions<import('mongoose').DefaultSchemaOptions>> & import('mongoose').FlatRecord<IDireccion> & {
40
+ _id: import("mongoose").Types.ObjectId;
41
+ } & {
42
+ __v: number;
43
+ }>;
44
+ export default MongoSchemaDireccion;
45
+ /**
46
+ * Joi Schema para validación de direcciones
47
+ */
48
+ export declare const JoiSchemaDireccion: Joi.ObjectSchema<any>;
49
+ /**
50
+ * JSON Schema para validación de direcciones
51
+ */
52
+ export declare const JsonSchemaDireccion: {
53
+ readonly $schema: "http://json-schema.org/draft-07/schema#";
54
+ readonly type: "object";
55
+ readonly properties: {
56
+ readonly direccion_completa: {
57
+ readonly type: "string";
58
+ readonly maxLength: 500;
59
+ readonly description: "Dirección completa formateada para mostrar";
60
+ };
61
+ readonly direccion_simple: {
62
+ readonly type: "string";
63
+ readonly maxLength: 300;
64
+ readonly description: "Versión simplificada de la dirección";
65
+ };
66
+ readonly tipo: {
67
+ readonly type: "string";
68
+ readonly minLength: 1;
69
+ readonly default: "Trabajo";
70
+ readonly enum: ClasificacionDireccion[];
71
+ readonly description: "Tipo de dirección: trabajo, personal, comercial, etc.";
72
+ };
73
+ readonly pais: {
74
+ readonly type: "string";
75
+ readonly maxLength: 100;
76
+ readonly default: "Perú";
77
+ readonly description: "Nombre del país";
78
+ };
79
+ readonly pais_code: {
80
+ readonly type: "string";
81
+ readonly minLength: 2;
82
+ readonly maxLength: 3;
83
+ readonly default: "PE";
84
+ readonly pattern: "^[A-Z]{2,3}$";
85
+ readonly description: "Código ISO del país";
86
+ };
87
+ readonly continente: {
88
+ readonly type: "string";
89
+ readonly maxLength: 50;
90
+ readonly default: "América del Sur";
91
+ readonly description: "Nombre del continente";
92
+ };
93
+ readonly direccion: {
94
+ readonly type: "string";
95
+ readonly maxLength: 300;
96
+ readonly description: "Dirección principal o calle";
97
+ };
98
+ readonly via_tipo: {
99
+ readonly type: "string";
100
+ readonly maxLength: 20;
101
+ readonly description: "Tipo de vía: calle, avenida, jirón, etc.";
102
+ };
103
+ readonly via_nombre: {
104
+ readonly type: "string";
105
+ readonly maxLength: 150;
106
+ readonly description: "Nombre de la calle o avenida";
107
+ };
108
+ readonly mz: {
109
+ readonly type: "string";
110
+ readonly maxLength: 10;
111
+ readonly description: "Manzana";
112
+ };
113
+ readonly lt: {
114
+ readonly type: "string";
115
+ readonly maxLength: 10;
116
+ readonly description: "Lote";
117
+ };
118
+ readonly nro: {
119
+ readonly type: "string";
120
+ readonly maxLength: 10;
121
+ readonly description: "Número de la dirección";
122
+ };
123
+ readonly interior: {
124
+ readonly type: "string";
125
+ readonly maxLength: 20;
126
+ readonly description: "Departamento, oficina o interior";
127
+ };
128
+ readonly urbanizacion: {
129
+ readonly type: "string";
130
+ readonly maxLength: 150;
131
+ readonly description: "Urbanización, sector o zona";
132
+ };
133
+ readonly referencia: {
134
+ readonly type: "string";
135
+ readonly maxLength: 300;
136
+ readonly description: "Referencia adicional para ubicar la dirección";
137
+ };
138
+ readonly departamento: {
139
+ readonly type: "string";
140
+ readonly maxLength: 100;
141
+ readonly description: "Departamento o estado";
142
+ };
143
+ readonly provincia: {
144
+ readonly type: "string";
145
+ readonly maxLength: 100;
146
+ readonly description: "Provincia o región";
147
+ };
148
+ readonly distrito: {
149
+ readonly type: "string";
150
+ readonly maxLength: 100;
151
+ readonly description: "Distrito o municipio";
152
+ };
153
+ readonly ubigeo: {
154
+ readonly type: "string";
155
+ readonly pattern: "^\\d{6}$";
156
+ readonly description: "Código ubigeo de 6 dígitos";
157
+ };
158
+ readonly codigo_postal: {
159
+ readonly type: "string";
160
+ readonly maxLength: 20;
161
+ readonly description: "Código postal o ZIP";
162
+ };
163
+ readonly gps: {
164
+ readonly type: "string";
165
+ readonly pattern: "^-?\\d+\\.?\\d*,-?\\d+\\.?\\d*$";
166
+ readonly description: "Coordenadas GPS en formato 'latitud,longitud'";
167
+ };
168
+ readonly valida: {
169
+ readonly type: "boolean";
170
+ readonly default: false;
171
+ readonly description: "Indica si la dirección tiene un formato válido";
172
+ };
173
+ readonly verificada: {
174
+ readonly type: "boolean";
175
+ readonly default: false;
176
+ readonly description: "Indica si la dirección ha sido verificada físicamente";
177
+ };
178
+ };
179
+ readonly anyOf: readonly [{
180
+ readonly required: readonly ["direccion_completa"];
181
+ }, {
182
+ readonly required: readonly ["direccion_simple"];
183
+ }, {
184
+ readonly required: readonly ["direccion"];
185
+ }];
186
+ readonly additionalProperties: true;
187
+ readonly title: "Dirección";
188
+ readonly description: "Esquema para direcciones postales";
189
+ readonly errorMessage: {
190
+ readonly anyOf: "Debe proporcionar al menos uno de estos campos: direccion_completa, direccion_simple o direccion";
191
+ };
192
+ };
193
+ //# sourceMappingURL=direccion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direccion.d.ts","sourceRoot":"","sources":["../src/direccion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,GAAG,MAAM,sBAAsB,CAAC;AAGvC,oBAAY,sBAAsB;IAChC,OAAO,YAAY;IACnB,QAAQ,aAAa;CACtB;AAGD,MAAM,WAAW,UAAU;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;EAoLhC,CAAC;AAEF,eAAe,oBAAoB,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,kBAAkB,uBAkH3B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2JtB,CAAC"}
@@ -0,0 +1 @@
1
+ import{Schema as t}from"mongoose";import e from"@jysperu/joi-spanish";var i=(e=>(e.TRABAJO="Trabajo",e.PERSONAL="Personal",e))(i||{});let o=new t({direccion_completa:{type:String,trim:!0,maxlength:[500,"La dirección completa es demasiado larga"],comment:"Dirección completa formateada para mostrar"},direccion_simple:{type:String,trim:!0,maxlength:[300,"La dirección simple es demasiado larga"],comment:"Versión simplificada de la dirección"},tipo:{type:String,default:"Trabajo",validate:{validator:function(e){return"string"==typeof e&&0<e.trim().length},message:"El tipo debe ser un texto no vacío. Valores sugeridos: "+Object.values(i).join(", ")},comment:"Tipo de dirección: trabajo, personal, comercial, etc."},pais:{type:String,default:"Perú",trim:!0,maxlength:[100,"El nombre del país es demasiado largo"]},pais_code:{type:String,default:"PE",uppercase:!0,trim:!0,minlength:[2,"El código del país debe tener al menos 2 caracteres"],maxlength:[3,"El código del país no puede tener más de 3 caracteres"]},continente:{type:String,default:"América del Sur",trim:!0,maxlength:[50,"El nombre del continente es demasiado largo"]},direccion:{type:String,trim:!0,maxlength:[300,"La dirección es demasiado larga"],comment:"Dirección principal o calle"},via_tipo:{type:String,trim:!0,maxlength:[20,"El tipo de vía es demasiado largo"],comment:"Tipo de vía: calle, avenida, jirón, etc."},via_nombre:{type:String,trim:!0,maxlength:[150,"El nombre de la vía es demasiado largo"],comment:"Nombre de la calle o avenida"},mz:{type:String,trim:!0,maxlength:[10,"La manzana es demasiado larga"],comment:"Manzana"},lt:{type:String,trim:!0,maxlength:[10,"El lote es demasiado largo"],comment:"Lote"},nro:{type:String,trim:!0,maxlength:[10,"El número es demasiado largo"],comment:"Número de la dirección"},interior:{type:String,trim:!0,maxlength:[20,"El interior es demasiado largo"],comment:"Departamento, oficina o interior"},urbanizacion:{type:String,trim:!0,maxlength:[150,"La urbanización es demasiado larga"],comment:"Urbanización, sector o zona"},referencia:{type:String,trim:!0,maxlength:[300,"La referencia es demasiado larga"],comment:"Referencia adicional para ubicar la dirección"},departamento:{type:String,trim:!0,maxlength:[100,"El departamento es demasiado largo"],comment:"Departamento o estado"},provincia:{type:String,trim:!0,maxlength:[100,"La provincia es demasiado larga"],comment:"Provincia o región"},distrito:{type:String,trim:!0,maxlength:[100,"El distrito es demasiado largo"],comment:"Distrito o municipio"},ubigeo:{type:String,trim:!0,validate:{validator:function(e){return!e||/^\d{6}$/.test(e)},message:"El ubigeo debe tener 6 dígitos"},comment:"Código ubigeo de 6 dígitos"},codigo_postal:{type:String,trim:!0,maxlength:[20,"El código postal es demasiado largo"],comment:"Código postal o ZIP"},gps:{type:String,trim:!0,validate:{validator:function(e){return!e||/^-?\d+\.?\d*,-?\d+\.?\d*$/.test(e.replace(/\s/g,""))},message:"Las coordenadas GPS deben estar en formato 'latitud,longitud'"},comment:"Coordenadas GPS en formato 'latitud,longitud'"},valida:{type:Boolean,default:!1,comment:"Indica si la dirección tiene un formato válido"},verificada:{type:Boolean,default:!1,comment:"Indica si la dirección ha sido verificada físicamente"}},{strict:!1,timestamps:!0}),s=e.object({direccion_completa:e.string().trim().max(500).messages({"string.max":"La dirección completa es demasiado larga"}),direccion_simple:e.string().trim().max(300).messages({"string.max":"La dirección simple es demasiado larga"}),tipo:e.string().trim().min(1).default("Trabajo").messages({"string.empty":"El tipo debe ser un texto no vacío","string.min":"El tipo debe ser un texto no vacío"}),pais:e.string().trim().max(100).default("Perú").messages({"string.max":"El nombre del país es demasiado largo"}),pais_code:e.string().trim().uppercase().min(2).max(3).default("PE").messages({"string.min":"El código del país debe tener al menos 2 caracteres","string.max":"El código del país no puede tener más de 3 caracteres"}),continente:e.string().trim().max(50).default("América del Sur").messages({"string.max":"El nombre del continente es demasiado largo"}),direccion:e.string().trim().max(300).messages({"string.max":"La dirección es demasiado larga"}),via_tipo:e.string().trim().max(20).messages({"string.max":"El tipo de vía es demasiado largo"}),via_nombre:e.string().trim().max(150).messages({"string.max":"El nombre de la vía es demasiado largo"}),mz:e.string().trim().max(10).messages({"string.max":"La manzana es demasiado larga"}),lt:e.string().trim().max(10).messages({"string.max":"El lote es demasiado largo"}),nro:e.string().trim().max(10).messages({"string.max":"El número es demasiado largo"}),interior:e.string().trim().max(20).messages({"string.max":"El interior es demasiado largo"}),urbanizacion:e.string().trim().max(150).messages({"string.max":"La urbanización es demasiado larga"}),referencia:e.string().trim().max(300).messages({"string.max":"La referencia es demasiado larga"}),departamento:e.string().trim().max(100).messages({"string.max":"El departamento es demasiado largo"}),provincia:e.string().trim().max(100).messages({"string.max":"La provincia es demasiado larga"}),distrito:e.string().trim().max(100).messages({"string.max":"El distrito es demasiado largo"}),ubigeo:e.string().trim().pattern(/^\d{6}$/).messages({"string.pattern.base":"El ubigeo debe tener 6 dígitos"}),codigo_postal:e.string().trim().max(20).messages({"string.max":"El código postal es demasiado largo"}),gps:e.string().trim().pattern(/^-?\d+\.?\d*,-?\d+\.?\d*$/).messages({"string.pattern.base":"Las coordenadas GPS deben estar en formato 'latitud,longitud'"}),valida:e.boolean().default(!1),verificada:e.boolean().default(!1)}).options({stripUnknown:!1,allowUnknown:!0}).or("direccion_completa","direccion_simple","direccion").messages({"object.missing":"Debe proporcionar una dirección válida"}),m={$schema:"http://json-schema.org/draft-07/schema#",type:"object",properties:{direccion_completa:{type:"string",maxLength:500,description:"Dirección completa formateada para mostrar"},direccion_simple:{type:"string",maxLength:300,description:"Versión simplificada de la dirección"},tipo:{type:"string",minLength:1,default:"Trabajo",enum:Object.values(i),description:"Tipo de dirección: trabajo, personal, comercial, etc."},pais:{type:"string",maxLength:100,default:"Perú",description:"Nombre del país"},pais_code:{type:"string",minLength:2,maxLength:3,default:"PE",pattern:"^[A-Z]{2,3}$",description:"Código ISO del país"},continente:{type:"string",maxLength:50,default:"América del Sur",description:"Nombre del continente"},direccion:{type:"string",maxLength:300,description:"Dirección principal o calle"},via_tipo:{type:"string",maxLength:20,description:"Tipo de vía: calle, avenida, jirón, etc."},via_nombre:{type:"string",maxLength:150,description:"Nombre de la calle o avenida"},mz:{type:"string",maxLength:10,description:"Manzana"},lt:{type:"string",maxLength:10,description:"Lote"},nro:{type:"string",maxLength:10,description:"Número de la dirección"},interior:{type:"string",maxLength:20,description:"Departamento, oficina o interior"},urbanizacion:{type:"string",maxLength:150,description:"Urbanización, sector o zona"},referencia:{type:"string",maxLength:300,description:"Referencia adicional para ubicar la dirección"},departamento:{type:"string",maxLength:100,description:"Departamento o estado"},provincia:{type:"string",maxLength:100,description:"Provincia o región"},distrito:{type:"string",maxLength:100,description:"Distrito o municipio"},ubigeo:{type:"string",pattern:"^\\d{6}$",description:"Código ubigeo de 6 dígitos"},codigo_postal:{type:"string",maxLength:20,description:"Código postal o ZIP"},gps:{type:"string",pattern:"^-?\\d+\\.?\\d*,-?\\d+\\.?\\d*$",description:"Coordenadas GPS en formato 'latitud,longitud'"},valida:{type:"boolean",default:!1,description:"Indica si la dirección tiene un formato válido"},verificada:{type:"boolean",default:!1,description:"Indica si la dirección ha sido verificada físicamente"}},anyOf:[{required:["direccion_completa"]},{required:["direccion_simple"]},{required:["direccion"]}],additionalProperties:!0,title:"Dirección",description:"Esquema para direcciones postales",errorMessage:{anyOf:"Debe proporcionar al menos uno de estos campos: direccion_completa, direccion_simple o direccion"}};export{i as ClasificacionDireccion,s as JoiSchemaDireccion,m as JsonSchemaDireccion,o as MongoSchemaDireccion,o as default};
@@ -0,0 +1,154 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "direccion_completa": {
6
+ "type": "string",
7
+ "maxLength": 500,
8
+ "description": "Dirección completa formateada para mostrar"
9
+ },
10
+ "direccion_simple": {
11
+ "type": "string",
12
+ "maxLength": 300,
13
+ "description": "Versión simplificada de la dirección"
14
+ },
15
+ "tipo": {
16
+ "type": "string",
17
+ "minLength": 1,
18
+ "default": "Trabajo",
19
+ "enum": [
20
+ "Trabajo",
21
+ "Personal"
22
+ ],
23
+ "description": "Tipo de dirección: trabajo, personal, comercial, etc."
24
+ },
25
+ "pais": {
26
+ "type": "string",
27
+ "maxLength": 100,
28
+ "default": "Perú",
29
+ "description": "Nombre del país"
30
+ },
31
+ "pais_code": {
32
+ "type": "string",
33
+ "minLength": 2,
34
+ "maxLength": 3,
35
+ "default": "PE",
36
+ "pattern": "^[A-Z]{2,3}$",
37
+ "description": "Código ISO del país"
38
+ },
39
+ "continente": {
40
+ "type": "string",
41
+ "maxLength": 50,
42
+ "default": "América del Sur",
43
+ "description": "Nombre del continente"
44
+ },
45
+ "direccion": {
46
+ "type": "string",
47
+ "maxLength": 300,
48
+ "description": "Dirección principal o calle"
49
+ },
50
+ "via_tipo": {
51
+ "type": "string",
52
+ "maxLength": 20,
53
+ "description": "Tipo de vía: calle, avenida, jirón, etc."
54
+ },
55
+ "via_nombre": {
56
+ "type": "string",
57
+ "maxLength": 150,
58
+ "description": "Nombre de la calle o avenida"
59
+ },
60
+ "mz": {
61
+ "type": "string",
62
+ "maxLength": 10,
63
+ "description": "Manzana"
64
+ },
65
+ "lt": {
66
+ "type": "string",
67
+ "maxLength": 10,
68
+ "description": "Lote"
69
+ },
70
+ "nro": {
71
+ "type": "string",
72
+ "maxLength": 10,
73
+ "description": "Número de la dirección"
74
+ },
75
+ "interior": {
76
+ "type": "string",
77
+ "maxLength": 20,
78
+ "description": "Departamento, oficina o interior"
79
+ },
80
+ "urbanizacion": {
81
+ "type": "string",
82
+ "maxLength": 150,
83
+ "description": "Urbanización, sector o zona"
84
+ },
85
+ "referencia": {
86
+ "type": "string",
87
+ "maxLength": 300,
88
+ "description": "Referencia adicional para ubicar la dirección"
89
+ },
90
+ "departamento": {
91
+ "type": "string",
92
+ "maxLength": 100,
93
+ "description": "Departamento o estado"
94
+ },
95
+ "provincia": {
96
+ "type": "string",
97
+ "maxLength": 100,
98
+ "description": "Provincia o región"
99
+ },
100
+ "distrito": {
101
+ "type": "string",
102
+ "maxLength": 100,
103
+ "description": "Distrito o municipio"
104
+ },
105
+ "ubigeo": {
106
+ "type": "string",
107
+ "pattern": "^\\d{6}$",
108
+ "description": "Código ubigeo de 6 dígitos"
109
+ },
110
+ "codigo_postal": {
111
+ "type": "string",
112
+ "maxLength": 20,
113
+ "description": "Código postal o ZIP"
114
+ },
115
+ "gps": {
116
+ "type": "string",
117
+ "pattern": "^-?\\d+\\.?\\d*,-?\\d+\\.?\\d*$",
118
+ "description": "Coordenadas GPS en formato 'latitud,longitud'"
119
+ },
120
+ "valida": {
121
+ "type": "boolean",
122
+ "default": false,
123
+ "description": "Indica si la dirección tiene un formato válido"
124
+ },
125
+ "verificada": {
126
+ "type": "boolean",
127
+ "default": false,
128
+ "description": "Indica si la dirección ha sido verificada físicamente"
129
+ }
130
+ },
131
+ "anyOf": [
132
+ {
133
+ "required": [
134
+ "direccion_completa"
135
+ ]
136
+ },
137
+ {
138
+ "required": [
139
+ "direccion_simple"
140
+ ]
141
+ },
142
+ {
143
+ "required": [
144
+ "direccion"
145
+ ]
146
+ }
147
+ ],
148
+ "additionalProperties": true,
149
+ "title": "Dirección",
150
+ "description": "Esquema para direcciones postales",
151
+ "errorMessage": {
152
+ "anyOf": "Debe proporcionar al menos uno de estos campos: direccion_completa, direccion_simple o direccion"
153
+ }
154
+ }
@@ -0,0 +1 @@
1
+ ((e,i)=>{"object"==typeof exports&&typeof module<"u"?i(exports,require("mongoose"),require("@jysperu/joi-spanish")):"function"==typeof define&&define.amd?define("@jysperu/schema-direccion",["exports","mongoose","@jysperu/joi-spanish"],i):i(((e=typeof globalThis<"u"?globalThis:e||self).JCore=e.JCore||{},e.JCore.schema=e.JCore.schema||{},e.JCore.schema.direccion={}),e.mongoose,e.Joi)})(this,function(e,i,a){(t={}).TRABAJO="Trabajo",t.PERSONAL="Personal";var t,i=new i.Schema({direccion_completa:{type:String,trim:!0,maxlength:[500,"La dirección completa es demasiado larga"],comment:"Dirección completa formateada para mostrar"},direccion_simple:{type:String,trim:!0,maxlength:[300,"La dirección simple es demasiado larga"],comment:"Versión simplificada de la dirección"},tipo:{type:String,default:"Trabajo",validate:{validator:function(e){return"string"==typeof e&&0<e.trim().length},message:"El tipo debe ser un texto no vacío. Valores sugeridos: "+Object.values(t).join(", ")},comment:"Tipo de dirección: trabajo, personal, comercial, etc."},pais:{type:String,default:"Perú",trim:!0,maxlength:[100,"El nombre del país es demasiado largo"]},pais_code:{type:String,default:"PE",uppercase:!0,trim:!0,minlength:[2,"El código del país debe tener al menos 2 caracteres"],maxlength:[3,"El código del país no puede tener más de 3 caracteres"]},continente:{type:String,default:"América del Sur",trim:!0,maxlength:[50,"El nombre del continente es demasiado largo"]},direccion:{type:String,trim:!0,maxlength:[300,"La dirección es demasiado larga"],comment:"Dirección principal o calle"},via_tipo:{type:String,trim:!0,maxlength:[20,"El tipo de vía es demasiado largo"],comment:"Tipo de vía: calle, avenida, jirón, etc."},via_nombre:{type:String,trim:!0,maxlength:[150,"El nombre de la vía es demasiado largo"],comment:"Nombre de la calle o avenida"},mz:{type:String,trim:!0,maxlength:[10,"La manzana es demasiado larga"],comment:"Manzana"},lt:{type:String,trim:!0,maxlength:[10,"El lote es demasiado largo"],comment:"Lote"},nro:{type:String,trim:!0,maxlength:[10,"El número es demasiado largo"],comment:"Número de la dirección"},interior:{type:String,trim:!0,maxlength:[20,"El interior es demasiado largo"],comment:"Departamento, oficina o interior"},urbanizacion:{type:String,trim:!0,maxlength:[150,"La urbanización es demasiado larga"],comment:"Urbanización, sector o zona"},referencia:{type:String,trim:!0,maxlength:[300,"La referencia es demasiado larga"],comment:"Referencia adicional para ubicar la dirección"},departamento:{type:String,trim:!0,maxlength:[100,"El departamento es demasiado largo"],comment:"Departamento o estado"},provincia:{type:String,trim:!0,maxlength:[100,"La provincia es demasiado larga"],comment:"Provincia o región"},distrito:{type:String,trim:!0,maxlength:[100,"El distrito es demasiado largo"],comment:"Distrito o municipio"},ubigeo:{type:String,trim:!0,validate:{validator:function(e){return!e||/^\d{6}$/.test(e)},message:"El ubigeo debe tener 6 dígitos"},comment:"Código ubigeo de 6 dígitos"},codigo_postal:{type:String,trim:!0,maxlength:[20,"El código postal es demasiado largo"],comment:"Código postal o ZIP"},gps:{type:String,trim:!0,validate:{validator:function(e){return!e||/^-?\d+\.?\d*,-?\d+\.?\d*$/.test(e.replace(/\s/g,""))},message:"Las coordenadas GPS deben estar en formato 'latitud,longitud'"},comment:"Coordenadas GPS en formato 'latitud,longitud'"},valida:{type:Boolean,default:!1,comment:"Indica si la dirección tiene un formato válido"},verificada:{type:Boolean,default:!1,comment:"Indica si la dirección ha sido verificada físicamente"}},{strict:!1,timestamps:!0}),a=a.object({direccion_completa:a.string().trim().max(500).messages({"string.max":"La dirección completa es demasiado larga"}),direccion_simple:a.string().trim().max(300).messages({"string.max":"La dirección simple es demasiado larga"}),tipo:a.string().trim().min(1).default("Trabajo").messages({"string.empty":"El tipo debe ser un texto no vacío","string.min":"El tipo debe ser un texto no vacío"}),pais:a.string().trim().max(100).default("Perú").messages({"string.max":"El nombre del país es demasiado largo"}),pais_code:a.string().trim().uppercase().min(2).max(3).default("PE").messages({"string.min":"El código del país debe tener al menos 2 caracteres","string.max":"El código del país no puede tener más de 3 caracteres"}),continente:a.string().trim().max(50).default("América del Sur").messages({"string.max":"El nombre del continente es demasiado largo"}),direccion:a.string().trim().max(300).messages({"string.max":"La dirección es demasiado larga"}),via_tipo:a.string().trim().max(20).messages({"string.max":"El tipo de vía es demasiado largo"}),via_nombre:a.string().trim().max(150).messages({"string.max":"El nombre de la vía es demasiado largo"}),mz:a.string().trim().max(10).messages({"string.max":"La manzana es demasiado larga"}),lt:a.string().trim().max(10).messages({"string.max":"El lote es demasiado largo"}),nro:a.string().trim().max(10).messages({"string.max":"El número es demasiado largo"}),interior:a.string().trim().max(20).messages({"string.max":"El interior es demasiado largo"}),urbanizacion:a.string().trim().max(150).messages({"string.max":"La urbanización es demasiado larga"}),referencia:a.string().trim().max(300).messages({"string.max":"La referencia es demasiado larga"}),departamento:a.string().trim().max(100).messages({"string.max":"El departamento es demasiado largo"}),provincia:a.string().trim().max(100).messages({"string.max":"La provincia es demasiado larga"}),distrito:a.string().trim().max(100).messages({"string.max":"El distrito es demasiado largo"}),ubigeo:a.string().trim().pattern(/^\d{6}$/).messages({"string.pattern.base":"El ubigeo debe tener 6 dígitos"}),codigo_postal:a.string().trim().max(20).messages({"string.max":"El código postal es demasiado largo"}),gps:a.string().trim().pattern(/^-?\d+\.?\d*,-?\d+\.?\d*$/).messages({"string.pattern.base":"Las coordenadas GPS deben estar en formato 'latitud,longitud'"}),valida:a.boolean().default(!1),verificada:a.boolean().default(!1)}).options({stripUnknown:!1,allowUnknown:!0}).or("direccion_completa","direccion_simple","direccion").messages({"object.missing":"Debe proporcionar una dirección válida"}),r={$schema:"http://json-schema.org/draft-07/schema#",type:"object",properties:{direccion_completa:{type:"string",maxLength:500,description:"Dirección completa formateada para mostrar"},direccion_simple:{type:"string",maxLength:300,description:"Versión simplificada de la dirección"},tipo:{type:"string",minLength:1,default:"Trabajo",enum:Object.values(t),description:"Tipo de dirección: trabajo, personal, comercial, etc."},pais:{type:"string",maxLength:100,default:"Perú",description:"Nombre del país"},pais_code:{type:"string",minLength:2,maxLength:3,default:"PE",pattern:"^[A-Z]{2,3}$",description:"Código ISO del país"},continente:{type:"string",maxLength:50,default:"América del Sur",description:"Nombre del continente"},direccion:{type:"string",maxLength:300,description:"Dirección principal o calle"},via_tipo:{type:"string",maxLength:20,description:"Tipo de vía: calle, avenida, jirón, etc."},via_nombre:{type:"string",maxLength:150,description:"Nombre de la calle o avenida"},mz:{type:"string",maxLength:10,description:"Manzana"},lt:{type:"string",maxLength:10,description:"Lote"},nro:{type:"string",maxLength:10,description:"Número de la dirección"},interior:{type:"string",maxLength:20,description:"Departamento, oficina o interior"},urbanizacion:{type:"string",maxLength:150,description:"Urbanización, sector o zona"},referencia:{type:"string",maxLength:300,description:"Referencia adicional para ubicar la dirección"},departamento:{type:"string",maxLength:100,description:"Departamento o estado"},provincia:{type:"string",maxLength:100,description:"Provincia o región"},distrito:{type:"string",maxLength:100,description:"Distrito o municipio"},ubigeo:{type:"string",pattern:"^\\d{6}$",description:"Código ubigeo de 6 dígitos"},codigo_postal:{type:"string",maxLength:20,description:"Código postal o ZIP"},gps:{type:"string",pattern:"^-?\\d+\\.?\\d*,-?\\d+\\.?\\d*$",description:"Coordenadas GPS en formato 'latitud,longitud'"},valida:{type:"boolean",default:!1,description:"Indica si la dirección tiene un formato válido"},verificada:{type:"boolean",default:!1,description:"Indica si la dirección ha sido verificada físicamente"}},anyOf:[{required:["direccion_completa"]},{required:["direccion_simple"]},{required:["direccion"]}],additionalProperties:!0,title:"Dirección",description:"Esquema para direcciones postales",errorMessage:{anyOf:"Debe proporcionar al menos uno de estos campos: direccion_completa, direccion_simple o direccion"}};e.ClasificacionDireccion=t,e.JoiSchemaDireccion=a,e.JsonSchemaDireccion=r,e.MongoSchemaDireccion=i,e.default=i,Object.defineProperty(e,"__esModule",{value:!0})});
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@jysperu/schema-direccion",
3
+ "version": "1.0.0",
4
+ "description": "Esquemas para direcciones: Mongoose, JSON Schema y Joi",
5
+ "keywords": [
6
+ "mongoose",
7
+ "schema",
8
+ "direccion",
9
+ "validation",
10
+ "joi",
11
+ "json-schema",
12
+ "typescript",
13
+ "spanish"
14
+ ],
15
+ "homepage": "https://gitlab.com/tiny.node/schema/direccion#readme",
16
+ "bugs": {
17
+ "url": "https://gitlab.com/tiny.node/schema/direccion/issues"
18
+ },
19
+ "type": "module",
20
+ "main": "./dist/direccion.umd.js",
21
+ "module": "./dist/direccion.esm.js",
22
+ "types": "./dist/direccion.d.ts",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/direccion.d.ts",
26
+ "import": "./dist/direccion.esm.js",
27
+ "require": "./dist/direccion.cjs.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "engines": {
36
+ "node": ">=16.0.0"
37
+ },
38
+ "license": "MIT",
39
+ "author": {
40
+ "name": "JYS Perú",
41
+ "url": "https://www.jys.pe",
42
+ "email": "developers@jys.pe"
43
+ },
44
+ "contributors": [
45
+ "JYS Perú <developers@jys.pe>"
46
+ ],
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://gitlab.com/tiny.node/schema/direccion.git"
50
+ },
51
+ "scripts": {
52
+ "build": "vite build",
53
+ "dev": "vite build --watch",
54
+ "typecheck": "tsc --noEmit",
55
+ "lint": "tsc --noEmit && echo \"✅ TypeScript check passed\"",
56
+ "prepublishOnly": "npm run build",
57
+ "test": "echo \"⚠️ No tests specified\" && exit 0"
58
+ },
59
+ "devDependencies": {
60
+ "@node-minify/core": "^9.0.2",
61
+ "@node-minify/uglify-es": "^9.0.1",
62
+ "@node-minify/uglify-js": "^9.0.1",
63
+ "@types/node": "^24.10.1",
64
+ "typescript": "^5.8.3",
65
+ "vite": "^6.2.5",
66
+ "vite-plugin-dts": "^4.5.3"
67
+ },
68
+ "dependencies": {
69
+ "@jysperu/joi-spanish": "^17.13.4",
70
+ "mongoose": "^8.13.2"
71
+ }
72
+ }