@plyaz/db 0.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.
Files changed (118) hide show
  1. package/README.md +169 -0
  2. package/dist/adapters/drizzle/DrizzleAdapter.d.ts +269 -0
  3. package/dist/adapters/drizzle/DrizzleAdapter.d.ts.map +1 -0
  4. package/dist/adapters/index.d.ts +20 -0
  5. package/dist/adapters/index.d.ts.map +1 -0
  6. package/dist/adapters/sql/SQLAdapter.d.ts +282 -0
  7. package/dist/adapters/sql/SQLAdapter.d.ts.map +1 -0
  8. package/dist/adapters/supabase/SupabaseAdapter.d.ts +305 -0
  9. package/dist/adapters/supabase/SupabaseAdapter.d.ts.map +1 -0
  10. package/dist/advanced/backup/BackupService.d.ts +159 -0
  11. package/dist/advanced/backup/BackupService.d.ts.map +1 -0
  12. package/dist/advanced/backup/index.d.ts +2 -0
  13. package/dist/advanced/backup/index.d.ts.map +1 -0
  14. package/dist/advanced/caching/CacheEvict.decorator.d.ts +3 -0
  15. package/dist/advanced/caching/CacheEvict.decorator.d.ts.map +1 -0
  16. package/dist/advanced/caching/Cacheable.decorator.d.ts +99 -0
  17. package/dist/advanced/caching/Cacheable.decorator.d.ts.map +1 -0
  18. package/dist/advanced/caching/RedisCache.d.ts +417 -0
  19. package/dist/advanced/caching/RedisCache.d.ts.map +1 -0
  20. package/dist/advanced/caching/index.d.ts +4 -0
  21. package/dist/advanced/caching/index.d.ts.map +1 -0
  22. package/dist/advanced/connection-pool/DynamicPool.d.ts +234 -0
  23. package/dist/advanced/connection-pool/DynamicPool.d.ts.map +1 -0
  24. package/dist/advanced/connection-pool/index.d.ts +2 -0
  25. package/dist/advanced/connection-pool/index.d.ts.map +1 -0
  26. package/dist/advanced/index.d.ts +8 -0
  27. package/dist/advanced/index.d.ts.map +1 -0
  28. package/dist/advanced/monitoring/AlertManager.d.ts +72 -0
  29. package/dist/advanced/monitoring/AlertManager.d.ts.map +1 -0
  30. package/dist/advanced/monitoring/MetricsCollector.d.ts +81 -0
  31. package/dist/advanced/monitoring/MetricsCollector.d.ts.map +1 -0
  32. package/dist/advanced/monitoring/index.d.ts +3 -0
  33. package/dist/advanced/monitoring/index.d.ts.map +1 -0
  34. package/dist/advanced/multi-tenancy/TenantContext.d.ts +52 -0
  35. package/dist/advanced/multi-tenancy/TenantContext.d.ts.map +1 -0
  36. package/dist/advanced/multi-tenancy/TenantRepository.d.ts +292 -0
  37. package/dist/advanced/multi-tenancy/TenantRepository.d.ts.map +1 -0
  38. package/dist/advanced/multi-tenancy/index.d.ts +3 -0
  39. package/dist/advanced/multi-tenancy/index.d.ts.map +1 -0
  40. package/dist/advanced/read-replica/ReadReplicaAdapter.d.ts +516 -0
  41. package/dist/advanced/read-replica/ReadReplicaAdapter.d.ts.map +1 -0
  42. package/dist/advanced/read-replica/ReadReplicaManager.d.ts +68 -0
  43. package/dist/advanced/read-replica/ReadReplicaManager.d.ts.map +1 -0
  44. package/dist/advanced/read-replica/UseReplica.decorator.d.ts +24 -0
  45. package/dist/advanced/read-replica/UseReplica.decorator.d.ts.map +1 -0
  46. package/dist/advanced/read-replica/index.d.ts +3 -0
  47. package/dist/advanced/read-replica/index.d.ts.map +1 -0
  48. package/dist/advanced/sharding/ShardKey.d.ts +80 -0
  49. package/dist/advanced/sharding/ShardKey.d.ts.map +1 -0
  50. package/dist/advanced/sharding/ShardRouter.d.ts +66 -0
  51. package/dist/advanced/sharding/ShardRouter.d.ts.map +1 -0
  52. package/dist/advanced/sharding/index.d.ts +3 -0
  53. package/dist/advanced/sharding/index.d.ts.map +1 -0
  54. package/dist/builder/query/index.d.ts +7 -0
  55. package/dist/builder/query/index.d.ts.map +1 -0
  56. package/dist/builder/query/orm.d.ts +22 -0
  57. package/dist/builder/query/orm.d.ts.map +1 -0
  58. package/dist/builder/query/sql.d.ts +29 -0
  59. package/dist/builder/query/sql.d.ts.map +1 -0
  60. package/dist/extensions/AuditExtension.d.ts +468 -0
  61. package/dist/extensions/AuditExtension.d.ts.map +1 -0
  62. package/dist/extensions/CachingAdapter.d.ts +451 -0
  63. package/dist/extensions/CachingAdapter.d.ts.map +1 -0
  64. package/dist/extensions/EncryptionExtension.d.ts +95 -0
  65. package/dist/extensions/EncryptionExtension.d.ts.map +1 -0
  66. package/dist/extensions/ReadReplicaAdapter.d.ts +32 -0
  67. package/dist/extensions/ReadReplicaAdapter.d.ts.map +1 -0
  68. package/dist/extensions/SoftDeleteExtension.d.ts +430 -0
  69. package/dist/extensions/SoftDeleteExtension.d.ts.map +1 -0
  70. package/dist/extensions/index.d.ts +79 -0
  71. package/dist/extensions/index.d.ts.map +1 -0
  72. package/dist/factory/AdapterFactory.d.ts +111 -0
  73. package/dist/factory/AdapterFactory.d.ts.map +1 -0
  74. package/dist/factory/createDatabaseService.d.ts +121 -0
  75. package/dist/factory/createDatabaseService.d.ts.map +1 -0
  76. package/dist/index.cjs +8518 -0
  77. package/dist/index.cjs.map +1 -0
  78. package/dist/index.d.ts +19 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.mjs +8480 -0
  81. package/dist/index.mjs.map +1 -0
  82. package/dist/repository/BaseRepository.d.ts +209 -0
  83. package/dist/repository/BaseRepository.d.ts.map +1 -0
  84. package/dist/repository/index.d.ts +80 -0
  85. package/dist/repository/index.d.ts.map +1 -0
  86. package/dist/security/index.cjs +118 -0
  87. package/dist/security/index.cjs.map +1 -0
  88. package/dist/security/index.d.ts +3 -0
  89. package/dist/security/index.d.ts.map +1 -0
  90. package/dist/security/index.mjs +114 -0
  91. package/dist/security/index.mjs.map +1 -0
  92. package/dist/security/sanitizers/html.sanitizer.d.ts +31 -0
  93. package/dist/security/sanitizers/html.sanitizer.d.ts.map +1 -0
  94. package/dist/security/serializers/DataValidation.d.ts +34 -0
  95. package/dist/security/serializers/DataValidation.d.ts.map +1 -0
  96. package/dist/service/DatabaseService.d.ts +136 -0
  97. package/dist/service/DatabaseService.d.ts.map +1 -0
  98. package/dist/service/EventEmitter.d.ts +110 -0
  99. package/dist/service/EventEmitter.d.ts.map +1 -0
  100. package/dist/service/HealthManager.d.ts +166 -0
  101. package/dist/service/HealthManager.d.ts.map +1 -0
  102. package/dist/utils/ConfigMerger.d.ts +227 -0
  103. package/dist/utils/ConfigMerger.d.ts.map +1 -0
  104. package/dist/utils/databaseResultHelpers.d.ts +98 -0
  105. package/dist/utils/databaseResultHelpers.d.ts.map +1 -0
  106. package/dist/utils/index.d.ts +7 -0
  107. package/dist/utils/index.d.ts.map +1 -0
  108. package/dist/utils/normalizeDetails.d.ts +111 -0
  109. package/dist/utils/normalizeDetails.d.ts.map +1 -0
  110. package/dist/utils/pagination.d.ts +77 -0
  111. package/dist/utils/pagination.d.ts.map +1 -0
  112. package/dist/utils/regex.d.ts +199 -0
  113. package/dist/utils/regex.d.ts.map +1 -0
  114. package/dist/utils/typeGuards.d.ts +57 -0
  115. package/dist/utils/typeGuards.d.ts.map +1 -0
  116. package/dist/utils/validation.d.ts +146 -0
  117. package/dist/utils/validation.d.ts.map +1 -0
  118. package/package.json +156 -0
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @fileoverview Validation utilities for @plyaz/db package
3
+ *
4
+ * This module provides comprehensive validation functions for database operations
5
+ * including filter validation, table name validation, ID validation, and input sanitization.
6
+ *
7
+ * Part of the @plyaz/db package - a TypeScript database abstraction layer with
8
+ * support for multiple adapters (Drizzle, Supabase, SQL), extensions (audit, encryption,
9
+ * soft delete), and advanced features (caching, read replicas, multi-tenancy).
10
+ *
11
+ */
12
+ import type { Filter } from "@plyaz/types/db";
13
+ /**
14
+ * Validates a filter object for database queries
15
+ *
16
+ * Performs comprehensive validation of filter objects used across all database adapters
17
+ * (DrizzleAdapter, SupabaseAdapter, SQLAdapter). Ensures field names are safe from
18
+ * SQL injection and operators are supported.
19
+ *
20
+ * @param {Filter} filter - The filter object from @plyaz/types/db to validate
21
+ * @returns {boolean} True if the filter is valid and safe for database operations
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * import { validateFilter } from '@plyaz/db';
26
+ *
27
+ * // Valid filter for DatabaseService operations
28
+ * const validFilter = { field: 'user_name', operator: 'eq', value: 'john_doe' };
29
+ * console.log(validateFilter(validFilter)); // true
30
+ *
31
+ * // Invalid filter (unsafe field name)
32
+ * const invalidFilter = { field: 'user; DROP TABLE users;', operator: 'eq', value: 'test' };
33
+ * console.log(validateFilter(invalidFilter)); // false
34
+ * ```
35
+ *
36
+ */
37
+ /**
38
+ * Valid database query operators supported across all adapters
39
+ *
40
+ * These operators are validated and supported by:
41
+ * - DrizzleAdapter: Maps to Drizzle ORM operators
42
+ * - SupabaseAdapter: Maps to Supabase query operators
43
+ * - SQLAdapter: Maps to raw SQL WHERE clause operators
44
+ *
45
+ * @constant {string[]} validOperators - List of supported query operators
46
+ */
47
+ export declare const validOperators: string[];
48
+ export declare function validateFilter(filter: Filter): boolean;
49
+ /**
50
+ * Validates a database table name for all supported adapters
51
+ *
52
+ * Ensures table names are safe for use across DrizzleAdapter, SupabaseAdapter, and SQLAdapter.
53
+ * Follows PostgreSQL naming conventions (63 character limit) for maximum compatibility.
54
+ *
55
+ * Validation rules:
56
+ * - Must be a non-empty string
57
+ * - Must start with a letter or underscore
58
+ * - Can only contain letters, numbers, and underscores
59
+ * - Maximum length of 63 characters (PostgreSQL limit)
60
+ *
61
+ * @param {string} name - The table name to validate
62
+ * @returns {boolean} True if the table name is valid for database operations
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * import { validateTableName } from '@plyaz/db';
67
+ *
68
+ * // Valid table names for DatabaseService
69
+ * console.log(validateTableName('users')); // true
70
+ * console.log(validateTableName('user_profiles')); // true
71
+ * console.log(validateTableName('_audit_logs')); // true
72
+ *
73
+ * // Invalid table names
74
+ * console.log(validateTableName('123users')); // false - starts with number
75
+ * console.log(validateTableName('user-profiles')); // false - contains hyphen
76
+ * console.log(validateTableName('')); // false - empty string
77
+ * ```
78
+ *
79
+ */
80
+ export declare function validateTableName(name: string): boolean;
81
+ /**
82
+ * Validates a database record ID for all adapter operations
83
+ *
84
+ * Performs security validation of record IDs used in DatabaseService operations
85
+ * across all adapters. Prevents control character injection and ensures reasonable
86
+ * length limits for database performance.
87
+ *
88
+ * Validation rules:
89
+ * - Must be a non-empty string
90
+ * - Maximum length of 255 characters
91
+ * - No control characters (ASCII 0-31, 127)
92
+ *
93
+ * @param {string} id - The record ID to validate
94
+ * @returns {boolean} True if the ID is safe for database operations
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * import { validateId } from '@plyaz/db';
99
+ *
100
+ * // Valid IDs for DatabaseService.findById()
101
+ * console.log(validateId('user_123')); // true
102
+ * console.log(validateId('550e8400-e29b-41d4-a716-446655440000')); // true - UUID
103
+ * console.log(validateId('abc-def-123')); // true
104
+ *
105
+ * // Invalid IDs
106
+ * console.log(validateId('')); // false - empty
107
+ * console.log(validateId('id\x00injection')); // false - control character
108
+ * ```
109
+ *
110
+ */
111
+ export declare function validateId(id: string): boolean;
112
+ /**
113
+ * Sanitizes input strings to prevent SQL injection across all database adapters
114
+ *
115
+ * Provides defense-in-depth security for user input used in database operations.
116
+ * Used internally by SQLAdapter and as a fallback security measure for other adapters.
117
+ *
118
+ * **Security Note:** This function complements parameterized queries used by
119
+ * DrizzleAdapter and SupabaseAdapter. SQLAdapter uses this for additional protection.
120
+ *
121
+ * Escapes dangerous characters:
122
+ * - Null bytes, backspace, tab, newline, carriage return
123
+ * - Single and double quotes
124
+ * - Backslashes and percent signs
125
+ * - Control-Z character
126
+ *
127
+ * @param {string} input - The user input string to sanitize
128
+ * @returns {string} The sanitized string with escaped dangerous characters
129
+ * @throws {Error} If input is not a string or sanitization fails
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * import { sanitizeInput } from '@plyaz/db';
134
+ *
135
+ * // Sanitize user input before database operations
136
+ * const userInput = "Robert'); DROP TABLE users; --";
137
+ * const sanitized = sanitizeInput(userInput);
138
+ * console.log(sanitized); // "Robert\\'); DROP TABLE users; --"
139
+ *
140
+ * // Used internally by SQLAdapter for additional security
141
+ * const safeValue = sanitizeInput(userProvidedData);
142
+ * ```
143
+ *
144
+ */
145
+ export declare function sanitizeInput(input: string): string;
146
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAM9C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,UAa1B,CAAC;AAGF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA8EtD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkCvD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAsC9C;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA4DnD"}
package/package.json ADDED
@@ -0,0 +1,156 @@
1
+ {
2
+ "name": "@plyaz/db",
3
+ "version": "0.0.0",
4
+ "description": "Package description",
5
+ "type": "module",
6
+ "keywords": [],
7
+ "packageManager": "pnpm@10.11.0",
8
+ "main": "./dist/index.cjs",
9
+ "module": "./dist/index.mjs",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.mjs",
15
+ "require": "./dist/index.cjs",
16
+ "default": "./dist/index.mjs"
17
+ },
18
+ "./security": {
19
+ "types": "./dist/security/index.d.ts",
20
+ "import": "./dist/security/index.mjs",
21
+ "require": "./dist/security/index.cjs",
22
+ "default": "./dist/security/index.mjs"
23
+ },
24
+ "./package.json": "./package.json"
25
+ },
26
+ "engines": {
27
+ "node": ">=22.4.0",
28
+ "pnpm": ">=8.0.0"
29
+ },
30
+ "author": "Redeemer Pace",
31
+ "license": "ISC",
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "dependencies": {
36
+ "@nestjs/common": "^11.1.3",
37
+ "@plyaz/config": "^1.7.12",
38
+ "@plyaz/errors": "^1.3.5",
39
+ "@plyaz/logger": "^1.3.2",
40
+ "@plyaz/testing": "^1.5.1",
41
+ "@plyaz/types": "^1.15.13",
42
+ "@supabase/supabase-js": "^2.75.0",
43
+ "drizzle-orm": "^0.44.6",
44
+ "ioredis": "^5.8.1",
45
+ "next": "15.4.7",
46
+ "pg": "^8.16.3",
47
+ "react": "^19.1.0",
48
+ "sanitize-html": "^2.17.0",
49
+ "zod": "^4.1.11"
50
+ },
51
+ "devDependencies": {
52
+ "@changesets/cli": "^2.29.5",
53
+ "@darraghor/eslint-plugin-nestjs-typed": "^6.6.2",
54
+ "@eslint/eslintrc": "^3.2.0",
55
+ "@eslint/js": "^9.15.0",
56
+ "@eslint/markdown": "^6.5.0",
57
+ "@next/eslint-plugin-next": "^15.0.3",
58
+ "@plyaz/devtools": "^1.8.5",
59
+ "@testing-library/jest-dom": "^6.6.3",
60
+ "@testing-library/react": "^16.3.0",
61
+ "@testing-library/user-event": "^14.6.1",
62
+ "@types/jest": "^30.0.0",
63
+ "@types/node": "^22.14.0",
64
+ "@types/pg": "^8.15.5",
65
+ "@types/react": "^19.1.8",
66
+ "@types/react-dom": "^19.1.6",
67
+ "@types/sanitize-html": "^2.16.0",
68
+ "@typescript-eslint/eslint-plugin": "^8.15.0",
69
+ "@typescript-eslint/parser": "^8.15.0",
70
+ "@vitest/coverage-istanbul": "3.2.4",
71
+ "@vitest/coverage-v8": "^3.1.3",
72
+ "eslint": "^9.29.0",
73
+ "eslint-config-next": "^15.3.3",
74
+ "eslint-config-prettier": "^9.1.0",
75
+ "eslint-import-resolver-typescript": "^3.10.1",
76
+ "eslint-mdx": "^3.5.0",
77
+ "eslint-plugin-better-tailwindcss": "3.2.1",
78
+ "eslint-plugin-functional": "^4.4.1",
79
+ "eslint-plugin-import": "^2.31.0",
80
+ "eslint-plugin-jest": "^28.13.5",
81
+ "eslint-plugin-jsdoc": "^50.8.0",
82
+ "eslint-plugin-jsonc": "^2.20.1",
83
+ "eslint-plugin-jsx-a11y": "^6.10.2",
84
+ "eslint-plugin-markdownlint": "^0.9.0",
85
+ "eslint-plugin-mdx": "^3.5.0",
86
+ "eslint-plugin-n": "^17.20.0",
87
+ "eslint-plugin-prettier": "^5.5.0",
88
+ "eslint-plugin-promise": "^7.2.1",
89
+ "eslint-plugin-react": "^7.37.2",
90
+ "eslint-plugin-react-hooks": "^5.0.0",
91
+ "eslint-plugin-react-refresh": "^0.4.19",
92
+ "eslint-plugin-regexp": "^2.9.0",
93
+ "eslint-plugin-security": "^3.0.1",
94
+ "eslint-plugin-simple-import-sort": "^12.1.1",
95
+ "eslint-plugin-sonarjs": "^0.23.0",
96
+ "eslint-plugin-storybook": "^0.12.0",
97
+ "eslint-plugin-testing-library": "^6.5.0",
98
+ "eslint-plugin-unicorn": "^56.0.1",
99
+ "eslint-plugin-unused-imports": "^4.1.4",
100
+ "jiti": "^2.4.2",
101
+ "jsdom": "^26.1.0",
102
+ "markdownlint": "^0.38.0",
103
+ "next": "15.3.3",
104
+ "prettier": "^3.5.3",
105
+ "standard-version": "^9.5.0",
106
+ "tailwindcss": "^4.1.8",
107
+ "tsup": "8.5.0",
108
+ "typescript": "^5",
109
+ "typescript-eslint": "^8.34.0",
110
+ "vite": "^6.3.5",
111
+ "vite-plugin-dts": "^4.5.3",
112
+ "vitest": "3.2.4"
113
+ },
114
+ "peerDependenciesMeta": {
115
+ "react": {
116
+ "optional": true
117
+ },
118
+ "react-dom": {
119
+ "optional": true
120
+ },
121
+ "next": {
122
+ "optional": true
123
+ }
124
+ },
125
+ "scripts": {
126
+ "build": "pnpm clean && pnpm build:js && pnpm build:types",
127
+ "build:js": "tsup",
128
+ "build:types": "tsc -p tsconfig.build.json",
129
+ "build:watch": "tsup --watch",
130
+ "dev": "tsup --watch",
131
+ "lint": "eslint ./src ./tests",
132
+ "lint:fix": "eslint ./src ./tests --fix",
133
+ "format": "prettier --write './**/*.{ts,tsx,js,jsx}'",
134
+ "format:check": "prettier --check './**/*.{ts,tsx,js,jsx}'",
135
+ "type:check": "tsc --noEmit",
136
+ "test": "vitest run --no-watch",
137
+ "test:ci": "vitest run --no-watch",
138
+ "test:watch": "vitest --watch",
139
+ "test:coverage": "vitest run --coverage",
140
+ "test:ui": "vitest --ui",
141
+ "clean": "rm -rf dist",
142
+ "audit": "pnpm audit",
143
+ "audit:moderate": "pnpm audit --audit-level moderate",
144
+ "audit:high": "pnpm audit --audit-level high",
145
+ "audit:critical": "pnpm audit --audit-level critical",
146
+ "audit:fix": "pnpm audit --fix",
147
+ "audit:enhanced": "npx audit-ci --moderate",
148
+ "security:check": "pnpm audit:moderate && npx audit-ci --moderate",
149
+ "remove:unused": "pnpm remove:unused:fnc && pnpm remove:unused:interfaces",
150
+ "remove:unused:interfaces": "pnpm exec ./node_modules/@plyaz/devtools/scripts/check_types.ts --remove --report=./internal-reports/unused-types-report.md",
151
+ "remove:unused:fnc": "pnpm exec ./node_modules/@plyaz/devtools/scripts/check_fnc.ts --report=./internal-reports/unused-declarations.md",
152
+ "check:dependencies": "npx tsx ./node_modules/@plyaz/devtools/scripts/check_dependencies_versions.ts --report=./internal-reports/dependency-report.md",
153
+ "move:types": "npx tsx ./scripts/move_types.ts src/ --report=internal-reports/moved_types.md",
154
+ "move:constants": "npx tsx ./node_modules/@plyaz/devtools/scripts/move_constants.ts src/ --report=internal-reports/moved_consts.md"
155
+ }
156
+ }