Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Strongly type Language Options #2611

Draft
wants to merge 98 commits into
base: release/v23.1.0
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
6e557fe
standardise json formatting
inferrinizzard Mar 19, 2024
2648d2d
fix @types in deps
inferrinizzard Mar 30, 2024
a7cec76
add file association for schema files
inferrinizzard Mar 19, 2024
03e2f12
uses const type for All array
inferrinizzard Mar 30, 2024
dcf6d31
move python args to own constructor
inferrinizzard Mar 30, 2024
a834d2c
make constructor first in misc languages
inferrinizzard Mar 30, 2024
7101e24
add generics to TargetLanguage for names and extension
inferrinizzard Mar 30, 2024
b17d3f2
fix generics for JavaScript + subclassing
inferrinizzard Mar 30, 2024
c529c53
add strict types for language names and display names
inferrinizzard Mar 30, 2024
5ca879c
move language displayName, names, extension to class static members
inferrinizzard Apr 6, 2024
0822bab
add strict typing for language name
inferrinizzard Apr 6, 2024
1072369
Merge branch 'master' into feat/core/language-types
inferrinizzard Apr 6, 2024
36e8514
:recycle:
inferrinizzard Apr 6, 2024
3e5f345
Revert "move language displayName, names, extension to class static m…
inferrinizzard Apr 6, 2024
8d7c622
add generics to TargetLanguage for names and extension
inferrinizzard Mar 30, 2024
4acad79
fix generics for JavaScript + subclassing
inferrinizzard Mar 30, 2024
c4ce60f
:recycle:
inferrinizzard Apr 6, 2024
95beb5f
Merge branch 'feat/core/language-names' into feat/core/language-types
inferrinizzard Apr 6, 2024
6140704
Merge branch 'master' into chore/repo/eslint
inferrinizzard Apr 7, 2024
b2a7904
install eslint packages
inferrinizzard Apr 7, 2024
b97c2b2
add eslint config
inferrinizzard Apr 7, 2024
e504a8a
remove tslint
inferrinizzard Apr 7, 2024
92bd563
eslint autofix
inferrinizzard Apr 7, 2024
392838a
update eslint rules, eslintignore
inferrinizzard Apr 8, 2024
d9baf6e
add lint:fix script
inferrinizzard Apr 8, 2024
8bbabf1
update eslint rules, eslintignore
inferrinizzard Apr 8, 2024
f1d19aa
add lint:fix script
inferrinizzard Apr 8, 2024
994567e
add import rules
inferrinizzard Apr 8, 2024
d259874
add import rules
inferrinizzard Apr 8, 2024
291f5c9
update import rules
inferrinizzard Apr 12, 2024
03d8001
reduce excess style rules
inferrinizzard Apr 12, 2024
99dd240
downgrade remaining to warnings
inferrinizzard Apr 13, 2024
7f22254
fix enum values
inferrinizzard Apr 8, 2024
885b35a
add all missing accessibility modifiers
inferrinizzard Apr 11, 2024
f791721
fix nullish errors
inferrinizzard Apr 12, 2024
db9a9cf
update import rules
inferrinizzard Apr 12, 2024
3088be7
fix all require imports
inferrinizzard Apr 12, 2024
c492962
fix all imports
inferrinizzard Apr 12, 2024
a47609a
reduce excess style rules
inferrinizzard Apr 12, 2024
b536136
fix any types
inferrinizzard Apr 13, 2024
f0e7615
fix misc errors
inferrinizzard Apr 13, 2024
c0232f3
downgrade remaining to warnings
inferrinizzard Apr 13, 2024
59e877f
return types
inferrinizzard Apr 13, 2024
e5edac4
fix types errors
inferrinizzard Apr 13, 2024
0267ad0
Merge branch 'chore/repo/eslint' into chore/repo/eslint-fix
inferrinizzard Apr 13, 2024
130fe31
fix json import for test tsconfig
inferrinizzard Apr 13, 2024
37812f3
Merge branch 'master' into chore/repo/eslint
inferrinizzard Apr 14, 2024
e89f453
Merge branch 'chore/repo/eslint' into chore/repo/eslint-fix
inferrinizzard Apr 14, 2024
06002f9
auto lint fix
inferrinizzard Apr 14, 2024
93ab86e
fix lint errors in extension
inferrinizzard Apr 14, 2024
6a81618
Merge branch 'master' into chore/repo/eslint
inferrinizzard Apr 14, 2024
6ca4eaa
Merge branch 'chore/repo/eslint' into chore/repo/eslint-fix
inferrinizzard Apr 14, 2024
1ec5933
fix lint errors in Elixir
inferrinizzard Apr 14, 2024
4620ba5
make ref.pushElement public
inferrinizzard Apr 14, 2024
4fe1649
fix misc
inferrinizzard Apr 14, 2024
eed53c6
fix accidental public in CSharp raw text get
inferrinizzard Apr 14, 2024
10675c9
Merge branch 'master' into feat/core/language-types
inferrinizzard Apr 16, 2024
15fd452
use full generics for all languages to all extensibility
inferrinizzard Apr 16, 2024
6fd903c
add generics for elixir
inferrinizzard Apr 16, 2024
719a028
typescript 4.9 doesn't support const generics yet
inferrinizzard Apr 16, 2024
a0e399a
export LanguageName type and predicates
inferrinizzard Apr 16, 2024
45c06ce
fix type safety for extension
inferrinizzard Apr 16, 2024
beddba2
fix type safety for cli
inferrinizzard Apr 16, 2024
fb25f79
reduce target language generic to singular config object
inferrinizzard Apr 19, 2024
050d6d0
strongly type Renderer Options with map for enums
inferrinizzard Apr 20, 2024
afdb99a
support existing tuple params
inferrinizzard Apr 20, 2024
d0b8c15
update all non-inherited target languages to have external language c…
inferrinizzard Apr 20, 2024
410ed42
flatten all languages to extend from TargetLanguage
inferrinizzard Apr 20, 2024
1053a44
Merge branch 'refactor/core/no-language-inheritance' into feat/core/l…
inferrinizzard Apr 20, 2024
e542e87
Merge branch 'master' into feat/core/language-types
inferrinizzard Apr 20, 2024
a4989bf
Merge branch 'master' into chore/repo/eslint-fix
inferrinizzard Apr 30, 2024
8e6fc4f
fix new lint errors
inferrinizzard Apr 30, 2024
58cfc88
Merge branch 'chore/repo/eslint-fix' into base
inferrinizzard May 5, 2024
f16e6ad
Merge branch 'refactor/imports/languages'
inferrinizzard May 5, 2024
cacc55d
Merge branch 'base' into feat/core/language-types
inferrinizzard May 10, 2024
23e74d3
fix package-lock
inferrinizzard May 10, 2024
811ac4a
lint fixed
inferrinizzard May 10, 2024
b61fbe2
Merge branch 'master' into feat/core/language-types
inferrinizzard May 18, 2024
e0f9089
Merge branch 'master' into feat/core/language-types
inferrinizzard May 18, 2024
9b8908a
use LanguageName in cli index
inferrinizzard May 19, 2024
8555b84
fix type errors in test
inferrinizzard May 19, 2024
1e9126e
Merge commit 'e0f9089c2809b70a1e51a7d7ea80f62410cf33f1' into feat/cor…
inferrinizzard May 19, 2024
23c2c5f
add docs for creating custom languages and renderers
inferrinizzard May 31, 2024
aef27c2
update README
inferrinizzard May 31, 2024
6a5763b
Merge branch 'feat/core/language-types' into feat/core/typed-options
inferrinizzard Jun 1, 2024
9956c47
Merge branch 'release/v23.1.0' of https://github.com/glideapps/quickt…
inferrinizzard Jun 1, 2024
898d5f2
working tuple type generics
inferrinizzard Jun 1, 2024
da86caf
re-export All through index
inferrinizzard Jun 2, 2024
31b343d
move language specific types into own file
inferrinizzard Jun 2, 2024
6d488d3
use map arg for EnumOption instead of tuple
inferrinizzard Jun 2, 2024
258bd00
remove custom NoInfer
inferrinizzard Jun 2, 2024
a68107a
split OptionMap and OptionValues types
inferrinizzard Jun 4, 2024
7ca8ffc
update EnumOptions to use map
inferrinizzard Jun 4, 2024
0f203f7
update getOptions to return options object instead of array
inferrinizzard Jun 4, 2024
9e0f8aa
aggregate language options types
inferrinizzard Jun 4, 2024
2608f68
fix naming style options for C langs
inferrinizzard Jun 4, 2024
288feb4
use LanguageOptions in Run
inferrinizzard Jun 4, 2024
96c411f
readd NoInfer util type
inferrinizzard Jun 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add strict types for language names and display names
  • Loading branch information
