@edium/halifax 2.1.0 → 2.2.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 (83) hide show
  1. package/CHANGELOG.md +64 -1
  2. package/README.md +102 -17
  3. package/README_AUTH.md +38 -0
  4. package/README_AUTOCRUD.md +5 -5
  5. package/README_CLASSES.md +322 -0
  6. package/README_HOOKS.md +275 -0
  7. package/README_INTERFACES.md +601 -0
  8. package/README_OPENAPI.md +471 -0
  9. package/README_REPO_ADAPTERS.md +77 -0
  10. package/README_TYPES.md +114 -0
  11. package/dist/adapters/orm/drizzle/DrizzleAdapter.d.ts +128 -0
  12. package/dist/adapters/orm/drizzle/DrizzleAdapter.js +255 -0
  13. package/dist/adapters/orm/drizzle/astToDrizzle.d.ts +21 -0
  14. package/dist/adapters/orm/drizzle/astToDrizzle.js +121 -0
  15. package/dist/adapters/orm/drizzle/index.d.ts +4 -0
  16. package/dist/adapters/orm/drizzle/index.js +2 -0
  17. package/dist/adapters/orm/prisma/PrismaAdapter.d.ts +1 -1
  18. package/dist/adapters/orm/prisma/PrismaAdapter.js +24 -1
  19. package/dist/adapters/orm/prisma/astToPrisma.d.ts +1 -2
  20. package/dist/adapters/orm/prisma/astToPrisma.js +1 -3
  21. package/dist/adapters/orm/prisma/helpers.js +1 -1
  22. package/dist/adapters/orm/prisma/types.d.ts +11 -11
  23. package/dist/auth/AuthStrategy.d.ts +6 -189
  24. package/dist/auth/AuthStrategy.js +4 -220
  25. package/dist/auth/strategies/AllowAllAuthStrategy.d.ts +6 -0
  26. package/dist/auth/strategies/AllowAllAuthStrategy.js +6 -0
  27. package/dist/auth/strategies/ApiKeyAuthStrategy.d.ts +25 -0
  28. package/dist/auth/strategies/ApiKeyAuthStrategy.js +39 -0
  29. package/dist/auth/strategies/JwtClaimsAuthStrategy.d.ts +32 -0
  30. package/dist/auth/strategies/JwtClaimsAuthStrategy.js +52 -0
  31. package/dist/auth/strategies/PassportStrategies.d.ts +94 -0
  32. package/dist/auth/strategies/PassportStrategies.js +142 -0
  33. package/dist/auth/strategies/types.d.ts +70 -0
  34. package/dist/core/crudRouter.d.ts +11 -18
  35. package/dist/core/crudRouter.js +95 -390
  36. package/dist/core/fields.d.ts +8 -0
  37. package/dist/core/fields.js +14 -0
  38. package/dist/core/handlerUtils.d.ts +70 -0
  39. package/dist/core/handlerUtils.js +193 -0
  40. package/dist/core/handlers/create.d.ts +3 -0
  41. package/dist/core/handlers/create.js +26 -0
  42. package/dist/core/handlers/deleteMany.d.ts +3 -0
  43. package/dist/core/handlers/deleteMany.js +24 -0
  44. package/dist/core/handlers/deleteOne.d.ts +3 -0
  45. package/dist/core/handlers/deleteOne.js +19 -0
  46. package/dist/core/handlers/query.d.ts +3 -0
  47. package/dist/core/handlers/query.js +23 -0
  48. package/dist/core/handlers/readMany.d.ts +3 -0
  49. package/dist/core/handlers/readMany.js +18 -0
  50. package/dist/core/handlers/readOne.d.ts +3 -0
  51. package/dist/core/handlers/readOne.js +23 -0
  52. package/dist/core/handlers/updateMany.d.ts +3 -0
  53. package/dist/core/handlers/updateMany.js +34 -0
  54. package/dist/core/handlers/updateOne.d.ts +3 -0
  55. package/dist/core/handlers/updateOne.js +20 -0
  56. package/dist/core/handlers/upsertOne.d.ts +3 -0
  57. package/dist/core/handlers/upsertOne.js +20 -0
  58. package/dist/core/hooks.d.ts +217 -0
  59. package/dist/core/queryString.js +1 -1
  60. package/dist/core/types.d.ts +38 -29
  61. package/dist/core/validation.d.ts +1 -2
  62. package/dist/core/validation.js +1 -3
  63. package/dist/index.d.ts +3 -6
  64. package/dist/index.js +3 -6
  65. package/dist/openapi/generateDocsHtml.d.ts +1 -0
  66. package/dist/openapi/generateDocsHtml.js +47 -0
  67. package/dist/openapi/index.d.ts +3 -0
  68. package/dist/openapi/index.js +2 -0
  69. package/dist/openapi/specGenerator.d.ts +149 -0
  70. package/dist/openapi/specGenerator.js +770 -0
  71. package/package.json +38 -22
  72. package/dist/enums/SqlComparison.d.ts +0 -28
  73. package/dist/enums/SqlComparison.js +0 -29
  74. package/dist/enums/SqlOperator.d.ts +0 -5
  75. package/dist/enums/SqlOperator.js +0 -6
  76. package/dist/enums/SqlOrder.d.ts +0 -5
  77. package/dist/enums/SqlOrder.js +0 -6
  78. package/dist/interfaces/IQueryFilter.d.ts +0 -17
  79. package/dist/interfaces/IQueryOptions.d.ts +0 -20
  80. package/dist/interfaces/ISort.d.ts +0 -8
  81. package/dist/interfaces/ISort.js +0 -1
  82. /package/dist/{interfaces/IQueryFilter.js → auth/strategies/types.js} +0 -0
  83. /package/dist/{interfaces/IQueryOptions.js → core/hooks.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edium/halifax",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Auto-generate type-safe REST CRUD APIs from your data models. Adapter-driven: Express/Fastify/HyperExpress, Prisma (PostgreSQL, MySQL, MariaDB, SQL Server, CockroachDB, SQLite), JWT/API-key auth, multi-tenancy, a dynamic query builder, and pluggable Redis caching.",
5
5
  "author": "David LaTour <david@edium.com>",
6
6
  "homepage": "https://github.com/splayfee/halifax#readme",
@@ -41,6 +41,11 @@
41
41
  "import": "./dist/adapters/http/UltimateExpressAdapter.js",
42
42
  "default": "./dist/adapters/http/UltimateExpressAdapter.js"
43
43
  },
