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.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/components/ModelsDirectory.js +8 -2
  3. package/dist/src/components/ModelsDirectory.js.map +1 -1
  4. package/dist/src/components/ModelsDirectory.jsx +4 -0
  5. package/dist/src/components/ModelsDirectory.jsx.map +1 -1
  6. package/dist/src/components/OperationInterface.js +41 -28
  7. package/dist/src/components/OperationInterface.js.map +1 -1
  8. package/dist/src/components/OperationInterface.jsx +27 -22
  9. package/dist/src/components/OperationInterface.jsx.map +1 -1
  10. package/dist/src/components/OperationsDirectory.js +12 -4
  11. package/dist/src/components/OperationsDirectory.js.map +1 -1
  12. package/dist/src/components/OperationsDirectory.jsx +14 -1
  13. package/dist/src/components/OperationsDirectory.jsx.map +1 -1
  14. package/dist/src/components/ResponseTypes.d.ts +4 -0
  15. package/dist/src/components/ResponseTypes.js +41 -0
  16. package/dist/src/components/ResponseTypes.js.map +1 -0
  17. package/dist/src/components/ResponseTypes.jsx +47 -0
  18. package/dist/src/components/ResponseTypes.jsx.map +1 -0
  19. package/dist/src/components/RouteRegistration.js +36 -46
  20. package/dist/src/components/RouteRegistration.js.map +1 -1
  21. package/dist/src/components/RouteRegistration.jsx +40 -31
  22. package/dist/src/components/RouteRegistration.jsx.map +1 -1
  23. package/dist/src/components/RouterFile.js +15 -10
  24. package/dist/src/components/RouterFile.js.map +1 -1
  25. package/dist/src/components/RouterFile.jsx +7 -8
  26. package/dist/src/components/RouterFile.jsx.map +1 -1
  27. package/dist/src/components/RoutesDirectory.js +26 -23
  28. package/dist/src/components/RoutesDirectory.js.map +1 -1
  29. package/dist/src/components/RoutesDirectory.jsx +10 -13
  30. package/dist/src/components/RoutesDirectory.jsx.map +1 -1
  31. package/dist/src/emitter.js +4 -0
  32. package/dist/src/emitter.js.map +1 -1
  33. package/dist/src/emitter.jsx +2 -1
  34. package/dist/src/emitter.jsx.map +1 -1
  35. package/dist/src/utils/http-helpers.d.ts +0 -13
  36. package/dist/src/utils/http-helpers.js +0 -22
  37. package/dist/src/utils/http-helpers.js.map +1 -1
  38. package/package.json +36 -24
  39. package/dist/test/hello.test.d.ts +0 -1
  40. package/dist/test/hello.test.js +0 -187
  41. package/dist/test/hello.test.js.map +0 -1
  42. package/dist/test/test-host.d.ts +0 -5
  43. package/dist/test/test-host.js +0 -52
  44. package/dist/test/test-host.js.map +0 -1
@@ -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}/>
@@ -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;AAEzD,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;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAE3D,MAAM,WAAW,CACf,OAAO,CAAC,OAAO,EACf,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CACxD;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"}
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","toCamelCase","charAt","slice","toPascalCase","toUpperCase","pathToRouteName","replace"],"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;;AAEA;AACA;AACA;AACA,OAAO,SAASC,WAAWA,CAAClB,IAAY,EAAU;EAChD,OAAOA,IAAI,CAACmB,MAAM,CAAC,CAAC,CAAC,CAACJ,WAAW,CAAC,CAAC,GAAGf,IAAI,CAACoB,KAAK,CAAC,CAAC,CAAC;AACrD;;AAEA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACrB,IAAY,EAAU;EACjD,OAAOA,IAAI,CAACmB,MAAM,CAAC,CAAC,CAAC,CAACG,WAAW,CAAC,CAAC,GAAGtB,IAAI,CAACoB,KAAK,CAAC,CAAC,CAAC;AACrD;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASG,eAAeA,CAACN,IAAY,EAAU;EACpD,OAAOA,IAAI,CACRO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAClBA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAClBA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACvB","ignoreList":[]}
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.1.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:JordanHood/typespec-fastify.git"
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.12.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
- "test": "vitest run",
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 {};
@@ -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":[]}
@@ -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>>;
@@ -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":[]}