From 81abb33cc9054b3c5f9a00a9c11a033b8c1eb4ea Mon Sep 17 00:00:00 2001 From: Will Temple Date: Tue, 25 Apr 2023 18:23:08 -0400 Subject: [PATCH 1/7] Added some utility types to Protobuf and fixed module loading order. --- packages/protobuf/lib/proto.tsp | 9 ++++++++- packages/protobuf/package.json | 2 +- packages/protobuf/src/index.ts | 7 +++++++ packages/protobuf/src/lib.ts | 2 -- packages/protobuf/src/proto.ts | 1 - packages/protobuf/src/transform/index.ts | 5 ++--- 6 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 packages/protobuf/src/index.ts diff --git a/packages/protobuf/lib/proto.tsp b/packages/protobuf/lib/proto.tsp index bea96e092ae..59268bc4989 100644 --- a/packages/protobuf/lib/proto.tsp +++ b/packages/protobuf/lib/proto.tsp @@ -1,4 +1,4 @@ -import "../dist/src/proto.js"; +import "../dist/src/index.js"; namespace TypeSpec.Protobuf; @@ -57,6 +57,13 @@ namespace WellKnown { * This model references `google.protobuf.Any` from `google/protobuf/any.proto`. */ model Any is Extern<"google/protobuf/any.proto", "google.protobuf.Any">; + + /** + * A latitude and longitude. + * + * This model references `google.type.LatLng` from `google/type/latlng.proto`. + */ + model LatLng is Extern<"google/type/latlng.proto", "google.type.LatLng">; } /** diff --git a/packages/protobuf/package.json b/packages/protobuf/package.json index 39fb2915f4e..2b9de3cde99 100644 --- a/packages/protobuf/package.json +++ b/packages/protobuf/package.json @@ -18,7 +18,7 @@ "protobuf", "grpc" ], - "main": "dist/src/lib.js", + "main": "dist/src/index.js", "type": "module", "tspMain": "lib/proto.tsp", "scripts": { diff --git a/packages/protobuf/src/index.ts b/packages/protobuf/src/index.ts new file mode 100644 index 00000000000..0dd36fbcc21 --- /dev/null +++ b/packages/protobuf/src/index.ts @@ -0,0 +1,7 @@ +import { TypeSpecProtobufLibrary } from "./lib.js"; + +export const namespace = "TypeSpec.Protobuf"; + +export * from "./proto.js"; + +export const $lib = TypeSpecProtobufLibrary; diff --git a/packages/protobuf/src/lib.ts b/packages/protobuf/src/lib.ts index bbf1d936fff..53f0ac77e39 100644 --- a/packages/protobuf/src/lib.ts +++ b/packages/protobuf/src/lib.ts @@ -141,8 +141,6 @@ export const TypeSpecProtobufLibrary = createTypeSpecLibrary({ export const { reportDiagnostic } = TypeSpecProtobufLibrary; -export { $onEmit } from "./proto.js"; - export type TypeSpecProtobufLibrary = typeof TypeSpecProtobufLibrary; const keys = [ diff --git a/packages/protobuf/src/proto.ts b/packages/protobuf/src/proto.ts index 3e17d03566d..9f22bc5f1c9 100644 --- a/packages/protobuf/src/proto.ts +++ b/packages/protobuf/src/proto.ts @@ -215,4 +215,3 @@ export async function $onValidate(program: Program) { } export const namespace = "TypeSpec.Protobuf"; -export { TypeSpecProtobufLibrary as $lib }; diff --git a/packages/protobuf/src/transform/index.ts b/packages/protobuf/src/transform/index.ts index 121febbe620..25d9bbd7aab 100644 --- a/packages/protobuf/src/transform/index.ts +++ b/packages/protobuf/src/transform/index.ts @@ -22,7 +22,6 @@ import { Type, Union, } from "@typespec/compiler"; -import { EOL } from "os"; import { map, matchType, @@ -350,7 +349,7 @@ function tspToProto(program: Program): ProtoFile[] { if (!emptyType) { throw new Error( - `Could not resolve the empty type: ${diagnostics.map(formatDiagnostic).join(EOL)}` + `Could not resolve the empty type: ${diagnostics.map(formatDiagnostic).join("\n")}` ); } @@ -569,7 +568,7 @@ function tspToProto(program: Program): ProtoFile[] { for (const [[type, diagnostics]] of entries) { if (!type) { - const diagnosticString = diagnostics.map(formatDiagnostic).join(EOL); + const diagnosticString = diagnostics.map(formatDiagnostic).join("\n"); throw new Error( `Failed to construct TypeSpec -> Protobuf scalar map. Unexpected failure to resolve TypeSpec scalar: ${diagnosticString}` ); From 4a83312544e9b3f7eb847be85446ab88d30a4d04 Mon Sep 17 00:00:00 2001 From: Will Temple Date: Tue, 25 Apr 2023 18:23:35 -0400 Subject: [PATCH 2/7] Added protobuf support and preferred emitters to the playground --- packages/playground/package.json | 1 + packages/playground/samples/protobuf.tsp | 101 ++++++++++++++++++ packages/playground/src/build-utils/index.ts | 16 ++- .../src/components/editor-command-bar.tsx | 23 +++- .../src/components/emitter-dropdown.tsx | 3 +- .../src/components/openapi-output.tsx | 2 +- .../playground/src/components/playground.tsx | 8 +- .../src/components/samples-dropdown.tsx | 4 +- packages/playground/src/index.ts | 8 +- packages/playground/vite.config.ts | 17 ++- 10 files changed, 170 insertions(+), 13 deletions(-) create mode 100644 packages/playground/samples/protobuf.tsp diff --git a/packages/playground/package.json b/packages/playground/package.json index acf9b459764..145452a12ff 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -47,6 +47,7 @@ "@typespec/rest": "~0.43.0", "@typespec/openapi3": "~0.43.0", "@typespec/openapi": "~0.43.0", + "@typespec/protobuf": "~0.43.0", "@typespec/html-program-viewer": "~0.43.0", "@emotion/react": "^11.10.4", "@vitejs/plugin-react": "~3.1.0", diff --git a/packages/playground/samples/protobuf.tsp b/packages/playground/samples/protobuf.tsp new file mode 100644 index 00000000000..bfe9783847c --- /dev/null +++ b/packages/playground/samples/protobuf.tsp @@ -0,0 +1,101 @@ +import "@typespec/protobuf"; + +using TypeSpec.Protobuf; + +@package({ + name: "kiosk", +}) +namespace KioskExample; + +@TypeSpec.Protobuf.service +interface Display { + /** + * Create a new kiosk. This enrolls the kiosk for sign display. + */ + createKiosk(...Kiosk): Kiosk; + + /** + * List active kiosks. + */ + listKiosks(...WellKnown.Empty): { + @field(1) kiosks: Kiosk[]; + }; + + /** + * Get a kiosk. + */ + getKiosk(@field(1) id: int32): Kiosk; + + /** + * Delete a kiosk. + */ + deleteKiosk(@field(1) id: int32): void; + + /** + * Create a new sign. + */ + createSign(...Sign): Sign; + + /** + * List active signs. + */ + listSigns(...WellKnown.Empty): { + @field(1) signs: Sign[]; + }; + + /** + * Get a sign. + */ + getSign(@field(1) id: int32): Sign; + + /** + * Delete a sign. + */ + deleteSign(@field(1) id: int32): void; + + /** + * Set a sign for display on one or more kiosks + */ + setSignIdForKioskIds(@field(1) kiosk_ids: int32[], @field(2) sign_id: int32): void; + + /** + * Get the sign that should be displayed on a kiosk. + */ + getSignIdForKioskId(@field(1) kiosk_id: int32): GetSignIdResponse; + /** + * Get signs that should be displayed on a kiosk. Streams. + */ + @stream(StreamMode.Out) + getSignIdsforKioskId(@field(1) kiosk_id: int32): GetSignIdResponse; +} + +model Kiosk { + // Output only. + @field(1) id?: int32; + // Required. + @field(2) name: string; + @field(3) size: ScreenSize; + @field(4) location: WellKnown.LatLng; + // Output only. + @field(5) create_time?: WellKnown.Timestamp; +} + +model Sign { + // Output only. + @field(1) id?: int32; + // Required. + @field(2) name: string; + @field(3) text: string; + @field(4) image: bytes; + // Output only. + @field(5) create_time?: WellKnown.Timestamp; +} + +model ScreenSize { + @field(1) width: int32; + @field(2) height: int32; +} + +model GetSignIdResponse { + @field(1) sign_id: int32; +} diff --git a/packages/playground/src/build-utils/index.ts b/packages/playground/src/build-utils/index.ts index 40ba048b6ba..d835ace746d 100644 --- a/packages/playground/src/build-utils/index.ts +++ b/packages/playground/src/build-utils/index.ts @@ -63,11 +63,23 @@ function playgroundManifestPlugin(config: PlaygroundConfig): Plugin { load(id: string) { if (id === `playground-manifest.js`) { const sampleImport = Object.values(samples) - .map((path, index) => `import s${index} from "${viteConfig.root}/${path}?raw"`) + .map( + (sampleValue, index) => + `import s${index} from "${viteConfig.root}/${sampleValue.fileName}?raw"` + ) .join("\n"); const sampleObj = [ "{", - ...Object.keys(samples).map((label, index) => `${JSON.stringify(label)}: s${index}, `), + ...Object.entries(samples).map( + ([label, config], index) => + `${JSON.stringify(label)}: { + fileName: ${JSON.stringify(config.fileName)}, + preferredEmitter: ${ + config.preferredEmitter ? JSON.stringify(config.preferredEmitter) : "undefined" + }, + content: s${index} + }, ` + ), "}", ].join("\n"); diff --git a/packages/playground/src/components/editor-command-bar.tsx b/packages/playground/src/components/editor-command-bar.tsx index 381c29e2d76..a5cf3db538b 100644 --- a/packages/playground/src/components/editor-command-bar.tsx +++ b/packages/playground/src/components/editor-command-bar.tsx @@ -1,6 +1,9 @@ import { Link, Toolbar, ToolbarButton, Tooltip } from "@fluentui/react-components"; import { Bug16Regular, Save16Regular } from "@fluentui/react-icons"; -import { FunctionComponent } from "react"; +import { FunctionComponent, useCallback } from "react"; +import { useSetRecoilState } from "recoil"; +import { SampleConfig } from "../index.js"; +import { selectedEmitterState } from "../state.js"; import { EmitterDropdown } from "./emitter-dropdown.js"; import { SamplesDropdown } from "./samples-dropdown.js"; @@ -23,6 +26,22 @@ export const EditorCommandBar: FunctionComponent = ({ ) : undefined; + + const setEmitter = useSetRecoilState(selectedEmitterState); + + const onSelectSample = useCallback( + (config: SampleConfig) => { + if (!config.content) throw new Error("Unreachable: sample has no 'content' property"); + + updateTypeSpec(config.content); + + if (config.preferredEmitter) { + setEmitter(config.preferredEmitter); + } + }, + [setEmitter, updateTypeSpec] + ); + return (
@@ -34,7 +53,7 @@ export const EditorCommandBar: FunctionComponent = ({ onClick={saveCode as any} /> - + {documentation}
diff --git a/packages/playground/src/components/emitter-dropdown.tsx b/packages/playground/src/components/emitter-dropdown.tsx index bcce23abc82..df08a7600ab 100644 --- a/packages/playground/src/components/emitter-dropdown.tsx +++ b/packages/playground/src/components/emitter-dropdown.tsx @@ -13,6 +13,7 @@ export const EmitterDropdown: FunctionComponent = () => { useEffect(() => { Promise.all(PlaygroundManifest.libraries.map(async (x) => [x, await importShim(x)])) .then((emitters) => { + console.log("Loaded library:", emitters); setEmitters(emitters.filter(([, x]) => (x as any).$lib?.emitter).map((x: any) => x[0])); }) // eslint-disable-next-line no-console @@ -33,7 +34,7 @@ export const EmitterDropdown: FunctionComponent = () => { return ( diff --git a/packages/playground/src/components/openapi-output.tsx b/packages/playground/src/components/openapi-output.tsx index ced3515abbd..688e452f545 100644 --- a/packages/playground/src/components/openapi-output.tsx +++ b/packages/playground/src/components/openapi-output.tsx @@ -12,7 +12,7 @@ export interface OpenAPIOutputProps { export const OpenAPIOutput: FunctionComponent = (props) => { const [selected, setSelected] = useState<"raw" | "swagger-ui">("raw"); const options = [ - { label: "OpenAPI", value: "raw" }, + { label: "Output Files", value: "raw" }, { label: "Swagger UI", value: "swagger-ui" }, ]; diff --git a/packages/playground/src/components/playground.tsx b/packages/playground/src/components/playground.tsx index 72ae9e8c7b0..db46ea7dfed 100644 --- a/packages/playground/src/components/playground.tsx +++ b/packages/playground/src/components/playground.tsx @@ -49,6 +49,8 @@ const PlaygroundInternal: FunctionComponent = ({ const emittersOptions = useRecoilValue(emittersOptionsState); const selectedEmitter = useRecoilValue(selectedEmitterState); + let dispose: (() => void) | undefined = undefined; + const doCompile = useCallback(async () => { const content = typespecModel.getValue(); const typespecCompiler = await importTypeSpecCompiler(); @@ -70,6 +72,8 @@ const PlaygroundInternal: FunctionComponent = ({ const updateTypeSpec = useCallback( (value: string) => { + // Cancel the debouncing compile so that if the sample has a preferred emitter, we won't overwrite it. + dispose?.(); typespecModel.setValue(value); }, [typespecModel] @@ -82,8 +86,10 @@ const PlaygroundInternal: FunctionComponent = ({ useEffect(() => { const disposable = typespecModel.onDidChangeContent(debounce(() => doCompile(), 200)); - return () => disposable.dispose(); + dispose = () => disposable.dispose(); + return dispose; }, [typespecModel, doCompile]); + useEffect(() => { void doCompile(); }, [doCompile]); diff --git a/packages/playground/src/components/samples-dropdown.tsx b/packages/playground/src/components/samples-dropdown.tsx index 16d5bc0bfb3..76dd755c6bd 100644 --- a/packages/playground/src/components/samples-dropdown.tsx +++ b/packages/playground/src/components/samples-dropdown.tsx @@ -1,8 +1,9 @@ import { Select } from "@fluentui/react-components"; import { FunctionComponent, useCallback, useEffect, useState } from "react"; +import { SampleConfig } from "../index.js"; import { PlaygroundManifest } from "../manifest.js"; export interface SamplesDropdownProps { - onSelectSample: (content: string) => void; + onSelectSample: (content: SampleConfig) => void | Promise; } export const SamplesDropdown: FunctionComponent = ({ onSelectSample }) => { const [selected, setSelected] = useState(""); @@ -24,6 +25,7 @@ export const SamplesDropdown: FunctionComponent = ({ onSel const handleSelected = useCallback( (evt: any) => { setSelected(evt.target.value); + onSelectSample(PlaygroundManifest.samples[evt.target.value]); }, [onSelectSample] diff --git a/packages/playground/src/index.ts b/packages/playground/src/index.ts index 9c4f6f6e9e3..55ceb56e5f0 100644 --- a/packages/playground/src/index.ts +++ b/packages/playground/src/index.ts @@ -1,7 +1,7 @@ export interface PlaygroundConfig { defaultEmitter: string; libraries: string[]; - samples: Record; + samples: Record; enableSwaggerUI: boolean; links: { newIssue: string; @@ -9,5 +9,11 @@ export interface PlaygroundConfig { }; } +export interface SampleConfig { + fileName: string; + preferredEmitter?: string; + content?: string; +} + export { createBrowserHost } from "./browser-host.js"; export { Playground, PlaygroundProps } from "./components/playground.js"; diff --git a/packages/playground/vite.config.ts b/packages/playground/vite.config.ts index 480a41b73d6..882e49983e9 100644 --- a/packages/playground/vite.config.ts +++ b/packages/playground/vite.config.ts @@ -10,12 +10,21 @@ const config = definePlaygroundViteConfig({ "@typespec/openapi", "@typespec/versioning", "@typespec/openapi3", + "@typespec/protobuf", ], samples: { - "API versioning": "samples/versioning.tsp", - "Discriminated unions": "samples/unions.tsp", - "HTTP service": "samples/http.tsp", - "REST framework": "samples/rest.tsp", + "API versioning": { + fileName: "samples/versioning.tsp", + }, + "Discriminated unions": { + fileName: "samples/unions.tsp", + }, + "HTTP service": { fileName: "samples/http.tsp" }, + "REST framework": { fileName: "samples/rest.tsp" }, + Protobuf: { + fileName: "samples/protobuf.tsp", + preferredEmitter: "@typespec/protobuf", + }, }, enableSwaggerUI: true, links: { From d50495d12a3a50573749b8dd51e6bd73ec462458 Mon Sep 17 00:00:00 2001 From: Will Temple Date: Tue, 25 Apr 2023 18:28:07 -0400 Subject: [PATCH 3/7] Updated vite config, removed a console.log --- packages/playground/src/components/emitter-dropdown.tsx | 1 - packages/playground/vite.config.ts | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/playground/src/components/emitter-dropdown.tsx b/packages/playground/src/components/emitter-dropdown.tsx index df08a7600ab..6ab413e0236 100644 --- a/packages/playground/src/components/emitter-dropdown.tsx +++ b/packages/playground/src/components/emitter-dropdown.tsx @@ -13,7 +13,6 @@ export const EmitterDropdown: FunctionComponent = () => { useEffect(() => { Promise.all(PlaygroundManifest.libraries.map(async (x) => [x, await importShim(x)])) .then((emitters) => { - console.log("Loaded library:", emitters); setEmitters(emitters.filter(([, x]) => (x as any).$lib?.emitter).map((x: any) => x[0])); }) // eslint-disable-next-line no-console diff --git a/packages/playground/vite.config.ts b/packages/playground/vite.config.ts index 882e49983e9..217abcdab9f 100644 --- a/packages/playground/vite.config.ts +++ b/packages/playground/vite.config.ts @@ -15,12 +15,14 @@ const config = definePlaygroundViteConfig({ samples: { "API versioning": { fileName: "samples/versioning.tsp", + preferredEmitter: "@typespec/openapi3", }, "Discriminated unions": { fileName: "samples/unions.tsp", + preferredEmitter: "@typespec/openapi3", }, - "HTTP service": { fileName: "samples/http.tsp" }, - "REST framework": { fileName: "samples/rest.tsp" }, + "HTTP service": { fileName: "samples/http.tsp", preferredEmitter: "@typespec/openapi3" }, + "REST framework": { fileName: "samples/rest.tsp", preferredEmitter: "@typespec/openapi3" }, Protobuf: { fileName: "samples/protobuf.tsp", preferredEmitter: "@typespec/protobuf", From a759a6adc44e5f176085b94ca4e6a1eac023d1fe Mon Sep 17 00:00:00 2001 From: Will Temple Date: Tue, 25 Apr 2023 18:39:21 -0400 Subject: [PATCH 4/7] Tweak sample naming --- packages/playground/samples/{protobuf.tsp => kiosk.tsp} | 0 packages/playground/vite.config.ts | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename packages/playground/samples/{protobuf.tsp => kiosk.tsp} (100%) diff --git a/packages/playground/samples/protobuf.tsp b/packages/playground/samples/kiosk.tsp similarity index 100% rename from packages/playground/samples/protobuf.tsp rename to packages/playground/samples/kiosk.tsp diff --git a/packages/playground/vite.config.ts b/packages/playground/vite.config.ts index 217abcdab9f..351cdb6bdd7 100644 --- a/packages/playground/vite.config.ts +++ b/packages/playground/vite.config.ts @@ -23,8 +23,8 @@ const config = definePlaygroundViteConfig({ }, "HTTP service": { fileName: "samples/http.tsp", preferredEmitter: "@typespec/openapi3" }, "REST framework": { fileName: "samples/rest.tsp", preferredEmitter: "@typespec/openapi3" }, - Protobuf: { - fileName: "samples/protobuf.tsp", + "Protobuf Kiosk": { + fileName: "samples/kiosk.tsp", preferredEmitter: "@typespec/protobuf", }, }, From 8703a5b547fa06c74aa2689aec60ecfa90f7c767 Mon Sep 17 00:00:00 2001 From: Will Temple Date: Tue, 25 Apr 2023 18:39:40 -0400 Subject: [PATCH 5/7] Appropriately cancel compiler debouncing. --- .../src/components/editor-command-bar.tsx | 5 ++--- packages/playground/src/components/playground.tsx | 14 +++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/playground/src/components/editor-command-bar.tsx b/packages/playground/src/components/editor-command-bar.tsx index a5cf3db538b..4aa804d8243 100644 --- a/packages/playground/src/components/editor-command-bar.tsx +++ b/packages/playground/src/components/editor-command-bar.tsx @@ -3,6 +3,7 @@ import { Bug16Regular, Save16Regular } from "@fluentui/react-icons"; import { FunctionComponent, useCallback } from "react"; import { useSetRecoilState } from "recoil"; import { SampleConfig } from "../index.js"; +import { PlaygroundManifest } from "../manifest.js"; import { selectedEmitterState } from "../state.js"; import { EmitterDropdown } from "./emitter-dropdown.js"; import { SamplesDropdown } from "./samples-dropdown.js"; @@ -35,9 +36,7 @@ export const EditorCommandBar: FunctionComponent = ({ updateTypeSpec(config.content); - if (config.preferredEmitter) { - setEmitter(config.preferredEmitter); - } + setEmitter(config.preferredEmitter ?? PlaygroundManifest.defaultEmitter); }, [setEmitter, updateTypeSpec] ); diff --git a/packages/playground/src/components/playground.tsx b/packages/playground/src/components/playground.tsx index db46ea7dfed..7d7a86e2265 100644 --- a/packages/playground/src/components/playground.tsx +++ b/packages/playground/src/components/playground.tsx @@ -49,11 +49,10 @@ const PlaygroundInternal: FunctionComponent = ({ const emittersOptions = useRecoilValue(emittersOptionsState); const selectedEmitter = useRecoilValue(selectedEmitterState); - let dispose: (() => void) | undefined = undefined; - const doCompile = useCallback(async () => { const content = typespecModel.getValue(); const typespecCompiler = await importTypeSpecCompiler(); + const state = await compile(host, content, selectedEmitter, emittersOptions); setCompilationStatus(state); if ("program" in state) { @@ -72,8 +71,6 @@ const PlaygroundInternal: FunctionComponent = ({ const updateTypeSpec = useCallback( (value: string) => { - // Cancel the debouncing compile so that if the sample has a preferred emitter, we won't overwrite it. - dispose?.(); typespecModel.setValue(value); }, [typespecModel] @@ -85,9 +82,12 @@ const PlaygroundInternal: FunctionComponent = ({ }, [updateTypeSpec]); useEffect(() => { - const disposable = typespecModel.onDidChangeContent(debounce(() => doCompile(), 200)); - dispose = () => disposable.dispose(); - return dispose; + const debouncer = debounce(() => doCompile(), 200); + const disposable = typespecModel.onDidChangeContent(debouncer); + return () => { + debouncer.clear(); + disposable.dispose(); + }; }, [typespecModel, doCompile]); useEffect(() => { From 1d09b6cbb1cd4905bda89f35f7daa61cb1069eed Mon Sep 17 00:00:00 2001 From: Will Temple Date: Tue, 25 Apr 2023 19:43:38 -0400 Subject: [PATCH 6/7] Escape a {... not sure how this didn't trigger before. --- packages/protobuf/src/proto.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protobuf/src/proto.ts b/packages/protobuf/src/proto.ts index 9f22bc5f1c9..5f5669a7645 100644 --- a/packages/protobuf/src/proto.ts +++ b/packages/protobuf/src/proto.ts @@ -41,8 +41,8 @@ const IMPLEMENTATION_RESERVED_RANGE = [19000, 19999] as const; /** * Defined in the [ProtoBuf Language Spec](https://developers.google.com/protocol-buffers/docs/reference/proto3-spec#identifiers). * - * ident = letter { letter | decimalDigit | "_" } - * fullIdent = ident { "." ident } + * ident = letter \{ letter | decimalDigit | "_" \} + * fullIdent = ident \{ "." ident \} */ export const PROTO_FULL_IDENT = /([a-zA-Z][a-zA-Z0-9_]*)+/; From 8623baf80d1610d8edf00de64c3ec35199d44c42 Mon Sep 17 00:00:00 2001 From: Will Temple Date: Wed, 26 Apr 2023 15:46:02 -0400 Subject: [PATCH 7/7] Refine some types to satisfy the linter. --- packages/playground/src/components/editor-command-bar.tsx | 2 +- packages/playground/src/components/samples-dropdown.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/playground/src/components/editor-command-bar.tsx b/packages/playground/src/components/editor-command-bar.tsx index 4aa804d8243..73a61393235 100644 --- a/packages/playground/src/components/editor-command-bar.tsx +++ b/packages/playground/src/components/editor-command-bar.tsx @@ -11,7 +11,7 @@ import { SamplesDropdown } from "./samples-dropdown.js"; export interface EditorCommandBarProps { documentationUrl?: string; saveCode: () => Promise | void; - updateTypeSpec: (value: string) => Promise | void; + updateTypeSpec: (value: string) => void; newIssue: () => Promise | void; } export const EditorCommandBar: FunctionComponent = ({ diff --git a/packages/playground/src/components/samples-dropdown.tsx b/packages/playground/src/components/samples-dropdown.tsx index 76dd755c6bd..bb4a37216be 100644 --- a/packages/playground/src/components/samples-dropdown.tsx +++ b/packages/playground/src/components/samples-dropdown.tsx @@ -3,7 +3,7 @@ import { FunctionComponent, useCallback, useEffect, useState } from "react"; import { SampleConfig } from "../index.js"; import { PlaygroundManifest } from "../manifest.js"; export interface SamplesDropdownProps { - onSelectSample: (content: SampleConfig) => void | Promise; + onSelectSample: (content: SampleConfig) => void; } export const SamplesDropdown: FunctionComponent = ({ onSelectSample }) => { const [selected, setSelected] = useState("");