monapi 0.1.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 +21 -0
- package/README.md +385 -0
- package/dist/index.d.mts +315 -0
- package/dist/index.d.ts +315 -0
- package/dist/index.js +1015 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +998 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/query.ts","../src/types/schema.ts","../src/adapters/schema/MongooseAdapter.ts","../src/adapters/schema/index.ts","../src/utils/errors.ts","../src/engine/filter-parser.ts","../src/engine/query-builder.ts","../src/engine/hook-executor.ts","../src/engine/crud-handlers.ts","../src/middleware/auth.ts","../src/router/express-router.ts","../src/middleware/error-handler.ts","../src/utils/logger.ts","../src/monapi.ts"],"names":["FieldType","SchemaType","response","Router"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FilterQuery, SortOrder } from 'mongoose'\n\n/**\n * Supported filter operators for query parameters\n */\nexport type FilterOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'nin'\n | 'like'\n | 'exists'\n\n/**\n * Single filter condition with operator and value\n */\nexport interface FilterCondition {\n operator: FilterOperator\n value: any\n}\n\n/**\n * Parsed filters as a map of field names to filter conditions\n */\nexport interface ParsedFilters {\n [field: string]: FilterCondition\n}\n\n/**\n * Query options for list operations\n */\nexport interface QueryOptions {\n page?: number\n limit?: number\n sort?: string | string[]\n fields?: string | string[]\n [key: string]: any\n}\n\n/**\n * MongoDB query object with pagination and projection\n */\nexport interface MongoQuery {\n filter: FilterQuery<any>\n sort?: { [key: string]: SortOrder }\n skip?: number\n limit?: number\n projection?: { [key: string]: 0 | 1 }\n}\n\n/**\n * Pagination metadata\n */\nexport interface PaginationMeta {\n page: number\n limit: number\n total: number\n totalPages?: number\n}\n\n/**\n * Query configuration for a collection\n */\nexport interface QueryConfig {\n allowedFilters?: string[]\n allowedSorts?: string[]\n defaultSort?: string\n defaultLimit?: number\n maxLimit?: number\n}\n\n/**\n * Field type enumeration\n */\nexport enum FieldType {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Date = 'date',\n ObjectId = 'objectid',\n Array = 'array',\n Object = 'object',\n Mixed = 'mixed',\n}\n","import { Model, Schema } from 'mongoose'\nimport { FieldType } from './query'\n\n/**\n * Validation result from schema validation\n */\nexport interface ValidationResult {\n valid: boolean\n errors?: ValidationError[]\n data?: any\n}\n\n/**\n * Validation error details\n */\nexport interface ValidationError {\n field: string\n message: string\n code?: string\n}\n\n/**\n * Field metadata from schema\n */\nexport interface FieldMetadata {\n name: string\n type: FieldType\n required?: boolean\n default?: any\n enum?: any[]\n}\n\n/**\n * Base interface for schema adapters\n * All schema types (Mongoose, Zod, Joi, etc.) must implement this\n */\nexport interface SchemaAdapter {\n /**\n * Get list of all field names in the schema\n */\n getFields(): string[]\n\n /**\n * Get the type of a specific field\n */\n getFieldType(field: string): FieldType\n\n /**\n * Get metadata for a specific field\n */\n getFieldMetadata(field: string): FieldMetadata | undefined\n\n /**\n * Get all fields metadata\n */\n getAllFieldsMetadata(): FieldMetadata[]\n\n /**\n * Validate data against the schema\n */\n validate(data: unknown): Promise<ValidationResult> | ValidationResult\n\n /**\n * Get the underlying Mongoose model if available\n */\n getMongooseModel?(): Model<any> | undefined\n\n /**\n * Get the underlying Mongoose schema if available\n */\n getMongooseSchema?(): Schema | undefined\n}\n\n/**\n * Schema type detection\n */\nexport enum SchemaType {\n Mongoose = 'mongoose',\n Typegoose = 'typegoose',\n Zod = 'zod',\n Joi = 'joi',\n Yup = 'yup',\n Unknown = 'unknown',\n}\n\n/**\n * Schema configuration options\n */\nexport interface SchemaOptions {\n strict?: boolean\n timestamps?: boolean\n validateBeforeSave?: boolean\n}\n","import { Model, Schema } from 'mongoose'\nimport {\n SchemaAdapter,\n ValidationResult,\n FieldMetadata,\n FieldType,\n} from '../../types'\n\n/**\n * Schema adapter for Mongoose schemas and models\n */\nexport class MongooseAdapter implements SchemaAdapter {\n private schema: Schema\n private model?: Model<any>\n\n constructor(schemaOrModel: Schema | Model<any>) {\n if (this.isModel(schemaOrModel)) {\n this.model = schemaOrModel\n this.schema = schemaOrModel.schema\n } else {\n this.schema = schemaOrModel\n }\n }\n\n /**\n * Type guard to check if value is a Mongoose model\n */\n private isModel(value: any): value is Model<any> {\n return value && typeof value === 'function' && value.prototype && value.schema\n }\n\n /**\n * Get list of all field names in the schema\n */\n getFields(): string[] {\n const fields: string[] = []\n\n this.schema.eachPath((pathname) => {\n // Skip internal mongoose fields\n if (pathname === '_id' || pathname === '__v') {\n return\n }\n fields.push(pathname)\n })\n\n return fields\n }\n\n /**\n * Get the type of a specific field\n */\n getFieldType(field: string): FieldType {\n const schemaType = this.schema.path(field)\n\n if (!schemaType) {\n return FieldType.Mixed\n }\n\n const instance = schemaType.instance\n\n switch (instance) {\n case 'String':\n return FieldType.String\n case 'Number':\n return FieldType.Number\n case 'Boolean':\n return FieldType.Boolean\n case 'Date':\n return FieldType.Date\n case 'ObjectID':\n case 'ObjectId':\n return FieldType.ObjectId\n case 'Array':\n return FieldType.Array\n case 'Embedded':\n case 'Subdocument':\n return FieldType.Object\n case 'Mixed':\n return FieldType.Mixed\n default:\n return FieldType.Mixed\n }\n }\n\n /**\n * Get metadata for a specific field\n */\n getFieldMetadata(field: string): FieldMetadata | undefined {\n const schemaType = this.schema.path(field)\n\n if (!schemaType) {\n return undefined\n }\n\n const metadata: FieldMetadata = {\n name: field,\n type: this.getFieldType(field),\n }\n\n // Check if field is required\n if (schemaType.isRequired) {\n metadata.required = true\n }\n\n // Get default value\n const st = schemaType as any\n if (st.defaultValue !== undefined) {\n metadata.default = st.defaultValue\n }\n\n // Get enum values\n if (st.enumValues && st.enumValues.length > 0) {\n metadata.enum = st.enumValues\n }\n\n return metadata\n }\n\n /**\n * Get all fields metadata\n */\n getAllFieldsMetadata(): FieldMetadata[] {\n const fields = this.getFields()\n return fields\n .map((field) => this.getFieldMetadata(field))\n .filter((meta): meta is FieldMetadata => meta !== undefined)\n }\n\n /**\n * Validate data against the schema\n */\n async validate(data: unknown): Promise<ValidationResult> {\n if (!this.model) {\n // If no model available, do basic type checking\n return this.basicValidation(data)\n }\n\n try {\n // Create a new document instance\n const doc = new this.model(data)\n\n // Run validation\n await doc.validate()\n\n return {\n valid: true,\n data: doc.toObject(),\n }\n } catch (error: any) {\n // Handle validation errors\n if (error.name === 'ValidationError') {\n const errors = Object.keys(error.errors).map((field) => ({\n field,\n message: error.errors[field].message,\n code: error.errors[field].kind,\n }))\n\n return {\n valid: false,\n errors,\n }\n }\n\n // Other errors\n return {\n valid: false,\n errors: [\n {\n field: '',\n message: error.message || 'Validation failed',\n },\n ],\n }\n }\n }\n\n /**\n * Basic validation when model is not available\n */\n private basicValidation(data: unknown): ValidationResult {\n if (typeof data !== 'object' || data === null) {\n return {\n valid: false,\n errors: [\n {\n field: '',\n message: 'Data must be an object',\n },\n ],\n }\n }\n\n return {\n valid: true,\n data,\n }\n }\n\n /**\n * Get the underlying Mongoose model if available\n */\n getMongooseModel(): Model<any> | undefined {\n return this.model\n }\n\n /**\n * Get the underlying Mongoose schema\n */\n getMongooseSchema(): Schema {\n return this.schema\n }\n}\n","import { Model, Schema } from 'mongoose'\nimport { SchemaAdapter, SchemaType } from '../../types'\nimport { MongooseAdapter } from './MongooseAdapter'\n\n/**\n * Detect the type of schema provided\n */\nexport function detectSchemaType(schema: any): SchemaType {\n // Check if it's a Mongoose schema\n if (schema instanceof Schema) {\n return SchemaType.Mongoose\n }\n\n // Check if it's a Mongoose model\n if (typeof schema === 'function' && schema.prototype && schema.schema) {\n return SchemaType.Mongoose\n }\n\n // Check for Zod schema\n if (schema && typeof schema === 'object' && '_def' in schema && 'parse' in schema) {\n return SchemaType.Zod\n }\n\n // Check for Joi schema\n if (schema && typeof schema === 'object' && 'isJoi' in schema) {\n return SchemaType.Joi\n }\n\n // Check for Yup schema\n if (schema && typeof schema === 'object' && '__isYupSchema__' in schema) {\n return SchemaType.Yup\n }\n\n // Check for Typegoose class\n if (typeof schema === 'function' && schema.prototype) {\n // Typegoose classes typically have metadata\n const metadata = (Reflect as any).getMetadata?.('typegoose:properties', schema)\n if (metadata) {\n return SchemaType.Typegoose\n }\n }\n\n return SchemaType.Unknown\n}\n\n/**\n * Create appropriate schema adapter based on schema type\n */\nexport function createSchemaAdapter(schema: Schema | Model<any> | any): SchemaAdapter {\n const schemaType = detectSchemaType(schema)\n\n switch (schemaType) {\n case SchemaType.Mongoose:\n return new MongooseAdapter(schema)\n\n case SchemaType.Zod:\n throw new Error('Zod adapter not yet implemented. Coming in Phase 9.')\n\n case SchemaType.Joi:\n throw new Error('Joi adapter not yet implemented. Coming in Phase 9.')\n\n case SchemaType.Yup:\n throw new Error('Yup adapter not yet implemented. Coming in Phase 9.')\n\n case SchemaType.Typegoose:\n throw new Error('Typegoose adapter not yet implemented. Coming in Phase 9.')\n\n default:\n throw new Error(`Unsupported schema type: ${schemaType}`)\n }\n}\n\n/**\n * Validate that a schema is supported\n */\nexport function isSupportedSchema(schema: any): boolean {\n const schemaType = detectSchemaType(schema)\n return schemaType !== SchemaType.Unknown\n}\n\n// Re-export adapters\nexport { MongooseAdapter }\n","/**\n * Base error class for Monapi\n */\nexport class MonapiError extends Error {\n public readonly statusCode: number\n public readonly code: string\n public readonly details?: any\n\n constructor(message: string, statusCode: number, code: string, details?: any) {\n super(message)\n this.name = 'MonapiError'\n this.statusCode = statusCode\n this.code = code\n this.details = details\n Object.setPrototypeOf(this, MonapiError.prototype)\n }\n}\n\nexport class NotFoundError extends MonapiError {\n constructor(resource: string, id?: string) {\n const message = id ? `${resource} with id '${id}' not found` : `${resource} not found`\n super(message, 404, 'NOT_FOUND')\n this.name = 'NotFoundError'\n Object.setPrototypeOf(this, NotFoundError.prototype)\n }\n}\n\nexport class ValidationError extends MonapiError {\n constructor(message: string, details?: any) {\n super(message, 400, 'VALIDATION_ERROR', details)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n\nexport class ForbiddenError extends MonapiError {\n constructor(message = 'Access denied') {\n super(message, 403, 'FORBIDDEN')\n this.name = 'ForbiddenError'\n Object.setPrototypeOf(this, ForbiddenError.prototype)\n }\n}\n\nexport class UnauthorizedError extends MonapiError {\n constructor(message = 'Authentication required') {\n super(message, 401, 'UNAUTHORIZED')\n this.name = 'UnauthorizedError'\n Object.setPrototypeOf(this, UnauthorizedError.prototype)\n }\n}\n\nexport class BadRequestError extends MonapiError {\n constructor(message: string, details?: any) {\n super(message, 400, 'BAD_REQUEST', details)\n this.name = 'BadRequestError'\n Object.setPrototypeOf(this, BadRequestError.prototype)\n }\n}\n","import { FilterQuery } from 'mongoose'\nimport { FilterOperator, FieldType, QueryConfig } from '../types'\nimport { SchemaAdapter } from '../types/schema'\nimport { BadRequestError } from '../utils/errors'\n\n/**\n * Map of supported double-underscore operators to MongoDB operators\n */\nconst OPERATOR_MAP: Record<FilterOperator, string> = {\n eq: '$eq',\n ne: '$ne',\n gt: '$gt',\n gte: '$gte',\n lt: '$lt',\n lte: '$lte',\n in: '$in',\n nin: '$nin',\n like: '$regex',\n exists: '$exists',\n}\n\n/**\n * Reserved query parameters that should not be treated as filters\n */\nconst RESERVED_PARAMS = new Set(['page', 'limit', 'sort', 'fields', 'filter'])\n\n/**\n * Default security limits\n */\nconst DEFAULT_MAX_REGEX_LENGTH = 100\nconst DEFAULT_MAX_FILTERS = 20\n\ninterface FilterParserOptions {\n adapter?: SchemaAdapter\n queryConfig?: QueryConfig\n maxRegexLength?: number\n maxFilters?: number\n}\n\n/**\n * Parse query string parameters into a MongoDB filter object.\n *\n * Supports three modes:\n * 1. Simple: ?age=25&role=admin (equality)\n * 2. Operator: ?age__gt=18&age__lt=29 (double-underscore operators)\n * 3. Advanced: ?filter[age][gt]=18 (bracket syntax)\n */\nexport function parseFilters(\n query: Record<string, any>,\n options: FilterParserOptions = {},\n): FilterQuery<any> {\n const { adapter, queryConfig, maxRegexLength = DEFAULT_MAX_REGEX_LENGTH, maxFilters = DEFAULT_MAX_FILTERS } = options\n\n const allowedFields = queryConfig?.allowedFilters ?? adapter?.getFields()\n const filter: FilterQuery<any> = {}\n let filterCount = 0\n\n // 1. Parse advanced bracket syntax: filter[field][operator]=value\n if (query.filter && typeof query.filter === 'object') {\n for (const [field, ops] of Object.entries(query.filter)) {\n validateField(field, allowedFields)\n\n if (typeof ops === 'object' && ops !== null) {\n for (const [op, val] of Object.entries(ops as Record<string, any>)) {\n if (++filterCount > maxFilters) {\n throw new BadRequestError(`Too many filters. Maximum allowed: ${maxFilters}`)\n }\n const operator = op as FilterOperator\n validateOperator(operator)\n const fieldType = adapter?.getFieldType(field)\n applyFilter(filter, field, operator, val as string, fieldType, maxRegexLength)\n }\n } else {\n // filter[field]=value (equality shorthand)\n if (++filterCount > maxFilters) {\n throw new BadRequestError(`Too many filters. Maximum allowed: ${maxFilters}`)\n }\n const fieldType = adapter?.getFieldType(field)\n applyFilter(filter, field, 'eq', ops as string, fieldType, maxRegexLength)\n }\n }\n }\n\n // 2. Parse simple and operator params: field=value or field__op=value\n for (const [key, value] of Object.entries(query)) {\n if (RESERVED_PARAMS.has(key) || key === 'filter') continue\n if (value === undefined || value === '') continue\n\n const { field, operator } = parseParamKey(key)\n\n validateField(field, allowedFields)\n if (++filterCount > maxFilters) {\n throw new BadRequestError(`Too many filters. Maximum allowed: ${maxFilters}`)\n }\n validateOperator(operator)\n\n const fieldType = adapter?.getFieldType(field)\n applyFilter(filter, field, operator, value, fieldType, maxRegexLength)\n }\n\n return filter\n}\n\n/**\n * Parse a query parameter key into field name and operator.\n * e.g. \"age__gt\" -> { field: \"age\", operator: \"gt\" }\n * e.g. \"role\" -> { field: \"role\", operator: \"eq\" }\n */\nfunction parseParamKey(key: string): { field: string; operator: FilterOperator } {\n const doubleUnderscoreIndex = key.indexOf('__')\n\n if (doubleUnderscoreIndex === -1) {\n return { field: key, operator: 'eq' }\n }\n\n const field = key.substring(0, doubleUnderscoreIndex)\n const operator = key.substring(doubleUnderscoreIndex + 2) as FilterOperator\n\n return { field, operator }\n}\n\n/**\n * Validate that a field is allowed for filtering\n */\nfunction validateField(field: string, allowedFields?: string[]): void {\n // Block MongoDB operators and injection attempts\n if (field.startsWith('$')) {\n throw new BadRequestError(`Invalid filter field: ${field}`)\n }\n\n if (allowedFields && !allowedFields.includes(field)) {\n throw new BadRequestError(`Filtering on field '${field}' is not allowed`)\n }\n}\n\n/**\n * Validate that an operator is supported\n */\nfunction validateOperator(operator: FilterOperator): void {\n if (!(operator in OPERATOR_MAP)) {\n throw new BadRequestError(\n `Unsupported filter operator: '${operator}'. Supported: ${Object.keys(OPERATOR_MAP).join(', ')}`,\n )\n }\n}\n\n/**\n * Apply a single filter condition to the filter object\n */\nfunction applyFilter(\n filter: FilterQuery<any>,\n field: string,\n operator: FilterOperator,\n rawValue: string,\n fieldType?: FieldType,\n maxRegexLength?: number,\n): void {\n const mongoOp = OPERATOR_MAP[operator]\n const value = coerceValue(rawValue, operator, fieldType, maxRegexLength)\n\n if (operator === 'eq') {\n // Simple equality - don't nest in $eq for cleaner queries\n filter[field] = value\n } else {\n if (!filter[field] || typeof filter[field] !== 'object') {\n filter[field] = {}\n }\n filter[field][mongoOp] = value\n }\n}\n\n/**\n * Coerce string values from query params to appropriate types\n */\nfunction coerceValue(\n raw: string,\n operator: FilterOperator,\n fieldType?: FieldType,\n maxRegexLength = DEFAULT_MAX_REGEX_LENGTH,\n): any {\n // Handle array operators\n if (operator === 'in' || operator === 'nin') {\n const items = String(raw).split(',').map((s) => s.trim())\n return items.map((item) => coerceSingleValue(item, fieldType))\n }\n\n // Handle exists operator\n if (operator === 'exists') {\n return raw === 'true' || raw === '1'\n }\n\n // Handle like operator (regex)\n if (operator === 'like') {\n const pattern = String(raw)\n if (pattern.length > maxRegexLength) {\n throw new BadRequestError(\n `Regex pattern too long. Maximum length: ${maxRegexLength}`,\n )\n }\n // Escape special regex characters for safety, then make it a partial match\n const escaped = escapeRegex(pattern)\n return new RegExp(escaped, 'i')\n }\n\n return coerceSingleValue(raw, fieldType)\n}\n\n/**\n * Coerce a single value based on field type\n */\nfunction coerceSingleValue(raw: string, fieldType?: FieldType): any {\n const str = String(raw)\n\n // If we know the field type, coerce accordingly\n if (fieldType) {\n switch (fieldType) {\n case FieldType.Number:\n const num = Number(str)\n if (!isNaN(num)) return num\n break\n case FieldType.Boolean:\n if (str === 'true' || str === '1') return true\n if (str === 'false' || str === '0') return false\n break\n case FieldType.Date:\n const date = new Date(str)\n if (!isNaN(date.getTime())) return date\n break\n }\n }\n\n // Auto-detect types if field type not known\n // Numbers\n if (/^-?\\d+(\\.\\d+)?$/.test(str)) {\n return Number(str)\n }\n\n // Booleans\n if (str === 'true') return true\n if (str === 'false') return false\n\n // ISO dates\n if (/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2})?/.test(str)) {\n const date = new Date(str)\n if (!isNaN(date.getTime())) return date\n }\n\n return str\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","import { SortOrder } from 'mongoose'\nimport { MongoQuery, QueryConfig, PaginationMeta } from '../types'\nimport { SchemaAdapter } from '../types/schema'\nimport { parseFilters } from './filter-parser'\nimport { BadRequestError } from '../utils/errors'\n\nconst DEFAULT_PAGE = 1\nconst DEFAULT_LIMIT = 10\nconst DEFAULT_MAX_LIMIT = 100\n\ninterface QueryBuilderOptions {\n adapter?: SchemaAdapter\n queryConfig?: QueryConfig\n defaultLimit?: number\n maxLimit?: number\n maxRegexLength?: number\n}\n\n/**\n * Build a complete MongoDB query from Express request query parameters.\n * Handles filters, sorting, pagination, and field projection.\n */\nexport function buildQuery(\n queryParams: Record<string, any>,\n options: QueryBuilderOptions = {},\n): MongoQuery {\n const {\n adapter,\n queryConfig,\n defaultLimit = queryConfig?.defaultLimit ?? DEFAULT_LIMIT,\n maxLimit = queryConfig?.maxLimit ?? DEFAULT_MAX_LIMIT,\n maxRegexLength,\n } = options\n\n const filter = parseFilters(queryParams, { adapter, queryConfig, maxRegexLength })\n const sort = parseSort(queryParams.sort, queryConfig, adapter)\n const { skip, limit } = parsePagination(queryParams, defaultLimit, maxLimit)\n const projection = parseProjection(queryParams.fields, adapter)\n\n const mongoQuery: MongoQuery = { filter }\n\n if (Object.keys(sort).length > 0) {\n mongoQuery.sort = sort\n }\n\n mongoQuery.skip = skip\n mongoQuery.limit = limit\n\n if (projection && Object.keys(projection).length > 0) {\n mongoQuery.projection = projection\n }\n\n return mongoQuery\n}\n\n/**\n * Parse sort parameter into MongoDB sort object.\n * Format: \"field1,-field2\" (prefix with - for descending)\n */\nfunction parseSort(\n sortParam: string | string[] | undefined,\n queryConfig?: QueryConfig,\n adapter?: SchemaAdapter,\n): Record<string, SortOrder> {\n const sort: Record<string, SortOrder> = {}\n\n if (!sortParam && queryConfig?.defaultSort) {\n sortParam = queryConfig.defaultSort\n }\n\n if (!sortParam) return sort\n\n const fields = Array.isArray(sortParam)\n ? sortParam\n : sortParam.split(',').map((s) => s.trim())\n\n const allowedSorts = queryConfig?.allowedSorts ?? adapter?.getFields()\n\n for (const field of fields) {\n if (!field) continue\n\n let direction: SortOrder = 1\n let fieldName = field\n\n if (field.startsWith('-')) {\n direction = -1\n fieldName = field.substring(1)\n }\n\n // Validate sort field\n if (fieldName.startsWith('$')) {\n throw new BadRequestError(`Invalid sort field: ${fieldName}`)\n }\n\n if (allowedSorts && !allowedSorts.includes(fieldName)) {\n throw new BadRequestError(`Sorting by '${fieldName}' is not allowed`)\n }\n\n sort[fieldName] = direction\n }\n\n return sort\n}\n\n/**\n * Parse pagination parameters\n */\nfunction parsePagination(\n queryParams: Record<string, any>,\n defaultLimit: number,\n maxLimit: number,\n): { skip: number; limit: number; page: number } {\n let page = parseInt(queryParams.page, 10)\n let limit = parseInt(queryParams.limit, 10)\n\n if (isNaN(page) || page < 1) page = DEFAULT_PAGE\n if (isNaN(limit) || limit < 1) limit = defaultLimit\n if (limit > maxLimit) limit = maxLimit\n\n const skip = (page - 1) * limit\n\n return { skip, limit, page }\n}\n\n/**\n * Parse field projection parameter.\n * Format: \"field1,field2,field3\"\n */\nfunction parseProjection(\n fieldsParam: string | string[] | undefined,\n adapter?: SchemaAdapter,\n): Record<string, 0 | 1> | undefined {\n if (!fieldsParam) return undefined\n\n const fields = Array.isArray(fieldsParam)\n ? fieldsParam\n : fieldsParam.split(',').map((s) => s.trim())\n\n const schemaFields = adapter?.getFields()\n const projection: Record<string, 0 | 1> = {}\n\n for (const field of fields) {\n if (!field) continue\n\n if (field.startsWith('$')) {\n throw new BadRequestError(`Invalid projection field: ${field}`)\n }\n\n // Only allow projection on schema fields if adapter is available\n if (schemaFields && !schemaFields.includes(field)) {\n throw new BadRequestError(`Field '${field}' does not exist in schema`)\n }\n\n projection[field] = 1\n }\n\n return Object.keys(projection).length > 0 ? projection : undefined\n}\n\n/**\n * Build pagination metadata from query results\n */\nexport function buildPaginationMeta(\n total: number,\n page: number,\n limit: number,\n): PaginationMeta {\n return {\n page,\n limit,\n total,\n totalPages: Math.ceil(total / limit),\n }\n}\n\n/**\n * Extract page and limit from query params (for use in handlers)\n */\nexport function extractPagination(\n queryParams: Record<string, any>,\n defaultLimit = DEFAULT_LIMIT,\n maxLimit = DEFAULT_MAX_LIMIT,\n): { page: number; limit: number } {\n let page = parseInt(queryParams.page, 10)\n let limit = parseInt(queryParams.limit, 10)\n\n if (isNaN(page) || page < 1) page = DEFAULT_PAGE\n if (isNaN(limit) || limit < 1) limit = defaultLimit\n if (limit > maxLimit) limit = maxLimit\n\n return { page, limit }\n}\n","import { Request, Response } from 'express'\nimport { LifecycleHooks, HookContext, CRUDOperation, MongoQuery, User } from '../types'\nimport { Logger } from '../types/config'\n\ninterface CreateHookContextParams {\n collection: string\n operation: CRUDOperation\n req: Request\n res: Response\n query?: MongoQuery\n data?: any\n id?: string\n result?: any\n}\n\n/**\n * Create a hook context object\n */\nexport function createHookContext(params: CreateHookContextParams): HookContext {\n const user = (params.req as any).user as User | undefined\n\n return {\n collection: params.collection,\n operation: params.operation,\n user,\n query: params.query,\n data: params.data,\n id: params.id,\n result: params.result,\n req: params.req,\n res: params.res,\n meta: {},\n }\n}\n\n/**\n * Execute a lifecycle hook if it exists.\n * Returns the (possibly modified) context.\n */\nexport async function executeHook(\n hooks: Partial<LifecycleHooks> | undefined,\n hookName: keyof LifecycleHooks,\n ctx: HookContext,\n logger?: Logger,\n): Promise<HookContext> {\n if (!hooks) return ctx\n\n const hookFn = hooks[hookName]\n if (!hookFn) return ctx\n\n try {\n await hookFn(ctx)\n } catch (error: any) {\n if (logger) {\n logger.error(`Hook '${hookName}' failed for collection '${ctx.collection}': ${error.message}`)\n }\n throw error\n }\n\n return ctx\n}\n","import { Request, Response, NextFunction } from 'express'\nimport { Model } from 'mongoose'\nimport { CollectionConfig, Handler, Logger, ListResponse, SingleResponse, DefaultConfig } from '../types'\nimport { SchemaAdapter } from '../types/schema'\nimport { buildQuery, buildPaginationMeta, extractPagination } from './query-builder'\nimport { createHookContext, executeHook } from './hook-executor'\nimport { NotFoundError, ValidationError } from '../utils/errors'\n\ninterface CRUDHandlerOptions {\n collectionName: string\n model: Model<any>\n adapter: SchemaAdapter\n config: CollectionConfig\n defaults?: DefaultConfig\n logger?: Logger\n}\n\n/**\n * Create all CRUD handlers for a collection\n */\nexport function createCRUDHandlers(options: CRUDHandlerOptions) {\n const { collectionName, model, adapter, config, defaults, logger } = options\n\n return {\n list: config.handlers?.list ?? createListHandler(collectionName, model, adapter, config, defaults, logger),\n get: config.handlers?.get ?? createGetHandler(collectionName, model, adapter, config, logger),\n create: config.handlers?.create ?? createCreateHandler(collectionName, model, adapter, config, logger),\n update: config.handlers?.update ?? createUpdateHandler(collectionName, model, adapter, config, logger),\n patch: config.handlers?.patch ?? createPatchHandler(collectionName, model, adapter, config, logger),\n delete: config.handlers?.delete ?? createDeleteHandler(collectionName, model, config, logger),\n }\n}\n\n/**\n * GET /:collection - List documents with filtering, sorting, pagination\n */\nfunction createListHandler(\n collectionName: string,\n model: Model<any>,\n adapter: SchemaAdapter,\n config: CollectionConfig,\n defaults?: DefaultConfig,\n logger?: Logger,\n): Handler {\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const mongoQuery = buildQuery(req.query as Record<string, any>, {\n adapter,\n queryConfig: config.query ?? defaults?.query,\n defaultLimit: defaults?.pagination?.limit,\n maxLimit: defaults?.pagination?.maxLimit,\n maxRegexLength: defaults?.security?.maxRegexLength,\n })\n\n // Execute beforeFind hook\n const ctx = createHookContext({\n collection: collectionName,\n operation: 'find',\n req,\n res,\n query: mongoQuery,\n })\n await executeHook(config.hooks, 'beforeFind', ctx, logger)\n\n if (ctx.preventDefault) {\n return\n }\n\n // Use potentially modified query from hooks\n const query = ctx.query ?? mongoQuery\n\n const [docs, total] = await Promise.all([\n model\n .find(query.filter)\n .sort(query.sort)\n .skip(query.skip ?? 0)\n .limit(query.limit ?? 10)\n .select(query.projection ?? {})\n .lean()\n .exec(),\n model.countDocuments(query.filter).exec(),\n ])\n\n const { page, limit } = extractPagination(req.query as Record<string, any>, defaults?.pagination?.limit, defaults?.pagination?.maxLimit)\n\n // Execute afterFind hook\n ctx.result = docs\n await executeHook(config.hooks, 'afterFind', ctx, logger)\n\n const response: ListResponse = {\n data: ctx.result ?? docs,\n meta: buildPaginationMeta(total, page, limit),\n }\n\n res.json(response)\n } catch (error) {\n next(error)\n }\n }\n}\n\n/**\n * GET /:collection/:id - Get a single document\n */\nfunction createGetHandler(\n collectionName: string,\n model: Model<any>,\n _adapter: SchemaAdapter,\n config: CollectionConfig,\n logger?: Logger,\n): Handler {\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params\n\n // Parse field projection\n const fieldsParam = (req.query as Record<string, any>).fields\n let projection: Record<string, 1> | undefined\n if (fieldsParam) {\n const fields = typeof fieldsParam === 'string' ? fieldsParam.split(',') : fieldsParam\n projection = {}\n for (const f of fields) {\n const trimmed = (f as string).trim()\n if (trimmed && !trimmed.startsWith('$')) {\n projection[trimmed] = 1\n }\n }\n }\n\n const ctx = createHookContext({\n collection: collectionName,\n operation: 'find',\n req,\n res,\n id,\n })\n await executeHook(config.hooks, 'beforeFind', ctx, logger)\n\n if (ctx.preventDefault) return\n\n let query = model.findById(id)\n if (projection) query = query.select(projection)\n\n const doc = await query.lean().exec()\n\n if (!doc) {\n throw new NotFoundError(collectionName, id)\n }\n\n ctx.result = doc\n await executeHook(config.hooks, 'afterFind', ctx, logger)\n\n const response: SingleResponse = { data: ctx.result ?? doc }\n res.json(response)\n } catch (error) {\n next(error)\n }\n }\n}\n\n/**\n * POST /:collection - Create a document\n */\nfunction createCreateHandler(\n collectionName: string,\n model: Model<any>,\n adapter: SchemaAdapter,\n config: CollectionConfig,\n logger?: Logger,\n): Handler {\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const data = req.body\n\n // Validate using adapter\n const validation = await adapter.validate(data)\n if (!validation.valid) {\n throw new ValidationError('Validation failed', validation.errors)\n }\n\n const ctx = createHookContext({\n collection: collectionName,\n operation: 'create',\n req,\n res,\n data: validation.data ?? data,\n })\n await executeHook(config.hooks, 'beforeCreate', ctx, logger)\n\n if (ctx.preventDefault) return\n\n const doc = await model.create(ctx.data ?? data)\n const result = doc.toObject()\n\n ctx.result = result\n await executeHook(config.hooks, 'afterCreate', ctx, logger)\n\n const response: SingleResponse = { data: ctx.result ?? result }\n res.status(201).json(response)\n } catch (error) {\n next(error)\n }\n }\n}\n\n/**\n * PUT /:collection/:id - Full replace update\n */\nfunction createUpdateHandler(\n collectionName: string,\n model: Model<any>,\n adapter: SchemaAdapter,\n config: CollectionConfig,\n logger?: Logger,\n): Handler {\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params\n const data = req.body\n\n const validation = await adapter.validate(data)\n if (!validation.valid) {\n throw new ValidationError('Validation failed', validation.errors)\n }\n\n const ctx = createHookContext({\n collection: collectionName,\n operation: 'update',\n req,\n res,\n id,\n data: validation.data ?? data,\n })\n await executeHook(config.hooks, 'beforeUpdate', ctx, logger)\n\n if (ctx.preventDefault) return\n\n const doc = await model\n .findByIdAndUpdate(id, ctx.data ?? data, { new: true, runValidators: true, overwrite: true })\n .lean()\n .exec()\n\n if (!doc) {\n throw new NotFoundError(collectionName, id)\n }\n\n ctx.result = doc\n await executeHook(config.hooks, 'afterUpdate', ctx, logger)\n\n const response: SingleResponse = { data: ctx.result ?? doc }\n res.json(response)\n } catch (error) {\n next(error)\n }\n }\n}\n\n/**\n * PATCH /:collection/:id - Partial update\n */\nfunction createPatchHandler(\n collectionName: string,\n model: Model<any>,\n _adapter: SchemaAdapter,\n config: CollectionConfig,\n logger?: Logger,\n): Handler {\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params\n const data = req.body\n\n // For patch, we don't do full validation - just check types\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new ValidationError('Request body must be an object')\n }\n\n // Block MongoDB operators in patch body\n for (const key of Object.keys(data)) {\n if (key.startsWith('$')) {\n throw new ValidationError(`Invalid field name: ${key}`)\n }\n }\n\n const ctx = createHookContext({\n collection: collectionName,\n operation: 'patch',\n req,\n res,\n id,\n data,\n })\n await executeHook(config.hooks, 'beforeUpdate', ctx, logger)\n\n if (ctx.preventDefault) return\n\n const doc = await model\n .findByIdAndUpdate(id, { $set: ctx.data ?? data }, { new: true, runValidators: true })\n .lean()\n .exec()\n\n if (!doc) {\n throw new NotFoundError(collectionName, id)\n }\n\n ctx.result = doc\n await executeHook(config.hooks, 'afterUpdate', ctx, logger)\n\n const response: SingleResponse = { data: ctx.result ?? doc }\n res.json(response)\n } catch (error) {\n next(error)\n }\n }\n}\n\n/**\n * DELETE /:collection/:id - Delete a document\n */\nfunction createDeleteHandler(\n collectionName: string,\n model: Model<any>,\n config: CollectionConfig,\n logger?: Logger,\n): Handler {\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params\n\n const ctx = createHookContext({\n collection: collectionName,\n operation: 'delete',\n req,\n res,\n id,\n })\n await executeHook(config.hooks, 'beforeDelete', ctx, logger)\n\n if (ctx.preventDefault) return\n\n const doc = await model.findByIdAndDelete(id).lean().exec()\n\n if (!doc) {\n throw new NotFoundError(collectionName, id)\n }\n\n ctx.result = doc\n await executeHook(config.hooks, 'afterDelete', ctx, logger)\n\n res.json({ data: ctx.result ?? doc })\n } catch (error) {\n next(error)\n }\n }\n}\n","import { Request, Response, NextFunction } from 'express'\nimport { PermissionConfig, Permission, PermissionContext, AuthConfig, User, CRUDOperation } from '../types'\nimport { ForbiddenError, UnauthorizedError } from '../utils/errors'\n\n/**\n * Map route operations to CRUD operations for permission checking\n */\nconst ROUTE_TO_CRUD: Record<string, CRUDOperation> = {\n list: 'find',\n get: 'find',\n create: 'create',\n update: 'update',\n patch: 'patch',\n delete: 'delete',\n}\n\n/**\n * Create middleware that checks permissions for a specific operation\n */\nexport function createPermissionMiddleware(\n collection: string,\n routeOp: string,\n permissions?: PermissionConfig,\n) {\n return async (req: Request, _res: Response, next: NextFunction): Promise<void> => {\n try {\n // If no permissions configured, allow all\n if (!permissions) {\n next()\n return\n }\n\n const permission = permissions[routeOp as keyof PermissionConfig]\n\n // If no permission for this operation, allow\n if (!permission) {\n next()\n return\n }\n\n const user = (req as any).user as User | undefined\n\n // Permission is set but no user - require auth\n if (!user) {\n throw new UnauthorizedError()\n }\n\n const crudOp = ROUTE_TO_CRUD[routeOp] || (routeOp as CRUDOperation)\n const allowed = await checkPermission(permission, {\n user,\n collection,\n operation: crudOp,\n data: req.body,\n id: req.params.id,\n req,\n })\n\n if (!allowed) {\n throw new ForbiddenError()\n }\n\n next()\n } catch (error) {\n next(error)\n }\n }\n}\n\n/**\n * Check a permission - either role-based (string array) or custom function\n */\nasync function checkPermission(\n permission: Permission,\n ctx: PermissionContext,\n): Promise<boolean> {\n // Role-based: check if user has any of the required roles\n if (Array.isArray(permission)) {\n if (!ctx.user.roles || ctx.user.roles.length === 0) {\n return false\n }\n return permission.some((role) => ctx.user.roles?.includes(role))\n }\n\n // Custom permission function\n if (typeof permission === 'function') {\n return permission(ctx)\n }\n\n return false\n}\n\n/**\n * Create auth middleware that extracts user from request.\n * If authConfig has a custom middleware, use it.\n * Otherwise, this is a no-op (user must set req.user themselves).\n */\nexport function createAuthMiddleware(authConfig?: AuthConfig) {\n if (authConfig?.middleware) {\n return authConfig.middleware\n }\n\n // Default: no-op, expect user to be set by upstream middleware\n return (_req: Request, _res: Response, next: NextFunction): void => {\n next()\n }\n}\n","import { Router, RequestHandler } from 'express'\nimport { Model } from 'mongoose'\nimport { CollectionConfig, DefaultConfig, Logger } from '../types'\nimport { SchemaAdapter } from '../types/schema'\nimport { createCRUDHandlers } from '../engine/crud-handlers'\nimport { createPermissionMiddleware } from '../middleware/auth'\n\ninterface RouterOptions {\n collectionName: string\n model: Model<any>\n adapter: SchemaAdapter\n config: CollectionConfig\n defaults?: DefaultConfig\n logger?: Logger\n authMiddleware?: RequestHandler\n}\n\n/**\n * Create an Express router for a single collection with all CRUD routes.\n */\nexport function createCollectionRouter(options: RouterOptions): Router {\n const { collectionName, model, adapter, config, defaults, logger, authMiddleware } = options\n\n const router = Router()\n const handlers = createCRUDHandlers({ collectionName, model, adapter, config, defaults, logger })\n\n const operations = ['list', 'get', 'create', 'update', 'patch', 'delete'] as const\n\n // Build middleware stacks for each operation\n const middlewareStacks: Record<string, RequestHandler[]> = {}\n for (const op of operations) {\n const stack: RequestHandler[] = []\n\n // Global auth middleware\n if (authMiddleware) {\n stack.push(authMiddleware)\n }\n\n // Per-collection middleware (all)\n if (config.middleware?.all) {\n stack.push(...config.middleware.all)\n }\n\n // Per-operation middleware\n const opMiddleware = config.middleware?.[op]\n if (opMiddleware) {\n stack.push(...opMiddleware)\n }\n\n // Permission middleware\n if (config.permissions) {\n stack.push(createPermissionMiddleware(collectionName, op, config.permissions) as RequestHandler)\n }\n\n middlewareStacks[op] = stack\n }\n\n // Register routes\n router.get('/', ...middlewareStacks.list, handlers.list as RequestHandler)\n router.get('/:id', ...middlewareStacks.get, handlers.get as RequestHandler)\n router.post('/', ...middlewareStacks.create, handlers.create as RequestHandler)\n router.put('/:id', ...middlewareStacks.update, handlers.update as RequestHandler)\n router.patch('/:id', ...middlewareStacks.patch, handlers.patch as RequestHandler)\n router.delete('/:id', ...middlewareStacks.delete, handlers.delete as RequestHandler)\n\n return router\n}\n","import { Request, Response, NextFunction } from 'express'\nimport { MonapiError } from '../utils/errors'\nimport { Logger, ErrorResponse } from '../types'\n\n/**\n * Create Express error handling middleware\n */\nexport function createErrorHandler(logger?: Logger) {\n return (err: Error, _req: Request, res: Response, _next: NextFunction): void => {\n if (err instanceof MonapiError) {\n if (logger) {\n logger.warn(`${err.code}: ${err.message}`, { statusCode: err.statusCode })\n }\n\n const response: ErrorResponse = {\n error: {\n code: err.code,\n message: err.message,\n details: err.details,\n },\n }\n res.status(err.statusCode).json(response)\n return\n }\n\n // Unknown errors - don't leak internals in production\n if (logger) {\n logger.error(`Unhandled error: ${err.message}`, { stack: err.stack })\n }\n\n const message =\n process.env.NODE_ENV === 'production' ? 'Internal server error' : err.message\n\n const response: ErrorResponse = {\n error: {\n code: 'INTERNAL_ERROR',\n message,\n },\n }\n res.status(500).json(response)\n }\n}\n","import { Logger } from '../types'\n\n/**\n * Default console logger for Monapi\n */\nexport const defaultLogger: Logger = {\n info(message: string, meta?: any) {\n console.log(`[monapi] INFO: ${message}`, meta ? meta : '')\n },\n warn(message: string, meta?: any) {\n console.warn(`[monapi] WARN: ${message}`, meta ? meta : '')\n },\n error(message: string, meta?: any) {\n console.error(`[monapi] ERROR: ${message}`, meta ? meta : '')\n },\n debug(message: string, meta?: any) {\n if (process.env.NODE_ENV !== 'production') {\n console.log(`[monapi] DEBUG: ${message}`, meta ? meta : '')\n }\n },\n}\n","import { Router, RequestHandler } from 'express'\nimport { Model } from 'mongoose'\nimport { MonapiConfig, CollectionConfig, Logger } from './types'\nimport { SchemaAdapter } from './types/schema'\nimport { createSchemaAdapter } from './adapters/schema'\nimport { createCollectionRouter } from './router/express-router'\nimport { createErrorHandler } from './middleware/error-handler'\nimport { createAuthMiddleware } from './middleware/auth'\nimport { defaultLogger } from './utils/logger'\n\n/**\n * Main Monapi class - orchestrates everything.\n *\n * Usage:\n * const monapi = new Monapi({ connection: mongoose.connection })\n * monapi.resource('users', { schema: UserSchema })\n * monapi.resource('posts', { schema: PostModel })\n * app.use('/api', monapi.router())\n */\nexport class Monapi {\n private config: MonapiConfig\n private logger: Logger\n private collections: Map<string, { config: CollectionConfig; model: Model<any>; adapter: SchemaAdapter }> = new Map()\n private authMiddleware?: RequestHandler\n\n constructor(config: MonapiConfig) {\n this.config = config\n this.logger = config.logger ?? defaultLogger\n\n if (config.auth) {\n this.authMiddleware = createAuthMiddleware(config.auth)\n }\n }\n\n /**\n * Register a collection resource.\n * This will auto-generate all CRUD endpoints for the collection.\n */\n resource(name: string, collectionConfig: CollectionConfig): this {\n const adapter = collectionConfig.adapter ?? createSchemaAdapter(collectionConfig.schema)\n const model = this.resolveModel(name, collectionConfig, adapter)\n\n this.collections.set(name, { config: collectionConfig, model, adapter })\n\n this.logger.debug(`Registered resource: ${name}`, {\n fields: adapter.getFields(),\n })\n\n return this\n }\n\n /**\n * Generate the Express router with all registered collection routes.\n */\n router(): Router {\n const mainRouter = Router()\n const basePath = this.config.basePath ?? ''\n\n for (const [name, { config, model, adapter }] of this.collections) {\n const collectionRouter = createCollectionRouter({\n collectionName: name,\n model,\n adapter,\n config,\n defaults: this.config.defaults,\n logger: this.logger,\n authMiddleware: this.authMiddleware,\n })\n\n const path = basePath ? `${basePath}/${name}` : `/${name}`\n mainRouter.use(path, collectionRouter)\n\n this.logger.info(`Mounted routes: ${path}`)\n }\n\n // Attach error handler\n mainRouter.use(createErrorHandler(this.logger))\n\n return mainRouter\n }\n\n /**\n * Get a registered collection's model\n */\n getModel(name: string): Model<any> | undefined {\n return this.collections.get(name)?.model\n }\n\n /**\n * Get a registered collection's adapter\n */\n getAdapter(name: string): SchemaAdapter | undefined {\n return this.collections.get(name)?.adapter\n }\n\n /**\n * Resolve or create a Mongoose model from the collection config.\n */\n private resolveModel(name: string, config: CollectionConfig, adapter: SchemaAdapter): Model<any> {\n // If model is explicitly provided\n if (config.model) {\n return config.model\n }\n\n // If the adapter has a Mongoose model (e.g., Model was passed as schema)\n const adapterModel = adapter.getMongooseModel?.()\n if (adapterModel) {\n return adapterModel\n }\n\n // If a raw Mongoose Schema was provided, create a model\n const mongooseSchema = adapter.getMongooseSchema?.()\n if (mongooseSchema) {\n const modelName = name.charAt(0).toUpperCase() + name.slice(1)\n return this.config.connection.model(modelName, mongooseSchema)\n }\n\n throw new Error(\n `Cannot resolve Mongoose model for collection '${name}'. ` +\n 'Provide a Mongoose Model, a Mongoose Schema, or set the model option.',\n )\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "monapi",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Automatically generate secure, extensible REST APIs for MongoDB collections using configuration only",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/subhradwip01/monapi.git"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/subhradwip01/monapi#readme",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/subhradwip01/monapi/issues"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsup",
|
|
29
|
+
"dev": "tsup --watch",
|
|
30
|
+
"test": "jest",
|
|
31
|
+
"test:watch": "jest --watch",
|
|
32
|
+
"test:coverage": "jest --coverage",
|
|
33
|
+
"lint": "eslint src/**/*.ts",
|
|
34
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
35
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
36
|
+
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
37
|
+
"typecheck": "tsc --noEmit",
|
|
38
|
+
"prepublishOnly": "npm run build"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"mongodb",
|
|
42
|
+
"rest",
|
|
43
|
+
"api",
|
|
44
|
+
"crud",
|
|
45
|
+
"mongoose",
|
|
46
|
+
"express",
|
|
47
|
+
"typescript",
|
|
48
|
+
"auto-generate"
|
|
49
|
+
],
|
|
50
|
+
"author": "",
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"express": "^4.18.0 || ^5.0.0",
|
|
54
|
+
"mongoose": "^7.0.0 || ^8.0.0"
|
|
55
|
+
},
|
|
56
|
+
"peerDependenciesMeta": {
|
|
57
|
+
"express": { "optional": false },
|
|
58
|
+
"mongoose": { "optional": false }
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/express": "^4.17.21",
|
|
62
|
+
"@types/jest": "^29.5.11",
|
|
63
|
+
"@types/node": "^20.10.6",
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
|
65
|
+
"@typescript-eslint/parser": "^6.17.0",
|
|
66
|
+
"eslint": "^8.56.0",
|
|
67
|
+
"eslint-config-prettier": "^9.1.0",
|
|
68
|
+
"eslint-plugin-prettier": "^5.1.2",
|
|
69
|
+
"express": "^4.18.2",
|
|
70
|
+
"jest": "^29.7.0",
|
|
71
|
+
"prettier": "^3.1.1",
|
|
72
|
+
"ts-jest": "^29.1.1",
|
|
73
|
+
"tsup": "^8.0.1",
|
|
74
|
+
"typescript": "^5.3.3"
|
|
75
|
+
},
|
|
76
|
+
"engines": {
|
|
77
|
+
"node": ">=16.0.0"
|
|
78
|
+
}
|
|
79
|
+
}
|