@gobing-ai/ts-utils 0.1.0 → 0.1.3

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.
Files changed (2) hide show
  1. package/package.json +21 -2
  2. package/dist/index.js.map +0 -17
package/package.json CHANGED
@@ -1,7 +1,26 @@
1
1
  {
2
2
  "name": "@gobing-ai/ts-utils",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "Zero-dependency TypeScript utilities for dates, cursors, errors, output, origins, roles, and API responses.",
5
+ "keywords": [
6
+ "typescript",
7
+ "utilities",
8
+ "cursor-pagination",
9
+ "date",
10
+ "error-handling",
11
+ "api-response",
12
+ "rbac",
13
+ "zero-dependency"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/gobing-ai/ts-libs.git",
18
+ "directory": "packages/utils"
19
+ },
20
+ "author": "Robin Min <minlongbing@gmail.com>",
21
+ "contributors": [
22
+ "Robin Min <minlongbing@gmail.com>"
23
+ ],
5
24
  "type": "module",
6
25
  "private": false,
7
26
  "sideEffects": false,
@@ -28,7 +47,7 @@
28
47
  "format": "biome check . --write",
29
48
  "check": "bun run lint && bun run test",
30
49
  "prepublishOnly": "bun run build",
31
- "release": "npm publish --access public"
50
+ "release": "echo 'Manual publish is disabled. Releases go through GitHub Actions via Trusted Publishing — push a tag: git tag @gobing-ai/ts-utils-v<version> && git push --tags' && exit 1"
32
51
  },
33
52
  "dependencies": {},
