@pdg/drizzle-mysql 1.0.1 → 1.0.2

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/README.md CHANGED
@@ -320,7 +320,7 @@ await db.trans(async () => {
320
320
 
321
321
  ### 생성·수정 시각
322
322
 
323
- 컬럼 정책은 이 패키지에서 가져온 `mysqlTable`에 선언합니다. 자동 증가 컬럼은 기본적으로 등록과 수정이 금지되며, 각각 `insertAllowed()`와 `updateAllowed()`로 허용할 수 있습니다. 다른 컬럼은 `insertBlocked()`와 `updateBlocked()`로 금지하거나 `updateRequired()`로 수정 시 필수로 지정합니다. 금지된 값을 전달하거나 필수 수정 값을 누락하면 런타임에도 오류가 발생합니다.
323
+ 컬럼 정책은 이 패키지에서 가져온 `mysqlTable`에 선언합니다. 자동 증가 컬럼은 기본적으로 등록과 수정이 금지되며, 각각 `insertAllowed()`와 `updateAllowed()`로 허용할 수 있습니다. `primaryKey()`로 지정한 컬럼도 기본적으로 수정이 금지되며, `updateAllowed()`를 명시해야 수정할 수 있습니다. 다른 컬럼은 `insertBlocked()`와 `updateBlocked()`로 금지하거나 `updateRequired()`로 수정 시 필수로 지정합니다. 금지된 값을 전달하거나 필수 수정 값을 누락하면 런타임에도 오류가 발생합니다.
324
324
 
325
325
  ```ts
326
326
  import { drizzleMySql, mysqlTable, int, varchar, datetime } from '@pdg/drizzle-mysql';
@@ -1,14 +1,17 @@
1
1
  import type { MySqlTable } from 'drizzle-orm/mysql-core/table';
2
2
  import type { MySqlUpdateSetSource } from 'drizzle-orm/mysql-core/query-builders/update';
3
3
  import type { TablePolicies } from '../mysqlTable.cjs';
4
+ type DefaultBlocked<T extends MySqlTable, K> = K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isPrimaryKey'] extends true ? K : T['_']['columns'][K]['_']['isAutoincrement'] extends true ? K : never : never;
4
5
  type Blocked<T extends MySqlTable> = {
5
6
  [K in keyof MySqlUpdateSetSource<T>]-?: K extends keyof TablePolicies<T> ? TablePolicies<T>[K] extends {
6
7
  timestamp: string;
7
8
  } | {
8
9
  update: 'blocked';
9
10
  } ? K : TablePolicies<T>[K] extends {
10
- update: 'allowed' | 'required';
11
- } ? never : K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isAutoincrement'] extends true ? K : never : never : K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isAutoincrement'] extends true ? K : never : never;
11
+ update: 'allowed';
12
+ } ? never : K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isPrimaryKey'] extends true ? K : TablePolicies<T>[K] extends {
13
+ update: 'required';
14
+ } ? never : DefaultBlocked<T, K> : never : DefaultBlocked<T, K>;
12
15
  }[keyof MySqlUpdateSetSource<T>] & keyof MySqlUpdateSetSource<T>;
13
16
  type RequiredKeys<T extends MySqlTable> = {
14
17
  [K in keyof MySqlUpdateSetSource<T>]-?: K extends keyof TablePolicies<T> ? TablePolicies<T>[K] extends {
@@ -1,14 +1,17 @@
1
1
  import type { MySqlTable } from 'drizzle-orm/mysql-core/table';
2
2
  import type { MySqlUpdateSetSource } from 'drizzle-orm/mysql-core/query-builders/update';
3
3
  import type { TablePolicies } from '../mysqlTable.js';
4
+ type DefaultBlocked<T extends MySqlTable, K> = K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isPrimaryKey'] extends true ? K : T['_']['columns'][K]['_']['isAutoincrement'] extends true ? K : never : never;
4
5
  type Blocked<T extends MySqlTable> = {
5
6
  [K in keyof MySqlUpdateSetSource<T>]-?: K extends keyof TablePolicies<T> ? TablePolicies<T>[K] extends {
6
7
  timestamp: string;
7
8
  } | {
8
9
  update: 'blocked';
9
10
  } ? K : TablePolicies<T>[K] extends {
10
- update: 'allowed' | 'required';
11
- } ? never : K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isAutoincrement'] extends true ? K : never : never : K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isAutoincrement'] extends true ? K : never : never;
11
+ update: 'allowed';
12
+ } ? never : K extends keyof T['_']['columns'] ? T['_']['columns'][K]['_']['isPrimaryKey'] extends true ? K : TablePolicies<T>[K] extends {
13
+ update: 'required';
14
+ } ? never : DefaultBlocked<T, K> : never : DefaultBlocked<T, K>;
12
15
  }[keyof MySqlUpdateSetSource<T>] & keyof MySqlUpdateSetSource<T>;
13
16
  type RequiredKeys<T extends MySqlTable> = {
14
17
  [K in keyof MySqlUpdateSetSource<T>]-?: K extends keyof TablePolicies<T> ? TablePolicies<T>[K] extends {
package/dist/index.cjs CHANGED
@@ -405,10 +405,14 @@ class MySqlQuery {
405
405
  const policy = policies[key] ?? {};
406
406
  const auto = 'autoIncrement' in column && column.autoIncrement === true;
407
407
  const rule = operation === 'insert' ? policy.insert : policy.update;
408
- const blocked = !!policy.timestamp || rule === 'blocked' || (auto && rule !== 'allowed' && rule !== 'required');
408
+ const primary = column.primary;
409
+ const blocked = !!policy.timestamp ||
410
+ rule === 'blocked' ||
411
+ (operation === 'update' && primary && rule !== 'allowed') ||
412
+ (auto && rule !== 'allowed' && rule !== 'required');
409
413
  if (blocked && Object.hasOwn(values, key))
410
414
  throw new Error(`${operation}: column "${key}" is blocked.`);
411
- if (operation === 'update' && rule === 'required' && values[key] === undefined) {
415
+ if (operation === 'update' && !blocked && rule === 'required' && values[key] === undefined) {
412
416
  throw new Error(`update: column "${key}" is required.`);
413
417
  }
414
418
  if (policy.timestamp && (operation === 'insert' || policy.timestamp === 'updated')) {
package/dist/index.esm.js CHANGED
@@ -405,10 +405,14 @@ class MySqlQuery {
405
405
  const policy = policies[key] ?? {};
406
406
  const auto = 'autoIncrement' in column && column.autoIncrement === true;
407
407
  const rule = operation === 'insert' ? policy.insert : policy.update;
408
- const blocked = !!policy.timestamp || rule === 'blocked' || (auto && rule !== 'allowed' && rule !== 'required');
408
+ const primary = column.primary;
409
+ const blocked = !!policy.timestamp ||
410
+ rule === 'blocked' ||
411
+ (operation === 'update' && primary && rule !== 'allowed') ||
412
+ (auto && rule !== 'allowed' && rule !== 'required');
409
413
  if (blocked && Object.hasOwn(values, key))
410
414
  throw new Error(`${operation}: column "${key}" is blocked.`);
411
- if (operation === 'update' && rule === 'required' && values[key] === undefined) {
415
+ if (operation === 'update' && !blocked && rule === 'required' && values[key] === undefined) {
412
416
  throw new Error(`update: column "${key}" is required.`);
413
417
  }
414
418
  if (policy.timestamp && (operation === 'insert' || policy.timestamp === 'updated')) {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@pdg/drizzle-mysql",
3
3
  "title": "Drizzle for MySql",
4
4
  "description": "Drizzle for MySql",
5
- "version": "1.0.1",
5
+ "version": "1.0.2",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
8
8
  "module": "./dist/index.esm.js",