@zenstackhq/testtools 3.0.0-beta.13 → 3.0.0-beta.15

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/dist/index.cjs CHANGED
@@ -47,7 +47,7 @@ module.exports = __toCommonJS(src_exports);
47
47
  // src/client.ts
48
48
  var import_common_helpers2 = require("@zenstackhq/common-helpers");
49
49
  var import_plugin_policy = require("@zenstackhq/plugin-policy");
50
- var import_runtime4 = require("@zenstackhq/runtime");
50
+ var import_orm = require("@zenstackhq/orm");
51
51
  var import_sdk2 = require("@zenstackhq/sdk");
52
52
  var import_better_sqlite3 = __toESM(require("better-sqlite3"), 1);
53
53
  var import_kysely = require("kysely");
@@ -77,7 +77,7 @@ function createTestProject(zmodelContent) {
77
77
  const zenstackPackages = [
78
78
  "language",
79
79
  "sdk",
80
- "runtime",
80
+ "orm",
81
81
  "cli"
82
82
  ];
83
83
  import_node_fs.default.mkdirSync(import_node_path.default.join(workDir, "node_modules/@zenstackhq"));
@@ -349,7 +349,7 @@ async function createTestClient(schema, options, schemaFile) {
349
349
  database: new import_better_sqlite3.default(import_node_path3.default.join(workDir, dbName))
350
350
  });
351
351
  }
352
- let client = new import_runtime4.ZenStackClient(_schema, _options);
352
+ let client = new import_orm.ZenStackClient(_schema, _options);
353
353
  if (!options?.usePrismaPush) {
354
354
  await client.$pushSchema();
355
355
  }
