@gftdcojp/ksqldb-orm
Version:
ksqldb-orm - Server-Side TypeScript ORM for ksqlDB with enterprise security extensions
226 lines • 8.21 kB
JavaScript
;
/**
* 列名変換ユーティリティ
*
* KsqlDBの列名が強制的に大文字になることに対応するため、
* TypeScript側のキャメルケースやスネークケースの列名を
* 適切に変換するユーティリティ関数
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.PRESET_COLUMN_TRANSFORM_CONFIGS = exports.COMMON_COLUMN_MAPPINGS = void 0;
exports.toCamelCase = toCamelCase;
exports.toSnakeCase = toSnakeCase;
exports.toUpperCase = toUpperCase;
exports.toLowerCase = toLowerCase;
exports.transformColumnNameForKsqlDb = transformColumnNameForKsqlDb;
exports.transformColumnNameFromKsqlDb = transformColumnNameFromKsqlDb;
exports.transformColumnNamesForKsqlDb = transformColumnNamesForKsqlDb;
exports.transformColumnNamesFromKsqlDb = transformColumnNamesFromKsqlDb;
exports.transformObjectKeysForKsqlDb = transformObjectKeysForKsqlDb;
exports.transformObjectKeysFromKsqlDb = transformObjectKeysFromKsqlDb;
/**
* 文字列をキャメルケースに変換
* 例: user_id → userId, USER_NAME → userName, USERID → userId
*/
function toCamelCase(str) {
// まず全体を小文字にする
let result = str.toLowerCase();
// アンダースコアの後の文字を大文字に変換
result = result.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
// 連続した大文字の単語を処理(例:USERID → userId)
// 最初の文字は小文字のままで、特定のパターンを識別
if (result.length > 1 && !result.includes('_')) {
// 一般的なID、At等のサフィックスを特別に処理
const commonSuffixes = ['id', 'at', 'by', 'in', 'on', 'of', 'to', 'is'];
for (const suffix of commonSuffixes) {
if (result.endsWith(suffix) && result.length > suffix.length) {
const prefix = result.slice(0, -suffix.length);
result = prefix + suffix.charAt(0).toUpperCase() + suffix.slice(1);
break;
}
}
}
return result;
}
/**
* 文字列をスネークケースに変換
* 例: userId → user_id, UserName → user_name
*/
function toSnakeCase(str) {
return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');
}
/**
* 文字列を大文字に変換
* 例: userId → USERID, user_id → USER_ID
*/
function toUpperCase(str) {
return str.toUpperCase();
}
/**
* 文字列を小文字に変換
* 例: USERID → userid, USER_ID → user_id
*/
function toLowerCase(str) {
return str.toLowerCase();
}
/**
* KsqlDB用列名変換(クエリ送信時)
* TypeScriptコードで使用する列名をKsqlDBで使用する列名に変換
*/
function transformColumnNameForKsqlDb(columnName, config = {}) {
const { strategy = 'uppercase', customTransform, columnMappings = {}, preserveExistingUppercase = true } = config;
// 1. 明示的なマッピングが存在する場合はそれを使用
if (columnMappings[columnName]) {
return columnMappings[columnName];
}
// 2. すでに大文字の場合は、保持設定に従って処理
if (preserveExistingUppercase && columnName === columnName.toUpperCase()) {
return columnName;
}
// 3. カスタム変換関数が指定されている場合はそれを使用
if (customTransform) {
return customTransform(columnName);
}
// 4. 事前定義された戦略に従って変換
switch (strategy) {
case 'uppercase':
return toUpperCase(columnName);
case 'lowercase':
return toLowerCase(columnName);
case 'camelCase':
return toCamelCase(columnName);
case 'snake_case':
return toSnakeCase(columnName);
case 'none':
return columnName;
default:
return toUpperCase(columnName); // デフォルトは大文字
}
}
/**
* KsqlDBからのレスポンス列名変換(レスポンス受信時)
* KsqlDBから受け取った列名をTypeScriptで使いやすい形式に変換
*/
function transformColumnNameFromKsqlDb(columnName, config = {}) {
const { strategy = 'camelCase', customTransform, columnMappings = {} } = config;
// 1. 逆マッピング辞書で検索
const reverseMapping = Object.entries(columnMappings).find(([_, value]) => value === columnName)?.[0];
if (reverseMapping) {
return reverseMapping;
}
// 2. カスタム変換関数が指定されている場合はそれを使用
if (customTransform) {
return customTransform(columnName);
}
// 3. 事前定義された戦略に従って変換
switch (strategy) {
case 'uppercase':
return toUpperCase(columnName);
case 'lowercase':
return toLowerCase(columnName);
case 'camelCase':
return toCamelCase(columnName);
case 'snake_case':
return toSnakeCase(columnName);
case 'none':
return columnName;
default:
return toCamelCase(columnName); // デフォルトはキャメルケース
}
}
/**
* 複数の列名を一括変換(KsqlDB送信用)
*/
function transformColumnNamesForKsqlDb(columnNames, config = {}) {
return columnNames.map(name => transformColumnNameForKsqlDb(name, config));
}
/**
* 複数の列名を一括変換(KsqlDBレスポンス用)
*/
function transformColumnNamesFromKsqlDb(columnNames, config = {}) {
return columnNames.map(name => transformColumnNameFromKsqlDb(name, config));
}
/**
* オブジェクトのキーを変換(KsqlDB送信用)
*/
function transformObjectKeysForKsqlDb(obj, config = {}) {
const result = {};
for (const [key, value] of Object.entries(obj)) {
const transformedKey = transformColumnNameForKsqlDb(key, config);
result[transformedKey] = value;
}
return result;
}
/**
* オブジェクトのキーを変換(KsqlDBレスポンス用)
*/
function transformObjectKeysFromKsqlDb(obj, config = {}) {
const result = {};
for (const [key, value] of Object.entries(obj)) {
const transformedKey = transformColumnNameFromKsqlDb(key, config);
result[transformedKey] = value;
}
return result;
}
/**
* 一般的な列名マッピングパターン
*/
exports.COMMON_COLUMN_MAPPINGS = {
/** TypeScript camelCase → KsqlDB UPPERCASE マッピング */
CAMEL_TO_UPPER: {
'userId': 'USERID',
'userName': 'USERNAME',
'userEmail': 'USEREMAIL',
'accountId': 'ACCOUNTID',
'createdAt': 'CREATEDAT',
'updatedAt': 'UPDATEDAT',
'isActive': 'ISACTIVE',
'firstName': 'FIRSTNAME',
'lastName': 'LASTNAME',
'phoneNumber': 'PHONENUMBER',
'emailAddress': 'EMAILADDRESS',
},
/** snake_case → KsqlDB UPPERCASE マッピング */
SNAKE_TO_UPPER: {
'user_id': 'USER_ID',
'user_name': 'USER_NAME',
'user_email': 'USER_EMAIL',
'account_id': 'ACCOUNT_ID',
'created_at': 'CREATED_AT',
'updated_at': 'UPDATED_AT',
'is_active': 'IS_ACTIVE',
'first_name': 'FIRST_NAME',
'last_name': 'LAST_NAME',
'phone_number': 'PHONE_NUMBER',
'email_address': 'EMAIL_ADDRESS',
}
};
/**
* 事前定義された設定パターン
*/
exports.PRESET_COLUMN_TRANSFORM_CONFIGS = {
/** デフォルト: TypeScript camelCase ↔ KsqlDB UPPERCASE */
DEFAULT: {
strategy: 'uppercase',
columnMappings: {},
preserveExistingUppercase: true
},
/** camelCase用: camelCase ↔ UPPERCASE */
CAMEL_CASE: {
strategy: 'uppercase',
columnMappings: exports.COMMON_COLUMN_MAPPINGS.CAMEL_TO_UPPER,
preserveExistingUppercase: true
},
/** snake_case用: snake_case ↔ UPPERCASE */
SNAKE_CASE: {
strategy: 'uppercase',
columnMappings: exports.COMMON_COLUMN_MAPPINGS.SNAKE_TO_UPPER,
preserveExistingUppercase: true
},
/** 変換なし */
NONE: {
strategy: 'none',
preserveExistingUppercase: true
}
};
//# sourceMappingURL=column-name-transform.js.map