@mesob/common 0.2.5 → 0.3.1
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/dist/index.d.ts +1 -0
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/utility/string.d.ts +3 -0
- package/dist/utility/string.js +20 -0
- package/dist/utility/string.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,5 +6,6 @@ export { EntityListResponse } from './entity/entity-list-response.js';
|
|
|
6
6
|
export { entityPaginatedRows } from './entity/entity-pagination.js';
|
|
7
7
|
export { default as dayjs } from 'dayjs';
|
|
8
8
|
export { default as logger } from './utility/logger.js';
|
|
9
|
+
export { toTitleCase } from './utility/string.js';
|
|
9
10
|
import 'drizzle-orm';
|
|
10
11
|
import 'zod';
|
package/dist/index.js
CHANGED
|
@@ -313,6 +313,23 @@ var LoggerService = class {
|
|
|
313
313
|
};
|
|
314
314
|
var logger = new LoggerService();
|
|
315
315
|
var logger_default = logger;
|
|
316
|
+
|
|
317
|
+
// src/utility/string.ts
|
|
318
|
+
var normalizeTitleInput = (value) => {
|
|
319
|
+
const spaced = value.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").replace(/\s+/g, " ").trim();
|
|
320
|
+
return spaced;
|
|
321
|
+
};
|
|
322
|
+
var toTitleCase = (value) => {
|
|
323
|
+
const normalized = normalizeTitleInput(value);
|
|
324
|
+
if (!normalized) {
|
|
325
|
+
return "";
|
|
326
|
+
}
|
|
327
|
+
return normalized.split(" ").map((word) => {
|
|
328
|
+
const first = word[0];
|
|
329
|
+
const rest = word.slice(1);
|
|
330
|
+
return `${first.toUpperCase()}${rest.toLowerCase()}`;
|
|
331
|
+
}).join(" ");
|
|
332
|
+
};
|
|
316
333
|
export {
|
|
317
334
|
dayjs_default as dayjs,
|
|
318
335
|
entityFilterCondition,
|
|
@@ -320,6 +337,7 @@ export {
|
|
|
320
337
|
entityListRequestSchema,
|
|
321
338
|
entityPaginatedRows,
|
|
322
339
|
entityResponse,
|
|
323
|
-
logger_default as logger
|
|
340
|
+
logger_default as logger,
|
|
341
|
+
toTitleCase
|
|
324
342
|
};
|
|
325
343
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entity/entity-filter-condition.ts","../src/entity/entity-list.ts","../src/entity/entity-list-request-schema.ts","../src/entity/entity-pagination.ts","../src/lib/dayjs/index.ts","../src/utility/logger.ts"],"sourcesContent":["import type { SQL, SQLWrapper } from 'drizzle-orm';\nimport {\n eq,\n gt,\n gte,\n ilike,\n isNull,\n like,\n lt,\n lte,\n ne,\n not,\n} from 'drizzle-orm';\nimport type { EntityListRequest } from './entity-list-request';\n\ntype FilterOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'is'\n | 'is_not';\n\ntype Column = SQLWrapper | SQL;\n\nconst operatorMap: Record<\n Exclude<FilterOperator, 'is' | 'is_not'>,\n (col: Column, val: string) => SQL\n> = {\n eq: (col, val) => eq(col as SQL, val),\n neq: (col, val) => ne(col as SQL, val),\n gt: (col, val) => gt(col as SQL, val),\n gte: (col, val) => gte(col as SQL, val),\n lt: (col, val) => lt(col as SQL, val),\n lte: (col, val) => lte(col as SQL, val),\n like: (col, val) => like(col as SQL, val),\n ilike: (col, val) => ilike(col as SQL, val),\n};\n\nconst buildCondition = (\n column: Column,\n value: string,\n operator: FilterOperator = 'eq',\n): SQL | undefined => {\n if (operator === 'is') {\n return isNull(column as any);\n }\n if (operator === 'is_not') {\n return not(isNull(column as any));\n }\n const fn = operatorMap[operator];\n return fn ? fn(column, value) : undefined;\n};\n\nexport const entityFilterCondition = <T extends Record<string, Column>>(\n filters: EntityListRequest['f'],\n columnMap: T,\n): SQL[] => {\n if (!filters) {\n return [];\n }\n\n const conditions: SQL[] = [];\n for (const filter of filters) {\n const col = columnMap[filter.f as keyof T];\n if (!col) {\n continue;\n }\n const condition = buildCondition(col, filter.v, filter.o ?? 'eq');\n if (condition) {\n conditions.push(condition);\n }\n }\n return conditions;\n};\n","import type {\n Column,\n ColumnBaseConfig,\n ColumnDataType,\n SQLWrapper,\n} from 'drizzle-orm';\nimport {\n eq,\n gt,\n gte,\n ilike,\n isNull,\n like,\n lt,\n lte,\n ne,\n not,\n or,\n type SQL,\n} from 'drizzle-orm';\nimport type { EntityListRequest } from './entity-list-request';\n\ntype FilterOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'is'\n | 'is_not';\n\nconst operatorMap: Partial<\n Record<\n FilterOperator,\n (\n column:\n | Column<ColumnBaseConfig<ColumnDataType, string>, object, object>\n | SQLWrapper,\n value?: string,\n ) => SQLWrapper | SQL\n >\n> = {\n eq: (col, val) =>\n eq(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n neq: (col, val) =>\n ne(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n gt: (col, val) =>\n gt(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n gte: (col, val) =>\n gte(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n lt: (col, val) =>\n lt(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n lte: (col, val) =>\n lte(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n like: (col, val) =>\n like(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n ilike: (col, val) =>\n ilike(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n};\n\ntype EntityListParams<T> = {\n search?: SQLWrapper[];\n filter?: EntityListRequest['f'];\n booleanFilter?: {\n column: Column<ColumnBaseConfig<ColumnDataType, string>, object, object>;\n value: boolean;\n };\n orderByConfig?: {\n column: string | SQLWrapper;\n direction: 'asc' | 'desc';\n };\n p?: number;\n pp?: number;\n tenantId?: string;\n entity: T;\n skipTenantIdFilter?: boolean;\n};\n\nexport const entityList = <T extends Record<string, unknown>>({\n search = [],\n filter,\n booleanFilter,\n orderByConfig = { column: 'createdAt', direction: 'desc' },\n p = 1,\n pp = 10,\n tenantId,\n entity,\n skipTenantIdFilter = false,\n}: EntityListParams<T>) => {\n const page = Number(p);\n const pageSize = Number(pp);\n const conditions: (SQL | SQLWrapper)[] = [];\n\n if (tenantId && !skipTenantIdFilter && 'tenantId' in entity) {\n const tenantColumn = (\n entity as unknown as {\n tenantId: Column<\n ColumnBaseConfig<ColumnDataType, string>,\n object,\n object\n >;\n }\n ).tenantId;\n conditions.push(eq(tenantColumn, tenantId));\n }\n\n if (search.length > 0) {\n const searchConditions = search.map((column) => column);\n const searchCondition = or(...searchConditions);\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n if (filter) {\n conditions.push(\n ...filter.map((column) => {\n const op = (column.o ?? 'eq') as FilterOperator;\n const columnObj = (\n entity as Record<\n string,\n Column<ColumnBaseConfig<ColumnDataType, string>, object, object>\n >\n )[column.f];\n\n if (!columnObj) {\n throw new Error(`Column '${column.f}' not found on entity`);\n }\n\n if (op === 'is') {\n return isNull(columnObj);\n }\n if (op === 'is_not') {\n return not(isNull(columnObj));\n }\n\n const operatorFn = operatorMap[op];\n if (!operatorFn) {\n throw new Error(`Unsupported operator: ${op}`);\n }\n\n return operatorFn(columnObj, column.v);\n }),\n );\n }\n\n if (booleanFilter) {\n conditions.push(eq(booleanFilter.column, booleanFilter.value));\n }\n\n return {\n conditions,\n orderByConfig,\n offset: (page - 1) * pageSize,\n limit: pageSize,\n };\n};\n\nexport const entityResponse = <T extends { totalCount: number }>(\n result: T[],\n): { data: Omit<T, 'totalCount'>[]; total: number } => {\n const total = result.length > 0 ? result[0].totalCount : 0;\n\n const data = result.map((item) => {\n // biome-ignore lint/correctness/noUnusedVariables: intentionally destructuring to remove totalCount\n const { totalCount, ...rest } = item;\n return rest;\n }) as Omit<T, 'totalCount'>[];\n\n return {\n data,\n total,\n };\n};\n","import { z } from 'zod';\n\nexport const entityListRequestSchema = z\n .object({\n s: z.string().optional().describe('Search term'),\n l: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .describe('Limit (per page)'),\n f: z\n .union([\n z.array(\n z.object({\n f: z.string().describe('Field name'),\n v: z.string().describe('Field value'),\n o: z\n .enum([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'like',\n 'ilike',\n 'is',\n 'is_not',\n ])\n .optional()\n .default('eq')\n .describe('Filter operator'),\n }),\n ),\n z.string().transform((str, ctx) => {\n try {\n return JSON.parse(str) as Array<{\n f: string;\n v: string;\n o?:\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'is'\n | 'is_not';\n }>;\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Invalid JSON string for filter',\n });\n return z.NEVER;\n }\n }),\n ])\n .optional()\n .describe('Filters'),\n o: z\n .union([\n z.object({\n f: z.string().describe('Order field'),\n d: z\n .enum(['asc', 'desc'])\n .default('desc')\n .describe('Order direction'),\n }),\n z.string().transform((str, ctx) => {\n try {\n const parsed = JSON.parse(str) as { f: string; d?: 'asc' | 'desc' };\n return {\n f: parsed.f,\n d: parsed.d || 'desc',\n };\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Invalid JSON string for order',\n });\n return z.NEVER;\n }\n }),\n ])\n .optional()\n .describe('Ordering'),\n p: z.coerce.number().min(1).optional().describe('Page number'),\n pp: z.coerce.number().min(1).max(100).optional().describe('Per page'),\n })\n .strict();\n","/**\n * Parses rows from a query using COUNT(*) OVER() window function\n * Returns clean data without totalCount and extracts total\n */\nexport const entityPaginatedRows = <T extends { totalCount: number }>(\n rows: T[],\n): { data: Omit<T, 'totalCount'>[]; total: number } => {\n const total = rows[0]?.totalCount ?? 0;\n const data = rows.map(({ totalCount: _, ...rest }) => rest) as Omit<\n T,\n 'totalCount'\n >[];\n return { data, total };\n};\n","// biome-ignore lint/style/noExportedImports: this is a library\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport duration from 'dayjs/plugin/duration';\nimport isBetween from 'dayjs/plugin/isBetween';\nimport isToday from 'dayjs/plugin/isToday';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport minmax from 'dayjs/plugin/minMax';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport timeZone from 'dayjs/plugin/timezone';\nimport toArray from 'dayjs/plugin/toArray';\nimport utc from 'dayjs/plugin/utc';\n\ndayjs.extend(customParseFormat);\ndayjs.extend(isBetween);\ndayjs.extend(isToday);\ndayjs.extend(localizedFormat);\ndayjs.extend(relativeTime);\ndayjs.extend(timeZone);\ndayjs.extend(toArray);\ndayjs.extend(utc);\ndayjs.extend(minmax);\ndayjs.extend(duration);\n\nexport default dayjs;\n","/** biome-ignore-all lint/suspicious/noConsole: <explanation> */\n\ntype LogMethod = (...args: unknown[]) => void;\ntype TableMethod = (tabularData?: unknown, properties?: string[]) => void;\ntype LocalStorageLike = { getItem: (key: string) => string | null };\n\nconst noop: LogMethod = () => undefined;\nconst noopTable: TableMethod = () => undefined;\n\nconst getLocalStorage = (): LocalStorageLike | null => {\n try {\n const storage = (globalThis as { localStorage?: LocalStorageLike })\n .localStorage;\n\n if (!storage) {\n return null;\n }\n\n return storage;\n } catch {\n return null;\n }\n};\n\nclass LoggerService {\n debugMode = false;\n\n constructor() {\n const storage = getLocalStorage();\n const envDebug = process.env.NODE_ENV === 'development';\n\n if (!storage) {\n this.debugMode = envDebug;\n return;\n }\n\n const stored = storage.getItem('mesob:debug');\n if (!stored) {\n this.debugMode = envDebug;\n return;\n }\n\n try {\n this.debugMode = JSON.parse(stored);\n } catch {\n this.debugMode = envDebug;\n }\n }\n\n public get log(): LogMethod {\n return this.debugMode ? console.log.bind(console) : noop;\n }\n public get debug(): LogMethod {\n return this.debugMode ? console.debug.bind(console) : noop;\n }\n public get info(): LogMethod {\n return this.debugMode ? console.info.bind(console) : noop;\n }\n public get warn(): LogMethod {\n return this.debugMode ? console.warn.bind(console) : noop;\n }\n\n public get error(): LogMethod {\n return this.debugMode ? console.error.bind(console) : noop;\n }\n\n public get table(): TableMethod {\n return this.debugMode ? console.table.bind(console) : noopTable;\n }\n}\n\nconst logger = new LoggerService();\n\nexport default logger;\n"],"mappings":"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","names":["eq","gt","gte","ilike","isNull","like","lt","lte","ne","not","operatorMap"]}
|
|
1
|
+
{"version":3,"sources":["../src/entity/entity-filter-condition.ts","../src/entity/entity-list.ts","../src/entity/entity-list-request-schema.ts","../src/entity/entity-pagination.ts","../src/lib/dayjs/index.ts","../src/utility/logger.ts","../src/utility/string.ts"],"sourcesContent":["import type { SQL, SQLWrapper } from 'drizzle-orm';\nimport {\n eq,\n gt,\n gte,\n ilike,\n isNull,\n like,\n lt,\n lte,\n ne,\n not,\n} from 'drizzle-orm';\nimport type { EntityListRequest } from './entity-list-request';\n\ntype FilterOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'is'\n | 'is_not';\n\ntype Column = SQLWrapper | SQL;\n\nconst operatorMap: Record<\n Exclude<FilterOperator, 'is' | 'is_not'>,\n (col: Column, val: string) => SQL\n> = {\n eq: (col, val) => eq(col as SQL, val),\n neq: (col, val) => ne(col as SQL, val),\n gt: (col, val) => gt(col as SQL, val),\n gte: (col, val) => gte(col as SQL, val),\n lt: (col, val) => lt(col as SQL, val),\n lte: (col, val) => lte(col as SQL, val),\n like: (col, val) => like(col as SQL, val),\n ilike: (col, val) => ilike(col as SQL, val),\n};\n\nconst buildCondition = (\n column: Column,\n value: string,\n operator: FilterOperator = 'eq',\n): SQL | undefined => {\n if (operator === 'is') {\n return isNull(column as any);\n }\n if (operator === 'is_not') {\n return not(isNull(column as any));\n }\n const fn = operatorMap[operator];\n return fn ? fn(column, value) : undefined;\n};\n\nexport const entityFilterCondition = <T extends Record<string, Column>>(\n filters: EntityListRequest['f'],\n columnMap: T,\n): SQL[] => {\n if (!filters) {\n return [];\n }\n\n const conditions: SQL[] = [];\n for (const filter of filters) {\n const col = columnMap[filter.f as keyof T];\n if (!col) {\n continue;\n }\n const condition = buildCondition(col, filter.v, filter.o ?? 'eq');\n if (condition) {\n conditions.push(condition);\n }\n }\n return conditions;\n};\n","import type {\n Column,\n ColumnBaseConfig,\n ColumnDataType,\n SQLWrapper,\n} from 'drizzle-orm';\nimport {\n eq,\n gt,\n gte,\n ilike,\n isNull,\n like,\n lt,\n lte,\n ne,\n not,\n or,\n type SQL,\n} from 'drizzle-orm';\nimport type { EntityListRequest } from './entity-list-request';\n\ntype FilterOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'is'\n | 'is_not';\n\nconst operatorMap: Partial<\n Record<\n FilterOperator,\n (\n column:\n | Column<ColumnBaseConfig<ColumnDataType, string>, object, object>\n | SQLWrapper,\n value?: string,\n ) => SQLWrapper | SQL\n >\n> = {\n eq: (col, val) =>\n eq(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n neq: (col, val) =>\n ne(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n gt: (col, val) =>\n gt(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n gte: (col, val) =>\n gte(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n lt: (col, val) =>\n lt(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n lte: (col, val) =>\n lte(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n like: (col, val) =>\n like(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n ilike: (col, val) =>\n ilike(\n col as Column<ColumnBaseConfig<ColumnDataType, string>, object, object>,\n val ?? '',\n ),\n};\n\ntype EntityListParams<T> = {\n search?: SQLWrapper[];\n filter?: EntityListRequest['f'];\n booleanFilter?: {\n column: Column<ColumnBaseConfig<ColumnDataType, string>, object, object>;\n value: boolean;\n };\n orderByConfig?: {\n column: string | SQLWrapper;\n direction: 'asc' | 'desc';\n };\n p?: number;\n pp?: number;\n tenantId?: string;\n entity: T;\n skipTenantIdFilter?: boolean;\n};\n\nexport const entityList = <T extends Record<string, unknown>>({\n search = [],\n filter,\n booleanFilter,\n orderByConfig = { column: 'createdAt', direction: 'desc' },\n p = 1,\n pp = 10,\n tenantId,\n entity,\n skipTenantIdFilter = false,\n}: EntityListParams<T>) => {\n const page = Number(p);\n const pageSize = Number(pp);\n const conditions: (SQL | SQLWrapper)[] = [];\n\n if (tenantId && !skipTenantIdFilter && 'tenantId' in entity) {\n const tenantColumn = (\n entity as unknown as {\n tenantId: Column<\n ColumnBaseConfig<ColumnDataType, string>,\n object,\n object\n >;\n }\n ).tenantId;\n conditions.push(eq(tenantColumn, tenantId));\n }\n\n if (search.length > 0) {\n const searchConditions = search.map((column) => column);\n const searchCondition = or(...searchConditions);\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n if (filter) {\n conditions.push(\n ...filter.map((column) => {\n const op = (column.o ?? 'eq') as FilterOperator;\n const columnObj = (\n entity as Record<\n string,\n Column<ColumnBaseConfig<ColumnDataType, string>, object, object>\n >\n )[column.f];\n\n if (!columnObj) {\n throw new Error(`Column '${column.f}' not found on entity`);\n }\n\n if (op === 'is') {\n return isNull(columnObj);\n }\n if (op === 'is_not') {\n return not(isNull(columnObj));\n }\n\n const operatorFn = operatorMap[op];\n if (!operatorFn) {\n throw new Error(`Unsupported operator: ${op}`);\n }\n\n return operatorFn(columnObj, column.v);\n }),\n );\n }\n\n if (booleanFilter) {\n conditions.push(eq(booleanFilter.column, booleanFilter.value));\n }\n\n return {\n conditions,\n orderByConfig,\n offset: (page - 1) * pageSize,\n limit: pageSize,\n };\n};\n\nexport const entityResponse = <T extends { totalCount: number }>(\n result: T[],\n): { data: Omit<T, 'totalCount'>[]; total: number } => {\n const total = result.length > 0 ? result[0].totalCount : 0;\n\n const data = result.map((item) => {\n // biome-ignore lint/correctness/noUnusedVariables: intentionally destructuring to remove totalCount\n const { totalCount, ...rest } = item;\n return rest;\n }) as Omit<T, 'totalCount'>[];\n\n return {\n data,\n total,\n };\n};\n","import { z } from 'zod';\n\nexport const entityListRequestSchema = z\n .object({\n s: z.string().optional().describe('Search term'),\n l: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .describe('Limit (per page)'),\n f: z\n .union([\n z.array(\n z.object({\n f: z.string().describe('Field name'),\n v: z.string().describe('Field value'),\n o: z\n .enum([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'like',\n 'ilike',\n 'is',\n 'is_not',\n ])\n .optional()\n .default('eq')\n .describe('Filter operator'),\n }),\n ),\n z.string().transform((str, ctx) => {\n try {\n return JSON.parse(str) as Array<{\n f: string;\n v: string;\n o?:\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'is'\n | 'is_not';\n }>;\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Invalid JSON string for filter',\n });\n return z.NEVER;\n }\n }),\n ])\n .optional()\n .describe('Filters'),\n o: z\n .union([\n z.object({\n f: z.string().describe('Order field'),\n d: z\n .enum(['asc', 'desc'])\n .default('desc')\n .describe('Order direction'),\n }),\n z.string().transform((str, ctx) => {\n try {\n const parsed = JSON.parse(str) as { f: string; d?: 'asc' | 'desc' };\n return {\n f: parsed.f,\n d: parsed.d || 'desc',\n };\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Invalid JSON string for order',\n });\n return z.NEVER;\n }\n }),\n ])\n .optional()\n .describe('Ordering'),\n p: z.coerce.number().min(1).optional().describe('Page number'),\n pp: z.coerce.number().min(1).max(100).optional().describe('Per page'),\n })\n .strict();\n","/**\n * Parses rows from a query using COUNT(*) OVER() window function\n * Returns clean data without totalCount and extracts total\n */\nexport const entityPaginatedRows = <T extends { totalCount: number }>(\n rows: T[],\n): { data: Omit<T, 'totalCount'>[]; total: number } => {\n const total = rows[0]?.totalCount ?? 0;\n const data = rows.map(({ totalCount: _, ...rest }) => rest) as Omit<\n T,\n 'totalCount'\n >[];\n return { data, total };\n};\n","// biome-ignore lint/style/noExportedImports: this is a library\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport duration from 'dayjs/plugin/duration';\nimport isBetween from 'dayjs/plugin/isBetween';\nimport isToday from 'dayjs/plugin/isToday';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport minmax from 'dayjs/plugin/minMax';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport timeZone from 'dayjs/plugin/timezone';\nimport toArray from 'dayjs/plugin/toArray';\nimport utc from 'dayjs/plugin/utc';\n\ndayjs.extend(customParseFormat);\ndayjs.extend(isBetween);\ndayjs.extend(isToday);\ndayjs.extend(localizedFormat);\ndayjs.extend(relativeTime);\ndayjs.extend(timeZone);\ndayjs.extend(toArray);\ndayjs.extend(utc);\ndayjs.extend(minmax);\ndayjs.extend(duration);\n\nexport default dayjs;\n","/** biome-ignore-all lint/suspicious/noConsole: <explanation> */\n\ntype LogMethod = (...args: unknown[]) => void;\ntype TableMethod = (tabularData?: unknown, properties?: string[]) => void;\ntype LocalStorageLike = { getItem: (key: string) => string | null };\n\nconst noop: LogMethod = () => undefined;\nconst noopTable: TableMethod = () => undefined;\n\nconst getLocalStorage = (): LocalStorageLike | null => {\n try {\n const storage = (globalThis as { localStorage?: LocalStorageLike })\n .localStorage;\n\n if (!storage) {\n return null;\n }\n\n return storage;\n } catch {\n return null;\n }\n};\n\nclass LoggerService {\n debugMode = false;\n\n constructor() {\n const storage = getLocalStorage();\n const envDebug = process.env.NODE_ENV === 'development';\n\n if (!storage) {\n this.debugMode = envDebug;\n return;\n }\n\n const stored = storage.getItem('mesob:debug');\n if (!stored) {\n this.debugMode = envDebug;\n return;\n }\n\n try {\n this.debugMode = JSON.parse(stored);\n } catch {\n this.debugMode = envDebug;\n }\n }\n\n public get log(): LogMethod {\n return this.debugMode ? console.log.bind(console) : noop;\n }\n public get debug(): LogMethod {\n return this.debugMode ? console.debug.bind(console) : noop;\n }\n public get info(): LogMethod {\n return this.debugMode ? console.info.bind(console) : noop;\n }\n public get warn(): LogMethod {\n return this.debugMode ? console.warn.bind(console) : noop;\n }\n\n public get error(): LogMethod {\n return this.debugMode ? console.error.bind(console) : noop;\n }\n\n public get table(): TableMethod {\n return this.debugMode ? console.table.bind(console) : noopTable;\n }\n}\n\nconst logger = new LoggerService();\n\nexport default logger;\n","const normalizeTitleInput = (value: string): string => {\n const spaced = value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return spaced;\n};\n\nexport const toTitleCase = (value: string): string => {\n const normalized = normalizeTitleInput(value);\n\n if (!normalized) {\n return '';\n }\n\n return normalized\n .split(' ')\n .map((word) => {\n const first = word[0];\n const rest = word.slice(1);\n\n return `${first.toUpperCase()}${rest.toLowerCase()}`;\n })\n .join(' ');\n};\n"],"mappings":"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","names":["eq","gt","gte","ilike","isNull","like","lt","lte","ne","not","operatorMap"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// src/utility/string.ts
|
|
2
|
+
var normalizeTitleInput = (value) => {
|
|
3
|
+
const spaced = value.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").replace(/\s+/g, " ").trim();
|
|
4
|
+
return spaced;
|
|
5
|
+
};
|
|
6
|
+
var toTitleCase = (value) => {
|
|
7
|
+
const normalized = normalizeTitleInput(value);
|
|
8
|
+
if (!normalized) {
|
|
9
|
+
return "";
|
|
10
|
+
}
|
|
11
|
+
return normalized.split(" ").map((word) => {
|
|
12
|
+
const first = word[0];
|
|
13
|
+
const rest = word.slice(1);
|
|
14
|
+
return `${first.toUpperCase()}${rest.toLowerCase()}`;
|
|
15
|
+
}).join(" ");
|
|
16
|
+
};
|
|
17
|
+
export {
|
|
18
|
+
toTitleCase
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utility/string.ts"],"sourcesContent":["const normalizeTitleInput = (value: string): string => {\n const spaced = value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return spaced;\n};\n\nexport const toTitleCase = (value: string): string => {\n const normalized = normalizeTitleInput(value);\n\n if (!normalized) {\n return '';\n }\n\n return normalized\n .split(' ')\n .map((word) => {\n const first = word[0];\n const rest = word.slice(1);\n\n return `${first.toUpperCase()}${rest.toLowerCase()}`;\n })\n .join(' ');\n};\n"],"mappings":";AAAA,IAAM,sBAAsB,CAAC,UAA0B;AACrD,QAAM,SAAS,MACZ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,UAAU,GAAG,EACrB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAER,SAAO;AACT;AAEO,IAAM,cAAc,CAAC,UAA0B;AACpD,QAAM,aAAa,oBAAoB,KAAK;AAE5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,OAAO,KAAK,MAAM,CAAC;AAEzB,WAAO,GAAG,MAAM,YAAY,CAAC,GAAG,KAAK,YAAY,CAAC;AAAA,EACpD,CAAC,EACA,KAAK,GAAG;AACb;","names":[]}
|