@@ -387,7 +387,7 @@ function getTestDbName(provider) {
387
387
  __name(getTestDbName, "getTestDbName");
388
388
 
389
389
  // src/vitest-ext.ts
390
- var import_runtime6 = require("@zenstackhq/runtime");
390
+ var import_orm2 = require("@zenstackhq/orm");
391
391
  var import_vitest3 = require("vitest");
392
392
  function isPromise(value) {
393
393
  return typeof value.then === "function" && typeof value.catch === "function";
@@ -409,7 +409,7 @@ function expectError(err, errorType) {
409
409
  __name(expectError, "expectError");
410
410
  function expectErrorMessages(expectedMessages, message) {
411
411
  for (const m of expectedMessages) {
412
- if (!message.includes(m)) {
412
+ if (!message.toLowerCase().includes(m.toLowerCase())) {
413
413
  return {
414
414
  message: /* @__PURE__ */ __name(() => `expected message not found in error: ${m}, got message: ${message}`, "message"),
415
415
  pass: false
@@ -476,7 +476,7 @@ import_vitest3.expect.extend({
476
476
  try {
477
477
  await received;
478
478
  } catch (err) {
479
- return expectError(err, import_runtime6.NotFoundError);
479
+ return expectError(err, import_orm2.NotFoundError);
480
480
  }
481
481
  return {
482
482
  message: /* @__PURE__ */ __name(() => `expected NotFoundError, got no error`, "message"),
@@ -493,13 +493,13 @@ import_vitest3.expect.extend({
493
493
  try {
494
494
  await received;
495
495
  } catch (err) {
496
- if (expectedMessages && err instanceof import_runtime6.RejectedByPolicyError) {
496
+ if (expectedMessages && err instanceof import_orm2.RejectedByPolicyError) {
497
497
  const r = expectErrorMessages(expectedMessages, err.message || "");
498
498
  if (r) {
499
499
  return r;
500
500
  }
501
501
  }
502
- return expectError(err, import_runtime6.RejectedByPolicyError);
502
+ return expectError(err, import_orm2.RejectedByPolicyError);
503
503
  }
504
504
  return {
505
505
  message: /* @__PURE__ */ __name(() => `expected PolicyError, got no error`, "message"),
@@ -516,13 +516,13 @@ import_vitest3.expect.extend({
516
516
  try {
517
517
  await received;
518
518
  } catch (err) {
519
- if (expectedMessages && err instanceof import_runtime6.InputValidationError) {
519
+ if (expectedMessages && err instanceof import_orm2.InputValidationError) {
520
520
  const r = expectErrorMessages(expectedMessages, err.message || "");
521
521
  if (r) {
522
522
  return r;
523
523
  }
524
524
  }
525
- return expectError(err, import_runtime6.InputValidationError);
525
+ return expectError(err, import_orm2.InputValidationError);
526
526
  }
527
527
  return {
528
528
  message: /* @__PURE__ */ __name(() => `expected InputValidationError, got no error`, "message"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/project.ts","../src/schema.ts","../src/utils.ts","../src/vitest-ext.ts"],"sourcesContent":["export * from './client';\nexport * from './project';\nexport * from './schema';\nexport * from './vitest-ext';\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { Model } from '@zenstackhq/language/ast';\nimport { PolicyPlugin } from '@zenstackhq/plugin-policy';\nimport { ZenStackClient, type ClientContract, type ClientOptions } from '@zenstackhq/runtime';\nimport type { SchemaDef } from '@zenstackhq/runtime/schema';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport SQLite from 'better-sqlite3';\nimport { PostgresDialect, SqliteDialect, type LogEvent } from 'kysely';\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 { 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'].includes(val!)) {\n throw new Error(`Invalid TEST_DB_PROVIDER value: ${val}`);\n }\n return val as 'sqlite' | 'postgresql';\n}\n\nconst 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 type CreateTestClientOptions<Schema extends SchemaDef> = Omit<ClientOptions<Schema>, 'dialect'> & {\n provider?: 'sqlite' | 'postgresql';\n dbName?: string;\n usePrismaPush?: boolean;\n extraSourceFiles?: Record<string, string>;\n workDir?: string;\n debug?: boolean;\n};\n\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<ClientContract<Schema>>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: string,\n options?: CreateTestClientOptions<Schema>,\n): Promise<any>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema | string,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<any> {\n let workDir = options?.workDir;\n let _schema: Schema;\n const provider = options?.provider ?? getTestDbProvider() ?? 'sqlite';\n\n const dbName = options?.dbName ?? getTestDbName(provider);\n\n const dbUrl =\n provider === 'sqlite'\n ? `file:${dbName}`\n : `postgres://${TEST_PG_CONFIG.user}:${TEST_PG_CONFIG.password}@${TEST_PG_CONFIG.host}:${TEST_PG_CONFIG.port}/${dbName}`;\n\n let model: Model | undefined;\n\n if (typeof schema === 'string') {\n const generated = await generateTsSchema(schema, provider, dbUrl, options?.extraSourceFiles);\n workDir = generated.workDir;\n model = generated.model;\n // replace schema's provider\n _schema = {\n ...generated.schema,\n provider: {\n type: provider,\n },\n } as Schema;\n } else {\n // replace schema's provider\n _schema = {\n ...schema,\n provider: {\n type: provider,\n },\n };\n workDir ??= createTestProject();\n if (schemaFile) {\n let schemaContent = fs.readFileSync(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}`,\n );\n }\n fs.writeFileSync(path.join(workDir, 'schema.zmodel'), schemaContent);\n }\n }\n\n invariant(workDir);\n if (options?.debug) {\n console.log(`Work directory: ${workDir}`);\n }\n\n const { plugins, ...rest } = options ?? {};\n const _options: ClientOptions<Schema> = {\n ...rest,\n } as ClientOptions<Schema>;\n\n if (options?.usePrismaPush) {\n invariant(typeof schema === 'string' || schemaFile, 'a schema file must be provided when using prisma db push');\n if (!model) {\n const r = await loadDocumentWithPlugins(path.join(workDir, 'schema.zmodel'));\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: 'ignore',\n });\n } else {\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 }\n }\n\n if (provider === 'postgresql') {\n _options.dialect = new PostgresDialect({\n pool: new Pool({\n ...TEST_PG_CONFIG,\n database: dbName,\n }),\n });\n } else {\n _options.dialect = new SqliteDialect({\n database: new SQLite(path.join(workDir!, dbName)),\n });\n }\n\n let client = new ZenStackClient(_schema, _options);\n\n if (!options?.usePrismaPush) {\n await client.$pushSchema();\n }\n\n if (plugins) {\n for (const plugin of plugins) {\n client = client.$use(plugin);\n }\n }\n\n return client;\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 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', 'runtime', '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 },\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 { invariant } from '@zenstackhq/common-helpers';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/sdk/schema';\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: 'sqlite' | 'postgresql', 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 .exhaustive();\n}\n\nexport async function generateTsSchema(\n schemaText: string,\n provider: 'sqlite' | 'postgresql' = 'sqlite',\n dbUrl?: string,\n extraSourceFiles?: Record<string, string>,\n) {\n const workDir = createTestProject();\n\n const zmodelPath = path.join(workDir, 'schema.zmodel');\n const noPrelude = schemaText.includes('datasource ');\n fs.writeFileSync(zmodelPath, `${noPrelude ? '' : makePrelude(provider, dbUrl)}\\n\\n${schemaText}`);\n\n const result = await loadDocumentWithPlugins(zmodelPath);\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, workDir);\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 return { workDir, schema: module.schema as SchemaDef };\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, 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 { loadDocument } from '@zenstackhq/language';\n\nexport function loadDocumentWithPlugins(filePath: string) {\n const pluginModelFiles = [require.resolve('@zenstackhq/plugin-policy/plugin.zmodel')];\n return loadDocument(filePath, pluginModelFiles);\n}\n","import { InputValidationError, NotFoundError, RejectedByPolicyError } from '@zenstackhq/runtime';\nimport { expect } from 'vitest';\n\nfunction isPromise(value: any) {\n return typeof value.then === 'function' && typeof value.catch === 'function';\n}\n\nfunction expectError(err: any, errorType: any) {\n if (err instanceof errorType) {\n return {\n message: () => '',\n pass: true,\n };\n } else {\n return {\n message: () => `expected ${errorType}, got ${err}`,\n pass: false,\n };\n }\n}\n\nfunction expectErrorMessages(expectedMessages: string[], message: string) {\n for (const m of expectedMessages) {\n if (!message.includes(m)) {\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 expectError(err, NotFoundError);\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 RejectedByPolicyError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, RejectedByPolicyError);\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 InputValidationError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, InputValidationError);\n }\n return {\n message: () => `expected InputValidationError, got no error`,\n pass: false,\n };\n },\n});\n"],"mappings":"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","names":["import_common_helpers","import_runtime","import_sdk","import_node_child_process","import_node_crypto","import_node_fs","import_node_path","import_vitest","createTestProject","zmodelContent","name","workDir","tmp","dirSync","unsafeCleanup","fs","mkdirSync","path","join","nodeModules","readdirSync","__dirname","entry","startsWith","symlinkSync","zenstackPackages","pkg","writeFileSync","JSON","stringify","version","type","compilerOptions","module","target","moduleResolution","esModuleInterop","skipLibCheck","strict","include","import_node_fs","import_node_path","loadDocumentWithPlugins","filePath","pluginModelFiles","require","loadDocument","makePrelude","provider","dbUrl","match","with","exhaustive","generateTsSchema","schemaText","extraSourceFiles","workDir","createTestProject","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","result","loadDocumentWithPlugins","success","Error","errors","generator","TsSchemaGenerator","generate","model","fileName","content","Object","entries","filePath","resolve","endsWith","mkdirSync","dirname","recursive","compileAndLoad","execSync","cwd","stdio","module","schema","generateTsSchemaFromFile","readFileSync","generateTsSchemaInPlace","schemaPath","loadSchema","additionalSchemas","tempDir","mkdtempSync","os","tmpdir","tempFile","name","r","expect","toSatisfy","map","e","toString","invariant","loadSchemaWithError","error","crypto","randomUUID","toBe","some","toLowerCase","test","getTestDbProvider","val","process","env","includes","Error","TEST_PG_CONFIG","host","port","parseInt","user","password","createTestClient","schema","options","schemaFile","workDir","_schema","provider","dbName","getTestDbName","dbUrl","model","generated","generateTsSchema","extraSourceFiles","type","createTestProject","schemaContent","fs","readFileSync","replace","writeFileSync","path","join","invariant","debug","console","log","plugins","rest","_options","usePrismaPush","r","loadDocumentWithPlugins","success","errors","prismaSchema","PrismaSchemaGenerator","prismaSchemaText","generate","resolve","execSync","cwd","stdio","pgClient","PGClient","connect","query","end","dialect","PostgresDialect","pool","Pool","database","SqliteDialect","SQLite","client","ZenStackClient","$pushSchema","plugin","$use","createPolicyTestClient","PolicyPlugin","testLogger","e","sql","parameters","testName","expect","getState","currentTestName","testPath","digest","createHash","update","toLowerCase","substring","slice","import_runtime","import_vitest","isPromise","value","then","catch","expectError","err","errorType","message","pass","expectErrorMessages","expectedMessages","m","includes","undefined","expect","extend","toResolveTruthy","received","r","toResolveFalsy","toResolveNull","toResolveWithLength","length","Array","isArray","toBeRejectedNotFound","NotFoundError","toBeRejectedByPolicy","RejectedByPolicyError","toBeRejectedByValidation","InputValidationError"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/project.ts","../src/schema.ts","../src/utils.ts","../src/vitest-ext.ts"],"sourcesContent":["export * from './client';\nexport * from './project';\nexport * from './schema';\nexport * from './vitest-ext';\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type { Model } from '@zenstackhq/language/ast';\nimport { PolicyPlugin } from '@zenstackhq/plugin-policy';\nimport { ZenStackClient, type ClientContract, type ClientOptions } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport SQLite from 'better-sqlite3';\nimport { PostgresDialect, SqliteDialect, type LogEvent } from 'kysely';\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 { 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'].includes(val!)) {\n throw new Error(`Invalid TEST_DB_PROVIDER value: ${val}`);\n }\n return val as 'sqlite' | 'postgresql';\n}\n\nconst 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 type CreateTestClientOptions<Schema extends SchemaDef> = Omit<ClientOptions<Schema>, 'dialect'> & {\n provider?: 'sqlite' | 'postgresql';\n dbName?: string;\n usePrismaPush?: boolean;\n extraSourceFiles?: Record<string, string>;\n workDir?: string;\n debug?: boolean;\n};\n\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<ClientContract<Schema>>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: string,\n options?: CreateTestClientOptions<Schema>,\n): Promise<any>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema | string,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<any> {\n let workDir = options?.workDir;\n let _schema: Schema;\n const provider = options?.provider ?? getTestDbProvider() ?? 'sqlite';\n\n const dbName = options?.dbName ?? getTestDbName(provider);\n\n const dbUrl =\n provider === 'sqlite'\n ? `file:${dbName}`\n : `postgres://${TEST_PG_CONFIG.user}:${TEST_PG_CONFIG.password}@${TEST_PG_CONFIG.host}:${TEST_PG_CONFIG.port}/${dbName}`;\n\n let model: Model | undefined;\n\n if (typeof schema === 'string') {\n const generated = await generateTsSchema(schema, provider, dbUrl, options?.extraSourceFiles);\n workDir = generated.workDir;\n model = generated.model;\n // replace schema's provider\n _schema = {\n ...generated.schema,\n provider: {\n type: provider,\n },\n } as Schema;\n } else {\n // replace schema's provider\n _schema = {\n ...schema,\n provider: {\n type: provider,\n },\n };\n workDir ??= createTestProject();\n if (schemaFile) {\n let schemaContent = fs.readFileSync(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}`,\n );\n }\n fs.writeFileSync(path.join(workDir, 'schema.zmodel'), schemaContent);\n }\n }\n\n invariant(workDir);\n if (options?.debug) {\n console.log(`Work directory: ${workDir}`);\n }\n\n const { plugins, ...rest } = options ?? {};\n const _options: ClientOptions<Schema> = {\n ...rest,\n } as ClientOptions<Schema>;\n\n if (options?.usePrismaPush) {\n invariant(typeof schema === 'string' || schemaFile, 'a schema file must be provided when using prisma db push');\n if (!model) {\n const r = await loadDocumentWithPlugins(path.join(workDir, 'schema.zmodel'));\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: 'ignore',\n });\n } else {\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 }\n }\n\n if (provider === 'postgresql') {\n _options.dialect = new PostgresDialect({\n pool: new Pool({\n ...TEST_PG_CONFIG,\n database: dbName,\n }),\n });\n } else {\n _options.dialect = new SqliteDialect({\n database: new SQLite(path.join(workDir!, dbName)),\n });\n }\n\n let client = new ZenStackClient(_schema, _options);\n\n if (!options?.usePrismaPush) {\n await client.$pushSchema();\n }\n\n if (plugins) {\n for (const plugin of plugins) {\n client = client.$use(plugin);\n }\n }\n\n return client;\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 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', '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 },\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 { invariant } from '@zenstackhq/common-helpers';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/schema';\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: 'sqlite' | 'postgresql', 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 .exhaustive();\n}\n\nexport async function generateTsSchema(\n schemaText: string,\n provider: 'sqlite' | 'postgresql' = 'sqlite',\n dbUrl?: string,\n extraSourceFiles?: Record<string, string>,\n) {\n const workDir = createTestProject();\n\n const zmodelPath = path.join(workDir, 'schema.zmodel');\n const noPrelude = schemaText.includes('datasource ');\n fs.writeFileSync(zmodelPath, `${noPrelude ? '' : makePrelude(provider, dbUrl)}\\n\\n${schemaText}`);\n\n const result = await loadDocumentWithPlugins(zmodelPath);\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, workDir);\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 return { workDir, schema: module.schema as SchemaDef };\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, 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 { loadDocument } from '@zenstackhq/language';\n\nexport function loadDocumentWithPlugins(filePath: string) {\n const pluginModelFiles = [require.resolve('@zenstackhq/plugin-policy/plugin.zmodel')];\n return loadDocument(filePath, pluginModelFiles);\n}\n","import { InputValidationError, NotFoundError, RejectedByPolicyError } 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 expectError(err: any, errorType: any) {\n if (err instanceof errorType) {\n return {\n message: () => '',\n pass: true,\n };\n } else {\n return {\n message: () => `expected ${errorType}, 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 expectError(err, NotFoundError);\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 RejectedByPolicyError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, RejectedByPolicyError);\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 InputValidationError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, InputValidationError);\n }\n return {\n message: () => `expected InputValidationError, got no error`,\n pass: false,\n };\n },\n});\n"],"mappings":"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","names":["import_common_helpers","import_sdk","import_node_child_process","import_node_crypto","import_node_fs","import_node_path","import_vitest","createTestProject","zmodelContent","name","workDir","tmp","dirSync","unsafeCleanup","fs","mkdirSync","path","join","nodeModules","readdirSync","__dirname","entry","startsWith","symlinkSync","zenstackPackages","pkg","writeFileSync","JSON","stringify","version","type","compilerOptions","module","target","moduleResolution","esModuleInterop","skipLibCheck","strict","include","import_node_fs","import_node_path","loadDocumentWithPlugins","filePath","pluginModelFiles","require","loadDocument","makePrelude","provider","dbUrl","match","with","exhaustive","generateTsSchema","schemaText","extraSourceFiles","workDir","createTestProject","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","result","loadDocumentWithPlugins","success","Error","errors","generator","TsSchemaGenerator","generate","model","fileName","content","Object","entries","filePath","resolve","endsWith","mkdirSync","dirname","recursive","compileAndLoad","execSync","cwd","stdio","module","schema","generateTsSchemaFromFile","readFileSync","generateTsSchemaInPlace","schemaPath","loadSchema","additionalSchemas","tempDir","mkdtempSync","os","tmpdir","tempFile","name","r","expect","toSatisfy","map","e","toString","invariant","loadSchemaWithError","error","crypto","randomUUID","toBe","some","toLowerCase","test","getTestDbProvider","val","process","env","includes","Error","TEST_PG_CONFIG","host","port","parseInt","user","password","createTestClient","schema","options","schemaFile","workDir","_schema","provider","dbName","getTestDbName","dbUrl","model","generated","generateTsSchema","extraSourceFiles","type","createTestProject","schemaContent","fs","readFileSync","replace","writeFileSync","path","join","invariant","debug","console","log","plugins","rest","_options","usePrismaPush","r","loadDocumentWithPlugins","success","errors","prismaSchema","PrismaSchemaGenerator","prismaSchemaText","generate","resolve","execSync","cwd","stdio","pgClient","PGClient","connect","query","end","dialect","PostgresDialect","pool","Pool","database","SqliteDialect","SQLite","client","ZenStackClient","$pushSchema","plugin","$use","createPolicyTestClient","PolicyPlugin","testLogger","e","sql","parameters","testName","expect","getState","currentTestName","testPath","digest","createHash","update","toLowerCase","substring","slice","import_orm","import_vitest","isPromise","value","then","catch","expectError","err","errorType","message","pass","expectErrorMessages","expectedMessages","m","toLowerCase","includes","undefined","expect","extend","toResolveTruthy","received","r","toResolveFalsy","toResolveNull","toResolveWithLength","length","Array","isArray","toBeRejectedNotFound","NotFoundError","toBeRejectedByPolicy","RejectedByPolicyError","toBeRejectedByValidation","InputValidationError"]}
package/dist/index.d.cts CHANGED
@@ -1,8 +1,8 @@
1
- import { ClientOptions, ClientContract } from '@zenstackhq/runtime';
2
- import { SchemaDef } from '@zenstackhq/runtime/schema';
1
+ import { ClientOptions, ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
3
  import { LogEvent } from 'kysely';
4
4
  import * as _zenstackhq_language_ast from '@zenstackhq/language/ast';
5
- import { SchemaDef as SchemaDef$1 } from '@zenstackhq/sdk/schema';
5
+ import { SchemaDef as SchemaDef$1 } from '@zenstackhq/schema';
6
6
 
7
7
  declare function getTestDbProvider(): "sqlite" | "postgresql";
8
8
  type CreateTestClientOptions<Schema extends SchemaDef> = Omit<ClientOptions<Schema>, 'dialect'> & {
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { ClientOptions, ClientContract } from '@zenstackhq/runtime';
2
- import { SchemaDef } from '@zenstackhq/runtime/schema';
1
+ import { ClientOptions, ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
3
  import { LogEvent } from 'kysely';
4
4
  import * as _zenstackhq_language_ast from '@zenstackhq/language/ast';
5
- import { SchemaDef as SchemaDef$1 } from '@zenstackhq/sdk/schema';
5
+ import { SchemaDef as SchemaDef$1 } from '@zenstackhq/schema';
6
6
 
7
7
  declare function getTestDbProvider(): "sqlite" | "postgresql";
8
8
  type CreateTestClientOptions<Schema extends SchemaDef> = Omit<ClientOptions<Schema>, 'dialect'> & {
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
10
10
  // src/client.ts
11
11
  import { invariant as invariant2 } from "@zenstackhq/common-helpers";
12
12
  import { PolicyPlugin } from "@zenstackhq/plugin-policy";
13
- import { ZenStackClient } from "@zenstackhq/runtime";
13
+ import { ZenStackClient } from "@zenstackhq/orm";
14
14
  import { PrismaSchemaGenerator } from "@zenstackhq/sdk";
15
15
  import SQLite from "better-sqlite3";
16
16
  import { PostgresDialect, SqliteDialect } from "kysely";
@@ -40,7 +40,7 @@ function createTestProject(zmodelContent) {
40
40
  const zenstackPackages = [
41
41
  "language",
42
42
  "sdk",
43
- "runtime",
43
+ "orm",
44
44
  "cli"
45
45
  ];
46
46
  fs.mkdirSync(path.join(workDir, "node_modules/@zenstackhq"));
@@ -350,7 +350,7 @@ function getTestDbName(provider) {
350
350
  __name(getTestDbName, "getTestDbName");
351
351
 
352
352
  // src/vitest-ext.ts
353
- import { InputValidationError, NotFoundError, RejectedByPolicyError } from "@zenstackhq/runtime";
353
+ import { InputValidationError, NotFoundError, RejectedByPolicyError } from "@zenstackhq/orm";
354
354
  import { expect as expect3 } from "vitest";
355
355
  function isPromise(value) {
356
356
  return typeof value.then === "function" && typeof value.catch === "function";
@@ -372,7 +372,7 @@ function expectError(err, errorType) {
372
372
  __name(expectError, "expectError");
373
373
  function expectErrorMessages(expectedMessages, message) {
374
374
  for (const m of expectedMessages) {
375
- if (!message.includes(m)) {
375
+ if (!message.toLowerCase().includes(m.toLowerCase())) {
376
376
  return {
377
377
  message: /* @__PURE__ */ __name(() => `expected message not found in error: ${m}, got message: ${message}`, "message"),
378
378
  pass: false
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/project.ts","../src/schema.ts","../src/utils.ts","../src/vitest-ext.ts"],"sourcesContent":["import { invariant } from '@zenstackhq/common-helpers';\nimport type { Model } from '@zenstackhq/language/ast';\nimport { PolicyPlugin } from '@zenstackhq/plugin-policy';\nimport { ZenStackClient, type ClientContract, type ClientOptions } from '@zenstackhq/runtime';\nimport type { SchemaDef } from '@zenstackhq/runtime/schema';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport SQLite from 'better-sqlite3';\nimport { PostgresDialect, SqliteDialect, type LogEvent } from 'kysely';\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 { 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'].includes(val!)) {\n throw new Error(`Invalid TEST_DB_PROVIDER value: ${val}`);\n }\n return val as 'sqlite' | 'postgresql';\n}\n\nconst 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 type CreateTestClientOptions<Schema extends SchemaDef> = Omit<ClientOptions<Schema>, 'dialect'> & {\n provider?: 'sqlite' | 'postgresql';\n dbName?: string;\n usePrismaPush?: boolean;\n extraSourceFiles?: Record<string, string>;\n workDir?: string;\n debug?: boolean;\n};\n\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<ClientContract<Schema>>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: string,\n options?: CreateTestClientOptions<Schema>,\n): Promise<any>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema | string,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<any> {\n let workDir = options?.workDir;\n let _schema: Schema;\n const provider = options?.provider ?? getTestDbProvider() ?? 'sqlite';\n\n const dbName = options?.dbName ?? getTestDbName(provider);\n\n const dbUrl =\n provider === 'sqlite'\n ? `file:${dbName}`\n : `postgres://${TEST_PG_CONFIG.user}:${TEST_PG_CONFIG.password}@${TEST_PG_CONFIG.host}:${TEST_PG_CONFIG.port}/${dbName}`;\n\n let model: Model | undefined;\n\n if (typeof schema === 'string') {\n const generated = await generateTsSchema(schema, provider, dbUrl, options?.extraSourceFiles);\n workDir = generated.workDir;\n model = generated.model;\n // replace schema's provider\n _schema = {\n ...generated.schema,\n provider: {\n type: provider,\n },\n } as Schema;\n } else {\n // replace schema's provider\n _schema = {\n ...schema,\n provider: {\n type: provider,\n },\n };\n workDir ??= createTestProject();\n if (schemaFile) {\n let schemaContent = fs.readFileSync(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}`,\n );\n }\n fs.writeFileSync(path.join(workDir, 'schema.zmodel'), schemaContent);\n }\n }\n\n invariant(workDir);\n if (options?.debug) {\n console.log(`Work directory: ${workDir}`);\n }\n\n const { plugins, ...rest } = options ?? {};\n const _options: ClientOptions<Schema> = {\n ...rest,\n } as ClientOptions<Schema>;\n\n if (options?.usePrismaPush) {\n invariant(typeof schema === 'string' || schemaFile, 'a schema file must be provided when using prisma db push');\n if (!model) {\n const r = await loadDocumentWithPlugins(path.join(workDir, 'schema.zmodel'));\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: 'ignore',\n });\n } else {\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 }\n }\n\n if (provider === 'postgresql') {\n _options.dialect = new PostgresDialect({\n pool: new Pool({\n ...TEST_PG_CONFIG,\n database: dbName,\n }),\n });\n } else {\n _options.dialect = new SqliteDialect({\n database: new SQLite(path.join(workDir!, dbName)),\n });\n }\n\n let client = new ZenStackClient(_schema, _options);\n\n if (!options?.usePrismaPush) {\n await client.$pushSchema();\n }\n\n if (plugins) {\n for (const plugin of plugins) {\n client = client.$use(plugin);\n }\n }\n\n return client;\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 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', 'runtime', '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 },\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 { invariant } from '@zenstackhq/common-helpers';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/sdk/schema';\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: 'sqlite' | 'postgresql', 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 .exhaustive();\n}\n\nexport async function generateTsSchema(\n schemaText: string,\n provider: 'sqlite' | 'postgresql' = 'sqlite',\n dbUrl?: string,\n extraSourceFiles?: Record<string, string>,\n) {\n const workDir = createTestProject();\n\n const zmodelPath = path.join(workDir, 'schema.zmodel');\n const noPrelude = schemaText.includes('datasource ');\n fs.writeFileSync(zmodelPath, `${noPrelude ? '' : makePrelude(provider, dbUrl)}\\n\\n${schemaText}`);\n\n const result = await loadDocumentWithPlugins(zmodelPath);\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, workDir);\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 return { workDir, schema: module.schema as SchemaDef };\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, 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 { loadDocument } from '@zenstackhq/language';\n\nexport function loadDocumentWithPlugins(filePath: string) {\n const pluginModelFiles = [require.resolve('@zenstackhq/plugin-policy/plugin.zmodel')];\n return loadDocument(filePath, pluginModelFiles);\n}\n","import { InputValidationError, NotFoundError, RejectedByPolicyError } from '@zenstackhq/runtime';\nimport { expect } from 'vitest';\n\nfunction isPromise(value: any) {\n return typeof value.then === 'function' && typeof value.catch === 'function';\n}\n\nfunction expectError(err: any, errorType: any) {\n if (err instanceof errorType) {\n return {\n message: () => '',\n pass: true,\n };\n } else {\n return {\n message: () => `expected ${errorType}, got ${err}`,\n pass: false,\n };\n }\n}\n\nfunction expectErrorMessages(expectedMessages: string[], message: string) {\n for (const m of expectedMessages) {\n if (!message.includes(m)) {\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 expectError(err, NotFoundError);\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 RejectedByPolicyError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, RejectedByPolicyError);\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 InputValidationError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, InputValidationError);\n }\n return {\n message: () => `expected InputValidationError, got no error`,\n pass: false,\n };\n },\n});\n"],"mappings":"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","names":["invariant","PolicyPlugin","ZenStackClient","PrismaSchemaGenerator","SQLite","PostgresDialect","SqliteDialect","execSync","createHash","fs","path","Client","PGClient","Pool","expect","fs","path","tmp","createTestProject","zmodelContent","name","workDir","tmp","dirSync","unsafeCleanup","fs","mkdirSync","path","join","nodeModules","readdirSync","__dirname","entry","startsWith","symlinkSync","zenstackPackages","pkg","writeFileSync","JSON","stringify","version","type","compilerOptions","module","target","moduleResolution","esModuleInterop","skipLibCheck","strict","include","invariant","TsSchemaGenerator","execSync","crypto","fs","os","path","match","expect","loadDocument","loadDocumentWithPlugins","filePath","pluginModelFiles","require","resolve","loadDocument","makePrelude","provider","dbUrl","match","with","exhaustive","generateTsSchema","schemaText","extraSourceFiles","workDir","createTestProject","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","result","loadDocumentWithPlugins","success","Error","errors","generator","TsSchemaGenerator","generate","model","fileName","content","Object","entries","filePath","resolve","endsWith","mkdirSync","dirname","recursive","compileAndLoad","execSync","cwd","stdio","module","schema","generateTsSchemaFromFile","readFileSync","generateTsSchemaInPlace","schemaPath","loadSchema","additionalSchemas","tempDir","mkdtempSync","os","tmpdir","tempFile","name","r","expect","toSatisfy","map","e","toString","invariant","loadSchemaWithError","error","crypto","randomUUID","toBe","some","toLowerCase","test","getTestDbProvider","val","process","env","includes","Error","TEST_PG_CONFIG","host","port","parseInt","user","password","createTestClient","schema","options","schemaFile","workDir","_schema","provider","dbName","getTestDbName","dbUrl","model","generated","generateTsSchema","extraSourceFiles","type","createTestProject","schemaContent","fs","readFileSync","replace","writeFileSync","path","join","invariant","debug","console","log","plugins","rest","_options","usePrismaPush","r","loadDocumentWithPlugins","success","errors","prismaSchema","PrismaSchemaGenerator","prismaSchemaText","generate","resolve","execSync","cwd","stdio","pgClient","PGClient","connect","query","end","dialect","PostgresDialect","pool","Pool","database","SqliteDialect","SQLite","client","ZenStackClient","$pushSchema","plugin","$use","createPolicyTestClient","PolicyPlugin","testLogger","e","sql","parameters","testName","expect","getState","currentTestName","testPath","digest","createHash","update","toLowerCase","substring","slice","InputValidationError","NotFoundError","RejectedByPolicyError","expect","isPromise","value","then","catch","expectError","err","errorType","message","pass","expectErrorMessages","expectedMessages","m","includes","undefined","expect","extend","toResolveTruthy","received","r","toResolveFalsy","toResolveNull","toResolveWithLength","length","Array","isArray","toBeRejectedNotFound","NotFoundError","toBeRejectedByPolicy","RejectedByPolicyError","toBeRejectedByValidation","InputValidationError"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/project.ts","../src/schema.ts","../src/utils.ts","../src/vitest-ext.ts"],"sourcesContent":["import { invariant } from '@zenstackhq/common-helpers';\nimport type { Model } from '@zenstackhq/language/ast';\nimport { PolicyPlugin } from '@zenstackhq/plugin-policy';\nimport { ZenStackClient, type ClientContract, type ClientOptions } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { PrismaSchemaGenerator } from '@zenstackhq/sdk';\nimport SQLite from 'better-sqlite3';\nimport { PostgresDialect, SqliteDialect, type LogEvent } from 'kysely';\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 { 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'].includes(val!)) {\n throw new Error(`Invalid TEST_DB_PROVIDER value: ${val}`);\n }\n return val as 'sqlite' | 'postgresql';\n}\n\nconst 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 type CreateTestClientOptions<Schema extends SchemaDef> = Omit<ClientOptions<Schema>, 'dialect'> & {\n provider?: 'sqlite' | 'postgresql';\n dbName?: string;\n usePrismaPush?: boolean;\n extraSourceFiles?: Record<string, string>;\n workDir?: string;\n debug?: boolean;\n};\n\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<ClientContract<Schema>>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: string,\n options?: CreateTestClientOptions<Schema>,\n): Promise<any>;\nexport async function createTestClient<Schema extends SchemaDef>(\n schema: Schema | string,\n options?: CreateTestClientOptions<Schema>,\n schemaFile?: string,\n): Promise<any> {\n let workDir = options?.workDir;\n let _schema: Schema;\n const provider = options?.provider ?? getTestDbProvider() ?? 'sqlite';\n\n const dbName = options?.dbName ?? getTestDbName(provider);\n\n const dbUrl =\n provider === 'sqlite'\n ? `file:${dbName}`\n : `postgres://${TEST_PG_CONFIG.user}:${TEST_PG_CONFIG.password}@${TEST_PG_CONFIG.host}:${TEST_PG_CONFIG.port}/${dbName}`;\n\n let model: Model | undefined;\n\n if (typeof schema === 'string') {\n const generated = await generateTsSchema(schema, provider, dbUrl, options?.extraSourceFiles);\n workDir = generated.workDir;\n model = generated.model;\n // replace schema's provider\n _schema = {\n ...generated.schema,\n provider: {\n type: provider,\n },\n } as Schema;\n } else {\n // replace schema's provider\n _schema = {\n ...schema,\n provider: {\n type: provider,\n },\n };\n workDir ??= createTestProject();\n if (schemaFile) {\n let schemaContent = fs.readFileSync(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}`,\n );\n }\n fs.writeFileSync(path.join(workDir, 'schema.zmodel'), schemaContent);\n }\n }\n\n invariant(workDir);\n if (options?.debug) {\n console.log(`Work directory: ${workDir}`);\n }\n\n const { plugins, ...rest } = options ?? {};\n const _options: ClientOptions<Schema> = {\n ...rest,\n } as ClientOptions<Schema>;\n\n if (options?.usePrismaPush) {\n invariant(typeof schema === 'string' || schemaFile, 'a schema file must be provided when using prisma db push');\n if (!model) {\n const r = await loadDocumentWithPlugins(path.join(workDir, 'schema.zmodel'));\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: 'ignore',\n });\n } else {\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 }\n }\n\n if (provider === 'postgresql') {\n _options.dialect = new PostgresDialect({\n pool: new Pool({\n ...TEST_PG_CONFIG,\n database: dbName,\n }),\n });\n } else {\n _options.dialect = new SqliteDialect({\n database: new SQLite(path.join(workDir!, dbName)),\n });\n }\n\n let client = new ZenStackClient(_schema, _options);\n\n if (!options?.usePrismaPush) {\n await client.$pushSchema();\n }\n\n if (plugins) {\n for (const plugin of plugins) {\n client = client.$use(plugin);\n }\n }\n\n return client;\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 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', '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 },\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 { invariant } from '@zenstackhq/common-helpers';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/schema';\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: 'sqlite' | 'postgresql', 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 .exhaustive();\n}\n\nexport async function generateTsSchema(\n schemaText: string,\n provider: 'sqlite' | 'postgresql' = 'sqlite',\n dbUrl?: string,\n extraSourceFiles?: Record<string, string>,\n) {\n const workDir = createTestProject();\n\n const zmodelPath = path.join(workDir, 'schema.zmodel');\n const noPrelude = schemaText.includes('datasource ');\n fs.writeFileSync(zmodelPath, `${noPrelude ? '' : makePrelude(provider, dbUrl)}\\n\\n${schemaText}`);\n\n const result = await loadDocumentWithPlugins(zmodelPath);\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, workDir);\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 return { workDir, schema: module.schema as SchemaDef };\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, 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 { loadDocument } from '@zenstackhq/language';\n\nexport function loadDocumentWithPlugins(filePath: string) {\n const pluginModelFiles = [require.resolve('@zenstackhq/plugin-policy/plugin.zmodel')];\n return loadDocument(filePath, pluginModelFiles);\n}\n","import { InputValidationError, NotFoundError, RejectedByPolicyError } 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 expectError(err: any, errorType: any) {\n if (err instanceof errorType) {\n return {\n message: () => '',\n pass: true,\n };\n } else {\n return {\n message: () => `expected ${errorType}, 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 expectError(err, NotFoundError);\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 RejectedByPolicyError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, RejectedByPolicyError);\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 InputValidationError) {\n const r = expectErrorMessages(expectedMessages, err.message || '');\n if (r) {\n return r;\n }\n }\n return expectError(err, InputValidationError);\n }\n return {\n message: () => `expected InputValidationError, got no error`,\n pass: false,\n };\n },\n});\n"],"mappings":"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","names":["invariant","PolicyPlugin","ZenStackClient","PrismaSchemaGenerator","SQLite","PostgresDialect","SqliteDialect","execSync","createHash","fs","path","Client","PGClient","Pool","expect","fs","path","tmp","createTestProject","zmodelContent","name","workDir","tmp","dirSync","unsafeCleanup","fs","mkdirSync","path","join","nodeModules","readdirSync","__dirname","entry","startsWith","symlinkSync","zenstackPackages","pkg","writeFileSync","JSON","stringify","version","type","compilerOptions","module","target","moduleResolution","esModuleInterop","skipLibCheck","strict","include","invariant","TsSchemaGenerator","execSync","crypto","fs","os","path","match","expect","loadDocument","loadDocumentWithPlugins","filePath","pluginModelFiles","require","resolve","loadDocument","makePrelude","provider","dbUrl","match","with","exhaustive","generateTsSchema","schemaText","extraSourceFiles","workDir","createTestProject","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","result","loadDocumentWithPlugins","success","Error","errors","generator","TsSchemaGenerator","generate","model","fileName","content","Object","entries","filePath","resolve","endsWith","mkdirSync","dirname","recursive","compileAndLoad","execSync","cwd","stdio","module","schema","generateTsSchemaFromFile","readFileSync","generateTsSchemaInPlace","schemaPath","loadSchema","additionalSchemas","tempDir","mkdtempSync","os","tmpdir","tempFile","name","r","expect","toSatisfy","map","e","toString","invariant","loadSchemaWithError","error","crypto","randomUUID","toBe","some","toLowerCase","test","getTestDbProvider","val","process","env","includes","Error","TEST_PG_CONFIG","host","port","parseInt","user","password","createTestClient","schema","options","schemaFile","workDir","_schema","provider","dbName","getTestDbName","dbUrl","model","generated","generateTsSchema","extraSourceFiles","type","createTestProject","schemaContent","fs","readFileSync","replace","writeFileSync","path","join","invariant","debug","console","log","plugins","rest","_options","usePrismaPush","r","loadDocumentWithPlugins","success","errors","prismaSchema","PrismaSchemaGenerator","prismaSchemaText","generate","resolve","execSync","cwd","stdio","pgClient","PGClient","connect","query","end","dialect","PostgresDialect","pool","Pool","database","SqliteDialect","SQLite","client","ZenStackClient","$pushSchema","plugin","$use","createPolicyTestClient","PolicyPlugin","testLogger","e","sql","parameters","testName","expect","getState","currentTestName","testPath","digest","createHash","update","toLowerCase","substring","slice","InputValidationError","NotFoundError","RejectedByPolicyError","expect","isPromise","value","then","catch","expectError","err","errorType","message","pass","expectErrorMessages","expectedMessages","m","toLowerCase","includes","undefined","expect","extend","toResolveTruthy","received","r","toResolveFalsy","toResolveNull","toResolveWithLength","length","Array","isArray","toBeRejectedNotFound","NotFoundError","toBeRejectedByPolicy","RejectedByPolicyError","toBeRejectedByValidation","InputValidationError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenstackhq/testtools",
3
- "version": "3.0.0-beta.13",
3
+ "version": "3.0.0-beta.15",
4
4
  "description": "ZenStack Test Tools",
5
5
  "type": "module",
6
6
  "keywords": [],
@@ -30,11 +30,12 @@
30
30
  "prisma": "^6.10.0",
31
31
  "tmp": "^0.2.3",
32
32
  "ts-pattern": "^5.7.1",
33
- "@zenstackhq/common-helpers": "3.0.0-beta.13",
34
- "@zenstackhq/language": "3.0.0-beta.13",
35
- "@zenstackhq/sdk": "3.0.0-beta.13",
36
- "@zenstackhq/runtime": "3.0.0-beta.13",
37
- "@zenstackhq/plugin-policy": "3.0.0-beta.13"
33
+ "@zenstackhq/common-helpers": "3.0.0-beta.15",
34
+ "@zenstackhq/schema": "3.0.0-beta.15",
35
+ "@zenstackhq/orm": "3.0.0-beta.15",
36
+ "@zenstackhq/sdk": "3.0.0-beta.15",
37
+ "@zenstackhq/language": "3.0.0-beta.15",
38
+ "@zenstackhq/plugin-policy": "3.0.0-beta.15"
38
39
  },
39
40
  "peerDependencies": {
40
41
  "better-sqlite3": "^12.2.0",
@@ -46,8 +47,8 @@
46
47
  "@types/tmp": "^0.2.6",
47
48
  "@types/pg": "^8.11.11",
48
49
  "typescript": "^5.8.0",
49
- "@zenstackhq/eslint-config": "3.0.0-beta.13",
50
- "@zenstackhq/typescript-config": "3.0.0-beta.13"
50
+ "@zenstackhq/eslint-config": "3.0.0-beta.15",
51
+ "@zenstackhq/typescript-config": "3.0.0-beta.15"
51
52
  },
52
53
  "scripts": {
53
54
  "build": "tsc --noEmit && tsup-node",