34
53
  "devDependencies": {
package/dist/index.js.map DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/access.ts", "../src/api-response.ts", "../src/const.ts", "../src/date.ts", "../src/cursor.ts", "../src/errors.ts", "../src/origin.ts", "../src/output.ts"],
4
- "sourcesContent": [
5
- "/**\n * Zitadel + generic role-based access control helpers.\n *\n * Supports Zitadel IAM role claims (`urn:zitadel:iam:org:project:roles`),\n * generic `roles` arrays, and object-based role maps.\n *\n * If auth provider uses a different claim format, extend `hasRole`\n * rather than forking this module.\n */\nexport function hasRole(profile: Record<string, unknown> | null | undefined, role: string): boolean {\n if (!profile) return false;\n if (!role || typeof role !== 'string') return false;\n\n const zitadelRoles = profile['urn:zitadel:iam:org:project:roles'];\n if (zitadelRoles && typeof zitadelRoles === 'object') {\n try {\n if (zitadelRoles !== null && !Array.isArray(zitadelRoles) && Object.hasOwn(zitadelRoles, role)) {\n return true;\n }\n } catch {\n // Continue to other role formats when host objects reject inspection.\n }\n }\n\n const rolesArray = profile.roles;\n if (Array.isArray(rolesArray)) {\n return rolesArray.includes(role);\n }\n\n if (rolesArray && typeof rolesArray === 'object' && !Array.isArray(rolesArray)) {\n try {\n if (rolesArray !== null) {\n return Object.hasOwn(rolesArray, role);\n }\n } catch {\n // Fall through.\n }\n }\n\n return false;\n}\n\nexport function getRoles(profile: Record<string, unknown> | null | undefined): string[] {\n if (!profile) return [];\n\n const roles = new Set<string>();\n\n const zitadelRoles = profile['urn:zitadel:iam:org:project:roles'];\n if (zitadelRoles && typeof zitadelRoles === 'object' && zitadelRoles !== null && !Array.isArray(zitadelRoles)) {\n try {\n for (const key of Object.keys(zitadelRoles)) {\n roles.add(key);\n }\n } catch {\n // Ignore host objects that reject key enumeration.\n }\n }\n\n const rolesArray = profile.roles;\n if (Array.isArray(rolesArray)) {\n rolesArray.forEach((role) => {\n if (typeof role === 'string') roles.add(role);\n });\n }\n\n if (rolesArray && typeof rolesArray === 'object' && rolesArray !== null && !Array.isArray(rolesArray)) {\n try {\n for (const key of Object.keys(rolesArray)) {\n roles.add(key);\n }\n } catch {\n // Ignore host objects that reject key enumeration.\n }\n }\n\n return Array.from(roles);\n}\n",
6
- "export const API_ERROR_CODES = {\n SUCCESS: 0,\n NOT_FOUND: 404,\n VALIDATION_ERROR: 422,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n CONFLICT: 409,\n INTERNAL_ERROR: 500,\n} as const;\n\nexport type ApiErrorCode = (typeof API_ERROR_CODES)[keyof typeof API_ERROR_CODES];\n\nexport type ApiEnvelopeResult = 'success' | 'info' | 'warn' | 'error';\n\nexport interface ApiSuccessEnvelope<T> {\n code: 0;\n message: string;\n result: 'success' | 'info';\n data: T;\n meta?: { total?: number; limit?: number; offset?: number };\n}\n\nexport interface ApiErrorEnvelope {\n result: 'warn' | 'error';\n code: number;\n message: string;\n data: null;\n details?: unknown;\n}\n\nexport type ApiEnvelope<T> = ApiSuccessEnvelope<T> | ApiErrorEnvelope;\n\nexport function successResponse<T>(data: T, message = 'Success'): ApiSuccessEnvelope<T> {\n return {\n code: API_ERROR_CODES.SUCCESS,\n message,\n result: 'success',\n data,\n };\n}\n\nexport function infoResponse<T>(data: T, message = 'Data retrieved successfully'): ApiSuccessEnvelope<T> {\n return {\n code: API_ERROR_CODES.SUCCESS,\n message,\n result: 'info',\n data,\n };\n}\n\nexport function paginatedResponse<T>(\n data: T[],\n meta: { total?: number; limit?: number; offset?: number },\n message = 'Data retrieved successfully',\n): ApiSuccessEnvelope<T[]> {\n return {\n code: API_ERROR_CODES.SUCCESS,\n message,\n result: 'info',\n data,\n meta,\n };\n}\n\nexport function errorResponse(code: number, message: string, details?: unknown): ApiErrorEnvelope {\n const response: ApiErrorEnvelope = {\n code,\n message,\n result: code >= 500 ? 'error' : 'warn',\n data: null,\n };\n\n if (details !== undefined) {\n response.details = details;\n }\n\n return response;\n}\n\nexport function notFoundResponse(message = 'Resource not found', details?: unknown): ApiErrorEnvelope {\n return errorResponse(API_ERROR_CODES.NOT_FOUND, message, details);\n}\n\nexport function validationErrorResponse(details: unknown, message = 'Validation failed'): ApiErrorEnvelope {\n return errorResponse(API_ERROR_CODES.VALIDATION_ERROR, message, details);\n}\n\nexport function badRequestResponse(message: string, details?: unknown): ApiErrorEnvelope {\n return errorResponse(API_ERROR_CODES.BAD_REQUEST, message, details);\n}\n\nexport function unauthorizedResponse(message = 'Authentication required', details?: unknown): ApiErrorEnvelope {\n return errorResponse(API_ERROR_CODES.UNAUTHORIZED, message, details);\n}\n\nexport function forbiddenResponse(message = 'Access forbidden', details?: unknown): ApiErrorEnvelope {\n return errorResponse(API_ERROR_CODES.FORBIDDEN, message, details);\n}\n\nexport function conflictResponse(message = 'Resource conflict', details?: unknown): ApiErrorEnvelope {\n return errorResponse(API_ERROR_CODES.CONFLICT, message, details);\n}\n\nexport function internalErrorResponse(message = 'Internal server error', details?: unknown): ApiErrorEnvelope {\n return errorResponse(API_ERROR_CODES.INTERNAL_ERROR, message, details);\n}\n",
7
- "export const LOG_CATEGORY_APP = 'app';\n\nexport const LOG_CATEGORY_CLI = 'cli';\n",
8
- "export function nowMs(): number {\n return Date.now();\n}\n\nexport function toMs(input: Date | number | string | null | undefined): number | null {\n if (input === null || input === undefined) return null;\n if (input instanceof Date) return input.getTime();\n if (typeof input === 'string') {\n const parsed = new Date(input).getTime();\n return Number.isNaN(parsed) ? null : parsed;\n }\n return Math.floor(input);\n}\n\nexport function fromMs(ms: number | null | undefined): Date | null {\n if (ms === null || ms === undefined || Number.isNaN(ms)) return null;\n return new Date(ms);\n}\n",
9
- "import { toMs } from './date';\n\nexport interface CursorData {\n id: string;\n createdAt?: number;\n offset?: number;\n}\n\nexport function createCursor(id: string, createdAt?: Date | number, offset?: number): CursorData {\n const cursor: CursorData = { id };\n if (createdAt !== undefined) {\n const ms = toMs(createdAt);\n if (ms !== null) {\n cursor.createdAt = ms;\n }\n }\n if (offset !== undefined) {\n cursor.offset = offset;\n }\n return cursor;\n}\n\nexport function parseCursor(data: string | Record<string, unknown>): CursorData {\n const parsed = typeof data === 'string' ? (JSON.parse(data) as Record<string, unknown>) : data;\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid cursor: must be an object');\n }\n\n if (!parsed.id || typeof parsed.id !== 'string') {\n throw new Error('Invalid cursor: missing or invalid id');\n }\n\n const result: CursorData = { id: parsed.id };\n if (typeof parsed.createdAt === 'number') {\n result.createdAt = parsed.createdAt;\n }\n if (typeof parsed.offset === 'number') {\n result.offset = parsed.offset;\n }\n return result;\n}\n\nexport function encodeCursor(cursor: CursorData): string {\n return Buffer.from(JSON.stringify(cursor)).toString('base64url');\n}\n\nexport function decodeCursor(encoded: string): string {\n try {\n return Buffer.from(encoded, 'base64url').toString('utf-8');\n } catch (error) {\n throw new Error(`Invalid cursor encoding: ${String(error)}`);\n }\n}\n\nexport function encodeCursorFromItem(id: string, createdAt?: Date | number, offset?: number): string {\n return encodeCursor(createCursor(id, createdAt, offset));\n}\n\nexport function decodeAndParseCursor(encoded: string): CursorData {\n return parseCursor(decodeCursor(encoded));\n}\n\nexport function buildCursorMeta<T extends { id: string; createdAt?: number | Date }>(\n items: T[],\n limit: number,\n hasMore: boolean,\n): { nextCursor?: string; hasMore: boolean; limit: number } {\n const meta: { nextCursor?: string; hasMore: boolean; limit: number } = {\n hasMore,\n limit,\n };\n\n if (hasMore) {\n const lastItem = items.at(-1);\n if (lastItem) {\n meta.nextCursor = encodeCursorFromItem(lastItem.id, lastItem.createdAt);\n }\n }\n\n return meta;\n}\n",
10
- "export const ErrorCode = {\n NotFound: 'NOT_FOUND',\n Validation: 'VALIDATION',\n Conflict: 'CONFLICT',\n Internal: 'INTERNAL',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport class AppError extends Error {\n readonly code: ErrorCode;\n\n constructor(code: ErrorCode, message: string) {\n super(message);\n this.name = 'AppError';\n this.code = code;\n }\n}\n\nexport class NotFoundError extends AppError {\n constructor(message: string) {\n super(ErrorCode.NotFound, message);\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends AppError {\n constructor(message: string) {\n super(ErrorCode.Validation, message);\n this.name = 'ValidationError';\n }\n}\n\nexport class ConflictError extends AppError {\n constructor(message: string) {\n super(ErrorCode.Conflict, message);\n this.name = 'ConflictError';\n }\n}\n\nexport class InternalError extends AppError {\n constructor(\n message: string,\n override readonly cause?: unknown,\n ) {\n super(ErrorCode.Internal, message);\n this.name = 'InternalError';\n }\n}\n\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n",
11
- "export function matchOriginPattern(origin: string, pattern: string): boolean {\n if (pattern === origin) return true;\n if (pattern === '*') return true;\n\n if (pattern.includes('*')) {\n const parts = pattern.split('*');\n if (parts.length !== 2) {\n return pattern === origin;\n }\n const [prefix, suffix] = parts;\n if (prefix === undefined || suffix === undefined) return false;\n return origin.startsWith(prefix) && origin.endsWith(suffix) && origin.length >= prefix.length + suffix.length;\n }\n\n return false;\n}\n\nexport function isAllowedOrigin(origin: string | undefined | null, allowedOrigins: string[]): boolean {\n if (!origin) return false;\n if (!allowedOrigins || allowedOrigins.length === 0) return false;\n\n return allowedOrigins.some((pattern) => matchOriginPattern(origin, pattern));\n}\n\nexport function getValidatedOrigin(\n origin: string | undefined | null,\n allowedOrigins: string[],\n fallback: string,\n): string {\n if (origin && isAllowedOrigin(origin, allowedOrigins)) {\n return origin;\n }\n return fallback;\n}\n",
12
- "export interface WriteTarget {\n write(chunk: string): unknown;\n}\n\nlet defaultStdoutTarget: WriteTarget = process.stdout;\nlet defaultStderrTarget: WriteTarget = process.stderr;\n\nfunction writeLine(message: string, target: WriteTarget): void {\n target.write(`${message}\\n`);\n}\n\nexport function echo(message: string, target: WriteTarget = defaultStdoutTarget): void {\n writeLine(message, target);\n}\n\nexport function echoError(message: string, target: WriteTarget = defaultStderrTarget): void {\n writeLine(message, target);\n}\n\nexport function setDefaultOutputTargets(opts: { stdout?: WriteTarget; stderr?: WriteTarget }): () => void {\n const prevStdout = defaultStdoutTarget;\n const prevStderr = defaultStderrTarget;\n if (opts.stdout) defaultStdoutTarget = opts.stdout;\n if (opts.stderr) defaultStderrTarget = opts.stderr;\n return () => {\n defaultStdoutTarget = prevStdout;\n defaultStderrTarget = prevStderr;\n };\n}\n\nexport interface BufferTarget extends WriteTarget {\n readonly chunks: string[];\n text(): string;\n clear(): void;\n}\n\nexport function createBufferTarget(): BufferTarget {\n const chunks: string[] = [];\n return {\n chunks,\n write(chunk: string) {\n chunks.push(String(chunk));\n return true;\n },\n text() {\n return chunks.join('');\n },\n clear() {\n chunks.length = 0;\n },\n };\n}\n"
13
- ],
14
- "mappings": "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",
15
- "debugId": "B5116DB702CE581564756E2164756E21",
16
- "names": []
17
- }