UNPKG

@gftdcojp/ksqldb-orm

Version:

ksqldb-orm - Server-Side TypeScript ORM for ksqlDB with enterprise security extensions

226 lines 8.21 kB
"use strict"; /** * 列名変換ユーティリティ * * 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