44
+ "./drizzle": {
45
+ "types": "./dist/adapters/orm/drizzle/index.d.ts",
46
+ "import": "./dist/adapters/orm/drizzle/index.js",
47
+ "default": "./dist/adapters/orm/drizzle/index.js"
48
+ },
44
49
  "./package.json": "./package.json"
45
50
  },
46
51
  "files": [
@@ -54,33 +59,23 @@
54
59
  "README_MULTITENANCY.md",
55
60
  "README_QUERYBUILDER.md",
56
61
  "README_REPO_ADAPTERS.md",
62
+ "README_HOOKS.md",
63
+ "README_OPENAPI.md",
64
+ "README_TYPES.md",
65
+ "README_INTERFACES.md",
66
+ "README_CLASSES.md",
57
67
  "LICENSE"
58
68
  ],
59
69
  "publishConfig": {
60
70
  "access": "public"
61
71
  },
62
72
  "sideEffects": false,
63
- "scripts": {
64
- "prepublishOnly": "npm run build",
65
- "build": "rm -rf dist && tsc --build && tsc-alias",
66
- "dev": "tsx watch ./examples/http-express.ts",
67
- "lint": "eslint .",
68
- "lint:fix": "eslint . --fix",
69
- "prettier": "prettier --check .",
70
- "prettier:fix": "prettier --write .",
71
- "test:unit": "vitest run tests/unit",
72
- "test:unit:coverage": "vitest run --coverage tests/unit",
73
- "test:integration": "dotenv -e .env.test -- vitest run --config vitest.integration.config.ts",
74
- "test:integration:all": "bash scripts/integration-matrix.sh",
75
- "test:integration:generate": "prisma generate --schema=tests/integration/prisma/schema.prisma",
76
- "type-check": "tsc --noEmit && tsc --noEmit -p tests/tsconfig.json",
77
- "type-check:examples": "prisma generate --schema=tests/integration/prisma/schema.prisma && tsc --noEmit -p examples/tsconfig.json"
78
- },
79
73
  "engines": {
80
74
  "node": ">=18.0.0"
81
75
  },
