diff --git a/packages/language/package.json b/packages/language/package.json
index 50758ce23..b6e146450 100644
--- a/packages/language/package.json
+++ b/packages/language/package.json
@@ -9,7 +9,7 @@
"generate": "langium generate && npx ts-node script/generate-plist.ts",
"watch": "concurrently \"langium generate --watch\" \"tsc --watch\"",
"lint": "eslint src --ext ts",
- "build": "pnpm lint --max-warnings=0 && pnpm clean && pnpm generate && tsc && copyfiles -F ./README.md ./LICENSE ./package.json 'syntaxes/**/*' dist && pnpm pack dist --pack-destination '../../../.build'",
+ "build": "pnpm lint --max-warnings=0 && pnpm clean && pnpm generate && tsc && copyfiles -F ./README.md ./LICENSE ./package.json 'syntaxes/**/*' dist && pnpm pack dist --pack-destination ../../../.build",
"prepublishOnly": "pnpm build"
},
"publishConfig": {
diff --git a/packages/misc/redwood/package.json b/packages/misc/redwood/package.json
index d95ef1925..207173636 100644
--- a/packages/misc/redwood/package.json
+++ b/packages/misc/redwood/package.json
@@ -9,7 +9,7 @@
},
"scripts": {
"clean": "rimraf dist",
- "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && pnpm pack dist --pack-destination '../../../.build'",
+ "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && pnpm pack dist --pack-destination ../../../.build",
"watch": "tsc --watch",
"lint": "eslint src --ext ts",
"prepublishOnly": "pnpm build"
diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json
index 3db67dead..a8b6f1d49 100644
--- a/packages/plugins/openapi/package.json
+++ b/packages/plugins/openapi/package.json
@@ -14,7 +14,7 @@
},
"scripts": {
"clean": "rimraf dist",
- "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && copyfiles ./package.json ./README.md ./LICENSE dist && copyfiles -u 1 ./src/plugin.zmodel dist && pnpm pack dist --pack-destination '../../../../.build'",
+ "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && copyfiles ./package.json ./README.md ./LICENSE dist && copyfiles -u 1 ./src/plugin.zmodel dist && pnpm pack dist --pack-destination ../../../../.build",
"watch": "tsc --watch",
"lint": "eslint src --ext ts",
"test": "jest",
diff --git a/packages/plugins/openapi/tests/openapi-restful.test.ts b/packages/plugins/openapi/tests/openapi-restful.test.ts
index fb01e390e..9e84ad047 100644
--- a/packages/plugins/openapi/tests/openapi-restful.test.ts
+++ b/packages/plugins/openapi/tests/openapi-restful.test.ts
@@ -4,7 +4,7 @@
import OpenAPIParser from '@readme/openapi-parser';
import { getLiteral, getObjectLiteral } from '@zenstackhq/sdk';
import { Model, Plugin, isPlugin } from '@zenstackhq/sdk/ast';
-import { loadZModelAndDmmf } from '@zenstackhq/testtools';
+import { loadZModelAndDmmf, normalizePath } from '@zenstackhq/testtools';
import fs from 'fs';
import path from 'path';
import * as tmp from 'tmp';
@@ -16,7 +16,7 @@ describe('Open API Plugin RESTful Tests', () => {
for (const specVersion of ['3.0.0', '3.1.0']) {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
specVersion = '${specVersion}'
}
@@ -114,7 +114,7 @@ model Bar {
it('options', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
specVersion = '3.0.0'
title = 'My Awesome API'
version = '1.0.0'
@@ -151,7 +151,7 @@ model User {
it('security schemes valid', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'http', scheme: 'basic' },
myBearer: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
@@ -198,7 +198,7 @@ model Post {
it('security model level override', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'http', scheme: 'basic' }
}
@@ -230,7 +230,7 @@ model User {
it('security schemes invalid', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'invalid', scheme: 'basic' }
}
@@ -251,7 +251,7 @@ model User {
it('ignored model used as relation', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
}
model User {
@@ -284,7 +284,7 @@ model Post {
for (const specVersion of ['3.0.0', '3.1.0']) {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
specVersion = '${specVersion}'
}
diff --git a/packages/plugins/openapi/tests/openapi-rpc.test.ts b/packages/plugins/openapi/tests/openapi-rpc.test.ts
index c0cb74ab6..8e8e3a6ac 100644
--- a/packages/plugins/openapi/tests/openapi-rpc.test.ts
+++ b/packages/plugins/openapi/tests/openapi-rpc.test.ts
@@ -4,7 +4,7 @@
import OpenAPIParser from '@readme/openapi-parser';
import { getLiteral, getObjectLiteral } from '@zenstackhq/sdk';
import { Model, Plugin, isPlugin } from '@zenstackhq/sdk/ast';
-import { loadZModelAndDmmf } from '@zenstackhq/testtools';
+import { loadZModelAndDmmf, normalizePath } from '@zenstackhq/testtools';
import fs from 'fs';
import path from 'path';
import * as tmp from 'tmp';
@@ -16,7 +16,7 @@ describe('Open API Plugin RPC Tests', () => {
for (const specVersion of ['3.0.0', '3.1.0']) {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
specVersion = '${specVersion}'
}
@@ -127,7 +127,7 @@ model Bar {
it('options', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
specVersion = '3.0.0'
title = 'My Awesome API'
version = '1.0.0'
@@ -164,7 +164,7 @@ model User {
it('security schemes valid', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'http', scheme: 'basic' },
myBearer: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
@@ -198,7 +198,7 @@ model User {
it('security schemes invalid', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'invalid', scheme: 'basic' }
}
@@ -219,7 +219,7 @@ model User {
it('security model level override', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'http', scheme: 'basic' }
}
@@ -247,7 +247,7 @@ model User {
it('security operation level override', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'http', scheme: 'basic' }
}
@@ -280,7 +280,7 @@ model User {
it('security inferred', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
securitySchemes = {
myBasic: { type: 'http', scheme: 'basic' }
}
@@ -306,7 +306,7 @@ model User {
it('v3.1.0 fields', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
summary = 'awesome api'
}
@@ -330,7 +330,7 @@ model User {
it('ignored model used as relation', async () => {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
}
model User {
@@ -362,7 +362,7 @@ model Post {
for (const specVersion of ['3.0.0', '3.1.0']) {
const { model, dmmf, modelFile } = await loadZModelAndDmmf(`
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
specVersion = '${specVersion}'
}
@@ -408,7 +408,7 @@ generator js {
}
plugin openapi {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
}
enum role {
diff --git a/packages/plugins/swr/package.json b/packages/plugins/swr/package.json
index 0d1fb7147..376ad2e3b 100644
--- a/packages/plugins/swr/package.json
+++ b/packages/plugins/swr/package.json
@@ -10,7 +10,7 @@
},
"scripts": {
"clean": "rimraf dist",
- "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && tsup-node --config ./tsup.config.ts && copyfiles ./package.json ./README.md ./LICENSE dist && pnpm pack dist --pack-destination '../../../../.build'",
+ "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && tsup-node --config ./tsup.config.ts && copyfiles ./package.json ./README.md ./LICENSE dist && pnpm pack dist --pack-destination ../../../../.build",
"watch": "concurrently \"tsc --watch\" \"tsup-node --config ./tsup.config.ts --watch\"",
"lint": "eslint src --ext ts",
"test": "jest",
diff --git a/packages/plugins/swr/tests/swr.test.ts b/packages/plugins/swr/tests/swr.test.ts
index 9d198269b..d12c3b37b 100644
--- a/packages/plugins/swr/tests/swr.test.ts
+++ b/packages/plugins/swr/tests/swr.test.ts
@@ -1,6 +1,6 @@
///
-import { loadSchema } from '@zenstackhq/testtools';
+import { loadSchema, normalizePath } from '@zenstackhq/testtools';
import path from 'path';
describe('SWR Plugin Tests', () => {
@@ -50,7 +50,7 @@ model Foo {
await loadSchema(
`
plugin swr {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/hooks'
}
@@ -60,7 +60,7 @@ ${sharedModel}
provider: 'postgresql',
pushDb: false,
extraDependencies: [
- `${path.join(__dirname, '../dist')}`,
+ `${normalizePath(path.join(__dirname, '../dist'))}`,
'react@18.2.0',
'@types/react@18.2.0',
'swr@^2',
diff --git a/packages/plugins/tanstack-query/package.json b/packages/plugins/tanstack-query/package.json
index 8d034e8f4..69c3f5fda 100644
--- a/packages/plugins/tanstack-query/package.json
+++ b/packages/plugins/tanstack-query/package.json
@@ -66,7 +66,7 @@
},
"scripts": {
"clean": "rimraf dist",
- "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && tsup-node --config ./tsup.config.ts && tsup-node --config ./tsup-v5.config.ts && node scripts/postbuild && copyfiles ./package.json ./README.md ./LICENSE dist && pnpm pack dist --pack-destination '../../../../.build'",
+ "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && tsup-node --config ./tsup.config.ts && tsup-node --config ./tsup-v5.config.ts && node scripts/postbuild && copyfiles ./package.json ./README.md ./LICENSE dist && pnpm pack dist --pack-destination ../../../../.build",
"watch": "concurrently \"tsc --watch\" \"tsup-node --config ./tsup.config.ts --watch\" \"tsup-node --config ./tsup-v5.config.ts --watch\"",
"lint": "eslint src --ext ts",
"test": "jest",
diff --git a/packages/plugins/tanstack-query/tests/plugin.test.ts b/packages/plugins/tanstack-query/tests/plugin.test.ts
index 38370d38a..824174ba5 100644
--- a/packages/plugins/tanstack-query/tests/plugin.test.ts
+++ b/packages/plugins/tanstack-query/tests/plugin.test.ts
@@ -1,6 +1,6 @@
///
-import { loadSchema } from '@zenstackhq/testtools';
+import { loadSchema, normalizePath } from '@zenstackhq/testtools';
import path from 'path';
describe('Tanstack Query Plugin Tests', () => {
@@ -50,7 +50,7 @@ model Foo {
await loadSchema(
`
plugin tanstack {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/hooks'
target = 'react'
}
@@ -71,7 +71,7 @@ ${sharedModel}
await loadSchema(
`
plugin tanstack {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/hooks'
target = 'react'
version = 'v5'
@@ -93,7 +93,7 @@ ${sharedModel}
await loadSchema(
`
plugin tanstack {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/hooks'
target = 'vue'
}
@@ -114,7 +114,7 @@ ${sharedModel}
await loadSchema(
`
plugin tanstack {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/hooks'
target = 'vue'
version = 'v5'
@@ -136,7 +136,7 @@ ${sharedModel}
await loadSchema(
`
plugin tanstack {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/hooks'
target = 'svelte'
}
@@ -157,7 +157,7 @@ ${sharedModel}
await loadSchema(
`
plugin tanstack {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/hooks'
target = 'svelte'
version = 'v5'
diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json
index ad76965c2..b0a5a28c9 100644
--- a/packages/plugins/trpc/package.json
+++ b/packages/plugins/trpc/package.json
@@ -10,7 +10,7 @@
},
"scripts": {
"clean": "rimraf dist",
- "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && copyfiles ./package.json ./README.md ./LICENSE 'res/**/*' dist && pnpm pack dist --pack-destination '../../../../.build'",
+ "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && copyfiles ./package.json ./README.md ./LICENSE 'res/**/*' dist && pnpm pack dist --pack-destination ../../../../.build",
"watch": "tsc --watch",
"lint": "eslint src --ext ts",
"test": "jest",
diff --git a/packages/plugins/trpc/tests/trpc.test.ts b/packages/plugins/trpc/tests/trpc.test.ts
index ca4a9c14d..4c79c740a 100644
--- a/packages/plugins/trpc/tests/trpc.test.ts
+++ b/packages/plugins/trpc/tests/trpc.test.ts
@@ -1,6 +1,6 @@
///
-import { loadSchema } from '@zenstackhq/testtools';
+import { loadSchema, normalizePath } from '@zenstackhq/testtools';
import fs from 'fs';
import path from 'path';
@@ -19,7 +19,7 @@ describe('tRPC Plugin Tests', () => {
await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/trpc'
}
@@ -67,7 +67,7 @@ model Foo {
const { projectDir } = await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = './trpc'
}
@@ -110,7 +110,7 @@ model Foo {
const { projectDir } = await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = './trpc'
}
@@ -141,7 +141,7 @@ model Post {
const { projectDir } = await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = './trpc'
generateModelActions = 'findMany,findUnique,update'
}
@@ -171,7 +171,7 @@ model Post {
const { projectDir } = await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = './trpc'
generateModelActions = ['findMany', 'findUnique', 'update']
}
@@ -220,7 +220,7 @@ model Post {
await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/trpc'
generateClientHelpers = 'react'
}
@@ -245,7 +245,7 @@ model Post {
await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/trpc'
generateClientHelpers = 'next'
}
@@ -265,7 +265,7 @@ model Post {
await loadSchema(
`
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/trpc'
}
@@ -304,7 +304,7 @@ generator js {
}
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/trpc'
generateModels = ['Post']
generateModelActions = ['findMany', 'update']
@@ -375,7 +375,7 @@ plugin zod {
}
plugin trpc {
- provider = '${path.resolve(__dirname, '../dist')}'
+ provider = '${normalizePath(path.resolve(__dirname, '../dist'))}'
output = '$projectRoot/trpc'
generateModels = ['Post']
generateModelActions = ['findMany', 'update']
diff --git a/packages/testtools/src/schema.ts b/packages/testtools/src/schema.ts
index 88ffa9ba8..5fef95299 100644
--- a/packages/testtools/src/schema.ts
+++ b/packages/testtools/src/schema.ts
@@ -54,7 +54,7 @@ export function installPackage(pkg: string, dev = false) {
run(`npm install ${dev ? '-D' : ''} --no-audit --no-fund ${pkg}`);
}
-function normalizePath(p: string) {
+export function normalizePath(p: string) {
return p ? p.split(path.sep).join(path.posix.sep) : p;
}
@@ -174,6 +174,9 @@ export async function loadSchema(schema: string, options?: SchemaLoadOptions) {
const files = schema.split(FILE_SPLITTER);
+ // Use this one to replace $projectRoot placeholder in the schema file
+ const normalizedProjectRoot = normalizePath(projectRoot);
+
if (files.length > 1) {
// multiple files
files.forEach((file, index) => {
@@ -190,12 +193,12 @@ export async function loadSchema(schema: string, options?: SchemaLoadOptions) {
}
}
- fileContent = fileContent.replaceAll('$projectRoot', projectRoot);
+ fileContent = fileContent.replaceAll('$projectRoot', normalizedProjectRoot);
const filePath = path.join(projectRoot, fileName);
fs.writeFileSync(filePath, fileContent);
});
} else {
- schema = schema.replaceAll('$projectRoot', projectRoot);
+ schema = schema.replaceAll('$projectRoot', normalizedProjectRoot);
const content = opt.addPrelude ? `${makePrelude(opt)}\n${schema}` : schema;
if (opt.customSchemaFilePath) {
zmodelPath = path.join(projectRoot, opt.customSchemaFilePath);