sonamu 0.5.3 → 0.5.4

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 (41) hide show
  1. package/dist/api/code-converters.js +1 -1
  2. package/dist/api/code-converters.js.map +1 -1
  3. package/dist/api/decorators.d.ts +6 -1
  4. package/dist/api/decorators.d.ts.map +1 -1
  5. package/dist/api/decorators.js +1 -1
  6. package/dist/api/decorators.js.map +1 -1
  7. package/dist/bin/cli-wrapper.js +1 -1
  8. package/dist/bin/cli-wrapper.js.map +1 -1
  9. package/dist/database/puri-wrapper.d.ts +8 -1
  10. package/dist/database/puri-wrapper.d.ts.map +1 -1
  11. package/dist/database/puri-wrapper.js +1 -1
  12. package/dist/database/puri-wrapper.js.map +1 -1
  13. package/dist/database/puri.d.ts +2 -0
  14. package/dist/database/puri.d.ts.map +1 -1
  15. package/dist/database/puri.js +1 -1
  16. package/dist/database/puri.js.map +1 -1
  17. package/dist/database/puri.types.d.ts +4 -8
  18. package/dist/database/puri.types.d.ts.map +1 -1
  19. package/dist/index.d.ts +2 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/migration/code-generation.js +1 -1
  24. package/dist/migration/code-generation.js.map +1 -1
  25. package/dist/migration/types.d.ts +2 -1
  26. package/dist/migration/types.d.ts.map +1 -1
  27. package/dist/syncer/syncer.d.ts +1 -0
  28. package/dist/syncer/syncer.d.ts.map +1 -1
  29. package/dist/templates/generated_http.template.d.ts.map +1 -1
  30. package/dist/templates/generated_http.template.js +1 -1
  31. package/dist/templates/generated_http.template.js.map +1 -1
  32. package/dist/templates/generated_sso.template.d.ts.map +1 -1
  33. package/dist/templates/generated_sso.template.js +1 -1
  34. package/dist/templates/generated_sso.template.js.map +1 -1
  35. package/dist/templates/service.template.d.ts.map +1 -1
  36. package/dist/templates/service.template.js +1 -1
  37. package/dist/templates/service.template.js.map +1 -1
  38. package/dist/testing/fixture-manager.d.ts.map +1 -1
  39. package/dist/testing/fixture-manager.js +1 -1
  40. package/dist/testing/fixture-manager.js.map +1 -1
  41. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testing/fixture-manager.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport {\n EntityProp,\n FixtureImportResult,\n FixtureRecord,\n FixtureSearchOptions,\n ManyToManyRelationProp,\n isBelongsToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n isOneToOneRelationProp,\n isRelationProp,\n isVirtualProp,\n} from \"../types/types\";\nimport { Entity } from \"../entity/entity\";\nimport inflection from \"inflection\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { RelationGraph } from \"./_relation-graph\";\nimport knex, { Knex } from \"knex\";\nimport { BaseModel } from \"../database/base-model\";\nimport { SonamuDBConfig } from \"../database/db\";\n\nexport class FixtureManagerClass {\n private _tdb: Knex | null = null;\n set tdb(tdb: Knex) {\n this._tdb = tdb;\n }\n get tdb(): Knex {\n if (this._tdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._tdb;\n }\n\n private _fdb: Knex | null = null;\n set fdb(fdb: Knex) {\n this._fdb = fdb;\n }\n get fdb(): Knex {\n if (this._fdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._fdb;\n }\n cachedTableNames: string[] | null = null;\n\n private relationGraph = new RelationGraph();\n\n init() {\n if (this._tdb !== null) {\n return;\n }\n if (Sonamu.dbConfig.test && Sonamu.dbConfig.production_master) {\n const tConn = Sonamu.dbConfig.test.connection as Knex.ConnectionConfig & {\n port?: number;\n };\n const pConn = Sonamu.dbConfig.production_master\n .connection as Knex.ConnectionConfig & { port?: number };\n if (\n `${tConn.host ?? \"localhost\"}:${tConn.port ?? 3306}/${\n tConn.database\n }` ===\n `${pConn.host ?? \"localhost\"}:${pConn.port ?? 3306}/${pConn.database}`\n ) {\n throw new Error(\n `테스트DB와 프로덕션DB에 동일한 데이터베이스가 사용되었습니다.`\n );\n }\n }\n\n this.tdb = knex(Sonamu.dbConfig.test);\n this.fdb = knex(Sonamu.dbConfig.fixture_local);\n }\n\n async cleanAndSeed(usingTables?: string[]) {\n const tableNames: string[] = await (async () => {\n if (usingTables) {\n return usingTables;\n }\n if (this.cachedTableNames) {\n return this.cachedTableNames;\n }\n\n const [tables] = await this.tdb.raw(\n `SHOW TABLE STATUS WHERE Engine IS NOT NULL AND Name != 'migrations'`\n );\n const tableNames = tables.map(\n (tableInfo: { Name: string }) => tableInfo[\"Name\"]\n );\n this.cachedTableNames = tableNames;\n return tableNames;\n })();\n\n // migrations 제외한 테이블 목록\n const tableListStr = tableNames.join(\", \");\n\n // 한 번에 모든 테이블 체크섬 확인\n const [fdbChecksumRows] = await this.fdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n const [tdbChecksumRows] = await this.tdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n\n // 체크섬 맵 생성\n const fdbChecksums = new Map(\n fdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n const tdbChecksums = new Map(\n tdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n\n // 변경된 테이블들만 처리\n const changedTables = tableNames.filter(\n (tableName) => fdbChecksums.get(tableName) !== tdbChecksums.get(tableName)\n );\n\n // 병렬로 truncate + insert 실행\n await this.tdb.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n await Promise.all(\n changedTables.map(async (tableName) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await trx(tableName).truncate();\n const rawQuery = `INSERT INTO ${\n (Sonamu.dbConfig.test.connection as Knex.ConnectionConfig).database\n }.${tableName}\n SELECT * FROM ${\n (Sonamu.dbConfig.fixture_local.connection as Knex.ConnectionConfig)\n .database\n }.${tableName}`;\n await trx.raw(rawQuery);\n })\n );\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n // console.timeEnd(\"FIXTURE-CleanAndSeed\");\n }\n\n async getChecksum(db: Knex, tableName: string) {\n const [[checksumRow]] = await db.raw(`CHECKSUM TABLE ${tableName}`);\n return checksumRow.Checksum;\n }\n\n async sync() {\n const frdb = knex(Sonamu.dbConfig.fixture_remote);\n\n const [tables] = await this.fdb.raw(\n \"SHOW TABLE STATUS WHERE Engine IS NOT NULL\"\n );\n const tableNames: string[] = tables.map(\n (table: any) => table.Name as string\n );\n\n console.log(chalk.magenta(\"SYNC...\"));\n await Promise.all(\n tableNames.map(async (tableName) => {\n if (tableName.startsWith(\"knex_migrations\")) {\n return;\n }\n\n const remoteChecksum = await this.getChecksum(frdb, tableName);\n const localChecksum = await this.getChecksum(this.fdb, tableName);\n\n if (remoteChecksum !== localChecksum) {\n await this.fdb.transaction(async (transaction) => {\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await transaction(tableName).truncate();\n\n const rows = await frdb(tableName);\n if (rows.length === 0) {\n return;\n }\n\n console.log(chalk.blue(tableName), rows.length);\n await transaction\n .insert(\n rows.map((row: any) => {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => {\n if (value === null) {\n return [key, null];\n } else if (typeof value === \"boolean\") {\n return [key, value ? 1 : 0];\n } else if (\n typeof value === \"object\" &&\n !(value instanceof Date)\n ) {\n return [key, JSON.stringify(value)];\n } else {\n return [key, value];\n }\n })\n );\n })\n )\n .into(tableName);\n console.log(\"OK\");\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n }\n })\n );\n console.log(chalk.magenta(\"DONE!\"));\n\n await frdb.destroy();\n }\n\n private visitedRecords = new Set<string>();\n async importFixture(entityId: string, ids: number[]) {\n // 방문 기록 초기화 (새로운 import 작업 시작)\n this.visitedRecords.clear();\n\n const queries = _.uniq(\n (\n await Promise.all(\n ids.map(async (id) => {\n return await this.getImportQueries(entityId, \"id\", id);\n })\n )\n ).flat()\n );\n\n const wdb = BaseModel.getDB(\"w\");\n for (let query of queries) {\n const [rsh] = await wdb.raw(query);\n console.log({\n query,\n info: rsh.info,\n });\n }\n }\n\n async getImportQueries(\n entityId: string,\n field: string,\n id: number\n ): Promise<string[]> {\n const recordKey = `${entityId}#${field}#${id}`;\n\n // 순환 참조 방지: 이미 방문한 레코드는 스킵\n if (this.visitedRecords.has(recordKey)) {\n return [];\n }\n this.visitedRecords.add(recordKey);\n\n console.log({ entityId, field, id });\n const entity = EntityManager.get(entityId);\n const wdb = BaseModel.getDB(\"w\");\n\n // 여기서 실DB의 row 가져옴\n const [row] = await wdb(entity.table).where(field, id).limit(1);\n if (row === undefined) {\n throw new Error(`${entityId}#${id} row를 찾을 수 없습니다.`);\n }\n\n // 픽스쳐DB, 실DB\n const fixtureDatabase = (Sonamu.dbConfig.fixture_remote.connection as any)\n .database;\n const realDatabase = (Sonamu.dbConfig.production_master.connection as any)\n .database;\n\n const selfQuery = `INSERT IGNORE INTO \\`${fixtureDatabase}\\`.\\`${entity.table}\\` (SELECT * FROM \\`${realDatabase}\\`.\\`${entity.table}\\` WHERE \\`id\\` = ${id})`;\n\n const args = Object.entries(entity.relations)\n .filter(\n ([, relation]) =>\n isBelongsToOneRelationProp(relation) ||\n (isOneToOneRelationProp(relation) &&\n relation.customJoinClause === undefined)\n )\n .map(([, relation]) => {\n /*\n BelongsToOne인 경우\n Category / 'id' / row[category_id] 호출\n OneToOne에 joinColumn === true 인 경우\n Profile / 'id' / row[profile_id] 호출\n OneToOne에 joinColumn === false 인 경우\n Profile / 'profile_id' / row['id'] 호출\n */\n let field: string;\n let id: number;\n if (isOneToOneRelationProp(relation) && !relation.hasJoinColumn) {\n const relatedEntity = EntityManager.get(relation.with);\n const relatedIdColumnName = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n )?.name;\n if (!relatedIdColumnName) {\n throw new Error(\n `${relatedEntity.id}의 ${entity.id} 관계 프롭을 찾을 수 없습니다.`\n );\n }\n field = `${relatedIdColumnName}_id`;\n id = row[\"id\"];\n } else {\n field = \"id\";\n id = row[`${relation.name}_id`];\n }\n return {\n entityId: relation.with,\n field,\n id,\n };\n })\n .filter((arg) => arg.id !== null);\n\n const relQueries = await Promise.all(\n args.map(async (args) => {\n return this.getImportQueries(args.entityId, args.field, args.id);\n })\n );\n\n return [..._.uniq(relQueries.reverse().flat()), selfQuery];\n }\n\n async destroy() {\n if (this._tdb) {\n await this._tdb.destroy();\n this._tdb = null;\n }\n if (this._fdb) {\n await this._fdb.destroy();\n this._fdb = null;\n }\n await BaseModel.destroy();\n }\n\n async getFixtures(\n sourceDBName: keyof SonamuDBConfig,\n targetDBName: keyof SonamuDBConfig,\n searchOptions: FixtureSearchOptions\n ) {\n const sourceDB = knex(Sonamu.dbConfig[sourceDBName]);\n const targetDB = knex(Sonamu.dbConfig[targetDBName]);\n const { entityId, field, value, searchType } = searchOptions;\n\n const entity = EntityManager.get(entityId);\n const column =\n entity.props.find((prop) => prop.name === field)?.type === \"relation\"\n ? `${field}_id`\n : field;\n\n let query = sourceDB(entity.table);\n if (searchType === \"equals\") {\n query = query.where(column, value);\n } else if (searchType === \"like\") {\n query = query.where(column, \"like\", `%${value}%`);\n }\n\n const rows = await query;\n if (rows.length === 0) {\n throw new Error(\"No records found\");\n }\n\n const fixtures: FixtureRecord[] = [];\n for (const row of rows) {\n const initialRecordsLength = fixtures.length;\n const newRecords = await this.createFixtureRecord(entity, row);\n fixtures.push(...newRecords);\n const currentFixtureRecord = fixtures.find(\n (r) => r.fixtureId === `${entityId}#${row.id}`\n );\n\n if (currentFixtureRecord) {\n // 현재 fixture로부터 생성된 fetchedRecords 설정\n currentFixtureRecord.fetchedRecords = fixtures\n .filter((r) => r.fixtureId !== currentFixtureRecord.fixtureId)\n .slice(initialRecordsLength)\n .map((r) => r.fixtureId);\n }\n }\n\n for await (const fixture of fixtures) {\n const entity = EntityManager.get(fixture.entityId);\n\n // ID를 이용하여 targetDB에 레코드가 존재하는지 확인\n const row = await targetDB(entity.table).where(\"id\", fixture.id).first();\n if (row) {\n const [record] = await this.createFixtureRecord(entity, row, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.target = record;\n continue;\n }\n\n // ID를 이용하여 targetDB에서 조회되지 않는 경우, unique 제약을 위반하는지 확인\n const uniqueRow = await this.checkUniqueViolation(\n targetDB,\n entity,\n fixture\n );\n if (uniqueRow) {\n const [record] = await this.createFixtureRecord(entity, uniqueRow, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.unique = record;\n }\n }\n\n return _.uniqBy(fixtures, (f) => f.fixtureId);\n }\n\n async createFixtureRecord(\n entity: Entity,\n row: any,\n options?: {\n singleRecord?: boolean;\n _db?: Knex;\n }\n ): Promise<FixtureRecord[]> {\n const records: FixtureRecord[] = [];\n const visitedEntities = new Set<string>();\n\n const create = async (entity: Entity, row: any) => {\n const fixtureId = `${entity.id}#${row.id}`;\n if (visitedEntities.has(fixtureId)) {\n return;\n }\n visitedEntities.add(fixtureId);\n\n const record: FixtureRecord = {\n fixtureId,\n entityId: entity.id,\n id: row.id,\n columns: {},\n fetchedRecords: [],\n belongsRecords: [],\n };\n\n for (const prop of entity.props) {\n if (isVirtualProp(prop)) {\n continue;\n }\n\n record.columns[prop.name] = {\n prop: prop,\n value: row[prop.name],\n };\n\n const db = options?._db ?? BaseModel.getDB(\"w\");\n if (isManyToManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const throughTable = prop.joinTable;\n const fromColumn = `${inflection.singularize(entity.table)}_id`;\n const toColumn = `${inflection.singularize(relatedEntity.table)}_id`;\n\n const relatedIds = await db(throughTable)\n .where(fromColumn, row.id)\n .pluck(toColumn);\n record.columns[prop.name].value = relatedIds;\n } else if (isHasManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedIds = await db(relatedEntity.table)\n .where(prop.joinColumn, row.id)\n .pluck(\"id\");\n record.columns[prop.name].value = relatedIds;\n } else if (isOneToOneRelationProp(prop) && !prop.hasJoinColumn) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedProp = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n );\n if (relatedProp) {\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", row.id)\n .first();\n record.columns[prop.name].value = relatedRow?.id;\n }\n } else if (isRelationProp(prop)) {\n const relatedId = row[`${prop.name}_id`];\n record.columns[prop.name].value = relatedId;\n if (relatedId) {\n record.belongsRecords.push(`${prop.with}#${relatedId}`);\n }\n if (!options?.singleRecord && relatedId) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", relatedId)\n .first();\n if (relatedRow) {\n await create(relatedEntity, relatedRow);\n }\n }\n }\n }\n\n records.push(record);\n };\n\n await create(entity, row);\n\n return records;\n }\n\n async insertFixtures(\n dbName: keyof SonamuDBConfig,\n _fixtures: FixtureRecord[]\n ) {\n const fixtures = _.uniqBy(_fixtures, (f) => f.fixtureId);\n\n this.relationGraph.buildGraph(fixtures);\n const insertionOrder = this.relationGraph.getInsertionOrder();\n const db = knex(Sonamu.dbConfig[dbName]);\n\n await db.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n const result = await this.insertFixture(trx as any, fixture);\n if (result.id !== fixture.id) {\n // ID가 변경된 경우, 다른 fixture에서 참조하는 경우가 찾아서 수정\n console.log(\n chalk.yellow(\n `Unique constraint violation: ${fixture.entityId}#${fixture.id} -> ${fixture.entityId}#${result.id}`\n )\n );\n fixtures.forEach((f) => {\n Object.values(f.columns).forEach((column) => {\n if (\n column.prop.type === \"relation\" &&\n column.prop.with === result.entityId &&\n column.value === fixture.id\n ) {\n column.value = result.id;\n }\n });\n });\n fixture.id = result.id;\n }\n }\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n await this.handleManyToManyRelations(trx as any, fixture, fixtures);\n }\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n const records: FixtureImportResult[] = [];\n\n for await (const r of fixtures) {\n const entity = EntityManager.get(r.entityId);\n const record = await db(entity.table).where(\"id\", r.id).first();\n records.push({\n entityId: r.entityId,\n data: record,\n });\n }\n\n return _.uniqBy(records, (r) => `${r.entityId}#${r.data.id}`);\n }\n\n private prepareInsertData(fixture: FixtureRecord) {\n const insertData: any = {};\n for (const [propName, column] of Object.entries(fixture.columns)) {\n if (isVirtualProp(column.prop)) {\n continue;\n }\n\n const prop = column.prop as EntityProp;\n if (!isRelationProp(prop)) {\n if (prop.type === \"json\") {\n insertData[propName] = JSON.stringify(column.value);\n } else {\n insertData[propName] = column.value;\n }\n } else if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n insertData[`${propName}_id`] = column.value;\n }\n }\n return insertData;\n }\n\n private async insertFixture(db: Knex, fixture: FixtureRecord) {\n const insertData = this.prepareInsertData(fixture);\n const entity = EntityManager.get(fixture.entityId);\n\n try {\n const uniqueFound = await this.checkUniqueViolation(db, entity, fixture);\n if (uniqueFound) {\n return {\n entityId: fixture.entityId,\n id: uniqueFound.id,\n };\n }\n\n const found = await db(entity.table).where(\"id\", fixture.id).first();\n if (found && !fixture.override) {\n return {\n entityId: fixture.entityId,\n id: found.id,\n };\n }\n\n const q = db.insert(insertData).into(entity.table);\n await q.onDuplicateUpdate.apply(q, Object.keys(insertData));\n return {\n entityId: fixture.entityId,\n id: fixture.id,\n };\n } catch (err) {\n console.log(err);\n throw err;\n }\n }\n\n private async handleManyToManyRelations(\n db: Knex,\n fixture: FixtureRecord,\n fixtures: FixtureRecord[]\n ) {\n for (const [, column] of Object.entries(fixture.columns)) {\n const prop = column.prop as EntityProp;\n if (isManyToManyRelationProp(prop)) {\n const joinTable = (prop as ManyToManyRelationProp).joinTable;\n const relatedIds = column.value as number[];\n\n for (const relatedId of relatedIds) {\n if (\n !fixtures.find((f) => f.fixtureId === `${prop.with}#${relatedId}`)\n ) {\n continue;\n }\n\n const entity = EntityManager.get(fixture.entityId);\n const relatedEntity = EntityManager.get(prop.with);\n if (!entity || !relatedEntity) {\n throw new Error(\n `Entity not found: ${fixture.entityId}, ${prop.with}`\n );\n }\n\n const [found] = await db(joinTable)\n .where({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n })\n .limit(1);\n if (found) {\n continue;\n }\n\n const newIds = await db(joinTable).insert({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n });\n console.log(\n chalk.green(\n `Inserted into ${joinTable}: ${entity.table}(${fixture.id}) - ${relatedEntity.table}(${relatedId}) ID: ${newIds}`\n )\n );\n }\n }\n }\n }\n\n async addFixtureLoader(code: string) {\n const path = Sonamu.apiRootPath + \"/src/testing/fixture.ts\";\n let content = readFileSync(path).toString();\n\n const fixtureLoaderStart = content.indexOf(\"const fixtureLoader = {\");\n const fixtureLoaderEnd = content.indexOf(\"};\", fixtureLoaderStart);\n\n if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1) {\n const newContent =\n content.slice(0, fixtureLoaderEnd) +\n \" \" +\n code +\n \"\\n\" +\n content.slice(fixtureLoaderEnd);\n\n writeFileSync(path, newContent);\n } else {\n throw new Error(\"Failed to find fixtureLoader in fixture.ts\");\n }\n }\n\n // 해당 픽스쳐의 값으로 유니크 제약에 위배되는 레코드가 있는지 확인\n private async checkUniqueViolation(\n db: Knex,\n entity: Entity,\n fixture: FixtureRecord\n ) {\n const _uniqueIndexes = entity.indexes.filter((i) => i.type === \"unique\");\n\n // ManyToMany 관계 테이블의 유니크 제약은 제외\n const uniqueIndexes = _uniqueIndexes.filter((index) =>\n index.columns.every((column) => !column.startsWith(`${entity.table}__`))\n );\n if (uniqueIndexes.length === 0) {\n return null;\n }\n\n let uniqueQuery = db(entity.table);\n for (const index of uniqueIndexes) {\n // 컬럼 중 하나라도 null이면 유니크 제약을 위반하지 않기 때문에 해당 인덱스는 무시\n const containsNull = index.columns.some((column) => {\n const field = column.split(\"_id\")[0];\n return fixture.columns[field].value === null;\n });\n if (containsNull) {\n continue;\n }\n\n uniqueQuery = uniqueQuery.orWhere((qb) => {\n for (const column of index.columns) {\n const field = column.split(\"_id\")[0];\n\n if (Array.isArray(fixture.columns[field].value)) {\n qb.whereIn(column, fixture.columns[field].value);\n } else {\n qb.andWhere(column, fixture.columns[field].value);\n }\n }\n });\n }\n const [uniqueFound] = await uniqueQuery;\n return uniqueFound;\n }\n}\nexport const FixtureManager = new FixtureManagerClass();\n"],"names":["FixtureManager","FixtureManagerClass","_tdb","_fdb","cachedTableNames","relationGraph","RelationGraph","visitedRecords","Set","tdb","Error","fdb","init","Sonamu","dbConfig","test","production_master","tConn","connection","pConn","host","port","database","knex","fixture_local","cleanAndSeed","usingTables","tableNames","tableListStr","fdbChecksumRows","tdbChecksumRows","fdbChecksums","tdbChecksums","changedTables","tables","raw","map","tableInfo","join","Map","row","Table","split","pop","Checksum","filter","tableName","get","transaction","trx","Promise","all","rawQuery","truncate","getChecksum","db","checksumRow","sync","frdb","fixture_remote","table","Name","console","log","chalk","magenta","remoteChecksum","localChecksum","startsWith","rows","length","blue","insert","Object","fromEntries","entries","key","value","Date","JSON","stringify","into","destroy","importFixture","entityId","ids","queries","wdb","query","rsh","clear","_","uniq","id","getImportQueries","flat","BaseModel","getDB","info","field","recordKey","entity","fixtureDatabase","realDatabase","selfQuery","args","relQueries","has","add","EntityManager","where","limit","undefined","relations","relation","isBelongsToOneRelationProp","isOneToOneRelationProp","customJoinClause","hasJoinColumn","relatedEntity","with","relatedIdColumnName","props","find","p","isRelationProp","name","arg","reverse","getFixtures","sourceDBName","targetDBName","searchOptions","sourceDB","targetDB","searchType","column","fixtures","fixture","record","uniqueRow","prop","type","initialRecordsLength","newRecords","currentFixtureRecord","createFixtureRecord","push","r","fixtureId","fetchedRecords","slice","first","singleRecord","_db","target","checkUniqueViolation","unique","uniqBy","f","options","records","visitedEntities","create","throughTable","fromColumn","toColumn","relatedIds","relatedProp","relatedRow","relatedId","columns","belongsRecords","isVirtualProp","isManyToManyRelationProp","joinTable","inflection","singularize","pluck","isHasManyRelationProp","joinColumn","insertFixtures","dbName","_fixtures","insertionOrder","buildGraph","getInsertionOrder","result","insertFixture","yellow","forEach","values","handleManyToManyRelations","data","prepareInsertData","insertData","propName","uniqueFound","found","q","err","override","onDuplicateUpdate","apply","keys","newIds","green","addFixtureLoader","code","path","content","fixtureLoaderStart","fixtureLoaderEnd","newContent","apiRootPath","readFileSync","toString","indexOf","writeFileSync","_uniqueIndexes","uniqueIndexes","uniqueQuery","indexes","i","index","every","containsNull","some","orWhere","qb","Array","isArray","whereIn","andWhere"],"mappings":"mPA0tBaA,wBAAAA,oBAjsBAC,6BAAAA,gFAzBK,oEACJ,4BACS,qCACO,+CAavB,gFAEgB,+BACqB,iCACd,6EACH,gCACD,i5MAGnB,IAAA,AAAMA,iCAAN,iCAAMA,6CAAAA,qBACX,sBAAQC,OAAoB,MAW5B,sBAAQC,OAAoB,MAU5BC,sBAAAA,mBAAoC,MAEpC,sBAAQC,gBAAgB,IAAIC,4BAAa,EAoKzC,sBAAQC,iBAAiB,IAAIC,mBA5LlBP,sBAEPQ,IAAAA,UAGJ,eACE,GAAI,IAAI,CAACP,IAAI,GAAK,KAAM,CACtB,MAAM,IAAIQ,MAAM,0CAClB,CACA,OAAO,IAAI,CAACR,IAAI,AAClB,MARA,aAAQO,GAAS,EACf,IAAI,CAACP,IAAI,CAAGO,GACd,IASIE,IAAAA,UAGJ,eACE,GAAI,IAAI,CAACR,IAAI,GAAK,KAAM,CACtB,MAAM,IAAIO,MAAM,0CAClB,CACA,OAAO,IAAI,CAACP,IAAI,AAClB,MARA,aAAQQ,GAAS,EACf,IAAI,CAACR,IAAI,CAAGQ,GACd,IAWAC,IAAAA,aAAAA,SAAAA,OACE,GAAI,IAAI,CAACV,IAAI,GAAK,KAAM,CACtB,MACF,CACA,GAAIW,WAAM,CAACC,QAAQ,CAACC,IAAI,EAAIF,WAAM,CAACC,QAAQ,CAACE,iBAAiB,CAAE,CAC7D,IAAMC,MAAQJ,WAAM,CAACC,QAAQ,CAACC,IAAI,CAACG,UAAU,CAG7C,IAAMC,MAAQN,WAAM,CAACC,QAAQ,CAACE,iBAAiB,CAC5CE,UAAU,KAERD,YAA6BA,YAG7BE,YAA6BA,YAJlC,GACE,AAAC,GAA+BF,OAA7BA,CAAAA,YAAAA,MAAMG,IAAI,UAAVH,qBAAAA,YAAc,YAAY,KAC3BA,OAD8BA,CAAAA,YAAAA,MAAMI,IAAI,UAAVJ,qBAAAA,YAAc,KAAK,KAElD,OADCA,MAAMK,QAAQ,IAEhB,AAAC,GAA+BH,OAA7BA,CAAAA,YAAAA,MAAMC,IAAI,UAAVD,qBAAAA,YAAc,YAAY,KAAyBA,OAAtBA,CAAAA,YAAAA,MAAME,IAAI,UAAVF,qBAAAA,YAAc,KAAK,KAAkB,OAAfA,MAAMG,QAAQ,EACpE,CACA,MAAM,IAAIZ,MACR,sCAEJ,CACF,CAEA,IAAI,CAACD,GAAG,CAAGc,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACC,IAAI,CACpC,CAAA,IAAI,CAACJ,GAAG,CAAGY,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACU,aAAa,CAC/C,IAEMC,IAAAA,qBAAN,SAAMA,aAAaC,WAAsB,kDACjCC,WAmBAC,aAGoB,KAAnBC,gBAGmB,MAAnBC,gBAKDC,aAGAC,aAKAC,gGAtCuB,SAAM,AAAC,qDAQjB,KAAVC,OAGDP,kFAVN,GAAID,YAAa,CACf,SAAOA,YACT,CACA,GAAI,IAAI,CAACtB,gBAAgB,CAAE,CACzB,SAAO,IAAI,CAACA,gBAAgB,CAC9B,CAEiB,SAAM,IAAI,CAACK,GAAG,CAAC0B,GAAG,CACjC,+EADe,oCAAA,kBAAVD,OAAU,QAGXP,WAAaO,OAAOE,GAAG,CAC3B,SAACC,kBAAgCA,SAAS,CAAC,OAAO,EAEpD,CAAA,IAAI,CAACjC,gBAAgB,CAAGuB,WACxB,SAAOA,cACT,0BAhBMA,WAAuB,cAmBvBC,aAAeD,WAAWW,IAAI,CAAC,MAGX,SAAM,IAAI,CAAC3B,GAAG,CAACwB,GAAG,CAE1C,AAAC,kBAA8B,OAAbP,uBAFM,oCAAA,kBAAnBC,gBAAmB,QAGA,SAAM,IAAI,CAACpB,GAAG,CAAC0B,GAAG,CAE1C,AAAC,kBAA8B,OAAbP,uBAFM,qCAAA,kBAAnBE,gBAAmB,SAKpBC,aAAe,IAAIQ,IACvBV,gBAAgBO,GAAG,CAAC,SAACI,WAAQ,CAACA,IAAIC,KAAK,CAACC,KAAK,CAAC,KAAKC,GAAG,GAAKH,IAAII,QAAQ,CAAC,IAEpEZ,aAAe,IAAIO,IACvBT,gBAAgBM,GAAG,CAAC,SAACI,WAAQ,CAACA,IAAIC,KAAK,CAACC,KAAK,CAAC,KAAKC,GAAG,GAAKH,IAAII,QAAQ,CAAC,IAIpEX,cAAgBN,WAAWkB,MAAM,CACrC,SAACC,kBAAcf,aAAagB,GAAG,CAACD,aAAed,aAAae,GAAG,CAACD,aAIlE,SAAM,IAAI,CAACrC,GAAG,CAACuC,WAAW,CAAC,SAAOC,kHAChC,SAAMA,IAAId,GAAG,CAAC,sCAAd,cAEA,SAAMe,QAAQC,GAAG,CACflB,cAAcG,GAAG,CAAC,SAAOU,qDAGjBM,gFAFN,SAAMH,IAAId,GAAG,CAAC,sCAAd,cACA,SAAMc,IAAIH,WAAWO,QAAQ,WAA7B,cACMD,SAAW,AAAC,eAEdN,OADF,AAACjC,WAAM,CAACC,QAAQ,CAACC,IAAI,CAACG,UAAU,CAA2BI,QAAQ,CACpE,KAED,OAFIwB,UAAU,4BAIZA,OAFF,AAACjC,WAAM,CAACC,QAAQ,CAACU,aAAa,CAACN,UAAU,CACtCI,QAAQ,CACZ,KAAa,OAAVwB,WACF,SAAMG,IAAId,GAAG,CAACiB,kBAAd,0BACF,gBAZF,cAcA,SAAMH,IAAId,GAAG,CAAC,sCAAd,0BACF,eAlBA,0BAqBF,iBAEMmB,IAAAA,oBAAN,SAAMA,YAAYC,EAAQ,CAAET,SAAiB,4CACnB,WAAhBU,mFAAgB,SAAMD,GAAGpB,GAAG,CAAC,AAAC,kBAA2B,OAAVW,oBAA/B,oCAAA,yCAAA,WAAhBU,qBACR,SAAOA,YAAYZ,QAAQ,IAC7B,QAEMa,IAAAA,aAAN,SAAMA,uDACEC,KAEW,KAAVxB,OAGDP,6FALA+B,KAAOnC,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAAC6C,cAAc,EAE/B,SAAM,IAAI,CAAChD,GAAG,CAACwB,GAAG,CACjC,sDADe,oCAAA,kBAAVD,OAAU,QAGXP,WAAuBO,OAAOE,GAAG,CACrC,SAACwB,cAAeA,MAAMC,IAAI,GAG5BC,QAAQC,GAAG,CAACC,cAAK,CAACC,OAAO,CAAC,YAC1B,SAAMf,QAAQC,GAAG,CACfxB,WAAWS,GAAG,CAAC,SAAOU,qDAKdoB,eACAC,qFALN,GAAIrB,UAAUsB,UAAU,CAAC,mBAAoB,CAC3C,SACF,CAEuB,SAAM,IAAI,CAACd,WAAW,CAACI,KAAMZ,mBAA9CoB,eAAiB,cACD,SAAM,IAAI,CAACZ,WAAW,CAAC,IAAI,CAAC3C,GAAG,CAAEmC,mBAAjDqB,cAAgB,kBAElBD,CAAAA,iBAAmBC,aAAY,EAA/BD,YACF,SAAM,IAAI,CAACvD,GAAG,CAACqC,WAAW,CAAC,SAAOA,uDAI1BqB,4EAHN,SAAMrB,YAAYb,GAAG,CAAC,sCAAtB,cACA,SAAMa,YAAYF,WAAWO,QAAQ,WAArC,cAEa,SAAMK,KAAKZ,mBAAlBuB,KAAO,cACb,GAAIA,KAAKC,MAAM,GAAK,EAAG,CACrB,SACF,CAEAR,QAAQC,GAAG,CAACC,cAAK,CAACO,IAAI,CAACzB,WAAYuB,KAAKC,MAAM,EAC9C,SAAMtB,YACHwB,MAAM,CACLH,KAAKjC,GAAG,CAAC,SAACI,KACR,OAAOiC,OAAOC,WAAW,CACvBD,OAAOE,OAAO,CAACnC,KAAKJ,GAAG,CAAC,qDAAEwC,cAAKC,gBAC7B,GAAIA,QAAU,KAAM,CAClB,MAAO,CAACD,IAAK,KAAK,AACpB,MAAO,GAAI,OAAOC,QAAU,UAAW,CACrC,MAAO,CAACD,IAAKC,MAAQ,EAAI,EAAE,AAC7B,MAAO,GACL,CAAA,OAAOA,gCAAP,SAAOA,MAAI,IAAM,UACjB,CAAEA,AAAK,YAALA,MAAiBC,MACnB,CACA,MAAO,CAACF,IAAKG,KAAKC,SAAS,CAACH,OAAO,AACrC,KAAO,CACL,MAAO,CAACD,IAAKC,MAAM,AACrB,CACF,GAEJ,IAEDI,IAAI,CAACnC,mBArBR,cAsBAgB,QAAQC,GAAG,CAAC,MACZ,SAAMf,YAAYb,GAAG,CAAC,sCAAtB,0BACF,eAlCA,gDAoCJ,0BA9CF,cAgDA2B,QAAQC,GAAG,CAACC,cAAK,CAACC,OAAO,CAAC,UAE1B,SAAMP,KAAKwB,OAAO,WAAlB,0BACF,iBAGMC,IAAAA,sBAAN,SAAMA,cAAcC,QAAgB,CAAEC,GAAa,kDAI3CC,UAUAC,IACD,0BAAA,kBAAA,eAAA,UAAA,MAAIC,MACO,KAAPC,0FAdT,IAAI,CAAClF,cAAc,CAACmF,KAAK,KAETC,eAAC,CAACC,IAAI,CAElB,SAAM1C,QAAQC,GAAG,CACfkC,IAAIjD,GAAG,CAAC,SAAOyD,iHACN,SAAM,IAAI,CAACC,gBAAgB,CAACV,SAAU,KAAMS,YAAnD,SAAO,iBACT,0BALAP,QAAUK,QAAAA,eAAC,EACf,AACE,cAKAI,IAAI,KAGFR,IAAMS,oBAAS,CAACC,KAAK,CAAC,KACvB,+BAAA,wBAAA,2EAAA,UAAaX,uDAAb,2BAAA,MAAA,oCAAIE,MAAJ,YACW,SAAMD,IAAIpD,GAAG,CAACqD,eAAd,oCAAA,kBAAPC,IAAO,QACd3B,QAAQC,GAAG,CAAC,CACVyB,MAAAA,MACAU,KAAMT,IAAIS,IAAI,AAChB,yBALG,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6CAOP,iBAEMJ,IAAAA,yBAAN,SAAMA,iBACJV,QAAgB,CAChBe,KAAa,CACbN,EAAU,kDAEJO,UASAC,OACAd,IAGQ,KAAP/C,IAMD8D,gBAEAC,aAGAC,UAEAC,KA0CAC,6FApEAN,UAAY,AAAC,GAAcD,OAAZf,SAAS,KAAYS,OAATM,MAAM,KAAM,OAAHN,IAG1C,GAAI,IAAI,CAACtF,cAAc,CAACoG,GAAG,CAACP,WAAY,CACtC,YACF,CACA,IAAI,CAAC7F,cAAc,CAACqG,GAAG,CAACR,WAExBtC,QAAQC,GAAG,CAAC,CAAEqB,SAAAA,SAAUe,MAAAA,MAAON,GAAAA,EAAG,GAC5BQ,OAASQ,4BAAa,CAAC9D,GAAG,CAACqC,UAC3BG,IAAMS,oBAAS,CAACC,KAAK,CAAC,KAGd,SAAMV,IAAIc,OAAOzC,KAAK,EAAEkD,KAAK,CAACX,MAAON,IAAIkB,KAAK,CAAC,WAA/C,oCAAA,kBAAPvE,IAAO,QACd,GAAIA,MAAQwE,UAAW,CACrB,MAAM,IAAItG,MAAM,AAAC,GAAcmF,OAAZT,SAAS,KAAM,OAAHS,GAAG,oBACpC,CAGMS,gBAAkB,AAACzF,WAAM,CAACC,QAAQ,CAAC6C,cAAc,CAACzC,UAAU,CAC/DI,QAAQ,CACLiF,aAAe,AAAC1F,WAAM,CAACC,QAAQ,CAACE,iBAAiB,CAACE,UAAU,CAC/DI,QAAQ,CAELkF,UAAY,AAAC,uBAA8CH,OAAvBC,gBAAgB,OAA0CC,OAAnCF,OAAOzC,KAAK,CAAC,sBAA0CyC,OAApBE,aAAa,OAAwCV,OAAjCQ,OAAOzC,KAAK,CAAC,mBAAuB,OAAHiC,GAAG,KAEtJY,KAAOhC,OAAOE,OAAO,CAAC0B,OAAOY,SAAS,EACzCpE,MAAM,CACL,qDAAIqE,yBACFC,GAAAA,iCAA0B,EAACD,WAC1BE,GAAAA,6BAAsB,EAACF,WACtBA,SAASG,gBAAgB,GAAKL,YAEnC5E,GAAG,CAAC,qDAAI8E,mBASP,IAAIf,QACJ,IAAIN,KACJ,GAAIuB,GAAAA,6BAAsB,EAACF,WAAa,CAACA,SAASI,aAAa,CAAE,KAEnCC,0BAD5B,IAAMA,cAAgBV,4BAAa,CAAC9D,GAAG,CAACmE,SAASM,IAAI,EACrD,IAAMC,qBAAsBF,0BAAAA,cAAcG,KAAK,CAACC,IAAI,CAClD,SAACC,SAAMC,GAAAA,qBAAc,EAACD,IAAMA,EAAEJ,IAAI,GAAKnB,OAAOR,EAAE,YADtB0B,0CAAAA,0BAEzBO,IAAI,CACP,GAAI,CAACL,oBAAqB,CACxB,MAAM,IAAI/G,MACR,AAAC,GAAuB2F,OAArBkB,cAAc1B,EAAE,CAAC,MAAc,OAAVQ,OAAOR,EAAE,CAAC,sBAEtC,CACAM,QAAQ,AAAC,GAAsB,OAApBsB,oBAAoB,OAC/B5B,KAAKrD,GAAG,CAAC,KAAK,AAChB,KAAO,CACL2D,QAAQ,KACRN,KAAKrD,GAAG,CAAC,AAAC,GAAgB,OAAd0E,SAASY,IAAI,CAAC,OAAK,AACjC,CACA,MAAO,CACL1C,SAAU8B,SAASM,IAAI,CACvBrB,MAAAA,QACAN,GAAAA,IACF,CACF,GACChD,MAAM,CAAC,SAACkF,YAAQA,IAAIlC,EAAE,GAAK,OAEX,SAAM3C,QAAQC,GAAG,CAClCsD,KAAKrE,GAAG,CAAC,SAAOqE,uFACd,SAAO,IAAI,CAACX,gBAAgB,CAACW,KAAKrB,QAAQ,CAAEqB,KAAKN,KAAK,CAAEM,KAAKZ,EAAE,IACjE,0BAHIa,WAAa,cAMnB,SAAO,AAAC,qBAAGf,eAAC,CAACC,IAAI,CAACc,WAAWsB,OAAO,GAAGjC,IAAI,aAAKS,eAClD,iBAEMtB,IAAAA,gBAAN,SAAMA,2HACA,IAAI,CAAChF,IAAI,CAAT,YACF,SAAM,IAAI,CAACA,IAAI,CAACgF,OAAO,WAAvB,aACA,CAAA,IAAI,CAAChF,IAAI,CAAG,+BAEV,IAAI,CAACC,IAAI,CAAT,YACF,SAAM,IAAI,CAACA,IAAI,CAAC+E,OAAO,WAAvB,aACA,CAAA,IAAI,CAAC/E,IAAI,CAAG,2BAEd,SAAM6F,oBAAS,CAACd,OAAO,WAAvB,0BACF,iBAEM+C,IAAAA,oBAAN,SAAMA,YACJC,YAAkC,CAClCC,YAAkC,CAClCC,aAAmC,4CAQjC/B,mBANIgC,SACAC,SACElD,SAAUe,MAAOtB,MAAO0D,WAE1BlC,OACAmC,OAKFhD,MAOEnB,KAKAoE,SACD,0BAAA,kBAAA,2BAAA,UAAA,gGAiBYC,QACTrC,QAGA7D,IAEa,KAAVmG,OASHC,UAMa,MAAVD,oFA7DLN,SAAW9G,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACoH,aAAa,EAC7CI,SAAW/G,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACqH,aAAa,EAC3C/C,SAAuCgD,cAAvChD,SAAUe,MAA6BiC,cAA7BjC,MAAOtB,MAAsBuD,cAAtBvD,MAAO0D,WAAeH,cAAfG,WAE1BlC,OAASQ,4BAAa,CAAC9D,GAAG,CAACqC,UAC3BoD,OACJnC,EAAAA,mBAAAA,OAAOqB,KAAK,CAACC,IAAI,CAAC,SAACkB,aAASA,KAAKf,IAAI,GAAK3B,iBAA1CE,mCAAAA,mBAAkDyC,IAAI,IAAK,WACvD,AAAC,GAAQ,OAAN3C,MAAM,OACTA,MAEFX,MAAQ6C,SAAShC,OAAOzC,KAAK,EACjC,GAAI2E,aAAe,SAAU,CAC3B/C,MAAQA,MAAMsB,KAAK,CAAC0B,OAAQ3D,MAC9B,MAAO,GAAI0D,aAAe,OAAQ,CAChC/C,MAAQA,MAAMsB,KAAK,CAAC0B,OAAQ,OAAQ,AAAC,IAAS,OAAN3D,MAAM,KAChD,CAEa,SAAMW,cAAbnB,KAAO,cACb,GAAIA,KAAKC,MAAM,GAAK,EAAG,CACrB,MAAM,IAAI5D,MAAM,mBAClB,CAEM+H,YACD,+BAAA,wBAAA,gGAAMjG,IAGTiG,UAFMM,qBACAC,WAEAC,4FAJGzG,IAAN,YACGuG,qBAAuBN,SAASnE,MAAM,CACzB,SAAM,MAAK4E,mBAAmB,CAAC7C,OAAQ7D,aAApDwG,WAAa,cACnBP,CAAAA,UAAAA,UAASU,IAAI,OAAbV,UAAc,qBAAGO,aACXC,qBAAuBR,SAASd,IAAI,CACxC,SAACyB,UAAMA,EAAEC,SAAS,GAAK,AAAC,GAAc7G,OAAZ4C,SAAS,KAAU,OAAP5C,IAAIqD,EAAE,IAG9C,GAAIoD,qBAAsB,CAExBA,qBAAqBK,cAAc,CAAGb,SACnC5F,MAAM,CAAC,SAACuG,UAAMA,EAAEC,SAAS,GAAKJ,qBAAqBI,SAAS,GAC5DE,KAAK,CAACR,sBACN3G,GAAG,CAAC,SAACgH,UAAMA,EAAEC,SAAS,EAC3B,aACF,EAfK,UAAahF,oDAAb,2BAAA,MAAA,wHAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6KAiBuBoE,oKAAXC,eACTrC,QAASQ,4BAAa,CAAC9D,GAAG,CAAC2F,QAAQtD,QAAQ,EAGrC,SAAMkD,SAASjC,QAAOzC,KAAK,EAAEkD,KAAK,CAAC,KAAM4B,QAAQ7C,EAAE,EAAE2D,KAAK,YAAhEhH,IAAM,kBACRA,IAAAA,aACe,SAAM,IAAI,CAAC0G,mBAAmB,CAAC7C,QAAQ7D,IAAK,CAC3DiH,aAAc,KACdC,IAAKpB,QACP,YAHiB,oCAAA,kBAAVK,OAAU,OAIjBD,CAAAA,QAAQiB,MAAM,CAAGhB,OACjB,qBAIgB,SAAM,IAAI,CAACiB,oBAAoB,CAC/CtB,SACAjC,QACAqC,kBAHIE,UAAY,kBAKdA,UAAAA,aACe,SAAM,IAAI,CAACM,mBAAmB,CAAC7C,QAAQuC,UAAW,CACjEa,aAAc,KACdC,IAAKpB,QACP,YAHiB,qCAAA,kBAAVK,QAAU,QAIjBD,CAAAA,QAAQmB,MAAM,CAAGlB,qdAIrB,SAAOhD,eAAC,CAACmE,MAAM,CAACrB,SAAU,SAACsB,UAAMA,EAAEV,SAAS,MAC9C,iBAEMH,IAAAA,4BAAN,SAAMA,oBACJ7C,MAAc,CACd7D,GAAQ,CACRwH,OAGC,4CAEKC,QACAC,gBAEAC,8EAHAF,WACAC,gBAAkB,IAAI1J,IAEtB2J,OAAS,SAAO9D,OAAgB7D,+CAC9B6G,UAMAV,OASD,0BAAA,kBAAA,eAAA,UAAA,MAAME,KAUEmB,aAALzG,GAEEgE,cACA6C,aACAC,WACAC,SAEAC,WAKAhD,eACAgD,YAKAhD,eACAiD,YAIEC,WAMFC,UAMEnD,eACAkD,uFA7DNpB,UAAY,AAAC,GAAe7G,OAAb6D,OAAOR,EAAE,CAAC,KAAU,OAAPrD,IAAIqD,EAAE,EACxC,GAAIqE,gBAAgBvD,GAAG,CAAC0C,WAAY,CAClC,SACF,CACAa,gBAAgBtD,GAAG,CAACyC,WAEdV,OAAwB,CAC5BU,UAAAA,UACAjE,SAAUiB,OAAOR,EAAE,CACnBA,GAAIrD,IAAIqD,EAAE,CACV8E,QAAS,CAAC,EACVrB,cAAc,IACdsB,cAAc,GAChB,EAEK,+BAAA,wBAAA,8EAAA,UAAcvE,OAAOqB,KAAK,gDAA1B,2BAAA,MAAA,qCAAMmB,KAAN,YACH,GAAIgC,GAAAA,oBAAa,EAAChC,MAAO,CACvB,YACF,CAEAF,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAAG,CAC1Be,KAAMA,KACNhE,MAAOrC,GAAG,CAACqG,KAAKf,IAAI,CAAC,AACvB,EAEMvE,GAAKyG,CAAAA,aAAAA,gBAAAA,wBAAAA,QAASN,GAAG,UAAZM,sBAAAA,aAAgBhE,oBAAS,CAACC,KAAK,CAAC,SACvC6E,GAAAA,+BAAwB,EAACjC,MAAzBiC,YACIvD,cAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC3C4C,aAAevB,KAAKkC,SAAS,CAC7BV,WAAa,AAAC,GAAuC,OAArCW,mBAAU,CAACC,WAAW,CAAC5E,OAAOzC,KAAK,EAAE,OACrD0G,SAAW,AAAC,GAA8C,OAA5CU,mBAAU,CAACC,WAAW,CAAC1D,cAAc3D,KAAK,EAAE,OAE7C,SAAML,GAAG6G,cACzBtD,KAAK,CAACuD,WAAY7H,IAAIqD,EAAE,EACxBqF,KAAK,CAACZ,kBAFHC,WAAa,aAGnB5B,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG0F,mCACzBY,GAAAA,4BAAqB,EAACtC,MAAtBsC,YACH5D,eAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC9B,SAAMjE,GAAGgE,eAAc3D,KAAK,EAC5CkD,KAAK,CAAC+B,KAAKuC,UAAU,CAAE5I,IAAIqD,EAAE,EAC7BqF,KAAK,CAAC,cAFHX,YAAa,aAGnB5B,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG0F,oCACzBnD,CAAAA,GAAAA,6BAAsB,EAACyB,OAAS,CAACA,KAAKvB,aAAa,AAAD,EAAlDF,YACHG,eAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC3CgD,YAAcjD,eAAcG,KAAK,CAACC,IAAI,CAC1C,SAACC,SAAMC,GAAAA,qBAAc,EAACD,IAAMA,EAAEJ,IAAI,GAAKnB,OAAOR,EAAE,OAE9C2E,YAAAA,YACiB,SAAMjH,GAAGgE,eAAc3D,KAAK,EAC5CkD,KAAK,CAAC,KAAMtE,IAAIqD,EAAE,EAClB2D,KAAK,WAFFiB,WAAa,aAGnB9B,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG4F,mBAAAA,2BAAAA,WAAY5E,EAAE,+CAEzCgC,GAAAA,qBAAc,EAACgB,MAAfhB,aACH6C,UAAYlI,GAAG,CAAC,AAAC,GAAY,OAAVqG,KAAKf,IAAI,CAAC,OAAK,AACxCa,CAAAA,OAAOgC,OAAO,CAAC9B,KAAKf,IAAI,CAAC,CAACjD,KAAK,CAAG6F,UAClC,GAAIA,UAAW,CACb/B,OAAOiC,cAAc,CAACzB,IAAI,CAAC,AAAC,GAAeuB,OAAb7B,KAAKrB,IAAI,CAAC,KAAa,OAAVkD,WAC7C,KACI,CAAA,EAACV,gBAAAA,wBAAAA,QAASP,YAAY,GAAIiB,SAAQ,EAAlC,aACInD,eAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EAC9B,SAAMjE,GAAGgE,eAAc3D,KAAK,EAC5CkD,KAAK,CAAC,KAAM4D,WACZlB,KAAK,YAFFiB,YAAa,kBAGfA,YAAAA,aACF,SAAMN,OAAO5C,eAAekD,sBAA5B,sCAlDH,0FAAA,uBAAA,gDAAA,2BAAA,wBAAA,+BAAA,yBAAA,kCAwDLR,QAAQd,IAAI,CAACR,oBACf,MAEA,SAAMwB,OAAO9D,OAAQ7D,aAArB,cAEA,SAAOyH,WACT,QAEMoB,IAAAA,uBAAN,SAAMA,eACJC,MAA4B,CAC5BC,SAA0B,kDAEpB9C,SAGA+C,eACAjI,GAqCA0G,0FAEWb,EACT/C,OACAsC,8FA7CFF,SAAW9C,eAAC,CAACmE,MAAM,CAACyB,UAAW,SAACxB,UAAMA,EAAEV,SAAS,GAEvD,IAAI,CAAChJ,aAAa,CAACoL,UAAU,CAAChD,UACxB+C,eAAiB,IAAI,CAACnL,aAAa,CAACqL,iBAAiB,GACrDnI,GAAKhC,GAAAA,aAAI,EAACV,WAAM,CAACC,QAAQ,CAACwK,OAAO,EAEvC,SAAM/H,GAAGP,WAAW,CAAC,SAAOC,+CAGrB,0BAAA,kBAAA,2BAAA,UAAA,UAyBA,2BAAA,mBAAA,8BAAA,WAAA,kFA3BL,SAAMA,IAAId,GAAG,CAAC,sCAAd,cAEK,+BAAA,wBAAA,gGAAMkH,UACHX,QACAiD,8EAFGtC,UAAN,YACGX,QAAUD,SAASd,IAAI,CAAC,SAACoC,UAAMA,EAAEV,SAAS,GAAKA,YACtC,SAAM,MAAKuC,aAAa,CAAC3I,IAAYyF,iBAA9CiD,OAAS,cACf,GAAIA,OAAO9F,EAAE,GAAK6C,QAAQ7C,EAAE,CAAE,CAE5B/B,QAAQC,GAAG,CACTC,cAAK,CAAC6H,MAAM,CACV,AAAC,gCAAmDnD,OAApBA,QAAQtD,QAAQ,CAAC,KAAoBsD,OAAjBA,QAAQ7C,EAAE,CAAC,QAA0B8F,OAApBjD,QAAQtD,QAAQ,CAAC,KAAa,OAAVuG,OAAO9F,EAAE,IAGtG4C,SAASqD,OAAO,CAAC,SAAC/B,GAChBtF,OAAOsH,MAAM,CAAChC,EAAEY,OAAO,EAAEmB,OAAO,CAAC,SAACtD,QAChC,GACEA,OAAOK,IAAI,CAACC,IAAI,GAAK,YACrBN,OAAOK,IAAI,CAACrB,IAAI,GAAKmE,OAAOvG,QAAQ,EACpCoD,OAAO3D,KAAK,GAAK6D,QAAQ7C,EAAE,CAC3B,CACA2C,OAAO3D,KAAK,CAAG8G,OAAO9F,EAAE,AAC1B,CACF,EACF,EACA6C,CAAAA,QAAQ7C,EAAE,CAAG8F,OAAO9F,EAAE,AACxB,aACF,EAvBK,UAAmB2F,8DAAnB,2BAAA,MAAA,wHAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,iCAyBA,gCAAA,yBAAA,wGAAMnC,UACHX,+EADGW,UAAN,aACGX,QAAUD,SAASd,IAAI,CAAC,SAACoC,UAAMA,EAAEV,SAAS,GAAKA,YACrD,SAAM,OAAK2C,yBAAyB,CAAC/I,IAAYyF,QAASD,kBAA1D,0BACF,EAHK,WAAmB+C,gEAAnB,4BAAA,OAAA,+HAAA,4FAAA,wBAAA,iDAAA,4BAAA,yBAAA,gCAAA,0BAAA,mCAIL,SAAMvI,IAAId,GAAG,CAAC,uCAAd,0BACF,yBAjCA,cAmCM8H,gJAEgBxB,6JAALW,SACT/C,OAASQ,4BAAa,CAAC9D,GAAG,CAACqG,EAAEhE,QAAQ,EAC5B,SAAM7B,GAAG8C,OAAOzC,KAAK,EAAEkD,KAAK,CAAC,KAAMsC,EAAEvD,EAAE,EAAE2D,KAAK,WAAvDb,OAAS,cACfsB,QAAQd,IAAI,CAAC,CACX/D,SAAUgE,EAAEhE,QAAQ,CACpB6G,KAAMtD,MACR,mcAGF,SAAOhD,eAAC,CAACmE,MAAM,CAACG,QAAS,SAACb,SAAM,AAAC,GAAgBA,OAAdA,EAAEhE,QAAQ,CAAC,KAAa,OAAVgE,EAAE6C,IAAI,CAACpG,EAAE,OAC5D,iBAEQqG,IAAAA,0BAAR,SAAQA,kBAAkBxD,OAAsB,EAC9C,IAAMyD,WAAkB,CAAC,MACpB,+BAAA,wBAAA,6BAAL,QAAK,UAA4B1H,OAAOE,OAAO,CAAC+D,QAAQiC,OAAO,qBAA1D,QAAA,2BAAA,MAAA,wBAAA,+BAA6D,CAA7D,iCAAA,eAAOyB,wBAAU5D,sBACpB,GAAIqC,GAAAA,oBAAa,EAACrC,OAAOK,IAAI,EAAG,CAC9B,QACF,CAEA,IAAMA,KAAOL,OAAOK,IAAI,CACxB,GAAI,CAAChB,GAAAA,qBAAc,EAACgB,MAAO,CACzB,GAAIA,KAAKC,IAAI,GAAK,OAAQ,CACxBqD,UAAU,CAACC,SAAS,CAAGrH,KAAKC,SAAS,CAACwD,OAAO3D,KAAK,CACpD,KAAO,CACLsH,UAAU,CAACC,SAAS,CAAG5D,OAAO3D,KAAK,AACrC,CACF,MAAO,GACLsC,GAAAA,iCAA0B,EAAC0B,OAC1BzB,GAAAA,6BAAsB,EAACyB,OAASA,KAAKvB,aAAa,CACnD,CACA6E,UAAU,CAAC,AAAC,GAAW,OAATC,SAAS,OAAK,CAAG5D,OAAO3D,KAAK,AAC7C,CACF,aAlBK,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBAmBL,OAAOsH,UACT,IAEcP,IAAAA,sBAAd,SAAcA,cAAcrI,EAAQ,CAAEmF,OAAsB,4CACpDyD,WACA9F,OAGEgG,YAQAC,MAQAC,EAMCC,2EA1BHL,WAAa,IAAI,CAACD,iBAAiB,CAACxD,SACpCrC,OAASQ,4BAAa,CAAC9D,GAAG,CAAC2F,QAAQtD,QAAQ,mDAG3B,SAAM,IAAI,CAACwE,oBAAoB,CAACrG,GAAI8C,OAAQqC,iBAA1D2D,YAAc,cACpB,GAAIA,YAAa,CACf,SAAO,CACLjH,SAAUsD,QAAQtD,QAAQ,CAC1BS,GAAIwG,YAAYxG,EAAE,AACpB,EACF,CAEc,SAAMtC,GAAG8C,OAAOzC,KAAK,EAAEkD,KAAK,CAAC,KAAM4B,QAAQ7C,EAAE,EAAE2D,KAAK,WAA5D8C,MAAQ,cACd,GAAIA,OAAS,CAAC5D,QAAQ+D,QAAQ,CAAE,CAC9B,SAAO,CACLrH,SAAUsD,QAAQtD,QAAQ,CAC1BS,GAAIyG,MAAMzG,EAAE,AACd,EACF,CAEM0G,EAAIhJ,GAAGiB,MAAM,CAAC2H,YAAYlH,IAAI,CAACoB,OAAOzC,KAAK,EACjD,SAAM2I,EAAEG,iBAAiB,CAACC,KAAK,CAACJ,EAAG9H,OAAOmI,IAAI,CAACT,qBAA/C,cACA,SAAO,CACL/G,SAAUsD,QAAQtD,QAAQ,CAC1BS,GAAI6C,QAAQ7C,EAAE,AAChB,UACO2G,kBACP1I,QAAQC,GAAG,CAACyI,IACZ,OAAMA,uBAEV,iBAEcR,IAAAA,kCAAd,SAAcA,0BACZzI,EAAQ,CACRmF,OAAsB,CACtBD,QAAyB,4CAEpB,0BAAA,kBAAA,qBAAA,UAAA,iFAAA,+BAAA,wBAAA,4GAASD,OACNK,KAEEkC,UACAR,WAED,0BAAA,kBAAA,qBAAA,UAAA,+GANJ,eAAS/B,sBACNK,KAAOL,OAAOK,IAAI,KACpBiC,GAAAA,+BAAwB,EAACjC,MAAzBiC,YACIC,UAAY,AAAClC,KAAgCkC,SAAS,CACtDR,WAAa/B,OAAO3D,KAAK,CAE1B,+BAAA,wBAAA,gGAAM6F,UAOHrE,OACAkB,cAQG,KADO,KAAT+E,MAUmC,MAApCO,8EAzBGnC,UAAN,aACH,GACE,CAACjC,SAASd,IAAI,CAAC,SAACoC,UAAMA,EAAEV,SAAS,GAAK,AAAC,GAAeqB,OAAb7B,KAAKrB,IAAI,CAAC,KAAa,OAAVkD,aACtD,CACA,SAAA,WACF,CAEMrE,OAASQ,4BAAa,CAAC9D,GAAG,CAAC2F,QAAQtD,QAAQ,EAC3CmC,cAAgBV,4BAAa,CAAC9D,GAAG,CAAC8F,KAAKrB,IAAI,EACjD,GAAI,CAACnB,QAAU,CAACkB,cAAe,CAC7B,MAAM,IAAI7G,MACR,AAAC,qBAAyCmI,OAArBH,QAAQtD,QAAQ,CAAC,MAAc,OAAVyD,KAAKrB,IAAI,EAEvD,CAEgB,SAAMjE,GAAGwH,WACtBjE,KAAK,EAAC,QACL,iBADK,KACJ,AAAC,GAAuC,OAArCkE,mBAAU,CAACC,WAAW,CAAC5E,OAAOzC,KAAK,EAAE,OAAO8E,QAAQ7C,EAAE,EAC1D,iBAFK,KAEJ,AAAC,GAA8C,OAA5CmF,mBAAU,CAACC,WAAW,CAAC1D,cAAc3D,KAAK,EAAE,OAAO8G,WAFlD,OAIN3D,KAAK,CAAC,WALO,oCAAA,kBAATuF,MAAS,QAMhB,GAAIA,MAAO,CACT,SAAA,WACF,CAEe,SAAM/I,GAAGwH,WAAWvG,MAAM,EAAC,SACxC,iBADwC,MACvC,AAAC,GAAuC,OAArCwG,mBAAU,CAACC,WAAW,CAAC5E,OAAOzC,KAAK,EAAE,OAAO8E,QAAQ7C,EAAE,EAC1D,iBAFwC,MAEvC,AAAC,GAA8C,OAA5CmF,mBAAU,CAACC,WAAW,CAAC1D,cAAc3D,KAAK,EAAE,OAAO8G,WAFf,gBAApCmC,OAAS,cAIf/I,QAAQC,GAAG,CACTC,cAAK,CAAC8I,KAAK,CACT,AAAC,iBAA8BzG,OAAd0E,UAAU,MAAoBrC,OAAhBrC,OAAOzC,KAAK,CAAC,KAAoB2D,OAAjBmB,QAAQ7C,EAAE,CAAC,QAA6B6E,OAAvBnD,cAAc3D,KAAK,CAAC,KAAqBiJ,OAAlBnC,UAAU,UAAe,OAAPmC,sBAG/G,EAlCK,UAAmBtC,0DAAnB,2BAAA,OAAA,6GAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6CAoCT,EA1CK,UAAoB9F,OAAOE,OAAO,CAAC+D,QAAQiC,OAAO,iDAAlD,2BAAA,MAAA,6GAAA,uFAAA,uBAAA,8CAAA,2BAAA,wBAAA,+BAAA,yBAAA,6CA2CP,QAEMoC,IAAAA,yBAAN,SAAMA,iBAAiBC,IAAY,4CAC3BC,KACFC,QAEEC,mBACAC,iBAGEC,sDAPFJ,KAAOpM,WAAM,CAACyM,WAAW,CAAG,0BAC9BJ,QAAUK,GAAAA,gBAAY,EAACN,MAAMO,QAAQ,GAEnCL,mBAAqBD,QAAQO,OAAO,CAAC,2BACrCL,iBAAmBF,QAAQO,OAAO,CAAC,KAAMN,oBAE/C,GAAIA,qBAAuB,CAAC,GAAKC,mBAAqB,CAAC,EAAG,CAClDC,WACJH,QAAQ3D,KAAK,CAAC,EAAG6D,kBACjB,KACAJ,KACA,KACAE,QAAQ3D,KAAK,CAAC6D,kBAEhBM,GAAAA,iBAAa,EAACT,KAAMI,WACtB,KAAO,CACL,MAAM,IAAI3M,MAAM,6CAClB,YACF,QAGckJ,IAAAA,6BAAd,SAAcA,qBACZrG,EAAQ,CACR8C,MAAc,CACdqC,OAAsB,4CAEhBiF,eAGAC,cAOFC,YACC,0BAAA,kBAAA,qBAAA,UAAA,MAsBiB,KAAfxB,mFAjCDsB,eAAiBtH,OAAOyH,OAAO,CAACjL,MAAM,CAAC,SAACkL,UAAMA,EAAEjF,IAAI,GAAK,WAGzD8E,cAAgBD,eAAe9K,MAAM,CAAC,SAACmL,cAC3CA,MAAMrD,OAAO,CAACsD,KAAK,CAAC,SAACzF,cAAW,CAACA,OAAOpE,UAAU,CAAC,AAAC,GAAe,OAAbiC,OAAOzC,KAAK,CAAC,WAErE,GAAIgK,cAActJ,MAAM,GAAK,EAAG,CAC9B,SAAO,KACT,CAEIuJ,YAActK,GAAG8C,OAAOzC,KAAK,EAC5B,+BAAA,wBAAA,8CAAA,IAAMoK,MAAN,YAEH,IAAME,aAAeF,MAAMrD,OAAO,CAACwD,IAAI,CAAC,SAAC3F,QACvC,IAAMrC,MAAQqC,OAAO9F,KAAK,CAAC,MAAM,CAAC,EAAE,CACpC,OAAOgG,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,GAAK,IAC1C,GACA,GAAIqJ,aAAc,CAChB,MAAA,UACF,CAEAL,YAAcA,YAAYO,OAAO,CAAC,SAACC,QAC5B,+BAAA,wBAAA,6BAAL,QAAK,UAAgBL,MAAMrD,OAAO,oBAA7B,QAAA,2BAAA,MAAA,wBAAA,+BAA+B,CAA/B,IAAMnC,OAAN,YACH,IAAMrC,MAAQqC,OAAO9F,KAAK,CAAC,MAAM,CAAC,EAAE,CAEpC,GAAI4L,MAAMC,OAAO,CAAC7F,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,EAAG,CAC/CwJ,GAAGG,OAAO,CAAChG,OAAQE,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,CACjD,KAAO,CACLwJ,GAAGI,QAAQ,CAACjG,OAAQE,QAAQiC,OAAO,CAACxE,MAAM,CAACtB,KAAK,CAClD,CACF,aARK,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBASP,EACF,EArBA,IAAK,UAAe+I,mCAAf,2BAAA,MAAA,wBAAA,kDAAA,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBAsBiB,SAAMC,oBAAN,oCAAA,kBAAfxB,YAAe,QACtB,SAAOA,eACT,gBA/rBWpM,uBAisBN,IAAMD,eAAiB,IAAIC"}
