@valbuild/server 0.26.0 → 0.27.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/package.json +7 -4
- package/.babelrc.json +0 -5
- package/CHANGELOG.md +0 -0
- package/jest.config.js +0 -4
- package/src/LocalValServer.ts +0 -167
- package/src/ProxyValServer.ts +0 -542
- package/src/SerializedModuleContent.ts +0 -36
- package/src/Service.ts +0 -126
- package/src/ValFS.ts +0 -22
- package/src/ValFSHost.ts +0 -66
- package/src/ValModuleLoader.test.ts +0 -75
- package/src/ValModuleLoader.ts +0 -158
- package/src/ValQuickJSRuntime.ts +0 -85
- package/src/ValServer.ts +0 -24
- package/src/ValSourceFileHandler.ts +0 -57
- package/src/createFixPatch.ts +0 -170
- package/src/createRequestHandler.ts +0 -27
- package/src/expressHelpers.ts +0 -5
- package/src/getCompilerOptions.ts +0 -50
- package/src/hosting.ts +0 -290
- package/src/index.ts +0 -16
- package/src/jwt.ts +0 -93
- package/src/patch/ts/ops.test.ts +0 -937
- package/src/patch/ts/ops.ts +0 -897
- package/src/patch/ts/syntax.ts +0 -371
- package/src/patch/ts/valModule.test.ts +0 -26
- package/src/patch/ts/valModule.ts +0 -110
- package/src/patch/validation.ts +0 -81
- package/src/patchValFile.ts +0 -110
- package/src/readValFile.test.ts +0 -49
- package/src/readValFile.ts +0 -96
- package/test/example-projects/basic-next-javascript/jsconfig.json +0 -8
- package/test/example-projects/basic-next-javascript/package.json +0 -23
- package/test/example-projects/basic-next-javascript/pages/blogs.val.js +0 -20
- package/test/example-projects/basic-next-javascript/val.config.js +0 -4
- package/test/example-projects/basic-next-src-typescript/package.json +0 -23
- package/test/example-projects/basic-next-src-typescript/src/pages/blogs.val.ts +0 -20
- package/test/example-projects/basic-next-src-typescript/src/val.config.ts +0 -5
- package/test/example-projects/basic-next-src-typescript/tsconfig.json +0 -24
- package/test/example-projects/basic-next-typescript/package.json +0 -23
- package/test/example-projects/basic-next-typescript/pages/blogs.val.ts +0 -20
- package/test/example-projects/basic-next-typescript/tsconfig.json +0 -25
- package/test/example-projects/basic-next-typescript/val.config.ts +0 -5
- package/test/example-projects/typescript-description-files/README.md +0 -2
- package/test/example-projects/typescript-description-files/jsconfig.json +0 -8
- package/test/example-projects/typescript-description-files/package.json +0 -23
- package/test/example-projects/typescript-description-files/pages/blogs.val.d.ts +0 -7
- package/test/example-projects/typescript-description-files/pages/blogs.val.js +0 -19
- package/test/example-projects/typescript-description-files/val.config.d.ts +0 -3
- package/test/example-projects/typescript-description-files/val.config.js +0 -5
- package/tsconfig.json +0 -12
package/src/readValFile.test.ts
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
TestQuickJSWASMModule,
|
3
|
-
newQuickJSAsyncWASMModule,
|
4
|
-
} from "quickjs-emscripten";
|
5
|
-
import { readValFile } from "./readValFile";
|
6
|
-
import path from "path";
|
7
|
-
import { createModuleLoader } from "./ValModuleLoader";
|
8
|
-
import { newValQuickJSRuntime } from "./ValQuickJSRuntime";
|
9
|
-
|
10
|
-
const TestCaseDir = "../test/example-projects";
|
11
|
-
const TestCases = [
|
12
|
-
{ name: "basic-next-typescript", valConfigPath: "./val.config" },
|
13
|
-
{
|
14
|
-
name: "basic-next-src-typescript",
|
15
|
-
valConfigPath: "./src/val.config",
|
16
|
-
},
|
17
|
-
{ name: "basic-next-javascript", valConfigPath: "./val.config" },
|
18
|
-
{ name: "typescript-description-files", valConfigPath: "./val.config" },
|
19
|
-
];
|
20
|
-
|
21
|
-
describe("read val file", () => {
|
22
|
-
// We cannot, currently use TestQuickJSWASMModule
|
23
|
-
let QuickJS: TestQuickJSWASMModule;
|
24
|
-
|
25
|
-
beforeEach(async () => {
|
26
|
-
QuickJS = new TestQuickJSWASMModule(await newQuickJSAsyncWASMModule());
|
27
|
-
});
|
28
|
-
|
29
|
-
afterEach(() => {
|
30
|
-
QuickJS.disposeAll();
|
31
|
-
QuickJS.assertNoMemoryAllocated();
|
32
|
-
});
|
33
|
-
|
34
|
-
test.each(TestCases)("read basic val file from: $name", async (testCase) => {
|
35
|
-
const rootDir = path.resolve(__dirname, TestCaseDir, testCase.name);
|
36
|
-
const loader = createModuleLoader(rootDir);
|
37
|
-
const testRuntime = await newValQuickJSRuntime(QuickJS, loader, {
|
38
|
-
maxStackSize: 1024 * 640,
|
39
|
-
memoryLimit: 1024 * 640,
|
40
|
-
});
|
41
|
-
const result = await readValFile(
|
42
|
-
"/pages/blogs",
|
43
|
-
testCase.valConfigPath,
|
44
|
-
testRuntime
|
45
|
-
);
|
46
|
-
expect(result).toHaveProperty("source");
|
47
|
-
expect(result).toHaveProperty("schema");
|
48
|
-
});
|
49
|
-
});
|
package/src/readValFile.ts
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
import { ModuleId, SourcePath } from "@valbuild/core";
|
2
|
-
import path from "path";
|
3
|
-
import { QuickJSRuntime } from "quickjs-emscripten";
|
4
|
-
import { SerializedModuleContent } from "./SerializedModuleContent";
|
5
|
-
|
6
|
-
export const readValFile = async (
|
7
|
-
id: string,
|
8
|
-
valConfigPath: string,
|
9
|
-
runtime: QuickJSRuntime
|
10
|
-
): Promise<SerializedModuleContent> => {
|
11
|
-
const context = runtime.newContext();
|
12
|
-
try {
|
13
|
-
const modulePath = `.${id}.val`;
|
14
|
-
const code = `import * as valModule from ${JSON.stringify(modulePath)};
|
15
|
-
import { Internal } from "@valbuild/core";
|
16
|
-
globalThis.valModule = {
|
17
|
-
id: valModule?.default && Internal.getValPath(valModule?.default),
|
18
|
-
schema: valModule?.default && Internal.getSchema(valModule?.default)?.serialize(),
|
19
|
-
source: valModule?.default && Internal.getSource(valModule?.default),
|
20
|
-
validation: valModule?.default && Internal.getSchema(valModule?.default)?.validate(
|
21
|
-
valModule?.default && Internal.getValPath(valModule?.default) || "/",
|
22
|
-
valModule?.default && Internal.getSource(valModule?.default)
|
23
|
-
)
|
24
|
-
};
|
25
|
-
`;
|
26
|
-
const result = context.evalCode(
|
27
|
-
code,
|
28
|
-
// Synthetic module name
|
29
|
-
path.join(path.dirname(valConfigPath), "<val>")
|
30
|
-
);
|
31
|
-
const fatalErrors: string[] = [];
|
32
|
-
if (result.error) {
|
33
|
-
const error = result.error.consume(context.dump);
|
34
|
-
console.error(
|
35
|
-
`Fatal error reading val file: ${error.message}\n`,
|
36
|
-
error.stack
|
37
|
-
);
|
38
|
-
return {
|
39
|
-
path: id as SourcePath,
|
40
|
-
errors: {
|
41
|
-
invalidModuleId: id as ModuleId,
|
42
|
-
fatal: [
|
43
|
-
{
|
44
|
-
message: `${error.name || "Unknown error"}: ${
|
45
|
-
error.message || "<no message>"
|
46
|
-
}`,
|
47
|
-
stack: error.stack,
|
48
|
-
},
|
49
|
-
],
|
50
|
-
},
|
51
|
-
};
|
52
|
-
} else {
|
53
|
-
result.value.dispose();
|
54
|
-
const valModule = context
|
55
|
-
.getProp(context.global, "valModule")
|
56
|
-
.consume(context.dump);
|
57
|
-
|
58
|
-
if (!valModule) {
|
59
|
-
fatalErrors.push(`Could not find any modules at: ${id}`);
|
60
|
-
} else {
|
61
|
-
if (valModule.id !== id) {
|
62
|
-
fatalErrors.push(
|
63
|
-
`Wrong val.content id! In the file of with: '${id}', found: '${valModule.id}'`
|
64
|
-
);
|
65
|
-
}
|
66
|
-
if (!valModule?.schema) {
|
67
|
-
fatalErrors.push(`Expected val id: '${id}' to have a schema`);
|
68
|
-
}
|
69
|
-
if (valModule?.source === undefined) {
|
70
|
-
fatalErrors.push(`Expected val id: '${id}' to have a source`);
|
71
|
-
}
|
72
|
-
}
|
73
|
-
let errors: SerializedModuleContent["errors"] = false;
|
74
|
-
if (fatalErrors.length > 0) {
|
75
|
-
errors = {
|
76
|
-
invalidModuleId: valModule.id !== id ? (id as ModuleId) : undefined,
|
77
|
-
fatal: fatalErrors.map((message) => ({ message })),
|
78
|
-
};
|
79
|
-
}
|
80
|
-
if (valModule?.validation) {
|
81
|
-
errors = {
|
82
|
-
...(errors ? errors : {}),
|
83
|
-
validation: valModule.validation,
|
84
|
-
};
|
85
|
-
}
|
86
|
-
return {
|
87
|
-
path: valModule.id || id, // NOTE: we use path here, since SerializedModuleContent (maybe bad name?) can be used for whole modules as well as subparts of modules
|
88
|
-
source: valModule.source,
|
89
|
-
schema: valModule.schema,
|
90
|
-
errors,
|
91
|
-
};
|
92
|
-
}
|
93
|
-
} finally {
|
94
|
-
context.dispose();
|
95
|
-
}
|
96
|
-
};
|
@@ -1,23 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "val-test-app",
|
3
|
-
"version": "0.1.0",
|
4
|
-
"private": true,
|
5
|
-
"scripts": {
|
6
|
-
"dev": "next dev",
|
7
|
-
"build": "next build",
|
8
|
-
"start": "next start",
|
9
|
-
"lint": "next lint"
|
10
|
-
},
|
11
|
-
"dependencies": {
|
12
|
-
"@next/font": "13.1.2",
|
13
|
-
"@types/node": "18.11.18",
|
14
|
-
"@types/react": "18.0.27",
|
15
|
-
"@types/react-dom": "18.0.10",
|
16
|
-
"eslint": "8.32.0",
|
17
|
-
"eslint-config-next": "13.1.2",
|
18
|
-
"next": "13.1.2",
|
19
|
-
"react": "18.2.0",
|
20
|
-
"react-dom": "18.2.0",
|
21
|
-
"typescript": "4.9.4"
|
22
|
-
}
|
23
|
-
}
|
@@ -1,20 +0,0 @@
|
|
1
|
-
import { s, val } from "../val.config";
|
2
|
-
|
3
|
-
export default val.content(
|
4
|
-
"/pages/blogs",
|
5
|
-
s.array(s.object({ title: s.string({ maxLength: 1 }), text: s.string() })),
|
6
|
-
[
|
7
|
-
{
|
8
|
-
title: "HVA?",
|
9
|
-
text: "Vi gjør mange ting sammen i Blank, men det vi lever av er å designe og utvikle digitale tjenester for kundene våre.\n\n Noen av selskapene vi jobber med er små, andre er store. Alle har de høye ambisjoner for sine digitale løsninger, og stiller høye krav til hvem de jobber med.\n \n Noen ganger starter vi nye, egne, selskaper også, mest fordi det er gøy (og fordi vi liker å bygge ting), men også fordi smarte folk har gode idéer som fortjener å bli realisert.\n Ting vi har bygd for kundene våre",
|
10
|
-
},
|
11
|
-
{
|
12
|
-
title: "HVEM ER VI?",
|
13
|
-
text: "I Blank er vi en gjeng på omtrent 50 ulike folk som er ekstremt dyktige i faget vår - digital produktutvikling. Vi er en tredjedel designere og resten teknologer.",
|
14
|
-
},
|
15
|
-
{
|
16
|
-
title: "HVORFOR?",
|
17
|
-
text: "Vi startet Blank fordi vi ønsket oss et konsulentselskap hvor vi kan lære og utfordre oss selv, et selskap hvor det er veldig fint å jobbe - og kanskje aller mest fordi vi liker å bygge ting.\n \n I tillegg ønsket vi å forandre bransjen og hvordan et konsulentselskap kan fungere. Mer om det senere..\n \n ",
|
18
|
-
},
|
19
|
-
]
|
20
|
-
);
|
@@ -1,23 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "val-test-app",
|
3
|
-
"version": "0.1.0",
|
4
|
-
"private": true,
|
5
|
-
"scripts": {
|
6
|
-
"dev": "next dev",
|
7
|
-
"build": "next build",
|
8
|
-
"start": "next start",
|
9
|
-
"lint": "next lint"
|
10
|
-
},
|
11
|
-
"dependencies": {
|
12
|
-
"@next/font": "13.1.2",
|
13
|
-
"@types/node": "18.11.18",
|
14
|
-
"@types/react": "18.0.27",
|
15
|
-
"@types/react-dom": "18.0.10",
|
16
|
-
"eslint": "8.32.0",
|
17
|
-
"eslint-config-next": "13.1.2",
|
18
|
-
"next": "13.1.2",
|
19
|
-
"react": "18.2.0",
|
20
|
-
"react-dom": "18.2.0",
|
21
|
-
"typescript": "4.9.4"
|
22
|
-
}
|
23
|
-
}
|
@@ -1,20 +0,0 @@
|
|
1
|
-
import { s, val } from "src/val.config";
|
2
|
-
|
3
|
-
export default val.content(
|
4
|
-
"/pages/blogs",
|
5
|
-
s.array(s.object({ title: s.string({ maxLength: 1 }), text: s.string() })),
|
6
|
-
[
|
7
|
-
{
|
8
|
-
title: "HVA?",
|
9
|
-
text: "Vi gjør mange ting sammen i Blank, men det vi lever av er å designe og utvikle digitale tjenester for kundene våre.\n\n Noen av selskapene vi jobber med er små, andre er store. Alle har de høye ambisjoner for sine digitale løsninger, og stiller høye krav til hvem de jobber med.\n \n Noen ganger starter vi nye, egne, selskaper også, mest fordi det er gøy (og fordi vi liker å bygge ting), men også fordi smarte folk har gode idéer som fortjener å bli realisert.\n Ting vi har bygd for kundene våre",
|
10
|
-
},
|
11
|
-
{
|
12
|
-
title: "HVEM ER VI?",
|
13
|
-
text: "I Blank er vi en gjeng på omtrent 50 ulike folk som er ekstremt dyktige i faget vår - digital produktutvikling. Vi er en tredjedel designere og resten teknologer.",
|
14
|
-
},
|
15
|
-
{
|
16
|
-
title: "HVORFOR?",
|
17
|
-
text: "Vi startet Blank fordi vi ønsket oss et konsulentselskap hvor vi kan lære og utfordre oss selv, et selskap hvor det er veldig fint å jobbe - og kanskje aller mest fordi vi liker å bygge ting.\n \n I tillegg ønsket vi å forandre bransjen og hvordan et konsulentselskap kan fungere. Mer om det senere..\n \n ",
|
18
|
-
},
|
19
|
-
]
|
20
|
-
);
|
@@ -1,24 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"compilerOptions": {
|
3
|
-
"target": "es5",
|
4
|
-
"lib": ["dom", "dom.iterable", "esnext"],
|
5
|
-
"allowJs": true,
|
6
|
-
"skipLibCheck": true,
|
7
|
-
"strict": true,
|
8
|
-
"forceConsistentCasingInFileNames": true,
|
9
|
-
"noEmit": true,
|
10
|
-
"esModuleInterop": true,
|
11
|
-
"module": "esnext",
|
12
|
-
"moduleResolution": "node",
|
13
|
-
"resolveJsonModule": true,
|
14
|
-
"isolatedModules": true,
|
15
|
-
"jsx": "preserve",
|
16
|
-
"incremental": true,
|
17
|
-
"baseUrl": ".",
|
18
|
-
"paths": {
|
19
|
-
"@/*": ["./src/*"]
|
20
|
-
}
|
21
|
-
},
|
22
|
-
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
|
23
|
-
"exclude": ["node_modules"]
|
24
|
-
}
|
@@ -1,23 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "val-test-app",
|
3
|
-
"version": "0.1.0",
|
4
|
-
"private": true,
|
5
|
-
"scripts": {
|
6
|
-
"dev": "next dev",
|
7
|
-
"build": "next build",
|
8
|
-
"start": "next start",
|
9
|
-
"lint": "next lint"
|
10
|
-
},
|
11
|
-
"dependencies": {
|
12
|
-
"@next/font": "13.1.2",
|
13
|
-
"@types/node": "18.11.18",
|
14
|
-
"@types/react": "18.0.27",
|
15
|
-
"@types/react-dom": "18.0.10",
|
16
|
-
"eslint": "8.32.0",
|
17
|
-
"eslint-config-next": "13.1.2",
|
18
|
-
"next": "13.1.2",
|
19
|
-
"react": "18.2.0",
|
20
|
-
"react-dom": "18.2.0",
|
21
|
-
"typescript": "4.9.4"
|
22
|
-
}
|
23
|
-
}
|
@@ -1,20 +0,0 @@
|
|
1
|
-
import { s, val } from "../val.config";
|
2
|
-
|
3
|
-
export default val.content(
|
4
|
-
"/pages/blogs",
|
5
|
-
s.array(s.object({ title: s.string({ maxLength: 1 }), text: s.string() })),
|
6
|
-
[
|
7
|
-
{
|
8
|
-
title: "HVA?",
|
9
|
-
text: "Vi gjør mange ting sammen i Blank, men det vi lever av er å designe og utvikle digitale tjenester for kundene våre.\n\n Noen av selskapene vi jobber med er små, andre er store. Alle har de høye ambisjoner for sine digitale løsninger, og stiller høye krav til hvem de jobber med.\n \n Noen ganger starter vi nye, egne, selskaper også, mest fordi det er gøy (og fordi vi liker å bygge ting), men også fordi smarte folk har gode idéer som fortjener å bli realisert.\n Ting vi har bygd for kundene våre",
|
10
|
-
},
|
11
|
-
{
|
12
|
-
title: "HVEM ER VI?",
|
13
|
-
text: "I Blank er vi en gjeng på omtrent 50 ulike folk som er ekstremt dyktige i faget vår - digital produktutvikling. Vi er en tredjedel designere og resten teknologer.",
|
14
|
-
},
|
15
|
-
{
|
16
|
-
title: "HVORFOR?",
|
17
|
-
text: "Vi startet Blank fordi vi ønsket oss et konsulentselskap hvor vi kan lære og utfordre oss selv, et selskap hvor det er veldig fint å jobbe - og kanskje aller mest fordi vi liker å bygge ting.\n \n I tillegg ønsket vi å forandre bransjen og hvordan et konsulentselskap kan fungere. Mer om det senere..\n \n ",
|
18
|
-
},
|
19
|
-
]
|
20
|
-
);
|
@@ -1,25 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"compilerOptions": {
|
3
|
-
"target": "es5",
|
4
|
-
"lib": ["dom", "dom.iterable", "esnext"],
|
5
|
-
"allowJs": true,
|
6
|
-
"skipLibCheck": true,
|
7
|
-
"strict": true,
|
8
|
-
"forceConsistentCasingInFileNames": true,
|
9
|
-
"noEmit": false,
|
10
|
-
"esModuleInterop": true,
|
11
|
-
"module": "esnext",
|
12
|
-
"moduleResolution": "node",
|
13
|
-
"resolveJsonModule": true,
|
14
|
-
"isolatedModules": true,
|
15
|
-
"jsx": "preserve",
|
16
|
-
"incremental": true,
|
17
|
-
"declaration": true,
|
18
|
-
"baseUrl": ".",
|
19
|
-
"paths": {
|
20
|
-
"@/*": ["./src/*"]
|
21
|
-
}
|
22
|
-
},
|
23
|
-
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
|
24
|
-
"exclude": ["node_modules"]
|
25
|
-
}
|
@@ -1,23 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "val-test-app",
|
3
|
-
"version": "0.1.0",
|
4
|
-
"private": true,
|
5
|
-
"scripts": {
|
6
|
-
"dev": "next dev",
|
7
|
-
"build": "next build",
|
8
|
-
"start": "next start",
|
9
|
-
"lint": "next lint"
|
10
|
-
},
|
11
|
-
"dependencies": {
|
12
|
-
"@next/font": "13.1.2",
|
13
|
-
"@types/node": "18.11.18",
|
14
|
-
"@types/react": "18.0.27",
|
15
|
-
"@types/react-dom": "18.0.10",
|
16
|
-
"eslint": "8.32.0",
|
17
|
-
"eslint-config-next": "13.1.2",
|
18
|
-
"next": "13.1.2",
|
19
|
-
"react": "18.2.0",
|
20
|
-
"react-dom": "18.2.0",
|
21
|
-
"typescript": "4.9.4"
|
22
|
-
}
|
23
|
-
}
|
@@ -1,19 +0,0 @@
|
|
1
|
-
import { s, val } from "../val.config";
|
2
|
-
export default val.content(
|
3
|
-
"/pages/blogs",
|
4
|
-
s.array(s.object({ title: s.string({ maxLength: 1 }), text: s.string() })),
|
5
|
-
[
|
6
|
-
{
|
7
|
-
title: "HVA?",
|
8
|
-
text: "Vi gjør mange ting sammen i Blank, men det vi lever av er å designe og utvikle digitale tjenester for kundene våre.\n\n Noen av selskapene vi jobber med er små, andre er store. Alle har de høye ambisjoner for sine digitale løsninger, og stiller høye krav til hvem de jobber med.\n \n Noen ganger starter vi nye, egne, selskaper også, mest fordi det er gøy (og fordi vi liker å bygge ting), men også fordi smarte folk har gode idéer som fortjener å bli realisert.\n Ting vi har bygd for kundene våre",
|
9
|
-
},
|
10
|
-
{
|
11
|
-
title: "HVEM ER VI?",
|
12
|
-
text: "I Blank er vi en gjeng på omtrent 50 ulike folk som er ekstremt dyktige i faget vår - digital produktutvikling. Vi er en tredjedel designere og resten teknologer.",
|
13
|
-
},
|
14
|
-
{
|
15
|
-
title: "HVORFOR?",
|
16
|
-
text: "Vi startet Blank fordi vi ønsket oss et konsulentselskap hvor vi kan lære og utfordre oss selv, et selskap hvor det er veldig fint å jobbe - og kanskje aller mest fordi vi liker å bygge ting.\n \n I tillegg ønsket vi å forandre bransjen og hvordan et konsulentselskap kan fungere. Mer om det senere..\n \n ",
|
17
|
-
},
|
18
|
-
]
|
19
|
-
);
|
package/tsconfig.json
DELETED