typespec-fastify 0.1.0 → 0.2.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 +21 -0
- package/dist/src/components/ModelsDirectory.js +8 -2
- package/dist/src/components/ModelsDirectory.js.map +1 -1
- package/dist/src/components/ModelsDirectory.jsx +4 -0
- package/dist/src/components/ModelsDirectory.jsx.map +1 -1
- package/dist/src/components/OperationInterface.js +41 -28
- package/dist/src/components/OperationInterface.js.map +1 -1
- package/dist/src/components/OperationInterface.jsx +27 -22
- package/dist/src/components/OperationInterface.jsx.map +1 -1
- package/dist/src/components/OperationsDirectory.js +12 -4
- package/dist/src/components/OperationsDirectory.js.map +1 -1
- package/dist/src/components/OperationsDirectory.jsx +14 -1
- package/dist/src/components/OperationsDirectory.jsx.map +1 -1
- package/dist/src/components/ResponseTypes.d.ts +4 -0
- package/dist/src/components/ResponseTypes.js +41 -0
- package/dist/src/components/ResponseTypes.js.map +1 -0
- package/dist/src/components/ResponseTypes.jsx +47 -0
- package/dist/src/components/ResponseTypes.jsx.map +1 -0
- package/dist/src/components/RouteRegistration.js +36 -46
- package/dist/src/components/RouteRegistration.js.map +1 -1
- package/dist/src/components/RouteRegistration.jsx +40 -31
- package/dist/src/components/RouteRegistration.jsx.map +1 -1
- package/dist/src/components/RouterFile.js +15 -10
- package/dist/src/components/RouterFile.js.map +1 -1
- package/dist/src/components/RouterFile.jsx +7 -8
- package/dist/src/components/RouterFile.jsx.map +1 -1
- package/dist/src/components/RoutesDirectory.js +26 -23
- package/dist/src/components/RoutesDirectory.js.map +1 -1
- package/dist/src/components/RoutesDirectory.jsx +10 -13
- package/dist/src/components/RoutesDirectory.jsx.map +1 -1
- package/dist/src/emitter.js +4 -0
- package/dist/src/emitter.js.map +1 -1
- package/dist/src/emitter.jsx +2 -1
- package/dist/src/emitter.jsx.map +1 -1
- package/dist/src/utils/http-helpers.d.ts +0 -13
- package/dist/src/utils/http-helpers.js +0 -22
- package/dist/src/utils/http-helpers.js.map +1 -1
- package/package.json +36 -24
- package/dist/test/hello.test.d.ts +0 -1
- package/dist/test/hello.test.js +0 -187
- package/dist/test/hello.test.js.map +0 -1
- package/dist/test/test-host.d.ts +0 -5
- package/dist/test/test-host.js +0 -52
- package/dist/test/test-host.js.map +0 -1
package/dist/src/emitter.jsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { refkey, SourceDirectory } from "@alloy-js/core";
|
|
2
|
+
import { createTSNamePolicy } from "@alloy-js/typescript";
|
|
2
3
|
import { Output, writeOutput } from "@typespec/emitter-framework";
|
|
3
4
|
import { ModelsDirectory } from "./components/ModelsDirectory.js";
|
|
4
5
|
import { OperationsDirectory } from "./components/OperationsDirectory.js";
|
|
@@ -16,7 +17,7 @@ export async function $onEmit(context) {
|
|
|
16
17
|
const groupedOperations = groupOperationsByContainer(httpInfo.operations);
|
|
17
18
|
const allTypes = discoverTypesFromOperations(context.program, httpInfo.operations);
|
|
18
19
|
const loadRoutesRef = refkey("loadRoutes", "route-loader");
|
|
19
|
-
await writeOutput(context.program, <Output program={context.program} externals={[fastifyLib]}>
|
|
20
|
+
await writeOutput(context.program, <Output program={context.program} externals={[fastifyLib]} namePolicy={createTSNamePolicy()}>
|
|
20
21
|
<SourceDirectory path=".">
|
|
21
22
|
<ModelsDirectory namespace={httpInfo.namespace} types={allTypes}/>
|
|
22
23
|
<OperationsDirectory groupedOperations={groupedOperations}/>
|
package/dist/src/emitter.jsx.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.jsx","sourceRoot":"","sources":["../../src/emitter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"emitter.jsx","sourceRoot":"","sources":["../../src/emitter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoC;IAChE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,2BAA2B,CAC1C,OAAO,CAAC,OAAO,EACf,QAAQ,CAAC,UAAU,CACpB,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAE3D,MAAM,WAAW,CACf,OAAO,CAAC,OAAO,EACf,CAAC,MAAM,CACL,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CACzB,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CACxB,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAEjC;MAAA,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CACvB;QAAA,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAChE;QAAA,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,EAC1D;QAAA,CAAC,eAAe,CACd,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,CACrC,aAAa,CAAC,CAAC,aAAa,CAAC,EAE/B;QAAA,CAAC,UAAU,CACT,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC9B,aAAa,CAAC,CAAC,aAAa,CAAC,CAC7B,iBAAiB,CAAC,CAAC,iBAAiB,CAAC,EAEzC;MAAA,EAAE,eAAe,CACnB;IAAA,EAAE,MAAM,CAAC,EACT,OAAO,CAAC,gBAAgB,CACzB,CAAC;AACJ,CAAC"}
|
|
@@ -20,16 +20,3 @@ export declare function getHttpVerb(operation: HttpOperation): string;
|
|
|
20
20
|
* Gets the path for an operation
|
|
21
21
|
*/
|
|
22
22
|
export declare function getOperationPath(operation: HttpOperation): string;
|
|
23
|
-
/**
|
|
24
|
-
* Converts a name to camelCase
|
|
25
|
-
*/
|
|
26
|
-
export declare function toCamelCase(name: string): string;
|
|
27
|
-
/**
|
|
28
|
-
* Converts a name to PascalCase
|
|
29
|
-
*/
|
|
30
|
-
export declare function toPascalCase(name: string): string;
|
|
31
|
-
/**
|
|
32
|
-
* Converts a path to a route name
|
|
33
|
-
* e.g., "/pets/{petId}" -> "pets-petId"
|
|
34
|
-
*/
|
|
35
|
-
export declare function pathToRouteName(path: string): string;
|
|
@@ -53,26 +53,4 @@ export function getHttpVerb(operation) {
|
|
|
53
53
|
export function getOperationPath(operation) {
|
|
54
54
|
return operation.path;
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Converts a name to camelCase
|
|
59
|
-
*/
|
|
60
|
-
export function toCamelCase(name) {
|
|
61
|
-
return name.charAt(0).toLowerCase() + name.slice(1);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Converts a name to PascalCase
|
|
66
|
-
*/
|
|
67
|
-
export function toPascalCase(name) {
|
|
68
|
-
return name.charAt(0).toUpperCase() + name.slice(1);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Converts a path to a route name
|
|
73
|
-
* e.g., "/pets/{petId}" -> "pets-petId"
|
|
74
|
-
*/
|
|
75
|
-
export function pathToRouteName(path) {
|
|
76
|
-
return path.replace(/^\//, "").replace(/\//g, "-").replace(/\{/g, "").replace(/\}/g, "");
|
|
77
|
-
}
|
|
78
56
|
//# sourceMappingURL=http-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["listServices","getHttpService","getHttpOperations","program","services","length","undefined","service","httpService","diagnostics","type","hasErrors","some","checkError","d","severity","operations","namespace","name","groupOperationsByContainer","grouped","Map","operation","op","container","interface","containerName","has","set","get","push","getHttpVerb","verb","toLowerCase","getOperationPath","path"
|
|
1
|
+
{"version":3,"names":["listServices","getHttpService","getHttpOperations","program","services","length","undefined","service","httpService","diagnostics","type","hasErrors","some","checkError","d","severity","operations","namespace","name","groupOperationsByContainer","grouped","Map","operation","op","container","interface","containerName","has","set","get","push","getHttpVerb","verb","toLowerCase","getOperationPath","path"],"sources":["../../../src/utils/http-helpers.ts"],"sourcesContent":[null],"mappings":"AACA,SAASA,YAAY,QAAQ,oBAAoB;AACjD,SAASC,cAAc,QAA4B,gBAAgB;AAOnE;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAACC,OAAgB,EAA2B;EAC3E,MAAMC,QAAQ,GAAGJ,YAAY,CAACG,OAAO,CAAC;EAEtC,IAAIC,QAAQ,CAACC,MAAM,KAAK,CAAC,EAAE;IACzB,OAAOC,SAAS;EAClB;EAEA,MAAM,CAACC,OAAO,CAAC,GAAGH,QAAQ;EAE1B,MAAM,CAACI,WAAW,EAAEC,WAAW,CAAC,GAAGR,cAAc,CAACE,OAAO,EAAEI,OAAO,CAACG,IAAI,CAAC;EAExE,MAAMC,SAAS,GAAGF,WAAW,CAACG,IAAI,CAAC,SAASC,UAAUA,CAACC,CAAC,EAAE;IACxD,OAAOA,CAAC,CAACC,QAAQ,KAAK,OAAO;EAC/B,CAAC,CAAC;EAEF,IAAIJ,SAAS,EAAE;IACb,OAAOL,SAAS;EAClB;EAEA,OAAO;IACLU,UAAU,EAAER,WAAW,CAACQ,UAAU;IAClCC,SAAS,EAAEV,OAAO,CAACG,IAAI,CAACQ;EAC1B,CAAC;AACH;;AAEA;AACA;AACA;AACA,OAAO,SAASC,0BAA0BA,CACxCH,UAA2B,EACG;EAC9B,MAAMI,OAAO,GAAG,IAAIC,GAAG,CAA0B,CAAC;EAElD,KAAK,MAAMC,SAAS,IAAIN,UAAU,EAAE;IAClC,MAAMO,EAAE,GAAGD,SAAS,CAACA,SAAS;IAC9B,MAAME,SAAS,GAAGD,EAAE,CAACE,SAAS,IAAIF,EAAE,CAACN,SAAS;IAE9C,IAAI,CAACO,SAAS,EAAE;IAEhB,MAAME,aAAa,GAAGF,SAAS,CAACN,IAAI;IAEpC,IAAI,CAACE,OAAO,CAACO,GAAG,CAACD,aAAa,CAAC,EAAE;MAC/BN,OAAO,CAACQ,GAAG,CAACF,aAAa,EAAE,EAAE,CAAC;IAChC;IAEAN,OAAO,CAACS,GAAG,CAACH,aAAa,CAAC,CAAEI,IAAI,CAACR,SAAS,CAAC;EAC7C;EAEA,OAAOF,OAAO;AAChB;;AAEA;AACA;AACA;AACA,OAAO,SAASW,WAAWA,CAACT,SAAwB,EAAU;EAC5D,OAAOA,SAAS,CAACU,IAAI,CAACC,WAAW,CAAC,CAAC;AACrC;;AAEA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACZ,SAAwB,EAAU;EACjE,OAAOA,SAAS,CAACa,IAAI;AACvB","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "typespec-fastify",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -14,35 +14,20 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"repository": {
|
|
17
|
-
"url": "git@github.com
|
|
17
|
+
"url": "git+ssh://git@github.com/JordanHood/typespec-fastify.git"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
20
|
"@alloy-js/core": ">=0.20.0",
|
|
21
21
|
"@alloy-js/typescript": ">=0.20.0",
|
|
22
22
|
"@typespec/compiler": ">=1.0.0",
|
|
23
|
-
"@typespec/emitter-framework": ">=0.
|
|
23
|
+
"@typespec/emitter-framework": ">=0.14.0",
|
|
24
24
|
"@typespec/http": ">=1.0.0"
|
|
25
25
|
},
|
|
26
|
-
"devDependencies": {
|
|
27
|
-
"@changesets/changelog-github": "0.5.2",
|
|
28
|
-
"@changesets/cli": "2.29.8",
|
|
29
|
-
"@eslint/js": "9.39.2",
|
|
30
|
-
"@types/node": "25.0.3",
|
|
31
|
-
"@typescript-eslint/eslint-plugin": "8.52.0",
|
|
32
|
-
"@typescript-eslint/parser": "8.52.0",
|
|
33
|
-
"@typespec/compiler": "1.7.1",
|
|
34
|
-
"@vitest/coverage-v8": "4.0.16",
|
|
35
|
-
"@vitest/ui": "4.0.16",
|
|
36
|
-
"eslint": "9.39.2",
|
|
37
|
-
"eslint-config-prettier": "10.1.8",
|
|
38
|
-
"eslint-plugin-prettier": "5.5.4",
|
|
39
|
-
"prettier": "3.7.4",
|
|
40
|
-
"typescript": "5.9.3",
|
|
41
|
-
"typescript-eslint": "8.52.0",
|
|
42
|
-
"vitest": "4.0.16"
|
|
43
|
-
},
|
|
44
26
|
"files": [
|
|
45
|
-
"dist
|
|
27
|
+
"dist",
|
|
28
|
+
"README.md",
|
|
29
|
+
"LICENSE",
|
|
30
|
+
"package.json"
|
|
46
31
|
],
|
|
47
32
|
"keywords": [
|
|
48
33
|
"typespec",
|
|
@@ -54,13 +39,40 @@
|
|
|
54
39
|
"dependencies": {
|
|
55
40
|
"@alloy-js/cli": "0.22.0"
|
|
56
41
|
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@changesets/changelog-github": "0.5.2",
|
|
44
|
+
"@changesets/cli": "2.29.8",
|
|
45
|
+
"@eslint/js": "9.39.2",
|
|
46
|
+
"@types/node": "25.0.8",
|
|
47
|
+
"@typescript-eslint/eslint-plugin": "8.53.0",
|
|
48
|
+
"@typescript-eslint/parser": "8.53.0",
|
|
49
|
+
"@typespec/compiler": "1.8.0",
|
|
50
|
+
"@typespec/http-specs": "0.1.0-alpha.30",
|
|
51
|
+
"@typespec/spector": "0.1.0-alpha.22",
|
|
52
|
+
"@vitest/coverage-v8": "4.0.17",
|
|
53
|
+
"@vitest/ui": "4.0.17",
|
|
54
|
+
"eslint": "9.39.2",
|
|
55
|
+
"eslint-config-prettier": "10.1.8",
|
|
56
|
+
"eslint-plugin-prettier": "5.5.5",
|
|
57
|
+
"fastify": "5.6.2",
|
|
58
|
+
"prettier": "3.7.4",
|
|
59
|
+
"typescript": "5.9.3",
|
|
60
|
+
"typescript-eslint": "8.53.0",
|
|
61
|
+
"vitest": "4.0.17"
|
|
62
|
+
},
|
|
57
63
|
"scripts": {
|
|
58
|
-
"build": "alloy build",
|
|
64
|
+
"build:emitter": "alloy build",
|
|
65
|
+
"build": "pnpm build:emitter && pnpm emit:e2e --silent && pnpm build:emitter",
|
|
59
66
|
"watch": "alloy build --watch",
|
|
60
|
-
"
|
|
67
|
+
"type": "tsc --noEmit -p tsconfig.test.json",
|
|
68
|
+
"test": "pnpm type && pnpm test:unit && pnpm test:e2e",
|
|
69
|
+
"test:unit": "vitest run",
|
|
61
70
|
"test:watch": "vitest",
|
|
62
71
|
"test:ui": "vitest --ui",
|
|
63
72
|
"test:coverage": "vitest run --coverage",
|
|
73
|
+
"test:e2e": "pnpm emit:e2e && pnpm run:e2e",
|
|
74
|
+
"emit:e2e": "node eng/scripts/emit-e2e.js",
|
|
75
|
+
"run:e2e": "vitest run --config vitest.config.e2e.ts",
|
|
64
76
|
"lint": "eslint .",
|
|
65
77
|
"lint:fix": "eslint . --fix",
|
|
66
78
|
"changeset": "changeset",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/test/hello.test.js
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { emit } from "./test-host.js";
|
|
3
|
-
describe("typespec-fastify emitter", () => {
|
|
4
|
-
it("generates router.ts with registerRoutes function", async () => {
|
|
5
|
-
const results = await emit(`
|
|
6
|
-
import "@typespec/http";
|
|
7
|
-
using TypeSpec.Http;
|
|
8
|
-
|
|
9
|
-
@service
|
|
10
|
-
namespace TestService;
|
|
11
|
-
|
|
12
|
-
model Item {
|
|
13
|
-
id: int32;
|
|
14
|
-
name: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
@route("/items")
|
|
18
|
-
interface Items {
|
|
19
|
-
@get list(): Item[];
|
|
20
|
-
}
|
|
21
|
-
`);
|
|
22
|
-
expect(results["router.ts"]).toBeDefined();
|
|
23
|
-
expect(results["router.ts"]).toContain("registerRoutes");
|
|
24
|
-
expect(results["router.ts"]).toContain("FastifyInstance");
|
|
25
|
-
});
|
|
26
|
-
it("generates operation interfaces", async () => {
|
|
27
|
-
const results = await emit(`
|
|
28
|
-
import "@typespec/http";
|
|
29
|
-
using TypeSpec.Http;
|
|
30
|
-
|
|
31
|
-
@service
|
|
32
|
-
namespace TestService;
|
|
33
|
-
|
|
34
|
-
model Pet {
|
|
35
|
-
id: int32;
|
|
36
|
-
name: string;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
@route("/pets")
|
|
40
|
-
interface Pets {
|
|
41
|
-
@get list(): Pet[];
|
|
42
|
-
@get get(@path petId: int32): Pet;
|
|
43
|
-
@post create(@body pet: Pet): Pet;
|
|
44
|
-
}
|
|
45
|
-
`);
|
|
46
|
-
expect(results["operations/pets.ts"]).toBeDefined();
|
|
47
|
-
expect(results["operations/pets.ts"]).toContain("interface Pets");
|
|
48
|
-
expect(results["operations/pets.ts"]).toContain("list");
|
|
49
|
-
expect(results["operations/pets.ts"]).toContain("get");
|
|
50
|
-
expect(results["operations/pets.ts"]).toContain("create");
|
|
51
|
-
});
|
|
52
|
-
it("generates route handlers", async () => {
|
|
53
|
-
const results = await emit(`
|
|
54
|
-
import "@typespec/http";
|
|
55
|
-
using TypeSpec.Http;
|
|
56
|
-
|
|
57
|
-
@service
|
|
58
|
-
namespace TestService;
|
|
59
|
-
|
|
60
|
-
model Item {
|
|
61
|
-
id: int32;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
@route("/items")
|
|
65
|
-
interface Items {
|
|
66
|
-
@get list(): Item[];
|
|
67
|
-
}
|
|
68
|
-
`);
|
|
69
|
-
expect(results["routes/items.routes.ts"]).toBeDefined();
|
|
70
|
-
expect(results["routes/items.routes.ts"]).toContain("registerItemsRoutes");
|
|
71
|
-
expect(results["routes/items.routes.ts"]).toContain("fastify.get");
|
|
72
|
-
});
|
|
73
|
-
it("generates model types", async () => {
|
|
74
|
-
const results = await emit(`
|
|
75
|
-
import "@typespec/http";
|
|
76
|
-
using TypeSpec.Http;
|
|
77
|
-
|
|
78
|
-
@service
|
|
79
|
-
namespace TestService;
|
|
80
|
-
|
|
81
|
-
model Pet {
|
|
82
|
-
id: int32;
|
|
83
|
-
name: string;
|
|
84
|
-
age: int32;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
@route("/pets")
|
|
88
|
-
interface Pets {
|
|
89
|
-
@get list(): Pet[];
|
|
90
|
-
}
|
|
91
|
-
`);
|
|
92
|
-
expect(results["models/testservice.ts"]).toBeDefined();
|
|
93
|
-
expect(results["models/testservice.ts"]).toContain("interface Pet");
|
|
94
|
-
expect(results["models/testservice.ts"]).toContain("id: number");
|
|
95
|
-
expect(results["models/testservice.ts"]).toContain("name: string");
|
|
96
|
-
});
|
|
97
|
-
it("handles path parameters correctly", async () => {
|
|
98
|
-
const results = await emit(`
|
|
99
|
-
import "@typespec/http";
|
|
100
|
-
using TypeSpec.Http;
|
|
101
|
-
|
|
102
|
-
@service
|
|
103
|
-
namespace TestService;
|
|
104
|
-
|
|
105
|
-
model Item {
|
|
106
|
-
id: int32;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
@route("/items")
|
|
110
|
-
interface Items {
|
|
111
|
-
@get
|
|
112
|
-
@route("/{itemId}")
|
|
113
|
-
get(@path itemId: int32): Item;
|
|
114
|
-
}
|
|
115
|
-
`);
|
|
116
|
-
const routesContent = results["routes/items.routes.ts"];
|
|
117
|
-
expect(routesContent).toContain("itemId");
|
|
118
|
-
expect(routesContent).toContain("request.params");
|
|
119
|
-
});
|
|
120
|
-
it("handles query parameters as options object", async () => {
|
|
121
|
-
const results = await emit(`
|
|
122
|
-
import "@typespec/http";
|
|
123
|
-
using TypeSpec.Http;
|
|
124
|
-
|
|
125
|
-
@service
|
|
126
|
-
namespace TestService;
|
|
127
|
-
|
|
128
|
-
model Item {
|
|
129
|
-
id: int32;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
@route("/items")
|
|
133
|
-
interface Items {
|
|
134
|
-
@get list(@query limit?: int32, @query offset?: int32): Item[];
|
|
135
|
-
}
|
|
136
|
-
`);
|
|
137
|
-
const operationsContent = results["operations/items.ts"];
|
|
138
|
-
expect(operationsContent).toContain("options?");
|
|
139
|
-
expect(operationsContent).toContain("limit?");
|
|
140
|
-
expect(operationsContent).toContain("offset?");
|
|
141
|
-
});
|
|
142
|
-
it("handles request body correctly", async () => {
|
|
143
|
-
const results = await emit(`
|
|
144
|
-
import "@typespec/http";
|
|
145
|
-
using TypeSpec.Http;
|
|
146
|
-
|
|
147
|
-
@service
|
|
148
|
-
namespace TestService;
|
|
149
|
-
|
|
150
|
-
model Item {
|
|
151
|
-
name: string;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
@route("/items")
|
|
155
|
-
interface Items {
|
|
156
|
-
@post create(@body item: Item): Item;
|
|
157
|
-
}
|
|
158
|
-
`);
|
|
159
|
-
const operationsContent = results["operations/items.ts"];
|
|
160
|
-
expect(operationsContent).toContain("body: Item");
|
|
161
|
-
const routesContent = results["routes/items.routes.ts"];
|
|
162
|
-
expect(routesContent).toContain("request.body");
|
|
163
|
-
});
|
|
164
|
-
it("generates error handling in route handlers", async () => {
|
|
165
|
-
const results = await emit(`
|
|
166
|
-
import "@typespec/http";
|
|
167
|
-
using TypeSpec.Http;
|
|
168
|
-
|
|
169
|
-
@service
|
|
170
|
-
namespace TestService;
|
|
171
|
-
|
|
172
|
-
model Item {
|
|
173
|
-
id: int32;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
@route("/items")
|
|
177
|
-
interface Items {
|
|
178
|
-
@get list(): Item[];
|
|
179
|
-
}
|
|
180
|
-
`);
|
|
181
|
-
const routesContent = results["routes/items.routes.ts"];
|
|
182
|
-
expect(routesContent).toContain("try");
|
|
183
|
-
expect(routesContent).toContain("catch");
|
|
184
|
-
expect(routesContent).toContain("reply.code(500)");
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
//# sourceMappingURL=hello.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["describe","it","expect","emit","results","toBeDefined","toContain","routesContent","operationsContent"],"sources":["../../test/hello.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/test/test-host.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Diagnostic } from "@typespec/compiler";
|
|
2
|
-
export declare function createTypespecFastifyTestHost(): Promise<import("@typespec/compiler/testing").TestHost>;
|
|
3
|
-
export declare function createTypespecFastifyTestRunner(): Promise<import("@typespec/compiler/testing").BasicTestRunner>;
|
|
4
|
-
export declare function emitWithDiagnostics(code: string): Promise<[Record<string, string>, readonly Diagnostic[]]>;
|
|
5
|
-
export declare function emit(code: string): Promise<Record<string, string>>;
|
package/dist/test/test-host.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { resolvePath } from "@typespec/compiler";
|
|
2
|
-
import { createTestHost, createTestWrapper, expectDiagnosticEmpty } from "@typespec/compiler/testing";
|
|
3
|
-
import { HttpTestLibrary } from "@typespec/http/testing";
|
|
4
|
-
import { TypespecFastifyTestLibrary } from "../src/testing/index.js";
|
|
5
|
-
export async function createTypespecFastifyTestHost() {
|
|
6
|
-
return createTestHost({
|
|
7
|
-
libraries: [HttpTestLibrary, TypespecFastifyTestLibrary]
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
export async function createTypespecFastifyTestRunner() {
|
|
11
|
-
const host = await createTypespecFastifyTestHost();
|
|
12
|
-
return createTestWrapper(host, {
|
|
13
|
-
compilerOptions: {
|
|
14
|
-
noEmit: false,
|
|
15
|
-
emit: ["typespec-fastify"]
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
export async function emitWithDiagnostics(code) {
|
|
20
|
-
const runner = await createTypespecFastifyTestRunner();
|
|
21
|
-
await runner.compileAndDiagnose(code, {
|
|
22
|
-
outputDir: "tsp-output"
|
|
23
|
-
});
|
|
24
|
-
const emitterOutputDir = "./tsp-output/typespec-fastify";
|
|
25
|
-
const result = {};
|
|
26
|
-
async function readFilesRecursive(dir, relativePath = "") {
|
|
27
|
-
const entries = await runner.program.host.readDir(dir);
|
|
28
|
-
for (const entry of entries) {
|
|
29
|
-
const fullPath = resolvePath(dir, entry);
|
|
30
|
-
const relPath = relativePath ? `${relativePath}/${entry}` : entry;
|
|
31
|
-
try {
|
|
32
|
-
const stat = await runner.program.host.stat(fullPath);
|
|
33
|
-
if (stat.isDirectory()) {
|
|
34
|
-
await readFilesRecursive(fullPath, relPath);
|
|
35
|
-
} else if (stat.isFile()) {
|
|
36
|
-
const content = await runner.program.host.readFile(fullPath);
|
|
37
|
-
result[relPath] = content.text;
|
|
38
|
-
}
|
|
39
|
-
} catch {
|
|
40
|
-
// Skip entries that can't be read
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
await readFilesRecursive(emitterOutputDir);
|
|
45
|
-
return [result, runner.program.diagnostics];
|
|
46
|
-
}
|
|
47
|
-
export async function emit(code) {
|
|
48
|
-
const [result, diagnostics] = await emitWithDiagnostics(code);
|
|
49
|
-
expectDiagnosticEmpty(diagnostics);
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=test-host.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["resolvePath","createTestHost","createTestWrapper","expectDiagnosticEmpty","HttpTestLibrary","TypespecFastifyTestLibrary","createTypespecFastifyTestHost","libraries","createTypespecFastifyTestRunner","host","compilerOptions","noEmit","emit","emitWithDiagnostics","code","runner","compileAndDiagnose","outputDir","emitterOutputDir","result","readFilesRecursive","dir","relativePath","entries","program","readDir","entry","fullPath","relPath","stat","isDirectory","isFile","content","readFile","text","diagnostics"],"sources":["../../test/test-host.ts"],"sourcesContent":[null],"mappings":"AAAA,SAAqBA,WAAW,QAAQ,oBAAoB;AAC5D,SACEC,cAAc,EACdC,iBAAiB,EACjBC,qBAAqB,QAChB,4BAA4B;AACnC,SAASC,eAAe,QAAQ,wBAAwB;AACxD,SAASC,0BAA0B,QAAQ,yBAAyB;AAEpE,OAAO,eAAeC,6BAA6BA,CAAA,EAAG;EACpD,OAAOL,cAAc,CAAC;IACpBM,SAAS,EAAE,CAACH,eAAe,EAAEC,0BAA0B;EACzD,CAAC,CAAC;AACJ;AAEA,OAAO,eAAeG,+BAA+BA,CAAA,EAAG;EACtD,MAAMC,IAAI,GAAG,MAAMH,6BAA6B,CAAC,CAAC;EAElD,OAAOJ,iBAAiB,CAACO,IAAI,EAAE;IAC7BC,eAAe,EAAE;MACfC,MAAM,EAAE,KAAK;MACbC,IAAI,EAAE,CAAC,kBAAkB;IAC3B;EACF,CAAC,CAAC;AACJ;AAEA,OAAO,eAAeC,mBAAmBA,CACvCC,IAAY,EAC8C;EAC1D,MAAMC,MAAM,GAAG,MAAMP,+BAA+B,CAAC,CAAC;EACtD,MAAMO,MAAM,CAACC,kBAAkB,CAACF,IAAI,EAAE;IACpCG,SAAS,EAAE;EACb,CAAC,CAAC;EACF,MAAMC,gBAAgB,GAAG,+BAA+B;EAExD,MAAMC,MAA8B,GAAG,CAAC,CAAC;EAEzC,eAAeC,kBAAkBA,CAACC,GAAW,EAAEC,YAAoB,GAAG,EAAE,EAAE;IACxE,MAAMC,OAAO,GAAG,MAAMR,MAAM,CAACS,OAAO,CAACf,IAAI,CAACgB,OAAO,CAACJ,GAAG,CAAC;IAEtD,KAAK,MAAMK,KAAK,IAAIH,OAAO,EAAE;MAC3B,MAAMI,QAAQ,GAAG3B,WAAW,CAACqB,GAAG,EAAEK,KAAK,CAAC;MACxC,MAAME,OAAO,GAAGN,YAAY,GAAG,GAAGA,YAAY,IAAII,KAAK,EAAE,GAAGA,KAAK;MAEjE,IAAI;QACF,MAAMG,IAAI,GAAG,MAAMd,MAAM,CAACS,OAAO,CAACf,IAAI,CAACoB,IAAI,CAACF,QAAQ,CAAC;QACrD,IAAIE,IAAI,CAACC,WAAW,CAAC,CAAC,EAAE;UACtB,MAAMV,kBAAkB,CAACO,QAAQ,EAAEC,OAAO,CAAC;QAC7C,CAAC,MAAM,IAAIC,IAAI,CAACE,MAAM,CAAC,CAAC,EAAE;UACxB,MAAMC,OAAO,GAAG,MAAMjB,MAAM,CAACS,OAAO,CAACf,IAAI,CAACwB,QAAQ,CAACN,QAAQ,CAAC;UAC5DR,MAAM,CAACS,OAAO,CAAC,GAAGI,OAAO,CAACE,IAAI;QAChC;MACF,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;EAEA,MAAMd,kBAAkB,CAACF,gBAAgB,CAAC;EAE1C,OAAO,CAACC,MAAM,EAAEJ,MAAM,CAACS,OAAO,CAACW,WAAW,CAAC;AAC7C;AAEA,OAAO,eAAevB,IAAIA,CAACE,IAAY,EAAmC;EACxE,MAAM,CAACK,MAAM,EAAEgB,WAAW,CAAC,GAAG,MAAMtB,mBAAmB,CAACC,IAAI,CAAC;EAC7DX,qBAAqB,CAACgC,WAAW,CAAC;EAClC,OAAOhB,MAAM;AACf","ignoreList":[]}
|