1
+ {"version":3,"sources":["../../src/testing/fixture-manager.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport _ from \"lodash\";\nimport { Sonamu } from \"../api\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport {\n EntityProp,\n FixtureImportResult,\n FixtureRecord,\n FixtureSearchOptions,\n ManyToManyRelationProp,\n isBelongsToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n isOneToOneRelationProp,\n isRelationProp,\n isVirtualProp,\n} from \"../types/types\";\nimport { Entity } from \"../entity/entity\";\nimport inflection from \"inflection\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { RelationGraph } from \"./_relation-graph\";\nimport knex, { Knex } from \"knex\";\nimport { BaseModel } from \"../database/base-model\";\nimport { SonamuDBConfig } from \"../database/db\";\n\nexport class FixtureManagerClass {\n private _tdb: Knex | null = null;\n set tdb(tdb: Knex) {\n this._tdb = tdb;\n }\n get tdb(): Knex {\n if (this._tdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._tdb;\n }\n\n private _fdb: Knex | null = null;\n set fdb(fdb: Knex) {\n this._fdb = fdb;\n }\n get fdb(): Knex {\n if (this._fdb === null) {\n throw new Error(\"FixtureManager has not been initialized\");\n }\n return this._fdb;\n }\n cachedTableNames: string[] | null = null;\n\n private relationGraph = new RelationGraph();\n\n init() {\n if (this._tdb !== null) {\n return;\n }\n if (Sonamu.dbConfig.test && Sonamu.dbConfig.production_master) {\n const tConn = Sonamu.dbConfig.test.connection as Knex.ConnectionConfig & {\n port?: number;\n };\n const pConn = Sonamu.dbConfig.production_master\n .connection as Knex.ConnectionConfig & { port?: number };\n if (\n `${tConn.host ?? \"localhost\"}:${tConn.port ?? 3306}/${\n tConn.database\n }` ===\n `${pConn.host ?? \"localhost\"}:${pConn.port ?? 3306}/${pConn.database}`\n ) {\n throw new Error(\n `테스트DB와 프로덕션DB에 동일한 데이터베이스가 사용되었습니다.`\n );\n }\n }\n\n this.tdb = knex(Sonamu.dbConfig.test);\n this.fdb = knex(Sonamu.dbConfig.fixture_local);\n }\n\n async cleanAndSeed(usingTables?: string[]) {\n const tableNames: string[] = await (async () => {\n if (usingTables) {\n return usingTables;\n }\n if (this.cachedTableNames) {\n return this.cachedTableNames;\n }\n\n const [tables] = await this.tdb.raw(\n `SHOW TABLE STATUS WHERE Engine IS NOT NULL AND Name != 'migrations'`\n );\n const tableNames = tables.map(\n (tableInfo: { Name: string }) => tableInfo[\"Name\"]\n );\n this.cachedTableNames = tableNames;\n return tableNames;\n })();\n\n // migrations 제외한 테이블 목록\n const tableListStr = tableNames.join(\", \");\n\n // 한 번에 모든 테이블 체크섬 확인\n const [fdbChecksumRows] = await this.fdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n const [tdbChecksumRows] = await this.tdb.raw<\n [{ Table: string; Checksum: number }[]]\n >(`CHECKSUM TABLE ${tableListStr}`);\n\n // 체크섬 맵 생성\n const fdbChecksums = new Map(\n fdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n const tdbChecksums = new Map(\n tdbChecksumRows.map((row) => [row.Table.split(\".\").pop()!, row.Checksum])\n );\n\n // 변경된 테이블들만 처리\n const changedTables = tableNames.filter(\n (tableName) => fdbChecksums.get(tableName) !== tdbChecksums.get(tableName)\n );\n\n // 병렬로 truncate + insert 실행\n await this.tdb.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n await Promise.all(\n changedTables.map(async (tableName) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await trx(tableName).truncate();\n const rawQuery = `INSERT INTO ${\n (Sonamu.dbConfig.test.connection as Knex.ConnectionConfig).database\n }.${tableName}\n SELECT * FROM ${\n (Sonamu.dbConfig.fixture_local.connection as Knex.ConnectionConfig)\n .database\n }.${tableName}`;\n await trx.raw(rawQuery);\n })\n );\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n // console.timeEnd(\"FIXTURE-CleanAndSeed\");\n }\n\n async getChecksum(db: Knex, tableName: string) {\n const [[checksumRow]] = await db.raw(`CHECKSUM TABLE ${tableName}`);\n return checksumRow.Checksum;\n }\n\n async sync() {\n const frdb = knex(Sonamu.dbConfig.fixture_remote);\n\n const [tables] = await this.fdb.raw(\n \"SHOW TABLE STATUS WHERE Engine IS NOT NULL\"\n );\n const tableNames: string[] = tables.map(\n (table: any) => table.Name as string\n );\n\n console.log(chalk.magenta(\"SYNC...\"));\n await Promise.all(\n tableNames.map(async (tableName) => {\n if (tableName.startsWith(\"knex_migrations\")) {\n return;\n }\n\n const remoteChecksum = await this.getChecksum(frdb, tableName);\n const localChecksum = await this.getChecksum(this.fdb, tableName);\n\n if (remoteChecksum !== localChecksum) {\n await this.fdb.transaction(async (transaction) => {\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n await transaction(tableName).truncate();\n\n const rows = await frdb(tableName);\n if (rows.length === 0) {\n return;\n }\n\n console.log(chalk.blue(tableName), rows.length);\n await transaction\n .insert(\n rows.map((row: any) => {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => {\n if (value === null) {\n return [key, null];\n } else if (typeof value === \"boolean\") {\n return [key, value ? 1 : 0];\n } else if (\n typeof value === \"object\" &&\n !(value instanceof Date)\n ) {\n return [key, JSON.stringify(value)];\n } else {\n return [key, value];\n }\n })\n );\n })\n )\n .into(tableName);\n console.log(\"OK\");\n await transaction.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n }\n })\n );\n console.log(chalk.magenta(\"DONE!\"));\n\n await frdb.destroy();\n }\n\n private visitedRecords = new Set<string>();\n async importFixture(entityId: string, ids: number[]) {\n // 방문 기록 초기화 (새로운 import 작업 시작)\n this.visitedRecords.clear();\n\n const queries = _.uniq(\n (\n await Promise.all(\n ids.map(async (id) => {\n return await this.getImportQueries(entityId, \"id\", id);\n })\n )\n ).flat()\n );\n\n const wdb = BaseModel.getDB(\"w\");\n for (let query of queries) {\n const [rsh] = await wdb.raw(query);\n console.log({\n query,\n info: rsh.info,\n });\n }\n }\n\n async getImportQueries(\n entityId: string,\n field: string,\n id: number\n ): Promise<string[]> {\n const recordKey = `${entityId}#${field}#${id}`;\n\n // 순환 참조 방지: 이미 방문한 레코드는 스킵\n if (this.visitedRecords.has(recordKey)) {\n return [];\n }\n this.visitedRecords.add(recordKey);\n\n console.log({ entityId, field, id });\n const entity = EntityManager.get(entityId);\n const wdb = BaseModel.getDB(\"w\");\n\n // 여기서 실DB의 row 가져옴\n const [row] = await wdb(entity.table).where(field, id).limit(1);\n if (row === undefined) {\n throw new Error(`${entityId}#${id} row를 찾을 수 없습니다.`);\n }\n\n // 픽스쳐DB, 실DB\n const fixtureDatabase = (Sonamu.dbConfig.fixture_remote.connection as any)\n .database;\n const realDatabase = (Sonamu.dbConfig.production_master.connection as any)\n .database;\n\n const selfQuery = `INSERT IGNORE INTO \\`${fixtureDatabase}\\`.\\`${entity.table}\\` (SELECT * FROM \\`${realDatabase}\\`.\\`${entity.table}\\` WHERE \\`id\\` = ${id})`;\n\n const args = Object.entries(entity.relations)\n .filter(\n ([, relation]) =>\n isBelongsToOneRelationProp(relation) ||\n (isOneToOneRelationProp(relation) &&\n relation.customJoinClause === undefined)\n )\n .map(([, relation]) => {\n /*\n BelongsToOne인 경우\n Category / 'id' / row[category_id] 호출\n OneToOne에 joinColumn === true 인 경우\n Profile / 'id' / row[profile_id] 호출\n OneToOne에 joinColumn === false 인 경우\n Profile / 'profile_id' / row['id'] 호출\n */\n let field: string;\n let id: number;\n if (isOneToOneRelationProp(relation) && !relation.hasJoinColumn) {\n const relatedEntity = EntityManager.get(relation.with);\n const relatedIdColumnName = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n )?.name;\n if (!relatedIdColumnName) {\n throw new Error(\n `${relatedEntity.id}의 ${entity.id} 관계 프롭을 찾을 수 없습니다.`\n );\n }\n field = `${relatedIdColumnName}_id`;\n id = row[\"id\"];\n } else {\n field = \"id\";\n id = row[`${relation.name}_id`];\n }\n return {\n entityId: relation.with,\n field,\n id,\n };\n })\n .filter((arg) => arg.id !== null);\n\n const relQueries = await Promise.all(\n args.map(async (args) => {\n return this.getImportQueries(args.entityId, args.field, args.id);\n })\n );\n\n return [..._.uniq(relQueries.reverse().flat()), selfQuery];\n }\n\n async destroy() {\n if (this._tdb) {\n await this._tdb.destroy();\n this._tdb = null;\n }\n if (this._fdb) {\n await this._fdb.destroy();\n this._fdb = null;\n }\n await BaseModel.destroy();\n }\n\n async getFixtures(\n sourceDBName: keyof SonamuDBConfig,\n targetDBName: keyof SonamuDBConfig,\n searchOptions: FixtureSearchOptions\n ) {\n const sourceDB = knex(Sonamu.dbConfig[sourceDBName]);\n const targetDB = knex(Sonamu.dbConfig[targetDBName]);\n const { entityId, field, value, searchType } = searchOptions;\n\n const entity = EntityManager.get(entityId);\n const column =\n entity.props.find((prop) => prop.name === field)?.type === \"relation\"\n ? `${field}_id`\n : field;\n\n let query = sourceDB(entity.table);\n if (searchType === \"equals\") {\n query = query.where(column, value);\n } else if (searchType === \"like\") {\n query = query.where(column, \"like\", `%${value}%`);\n }\n\n const rows = await query;\n if (rows.length === 0) {\n throw new Error(\"No records found\");\n }\n\n const fixtures: FixtureRecord[] = [];\n for (const row of rows) {\n const initialRecordsLength = fixtures.length;\n const newRecords = await this.createFixtureRecord(entity, row);\n fixtures.push(...newRecords);\n const currentFixtureRecord = fixtures.find(\n (r) => r.fixtureId === `${entityId}#${row.id}`\n );\n\n if (currentFixtureRecord) {\n // 현재 fixture로부터 생성된 fetchedRecords 설정\n currentFixtureRecord.fetchedRecords = fixtures\n .filter((r) => r.fixtureId !== currentFixtureRecord.fixtureId)\n .slice(initialRecordsLength)\n .map((r) => r.fixtureId);\n }\n }\n\n for await (const fixture of fixtures) {\n const entity = EntityManager.get(fixture.entityId);\n\n // ID를 이용하여 targetDB에 레코드가 존재하는지 확인\n const row = await targetDB(entity.table).where(\"id\", fixture.id).first();\n if (row) {\n const [record] = await this.createFixtureRecord(entity, row, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.target = record;\n continue;\n }\n\n // ID를 이용하여 targetDB에서 조회되지 않는 경우, unique 제약을 위반하는지 확인\n const uniqueRow = await this.checkUniqueViolation(\n targetDB,\n entity,\n fixture\n );\n if (uniqueRow) {\n const [record] = await this.createFixtureRecord(entity, uniqueRow, {\n singleRecord: true,\n _db: targetDB,\n });\n fixture.unique = record;\n }\n }\n\n return _.uniqBy(fixtures, (f) => f.fixtureId);\n }\n\n async createFixtureRecord(\n entity: Entity,\n row: any,\n options?: {\n singleRecord?: boolean;\n _db?: Knex;\n }\n ): Promise<FixtureRecord[]> {\n const records: FixtureRecord[] = [];\n const visitedEntities = new Set<string>();\n\n const create = async (entity: Entity, row: any) => {\n const fixtureId = `${entity.id}#${row.id}`;\n if (visitedEntities.has(fixtureId)) {\n return;\n }\n visitedEntities.add(fixtureId);\n\n const record: FixtureRecord = {\n fixtureId,\n entityId: entity.id,\n id: row.id,\n columns: {},\n fetchedRecords: [],\n belongsRecords: [],\n };\n\n for (const prop of entity.props) {\n if (isVirtualProp(prop)) {\n continue;\n }\n\n record.columns[prop.name] = {\n prop: prop,\n value: row[prop.name],\n };\n\n const db = options?._db ?? BaseModel.getDB(\"w\");\n if (isManyToManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const throughTable = prop.joinTable;\n const fromColumn = `${inflection.singularize(entity.table)}_id`;\n const toColumn = `${inflection.singularize(relatedEntity.table)}_id`;\n\n const relatedIds = await db(throughTable)\n .where(fromColumn, row.id)\n .pluck(toColumn);\n record.columns[prop.name].value = relatedIds;\n } else if (isHasManyRelationProp(prop)) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedIds = await db(relatedEntity.table)\n .where(prop.joinColumn, row.id)\n .pluck(\"id\");\n record.columns[prop.name].value = relatedIds;\n } else if (isOneToOneRelationProp(prop) && !prop.hasJoinColumn) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedProp = relatedEntity.props.find(\n (p) => isRelationProp(p) && p.with === entity.id\n );\n if (relatedProp) {\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", row.id)\n .first();\n record.columns[prop.name].value = relatedRow?.id;\n }\n } else if (isRelationProp(prop)) {\n const relatedId = row[`${prop.name}_id`];\n record.columns[prop.name].value = relatedId;\n if (relatedId) {\n record.belongsRecords.push(`${prop.with}#${relatedId}`);\n }\n if (!options?.singleRecord && relatedId) {\n const relatedEntity = EntityManager.get(prop.with);\n const relatedRow = await db(relatedEntity.table)\n .where(\"id\", relatedId)\n .first();\n if (relatedRow) {\n await create(relatedEntity, relatedRow);\n }\n }\n }\n }\n\n records.push(record);\n };\n\n await create(entity, row);\n\n return records;\n }\n\n async insertFixtures(\n dbName: keyof SonamuDBConfig,\n _fixtures: FixtureRecord[]\n ) {\n const fixtures = _.uniqBy(_fixtures, (f) => f.fixtureId);\n\n this.relationGraph.buildGraph(fixtures);\n const insertionOrder = this.relationGraph.getInsertionOrder();\n const db = knex(Sonamu.dbConfig[dbName]);\n\n await db.transaction(async (trx) => {\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 0`);\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n const result = await this.insertFixture(trx as any, fixture);\n if (result.id !== fixture.id) {\n // ID가 변경된 경우, 다른 fixture에서 참조하는 경우가 찾아서 수정\n console.log(\n chalk.yellow(\n `Unique constraint violation: ${fixture.entityId}#${fixture.id} -> ${fixture.entityId}#${result.id}`\n )\n );\n fixtures.forEach((f) => {\n Object.values(f.columns).forEach((column) => {\n if (\n column.prop.type === \"relation\" &&\n column.prop.with === result.entityId &&\n column.value === fixture.id\n ) {\n column.value = result.id;\n }\n });\n });\n fixture.id = result.id;\n }\n }\n\n for (const fixtureId of insertionOrder) {\n const fixture = fixtures.find((f) => f.fixtureId === fixtureId)!;\n await this.handleManyToManyRelations(trx as any, fixture, fixtures);\n }\n await trx.raw(`SET FOREIGN_KEY_CHECKS = 1`);\n });\n\n const records: FixtureImportResult[] = [];\n\n for await (const r of fixtures) {\n const entity = EntityManager.get(r.entityId);\n const record = await db(entity.table).where(\"id\", r.id).first();\n records.push({\n entityId: r.entityId,\n data: record,\n });\n }\n\n return _.uniqBy(records, (r) => `${r.entityId}#${r.data.id}`);\n }\n\n private prepareInsertData(fixture: FixtureRecord) {\n const insertData: any = {};\n for (const [propName, column] of Object.entries(fixture.columns)) {\n if (isVirtualProp(column.prop)) {\n continue;\n }\n\n const prop = column.prop as EntityProp;\n if (!isRelationProp(prop)) {\n if (prop.type === \"json\") {\n insertData[propName] = JSON.stringify(column.value);\n } else if (prop.type === \"timestamp\" || prop.type === \"datetime\") {\n insertData[propName] = new Date(column.value);\n } else {\n insertData[propName] = column.value;\n }\n } else if (\n isBelongsToOneRelationProp(prop) ||\n (isOneToOneRelationProp(prop) && prop.hasJoinColumn)\n ) {\n insertData[`${propName}_id`] = column.value;\n }\n }\n return insertData;\n }\n\n private async insertFixture(db: Knex, fixture: FixtureRecord) {\n const insertData = this.prepareInsertData(fixture);\n const entity = EntityManager.get(fixture.entityId);\n\n try {\n const uniqueFound = await this.checkUniqueViolation(db, entity, fixture);\n if (uniqueFound) {\n return {\n entityId: fixture.entityId,\n id: uniqueFound.id,\n };\n }\n\n const found = await db(entity.table).where(\"id\", fixture.id).first();\n if (found && !fixture.override) {\n return {\n entityId: fixture.entityId,\n id: found.id,\n };\n }\n\n const q = db.insert(insertData).into(entity.table);\n await q.onDuplicateUpdate.apply(q, Object.keys(insertData));\n return {\n entityId: fixture.entityId,\n id: fixture.id,\n };\n } catch (err) {\n console.log(err);\n throw err;\n }\n }\n\n private async handleManyToManyRelations(\n db: Knex,\n fixture: FixtureRecord,\n fixtures: FixtureRecord[]\n ) {\n for (const [, column] of Object.entries(fixture.columns)) {\n const prop = column.prop as EntityProp;\n if (isManyToManyRelationProp(prop)) {\n const joinTable = (prop as ManyToManyRelationProp).joinTable;\n const relatedIds = column.value as number[];\n\n for (const relatedId of relatedIds) {\n if (\n !fixtures.find((f) => f.fixtureId === `${prop.with}#${relatedId}`)\n ) {\n continue;\n }\n\n const entity = EntityManager.get(fixture.entityId);\n const relatedEntity = EntityManager.get(prop.with);\n if (!entity || !relatedEntity) {\n throw new Error(\n `Entity not found: ${fixture.entityId}, ${prop.with}`\n );\n }\n\n const [found] = await db(joinTable)\n .where({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n })\n .limit(1);\n if (found) {\n continue;\n }\n\n const newIds = await db(joinTable).insert({\n [`${inflection.singularize(entity.table)}_id`]: fixture.id,\n [`${inflection.singularize(relatedEntity.table)}_id`]: relatedId,\n });\n console.log(\n chalk.green(\n `Inserted into ${joinTable}: ${entity.table}(${fixture.id}) - ${relatedEntity.table}(${relatedId}) ID: ${newIds}`\n )\n );\n }\n }\n }\n }\n\n async addFixtureLoader(code: string) {\n const path = Sonamu.apiRootPath + \"/src/testing/fixture.ts\";\n let content = readFileSync(path).toString();\n\n const fixtureLoaderStart = content.indexOf(\"const fixtureLoader = {\");\n const fixtureLoaderEnd = content.indexOf(\"};\", fixtureLoaderStart);\n\n if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1) {\n const newContent =\n content.slice(0, fixtureLoaderEnd) +\n \" \" +\n code +\n \"\\n\" +\n content.slice(fixtureLoaderEnd);\n\n writeFileSync(path, newContent);\n } else {\n throw new Error(\"Failed to find fixtureLoader in fixture.ts\");\n }\n }\n\n // 해당 픽스쳐의 값으로 유니크 제약에 위배되는 레코드가 있는지 확인\n private async checkUniqueViolation(\n db: Knex,\n entity: Entity,\n fixture: FixtureRecord\n ) {\n const _uniqueIndexes = entity.indexes.filter((i) => i.type === \"unique\");\n\n // ManyToMany 관계 테이블의 유니크 제약은 제외\n const uniqueIndexes = _uniqueIndexes.filter((index) =>\n index.columns.every((column) => !column.startsWith(`${entity.table}__`))\n );\n if (uniqueIndexes.length === 0) {\n return null;\n }\n\n let uniqueQuery = db(entity.table);\n for (const index of uniqueIndexes) {\n // 컬럼 중 하나라도 null이면 유니크 제약을 위반하지 않기 때문에 해당 인덱스는 무시\n const containsNull = index.columns.some((column) => {\n const field = column.split(\"_id\")[0];\n return fixture.columns[field].value === null;\n });\n if (containsNull) {\n continue;\n }\n\n uniqueQuery = uniqueQuery.orWhere((qb) => {\n for (const column of index.columns) {\n const field = column.split(\"_id\")[0];\n\n if (Array.isArray(fixture.columns[field].value)) {\n qb.whereIn(column, fixture.columns[field].value);\n } else {\n qb.andWhere(column, fixture.columns[field].value);\n }\n }\n });\n }\n const [uniqueFound] = await uniqueQuery;\n return uniqueFound;\n }\n}\nexport const FixtureManager = new FixtureManagerClass();\n"],"names":["FixtureManager","FixtureManagerClass","_tdb","_fdb","cachedTableNames","relationGraph","RelationGraph","visitedRecords","Set","tdb","Error","fdb","init","Sonamu","dbConfig","test","production_master","tConn","connection","pConn","host","port","database","knex","fixture_local","cleanAndSeed","usingTables","tableNames","tableListStr","fdbChecksumRows","tdbChecksumRows","fdbChecksums","tdbChecksums","changedTables","tables","raw","map","tableInfo","join","Map","row","Table","split","pop","Checksum","filter","tableName","get","transaction","trx","Promise","all","rawQuery","truncate","getChecksum","db","checksumRow","sync","frdb","fixture_remote","table","Name","console","log","chalk","magenta","remoteChecksum","localChecksum","startsWith","rows","length","blue","insert","Object","fromEntries","entries","key","value","Date","JSON","stringify","into","destroy","importFixture","entityId","ids","queries","wdb","query","rsh","clear","_","uniq","id","getImportQueries","flat","BaseModel","getDB","info","field","recordKey","entity","fixtureDatabase","realDatabase","selfQuery","args","relQueries","has","add","EntityManager","where","limit","undefined","relations","relation","isBelongsToOneRelationProp","isOneToOneRelationProp","customJoinClause","hasJoinColumn","relatedEntity","with","relatedIdColumnName","props","find","p","isRelationProp","name","arg","reverse","getFixtures","sourceDBName","targetDBName","searchOptions","sourceDB","targetDB","searchType","column","fixtures","fixture","record","uniqueRow","prop","type","initialRecordsLength","newRecords","currentFixtureRecord","createFixtureRecord","push","r","fixtureId","fetchedRecords","slice","first","singleRecord","_db","target","checkUniqueViolation","unique","uniqBy","f","options","records","visitedEntities","create","throughTable","fromColumn","toColumn","relatedIds","relatedProp","relatedRow","relatedId","columns","belongsRecords","isVirtualProp","isManyToManyRelationProp","joinTable","inflection","singularize","pluck","isHasManyRelationProp","joinColumn","insertFixtures","dbName","_fixtures","insertionOrder","buildGraph","getInsertionOrder","result","insertFixture","yellow","forEach","values","handleManyToManyRelations","data","prepareInsertData","insertData","propName","uniqueFound","found","q","err","override","onDuplicateUpdate","apply","keys","newIds","green","addFixtureLoader","code","path","content","fixtureLoaderStart","fixtureLoaderEnd","newContent","apiRootPath","readFileSync","toString","indexOf","writeFileSync","_uniqueIndexes","uniqueIndexes","uniqueQuery","indexes","i","index","every","containsNull","some","orWhere","qb","Array","isArray","whereIn","andWhere"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -11,7 +11,8 @@
11
11
  "exports": "./dist/index.js",
12
12
  "scripts": {
13
13
  "dev": "nodemon exec",
14
- "build": "swc src --config-file .swcrc -d dist --strip-leading-paths && tsc --emitDeclarationOnly"
14
+ "build": "swc src --config-file .swcrc -d dist --strip-leading-paths && tsc --emitDeclarationOnly",
15
+ "publish": "yarn build && yarn npm publish"
15
16
  },
16
17
  "license": "MIT",
17
18
  "author": {