82
76
  "peerDependencies": {
83
77
  "@prisma/client": ">=6.0.0",
78
+ "drizzle-orm": ">=0.30.0",
84
79
  "express": "^4.17.0 || ^5.0.0",
85
80
  "fastify": ">=4.0.0",
86
81
  "hyper-express": ">=6.0.0",
@@ -90,6 +85,9 @@
90
85
  "@prisma/client": {
91
86
  "optional": true
92
87
  },
88
+ "drizzle-orm": {
89
+ "optional": true
90
+ },
93
91
  "express": {
94
92
  "optional": true
95
93
  },
@@ -110,14 +108,16 @@
110
108
  "@prisma/adapter-mssql": "7.8.0",
111
109
  "@prisma/adapter-pg": "^7.8.0",
112
110
  "@prisma/client": "^7.8.0",
111
+ "@types/better-sqlite3": "^7.6.13",
113
112
  "@types/express": "^5.0.6",
114
113
  "@types/node": "^25.9.3",
115
114
  "@types/pg": "^8.20.0",
116
115
  "@types/supertest": "^7.2.0",
117
116
  "@vitest/coverage-v8": "^4.1.8",
118
- "better-sqlite3": "^12.10.0",
117
+ "better-sqlite3": "^12.10.1",
119
118
  "dotenv-cli": "^11.0.0",
120
- "eslint": "^10.4.1",
119
+ "drizzle-orm": "^0.45.2",
120
+ "eslint": "^10.5.0",
121
121
  "eslint-config-prettier": "^10.1.8",
122
122
  "express": "^5.2.1",
123
123
  "fastify": "^5.8.5",
@@ -164,8 +164,24 @@
164
164
  "typescript",
165
165
  "ultimate-express"
166
166
  ],
167
- "packageManager": "pnpm@11.6.0",
168
167
  "dependencies": {
169
- "uuid": "^14.0.0"
168
+ "uuid": "^14.0.0",
169
+ "@edium/halifax-types": "0.1.0"
170
+ },
171
+ "scripts": {
172
+ "preinstall": "node -e \"const ua = process.env.npm_config_user_agent; if (ua && !ua.startsWith('pnpm')) { console.error('\\nERROR: This repo requires pnpm. Run: pnpm install\\n'); process.exit(1); }\"",
173
+ "build": "rm -rf dist && tsc --build && tsc-alias",
174
+ "dev": "tsx watch ./examples/http-express.ts",
175
+ "lint": "eslint .",
176
+ "lint:fix": "eslint . --fix",
177
+ "prettier": "prettier --check .",
178
+ "prettier:fix": "prettier --write .",
179
+ "test:unit": "vitest run tests/unit",
180
+ "test:unit:coverage": "vitest run --coverage tests/unit",
181
+ "test:integration": "dotenv -e .env.test -- vitest run --config vitest.integration.config.ts",
182
+ "test:integration:all": "bash scripts/integration-matrix.sh",
183
+ "test:integration:generate": "prisma generate --schema=tests/integration/prisma/schema.prisma",
184
+ "type-check": "tsc --noEmit && tsc --noEmit -p tests/tsconfig.json",
185
+ "type-check:examples": "prisma generate --schema=tests/integration/prisma/schema.prisma && tsc --noEmit -p examples/tsconfig.json"
170
186
  }
