{"version":3,"file":"index.cjs","names":["path","fs","path","TsSchemaGenerator","fs","os","crypto","fs","path","expect","PrismaSchemaGenerator","ZenStackClient","PostgresDialect","Pool","MysqlDialect","SqliteDialect","SQLite","PGClient","PolicyPlugin","ORMError","expect","ORMErrorReason"],"sources":["../src/project.ts","../src/utils.ts","../src/schema.ts","../src/client.ts","../src/vitest-ext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport tmp from 'tmp';\n\nexport function createTestProject(zmodelContent?: string) {\n    const { name: workDir } = tmp.dirSync({ unsafeCleanup: true });\n\n    fs.mkdirSync(path.join(workDir, 'node_modules'));\n\n    // symlink all entries from \"node_modules\"\n    const nodeModules = fs.readdirSync(path.join(__dirname, '../node_modules'));\n    for (const entry of nodeModules) {\n        if (entry.startsWith('@zenstackhq')) {\n            continue;\n        }\n        fs.symlinkSync(\n            path.join(__dirname, '../node_modules', entry),\n            path.join(workDir, 'node_modules', entry),\n            'dir',\n        );\n    }\n\n    // in addition, symlink zenstack packages\n    const zenstackPackages = ['language', 'sdk', 'schema', 'orm', 'cli'];\n    fs.mkdirSync(path.join(workDir, 'node_modules/@zenstackhq'));\n    for (const pkg of zenstackPackages) {\n        fs.symlinkSync(\n            path.join(__dirname, `../../${pkg}`),\n            path.join(workDir, `node_modules/@zenstackhq/${pkg}`),\n            'dir',\n        );\n    }\n\n    fs.writeFileSync(\n        path.join(workDir, 'package.json'),\n        JSON.stringify(\n            {\n                name: 'test',\n                version: '1.0.0',\n                type: 'module',\n            },\n            null,\n            4,\n        ),\n    );\n\n    fs.writeFileSync(\n        path.join(workDir, 'tsconfig.json'),\n        JSON.stringify(\n            {\n                compilerOptions: {\n                    module: 'ESNext',\n                    target: 'ESNext',\n                    moduleResolution: 'Bundler',\n                    esModuleInterop: true,\n                    skipLibCheck: true,\n                    strict: true,\n                    types: ['node'],\n                },\n                include: ['**/*.ts'],\n            },\n            null,\n            4,\n        ),\n    );\n\n    if (zmodelContent) {\n        fs.writeFileSync(path.join(workDir, 'schema.zmodel'), zmodelContent);\n    }\n\n    return workDir;\n}\n","import { loadDocument } from '@zenstackhq/language';\n\nexport function loadDocumentWithPlugins(filePath: string, extraPluginModelFiles: string[] = []) {\n    const pluginModelFiles = [require.resolve('@zenstackhq/plugin-policy/plugin.zmodel'), ...extraPluginModelFiles];\n    return loadDocument(filePath, pluginModelFiles);\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { DataSourceProviderType, SchemaDef } from '@zenstackhq/schema';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport { execSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { match } from 'ts-pattern';\nimport { expect } from 'vitest';\nimport { createTestProject } from './project';\nimport { loadDocumentWithPlugins } from './utils';\n\nfunction makePrelude(provider: DataSourceProviderType, dbUrl?: string) {\n    return match(provider)\n        .with('sqlite', () => {\n            return `\ndatasource db {\n    provider = 'sqlite'\n    url = '${dbUrl ?? 'file:./test.db'}'\n}\n`;\n        })\n        .with('postgresql', () => {\n            return `\ndatasource db {\n    provider = 'postgresql'\n    url = '${dbUrl ?? 'postgres://postgres:postgres@localhost:5432/db'}'\n}\n`;\n        })\n        .with('mysql', () => {\n            return `\ndatasource db {\n    provider = 'mysql'\n    url = '${dbUrl ?? 'mysql://root:mysql@localhost:3306/db'}'\n}\n`;\n        })\n        .exhaustive();\n}\n\nfunction replacePlaceholders(\n    schemaText: string,\n    provider: 'sqlite' | 'postgresql' | 'mysql',\n    dbUrl: string | undefined,\n) {\n    const url =\n        dbUrl ??\n        (provider === 'sqlite'\n            ? 'file:./test.db'\n            : provider === 'mysql'\n              ? 'mysql://root:mysql@localhost:3306/db'\n              : 'postgres://postgres:postgres@localhost:5432/db');\n    return schemaText.replace(/\\$DB_URL/g, url).replace(/\\$PROVIDER/g, provider);\n}\n\nexport async function generateTsSchema(\n    schemaText: string,\n    provider: DataSourceProviderType = 'sqlite',\n    dbUrl?: string,\n    extraSourceFiles?: Record<string, string>,\n    withLiteSchema?: boolean,\n    extraZModelFiles?: Record<string, string>,\n    extraPluginModelFiles?: string[],\n) {\n    const workDir = createTestProject();\n\n    const zmodelPath = path.join(workDir, 'schema.zmodel');\n    const noPrelude = schemaText.includes('datasource ');\n    fs.writeFileSync(\n        zmodelPath,\n        `${noPrelude ? '' : makePrelude(provider, dbUrl)}\\n\\n${replacePlaceholders(schemaText, provider, dbUrl)}`,\n    );\n\n    // write extra ZModel files before loading the schema\n    if (extraZModelFiles) {\n        for (const [fileName, content] of Object.entries(extraZModelFiles)) {\n            let name = fileName;\n            if (!name.endsWith('.zmodel')) {\n                name += '.zmodel';\n            }\n            const filePath = path.join(workDir, name);\n            fs.mkdirSync(path.dirname(filePath), { recursive: true });\n            fs.writeFileSync(filePath, content);\n        }\n    }\n\n    const result = await loadDocumentWithPlugins(zmodelPath, extraPluginModelFiles);\n    if (!result.success) {\n        throw new Error(`Failed to load schema from ${zmodelPath}: ${result.errors}`);\n    }\n\n    const generator = new TsSchemaGenerator();\n    await generator.generate(result.model, { outDir: workDir, lite: withLiteSchema });\n\n    if (extraSourceFiles) {\n        for (const [fileName, content] of Object.entries(extraSourceFiles)) {\n            const filePath = path.resolve(workDir, !fileName.endsWith('.ts') ? `${fileName}.ts` : fileName);\n            fs.mkdirSync(path.dirname(filePath), { recursive: true });\n            fs.writeFileSync(filePath, content);\n        }\n    }\n\n    // compile the generated TS schema\n    return { ...(await compileAndLoad(workDir)), model: result.model };\n}\n\nasync function compileAndLoad(workDir: string) {\n    execSync('npx tsc', {\n        cwd: workDir,\n        stdio: 'inherit',\n    });\n\n    // load the schema module\n    const module = await import(path.join(workDir, 'schema.js'));\n\n    let moduleLite: any;\n    try {\n        moduleLite = await import(path.join(workDir, 'schema-lite.js'));\n    } catch {\n        // ignore\n    }\n    return { workDir, schema: module.schema as SchemaDef, schemaLite: moduleLite?.schema as SchemaDef | undefined };\n}\n\nexport function generateTsSchemaFromFile(filePath: string) {\n    const schemaText = fs.readFileSync(filePath, 'utf8');\n    return generateTsSchema(schemaText);\n}\n\nexport async function generateTsSchemaInPlace(schemaPath: string) {\n    const workDir = path.dirname(schemaPath);\n    const result = await loadDocumentWithPlugins(schemaPath);\n    if (!result.success) {\n        throw new Error(`Failed to load schema from ${schemaPath}: ${result.errors}`);\n    }\n    const generator = new TsSchemaGenerator();\n    await generator.generate(result.model, { outDir: workDir });\n    return compileAndLoad(workDir);\n}\n\nexport async function loadSchema(schema: string, additionalSchemas?: Record<string, string>) {\n    if (!schema.includes('datasource ')) {\n        schema = `${makePrelude('sqlite')}\\n\\n${schema}`;\n    }\n\n    // create a temp folder\n    const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'zenstack-schema'));\n\n    // create a temp file\n    const tempFile = path.join(tempDir, `schema.zmodel`);\n    fs.writeFileSync(tempFile, schema);\n\n    if (additionalSchemas) {\n        for (const [fileName, content] of Object.entries(additionalSchemas)) {\n            let name = fileName;\n            if (!name.endsWith('.zmodel')) {\n                name += '.zmodel';\n            }\n            const filePath = path.join(tempDir, name);\n            fs.writeFileSync(filePath, content);\n        }\n    }\n\n    const r = await loadDocumentWithPlugins(tempFile);\n    expect(r).toSatisfy(\n        (r) => r.success,\n        `Failed to load schema: ${(r as any).errors?.map((e: any) => e.toString()).join(', ')}`,\n    );\n    invariant(r.success);\n    return r.model;\n}\n\nexport async function loadSchemaWithError(schema: string, error: string | RegExp) {\n    if (!schema.includes('datasource ')) {\n        schema = `${makePrelude('sqlite')}\\n\\n${schema}`;\n    }\n\n    // create a temp file\n    const tempFile = path.join(os.tmpdir(), `zenstack-schema-${crypto.randomUUID()}.zmodel`);\n    fs.writeFileSync(tempFile, schema);\n    const r = await loadDocumentWithPlugins(tempFile);\n    expect(r.success).toBe(false);\n    invariant(!r.success);\n    if (typeof error === 'string') {\n        expect(r).toSatisfy(\n            (r) => r.errors.some((e: any) => e.toString().toLowerCase().includes(error.toLowerCase())),\n            `Expected error message to include \"${error}\" but got: ${r.errors.map((e: any) => e.toString()).join(', ')}`,\n        );\n    } else {\n        expect(r).toSatisfy(\n            (r) => r.errors.some((e: any) => error.test(e)),\n            `Expected error message to match \"${error}\" but got: ${r.errors.map((e: any) => e.toString()).join(', ')}`,\n        );\n    }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { Model } from '@zenstackhq/language/ast';\nimport { ZenStackClient, type ClientContract, type ClientOptions } from '@zenstackhq/orm';\nimport type { DataSourceProviderType, SchemaDef } from '@zenstackhq/orm/schema';\nimport { PolicyPlugin } from '@zenstackhq/plugin-policy';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport SQLite from 'better-sqlite3';\nimport { glob } from 'glob';\nimport { MysqlDialect, PostgresDialect, SqliteDialect, type LogEvent } from 'kysely';\nimport { createPool as createMysqlPool } from 'mysql2';\nimport { execSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Client as PGClient, Pool } from 'pg';\nimport { match } from 'ts-pattern';\nimport { expect } from 'vitest';\nimport { createTestProject } from './project';\nimport { generateTsSchema } from './schema';\nimport { loadDocumentWithPlugins } from './utils';\n\nexport function getTestDbProvider() {\n    const val = process.env['TEST_DB_PROVIDER'] ?? 'sqlite';\n    if (!['sqlite', 'postgresql', 'mysql'].includes(val!)) {\n        throw new Error(`Invalid TEST_DB_PROVIDER value: ${val}`);\n    }\n    return val as 'sqlite' | 'postgresql' | 'mysql';\n}\n\nexport const TEST_PG_CONFIG = {\n    host: process.env['TEST_PG_HOST'] ?? 'localhost',\n    port: process.env['TEST_PG_PORT'] ? parseInt(process.env['TEST_PG_PORT']) : 5432,\n    user: process.env['TEST_PG_USER'] ?? 'postgres',\n    password: process.env['TEST_PG_PASSWORD'] ?? 'postgres',\n};\n\nexport const TEST_PG_URL = `postgres://${TEST_PG_CONFIG.user}:${TEST_PG_CONFIG.password}@${TEST_PG_CONFIG.host}:${TEST_PG_CONFIG.port}`;\n\nexport const TEST_MYSQL_CONFIG = {\n    host: process.env['TEST_MYSQL_HOST'] ?? 'localhost',\n    port: process.env['TEST_MYSQL_PORT'] ? parseInt(process.env['TEST_MYSQL_PORT']) : 3306,\n    user: process.env['TEST_MYSQL_USER'] ?? 'root',\n    password: process.env['TEST_MYSQL_PASSWORD'] ?? 'mysql',\n    timezone: 'Z',\n};\n\nexport const TEST_MYSQL_URL = `mysql://${TEST_MYSQL_CONFIG.user}:${TEST_MYSQL_CONFIG.password}@${TEST_MYSQL_CONFIG.host}:${TEST_MYSQL_CONFIG.port}`;\n\ntype ExtraTestClientOptions = {\n    /**\n     * Database provider\n     */\n    provider?: 'sqlite' | 'postgresql' | 'mysql';\n\n    /**\n     * The main ZModel file. Only used when `usePrismaPush` is true and `schema` is an object.\n     */\n    schemaFile?: string;\n\n    /**\n     * Database name. If not provided, a name will be generated based on the test name.\n     */\n    dbName?: string;\n\n    /**\n     * Use `prisma db push` instead of ZenStack's `$pushSchema` for database initialization.\n     */\n    usePrismaPush?: boolean;\n\n    /**\n     * Extra ZModel files to be created in the working directory.\n     */\n    extraZModelFiles?: Record<string, string>;\n\n    /**\n     * Extra plugin `plugin.zmodel` files (resolved absolute paths) to merge into the schema\n     * when loading. Use this to make a plugin's custom attributes available without testtools\n     * having to depend on the plugin.\n     */\n    extraPluginModelFiles?: string[];\n\n    /**\n     * Extra TypeScript source files to create and compile.\n     */\n    extraSourceFiles?: Record<string, string>;\n\n    /**\n     * Working directory for the test client. If not provided, a temporary directory will be created.\n     */\n    workDir?: string;\n\n    /**\n     * Debug mode.\n     */\n    debug?: boolean;\n\n    /**\n     * A sqlite database file to be used for the test. Only supported for sqlite provider.\n     */\n    dbFile?: string;\n\n    /**\n     * PostgreSQL extensions to be added to the datasource. Only supported for postgresql provider.\n     */\n    dataSourceExtensions?: string[];\n\n    /**\n     * Additional files to be copied to the working directory. The glob pattern is relative to the test file.\n     */\n    copyFiles?: {\n        globPattern: string;\n        destination: string;\n    }[];\n\n    /**\n     * Computed fields configuration for tests.\n     */\n    computedFields?: import('@zenstackhq/orm').ComputedFieldsOptions<any>;\n};\n\nexport type CreateTestClientOptions<Schema extends SchemaDef> = Omit<ClientOptions<Schema>, 'dialect'> &\n    ExtraTestClientOptions;\n\nexport async function createTestClient<\n    Schema extends SchemaDef,\n    Options extends ClientOptions<Schema>,\n    CreateOptions = Omit<Options, 'dialect'>,\n>(schema: Schema, options?: CreateOptions): Promise<ClientContract<Schema, Options>>;\nexport async function createTestClient(schema: string, options?: CreateTestClientOptions<SchemaDef>): Promise<any>;\nexport async function createTestClient(\n    schema: SchemaDef | string,\n    options?: CreateTestClientOptions<SchemaDef>,\n): Promise<any> {\n    let workDir = options?.workDir;\n    let _schema: SchemaDef;\n    const provider = options?.provider ?? getTestDbProvider() ?? 'sqlite';\n    const dbName = options?.dbName ?? getTestDbName(provider);\n    const dbUrl = match(provider)\n        .with('sqlite', () => `file:${dbName}`)\n        .with('mysql', () => `${TEST_MYSQL_URL}/${dbName}`)\n        .with('postgresql', () => `${TEST_PG_URL}/${dbName}`)\n        .exhaustive();\n    let model: Model | undefined;\n\n    if (typeof schema === 'string') {\n        const generated = await generateTsSchema(\n            schema,\n            provider,\n            dbUrl,\n            options?.extraSourceFiles,\n            undefined,\n            options?.extraZModelFiles,\n            options?.extraPluginModelFiles,\n        );\n        workDir = generated.workDir;\n        model = generated.model;\n        // replace schema's provider\n        _schema = {\n            ...generated.schema,\n            provider: {\n                ...generated.schema.provider,\n                type: provider,\n            },\n        } as SchemaDef;\n    } else {\n        // replace schema's provider\n        _schema = {\n            ...schema,\n            provider: {\n                type: provider,\n            },\n        };\n        workDir ??= createTestProject();\n        if (options?.schemaFile) {\n            let schemaContent = fs.readFileSync(options.schemaFile, 'utf-8');\n            if (dbUrl) {\n                // replace `datasource db { }` section\n                schemaContent = schemaContent.replace(\n                    /datasource\\s+db\\s*{[^}]*}/m,\n                    `datasource db {\n    provider = '${provider}'\n    url = '${dbUrl}'\n    ${options.dataSourceExtensions ? `extensions = [${options.dataSourceExtensions.join(', ')}]` : ''}\n}`,\n                );\n            }\n            fs.writeFileSync(path.join(workDir!, 'schema.zmodel'), schemaContent);\n        }\n    }\n\n    invariant(workDir);\n\n    const { plugins, ...rest } = options ?? {};\n    const _options = {\n        ...rest,\n    } as ClientOptions<SchemaDef>;\n\n    if (options?.debug) {\n        console.log(`Work directory: ${workDir}`);\n        console.log(`Database name: ${dbName}`);\n        _options.log ??= testLogger;\n    }\n\n    // copy db file to workDir if specified\n    if (options?.dbFile) {\n        if (provider !== 'sqlite') {\n            throw new Error('dbFile option is only supported for sqlite provider');\n        }\n        fs.copyFileSync(options.dbFile, path.join(workDir, dbName));\n    }\n\n    // copy additional files if specified\n    if (options?.copyFiles) {\n        const state = expect.getState();\n        const currentTestPath = state.testPath;\n        if (!currentTestPath) {\n            throw new Error('Unable to determine current test file path');\n        }\n        for (const { globPattern, destination } of options.copyFiles) {\n            const files = glob.sync(globPattern, { cwd: path.dirname(currentTestPath) });\n            for (const file of files) {\n                const src = path.resolve(path.dirname(currentTestPath), file);\n                const dest = path.resolve(workDir, destination, path.basename(file));\n                fs.mkdirSync(path.dirname(dest), { recursive: true });\n                fs.copyFileSync(src, dest);\n            }\n        }\n    }\n\n    if (!options?.dbFile) {\n        if (options?.usePrismaPush) {\n            invariant(\n                typeof schema === 'string' || options?.schemaFile,\n                'a schema file must be provided when using prisma db push',\n            );\n            if (!model) {\n                const r = await loadDocumentWithPlugins(\n                    path.join(workDir, 'schema.zmodel'),\n                    options?.extraPluginModelFiles,\n                );\n                if (!r.success) {\n                    throw new Error(r.errors.join('\\n'));\n                }\n                model = r.model;\n            }\n            const prismaSchema = new PrismaSchemaGenerator(model);\n            const prismaSchemaText = await prismaSchema.generate();\n            fs.writeFileSync(path.resolve(workDir!, 'schema.prisma'), prismaSchemaText);\n            execSync('npx prisma db push --schema ./schema.prisma --skip-generate --force-reset', {\n                cwd: workDir,\n                stdio: options.debug ? 'inherit' : 'ignore',\n                env: {\n                    ...process.env,\n                    PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n                },\n            });\n        } else {\n            await prepareDatabase(provider, dbName);\n        }\n    }\n\n    // create Kysely dialect\n    _options.dialect = createDialect(provider, dbName, workDir);\n\n    let client = new ZenStackClient(_schema, _options);\n\n    if (!options?.usePrismaPush && !options?.dbFile) {\n        await client.$pushSchema();\n    }\n\n    // install plugins\n    if (plugins) {\n        for (const plugin of plugins) {\n            client = client.$use(plugin);\n        }\n    }\n\n    return client;\n}\n\nfunction createDialect(provider: DataSourceProviderType, dbName: string, workDir: string) {\n    return match(provider)\n        .with(\n            'postgresql',\n            () =>\n                new PostgresDialect({\n                    pool: new Pool({\n                        ...TEST_PG_CONFIG,\n                        database: dbName,\n                    }),\n                }),\n        )\n        .with(\n            'mysql',\n            () =>\n                new MysqlDialect({\n                    pool: createMysqlPool({\n                        ...TEST_MYSQL_CONFIG,\n                        database: dbName,\n                    }),\n                }),\n        )\n        .with(\n            'sqlite',\n            () =>\n                new SqliteDialect({\n                    database: new SQLite(path.join(workDir!, dbName)),\n                }),\n        )\n        .exhaustive();\n}\n\nasync function prepareDatabase(provider: string, dbName: string) {\n    if (provider === 'postgresql') {\n        invariant(dbName, 'dbName is required');\n        const pgClient = new PGClient(TEST_PG_CONFIG);\n        await pgClient.connect();\n        await pgClient.query(`DROP DATABASE IF EXISTS \"${dbName}\"`);\n        await pgClient.query(`CREATE DATABASE \"${dbName}\"`);\n        await pgClient.end();\n    } else if (provider === 'mysql') {\n        invariant(dbName, 'dbName is required');\n        const mysqlPool = createMysqlPool(TEST_MYSQL_CONFIG);\n        await mysqlPool.promise().query(`DROP DATABASE IF EXISTS \\`${dbName}\\``);\n        await mysqlPool.promise().query(`CREATE DATABASE \\`${dbName}\\``);\n        await mysqlPool.promise().end();\n    }\n}\n\nexport async function createPolicyTestClient<Schema extends SchemaDef>(\n    schema: Schema,\n    options?: CreateTestClientOptions<Schema>,\n): Promise<ClientContract<Schema>>;\nexport async function createPolicyTestClient<Schema extends SchemaDef>(\n    schema: string,\n    options?: CreateTestClientOptions<Schema>,\n): Promise<any>;\nexport async function createPolicyTestClient<Schema extends SchemaDef>(\n    schema: Schema | string,\n    options?: CreateTestClientOptions<Schema>,\n): Promise<any> {\n    return createTestClient(\n        schema as any,\n        {\n            ...options,\n            plugins: [...(options?.plugins ?? []), new PolicyPlugin()],\n        } as any,\n    );\n}\n\nexport function testLogger(e: LogEvent) {\n    console.log(e.query.sql, e.query.parameters);\n}\n\nfunction getTestDbName(provider: string) {\n    if (provider === 'sqlite') {\n        return './test.db';\n    }\n    const testName = expect.getState().currentTestName ?? 'unnamed';\n    const testPath = expect.getState().testPath ?? '';\n    // digest test name\n    const digest = createHash('md5')\n        .update(testName + testPath)\n        .digest('hex');\n    // compute a database name based on test name\n    return (\n        'test_' +\n        testName\n            .toLowerCase()\n            .replace(/[^a-z0-9_]/g, '_')\n            .replace(/_+/g, '_')\n            .substring(0, 30) +\n        digest.slice(0, 6)\n    );\n}\n","import { ORMError, ORMErrorReason } from '@zenstackhq/orm';\nimport { expect } from 'vitest';\n\nfunction isPromise(value: any) {\n    return typeof value.then === 'function' && typeof value.catch === 'function';\n}\n\nfunction expectErrorReason(err: any, errorReason: ORMErrorReason) {\n    if (err instanceof ORMError && err.reason === errorReason) {\n        return {\n            message: () => '',\n            pass: true,\n        };\n    } else {\n        return {\n            message: () => `expected ORMError of reason ${errorReason}, got ${err}`,\n            pass: false,\n        };\n    }\n}\n\nfunction expectErrorMessages(expectedMessages: string[], message: string) {\n    for (const m of expectedMessages) {\n        if (!message.toLowerCase().includes(m.toLowerCase())) {\n            return {\n                message: () => `expected message not found in error: ${m}, got message: ${message}`,\n                pass: false,\n            };\n        }\n    }\n    return undefined;\n}\n\nexpect.extend({\n    async toResolveTruthy(received: Promise<unknown>) {\n        if (!isPromise(received)) {\n            return { message: () => 'a promise is expected', pass: false };\n        }\n        const r = await received;\n        return {\n            pass: !!r,\n            message: () => `Expected promise to resolve to a truthy value, but got ${r}`,\n        };\n    },\n\n    async toResolveFalsy(received: Promise<unknown>) {\n        if (!isPromise(received)) {\n            return { message: () => 'a promise is expected', pass: false };\n        }\n        const r = await received;\n        return {\n            pass: !r,\n            message: () => `Expected promise to resolve to a falsy value, but got ${r}`,\n        };\n    },\n\n    async toResolveNull(received: Promise<unknown>) {\n        if (!isPromise(received)) {\n            return { message: () => 'a promise is expected', pass: false };\n        }\n        const r = await received;\n        return {\n            pass: r === null,\n            message: () => `Expected promise to resolve to a null value, but got ${r}`,\n        };\n    },\n\n    async toResolveWithLength(received: Promise<unknown>, length: number) {\n        const r = await received;\n        return {\n            pass: Array.isArray(r) && r.length === length,\n            message: () => `Expected promise to resolve with an array with length ${length}, but got ${r}`,\n        };\n    },\n\n    async toBeRejectedNotFound(received: Promise<unknown>) {\n        if (!isPromise(received)) {\n            return { message: () => 'a promise is expected', pass: false };\n        }\n        try {\n            await received;\n        } catch (err) {\n            return expectErrorReason(err, ORMErrorReason.NOT_FOUND);\n        }\n        return {\n            message: () => `expected NotFoundError, got no error`,\n            pass: false,\n        };\n    },\n\n    async toBeRejectedByPolicy(received: Promise<unknown>, expectedMessages?: string[]) {\n        if (!isPromise(received)) {\n            return { message: () => 'a promise is expected', pass: false };\n        }\n        try {\n            await received;\n        } catch (err) {\n            if (expectedMessages && err instanceof ORMError && err.reason === ORMErrorReason.REJECTED_BY_POLICY) {\n                const r = expectErrorMessages(expectedMessages, err.message || '');\n                if (r) {\n                    return r;\n                }\n            }\n            return expectErrorReason(err, ORMErrorReason.REJECTED_BY_POLICY);\n        }\n        return {\n            message: () => `expected PolicyError, got no error`,\n            pass: false,\n        };\n    },\n\n    async toBeRejectedByValidation(received: Promise<unknown>, expectedMessages?: string[]) {\n        if (!isPromise(received)) {\n            return { message: () => 'a promise is expected', pass: false };\n        }\n        try {\n            await received;\n        } catch (err) {\n            if (expectedMessages && err instanceof ORMError && err.reason === ORMErrorReason.INVALID_INPUT) {\n                const r = expectErrorMessages(expectedMessages, err.message || '');\n                if (r) {\n                    return r;\n                }\n            }\n            return expectErrorReason(err, ORMErrorReason.INVALID_INPUT);\n        }\n        return {\n            message: () => `expected InputValidationError, got no error`,\n            pass: false,\n        };\n    },\n});\n"],"mappings":"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"}