@zenstackhq/testtools 1.0.0-beta.9 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/index.cjs +131 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -22
- package/.npmrc.template +0 -1
- package/README.md +0 -1
- package/index.d.ts +0 -1
- package/index.js +0 -18
- package/index.js.map +0 -1
- package/package.template.json +0 -20
- package/schema.d.ts +0 -70
- package/schema.js +0 -277
- package/schema.js.map +0 -1
package/LICENSE
CHANGED
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
|
|
31
|
+
// src/index.ts
|
|
32
|
+
var src_exports = {};
|
|
33
|
+
__export(src_exports, {
|
|
34
|
+
generateTsSchema: () => generateTsSchema,
|
|
35
|
+
generateTsSchemaFromFile: () => generateTsSchemaFromFile
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(src_exports);
|
|
38
|
+
|
|
39
|
+
// src/schema.ts
|
|
40
|
+
var import_sdk = require("@zenstackhq/sdk");
|
|
41
|
+
var import_glob = require("glob");
|
|
42
|
+
var import_node_child_process = require("child_process");
|
|
43
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
44
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
45
|
+
var import_tmp = __toESM(require("tmp"), 1);
|
|
46
|
+
var import_ts_pattern = require("ts-pattern");
|
|
47
|
+
function makePrelude(provider, dbName) {
|
|
48
|
+
return (0, import_ts_pattern.match)(provider).with("sqlite", () => {
|
|
49
|
+
return `
|
|
50
|
+
datasource db {
|
|
51
|
+
provider = 'sqlite'
|
|
52
|
+
url = '${dbName ?? ":memory:"}'
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
}).with("postgresql", () => {
|
|
56
|
+
return `
|
|
57
|
+
datasource db {
|
|
58
|
+
provider = 'postgresql'
|
|
59
|
+
url = 'postgres://postgres:postgres@localhost:5432/${dbName}'
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
}).exhaustive();
|
|
63
|
+
}
|
|
64
|
+
__name(makePrelude, "makePrelude");
|
|
65
|
+
async function generateTsSchema(schemaText, provider = "sqlite", dbName) {
|
|
66
|
+
const { name: workDir } = import_tmp.default.dirSync({
|
|
67
|
+
unsafeCleanup: true
|
|
68
|
+
});
|
|
69
|
+
console.log(`Working directory: ${workDir}`);
|
|
70
|
+
const zmodelPath = import_node_path.default.join(workDir, "schema.zmodel");
|
|
71
|
+
const noPrelude = schemaText.includes("datasource ");
|
|
72
|
+
import_node_fs.default.writeFileSync(zmodelPath, `${noPrelude ? "" : makePrelude(provider, dbName)}
|
|
73
|
+
|
|
74
|
+
${schemaText}`);
|
|
75
|
+
const pluginModelFiles = import_glob.glob.sync(import_node_path.default.resolve(__dirname, "../../runtime/src/plugins/**/plugin.zmodel"));
|
|
76
|
+
const generator = new import_sdk.TsSchemaGenerator();
|
|
77
|
+
const tsPath = import_node_path.default.join(workDir, "schema.ts");
|
|
78
|
+
await generator.generate(zmodelPath, pluginModelFiles, tsPath);
|
|
79
|
+
import_node_fs.default.mkdirSync(import_node_path.default.join(workDir, "node_modules"));
|
|
80
|
+
const nodeModules = import_node_fs.default.readdirSync(import_node_path.default.join(__dirname, "../node_modules"));
|
|
81
|
+
for (const entry of nodeModules) {
|
|
82
|
+
if (entry.startsWith("@zenstackhq")) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
import_node_fs.default.symlinkSync(import_node_path.default.join(__dirname, "../node_modules", entry), import_node_path.default.join(workDir, "node_modules", entry), "dir");
|
|
86
|
+
}
|
|
87
|
+
const zenstackPackages = [
|
|
88
|
+
"language",
|
|
89
|
+
"sdk",
|
|
90
|
+
"runtime"
|
|
91
|
+
];
|
|
92
|
+
import_node_fs.default.mkdirSync(import_node_path.default.join(workDir, "node_modules/@zenstackhq"));
|
|
93
|
+
for (const pkg of zenstackPackages) {
|
|
94
|
+
import_node_fs.default.symlinkSync(import_node_path.default.join(__dirname, `../../${pkg}/dist`), import_node_path.default.join(workDir, `node_modules/@zenstackhq/${pkg}`), "dir");
|
|
95
|
+
}
|
|
96
|
+
import_node_fs.default.writeFileSync(import_node_path.default.join(workDir, "package.json"), JSON.stringify({
|
|
97
|
+
name: "test",
|
|
98
|
+
version: "1.0.0",
|
|
99
|
+
type: "module"
|
|
100
|
+
}));
|
|
101
|
+
import_node_fs.default.writeFileSync(import_node_path.default.join(workDir, "tsconfig.json"), JSON.stringify({
|
|
102
|
+
compilerOptions: {
|
|
103
|
+
module: "ESNext",
|
|
104
|
+
target: "ESNext",
|
|
105
|
+
moduleResolution: "Bundler",
|
|
106
|
+
esModuleInterop: true,
|
|
107
|
+
skipLibCheck: true
|
|
108
|
+
}
|
|
109
|
+
}));
|
|
110
|
+
(0, import_node_child_process.execSync)("npx tsc", {
|
|
111
|
+
cwd: workDir,
|
|
112
|
+
stdio: "inherit"
|
|
113
|
+
});
|
|
114
|
+
const module2 = await import(import_node_path.default.join(workDir, "schema.js"));
|
|
115
|
+
return {
|
|
116
|
+
workDir,
|
|
117
|
+
schema: module2.schema
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
__name(generateTsSchema, "generateTsSchema");
|
|
121
|
+
function generateTsSchemaFromFile(filePath) {
|
|
122
|
+
const schemaText = import_node_fs.default.readFileSync(filePath, "utf8");
|
|
123
|
+
return generateTsSchema(schemaText);
|
|
124
|
+
}
|
|
125
|
+
__name(generateTsSchemaFromFile, "generateTsSchemaFromFile");
|
|
126
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
127
|
+
0 && (module.exports = {
|
|
128
|
+
generateTsSchema,
|
|
129
|
+
generateTsSchemaFromFile
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schema.ts"],"sourcesContent":["export * from './schema';\n","import { 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 tmp from 'tmp';\nimport { match } from 'ts-pattern';\n\nfunction makePrelude(provider: 'sqlite' | 'postgresql', dbName?: string) {\n return match(provider)\n .with('sqlite', () => {\n return `\ndatasource db {\n provider = 'sqlite'\n url = '${dbName ?? ':memory:'}'\n}\n`;\n })\n .with('postgresql', () => {\n return `\ndatasource db {\n provider = 'postgresql'\n url = 'postgres://postgres:postgres@localhost:5432/${dbName}'\n}\n`;\n })\n .exhaustive();\n}\n\nexport async function generateTsSchema(\n schemaText: string,\n provider: 'sqlite' | 'postgresql' = 'sqlite',\n dbName?: string\n) {\n const { name: workDir } = tmp.dirSync({ unsafeCleanup: true });\n console.log(`Working directory: ${workDir}`);\n\n const zmodelPath = path.join(workDir, 'schema.zmodel');\n const noPrelude = schemaText.includes('datasource ');\n fs.writeFileSync(\n zmodelPath,\n `${noPrelude ? '' : makePrelude(provider, dbName)}\\n\\n${schemaText}`\n );\n\n const pluginModelFiles = glob.sync(\n path.resolve(__dirname, '../../runtime/src/plugins/**/plugin.zmodel')\n );\n\n const generator = new TsSchemaGenerator();\n const tsPath = path.join(workDir, 'schema.ts');\n await generator.generate(zmodelPath, pluginModelFiles, tsPath);\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'];\n fs.mkdirSync(path.join(workDir, 'node_modules/@zenstackhq'));\n for (const pkg of zenstackPackages) {\n fs.symlinkSync(\n path.join(__dirname, `../../${pkg}/dist`),\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 name: 'test',\n version: '1.0.0',\n type: 'module',\n })\n );\n\n fs.writeFileSync(\n path.join(workDir, 'tsconfig.json'),\n JSON.stringify({\n compilerOptions: {\n module: 'ESNext',\n target: 'ESNext',\n moduleResolution: 'Bundler',\n esModuleInterop: true,\n skipLibCheck: true,\n },\n })\n );\n\n // compile the generated TS schema\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"],"mappings":"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","names":["makePrelude","provider","dbName","match","with","exhaustive","generateTsSchema","schemaText","name","workDir","tmp","dirSync","unsafeCleanup","console","log","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","pluginModelFiles","glob","sync","resolve","__dirname","generator","TsSchemaGenerator","tsPath","generate","mkdirSync","nodeModules","readdirSync","entry","startsWith","symlinkSync","zenstackPackages","pkg","JSON","stringify","version","type","compilerOptions","module","target","moduleResolution","esModuleInterop","skipLibCheck","execSync","cwd","stdio","schema","generateTsSchemaFromFile","filePath","readFileSync"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SchemaDef } from '@zenstackhq/sdk/schema';
|
|
2
|
+
|
|
3
|
+
declare function generateTsSchema(schemaText: string, provider?: 'sqlite' | 'postgresql', dbName?: string): Promise<{
|
|
4
|
+
workDir: string;
|
|
5
|
+
schema: SchemaDef;
|
|
6
|
+
}>;
|
|
7
|
+
declare function generateTsSchemaFromFile(filePath: string): Promise<{
|
|
8
|
+
workDir: string;
|
|
9
|
+
schema: SchemaDef;
|
|
10
|
+
}>;
|
|
11
|
+
|
|
12
|
+
export { generateTsSchema, generateTsSchemaFromFile };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SchemaDef } from '@zenstackhq/sdk/schema';
|
|
2
|
+
|
|
3
|
+
declare function generateTsSchema(schemaText: string, provider?: 'sqlite' | 'postgresql', dbName?: string): Promise<{
|
|
4
|
+
workDir: string;
|
|
5
|
+
schema: SchemaDef;
|
|
6
|
+
}>;
|
|
7
|
+
declare function generateTsSchemaFromFile(filePath: string): Promise<{
|
|
8
|
+
workDir: string;
|
|
9
|
+
schema: SchemaDef;
|
|
10
|
+
}>;
|
|
11
|
+
|
|
12
|
+
export { generateTsSchema, generateTsSchemaFromFile };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/schema.ts
|
|
5
|
+
import { TsSchemaGenerator } from "@zenstackhq/sdk";
|
|
6
|
+
import { glob } from "glob";
|
|
7
|
+
import { execSync } from "node:child_process";
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import tmp from "tmp";
|
|
11
|
+
import { match } from "ts-pattern";
|
|
12
|
+
function makePrelude(provider, dbName) {
|
|
13
|
+
return match(provider).with("sqlite", () => {
|
|
14
|
+
return `
|
|
15
|
+
datasource db {
|
|
16
|
+
provider = 'sqlite'
|
|
17
|
+
url = '${dbName ?? ":memory:"}'
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
}).with("postgresql", () => {
|
|
21
|
+
return `
|
|
22
|
+
datasource db {
|
|
23
|
+
provider = 'postgresql'
|
|
24
|
+
url = 'postgres://postgres:postgres@localhost:5432/${dbName}'
|
|
25
|
+
}
|
|
26
|
+
`;
|
|
27
|
+
}).exhaustive();
|
|
28
|
+
}
|
|
29
|
+
__name(makePrelude, "makePrelude");
|
|
30
|
+
async function generateTsSchema(schemaText, provider = "sqlite", dbName) {
|
|
31
|
+
const { name: workDir } = tmp.dirSync({
|
|
32
|
+
unsafeCleanup: true
|
|
33
|
+
});
|
|
34
|
+
console.log(`Working directory: ${workDir}`);
|
|
35
|
+
const zmodelPath = path.join(workDir, "schema.zmodel");
|
|
36
|
+
const noPrelude = schemaText.includes("datasource ");
|
|
37
|
+
fs.writeFileSync(zmodelPath, `${noPrelude ? "" : makePrelude(provider, dbName)}
|
|
38
|
+
|
|
39
|
+
${schemaText}`);
|
|
40
|
+
const pluginModelFiles = glob.sync(path.resolve(__dirname, "../../runtime/src/plugins/**/plugin.zmodel"));
|
|
41
|
+
const generator = new TsSchemaGenerator();
|
|
42
|
+
const tsPath = path.join(workDir, "schema.ts");
|
|
43
|
+
await generator.generate(zmodelPath, pluginModelFiles, tsPath);
|
|
44
|
+
fs.mkdirSync(path.join(workDir, "node_modules"));
|
|
45
|
+
const nodeModules = fs.readdirSync(path.join(__dirname, "../node_modules"));
|
|
46
|
+
for (const entry of nodeModules) {
|
|
47
|
+
if (entry.startsWith("@zenstackhq")) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
fs.symlinkSync(path.join(__dirname, "../node_modules", entry), path.join(workDir, "node_modules", entry), "dir");
|
|
51
|
+
}
|
|
52
|
+
const zenstackPackages = [
|
|
53
|
+
"language",
|
|
54
|
+
"sdk",
|
|
55
|
+
"runtime"
|
|
56
|
+
];
|
|
57
|
+
fs.mkdirSync(path.join(workDir, "node_modules/@zenstackhq"));
|
|
58
|
+
for (const pkg of zenstackPackages) {
|
|
59
|
+
fs.symlinkSync(path.join(__dirname, `../../${pkg}/dist`), path.join(workDir, `node_modules/@zenstackhq/${pkg}`), "dir");
|
|
60
|
+
}
|
|
61
|
+
fs.writeFileSync(path.join(workDir, "package.json"), JSON.stringify({
|
|
62
|
+
name: "test",
|
|
63
|
+
version: "1.0.0",
|
|
64
|
+
type: "module"
|
|
65
|
+
}));
|
|
66
|
+
fs.writeFileSync(path.join(workDir, "tsconfig.json"), JSON.stringify({
|
|
67
|
+
compilerOptions: {
|
|
68
|
+
module: "ESNext",
|
|
69
|
+
target: "ESNext",
|
|
70
|
+
moduleResolution: "Bundler",
|
|
71
|
+
esModuleInterop: true,
|
|
72
|
+
skipLibCheck: true
|
|
73
|
+
}
|
|
74
|
+
}));
|
|
75
|
+
execSync("npx tsc", {
|
|
76
|
+
cwd: workDir,
|
|
77
|
+
stdio: "inherit"
|
|
78
|
+
});
|
|
79
|
+
const module = await import(path.join(workDir, "schema.js"));
|
|
80
|
+
return {
|
|
81
|
+
workDir,
|
|
82
|
+
schema: module.schema
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
__name(generateTsSchema, "generateTsSchema");
|
|
86
|
+
function generateTsSchemaFromFile(filePath) {
|
|
87
|
+
const schemaText = fs.readFileSync(filePath, "utf8");
|
|
88
|
+
return generateTsSchema(schemaText);
|
|
89
|
+
}
|
|
90
|
+
__name(generateTsSchemaFromFile, "generateTsSchemaFromFile");
|
|
91
|
+
export {
|
|
92
|
+
generateTsSchema,
|
|
93
|
+
generateTsSchemaFromFile
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts"],"sourcesContent":["import { 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 tmp from 'tmp';\nimport { match } from 'ts-pattern';\n\nfunction makePrelude(provider: 'sqlite' | 'postgresql', dbName?: string) {\n return match(provider)\n .with('sqlite', () => {\n return `\ndatasource db {\n provider = 'sqlite'\n url = '${dbName ?? ':memory:'}'\n}\n`;\n })\n .with('postgresql', () => {\n return `\ndatasource db {\n provider = 'postgresql'\n url = 'postgres://postgres:postgres@localhost:5432/${dbName}'\n}\n`;\n })\n .exhaustive();\n}\n\nexport async function generateTsSchema(\n schemaText: string,\n provider: 'sqlite' | 'postgresql' = 'sqlite',\n dbName?: string\n) {\n const { name: workDir } = tmp.dirSync({ unsafeCleanup: true });\n console.log(`Working directory: ${workDir}`);\n\n const zmodelPath = path.join(workDir, 'schema.zmodel');\n const noPrelude = schemaText.includes('datasource ');\n fs.writeFileSync(\n zmodelPath,\n `${noPrelude ? '' : makePrelude(provider, dbName)}\\n\\n${schemaText}`\n );\n\n const pluginModelFiles = glob.sync(\n path.resolve(__dirname, '../../runtime/src/plugins/**/plugin.zmodel')\n );\n\n const generator = new TsSchemaGenerator();\n const tsPath = path.join(workDir, 'schema.ts');\n await generator.generate(zmodelPath, pluginModelFiles, tsPath);\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'];\n fs.mkdirSync(path.join(workDir, 'node_modules/@zenstackhq'));\n for (const pkg of zenstackPackages) {\n fs.symlinkSync(\n path.join(__dirname, `../../${pkg}/dist`),\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 name: 'test',\n version: '1.0.0',\n type: 'module',\n })\n );\n\n fs.writeFileSync(\n path.join(workDir, 'tsconfig.json'),\n JSON.stringify({\n compilerOptions: {\n module: 'ESNext',\n target: 'ESNext',\n moduleResolution: 'Bundler',\n esModuleInterop: true,\n skipLibCheck: true,\n },\n })\n );\n\n // compile the generated TS schema\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"],"mappings":";;;;AAAA,SAASA,yBAAyB;AAElC,SAASC,YAAY;AACrB,SAASC,gBAAgB;AACzB,OAAOC,QAAQ;AACf,OAAOC,UAAU;AACjB,OAAOC,SAAS;AAChB,SAASC,aAAa;AAEtB,SAASC,YAAYC,UAAmCC,QAAe;AACnE,SAAOC,MAAMF,QAAAA,EACRG,KAAK,UAAU,MAAA;AACZ,WAAO;;;aAGNF,UAAU,UAAA;;;EAGf,CAAA,EACCE,KAAK,cAAc,MAAA;AAChB,WAAO;;;yDAGsCF,MAAAA;;;EAGjD,CAAA,EACCG,WAAU;AACnB;AAnBSL;AAqBT,eAAsBM,iBAClBC,YACAN,WAAoC,UACpCC,QAAe;AAEf,QAAM,EAAEM,MAAMC,QAAO,IAAKC,IAAIC,QAAQ;IAAEC,eAAe;EAAK,CAAA;AAC5DC,UAAQC,IAAI,sBAAsBL,OAAAA,EAAS;AAE3C,QAAMM,aAAaC,KAAKC,KAAKR,SAAS,eAAA;AACtC,QAAMS,YAAYX,WAAWY,SAAS,aAAA;AACtCC,KAAGC,cACCN,YACA,GAAGG,YAAY,KAAKlB,YAAYC,UAAUC,MAAAA,CAAAA;;EAAcK,UAAAA,EAAY;AAGxE,QAAMe,mBAAmBC,KAAKC,KAC1BR,KAAKS,QAAQC,WAAW,4CAAA,CAAA;AAG5B,QAAMC,YAAY,IAAIC,kBAAAA;AACtB,QAAMC,SAASb,KAAKC,KAAKR,SAAS,WAAA;AAClC,QAAMkB,UAAUG,SAASf,YAAYO,kBAAkBO,MAAAA;AAEvDT,KAAGW,UAAUf,KAAKC,KAAKR,SAAS,cAAA,CAAA;AAGhC,QAAMuB,cAAcZ,GAAGa,YAAYjB,KAAKC,KAAKS,WAAW,iBAAA,CAAA;AACxD,aAAWQ,SAASF,aAAa;AAC7B,QAAIE,MAAMC,WAAW,aAAA,GAAgB;AACjC;IACJ;AACAf,OAAGgB,YACCpB,KAAKC,KAAKS,WAAW,mBAAmBQ,KAAAA,GACxClB,KAAKC,KAAKR,SAAS,gBAAgByB,KAAAA,GACnC,KAAA;EAER;AAGA,QAAMG,mBAAmB;IAAC;IAAY;IAAO;;AAC7CjB,KAAGW,UAAUf,KAAKC,KAAKR,SAAS,0BAAA,CAAA;AAChC,aAAW6B,OAAOD,kBAAkB;AAChCjB,OAAGgB,YACCpB,KAAKC,KAAKS,WAAW,SAASY,GAAAA,OAAU,GACxCtB,KAAKC,KAAKR,SAAS,4BAA4B6B,GAAAA,EAAK,GACpD,KAAA;EAER;AAEAlB,KAAGC,cACCL,KAAKC,KAAKR,SAAS,cAAA,GACnB8B,KAAKC,UAAU;IACXhC,MAAM;IACNiC,SAAS;IACTC,MAAM;EACV,CAAA,CAAA;AAGJtB,KAAGC,cACCL,KAAKC,KAAKR,SAAS,eAAA,GACnB8B,KAAKC,UAAU;IACXG,iBAAiB;MACbC,QAAQ;MACRC,QAAQ;MACRC,kBAAkB;MAClBC,iBAAiB;MACjBC,cAAc;IAClB;EACJ,CAAA,CAAA;AAIJC,WAAS,WAAW;IAChBC,KAAKzC;IACL0C,OAAO;EACX,CAAA;AAGA,QAAMP,SAAS,MAAM,OAAO5B,KAAKC,KAAKR,SAAS,WAAA;AAC/C,SAAO;IAAEA;IAAS2C,QAAQR,OAAOQ;EAAoB;AACzD;AAhFsB9C;AAkFf,SAAS+C,yBAAyBC,UAAgB;AACrD,QAAM/C,aAAaa,GAAGmC,aAAaD,UAAU,MAAA;AAC7C,SAAOhD,iBAAiBC,UAAAA;AAC5B;AAHgB8C;","names":["TsSchemaGenerator","glob","execSync","fs","path","tmp","match","makePrelude","provider","dbName","match","with","exhaustive","generateTsSchema","schemaText","name","workDir","tmp","dirSync","unsafeCleanup","console","log","zmodelPath","path","join","noPrelude","includes","fs","writeFileSync","pluginModelFiles","glob","sync","resolve","__dirname","generator","TsSchemaGenerator","tsPath","generate","mkdirSync","nodeModules","readdirSync","entry","startsWith","symlinkSync","zenstackPackages","pkg","JSON","stringify","version","type","compilerOptions","module","target","moduleResolution","esModuleInterop","skipLibCheck","execSync","cwd","stdio","schema","generateTsSchemaFromFile","filePath","readFileSync"]}
|
package/package.json
CHANGED
|
@@ -1,35 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenstackhq/testtools",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-alpha.0",
|
|
4
4
|
"description": "ZenStack Test Tools",
|
|
5
|
-
"
|
|
6
|
-
"publishConfig": {
|
|
7
|
-
"directory": "dist",
|
|
8
|
-
"linkDirectory": true
|
|
9
|
-
},
|
|
5
|
+
"type": "module",
|
|
10
6
|
"keywords": [],
|
|
11
|
-
"author": "",
|
|
7
|
+
"author": "ZenStack Team",
|
|
12
8
|
"license": "MIT",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"require": {
|
|
19
|
+
"types": "./dist/index.d.cts",
|
|
20
|
+
"default": "./dist/index.cjs"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
13
24
|
"dependencies": {
|
|
14
|
-
"@
|
|
15
|
-
"
|
|
16
|
-
"tmp": "^0.2.
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"glob": "^11.0.2",
|
|
27
|
+
"tmp": "^0.2.3",
|
|
28
|
+
"ts-pattern": "^5.7.1",
|
|
29
|
+
"typescript": "^5.8.3",
|
|
30
|
+
"prisma": "^6.9.0",
|
|
31
|
+
"@zenstackhq/language": "3.0.0-alpha.0",
|
|
32
|
+
"@zenstackhq/sdk": "3.0.0-alpha.0"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"better-sqlite3": "^11.8.1",
|
|
36
|
+
"pg": "^8.13.1"
|
|
21
37
|
},
|
|
22
38
|
"devDependencies": {
|
|
23
|
-
"@types/
|
|
24
|
-
"@types/tmp": "^0.2.3",
|
|
25
|
-
"copyfiles": "^2.4.1",
|
|
26
|
-
"rimraf": "^3.0.2",
|
|
27
|
-
"typescript": "^4.9.5"
|
|
39
|
+
"@types/tmp": "^0.2.6"
|
|
28
40
|
},
|
|
29
41
|
"scripts": {
|
|
30
|
-
"
|
|
42
|
+
"build": "tsup-node",
|
|
43
|
+
"watch": "tsup-node --watch",
|
|
31
44
|
"lint": "eslint src --ext ts",
|
|
32
|
-
"
|
|
33
|
-
"
|
|
45
|
+
"test": "vitest",
|
|
46
|
+
"pack": "pnpm pack"
|
|
34
47
|
}
|
|
35
48
|
}
|
package/.npmrc.template
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
cache=<root>/.npmcache
|
package/README.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# ZenStack Test Tools
|
package/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './schema';
|
package/index.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./schema"), exports);
|
|
18
|
-
//# sourceMappingURL=index.js.map
|
package/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB"}
|
package/package.template.json
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "test-run",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"keywords": [],
|
|
7
|
-
"author": "",
|
|
8
|
-
"license": "ISC",
|
|
9
|
-
"dependencies": {
|
|
10
|
-
"@prisma/client": "^4.0.0",
|
|
11
|
-
"@zenstackhq/runtime": "file:<root>/packages/runtime/dist",
|
|
12
|
-
"@zenstackhq/swr": "file:<root>/packages/plugins/swr/dist",
|
|
13
|
-
"@zenstackhq/trpc": "file:<root>/packages/plugins/trpc/dist",
|
|
14
|
-
"@zenstackhq/openapi": "file:<root>/packages/plugins/openapi/dist",
|
|
15
|
-
"prisma": "^4.0.0",
|
|
16
|
-
"typescript": "^4.9.3",
|
|
17
|
-
"zenstack": "file:<root>/packages/schema/dist",
|
|
18
|
-
"zod": "3.21.1"
|
|
19
|
-
}
|
|
20
|
-
}
|
package/schema.d.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { DMMF } from '@prisma/generator-helper';
|
|
2
|
-
import type { Model } from '@zenstackhq/language/ast';
|
|
3
|
-
import { type AuthUser, type DbOperations } from '@zenstackhq/runtime';
|
|
4
|
-
/**
|
|
5
|
-
* Use it to represent multiple files in a single string like this
|
|
6
|
-
`schema.zmodel
|
|
7
|
-
import "user"
|
|
8
|
-
${FILE_SPLITTER}user.zmodel
|
|
9
|
-
import "schema"
|
|
10
|
-
model User {
|
|
11
|
-
...
|
|
12
|
-
}`
|
|
13
|
-
*/
|
|
14
|
-
export declare const FILE_SPLITTER = "#FILE_SPLITTER#";
|
|
15
|
-
export type WeakDbOperations = {
|
|
16
|
-
[key in keyof DbOperations]: (...args: any[]) => Promise<any>;
|
|
17
|
-
};
|
|
18
|
-
export type WeakDbClientContract = Record<string, WeakDbOperations> & {
|
|
19
|
-
$on(eventType: any, callback: (event: any) => void): void;
|
|
20
|
-
$use(cb: any): void;
|
|
21
|
-
$disconnect: () => Promise<void>;
|
|
22
|
-
$transaction: (input: ((tx: WeakDbClientContract) => Promise<any>) | any[], options?: any) => Promise<any>;
|
|
23
|
-
$queryRaw: (query: TemplateStringsArray, ...args: any[]) => Promise<any>;
|
|
24
|
-
$executeRaw: (query: TemplateStringsArray, ...args: any[]) => Promise<number>;
|
|
25
|
-
$extends: (args: any) => WeakDbClientContract;
|
|
26
|
-
};
|
|
27
|
-
export declare function run(cmd: string, env?: Record<string, string>, cwd?: string): void;
|
|
28
|
-
export declare function getWorkspaceRoot(start: string): string | undefined;
|
|
29
|
-
export declare function getWorkspaceNpmCacheFolder(start: string): string;
|
|
30
|
-
export type SchemaLoadOptions = {
|
|
31
|
-
addPrelude?: boolean;
|
|
32
|
-
pushDb?: boolean;
|
|
33
|
-
fullZod?: boolean;
|
|
34
|
-
extraDependencies?: string[];
|
|
35
|
-
compile?: boolean;
|
|
36
|
-
customSchemaFilePath?: string;
|
|
37
|
-
logPrismaQuery?: boolean;
|
|
38
|
-
};
|
|
39
|
-
export declare function loadSchemaFromFile(schemaFile: string, options?: SchemaLoadOptions): Promise<{
|
|
40
|
-
projectDir: string;
|
|
41
|
-
prisma: any;
|
|
42
|
-
withPolicy: (user?: AuthUser | undefined) => WeakDbClientContract;
|
|
43
|
-
withOmit: () => WeakDbClientContract;
|
|
44
|
-
withPassword: () => WeakDbClientContract;
|
|
45
|
-
withPresets: (user?: AuthUser | undefined) => WeakDbClientContract;
|
|
46
|
-
policy: any;
|
|
47
|
-
modelMeta: any;
|
|
48
|
-
zodSchemas: any;
|
|
49
|
-
}>;
|
|
50
|
-
export declare function loadSchema(schema: string, options?: SchemaLoadOptions): Promise<{
|
|
51
|
-
projectDir: string;
|
|
52
|
-
prisma: any;
|
|
53
|
-
withPolicy: (user?: AuthUser) => WeakDbClientContract;
|
|
54
|
-
withOmit: () => WeakDbClientContract;
|
|
55
|
-
withPassword: () => WeakDbClientContract;
|
|
56
|
-
withPresets: (user?: AuthUser) => WeakDbClientContract;
|
|
57
|
-
policy: any;
|
|
58
|
-
modelMeta: any;
|
|
59
|
-
zodSchemas: any;
|
|
60
|
-
}>;
|
|
61
|
-
/**
|
|
62
|
-
* Load ZModel and Prisma DMM from a string without creating a NPM project.
|
|
63
|
-
* @param content
|
|
64
|
-
* @returns
|
|
65
|
-
*/
|
|
66
|
-
export declare function loadZModelAndDmmf(content: string): Promise<{
|
|
67
|
-
model: Model;
|
|
68
|
-
dmmf: DMMF.Document;
|
|
69
|
-
modelFile: string;
|
|
70
|
-
}>;
|
package/schema.js
DELETED
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
-
};
|
|
37
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.loadZModelAndDmmf = exports.loadSchema = exports.loadSchemaFromFile = exports.getWorkspaceNpmCacheFolder = exports.getWorkspaceRoot = exports.run = exports.FILE_SPLITTER = void 0;
|
|
39
|
-
const runtime_1 = require("@zenstackhq/runtime");
|
|
40
|
-
const sdk_1 = require("@zenstackhq/sdk");
|
|
41
|
-
const child_process_1 = require("child_process");
|
|
42
|
-
const fs = __importStar(require("fs"));
|
|
43
|
-
const json5_1 = __importDefault(require("json5"));
|
|
44
|
-
const path = __importStar(require("path"));
|
|
45
|
-
const tmp_1 = __importDefault(require("tmp"));
|
|
46
|
-
const cli_util_1 = require("zenstack/cli/cli-util");
|
|
47
|
-
const prisma_1 = __importDefault(require("zenstack/plugins/prisma"));
|
|
48
|
-
/**
|
|
49
|
-
* Use it to represent multiple files in a single string like this
|
|
50
|
-
`schema.zmodel
|
|
51
|
-
import "user"
|
|
52
|
-
${FILE_SPLITTER}user.zmodel
|
|
53
|
-
import "schema"
|
|
54
|
-
model User {
|
|
55
|
-
...
|
|
56
|
-
}`
|
|
57
|
-
*/
|
|
58
|
-
exports.FILE_SPLITTER = '#FILE_SPLITTER#';
|
|
59
|
-
function run(cmd, env, cwd) {
|
|
60
|
-
const start = Date.now();
|
|
61
|
-
(0, child_process_1.execSync)(cmd, {
|
|
62
|
-
stdio: 'pipe',
|
|
63
|
-
encoding: 'utf-8',
|
|
64
|
-
env: Object.assign(Object.assign(Object.assign({}, process.env), { DO_NOT_TRACK: '1' }), env),
|
|
65
|
-
cwd,
|
|
66
|
-
});
|
|
67
|
-
console.log('Execution took', Date.now() - start, 'ms', '-', cmd);
|
|
68
|
-
}
|
|
69
|
-
exports.run = run;
|
|
70
|
-
function normalizePath(p) {
|
|
71
|
-
return p ? p.split(path.sep).join(path.posix.sep) : p;
|
|
72
|
-
}
|
|
73
|
-
function getWorkspaceRoot(start) {
|
|
74
|
-
let curr = normalizePath(start);
|
|
75
|
-
while (curr && curr !== '/') {
|
|
76
|
-
if (fs.existsSync(path.join(curr, 'pnpm-workspace.yaml'))) {
|
|
77
|
-
return curr;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
curr = normalizePath(path.dirname(curr));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
|
-
exports.getWorkspaceRoot = getWorkspaceRoot;
|
|
86
|
-
function getWorkspaceNpmCacheFolder(start) {
|
|
87
|
-
const root = getWorkspaceRoot(start);
|
|
88
|
-
return root ? path.join(root, '.npmcache') : './.npmcache';
|
|
89
|
-
}
|
|
90
|
-
exports.getWorkspaceNpmCacheFolder = getWorkspaceNpmCacheFolder;
|
|
91
|
-
const MODEL_PRELUDE = `
|
|
92
|
-
datasource db {
|
|
93
|
-
provider = 'sqlite'
|
|
94
|
-
url = 'file:./test.db'
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
generator js {
|
|
98
|
-
provider = 'prisma-client-js'
|
|
99
|
-
previewFeatures = ['clientExtensions']
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
plugin zod {
|
|
103
|
-
provider = '@core/zod'
|
|
104
|
-
modelOnly = true
|
|
105
|
-
}
|
|
106
|
-
`;
|
|
107
|
-
const MODEL_PRELUDE_FULL_ZOD = `
|
|
108
|
-
datasource db {
|
|
109
|
-
provider = 'sqlite'
|
|
110
|
-
url = 'file:./test.db'
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
generator js {
|
|
114
|
-
provider = 'prisma-client-js'
|
|
115
|
-
previewFeatures = ['clientExtensions']
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
plugin zod {
|
|
119
|
-
provider = '@core/zod'
|
|
120
|
-
modelOnly = false
|
|
121
|
-
}
|
|
122
|
-
`;
|
|
123
|
-
const defaultOptions = {
|
|
124
|
-
addPrelude: true,
|
|
125
|
-
pushDb: true,
|
|
126
|
-
fullZod: false,
|
|
127
|
-
extraDependencies: [],
|
|
128
|
-
compile: false,
|
|
129
|
-
logPrismaQuery: false,
|
|
130
|
-
};
|
|
131
|
-
function loadSchemaFromFile(schemaFile, options) {
|
|
132
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
-
const content = fs.readFileSync(schemaFile, { encoding: 'utf-8' });
|
|
134
|
-
return loadSchema(content, options);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
exports.loadSchemaFromFile = loadSchemaFromFile;
|
|
138
|
-
function loadSchema(schema, options) {
|
|
139
|
-
var _a;
|
|
140
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
-
const opt = Object.assign(Object.assign({}, defaultOptions), options);
|
|
142
|
-
const { name: projectRoot } = tmp_1.default.dirSync({ unsafeCleanup: true });
|
|
143
|
-
const root = getWorkspaceRoot(__dirname);
|
|
144
|
-
if (!root) {
|
|
145
|
-
throw new Error('Could not find workspace root');
|
|
146
|
-
}
|
|
147
|
-
const pkgContent = fs.readFileSync(path.join(__dirname, 'package.template.json'), { encoding: 'utf-8' });
|
|
148
|
-
fs.writeFileSync(path.join(projectRoot, 'package.json'), pkgContent.replaceAll('<root>', root));
|
|
149
|
-
const npmrcContent = fs.readFileSync(path.join(__dirname, '.npmrc.template'), { encoding: 'utf-8' });
|
|
150
|
-
fs.writeFileSync(path.join(projectRoot, '.npmrc'), npmrcContent.replaceAll('<root>', root));
|
|
151
|
-
console.log('Workdir:', projectRoot);
|
|
152
|
-
process.chdir(projectRoot);
|
|
153
|
-
let zmodelPath = path.join(projectRoot, 'schema.zmodel');
|
|
154
|
-
const files = schema.split(exports.FILE_SPLITTER);
|
|
155
|
-
if (files.length > 1) {
|
|
156
|
-
// multiple files
|
|
157
|
-
files.forEach((file, index) => {
|
|
158
|
-
//first line is the file name
|
|
159
|
-
const firstLine = file.indexOf('\n');
|
|
160
|
-
const fileName = file.substring(0, firstLine).trim();
|
|
161
|
-
let fileContent = file.substring(firstLine + 1);
|
|
162
|
-
if (index === 0) {
|
|
163
|
-
// The first file is the main schema file
|
|
164
|
-
zmodelPath = path.join(projectRoot, fileName);
|
|
165
|
-
if (opt.addPrelude) {
|
|
166
|
-
// plugin need to be added after import statement
|
|
167
|
-
fileContent = `${fileContent}\n${opt.fullZod ? MODEL_PRELUDE_FULL_ZOD : MODEL_PRELUDE}`;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
fileContent = fileContent.replaceAll('$projectRoot', projectRoot);
|
|
171
|
-
const filePath = path.join(projectRoot, fileName);
|
|
172
|
-
fs.writeFileSync(filePath, fileContent);
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
schema = schema.replaceAll('$projectRoot', projectRoot);
|
|
177
|
-
const content = opt.addPrelude ? `${opt.fullZod ? MODEL_PRELUDE_FULL_ZOD : MODEL_PRELUDE}\n${schema}` : schema;
|
|
178
|
-
if (opt.customSchemaFilePath) {
|
|
179
|
-
zmodelPath = path.join(projectRoot, opt.customSchemaFilePath);
|
|
180
|
-
fs.mkdirSync(path.dirname(zmodelPath), { recursive: true });
|
|
181
|
-
fs.writeFileSync(zmodelPath, content);
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
fs.writeFileSync('schema.zmodel', content);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
run('npm install');
|
|
188
|
-
if (opt.customSchemaFilePath) {
|
|
189
|
-
run(`npx zenstack generate --schema ${zmodelPath} --no-dependency-check`, {
|
|
190
|
-
NODE_PATH: './node_modules',
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
run('npx zenstack generate --no-dependency-check', { NODE_PATH: './node_modules' });
|
|
195
|
-
}
|
|
196
|
-
if (opt.pushDb) {
|
|
197
|
-
run('npx prisma db push');
|
|
198
|
-
}
|
|
199
|
-
const PrismaClient = require(path.join(projectRoot, 'node_modules/.prisma/client')).PrismaClient;
|
|
200
|
-
const prisma = new PrismaClient({ log: ['info', 'warn', 'error'] });
|
|
201
|
-
(_a = opt.extraDependencies) === null || _a === void 0 ? void 0 : _a.forEach((dep) => {
|
|
202
|
-
console.log(`Installing dependency ${dep}`);
|
|
203
|
-
run(`npm install ${dep}`);
|
|
204
|
-
});
|
|
205
|
-
if (opt.compile) {
|
|
206
|
-
console.log('Compiling...');
|
|
207
|
-
run('npx tsc --init');
|
|
208
|
-
// add genetated '.zenstack/zod' folder to typescript's search path,
|
|
209
|
-
// so that it can be resolved from symbolic-linked files
|
|
210
|
-
const tsconfig = json5_1.default.parse(fs.readFileSync(path.join(projectRoot, './tsconfig.json'), 'utf-8'));
|
|
211
|
-
tsconfig.compilerOptions.paths = {
|
|
212
|
-
'.zenstack/zod/input': ['./node_modules/.zenstack/zod/input/index.d.ts'],
|
|
213
|
-
};
|
|
214
|
-
fs.writeFileSync(path.join(projectRoot, './tsconfig.json'), JSON.stringify(tsconfig, null, 2));
|
|
215
|
-
run('npx tsc --project tsconfig.json');
|
|
216
|
-
}
|
|
217
|
-
let policy;
|
|
218
|
-
let modelMeta;
|
|
219
|
-
let zodSchemas;
|
|
220
|
-
const outputPath = path.join(projectRoot, 'node_modules');
|
|
221
|
-
try {
|
|
222
|
-
policy = require(path.join(outputPath, '.zenstack/policy')).default;
|
|
223
|
-
}
|
|
224
|
-
catch (_b) {
|
|
225
|
-
/* noop */
|
|
226
|
-
}
|
|
227
|
-
try {
|
|
228
|
-
modelMeta = require(path.join(outputPath, '.zenstack/model-meta')).default;
|
|
229
|
-
}
|
|
230
|
-
catch (_c) {
|
|
231
|
-
/* noop */
|
|
232
|
-
}
|
|
233
|
-
try {
|
|
234
|
-
zodSchemas = require(path.join(outputPath, '.zenstack/zod'));
|
|
235
|
-
}
|
|
236
|
-
catch (_d) {
|
|
237
|
-
/* noop */
|
|
238
|
-
}
|
|
239
|
-
return {
|
|
240
|
-
projectDir: projectRoot,
|
|
241
|
-
prisma,
|
|
242
|
-
withPolicy: (user) => (0, runtime_1.withPolicy)(prisma, { user }, { policy, modelMeta, zodSchemas, logPrismaQuery: opt.logPrismaQuery }),
|
|
243
|
-
withOmit: () => (0, runtime_1.withOmit)(prisma, { modelMeta }),
|
|
244
|
-
withPassword: () => (0, runtime_1.withPassword)(prisma, { modelMeta }),
|
|
245
|
-
withPresets: (user) => (0, runtime_1.withPresets)(prisma, { user }, { policy, modelMeta, zodSchemas, logPrismaQuery: opt.logPrismaQuery }),
|
|
246
|
-
policy,
|
|
247
|
-
modelMeta,
|
|
248
|
-
zodSchemas,
|
|
249
|
-
};
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
exports.loadSchema = loadSchema;
|
|
253
|
-
/**
|
|
254
|
-
* Load ZModel and Prisma DMM from a string without creating a NPM project.
|
|
255
|
-
* @param content
|
|
256
|
-
* @returns
|
|
257
|
-
*/
|
|
258
|
-
function loadZModelAndDmmf(content) {
|
|
259
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
260
|
-
const prelude = `
|
|
261
|
-
datasource db {
|
|
262
|
-
provider = 'postgresql'
|
|
263
|
-
url = env('DATABASE_URL')
|
|
264
|
-
}
|
|
265
|
-
`;
|
|
266
|
-
const { name: modelFile } = tmp_1.default.fileSync({ postfix: '.zmodel' });
|
|
267
|
-
fs.writeFileSync(modelFile, `${prelude}\n${content}`);
|
|
268
|
-
const model = yield (0, cli_util_1.loadDocument)(modelFile);
|
|
269
|
-
const { name: prismaFile } = tmp_1.default.fileSync({ postfix: '.prisma' });
|
|
270
|
-
yield (0, prisma_1.default)(model, { schemaPath: modelFile, name: 'Prisma', output: prismaFile, generateClient: false });
|
|
271
|
-
const prismaContent = fs.readFileSync(prismaFile, { encoding: 'utf-8' });
|
|
272
|
-
const dmmf = yield (0, sdk_1.getDMMF)({ datamodel: prismaContent });
|
|
273
|
-
return { model, dmmf, modelFile };
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
exports.loadZModelAndDmmf = loadZModelAndDmmf;
|
|
277
|
-
//# sourceMappingURL=schema.js.map
|
package/schema.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|