171
- }
187
+ }
@@ -1,28 +0,0 @@
1
- /**
2
- * Comparison operators accepted in query-builder WHERE clauses.
3
- *
4
- * The classic SQL operators (`=`, `LIKE`, `IN`, `BETWEEN`, …) are kept as-is. The string
5
- * operators (`CONTAINS`, `STARTS WITH`, `ENDS WITH`) are portable extensions that both
6
- * Prisma and Drizzle express natively on every dialect, so they behave identically
7
- * regardless of the underlying database — unlike `LIKE`, whose case-sensitivity varies
8
- * by engine collation.
9
- */
10
- export declare enum SqlComparison {
11
- Between = "BETWEEN",
12
- Contains = "CONTAINS",
13
- EndsWith = "ENDS WITH",
14
- Equal = "=",
15
- GreaterThan = ">",
16
- GreaterThanOrEqual = ">=",
17
- In = "IN",
18
- IsNotNull = "IS NOT NULL",
19
- IsNull = "IS NULL",
20
- LessThan = "<",
21
- LessThanOrEqual = "<=",
22
- Like = "LIKE",
23
- NotBetween = "NOT BETWEEN",
24
- NotEqual = "<>",
25
- NotIn = "NOT IN",
26
- NotLike = "NOT LIKE",
27
- StartsWith = "STARTS WITH"
28
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * Comparison operators accepted in query-builder WHERE clauses.
3
- *
4
- * The classic SQL operators (`=`, `LIKE`, `IN`, `BETWEEN`, …) are kept as-is. The string
5
- * operators (`CONTAINS`, `STARTS WITH`, `ENDS WITH`) are portable extensions that both
6
- * Prisma and Drizzle express natively on every dialect, so they behave identically
7
- * regardless of the underlying database — unlike `LIKE`, whose case-sensitivity varies
8
- * by engine collation.
9
- */
10
- export var SqlComparison;
11
- (function (SqlComparison) {
12
- SqlComparison["Between"] = "BETWEEN";
13
- SqlComparison["Contains"] = "CONTAINS";
14
- SqlComparison["EndsWith"] = "ENDS WITH";
15
- SqlComparison["Equal"] = "=";
16
- SqlComparison["GreaterThan"] = ">";
17
- SqlComparison["GreaterThanOrEqual"] = ">=";
18
- SqlComparison["In"] = "IN";
19
- SqlComparison["IsNotNull"] = "IS NOT NULL";
20
- SqlComparison["IsNull"] = "IS NULL";
21
- SqlComparison["LessThan"] = "<";
22
- SqlComparison["LessThanOrEqual"] = "<=";
23
- SqlComparison["Like"] = "LIKE";
24
- SqlComparison["NotBetween"] = "NOT BETWEEN";
25
- SqlComparison["NotEqual"] = "<>";
26
- SqlComparison["NotIn"] = "NOT IN";
27
- SqlComparison["NotLike"] = "NOT LIKE";
28
- SqlComparison["StartsWith"] = "STARTS WITH";
29
- })(SqlComparison || (SqlComparison = {}));
@@ -1,5 +0,0 @@
1
- /** Logical operators used to chain conditions in a WHERE clause. */
2
- export declare enum SqlOperator {
3
- And = "AND",
4
- Or = "OR"
5
- }
@@ -1,6 +0,0 @@
1
- /** Logical operators used to chain conditions in a WHERE clause. */
2
- export var SqlOperator;
3
- (function (SqlOperator) {
4
- SqlOperator["And"] = "AND";
5
- SqlOperator["Or"] = "OR";
6
- })(SqlOperator || (SqlOperator = {}));
@@ -1,5 +0,0 @@
1
- /** Sort direction for ORDER BY clauses. */
2
- export declare enum SqlOrder {
3
- ASC = "ASC",
4
- DESC = "DESC"
5
- }
@@ -1,6 +0,0 @@
1
- /** Sort direction for ORDER BY clauses. */
2
- export var SqlOrder;
3
- (function (SqlOrder) {
4
- SqlOrder["ASC"] = "ASC";
5
- SqlOrder["DESC"] = "DESC";
6
- })(SqlOrder || (SqlOrder = {}));
@@ -1,17 +0,0 @@
1
- /** Scalar types accepted as filter values. */
2
- export type QueryScalar = string | number | boolean | null;
3
- /** A single condition in a WHERE clause, optionally containing nested child conditions. */
4
- export interface IQueryFilter {
5
- /** The {@link SqlComparison} operator (e.g. `'='`, `'LIKE'`). */
6
- comparison: string;
7
- /** Column name to filter on. */
8
- field: string;
9
- /** {@link SqlOperator} joining this condition to the next sibling (`'AND'` | `'OR'`). */
10
- operator?: string;
11
- /** Primary value (or array of values for `IN` / `NOT IN`). */
12
- value1?: QueryScalar | QueryScalar[];
13
- /** Secondary value for range comparisons (`BETWEEN`, `NOT BETWEEN`). */
14
- value2?: string | number;
15
- /** Nested sub-conditions grouped in parentheses. */
16
- children?: IQueryFilter[];
17
- }
@@ -1,20 +0,0 @@
1
- import type { IQueryFilter } from '../interfaces/IQueryFilter.js';
2
- import type { ISort } from '../interfaces/ISort.js';
3
- /** The query-builder AST: a validated description of a filtered, sorted, paginated read. */
4
- export interface IQueryOptions {
5
- /**
6
- * Return only rows distinct on these columns. Portable across Prisma and Drizzle
7
- * (`distinct` / `DISTINCT ON`). Columns are validated against the resource like any other field.
8
- */
9
- distinct?: string[];
10
- /** Maximum number of rows to return. */
11
- limit?: number;
12
- /** Number of rows to skip (for pagination). */
13
- offset?: number;
14
- /** Columns to include in the result; omit to return all. */
15
- fields?: string[];
16
- /** WHERE conditions. */
17
- where?: IQueryFilter[];
18
- /** ORDER BY expressions. */
19
- orderBy?: ISort[];
20
- }
@@ -1,8 +0,0 @@
1
- import { SqlOrder } from '../enums/SqlOrder.js';
2
- /** A single ORDER BY expression. */
3
- export interface ISort {
4
- /** Column name to sort by. */
5
- field: string;
6
- /** Sort direction. */
7
- order: SqlOrder;
8
- }
@@ -1 +0,0 @@
1
- import { SqlOrder } from '../enums/SqlOrder.js';