@uql/core 1.0.12 → 3.0.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.
- package/CHANGELOG.md +243 -0
- package/LICENSE.md +2 -2
- package/dist/CHANGELOG.md +186 -0
- package/dist/README.md +413 -0
- package/dist/browser/http/bus.d.ts +3 -0
- package/dist/browser/http/bus.js +14 -0
- package/dist/browser/http/http.d.ts +6 -0
- package/dist/browser/http/http.js +45 -0
- package/dist/browser/http/index.d.ts +2 -0
- package/dist/browser/http/index.js +3 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.js +5 -0
- package/dist/browser/options.d.ts +4 -0
- package/dist/browser/options.js +14 -0
- package/dist/browser/querier/genericClientRepository.d.ts +17 -0
- package/dist/browser/querier/genericClientRepository.js +39 -0
- package/dist/browser/querier/httpQuerier.d.ts +20 -0
- package/dist/browser/querier/httpQuerier.js +71 -0
- package/dist/browser/querier/index.d.ts +3 -0
- package/dist/browser/querier/index.js +4 -0
- package/dist/browser/querier/querier.util.d.ts +2 -0
- package/dist/browser/querier/querier.util.js +17 -0
- package/dist/browser/type/clientQuerier.d.ts +16 -0
- package/dist/browser/type/clientQuerier.js +2 -0
- package/dist/browser/type/clientQuerierPool.d.ts +4 -0
- package/dist/browser/type/clientQuerierPool.js +2 -0
- package/dist/browser/type/clientRepository.d.ts +13 -0
- package/dist/browser/type/clientRepository.js +2 -0
- package/dist/browser/type/index.d.ts +4 -0
- package/dist/browser/type/index.js +5 -0
- package/dist/browser/type/request.d.ts +28 -0
- package/dist/browser/type/request.js +2 -0
- package/dist/browser/uql-browser.min.js +2150 -0
- package/dist/browser/uql-browser.min.js.map +1 -0
- package/dist/dialect/abstractDialect.d.ts +16 -0
- package/dist/dialect/abstractDialect.js +28 -0
- package/dist/dialect/abstractSqlDialect.d.ts +47 -0
- package/dist/dialect/abstractSqlDialect.js +650 -0
- package/dist/dialect/index.d.ts +3 -0
- package/dist/dialect/index.js +4 -0
- package/dist/dialect/queryContext.d.ts +48 -0
- package/dist/dialect/queryContext.js +65 -0
- package/{entity → dist/entity}/decorator/definition.d.ts +3 -3
- package/dist/entity/decorator/definition.js +214 -0
- package/{entity → dist/entity}/decorator/entity.d.ts +1 -1
- package/dist/entity/decorator/entity.js +7 -0
- package/{entity → dist/entity}/decorator/field.d.ts +1 -1
- package/dist/entity/decorator/field.js +8 -0
- package/{entity → dist/entity}/decorator/id.d.ts +1 -1
- package/dist/entity/decorator/id.js +8 -0
- package/dist/entity/decorator/index.d.ts +5 -0
- package/dist/entity/decorator/index.js +6 -0
- package/{entity → dist/entity}/decorator/relation.d.ts +1 -1
- package/dist/entity/decorator/relation.js +20 -0
- package/dist/entity/index.d.ts +1 -0
- package/dist/entity/index.js +2 -0
- package/dist/express/index.d.ts +2 -0
- package/dist/express/index.js +3 -0
- package/dist/express/querierMiddleware.d.ts +26 -0
- package/dist/express/querierMiddleware.js +190 -0
- package/dist/express/query.util.d.ts +2 -0
- package/dist/express/query.util.js +19 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +10 -0
- package/dist/maria/index.d.ts +3 -0
- package/dist/maria/index.js +4 -0
- package/dist/maria/mariaDialect.d.ts +8 -0
- package/dist/maria/mariaDialect.js +38 -0
- package/dist/maria/mariaQuerierPool.test.d.ts +5 -0
- package/dist/maria/mariaQuerierPool.test.js +19 -0
- package/dist/maria/mariadbQuerier.d.ts +17 -0
- package/dist/maria/mariadbQuerier.js +39 -0
- package/dist/maria/mariadbQuerier.test.d.ts +4 -0
- package/dist/maria/mariadbQuerier.test.js +19 -0
- package/dist/maria/mariadbQuerierPool.d.ts +10 -0
- package/dist/maria/mariadbQuerierPool.js +17 -0
- package/dist/migrate/cli.d.ts +2 -0
- package/dist/migrate/cli.js +254 -0
- package/dist/migrate/generator/index.d.ts +4 -0
- package/dist/migrate/generator/index.js +5 -0
- package/dist/migrate/generator/mongoSchemaGenerator.d.ts +12 -0
- package/dist/migrate/generator/mongoSchemaGenerator.js +100 -0
- package/dist/migrate/generator/mysqlSchemaGenerator.d.ts +14 -0
- package/dist/migrate/generator/mysqlSchemaGenerator.js +81 -0
- package/dist/migrate/generator/postgresSchemaGenerator.d.ts +18 -0
- package/dist/migrate/generator/postgresSchemaGenerator.js +111 -0
- package/dist/migrate/generator/sqliteSchemaGenerator.d.ts +14 -0
- package/dist/migrate/generator/sqliteSchemaGenerator.js +68 -0
- package/dist/migrate/index.d.ts +12 -0
- package/dist/migrate/index.js +17 -0
- package/dist/migrate/introspection/index.d.ts +4 -0
- package/dist/migrate/introspection/index.js +5 -0
- package/dist/migrate/introspection/mongoIntrospector.d.ts +8 -0
- package/dist/migrate/introspection/mongoIntrospector.js +46 -0
- package/dist/migrate/introspection/mysqlIntrospector.d.ts +25 -0
- package/dist/migrate/introspection/mysqlIntrospector.js +220 -0
- package/dist/migrate/introspection/postgresIntrospector.d.ts +21 -0
- package/dist/migrate/introspection/postgresIntrospector.js +269 -0
- package/dist/migrate/introspection/sqliteIntrospector.d.ts +23 -0
- package/dist/migrate/introspection/sqliteIntrospector.js +212 -0
- package/dist/migrate/migrator-mongo.test.d.ts +1 -0
- package/dist/migrate/migrator-mongo.test.js +54 -0
- package/dist/migrate/migrator.d.ts +133 -0
- package/dist/migrate/migrator.js +600 -0
- package/dist/migrate/migrator.test.d.ts +1 -0
- package/dist/migrate/migrator.test.js +106 -0
- package/dist/migrate/schemaGenerator.d.ts +78 -0
- package/dist/migrate/schemaGenerator.js +363 -0
- package/dist/migrate/storage/databaseStorage.d.ts +24 -0
- package/dist/migrate/storage/databaseStorage.js +77 -0
- package/dist/migrate/storage/index.d.ts +2 -0
- package/dist/migrate/storage/index.js +3 -0
- package/dist/migrate/storage/jsonStorage.d.ts +15 -0
- package/dist/migrate/storage/jsonStorage.js +51 -0
- package/dist/migrate/type.d.ts +1 -0
- package/dist/migrate/type.js +2 -0
- package/dist/mongo/index.d.ts +3 -0
- package/dist/mongo/index.js +4 -0
- package/dist/mongo/mongoDialect.d.ts +34 -0
- package/dist/mongo/mongoDialect.js +163 -0
- package/dist/mongo/mongodbQuerier.d.ts +28 -0
- package/dist/mongo/mongodbQuerier.js +204 -0
- package/dist/mongo/mongodbQuerier.test.d.ts +1 -0
- package/dist/mongo/mongodbQuerier.test.js +36 -0
- package/dist/mongo/mongodbQuerierPool.d.ts +10 -0
- package/dist/mongo/mongodbQuerierPool.js +20 -0
- package/dist/mongo/mongodbQuerierPool.test.d.ts +1 -0
- package/dist/mongo/mongodbQuerierPool.test.js +21 -0
- package/dist/mysql/index.d.ts +3 -0
- package/dist/mysql/index.js +4 -0
- package/dist/mysql/mysql2Querier.d.ts +17 -0
- package/dist/mysql/mysql2Querier.js +43 -0
- package/dist/mysql/mysql2Querier.test.d.ts +4 -0
- package/dist/mysql/mysql2Querier.test.js +16 -0
- package/dist/mysql/mysql2QuerierPool.d.ts +10 -0
- package/dist/mysql/mysql2QuerierPool.js +17 -0
- package/dist/mysql/mysql2QuerierPool.test.d.ts +5 -0
- package/dist/mysql/mysql2QuerierPool.test.js +16 -0
- package/dist/mysql/mysqlDialect.d.ts +5 -0
- package/dist/mysql/mysqlDialect.js +15 -0
- package/dist/namingStrategy/defaultNamingStrategy.d.ts +9 -0
- package/dist/namingStrategy/defaultNamingStrategy.js +15 -0
- package/dist/namingStrategy/index.d.ts +2 -0
- package/dist/namingStrategy/index.js +3 -0
- package/dist/namingStrategy/snakeCaseNamingStrategy.d.ts +8 -0
- package/dist/namingStrategy/snakeCaseNamingStrategy.js +14 -0
- package/{options.d.ts → dist/options.d.ts} +1 -1
- package/dist/options.js +14 -0
- package/dist/package.json +131 -0
- package/dist/postgres/index.d.ts +3 -0
- package/dist/postgres/index.js +4 -0
- package/dist/postgres/pgQuerier.d.ts +17 -0
- package/dist/postgres/pgQuerier.js +39 -0
- package/dist/postgres/pgQuerier.test.d.ts +4 -0
- package/dist/postgres/pgQuerier.test.js +20 -0
- package/dist/postgres/pgQuerierPool.d.ts +10 -0
- package/dist/postgres/pgQuerierPool.js +17 -0
- package/dist/postgres/pgQuerierPool.test.d.ts +5 -0
- package/dist/postgres/pgQuerierPool.test.js +23 -0
- package/dist/postgres/postgresDialect.d.ts +13 -0
- package/dist/postgres/postgresDialect.js +110 -0
- package/dist/querier/abstractQuerier-test.d.ts +45 -0
- package/dist/querier/abstractQuerier-test.js +461 -0
- package/dist/querier/abstractQuerier.d.ts +50 -0
- package/dist/querier/abstractQuerier.js +278 -0
- package/dist/querier/abstractQuerierPool-test.d.ts +9 -0
- package/dist/querier/abstractQuerierPool-test.js +18 -0
- package/dist/querier/abstractQuerierPool.d.ts +14 -0
- package/dist/querier/abstractQuerierPool.js +9 -0
- package/dist/querier/abstractSqlQuerier-test.d.ts +9 -0
- package/dist/querier/abstractSqlQuerier-test.js +16 -0
- package/dist/querier/abstractSqlQuerier.d.ts +28 -0
- package/dist/querier/abstractSqlQuerier.js +133 -0
- package/dist/querier/decorator/index.d.ts +3 -0
- package/dist/querier/decorator/index.js +4 -0
- package/dist/querier/decorator/injectQuerier.d.ts +3 -0
- package/dist/querier/decorator/injectQuerier.js +33 -0
- package/dist/querier/decorator/serialized.d.ts +6 -0
- package/dist/querier/decorator/serialized.js +14 -0
- package/{querier → dist/querier}/decorator/transactional.d.ts +1 -1
- package/dist/querier/decorator/transactional.js +48 -0
- package/dist/querier/index.d.ts +4 -0
- package/dist/querier/index.js +5 -0
- package/dist/repository/genericRepository.d.ts +20 -0
- package/dist/repository/genericRepository.js +51 -0
- package/dist/repository/index.d.ts +1 -0
- package/dist/repository/index.js +2 -0
- package/dist/sqlite/index.d.ts +3 -0
- package/dist/sqlite/index.js +4 -0
- package/dist/sqlite/sqliteDialect.d.ts +10 -0
- package/dist/sqlite/sqliteDialect.js +48 -0
- package/dist/sqlite/sqliteQuerier.d.ts +15 -0
- package/dist/sqlite/sqliteQuerier.js +33 -0
- package/dist/sqlite/sqliteQuerier.test.d.ts +5 -0
- package/dist/sqlite/sqliteQuerier.test.js +19 -0
- package/dist/sqlite/sqliteQuerierPool.d.ts +14 -0
- package/dist/sqlite/sqliteQuerierPool.js +34 -0
- package/dist/sqlite/sqliteQuerierPool.test.d.ts +5 -0
- package/dist/sqlite/sqliteQuerierPool.test.js +10 -0
- package/dist/test/entityMock.d.ts +164 -0
- package/dist/test/entityMock.js +554 -0
- package/dist/test/index.d.ts +3 -0
- package/dist/test/index.js +4 -0
- package/dist/test/it.util.d.ts +4 -0
- package/dist/test/it.util.js +55 -0
- package/dist/test/spec.util.d.ts +14 -0
- package/dist/test/spec.util.js +50 -0
- package/{type → dist/type}/entity.d.ts +97 -4
- package/dist/type/entity.js +5 -0
- package/dist/type/index.d.ts +9 -0
- package/dist/type/index.js +10 -0
- package/dist/type/migration.d.ts +213 -0
- package/dist/type/migration.js +2 -0
- package/dist/type/namingStrategy.d.ts +17 -0
- package/dist/type/namingStrategy.js +2 -0
- package/dist/type/querier.d.ts +96 -0
- package/dist/type/querier.js +11 -0
- package/{type → dist/type}/querierPool.d.ts +7 -3
- package/dist/type/querierPool.js +2 -0
- package/{type → dist/type}/query.d.ts +170 -108
- package/dist/type/query.js +9 -0
- package/{type → dist/type}/repository.d.ts +42 -35
- package/dist/type/repository.js +2 -0
- package/{type → dist/type}/universalQuerier.d.ts +50 -28
- package/dist/type/universalQuerier.js +2 -0
- package/dist/type/utility.d.ts +13 -0
- package/dist/type/utility.js +2 -0
- package/dist/util/dialect.util.d.ts +12 -0
- package/dist/util/dialect.util.js +93 -0
- package/dist/util/index.d.ts +5 -0
- package/dist/util/index.js +6 -0
- package/dist/util/object.util.d.ts +7 -0
- package/dist/util/object.util.js +19 -0
- package/dist/util/raw.d.ts +8 -0
- package/dist/util/raw.js +11 -0
- package/dist/util/sql.util.d.ts +13 -0
- package/dist/util/sql.util.js +78 -0
- package/{util → dist/util}/string.util.d.ts +1 -0
- package/dist/util/string.util.js +34 -0
- package/package.json +84 -16
- package/src/@types/index.d.ts +1 -0
- package/src/@types/jest.d.ts +6 -0
- package/src/browser/http/bus.spec.ts +22 -0
- package/src/browser/http/bus.ts +17 -0
- package/src/browser/http/http.spec.ts +70 -0
- package/src/browser/http/http.ts +55 -0
- package/src/browser/http/index.ts +2 -0
- package/src/browser/index.ts +4 -0
- package/src/browser/options.spec.ts +37 -0
- package/src/browser/options.ts +18 -0
- package/src/browser/querier/genericClientRepository.spec.ts +105 -0
- package/src/browser/querier/genericClientRepository.ts +49 -0
- package/src/browser/querier/httpQuerier.ts +82 -0
- package/src/browser/querier/index.ts +3 -0
- package/src/browser/querier/querier.util.spec.ts +35 -0
- package/src/browser/querier/querier.util.ts +18 -0
- package/src/browser/type/clientQuerier.ts +45 -0
- package/src/browser/type/clientQuerierPool.ts +5 -0
- package/src/browser/type/clientRepository.ts +22 -0
- package/src/browser/type/index.ts +4 -0
- package/src/browser/type/request.ts +25 -0
- package/src/dialect/abstractDialect.ts +28 -0
- package/src/dialect/abstractSqlDialect-spec.ts +1309 -0
- package/src/dialect/abstractSqlDialect.ts +805 -0
- package/src/dialect/index.ts +3 -0
- package/src/dialect/namingStrategy.spec.ts +52 -0
- package/src/dialect/queryContext.ts +69 -0
- package/src/entity/decorator/definition.spec.ts +736 -0
- package/src/entity/decorator/definition.ts +265 -0
- package/src/entity/decorator/entity.ts +8 -0
- package/src/entity/decorator/field.ts +9 -0
- package/src/entity/decorator/id.ts +9 -0
- package/src/entity/decorator/index.ts +5 -0
- package/src/entity/decorator/relation.spec.ts +41 -0
- package/src/entity/decorator/relation.ts +34 -0
- package/src/entity/index.ts +1 -0
- package/src/express/@types/express.d.ts +8 -0
- package/src/express/@types/index.d.ts +1 -0
- package/src/express/index.ts +2 -0
- package/src/express/querierMiddleware.ts +217 -0
- package/src/express/query.util.spec.ts +40 -0
- package/src/express/query.util.ts +21 -0
- package/src/index.ts +9 -0
- package/src/maria/index.ts +3 -0
- package/src/maria/mariaDialect.spec.ts +207 -0
- package/src/maria/mariaDialect.ts +42 -0
- package/src/maria/mariaQuerierPool.test.ts +23 -0
- package/src/maria/mariadbQuerier.test.ts +23 -0
- package/src/maria/mariadbQuerier.ts +45 -0
- package/src/maria/mariadbQuerierPool.ts +21 -0
- package/src/migrate/cli.ts +301 -0
- package/src/migrate/generator/index.ts +4 -0
- package/src/migrate/generator/mongoSchemaGenerator.spec.ts +112 -0
- package/src/migrate/generator/mongoSchemaGenerator.ts +115 -0
- package/src/migrate/generator/mysqlSchemaGenerator.spec.ts +34 -0
- package/src/migrate/generator/mysqlSchemaGenerator.ts +92 -0
- package/src/migrate/generator/postgresSchemaGenerator.spec.ts +44 -0
- package/src/migrate/generator/postgresSchemaGenerator.ts +127 -0
- package/src/migrate/generator/sqliteSchemaGenerator.spec.ts +33 -0
- package/src/migrate/generator/sqliteSchemaGenerator.ts +81 -0
- package/src/migrate/index.ts +41 -0
- package/src/migrate/introspection/index.ts +4 -0
- package/src/migrate/introspection/mongoIntrospector.spec.ts +75 -0
- package/src/migrate/introspection/mongoIntrospector.ts +47 -0
- package/src/migrate/introspection/mysqlIntrospector.spec.ts +113 -0
- package/src/migrate/introspection/mysqlIntrospector.ts +278 -0
- package/src/migrate/introspection/postgresIntrospector.spec.ts +112 -0
- package/src/migrate/introspection/postgresIntrospector.ts +329 -0
- package/src/migrate/introspection/sqliteIntrospector.spec.ts +112 -0
- package/src/migrate/introspection/sqliteIntrospector.ts +296 -0
- package/src/migrate/migrator-mongo.test.ts +54 -0
- package/src/migrate/migrator.spec.ts +255 -0
- package/src/migrate/migrator.test.ts +94 -0
- package/src/migrate/migrator.ts +719 -0
- package/src/migrate/namingStrategy.spec.ts +22 -0
- package/src/migrate/schemaGenerator-advanced.spec.ts +138 -0
- package/src/migrate/schemaGenerator.spec.ts +190 -0
- package/src/migrate/schemaGenerator.ts +478 -0
- package/src/migrate/storage/databaseStorage.spec.ts +69 -0
- package/src/migrate/storage/databaseStorage.ts +100 -0
- package/src/migrate/storage/index.ts +2 -0
- package/src/migrate/storage/jsonStorage.ts +58 -0
- package/src/migrate/type.ts +1 -0
- package/src/mongo/index.ts +3 -0
- package/src/mongo/mongoDialect.spec.ts +251 -0
- package/src/mongo/mongoDialect.ts +238 -0
- package/src/mongo/mongodbQuerier.test.ts +45 -0
- package/src/mongo/mongodbQuerier.ts +256 -0
- package/src/mongo/mongodbQuerierPool.test.ts +25 -0
- package/src/mongo/mongodbQuerierPool.ts +24 -0
- package/src/mysql/index.ts +3 -0
- package/src/mysql/mysql2Querier.test.ts +20 -0
- package/src/mysql/mysql2Querier.ts +49 -0
- package/src/mysql/mysql2QuerierPool.test.ts +20 -0
- package/src/mysql/mysql2QuerierPool.ts +21 -0
- package/src/mysql/mysqlDialect.spec.ts +20 -0
- package/src/mysql/mysqlDialect.ts +16 -0
- package/src/namingStrategy/defaultNamingStrategy.ts +18 -0
- package/src/namingStrategy/index.spec.ts +36 -0
- package/src/namingStrategy/index.ts +2 -0
- package/src/namingStrategy/snakeCaseNamingStrategy.ts +15 -0
- package/src/options.spec.ts +41 -0
- package/src/options.ts +18 -0
- package/src/postgres/index.ts +3 -0
- package/src/postgres/manual-types.d.ts +4 -0
- package/src/postgres/pgQuerier.test.ts +25 -0
- package/src/postgres/pgQuerier.ts +45 -0
- package/src/postgres/pgQuerierPool.test.ts +28 -0
- package/src/postgres/pgQuerierPool.ts +21 -0
- package/src/postgres/postgresDialect.spec.ts +428 -0
- package/src/postgres/postgresDialect.ts +144 -0
- package/src/querier/abstractQuerier-test.ts +584 -0
- package/src/querier/abstractQuerier.ts +353 -0
- package/src/querier/abstractQuerierPool-test.ts +20 -0
- package/src/querier/abstractQuerierPool.ts +18 -0
- package/src/querier/abstractSqlQuerier-spec.ts +979 -0
- package/src/querier/abstractSqlQuerier-test.ts +21 -0
- package/src/querier/abstractSqlQuerier.ts +138 -0
- package/src/querier/decorator/index.ts +3 -0
- package/src/querier/decorator/injectQuerier.spec.ts +74 -0
- package/src/querier/decorator/injectQuerier.ts +45 -0
- package/src/querier/decorator/serialized.spec.ts +98 -0
- package/src/querier/decorator/serialized.ts +13 -0
- package/src/querier/decorator/transactional.spec.ts +240 -0
- package/src/querier/decorator/transactional.ts +56 -0
- package/src/querier/index.ts +4 -0
- package/src/repository/genericRepository.spec.ts +111 -0
- package/src/repository/genericRepository.ts +74 -0
- package/src/repository/index.ts +1 -0
- package/src/sqlite/index.ts +3 -0
- package/src/sqlite/manual-types.d.ts +4 -0
- package/src/sqlite/sqliteDialect.spec.ts +155 -0
- package/src/sqlite/sqliteDialect.ts +76 -0
- package/src/sqlite/sqliteQuerier.spec.ts +36 -0
- package/src/sqlite/sqliteQuerier.test.ts +21 -0
- package/src/sqlite/sqliteQuerier.ts +37 -0
- package/src/sqlite/sqliteQuerierPool.test.ts +12 -0
- package/src/sqlite/sqliteQuerierPool.ts +38 -0
- package/src/test/entityMock.ts +375 -0
- package/src/test/index.ts +3 -0
- package/src/test/it.util.ts +69 -0
- package/src/test/spec.util.ts +57 -0
- package/src/type/entity.ts +218 -0
- package/src/type/index.ts +9 -0
- package/src/type/migration.ts +241 -0
- package/src/type/namingStrategy.ts +17 -0
- package/src/type/querier.ts +143 -0
- package/src/type/querierPool.ts +26 -0
- package/src/type/query.ts +506 -0
- package/src/type/repository.ts +142 -0
- package/src/type/universalQuerier.ts +133 -0
- package/src/type/utility.ts +21 -0
- package/src/util/dialect.util-extra.spec.ts +96 -0
- package/src/util/dialect.util.spec.ts +23 -0
- package/src/util/dialect.util.ts +134 -0
- package/src/util/index.ts +5 -0
- package/src/util/object.util.spec.ts +29 -0
- package/src/util/object.util.ts +27 -0
- package/src/util/raw.ts +11 -0
- package/src/util/sql.util-extra.spec.ts +17 -0
- package/src/util/sql.util.spec.ts +208 -0
- package/src/util/sql.util.ts +104 -0
- package/src/util/string.util.spec.ts +46 -0
- package/src/util/string.util.ts +35 -0
- package/tsconfig.build.json +5 -0
- package/tsconfig.json +8 -0
- package/README.md +0 -177
- package/dialect/abstractSqlDialect.d.ts +0 -30
- package/dialect/abstractSqlDialect.js +0 -365
- package/dialect/index.d.ts +0 -4
- package/dialect/index.js +0 -8
- package/dialect/mysqlDialect.d.ts +0 -6
- package/dialect/mysqlDialect.js +0 -21
- package/dialect/postgresDialect.d.ts +0 -8
- package/dialect/postgresDialect.js +0 -44
- package/dialect/sqliteDialect.d.ts +0 -4
- package/dialect/sqliteDialect.js +0 -11
- package/entity/decorator/definition.js +0 -223
- package/entity/decorator/entity.js +0 -11
- package/entity/decorator/field.js +0 -12
- package/entity/decorator/id.js +0 -12
- package/entity/decorator/index.d.ts +0 -5
- package/entity/decorator/index.js +0 -12
- package/entity/decorator/relation.js +0 -27
- package/entity/index.d.ts +0 -1
- package/entity/index.js +0 -5
- package/index.d.ts +0 -1
- package/index.js +0 -5
- package/options.js +0 -20
- package/querier/abstractQuerier.d.ts +0 -30
- package/querier/abstractQuerier.js +0 -230
- package/querier/abstractSqlQuerier.d.ts +0 -27
- package/querier/abstractSqlQuerier.js +0 -88
- package/querier/decorator/index.d.ts +0 -2
- package/querier/decorator/index.js +0 -6
- package/querier/decorator/injectQuerier.d.ts +0 -3
- package/querier/decorator/injectQuerier.js +0 -39
- package/querier/decorator/transactional.js +0 -52
- package/querier/index.d.ts +0 -3
- package/querier/index.js +0 -7
- package/repository/genericRepository.d.ts +0 -19
- package/repository/genericRepository.js +0 -52
- package/repository/index.d.ts +0 -1
- package/repository/index.js +0 -5
- package/type/entity.js +0 -5
- package/type/index.d.ts +0 -7
- package/type/index.js +0 -11
- package/type/querier.d.ts +0 -53
- package/type/querier.js +0 -3
- package/type/querierPool.js +0 -3
- package/type/query.js +0 -13
- package/type/repository.js +0 -3
- package/type/universalQuerier.js +0 -3
- package/type/utility.d.ts +0 -12
- package/type/utility.js +0 -3
- package/util/dialect.util.d.ts +0 -17
- package/util/dialect.util.js +0 -114
- package/util/index.d.ts +0 -5
- package/util/index.js +0 -9
- package/util/object.util.d.ts +0 -3
- package/util/object.util.js +0 -22
- package/util/raw.d.ts +0 -2
- package/util/raw.js +0 -9
- package/util/sql.util.d.ts +0 -2
- package/util/sql.util.js +0 -55
- package/util/string.util.js +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { beforeEach, describe, expect, it, jest } from 'bun:test';
|
|
3
|
+
import { Entity, Field, Id } from '../entity/index.js';
|
|
4
|
+
import { Migrator } from './migrator.js';
|
|
5
|
+
let SyncUser = class SyncUser {
|
|
6
|
+
id;
|
|
7
|
+
name;
|
|
8
|
+
};
|
|
9
|
+
__decorate([
|
|
10
|
+
Id(),
|
|
11
|
+
__metadata("design:type", Number)
|
|
12
|
+
], SyncUser.prototype, "id", void 0);
|
|
13
|
+
__decorate([
|
|
14
|
+
Field(),
|
|
15
|
+
__metadata("design:type", String)
|
|
16
|
+
], SyncUser.prototype, "name", void 0);
|
|
17
|
+
SyncUser = __decorate([
|
|
18
|
+
Entity()
|
|
19
|
+
], SyncUser);
|
|
20
|
+
let SyncProfile = class SyncProfile {
|
|
21
|
+
id;
|
|
22
|
+
bio;
|
|
23
|
+
userId;
|
|
24
|
+
};
|
|
25
|
+
__decorate([
|
|
26
|
+
Id(),
|
|
27
|
+
__metadata("design:type", Number)
|
|
28
|
+
], SyncProfile.prototype, "id", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
Field(),
|
|
31
|
+
__metadata("design:type", String)
|
|
32
|
+
], SyncProfile.prototype, "bio", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
Field({ reference: () => SyncUser }),
|
|
35
|
+
__metadata("design:type", Number)
|
|
36
|
+
], SyncProfile.prototype, "userId", void 0);
|
|
37
|
+
SyncProfile = __decorate([
|
|
38
|
+
Entity()
|
|
39
|
+
], SyncProfile);
|
|
40
|
+
describe('Migrator autoSync Integration', () => {
|
|
41
|
+
let migrator;
|
|
42
|
+
let pool;
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
// Mock pool and querier for testing
|
|
45
|
+
const querier = {
|
|
46
|
+
run: jest.fn().mockResolvedValue({}),
|
|
47
|
+
all: jest.fn().mockResolvedValue([]),
|
|
48
|
+
beginTransaction: jest.fn().mockResolvedValue(undefined),
|
|
49
|
+
commitTransaction: jest.fn().mockResolvedValue(undefined),
|
|
50
|
+
rollbackTransaction: jest.fn().mockResolvedValue(undefined),
|
|
51
|
+
release: jest.fn().mockResolvedValue(undefined),
|
|
52
|
+
dialect: {
|
|
53
|
+
escapeIdChar: '"',
|
|
54
|
+
placeholder: jest.fn().mockReturnValue('?'),
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
pool = {
|
|
58
|
+
getQuerier: jest.fn().mockResolvedValue(querier),
|
|
59
|
+
dialect: 'postgres',
|
|
60
|
+
};
|
|
61
|
+
migrator = new Migrator(pool, {
|
|
62
|
+
entities: [SyncUser, SyncProfile],
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it('should generate create statements for new tables', async () => {
|
|
66
|
+
// Mock introspector to return nothing
|
|
67
|
+
const introspector = {
|
|
68
|
+
getTableSchema: jest.fn().mockResolvedValue(undefined),
|
|
69
|
+
getTableNames: jest.fn().mockResolvedValue([]),
|
|
70
|
+
tableExists: jest.fn().mockResolvedValue(false),
|
|
71
|
+
};
|
|
72
|
+
migrator.schemaIntrospector = introspector;
|
|
73
|
+
await migrator.autoSync({ logging: true });
|
|
74
|
+
const querier = (await pool.getQuerier());
|
|
75
|
+
expect(querier.run).toHaveBeenCalledWith(expect.stringContaining('CREATE TABLE "SyncUser"'));
|
|
76
|
+
expect(querier.run).toHaveBeenCalledWith(expect.stringContaining('CREATE TABLE "SyncProfile"'));
|
|
77
|
+
});
|
|
78
|
+
it('should generate alter statements for missing columns', async () => {
|
|
79
|
+
// Mock introspector to return existing table with one column missing
|
|
80
|
+
const introspector = {
|
|
81
|
+
getTableSchema: jest.fn().mockImplementation((name) => {
|
|
82
|
+
if (name === 'SyncUser') {
|
|
83
|
+
return Promise.resolve({
|
|
84
|
+
name: 'SyncUser',
|
|
85
|
+
columns: [
|
|
86
|
+
{
|
|
87
|
+
name: 'id',
|
|
88
|
+
type: 'INTEGER',
|
|
89
|
+
nullable: false,
|
|
90
|
+
isPrimaryKey: true,
|
|
91
|
+
isAutoIncrement: true,
|
|
92
|
+
isUnique: false,
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return Promise.resolve(undefined);
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
migrator.schemaIntrospector = introspector;
|
|
101
|
+
await migrator.autoSync({ logging: true });
|
|
102
|
+
const querier = (await pool.getQuerier());
|
|
103
|
+
expect(querier.run).toHaveBeenCalledWith(expect.stringContaining('ALTER TABLE "SyncUser" ADD COLUMN "name" VARCHAR(255)'));
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRlL21pZ3JhdG9yLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekMsSUFBTSxRQUFRLEdBQWQsTUFBTSxRQUFRO0lBQ04sRUFBRSxDQUFVO0lBQ1QsSUFBSSxDQUFVO0NBQ3hCLENBQUE7QUFGTztJQUFMLEVBQUUsRUFBRTs7b0NBQWE7QUFDVDtJQUFSLEtBQUssRUFBRTs7c0NBQWU7QUFGbkIsUUFBUTtJQURiLE1BQU0sRUFBRTtHQUNILFFBQVEsQ0FHYjtBQUdELElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7SUFDVCxFQUFFLENBQVU7SUFDVCxHQUFHLENBQVU7SUFDZ0IsTUFBTSxDQUFVO0NBQ3ZELENBQUE7QUFITztJQUFMLEVBQUUsRUFBRTs7dUNBQWE7QUFDVDtJQUFSLEtBQUssRUFBRTs7d0NBQWM7QUFDZ0I7SUFBckMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDOzsyQ0FBaUI7QUFIbEQsV0FBVztJQURoQixNQUFNLEVBQUU7R0FDSCxXQUFXLENBSWhCO0FBRUQsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtJQUM3QyxJQUFJLFFBQWtCLENBQUM7SUFDdkIsSUFBSSxJQUFpQixDQUFDO0lBRXRCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxvQ0FBb0M7UUFDcEMsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLEVBQUUsSUFBSSxD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TyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQztTQUNILENBQUM7UUFDRixRQUFRLENBQUMsa0JBQWtCLEdBQUcsWUFBbUIsQ0FBQztRQUVsRCxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUzQyxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFlLENBQUM7UUFDeEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FDdEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHVEQUF1RCxDQUFDLENBQ2pGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIGplc3QgfSBmcm9tICdidW46dGVzdCc7XG5pbXBvcnQgeyBFbnRpdHksIEZpZWxkLCBJZCB9IGZyb20gJy4uL2VudGl0eS9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJpZXJQb29sLCBTcWxRdWVyaWVyLCBUYWJsZVNjaGVtYSB9IGZyb20gJy4uL3R5cGUvaW5kZXguanMnO1xuaW1wb3J0IHsgTWlncmF0b3IgfSBmcm9tICcuL21pZ3JhdG9yLmpzJztcblxuQEVudGl0eSgpXG5jbGFzcyBTeW5jVXNlciB7XG4gIEBJZCgpIGlkPzogbnVtYmVyO1xuICBARmllbGQoKSBuYW1lPzogc3RyaW5nO1xufVxuXG5ARW50aXR5KClcbmNsYXNzIFN5bmNQcm9maWxlIHtcbiAgQElkKCkgaWQ/OiBudW1iZXI7XG4gIEBGaWVsZCgpIGJpbz86IHN0cmluZztcbiAgQEZpZWxkKHsgcmVmZXJlbmNlOiAoKSA9PiBTeW5jVXNlciB9KSB1c2VySWQ/OiBudW1iZXI7XG59XG5cbmRlc2NyaWJlKCdNaWdyYXRvciBhdXRvU3luYyBJbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgbGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcbiAgbGV0IHBvb2w6IFF1ZXJpZXJQb29sO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIC8vIE1vY2sgcG9vbCBhbmQgcXVlcmllciBmb3IgdGVzdGluZ1xuICAgIGNvbnN0IHF1ZXJpZXIgPSB7XG4gICAgICBydW46IGplc3QuZm48YW55PigpLm1vY2tSZXNvbHZlZFZhbHVlKHt9KSxcbiAgICAgIGFsbDogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUoW10pLFxuICAgICAgYmVnaW5UcmFuc2FjdGlvbjogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgIGNvbW1pdFRyYW5zYWN0aW9uOiBqZXN0LmZuPGFueT4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpLFxuICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgIHJlbGVhc2U6IGplc3QuZm48YW55PigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICBkaWFsZWN0OiB7XG4gICAgICAgIGVzY2FwZUlkQ2hhcjogJ1wiJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IGplc3QuZm48YW55PigpLm1vY2tSZXR1cm5WYWx1ZSgnPycpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHBvb2wgPSB7XG4gICAgICBnZXRRdWVyaWVyOiBqZXN0LmZuPGFueT4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShxdWVyaWVyKSxcbiAgICAgIGRpYWxlY3Q6ICdwb3N0Z3JlcycsXG4gICAgfSBhcyB1bmtub3duIGFzIFF1ZXJpZXJQb29sO1xuXG4gICAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IocG9vbCwge1xuICAgICAgZW50aXRpZXM6IFtTeW5jVXNlciwgU3luY1Byb2ZpbGVdLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGNyZWF0ZSBzdGF0ZW1lbnRzIGZvciBuZXcgdGFibGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIE1vY2sgaW50cm9zcGVjdG9yIHRvIHJldHVybiBub3RoaW5nXG4gICAgY29uc3QgaW50cm9zcGVjdG9yID0ge1xuICAgICAgZ2V0VGFibGVTY2hlbWE6IGplc3QuZm48YW55PigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICBnZXRUYWJsZU5hbWVzOiBqZXN0LmZuPGFueT4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSksXG4gICAgICB0YWJsZUV4aXN0czogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgIH07XG4gICAgbWlncmF0b3Iuc2NoZW1hSW50cm9zcGVjdG9yID0gaW50cm9zcGVjdG9yIGFzIGFueTtcblxuICAgIGF3YWl0IG1pZ3JhdG9yLmF1dG9TeW5jKHsgbG9nZ2luZzogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHF1ZXJpZXIgPSAoYXdhaXQgcG9vbC5nZXRRdWVyaWVyKCkpIGFzIFNxbFF1ZXJpZXI7XG4gICAgZXhwZWN0KHF1ZXJpZXIucnVuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZygnQ1JFQVRFIFRBQkxFIFwiU3luY1VzZXJcIicpKTtcbiAgICBleHBlY3QocXVlcmllci5ydW4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdDUkVBVEUgVEFCTEUgXCJTeW5jUHJvZmlsZVwiJykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGFsdGVyIHN0YXRlbWVudHMgZm9yIG1pc3NpbmcgY29sdW1ucycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBNb2NrIGludHJvc3BlY3RvciB0byByZXR1cm4gZXhpc3RpbmcgdGFibGUgd2l0aCBvbmUgY29sdW1uIG1pc3NpbmdcbiAgICBjb25zdCBpbnRyb3NwZWN0b3IgPSB7XG4gICAgICBnZXRUYWJsZVNjaGVtYTogamVzdC5mbjxhbnk+KCkubW9ja0ltcGxlbWVudGF0aW9uKChuYW1lOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdTeW5jVXNlcicpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgIG5hbWU6ICdTeW5jVXNlcicsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdJTlRFR0VSJyxcbiAgICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5S2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzQXV0b0luY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1VuaXF1ZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0gYXMgVGFibGVTY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH0pLFxuICAgIH07XG4gICAgbWlncmF0b3Iuc2NoZW1hSW50cm9zcGVjdG9yID0gaW50cm9zcGVjdG9yIGFzIGFueTtcblxuICAgIGF3YWl0IG1pZ3JhdG9yLmF1dG9TeW5jKHsgbG9nZ2luZzogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHF1ZXJpZXIgPSAoYXdhaXQgcG9vbC5nZXRRdWVyaWVyKCkpIGFzIFNxbFF1ZXJpZXI7XG4gICAgZXhwZWN0KHF1ZXJpZXIucnVuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdBTFRFUiBUQUJMRSBcIlN5bmNVc2VyXCIgQUREIENPTFVNTiBcIm5hbWVcIiBWQVJDSEFSKDI1NSknKSxcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { AbstractDialect } from '../dialect/index.js';
|
|
2
|
+
import type { ColumnSchema, ColumnType, EntityMeta, FieldOptions, IndexSchema, NamingStrategy, SchemaDiff, SchemaGenerator, TableSchema, Type } from '../type/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base class for SQL schema generation
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class AbstractSchemaGenerator extends AbstractDialect implements SchemaGenerator {
|
|
7
|
+
protected readonly escapeIdChar: '`' | '"';
|
|
8
|
+
/**
|
|
9
|
+
* Primary key type for auto-increment integer IDs
|
|
10
|
+
*/
|
|
11
|
+
protected abstract readonly serialPrimaryKeyType: string;
|
|
12
|
+
constructor(namingStrategy?: NamingStrategy, escapeIdChar?: '`' | '"');
|
|
13
|
+
/**
|
|
14
|
+
* Escape an identifier (table name, column name, etc.)
|
|
15
|
+
*/
|
|
16
|
+
protected escapeId(identifier: string): string;
|
|
17
|
+
generateCreateTable<E>(entity: Type<E>, options?: {
|
|
18
|
+
ifNotExists?: boolean;
|
|
19
|
+
}): string;
|
|
20
|
+
generateDropTable<E>(entity: Type<E>): string;
|
|
21
|
+
generateAlterTable(diff: SchemaDiff): string[];
|
|
22
|
+
generateAlterTableDown(diff: SchemaDiff): string[];
|
|
23
|
+
generateCreateIndex(tableName: string, index: IndexSchema): string;
|
|
24
|
+
generateDropIndex(tableName: string, indexName: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Generate column definitions from entity metadata
|
|
27
|
+
*/
|
|
28
|
+
generateColumnDefinitions<E>(meta: EntityMeta<E>): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Generate a single column definition
|
|
31
|
+
*/
|
|
32
|
+
generateColumnDefinition<E>(fieldKey: string, field: FieldOptions, meta: EntityMeta<E>): string;
|
|
33
|
+
/**
|
|
34
|
+
* Generate column definition from a ColumnSchema object
|
|
35
|
+
*/
|
|
36
|
+
generateColumnDefinitionFromSchema(column: ColumnSchema): string;
|
|
37
|
+
/**
|
|
38
|
+
* Generate table constraints (indexes, foreign keys, etc.)
|
|
39
|
+
*/
|
|
40
|
+
generateTableConstraints<E>(meta: EntityMeta<E>): string[];
|
|
41
|
+
getSqlType(field: FieldOptions, fieldType?: unknown): string;
|
|
42
|
+
/**
|
|
43
|
+
* Map uql column type to database-specific SQL type
|
|
44
|
+
*/
|
|
45
|
+
abstract mapColumnType(columnType: ColumnType, field: FieldOptions): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get the boolean type for this database
|
|
48
|
+
*/
|
|
49
|
+
abstract getBooleanType(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Generate ALTER COLUMN statements (database-specific)
|
|
52
|
+
*/
|
|
53
|
+
abstract generateAlterColumnStatements(tableName: string, column: ColumnSchema, newDefinition: string): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Get table options (e.g., ENGINE for MySQL)
|
|
56
|
+
*/
|
|
57
|
+
getTableOptions<E>(meta: EntityMeta<E>): string;
|
|
58
|
+
/**
|
|
59
|
+
* Generate column comment clause (if supported)
|
|
60
|
+
*/
|
|
61
|
+
abstract generateColumnComment(tableName: string, columnName: string, comment: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Format a default value for SQL
|
|
64
|
+
*/
|
|
65
|
+
formatDefaultValue(value: unknown): string;
|
|
66
|
+
/**
|
|
67
|
+
* Compare two schemas and return the differences
|
|
68
|
+
*/
|
|
69
|
+
diffSchema<E>(entity: Type<E>, currentSchema: TableSchema | undefined): SchemaDiff | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Convert field options to ColumnSchema
|
|
72
|
+
*/
|
|
73
|
+
protected fieldToColumnSchema<E>(fieldKey: string, field: FieldOptions, meta: EntityMeta<E>): ColumnSchema;
|
|
74
|
+
/**
|
|
75
|
+
* Check if two columns differ enough to require alteration
|
|
76
|
+
*/
|
|
77
|
+
protected columnsNeedAlteration(current: ColumnSchema, desired: ColumnSchema): boolean;
|
|
78
|
+
}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { AbstractDialect } from '../dialect/index.js';
|
|
2
|
+
import { getMeta } from '../entity/index.js';
|
|
3
|
+
import { escapeSqlId, getKeys } from '../util/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base class for SQL schema generation
|
|
6
|
+
*/
|
|
7
|
+
export class AbstractSchemaGenerator extends AbstractDialect {
|
|
8
|
+
escapeIdChar;
|
|
9
|
+
constructor(namingStrategy, escapeIdChar = '`') {
|
|
10
|
+
super(namingStrategy);
|
|
11
|
+
this.escapeIdChar = escapeIdChar;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Escape an identifier (table name, column name, etc.)
|
|
15
|
+
*/
|
|
16
|
+
escapeId(identifier) {
|
|
17
|
+
return escapeSqlId(identifier, this.escapeIdChar);
|
|
18
|
+
}
|
|
19
|
+
generateCreateTable(entity, options = {}) {
|
|
20
|
+
const meta = getMeta(entity);
|
|
21
|
+
const tableName = this.resolveTableName(entity, meta);
|
|
22
|
+
const columns = this.generateColumnDefinitions(meta);
|
|
23
|
+
const constraints = this.generateTableConstraints(meta);
|
|
24
|
+
const ifNotExists = options.ifNotExists ? 'IF NOT EXISTS ' : '';
|
|
25
|
+
let sql = `CREATE TABLE ${ifNotExists}${this.escapeId(tableName)} (\n`;
|
|
26
|
+
sql += columns.map((col) => ` ${col}`).join(',\n');
|
|
27
|
+
if (constraints.length > 0) {
|
|
28
|
+
sql += ',\n';
|
|
29
|
+
sql += constraints.map((c) => ` ${c}`).join(',\n');
|
|
30
|
+
}
|
|
31
|
+
sql += '\n)';
|
|
32
|
+
sql += this.getTableOptions(meta);
|
|
33
|
+
sql += ';';
|
|
34
|
+
return sql;
|
|
35
|
+
}
|
|
36
|
+
generateDropTable(entity) {
|
|
37
|
+
const meta = getMeta(entity);
|
|
38
|
+
const tableName = this.resolveTableName(entity, meta);
|
|
39
|
+
return `DROP TABLE IF EXISTS ${this.escapeId(tableName)};`;
|
|
40
|
+
}
|
|
41
|
+
generateAlterTable(diff) {
|
|
42
|
+
const statements = [];
|
|
43
|
+
const tableName = this.escapeId(diff.tableName);
|
|
44
|
+
// Add new columns
|
|
45
|
+
if (diff.columnsToAdd?.length) {
|
|
46
|
+
for (const column of diff.columnsToAdd) {
|
|
47
|
+
const colDef = this.generateColumnDefinitionFromSchema(column);
|
|
48
|
+
statements.push(`ALTER TABLE ${tableName} ADD COLUMN ${colDef};`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Alter existing columns
|
|
52
|
+
if (diff.columnsToAlter?.length) {
|
|
53
|
+
for (const { to } of diff.columnsToAlter) {
|
|
54
|
+
const colDef = this.generateColumnDefinitionFromSchema(to);
|
|
55
|
+
const colStatements = this.generateAlterColumnStatements(diff.tableName, to, colDef);
|
|
56
|
+
statements.push(...colStatements);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Drop columns
|
|
60
|
+
if (diff.columnsToDrop?.length) {
|
|
61
|
+
for (const columnName of diff.columnsToDrop) {
|
|
62
|
+
statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.escapeId(columnName)};`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Add indexes
|
|
66
|
+
if (diff.indexesToAdd?.length) {
|
|
67
|
+
for (const index of diff.indexesToAdd) {
|
|
68
|
+
statements.push(this.generateCreateIndex(diff.tableName, index));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Drop indexes
|
|
72
|
+
if (diff.indexesToDrop?.length) {
|
|
73
|
+
for (const indexName of diff.indexesToDrop) {
|
|
74
|
+
statements.push(this.generateDropIndex(diff.tableName, indexName));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return statements;
|
|
78
|
+
}
|
|
79
|
+
generateAlterTableDown(diff) {
|
|
80
|
+
const statements = [];
|
|
81
|
+
const tableName = this.escapeId(diff.tableName);
|
|
82
|
+
// Rollback additions by dropping columns
|
|
83
|
+
if (diff.columnsToAdd?.length) {
|
|
84
|
+
for (const column of diff.columnsToAdd) {
|
|
85
|
+
statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.escapeId(column.name)};`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return statements;
|
|
89
|
+
}
|
|
90
|
+
generateCreateIndex(tableName, index) {
|
|
91
|
+
const unique = index.unique ? 'UNIQUE ' : '';
|
|
92
|
+
const columns = index.columns.map((c) => this.escapeId(c)).join(', ');
|
|
93
|
+
return `CREATE ${unique}INDEX ${this.escapeId(index.name)} ON ${this.escapeId(tableName)} (${columns});`;
|
|
94
|
+
}
|
|
95
|
+
generateDropIndex(tableName, indexName) {
|
|
96
|
+
return `DROP INDEX IF EXISTS ${this.escapeId(indexName)};`;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Generate column definitions from entity metadata
|
|
100
|
+
*/
|
|
101
|
+
generateColumnDefinitions(meta) {
|
|
102
|
+
const columns = [];
|
|
103
|
+
const fieldKeys = getKeys(meta.fields);
|
|
104
|
+
for (const key of fieldKeys) {
|
|
105
|
+
const field = meta.fields[key];
|
|
106
|
+
if (field?.virtual)
|
|
107
|
+
continue; // Skip virtual fields
|
|
108
|
+
const colDef = this.generateColumnDefinition(key, field, meta);
|
|
109
|
+
columns.push(colDef);
|
|
110
|
+
}
|
|
111
|
+
return columns;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Generate a single column definition
|
|
115
|
+
*/
|
|
116
|
+
generateColumnDefinition(fieldKey, field, meta) {
|
|
117
|
+
const columnName = this.escapeId(this.resolveColumnName(fieldKey, field));
|
|
118
|
+
const isId = field.isId === true;
|
|
119
|
+
const isPrimaryKey = isId && meta.id === fieldKey;
|
|
120
|
+
// Determine SQL type
|
|
121
|
+
let sqlType;
|
|
122
|
+
if (isPrimaryKey && field.autoIncrement !== false && !field.onInsert) {
|
|
123
|
+
// Auto-increment primary key
|
|
124
|
+
sqlType = this.serialPrimaryKeyType;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
sqlType = this.getSqlType(field, field.type);
|
|
128
|
+
}
|
|
129
|
+
let definition = `${columnName} ${sqlType}`;
|
|
130
|
+
// PRIMARY KEY constraint (for non-serial types)
|
|
131
|
+
if (isPrimaryKey && !sqlType.includes('PRIMARY KEY')) {
|
|
132
|
+
definition += ' PRIMARY KEY';
|
|
133
|
+
}
|
|
134
|
+
// NULL/NOT NULL
|
|
135
|
+
if (!isPrimaryKey) {
|
|
136
|
+
const nullable = field.nullable ?? true;
|
|
137
|
+
if (!nullable) {
|
|
138
|
+
definition += ' NOT NULL';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// UNIQUE constraint
|
|
142
|
+
if (field.unique && !isPrimaryKey) {
|
|
143
|
+
definition += ' UNIQUE';
|
|
144
|
+
}
|
|
145
|
+
// DEFAULT value
|
|
146
|
+
if (field.defaultValue !== undefined) {
|
|
147
|
+
definition += ` DEFAULT ${this.formatDefaultValue(field.defaultValue)}`;
|
|
148
|
+
}
|
|
149
|
+
// COMMENT (if supported)
|
|
150
|
+
if (field.comment) {
|
|
151
|
+
definition += this.generateColumnComment(this.resolveTableName(meta.entity, meta), this.resolveColumnName(fieldKey, field), field.comment);
|
|
152
|
+
}
|
|
153
|
+
return definition;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Generate column definition from a ColumnSchema object
|
|
157
|
+
*/
|
|
158
|
+
generateColumnDefinitionFromSchema(column) {
|
|
159
|
+
const columnName = this.escapeId(column.name);
|
|
160
|
+
let type = column.type;
|
|
161
|
+
if (column.length && !type.includes('(')) {
|
|
162
|
+
type = `${type}(${column.length})`;
|
|
163
|
+
}
|
|
164
|
+
else if (column.precision !== undefined && !type.includes('(')) {
|
|
165
|
+
if (column.scale !== undefined) {
|
|
166
|
+
type = `${type}(${column.precision}, ${column.scale})`;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
type = `${type}(${column.precision})`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
let definition = `${columnName} ${type}`;
|
|
173
|
+
if (column.isPrimaryKey) {
|
|
174
|
+
definition += ' PRIMARY KEY';
|
|
175
|
+
}
|
|
176
|
+
if (!column.nullable && !column.isPrimaryKey) {
|
|
177
|
+
definition += ' NOT NULL';
|
|
178
|
+
}
|
|
179
|
+
if (column.isUnique && !column.isPrimaryKey) {
|
|
180
|
+
definition += ' UNIQUE';
|
|
181
|
+
}
|
|
182
|
+
if (column.defaultValue !== undefined) {
|
|
183
|
+
definition += ` DEFAULT ${this.formatDefaultValue(column.defaultValue)}`;
|
|
184
|
+
}
|
|
185
|
+
return definition;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Generate table constraints (indexes, foreign keys, etc.)
|
|
189
|
+
*/
|
|
190
|
+
generateTableConstraints(meta) {
|
|
191
|
+
const constraints = [];
|
|
192
|
+
const fieldKeys = getKeys(meta.fields);
|
|
193
|
+
const tableName = this.resolveTableName(meta.entity, meta);
|
|
194
|
+
// Generate indexes from field options
|
|
195
|
+
for (const key of fieldKeys) {
|
|
196
|
+
const field = meta.fields[key];
|
|
197
|
+
if (field?.index) {
|
|
198
|
+
const columnName = this.resolveColumnName(key, field);
|
|
199
|
+
const indexName = typeof field.index === 'string' ? field.index : `idx_${tableName}_${columnName}`;
|
|
200
|
+
constraints.push(`INDEX ${this.escapeId(indexName)} (${this.escapeId(columnName)})`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Generate foreign key constraints from references
|
|
204
|
+
for (const key of fieldKeys) {
|
|
205
|
+
const field = meta.fields[key];
|
|
206
|
+
if (field?.reference) {
|
|
207
|
+
const refEntity = field.reference();
|
|
208
|
+
const refMeta = getMeta(refEntity);
|
|
209
|
+
const refIdField = refMeta.fields[refMeta.id];
|
|
210
|
+
const columnName = this.resolveColumnName(key, field);
|
|
211
|
+
const refTableName = this.resolveTableName(refEntity, refMeta);
|
|
212
|
+
const refColumnName = this.resolveColumnName(refMeta.id, refIdField);
|
|
213
|
+
const fkName = `fk_${tableName}_${columnName}`;
|
|
214
|
+
constraints.push(`CONSTRAINT ${this.escapeId(fkName)} FOREIGN KEY (${this.escapeId(columnName)}) ` +
|
|
215
|
+
`REFERENCES ${this.escapeId(refTableName)} (${this.escapeId(refColumnName)})`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return constraints;
|
|
219
|
+
}
|
|
220
|
+
getSqlType(field, fieldType) {
|
|
221
|
+
// Use explicit column type if specified
|
|
222
|
+
if (field.columnType) {
|
|
223
|
+
return this.mapColumnType(field.columnType, field);
|
|
224
|
+
}
|
|
225
|
+
// Handle special types
|
|
226
|
+
if (field.type === 'json' || field.type === 'jsonb') {
|
|
227
|
+
return this.mapColumnType(field.type, field);
|
|
228
|
+
}
|
|
229
|
+
if (field.type === 'vector') {
|
|
230
|
+
return this.mapColumnType('vector', field);
|
|
231
|
+
}
|
|
232
|
+
// Infer from TypeScript type
|
|
233
|
+
const type = fieldType ?? field.type;
|
|
234
|
+
if (type === Number || type === 'number') {
|
|
235
|
+
return field.precision ? this.mapColumnType('decimal', field) : 'BIGINT';
|
|
236
|
+
}
|
|
237
|
+
if (type === String || type === 'string') {
|
|
238
|
+
const length = field.length ?? 255;
|
|
239
|
+
return `VARCHAR(${length})`;
|
|
240
|
+
}
|
|
241
|
+
if (type === Boolean || type === 'boolean') {
|
|
242
|
+
return this.getBooleanType();
|
|
243
|
+
}
|
|
244
|
+
if (type === Date || type === 'date') {
|
|
245
|
+
return 'TIMESTAMP';
|
|
246
|
+
}
|
|
247
|
+
if (type === BigInt || type === 'bigint') {
|
|
248
|
+
return 'BIGINT';
|
|
249
|
+
}
|
|
250
|
+
// Default to VARCHAR
|
|
251
|
+
return `VARCHAR(${field.length ?? 255})`;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get table options (e.g., ENGINE for MySQL)
|
|
255
|
+
*/
|
|
256
|
+
getTableOptions(meta) {
|
|
257
|
+
return '';
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Format a default value for SQL
|
|
261
|
+
*/
|
|
262
|
+
formatDefaultValue(value) {
|
|
263
|
+
if (value === null) {
|
|
264
|
+
return 'NULL';
|
|
265
|
+
}
|
|
266
|
+
if (typeof value === 'string') {
|
|
267
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
268
|
+
}
|
|
269
|
+
if (typeof value === 'boolean') {
|
|
270
|
+
return value ? 'TRUE' : 'FALSE';
|
|
271
|
+
}
|
|
272
|
+
if (typeof value === 'number' || typeof value === 'bigint') {
|
|
273
|
+
return String(value);
|
|
274
|
+
}
|
|
275
|
+
if (value instanceof Date) {
|
|
276
|
+
return `'${value.toISOString()}'`;
|
|
277
|
+
}
|
|
278
|
+
return String(value);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Compare two schemas and return the differences
|
|
282
|
+
*/
|
|
283
|
+
diffSchema(entity, currentSchema) {
|
|
284
|
+
const meta = getMeta(entity);
|
|
285
|
+
if (!currentSchema) {
|
|
286
|
+
// Table doesn't exist, need to create
|
|
287
|
+
return {
|
|
288
|
+
tableName: this.resolveTableName(entity, meta),
|
|
289
|
+
type: 'create',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
const columnsToAdd = [];
|
|
293
|
+
const columnsToAlter = [];
|
|
294
|
+
const columnsToDrop = [];
|
|
295
|
+
const currentColumns = new Map(currentSchema.columns.map((c) => [c.name, c]));
|
|
296
|
+
const fieldKeys = getKeys(meta.fields);
|
|
297
|
+
// Check for new or altered columns
|
|
298
|
+
for (const key of fieldKeys) {
|
|
299
|
+
const field = meta.fields[key];
|
|
300
|
+
if (field?.virtual)
|
|
301
|
+
continue;
|
|
302
|
+
const columnName = this.resolveColumnName(key, field);
|
|
303
|
+
const currentColumn = currentColumns.get(columnName);
|
|
304
|
+
if (!currentColumn) {
|
|
305
|
+
// Column needs to be added
|
|
306
|
+
columnsToAdd.push(this.fieldToColumnSchema(key, field, meta));
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
// Check if column needs alteration
|
|
310
|
+
const desiredColumn = this.fieldToColumnSchema(key, field, meta);
|
|
311
|
+
if (this.columnsNeedAlteration(currentColumn, desiredColumn)) {
|
|
312
|
+
columnsToAlter.push({ from: currentColumn, to: desiredColumn });
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
currentColumns.delete(columnName);
|
|
316
|
+
}
|
|
317
|
+
// Remaining columns in currentColumns should be dropped
|
|
318
|
+
for (const [name] of currentColumns) {
|
|
319
|
+
columnsToDrop.push(name);
|
|
320
|
+
}
|
|
321
|
+
if (columnsToAdd.length === 0 && columnsToAlter.length === 0 && columnsToDrop.length === 0) {
|
|
322
|
+
return undefined; // No changes needed
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
tableName: this.resolveTableName(entity, meta),
|
|
326
|
+
type: 'alter',
|
|
327
|
+
columnsToAdd: columnsToAdd.length > 0 ? columnsToAdd : undefined,
|
|
328
|
+
columnsToAlter: columnsToAlter.length > 0 ? columnsToAlter : undefined,
|
|
329
|
+
columnsToDrop: columnsToDrop.length > 0 ? columnsToDrop : undefined,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Convert field options to ColumnSchema
|
|
334
|
+
*/
|
|
335
|
+
fieldToColumnSchema(fieldKey, field, meta) {
|
|
336
|
+
const isId = field.isId === true;
|
|
337
|
+
const isPrimaryKey = isId && meta.id === fieldKey;
|
|
338
|
+
return {
|
|
339
|
+
name: this.resolveColumnName(fieldKey, field),
|
|
340
|
+
type: this.getSqlType(field, field.type),
|
|
341
|
+
nullable: field.nullable ?? !isPrimaryKey,
|
|
342
|
+
defaultValue: field.defaultValue,
|
|
343
|
+
isPrimaryKey,
|
|
344
|
+
isAutoIncrement: isPrimaryKey && field.autoIncrement !== false && !field.onInsert,
|
|
345
|
+
isUnique: field.unique ?? false,
|
|
346
|
+
length: field.length,
|
|
347
|
+
precision: field.precision,
|
|
348
|
+
scale: field.scale,
|
|
349
|
+
comment: field.comment,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Check if two columns differ enough to require alteration
|
|
354
|
+
*/
|
|
355
|
+
columnsNeedAlteration(current, desired) {
|
|
356
|
+
// Compare relevant properties
|
|
357
|
+
return (current.type.toLowerCase() !== desired.type.toLowerCase() ||
|
|
358
|
+
current.nullable !== desired.nullable ||
|
|
359
|
+
current.isUnique !== desired.isUnique ||
|
|
360
|
+
JSON.stringify(current.defaultValue) !== JSON.stringify(desired.defaultValue));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hR2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGUvc2NoZW1hR2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFjN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV4RDs7R0FFRztBQUNILE1BQU0sT0FBZ0IsdUJBQXdCLFNBQVEsZUFBZTtJQVE5QztJQUZyQixZQUNFLGNBQStCLEVBQ1osZUFBMEIsR0FBRztRQUVoRCxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFGSCxpQkFBWSxHQUFaLFlBQVksQ0FBaUI7SUFHbEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sUUFBUSxDQUFDLFVBQWtCO1FBQ25DLE9BQU8sV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG1CQUFtQixDQUFJLE1BQWUsRUFBRSxVQUFxQyxFQUFFO1FBQzdFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxJQUFJLEdBQUcsR0FBRyxnQkFBZ0Is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cUIsRUFBRSxPQUFxQjtRQUMxRSw4QkFBOEI7UUFDOUIsT0FBTyxDQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDekQsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUTtZQUNyQyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRO1lBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUM5RSxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3REaWFsZWN0IH0gZnJvbSAnLi4vZGlhbGVjdC9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNZXRhIH0gZnJvbSAnLi4vZW50aXR5L2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29sdW1uU2NoZW1hLFxuICBDb2x1bW5UeXBlLFxuICBFbnRpdHlNZXRhLFxuICBGaWVsZEtleSxcbiAgRmllbGRPcHRpb25zLFxuICBJbmRleFNjaGVtYSxcbiAgTmFtaW5nU3RyYXRlZ3ksXG4gIFNjaGVtYURpZmYsXG4gIFNjaGVtYUdlbmVyYXRvcixcbiAgVGFibGVTY2hlbWEsXG4gIFR5cGUsXG59IGZyb20gJy4uL3R5cGUvaW5kZXguanMnO1xuaW1wb3J0IHsgZXNjYXBlU3FsSWQsIGdldEtleXMgfSBmcm9tICcuLi91dGlsL2luZGV4LmpzJztcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBTUUwgc2NoZW1hIGdlbmVyYXRpb25cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2NoZW1hR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFsZWN0IGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdG9yIHtcbiAgLyoqXG4gICAqIFByaW1hcnkga2V5IHR5cGUgZm9yIGF1dG8taW5jcmVtZW50IGludGVnZXIgSURzXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgc2VyaWFsUHJpbWFyeUtleVR5cGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1pbmdTdHJhdGVneT86IE5hbWluZ1N0cmF0ZWd5LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBlc2NhcGVJZENoYXI6ICdgJyB8ICdcIicgPSAnYCcsXG4gICkge1xuICAgIHN1cGVyKG5hbWluZ1N0cmF0ZWd5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgYW4gaWRlbnRpZmllciAodGFibGUgbmFtZSwgY29sdW1uIG5hbWUsIGV0Yy4pXG4gICAqL1xuICBwcm90ZWN0ZWQgZXNjYXBlSWQoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZXNjYXBlU3FsSWQoaWRlbnRpZmllciwgdGhpcy5lc2NhcGVJZENoYXIpO1xuICB9XG5cbiAgZ2VuZXJhdGVDcmVhdGVUYWJsZTxFPihlbnRpdHk6IFR5cGU8RT4sIG9wdGlvbnM6IHsgaWZOb3RFeGlzdHM/OiBib29sZWFuIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLnJlc29sdmVUYWJsZU5hbWUoZW50aXR5LCBtZXRhKTtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZW5lcmF0ZUNvbHVtbkRlZmluaXRpb25zKG1ldGEpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdGhpcy5nZW5lcmF0ZVRhYmxlQ29uc3RyYWludHMobWV0YSk7XG5cbiAgICBjb25zdCBpZk5vdEV4aXN0cyA9IG9wdGlvbnMuaWZOb3RFeGlzdHMgPyAnSUYgTk9UIEVYSVNUUyAnIDogJyc7XG4gICAgbGV0IHNxbCA9IGBDUkVBVEUgVEFCTEUgJHtpZk5vdEV4aXN0c30ke3RoaXMuZXNjYXBlSWQodGFibGVOYW1lKX0gKFxcbmA7XG4gICAgc3FsICs9IGNvbHVtbnMubWFwKChjb2wpID0+IGAgICR7Y29sfWApLmpvaW4oJyxcXG4nKTtcblxuICAgIGlmIChjb25zdHJhaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBzcWwgKz0gJyxcXG4nO1xuICAgICAgc3FsICs9IGNvbnN0cmFpbnRzLm1hcCgoYzogYW55KSA9PiBgICAke2N9YCkuam9pbignLFxcbicpO1xuICAgIH1cblxuICAgIHNxbCArPSAnXFxuKSc7XG4gICAgc3FsICs9IHRoaXMuZ2V0VGFibGVPcHRpb25zKG1ldGEpO1xuICAgIHNxbCArPSAnOyc7XG5cbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgZ2VuZXJhdGVEcm9wVGFibGU8RT4oZW50aXR5OiBUeXBlPEU+KTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMucmVzb2x2ZVRhYmxlTmFtZShlbnRpdHksIG1ldGEpO1xuICAgIHJldHVybiBgRFJPUCBUQUJMRSBJRiBFWElTVFMgJHt0aGlzLmVzY2FwZUlkKHRhYmxlTmFtZSl9O2A7XG4gIH1cblxuICBnZW5lcmF0ZUFsdGVyVGFibGUoZGlmZjogU2NoZW1hRGlmZik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuZXNjYXBlSWQoZGlmZi50YWJsZU5hbWUpO1xuXG4gICAgLy8gQWRkIG5ldyBjb2x1bW5zXG4gICAgaWYgKGRpZmYuY29sdW1uc1RvQWRkPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGRpZmYuY29sdW1uc1RvQWRkKSB7XG4gICAgICAgIGNvbnN0IGNvbERlZiA9IHRoaXMuZ2VuZXJhdGVDb2x1bW5EZWZpbml0aW9uRnJvbVNjaGVtYShjb2x1bW4pO1xuICAgICAgICBzdGF0ZW1lbnRzLnB1c2goYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBREQgQ09MVU1OICR7Y29sRGVmfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHRlciBleGlzdGluZyBjb2x1bW5zXG4gICAgaWYgKGRpZmYuY29sdW1uc1RvQWx0ZXI/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCB7IHRvIH0gb2YgZGlmZi5jb2x1bW5zVG9BbHRlcikge1xuICAgICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmdlbmVyYXRlQ29sdW1uRGVmaW5pdGlvbkZyb21TY2hlbWEodG8pO1xuICAgICAgICBjb25zdCBjb2xTdGF0ZW1lbnRzID0gdGhpcy5nZW5lcmF0ZUFsdGVyQ29sdW1uU3RhdGVtZW50cyhkaWZmLnRhYmxlTmFtZSwgdG8sIGNvbERlZik7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaCguLi5jb2xTdGF0ZW1lbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcm9wIGNvbHVtbnNcbiAgICBpZiAoZGlmZi5jb2x1bW5zVG9Ecm9wPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBkaWZmLmNvbHVtbnNUb0Ryb3ApIHtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoKGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gRFJPUCBDT0xVTU4gJHt0aGlzLmVzY2FwZUlkKGNvbHVtbk5hbWUpfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaW5kZXhlc1xuICAgIGlmIChkaWZmLmluZGV4ZXNUb0FkZD8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGRpZmYuaW5kZXhlc1RvQWRkKSB7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaCh0aGlzLmdlbmVyYXRlQ3JlYXRlSW5kZXgoZGlmZi50YWJsZU5hbWUsIGluZGV4KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRHJvcCBpbmRleGVzXG4gICAgaWYgKGRpZmYuaW5kZXhlc1RvRHJvcD8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4TmFtZSBvZiBkaWZmLmluZGV4ZXNUb0Ryb3ApIHtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoKHRoaXMuZ2VuZXJhdGVEcm9wSW5kZXgoZGlmZi50YWJsZU5hbWUsIGluZGV4TmFtZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRzO1xuICB9XG5cbiAgZ2VuZXJhdGVBbHRlclRhYmxlRG93bihkaWZmOiBTY2hlbWFEaWZmKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YXRlbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGhpcy5lc2NhcGVJZChkaWZmLnRhYmxlTmFtZSk7XG5cbiAgICAvLyBSb2xsYmFjayBhZGRpdGlvbnMgYnkgZHJvcHBpbmcgY29sdW1uc1xuICAgIGlmIChkaWZmLmNvbHVtbnNUb0FkZD8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBkaWZmLmNvbHVtbnNUb0FkZCkge1xuICAgICAgICBzdGF0ZW1lbnRzLnB1c2goYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBEUk9QIENPTFVNTiAke3RoaXMuZXNjYXBlSWQoY29sdW1uLm5hbWUpfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgfVxuXG4gIGdlbmVyYXRlQ3JlYXRlSW5kZXgodGFibGVOYW1lOiBzdHJpbmcsIGluZGV4OiBJbmRleFNjaGVtYSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlID0gaW5kZXgudW5pcXVlID8gJ1VOSVFVRSAnIDogJyc7XG4gICAgY29uc3QgY29sdW1ucyA9IGluZGV4LmNvbHVtbnMubWFwKChjOiBhbnkpID0+IHRoaXMuZXNjYXBlSWQoYykpLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGBDUkVBVEUgJHt1bmlxdWV9SU5ERVggJHt0aGlzLmVzY2FwZUlkKGluZGV4Lm5hbWUpfSBPTiAke3RoaXMuZXNjYXBlSWQodGFibGVOYW1lKX0gKCR7Y29sdW1uc30pO2A7XG4gIH1cblxuICBnZW5lcmF0ZURyb3BJbmRleCh0YWJsZU5hbWU6IHN0cmluZywgaW5kZXhOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRFJPUCBJTkRFWCBJRiBFWElTVFMgJHt0aGlzLmVzY2FwZUlkKGluZGV4TmFtZSl9O2A7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gZW50aXR5IG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDb2x1bW5EZWZpbml0aW9uczxFPihtZXRhOiBFbnRpdHlNZXRhPEU+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZmllbGRLZXlzID0gZ2V0S2V5cyhtZXRhLmZpZWxkcykgYXMgRmllbGRLZXk8RT5bXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkS2V5cykge1xuICAgICAgY29uc3QgZmllbGQgPSBtZXRhLmZpZWxkc1trZXldO1xuICAgICAgaWYgKGZpZWxkPy52aXJ0dWFsKSBjb250aW51ZTsgLy8gU2tpcCB2aXJ0dWFsIGZpZWxkc1xuXG4gICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmdlbmVyYXRlQ29sdW1uRGVmaW5pdGlvbihrZXkgYXMgc3RyaW5nLCBmaWVsZCwgbWV0YSk7XG4gICAgICBjb2x1bW5zLnB1c2goY29sRGVmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBjb2x1bW4gZGVmaW5pdGlvblxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlQ29sdW1uRGVmaW5pdGlvbjxFPihmaWVsZEtleTogc3RyaW5nLCBmaWVsZDogRmllbGRPcHRpb25zLCBtZXRhOiBFbnRpdHlNZXRhPEU+KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5lc2NhcGVJZCh0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGZpZWxkS2V5LCBmaWVsZCkpO1xuICAgIGNvbnN0IGlzSWQgPSBmaWVsZC5pc0lkID09PSB0cnVlO1xuICAgIGNvbnN0IGlzUHJpbWFyeUtleSA9IGlzSWQgJiYgbWV0YS5pZCA9PT0gZmllbGRLZXk7XG5cbiAgICAvLyBEZXRlcm1pbmUgU1FMIHR5cGVcbiAgICBsZXQgc3FsVHlwZTogc3RyaW5nO1xuICAgIGlmIChpc1ByaW1hcnlLZXkgJiYgZmllbGQuYXV0b0luY3JlbWVudCAhPT0gZmFsc2UgJiYgIWZpZWxkLm9uSW5zZXJ0KSB7XG4gICAgICAvLyBBdXRvLWluY3JlbWVudCBwcmltYXJ5IGtleVxuICAgICAgc3FsVHlwZSA9IHRoaXMuc2VyaWFsUHJpbWFyeUtleVR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNxbFR5cGUgPSB0aGlzLmdldFNxbFR5cGUoZmllbGQsIGZpZWxkLnR5cGUpO1xuICAgIH1cblxuICAgIGxldCBkZWZpbml0aW9uID0gYCR7Y29sdW1uTmFtZX0gJHtzcWxUeXBlfWA7XG5cbiAgICAvLyBQUklNQVJZIEtFWSBjb25zdHJhaW50IChmb3Igbm9uLXNlcmlhbCB0eXBlcylcbiAgICBpZiAoaXNQcmltYXJ5S2V5ICYmICFzcWxUeXBlLmluY2x1ZGVzKCdQUklNQVJZIEtFWScpKSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgUFJJTUFSWSBLRVknO1xuICAgIH1cblxuICAgIC8vIE5VTEwvTk9UIE5VTExcbiAgICBpZiAoIWlzUHJpbWFyeUtleSkge1xuICAgICAgY29uc3QgbnVsbGFibGUgPSBmaWVsZC5udWxsYWJsZSA/PyB0cnVlO1xuICAgICAgaWYgKCFudWxsYWJsZSkge1xuICAgICAgICBkZWZpbml0aW9uICs9ICcgTk9UIE5VTEwnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVOSVFVRSBjb25zdHJhaW50XG4gICAgaWYgKGZpZWxkLnVuaXF1ZSAmJiAhaXNQcmltYXJ5S2V5KSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgVU5JUVVFJztcbiAgICB9XG5cbiAgICAvLyBERUZBVUxUIHZhbHVlXG4gICAgaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWZpbml0aW9uICs9IGAgREVGQVVMVCAke3RoaXMuZm9ybWF0RGVmYXVsdFZhbHVlKGZpZWxkLmRlZmF1bHRWYWx1ZSl9YDtcbiAgICB9XG5cbiAgICAvLyBDT01NRU5UIChpZiBzdXBwb3J0ZWQpXG4gICAgaWYgKGZpZWxkLmNvbW1lbnQpIHtcbiAgICAgIGRlZmluaXRpb24gKz0gdGhpcy5nZW5lcmF0ZUNvbHVtbkNvbW1lbnQoXG4gICAgICAgIHRoaXMucmVzb2x2ZVRhYmxlTmFtZShtZXRhLmVudGl0eSwgbWV0YSksXG4gICAgICAgIHRoaXMucmVzb2x2ZUNvbHVtbk5hbWUoZmllbGRLZXksIGZpZWxkKSxcbiAgICAgICAgZmllbGQuY29tbWVudCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIENvbHVtblNjaGVtYSBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZUNvbHVtbkRlZmluaXRpb25Gcm9tU2NoZW1hKGNvbHVtbjogQ29sdW1uU2NoZW1hKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5lc2NhcGVJZChjb2x1bW4ubmFtZSk7XG4gICAgbGV0IHR5cGUgPSBjb2x1bW4udHlwZTtcblxuICAgIGlmIChjb2x1bW4ubGVuZ3RoICYmICF0eXBlLmluY2x1ZGVzKCcoJykpIHtcbiAgICAgIHR5cGUgPSBgJHt0eXBlfSgke2NvbHVtbi5sZW5ndGh9KWA7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4ucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgJiYgIXR5cGUuaW5jbHVkZXMoJygnKSkge1xuICAgICAgaWYgKGNvbHVtbi5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHR5cGUgPSBgJHt0eXBlfSgke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSBgJHt0eXBlfSgke2NvbHVtbi5wcmVjaXNpb259KWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRlZmluaXRpb24gPSBgJHtjb2x1bW5OYW1lfSAke3R5cGV9YDtcblxuICAgIGlmIChjb2x1bW4uaXNQcmltYXJ5S2V5KSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgUFJJTUFSWSBLRVknO1xuICAgIH1cblxuICAgIGlmICghY29sdW1uLm51bGxhYmxlICYmICFjb2x1bW4uaXNQcmltYXJ5S2V5KSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgTk9UIE5VTEwnO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW4uaXNVbmlxdWUgJiYgIWNvbHVtbi5pc1ByaW1hcnlLZXkpIHtcbiAgICAgIGRlZmluaXRpb24gKz0gJyBVTklRVUUnO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW4uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlZmluaXRpb24gKz0gYCBERUZBVUxUICR7dGhpcy5mb3JtYXREZWZhdWx0VmFsdWUoY29sdW1uLmRlZmF1bHRWYWx1ZSl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0YWJsZSBjb25zdHJhaW50cyAoaW5kZXhlcywgZm9yZWlnbiBrZXlzLCBldGMuKVxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlVGFibGVDb25zdHJhaW50czxFPihtZXRhOiBFbnRpdHlNZXRhPEU+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGZpZWxkS2V5cyA9IGdldEtleXMobWV0YS5maWVsZHMpIGFzIEZpZWxkS2V5PEU+W107XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGhpcy5yZXNvbHZlVGFibGVOYW1lKG1ldGEuZW50aXR5LCBtZXRhKTtcblxuICAgIC8vIEdlbmVyYXRlIGluZGV4ZXMgZnJvbSBmaWVsZCBvcHRpb25zXG4gICAgZm9yIChjb25zdCBrZXkgb2YgZmllbGRLZXlzKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IG1ldGEuZmllbGRzW2tleV07XG4gICAgICBpZiAoZmllbGQ/LmluZGV4KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGtleSBhcyBzdHJpbmcsIGZpZWxkKTtcbiAgICAgICAgY29uc3QgaW5kZXhOYW1lID0gdHlwZW9mIGZpZWxkLmluZGV4ID09PSAnc3RyaW5nJyA/IGZpZWxkLmluZGV4IDogYGlkeF8ke3RhYmxlTmFtZX1fJHtjb2x1bW5OYW1lfWA7XG4gICAgICAgIGNvbnN0cmFpbnRzLnB1c2goYElOREVYICR7dGhpcy5lc2NhcGVJZChpbmRleE5hbWUpfSAoJHt0aGlzLmVzY2FwZUlkKGNvbHVtbk5hbWUpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBmb3JlaWduIGtleSBjb25zdHJhaW50cyBmcm9tIHJlZmVyZW5jZXNcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZEtleXMpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5XTtcbiAgICAgIGlmIChmaWVsZD8ucmVmZXJlbmNlKSB7XG4gICAgICAgIGNvbnN0IHJlZkVudGl0eSA9IGZpZWxkLnJlZmVyZW5jZSgpO1xuICAgICAgICBjb25zdCByZWZNZXRhID0gZ2V0TWV0YShyZWZFbnRpdHkpO1xuICAgICAgICBjb25zdCByZWZJZEZpZWxkID0gcmVmTWV0YS5maWVsZHNbcmVmTWV0YS5pZF07XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGtleSBhcyBzdHJpbmcsIGZpZWxkKTtcbiAgICAgICAgY29uc3QgcmVmVGFibGVOYW1lID0gdGhpcy5yZXNvbHZlVGFibGVOYW1lKHJlZkVudGl0eSwgcmVmTWV0YSk7XG4gICAgICAgIGNvbnN0IHJlZkNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKHJlZk1ldGEuaWQsIHJlZklkRmllbGQpO1xuICAgICAgICBjb25zdCBma05hbWUgPSBgZmtfJHt0YWJsZU5hbWV9XyR7Y29sdW1uTmFtZX1gO1xuXG4gICAgICAgIGNvbnN0cmFpbnRzLnB1c2goXG4gICAgICAgICAgYENPTlNUUkFJTlQgJHt0aGlzLmVzY2FwZUlkKGZrTmFtZSl9IEZPUkVJR04gS0VZICgke3RoaXMuZXNjYXBlSWQoY29sdW1uTmFtZSl9KSBgICtcbiAgICAgICAgICAgIGBSRUZFUkVOQ0VTICR7dGhpcy5lc2NhcGVJZChyZWZUYWJsZU5hbWUpfSAoJHt0aGlzLmVzY2FwZUlkKHJlZkNvbHVtbk5hbWUpfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25zdHJhaW50cztcbiAgfVxuXG4gIGdldFNxbFR5cGUoZmllbGQ6IEZpZWxkT3B0aW9ucywgZmllbGRUeXBlPzogdW5rbm93bik6IHN0cmluZyB7XG4gICAgLy8gVXNlIGV4cGxpY2l0IGNvbHVtbiB0eXBlIGlmIHNwZWNpZmllZFxuICAgIGlmIChmaWVsZC5jb2x1bW5UeXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXBDb2x1bW5UeXBlKGZpZWxkLmNvbHVtblR5cGUsIGZpZWxkKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCB0eXBlc1xuICAgIGlmIChmaWVsZC50eXBlID09PSAnanNvbicgfHwgZmllbGQudHlwZSA9PT0gJ2pzb25iJykge1xuICAgICAgcmV0dXJuIHRoaXMubWFwQ29sdW1uVHlwZShmaWVsZC50eXBlIGFzIENvbHVtblR5cGUsIGZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3ZlY3RvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcENvbHVtblR5cGUoJ3ZlY3RvcicsIGZpZWxkKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciBmcm9tIFR5cGVTY3JpcHQgdHlwZVxuICAgIGNvbnN0IHR5cGUgPSBmaWVsZFR5cGUgPz8gZmllbGQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBOdW1iZXIgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBmaWVsZC5wcmVjaXNpb24gPyB0aGlzLm1hcENvbHVtblR5cGUoJ2RlY2ltYWwnLCBmaWVsZCkgOiAnQklHSU5UJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gU3RyaW5nIHx8IHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBmaWVsZC5sZW5ndGggPz8gMjU1O1xuICAgICAgcmV0dXJuIGBWQVJDSEFSKCR7bGVuZ3RofSlgO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBCb29sZWFuIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhblR5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gRGF0ZSB8fCB0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgIHJldHVybiAnVElNRVNUQU1QJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gQmlnSW50IHx8IHR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICByZXR1cm4gJ0JJR0lOVCc7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byBWQVJDSEFSXG4gICAgcmV0dXJuIGBWQVJDSEFSKCR7ZmllbGQubGVuZ3RoID8/IDI1NX0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgdXFsIGNvbHVtbiB0eXBlIHRvIGRhdGFiYXNlLXNwZWNpZmljIFNRTCB0eXBlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgbWFwQ29sdW1uVHlwZShjb2x1bW5UeXBlOiBDb2x1bW5UeXBlLCBmaWVsZDogRmllbGRPcHRpb25zKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJvb2xlYW4gdHlwZSBmb3IgdGhpcyBkYXRhYmFzZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGdldEJvb2xlYW5UeXBlKCk6IHN0cmluZztcblxuICAvKipcbiAgICogR2VuZXJhdGUgQUxURVIgQ09MVU1OIHN0YXRlbWVudHMgKGRhdGFiYXNlLXNwZWNpZmljKVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGdlbmVyYXRlQWx0ZXJDb2x1bW5TdGF0ZW1lbnRzKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvbHVtbjogQ29sdW1uU2NoZW1hLFxuICAgIG5ld0RlZmluaXRpb246IHN0cmluZyxcbiAgKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEdldCB0YWJsZSBvcHRpb25zIChlLmcuLCBFTkdJTkUgZm9yIE15U1FMKVxuICAgKi9cbiAgZ2V0VGFibGVPcHRpb25zPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4pOiBzdHJpbmcge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBjb2x1bW4gY29tbWVudCBjbGF1c2UgKGlmIHN1cHBvcnRlZClcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBnZW5lcmF0ZUNvbHVtbkNvbW1lbnQodGFibGVOYW1lOiBzdHJpbmcsIGNvbHVtbk5hbWU6IHN0cmluZywgY29tbWVudDogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBkZWZhdWx0IHZhbHVlIGZvciBTUUxcbiAgICovXG4gIHB1YmxpYyBmb3JtYXREZWZhdWx0VmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICdOVUxMJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpfSdgO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/ICdUUlVFJyA6ICdGQUxTRSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gYCcke3ZhbHVlLnRvSVNPU3RyaW5nKCl9J2A7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgdHdvIHNjaGVtYXMgYW5kIHJldHVybiB0aGUgZGlmZmVyZW5jZXNcbiAgICovXG4gIGRpZmZTY2hlbWE8RT4oZW50aXR5OiBUeXBlPEU+LCBjdXJyZW50U2NoZW1hOiBUYWJsZVNjaGVtYSB8IHVuZGVmaW5lZCk6IFNjaGVtYURpZmYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG5cbiAgICBpZiAoIWN1cnJlbnRTY2hlbWEpIHtcbiAgICAgIC8vIFRhYmxlIGRvZXNuJ3QgZXhpc3QsIG5lZWQgdG8gY3JlYXRlXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YWJsZU5hbWU6IHRoaXMucmVzb2x2ZVRhYmxlTmFtZShlbnRpdHksIG1ldGEpLFxuICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uc1RvQWRkOiBDb2x1bW5TY2hlbWFbXSA9IFtdO1xuICAgIGNvbnN0IGNvbHVtbnNUb0FsdGVyOiB7IGZyb206IENvbHVtblNjaGVtYTsgdG86IENvbHVtblNjaGVtYSB9W10gPSBbXTtcbiAgICBjb25zdCBjb2x1bW5zVG9Ecm9wOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgY3VycmVudENvbHVtbnMgPSBuZXcgTWFwKGN1cnJlbnRTY2hlbWEuY29sdW1ucy5tYXAoKGM6IGFueSkgPT4gW2MubmFtZSwgY10pKTtcbiAgICBjb25zdCBmaWVsZEtleXMgPSBnZXRLZXlzKG1ldGEuZmllbGRzKSBhcyBGaWVsZEtleTxFPltdO1xuXG4gICAgLy8gQ2hlY2sgZm9yIG5ldyBvciBhbHRlcmVkIGNvbHVtbnNcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZEtleXMpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5XTtcbiAgICAgIGlmIChmaWVsZD8udmlydHVhbCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGtleSBhcyBzdHJpbmcsIGZpZWxkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSBjdXJyZW50Q29sdW1ucy5nZXQoY29sdW1uTmFtZSk7XG5cbiAgICAgIGlmICghY3VycmVudENvbHVtbikge1xuICAgICAgICAvLyBDb2x1bW4gbmVlZHMgdG8gYmUgYWRkZWRcbiAgICAgICAgY29sdW1uc1RvQWRkLnB1c2godGhpcy5maWVsZFRvQ29sdW1uU2NoZW1hKGtleSBhcyBzdHJpbmcsIGZpZWxkLCBtZXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBpZiBjb2x1bW4gbmVlZHMgYWx0ZXJhdGlvblxuICAgICAgICBjb25zdCBkZXNpcmVkQ29sdW1uID0gdGhpcy5maWVsZFRvQ29sdW1uU2NoZW1hKGtleSBhcyBzdHJpbmcsIGZpZWxkLCBtZXRhKTtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uc05lZWRBbHRlcmF0aW9uKGN1cnJlbnRDb2x1bW4sIGRlc2lyZWRDb2x1bW4pKSB7XG4gICAgICAgICAgY29sdW1uc1RvQWx0ZXIucHVzaCh7IGZyb206IGN1cnJlbnRDb2x1bW4sIHRvOiBkZXNpcmVkQ29sdW1uIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXJyZW50Q29sdW1ucy5kZWxldGUoY29sdW1uTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtYWluaW5nIGNvbHVtbnMgaW4gY3VycmVudENvbHVtbnMgc2hvdWxkIGJlIGRyb3BwZWRcbiAgICBmb3IgKGNvbnN0IFtuYW1lXSBvZiBjdXJyZW50Q29sdW1ucykge1xuICAgICAgY29sdW1uc1RvRHJvcC5wdXNoKG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW5zVG9BZGQubGVuZ3RoID09PSAwICYmIGNvbHVtbnNUb0FsdGVyLmxlbmd0aCA9PT0gMCAmJiBjb2x1bW5zVG9Ecm9wLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm8gY2hhbmdlcyBuZWVkZWRcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGVOYW1lOiB0aGlzLnJlc29sdmVUYWJsZU5hbWUoZW50aXR5LCBtZXRhKSxcbiAgICAgIHR5cGU6ICdhbHRlcicsXG4gICAgICBjb2x1bW5zVG9BZGQ6IGNvbHVtbnNUb0FkZC5sZW5ndGggPiAwID8gY29sdW1uc1RvQWRkIDogdW5kZWZpbmVkLFxuICAgICAgY29sdW1uc1RvQWx0ZXI6IGNvbHVtbnNUb0FsdGVyLmxlbmd0aCA+IDAgPyBjb2x1bW5zVG9BbHRlciA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbHVtbnNUb0Ryb3A6IGNvbHVtbnNUb0Ryb3AubGVuZ3RoID4gMCA/IGNvbHVtbnNUb0Ryb3AgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGZpZWxkIG9wdGlvbnMgdG8gQ29sdW1uU2NoZW1hXG4gICAqL1xuICBwcm90ZWN0ZWQgZmllbGRUb0NvbHVtblNjaGVtYTxFPihmaWVsZEtleTogc3RyaW5nLCBmaWVsZDogRmllbGRPcHRpb25zLCBtZXRhOiBFbnRpdHlNZXRhPEU+KTogQ29sdW1uU2NoZW1hIHtcbiAgICBjb25zdCBpc0lkID0gZmllbGQuaXNJZCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBpc1ByaW1hcnlLZXkgPSBpc0lkICYmIG1ldGEuaWQgPT09IGZpZWxkS2V5O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMucmVzb2x2ZUNvbHVtbk5hbWUoZmllbGRLZXksIGZpZWxkKSxcbiAgICAgIHR5cGU6IHRoaXMuZ2V0U3FsVHlwZShmaWVsZCwgZmllbGQudHlwZSksXG4gICAgICBudWxsYWJsZTogZmllbGQubnVsbGFibGUgPz8gIWlzUHJpbWFyeUtleSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmllbGQuZGVmYXVsdFZhbHVlLFxuICAgICAgaXNQcmltYXJ5S2V5LFxuICAgICAgaXNBdXRvSW5jcmVtZW50OiBpc1ByaW1hcnlLZXkgJiYgZmllbGQuYXV0b0luY3JlbWVudCAhPT0gZmFsc2UgJiYgIWZpZWxkLm9uSW5zZXJ0LFxuICAgICAgaXNVbmlxdWU6IGZpZWxkLnVuaXF1ZSA/PyBmYWxzZSxcbiAgICAgIGxlbmd0aDogZmllbGQubGVuZ3RoLFxuICAgICAgcHJlY2lzaW9uOiBmaWVsZC5wcmVjaXNpb24sXG4gICAgICBzY2FsZTogZmllbGQuc2NhbGUsXG4gICAgICBjb21tZW50OiBmaWVsZC5jb21tZW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHdvIGNvbHVtbnMgZGlmZmVyIGVub3VnaCB0byByZXF1aXJlIGFsdGVyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjb2x1bW5zTmVlZEFsdGVyYXRpb24oY3VycmVudDogQ29sdW1uU2NoZW1hLCBkZXNpcmVkOiBDb2x1bW5TY2hlbWEpOiBib29sZWFuIHtcbiAgICAvLyBDb21wYXJlIHJlbGV2YW50IHByb3BlcnRpZXNcbiAgICByZXR1cm4gKFxuICAgICAgY3VycmVudC50eXBlLnRvTG93ZXJDYXNlKCkgIT09IGRlc2lyZWQudHlwZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBjdXJyZW50Lm51bGxhYmxlICE9PSBkZXNpcmVkLm51bGxhYmxlIHx8XG4gICAgICBjdXJyZW50LmlzVW5pcXVlICE9PSBkZXNpcmVkLmlzVW5pcXVlIHx8XG4gICAgICBKU09OLnN0cmluZ2lmeShjdXJyZW50LmRlZmF1bHRWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGRlc2lyZWQuZGVmYXVsdFZhbHVlKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|