inferrinizzard committed Mar 30, 2024
commit c529c530d897512c20fd19fe765b78c957314f12
6 changes: 4 additions & 2 deletions packages/quicktype-core/src/Run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ import { makeTransformations } from "./MakeTransformations";
import { TransformedStringTypeKind } from "./Type";
import { type Comment } from "./support/Comments";

export function getTargetLanguage(nameOrInstance: string | TargetLanguage): TargetLanguage {
import { type LanguageName } from "types";

export function getTargetLanguage(nameOrInstance: LanguageName | TargetLanguage): TargetLanguage {
if (typeof nameOrInstance === "object") {
return nameOrInstance;
}
Expand Down Expand Up @@ -123,7 +125,7 @@ export type NonInferenceOptions = {
* or a string specifying one of the names for quicktype's built-in target languages. For example,
* both `cs` and `csharp` will generate C#.
*/
lang: string | TargetLanguage;
lang: LanguageName | TargetLanguage;
/** The input data from which to produce types */
inputData: InputData;
/** Put class properties in alphabetical order, instead of in the order found in the JSON */
Expand Down
22 changes: 11 additions & 11 deletions packages/quicktype-core/src/language/All.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { iterableFind } from "collection-utils";

import { TargetLanguage } from "../TargetLanguage";

import { CSharpTargetLanguage } from "./CSharp";
Expand Down Expand Up @@ -28,6 +26,8 @@ import { TypeScriptZodTargetLanguage } from "./TypeScriptZod";
import { PhpTargetLanguage } from "./Php";
import { TypeScriptEffectSchemaTargetLanguage } from "./TypeScriptEffectSchema";

import { type LanguageNameMap, type LanguageName } from "../types";

export const all = [
new CSharpTargetLanguage(),
new GoTargetLanguage(),
Expand Down Expand Up @@ -59,14 +59,14 @@ export const all = [

all satisfies readonly TargetLanguage[];

export function languageNamed(
name: string,
export function languageNamed<Name extends LanguageName>(
name: Name,
targetLanguages: readonly TargetLanguage[] = all
): TargetLanguage | undefined {
const maybeTargetLanguage = iterableFind(
targetLanguages,
l => l.names.indexOf(name) >= 0 || l.displayName === name
);
if (maybeTargetLanguage !== undefined) return maybeTargetLanguage;
return iterableFind(targetLanguages, l => l.extension === name);
): LanguageNameMap[Name] {
const foundLanguage = targetLanguages.find(language => language.names.includes(name));
if (!foundLanguage) {
throw new Error(`Unknown language name: ${name}`);
}

return foundLanguage as LanguageNameMap[Name];
}
2 changes: 1 addition & 1 deletion packages/quicktype-core/src/language/JavaScript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ export type JavaScriptTypeAnnotations = {

export class JavaScriptTargetLanguage<
DisplayName extends string = "JavaScript",
Names extends readonly string[] = ["javascript", "js", "jsx"],
Names extends readonly string[] = readonly ["javascript", "js", "jsx"],
Extension extends string = "js"
> extends TargetLanguage<DisplayName, Names, Extension> {
constructor(
Expand Down
14 changes: 14 additions & 0 deletions packages/quicktype-core/src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { type TargetLanguage } from "TargetLanguage";
import type { all } from "./language/All";

type AllLanguages = (typeof all)[number];

export type LanguageDisplayName<Language extends TargetLanguage = AllLanguages> = Language["displayName"];
export type LanguageName<Language extends TargetLanguage = AllLanguages> = Language["names"][number];

export type LanguageDisplayNameMap = {
[Language in AllLanguages as LanguageDisplayName<Language>]: Language;
};
export type LanguageNameMap = {
[Language in AllLanguages as LanguageName<Language>]: Language;
};