@zenstackhq/testtools 3.0.0-beta.3 → 3.0.0-beta.5
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 +13 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -34,7 +34,8 @@ __export(src_exports, {
|
|
|
34
34
|
createTestProject: () => createTestProject,
|
|
35
35
|
generateTsSchema: () => generateTsSchema,
|
|
36
36
|
generateTsSchemaFromFile: () => generateTsSchemaFromFile,
|
|
37
|
-
generateTsSchemaInPlace: () => generateTsSchemaInPlace
|
|
37
|
+
generateTsSchemaInPlace: () => generateTsSchemaInPlace,
|
|
38
|
+
getPluginModules: () => getPluginModules
|
|
38
39
|
});
|
|
39
40
|
module.exports = __toCommonJS(src_exports);
|
|
40
41
|
|
|
@@ -119,7 +120,7 @@ async function generateTsSchema(schemaText, provider = "sqlite", dbUrl, extraSou
|
|
|
119
120
|
import_node_fs2.default.writeFileSync(zmodelPath, `${noPrelude ? "" : makePrelude(provider, dbUrl)}
|
|
120
121
|
|
|
121
122
|
${schemaText}`);
|
|
122
|
-
const pluginModelFiles =
|
|
123
|
+
const pluginModelFiles = getPluginModules();
|
|
123
124
|
const result = await (0, import_language.loadDocument)(zmodelPath, pluginModelFiles);
|
|
124
125
|
if (!result.success) {
|
|
125
126
|
throw new Error(`Failed to load schema from ${zmodelPath}: ${result.errors}`);
|
|
@@ -135,9 +136,16 @@ ${schemaText}`);
|
|
|
135
136
|
import_node_fs2.default.writeFileSync(filePath, content);
|
|
136
137
|
}
|
|
137
138
|
}
|
|
138
|
-
return
|
|
139
|
+
return {
|
|
140
|
+
...await compileAndLoad(workDir),
|
|
141
|
+
model: result.model
|
|
142
|
+
};
|
|
139
143
|
}
|
|
140
144
|
__name(generateTsSchema, "generateTsSchema");
|
|
145
|
+
function getPluginModules() {
|
|
146
|
+
return import_glob.glob.sync(import_node_path2.default.resolve(__dirname, "../../runtime/src/plugins/**/plugin.zmodel"));
|
|
147
|
+
}
|
|
148
|
+
__name(getPluginModules, "getPluginModules");
|
|
141
149
|
async function compileAndLoad(workDir) {
|
|
142
150
|
(0, import_node_child_process.execSync)("npx tsc", {
|
|
143
151
|
cwd: workDir,
|
|
@@ -172,6 +180,7 @@ __name(generateTsSchemaInPlace, "generateTsSchemaInPlace");
|
|
|
172
180
|
createTestProject,
|
|
173
181
|
generateTsSchema,
|
|
174
182
|
generateTsSchemaFromFile,
|
|
175
|
-
generateTsSchemaInPlace
|
|
183
|
+
generateTsSchemaInPlace,
|
|
184
|
+
getPluginModules
|
|
176
185
|
});
|
|
177
186
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/project.ts","../src/schema.ts"],"sourcesContent":["export * from './project';\nexport * from './schema';\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport tmp from 'tmp';\n\nexport function createTestProject() {\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 return workDir;\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/sdk/schema';\nimport { glob } from 'glob';\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { match } from 'ts-pattern';\nimport { createTestProject } from './project';\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 pluginModelFiles =
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/project.ts","../src/schema.ts"],"sourcesContent":["export * from './project';\nexport * from './schema';\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport tmp from 'tmp';\n\nexport function createTestProject() {\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 return workDir;\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/sdk/schema';\nimport { glob } from 'glob';\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { match } from 'ts-pattern';\nimport { createTestProject } from './project';\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 pluginModelFiles = getPluginModules();\n const result = await loadDocument(zmodelPath, pluginModelFiles);\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}.ts`);\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\nexport function getPluginModules() {\n return glob.sync(path.resolve(__dirname, '../../runtime/src/plugins/**/plugin.zmodel'));\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 pluginModelFiles = glob.sync(path.resolve(__dirname, '../../runtime/src/plugins/**/plugin.zmodel'));\n const result = await loadDocument(schemaPath, pluginModelFiles);\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"],"mappings":"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","names":["createTestProject","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","makePrelude","provider","dbUrl","match","with","exhaustive","generateTsSchema","schemaText","extraSourceFiles","workDir","createTestProject","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","pluginModelFiles","getPluginModules","result","loadDocument","success","Error","errors","generator","TsSchemaGenerator","generate","model","fileName","content","Object","entries","filePath","resolve","mkdirSync","dirname","recursive","compileAndLoad","glob","sync","__dirname","execSync","cwd","stdio","module","schema","generateTsSchemaFromFile","readFileSync","generateTsSchemaInPlace","schemaPath"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
import * as _zenstackhq_language_ast from '@zenstackhq/language/ast';
|
|
1
2
|
import { SchemaDef } from '@zenstackhq/sdk/schema';
|
|
2
3
|
|
|
3
4
|
declare function createTestProject(): string;
|
|
4
5
|
|
|
5
6
|
declare function generateTsSchema(schemaText: string, provider?: 'sqlite' | 'postgresql', dbUrl?: string, extraSourceFiles?: Record<string, string>): Promise<{
|
|
7
|
+
model: _zenstackhq_language_ast.Model;
|
|
6
8
|
workDir: string;
|
|
7
9
|
schema: SchemaDef;
|
|
8
10
|
}>;
|
|
11
|
+
declare function getPluginModules(): string[];
|
|
9
12
|
declare function generateTsSchemaFromFile(filePath: string): Promise<{
|
|
13
|
+
model: _zenstackhq_language_ast.Model;
|
|
10
14
|
workDir: string;
|
|
11
15
|
schema: SchemaDef;
|
|
12
16
|
}>;
|
|
@@ -15,4 +19,4 @@ declare function generateTsSchemaInPlace(schemaPath: string): Promise<{
|
|
|
15
19
|
schema: SchemaDef;
|
|
16
20
|
}>;
|
|
17
21
|
|
|
18
|
-
export { createTestProject, generateTsSchema, generateTsSchemaFromFile, generateTsSchemaInPlace };
|
|
22
|
+
export { createTestProject, generateTsSchema, generateTsSchemaFromFile, generateTsSchemaInPlace, getPluginModules };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
import * as _zenstackhq_language_ast from '@zenstackhq/language/ast';
|
|
1
2
|
import { SchemaDef } from '@zenstackhq/sdk/schema';
|
|
2
3
|
|
|
3
4
|
declare function createTestProject(): string;
|
|
4
5
|
|
|
5
6
|
declare function generateTsSchema(schemaText: string, provider?: 'sqlite' | 'postgresql', dbUrl?: string, extraSourceFiles?: Record<string, string>): Promise<{
|
|
7
|
+
model: _zenstackhq_language_ast.Model;
|
|
6
8
|
workDir: string;
|
|
7
9
|
schema: SchemaDef;
|
|
8
10
|
}>;
|
|
11
|
+
declare function getPluginModules(): string[];
|
|
9
12
|
declare function generateTsSchemaFromFile(filePath: string): Promise<{
|
|
13
|
+
model: _zenstackhq_language_ast.Model;
|
|
10
14
|
workDir: string;
|
|
11
15
|
schema: SchemaDef;
|
|
12
16
|
}>;
|
|
@@ -15,4 +19,4 @@ declare function generateTsSchemaInPlace(schemaPath: string): Promise<{
|
|
|
15
19
|
schema: SchemaDef;
|
|
16
20
|
}>;
|
|
17
21
|
|
|
18
|
-
export { createTestProject, generateTsSchema, generateTsSchemaFromFile, generateTsSchemaInPlace };
|
|
22
|
+
export { createTestProject, generateTsSchema, generateTsSchemaFromFile, generateTsSchemaInPlace, getPluginModules };
|
package/dist/index.js
CHANGED
|
@@ -82,7 +82,7 @@ async function generateTsSchema(schemaText, provider = "sqlite", dbUrl, extraSou
|
|
|
82
82
|
fs2.writeFileSync(zmodelPath, `${noPrelude ? "" : makePrelude(provider, dbUrl)}
|
|
83
83
|
|
|
84
84
|
${schemaText}`);
|
|
85
|
-
const pluginModelFiles =
|
|
85
|
+
const pluginModelFiles = getPluginModules();
|
|
86
86
|
const result = await loadDocument(zmodelPath, pluginModelFiles);
|
|
87
87
|
if (!result.success) {
|
|
88
88
|
throw new Error(`Failed to load schema from ${zmodelPath}: ${result.errors}`);
|
|
@@ -98,9 +98,16 @@ ${schemaText}`);
|
|
|
98
98
|
fs2.writeFileSync(filePath, content);
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
return
|
|
101
|
+
return {
|
|
102
|
+
...await compileAndLoad(workDir),
|
|
103
|
+
model: result.model
|
|
104
|
+
};
|
|
102
105
|
}
|
|
103
106
|
__name(generateTsSchema, "generateTsSchema");
|
|
107
|
+
function getPluginModules() {
|
|
108
|
+
return glob.sync(path2.resolve(__dirname, "../../runtime/src/plugins/**/plugin.zmodel"));
|
|
109
|
+
}
|
|
110
|
+
__name(getPluginModules, "getPluginModules");
|
|
104
111
|
async function compileAndLoad(workDir) {
|
|
105
112
|
execSync("npx tsc", {
|
|
106
113
|
cwd: workDir,
|
|
@@ -134,6 +141,7 @@ export {
|
|
|
134
141
|
createTestProject,
|
|
135
142
|
generateTsSchema,
|
|
136
143
|
generateTsSchemaFromFile,
|
|
137
|
-
generateTsSchemaInPlace
|
|
144
|
+
generateTsSchemaInPlace,
|
|
145
|
+
getPluginModules
|
|
138
146
|
};
|
|
139
147
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/project.ts","../src/schema.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport tmp from 'tmp';\n\nexport function createTestProject() {\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 return workDir;\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/sdk/schema';\nimport { glob } from 'glob';\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { match } from 'ts-pattern';\nimport { createTestProject } from './project';\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 pluginModelFiles =
|
|
1
|
+
{"version":3,"sources":["../src/project.ts","../src/schema.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport tmp from 'tmp';\n\nexport function createTestProject() {\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 return workDir;\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport { TsSchemaGenerator } from '@zenstackhq/sdk';\nimport type { SchemaDef } from '@zenstackhq/sdk/schema';\nimport { glob } from 'glob';\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { match } from 'ts-pattern';\nimport { createTestProject } from './project';\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 pluginModelFiles = getPluginModules();\n const result = await loadDocument(zmodelPath, pluginModelFiles);\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}.ts`);\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\nexport function getPluginModules() {\n return glob.sync(path.resolve(__dirname, '../../runtime/src/plugins/**/plugin.zmodel'));\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 pluginModelFiles = glob.sync(path.resolve(__dirname, '../../runtime/src/plugins/**/plugin.zmodel'));\n const result = await loadDocument(schemaPath, pluginModelFiles);\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"],"mappings":"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","names":["fs","path","tmp","createTestProject","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","loadDocument","TsSchemaGenerator","glob","execSync","fs","path","match","makePrelude","provider","dbUrl","match","with","exhaustive","generateTsSchema","schemaText","extraSourceFiles","workDir","createTestProject","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","pluginModelFiles","getPluginModules","result","loadDocument","success","Error","errors","generator","TsSchemaGenerator","generate","model","fileName","content","Object","entries","filePath","resolve","mkdirSync","dirname","recursive","compileAndLoad","glob","sync","__dirname","execSync","cwd","stdio","module","schema","generateTsSchemaFromFile","readFileSync","generateTsSchemaInPlace","schemaPath"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenstackhq/testtools",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.5",
|
|
4
4
|
"description": "ZenStack Test Tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [],
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"ts-pattern": "^5.7.1",
|
|
28
28
|
"prisma": "^6.10.0",
|
|
29
29
|
"typescript": "^5.8.0",
|
|
30
|
-
"@zenstackhq/language": "3.0.0-beta.
|
|
31
|
-
"@zenstackhq/sdk": "3.0.0-beta.
|
|
30
|
+
"@zenstackhq/language": "3.0.0-beta.5",
|
|
31
|
+
"@zenstackhq/sdk": "3.0.0-beta.5"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"better-sqlite3": "^12.2.0",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^20.17.24",
|
|
39
39
|
"@types/tmp": "^0.2.6",
|
|
40
|
-
"@zenstackhq/
|
|
41
|
-
"@zenstackhq/
|
|
40
|
+
"@zenstackhq/eslint-config": "3.0.0-beta.5",
|
|
41
|
+
"@zenstackhq/typescript-config": "3.0.0-beta.5"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsc --noEmit && tsup-node",
|