diff --git a/packages/quicktype-core/src/language/Golang.ts b/packages/quicktype-core/src/language/Golang.ts index 42cfacddd..c7aa3110c 100644 --- a/packages/quicktype-core/src/language/Golang.ts +++ b/packages/quicktype-core/src/language/Golang.ts @@ -25,7 +25,8 @@ export const goOptions = { justTypesAndPackage: new BooleanOption("just-types-and-package", "Plain types with package only", false), packageName: new StringOption("package", "Generated package name", "NAME", "main"), multiFileOutput: new BooleanOption("multi-file-output", "Renders each top-level object in its own Go file", false), - fieldTags: new StringOption("field-tags", "list of tags which should be generated for fields", "TAGS", "json") + fieldTags: new StringOption("field-tags", "list of tags which should be generated for fields", "TAGS", "json"), + omitEmpty: new BooleanOption("omit-empty", "If set, all non-required objects will be tagged with ,omitempty", false) }; export class GoTargetLanguage extends TargetLanguage { @@ -88,6 +89,7 @@ function isValueType(t: Type): boolean { function canOmitEmpty(cp: ClassProperty): boolean { if (!cp.isOptional) return false; + if (goOptions.omitEmpty) return true; const t = cp.type; return ["union", "null", "any"].indexOf(t.kind) < 0; } diff --git a/packages/quicktype-core/src/language/Python.ts b/packages/quicktype-core/src/language/Python.ts index 7da7dc74d..18fc2d97d 100644 --- a/packages/quicktype-core/src/language/Python.ts +++ b/packages/quicktype-core/src/language/Python.ts @@ -461,8 +461,8 @@ export class PythonRenderer extends ConvenienceRenderer { this.emitLine("pass"); } else { this.forEachClassProperty(t, "none", (name, jsonName, cp) => { - this.emitDescription(this.descriptionForClassProperty(t, jsonName)); this.emitLine(name, this.typeHint(": ", this.pythonType(cp.type, true))); + this.emitDescription(this.descriptionForClassProperty(t, jsonName)); }); } this.ensureBlankLine(); diff --git a/packages/quicktype-core/src/language/TypeScriptEffectSchema.ts b/packages/quicktype-core/src/language/TypeScriptEffectSchema.ts index 8a4311ce9..c615add4d 100644 --- a/packages/quicktype-core/src/language/TypeScriptEffectSchema.ts +++ b/packages/quicktype-core/src/language/TypeScriptEffectSchema.ts @@ -100,39 +100,39 @@ export class TypeScriptEffectSchemaRenderer extends ConvenienceRenderer { protected emitImports(): void { this.ensureBlankLine(); - this.emitLine(this.importStatement("* as Schema", '"@effect/schema/Schema"')); + this.emitLine(this.importStatement("* as S", '"@effect/schema/Schema"')); } typeMapTypeForProperty(p: ClassProperty): Sourcelike { const typeMap = this.typeMapTypeFor(p.type); - return p.isOptional ? ["Schema.optional(", typeMap, ")"] : typeMap; + return p.isOptional ? ["S.optional(", typeMap, ")"] : typeMap; } typeMapTypeFor(t: Type, required: boolean = true): Sourcelike { if (["class", "object", "enum"].indexOf(t.kind) >= 0) { - return ["Schema.lazy(() => ", this.nameForNamedType(t), "Schema)"]; + return ["S.lazy(() => ", this.nameForNamedType(t), ")"]; } const match = matchType( t, - _anyType => "Schema.any", - _nullType => "Schema.null", - _boolType => "Schema.boolean", - _integerType => "Schema.number", - _doubleType => "Schema.number", - _stringType => "Schema.string", - arrayType => ["Schema.array(", this.typeMapTypeFor(arrayType.items, false), ")"], + _anyType => "S.any", + _nullType => "S.null", + _boolType => "S.boolean", + _integerType => "S.number", + _doubleType => "S.number", + _stringType => "S.string", + arrayType => ["S.array(", this.typeMapTypeFor(arrayType.items, false), ")"], _classType => panic("Should already be handled."), - _mapType => ["Schema.record(Schema.string, ", this.typeMapTypeFor(_mapType.values, false), ")"], + _mapType => ["S.record(S.string, ", this.typeMapTypeFor(_mapType.values, false), ")"], _enumType => panic("Should already be handled."), unionType => { const children = Array.from(unionType.getChildren()).map((type: Type) => this.typeMapTypeFor(type, false) ); - return ["Schema.union(", ...arrayIntercalate(", ", children), ")"]; + return ["S.union(", ...arrayIntercalate(", ", children), ")"]; }, _transformedStringType => { - return "Schema.string"; + return "S.string"; } ); @@ -145,7 +145,11 @@ export class TypeScriptEffectSchemaRenderer extends ConvenienceRenderer { private emitObject(name: Name, t: ObjectType) { this.ensureBlankLine(); - this.emitLine("\nexport const ", name, "Schema = ", "Schema.struct({"); + if (this._options.justSchema) { + this.emitLine("\nexport const ", name, " = S.struct({"); + } else { + this.emitLine("\nconst ", name, "_ = S.struct({"); + } this.indent(() => { this.forEachClassProperty(t, "none", (_, jsonName, property) => { this.emitLine(`"${utf16StringEscape(jsonName)}"`, ": ", this.typeMapTypeForProperty(property), ","); @@ -153,14 +157,25 @@ export class TypeScriptEffectSchemaRenderer extends ConvenienceRenderer { }); this.emitLine("});"); if (!this._options.justSchema) { - this.emitLine("export type ", name, " = Schema.From;"); + this.emitLine("export interface ", name, " extends S.Schema.To {}"); + this.emitLine( + "export const ", + name, + ": S.Schema, ", + name, + "> = ", + name, + "_;" + ); } } private emitEnum(e: EnumType, enumName: Name): void { this.ensureBlankLine(); this.emitDescription(this.descriptionForType(e)); - this.emitLine("\nexport const ", enumName, "Schema = ", "Schema.enums({"); + this.emitLine("\nexport const ", enumName, " = ", "S.enums({"); this.indent(() => this.forEachEnumCase(e, "none", (_, jsonName) => { const name = stringEscape(jsonName); @@ -169,7 +184,7 @@ export class TypeScriptEffectSchemaRenderer extends ConvenienceRenderer { ); this.emitLine("});"); if (!this._options.justSchema) { - this.emitLine("export type ", enumName, " = Schema.From;"); + this.emitLine("export type ", enumName, " = S.Schema.To;"); } } diff --git a/packages/quicktype-core/src/language/TypeScriptFlow.ts b/packages/quicktype-core/src/language/TypeScriptFlow.ts index 3bc02e2a9..0c5750006 100644 --- a/packages/quicktype-core/src/language/TypeScriptFlow.ts +++ b/packages/quicktype-core/src/language/TypeScriptFlow.ts @@ -51,7 +51,8 @@ export abstract class TypeScriptFlowBaseTargetLanguage extends JavaScriptTargetL tsFlowOptions.converters, tsFlowOptions.rawType, tsFlowOptions.preferUnions, - tsFlowOptions.preferTypes + tsFlowOptions.preferTypes, + tsFlowOptions.preferConstValues ]; } diff --git a/test/fixtures/typescript-effect-schema/main.ts b/test/fixtures/typescript-effect-schema/main.ts index 0952624e1..538914b6e 100644 --- a/test/fixtures/typescript-effect-schema/main.ts +++ b/test/fixtures/typescript-effect-schema/main.ts @@ -7,11 +7,11 @@ const sample = process.argv[2]; const json = fs.readFileSync(sample); const value = JSON.parse(json.toString()); -let schema = TopLevel.TopLevelSchema ?? TopLevel.TopLevelElementSchema; +let schema = TopLevel.TopLevel ?? TopLevel.TopLevelElement; if (!schema) { // Sometimes key is prefixed with funPrefixes (e.g. 2df80.json) Object.keys(TopLevel).some(key => { - if (key.endsWith("TopLevelSchema") || key.endsWith("TopLevelElementSchema")) { + if (key.endsWith("TopLevel") || key.endsWith("TopLevelElement")) { schema = TopLevel[key]; return true; } @@ -25,11 +25,11 @@ if (!schema) { let backToJson: string; if (Array.isArray(value)) { const parsedValue = value.map(v => { - return Schema.parse(schema)(v); + return Schema.parseSync(schema)(v); }); backToJson = JSON.stringify(parsedValue, null, 2); } else { - const parsedValue = Schema.parse(schema)(value); + const parsedValue = Schema.parseSync(schema)(value); backToJson = JSON.stringify(parsedValue, null, 2); } diff --git a/test/fixtures/typescript-effect-schema/package-lock.json b/test/fixtures/typescript-effect-schema/package-lock.json index 662fe0577..b94bf5c38 100644 --- a/test/fixtures/typescript-effect-schema/package-lock.json +++ b/test/fixtures/typescript-effect-schema/package-lock.json @@ -9,34 +9,20 @@ "version": "0.1.0", "license": "Apache-2.0", "dependencies": { - "@effect/schema": "^0.21.1" + "@effect/schema": "^0.47.1" }, "devDependencies": { "tsx": "^3.12.2", "typescript": "^4.3.5" } }, - "node_modules/@effect/data": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/@effect/data/-/data-0.12.10.tgz", - "integrity": "sha512-zIz/DgumH2LgGdr1Wc9ChET5JSG0k/G5kDc8rn4a6yIJ0v2d5rfnbRWIJO2fWmdFvc+128JyaBvYguIyz9JaAQ==" - }, - "node_modules/@effect/io": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@effect/io/-/io-0.27.2.tgz", - "integrity": "sha512-J9s+v2JyGUKzxG5I6v1/X5v+I/e9dST4Afk3y6ZYBEXzU3Slo+3ZDf7XlazicS7koAoTEnvJ6zt79aM4LLkoWA==", - "dependencies": { - "@effect/data": "~0.12.6" - } - }, "node_modules/@effect/schema": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@effect/schema/-/schema-0.21.1.tgz", - "integrity": "sha512-ZKxrkOPFo158lw21di+cxcGc7XnvnhQ334hAlXYP4DMEAAmp4bVVuPuDSjVYLLVkg1y3bdYyVqfT7+v1ZfpJNg==", - "dependencies": { - "@effect/data": "^0.12.9", - "@effect/io": "^0.27.0", - "fast-check": "^3.10.0" + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@effect/schema/-/schema-0.47.1.tgz", + "integrity": "sha512-aqh6U1Faqqi+iMENdCt3Wp/sYZH9QJLJPKUycOllzcjFmOnNlb9Yiw58LNhzLSoAqNOTUtHjx31EHk/P7h8tuQ==", + "peerDependencies": { + "effect": "2.0.0-next.54", + "fast-check": "^3.13.2" } }, "node_modules/@esbuild-kit/cjs-loader": { @@ -107,6 +93,12 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/effect": { + "version": "2.0.0-next.54", + "resolved": "https://registry.npmjs.org/effect/-/effect-2.0.0-next.54.tgz", + "integrity": "sha512-qROhKMxlm6fpa90YRfWSgKeelDfhaDq2igPK+pIKupGehiCnZH4vd2qrY71HVZ10qZgXxh0VXpGyDQxJC+EQqw==", + "peer": true + }, "node_modules/esbuild": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", @@ -465,9 +457,9 @@ } }, "node_modules/fast-check": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.10.0.tgz", - "integrity": "sha512-I2FldZwnCbcY6iL+H0rp9m4D+O3PotuFu9FasWjMCzUedYHMP89/37JbSt6/n7Yq/IZmJDW0B2h30sPYdzrfzw==", + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.13.2.tgz", + "integrity": "sha512-ouTiFyeMoqmNg253xqy4NSacr5sHxH6pZpLOaHgaAdgZxFWdtsfxExwolpveoAE9CJdV+WYjqErNGef6SqA5Mg==", "funding": [ { "type": "individual", @@ -478,6 +470,7 @@ "url": "https://opencollective.com/fast-check" } ], + "peer": true, "dependencies": { "pure-rand": "^6.0.0" }, @@ -509,9 +502,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "funding": [ { "type": "individual", @@ -521,7 +514,8 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "peer": true }, "node_modules/source-map": { "version": "0.6.1", @@ -574,28 +568,11 @@ } }, "dependencies": { - "@effect/data": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/@effect/data/-/data-0.12.10.tgz", - "integrity": "sha512-zIz/DgumH2LgGdr1Wc9ChET5JSG0k/G5kDc8rn4a6yIJ0v2d5rfnbRWIJO2fWmdFvc+128JyaBvYguIyz9JaAQ==" - }, - "@effect/io": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@effect/io/-/io-0.27.2.tgz", - "integrity": "sha512-J9s+v2JyGUKzxG5I6v1/X5v+I/e9dST4Afk3y6ZYBEXzU3Slo+3ZDf7XlazicS7koAoTEnvJ6zt79aM4LLkoWA==", - "requires": { - "@effect/data": "~0.12.6" - } - }, "@effect/schema": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@effect/schema/-/schema-0.21.1.tgz", - "integrity": "sha512-ZKxrkOPFo158lw21di+cxcGc7XnvnhQ334hAlXYP4DMEAAmp4bVVuPuDSjVYLLVkg1y3bdYyVqfT7+v1ZfpJNg==", - "requires": { - "@effect/data": "^0.12.9", - "@effect/io": "^0.27.0", - "fast-check": "^3.10.0" - } + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@effect/schema/-/schema-0.47.1.tgz", + "integrity": "sha512-aqh6U1Faqqi+iMENdCt3Wp/sYZH9QJLJPKUycOllzcjFmOnNlb9Yiw58LNhzLSoAqNOTUtHjx31EHk/P7h8tuQ==", + "requires": {} }, "@esbuild-kit/cjs-loader": { "version": "2.4.1", @@ -647,6 +624,12 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "effect": { + "version": "2.0.0-next.54", + "resolved": "https://registry.npmjs.org/effect/-/effect-2.0.0-next.54.tgz", + "integrity": "sha512-qROhKMxlm6fpa90YRfWSgKeelDfhaDq2igPK+pIKupGehiCnZH4vd2qrY71HVZ10qZgXxh0VXpGyDQxJC+EQqw==", + "peer": true + }, "esbuild": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", @@ -818,9 +801,10 @@ "optional": true }, "fast-check": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.10.0.tgz", - "integrity": "sha512-I2FldZwnCbcY6iL+H0rp9m4D+O3PotuFu9FasWjMCzUedYHMP89/37JbSt6/n7Yq/IZmJDW0B2h30sPYdzrfzw==", + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.13.2.tgz", + "integrity": "sha512-ouTiFyeMoqmNg253xqy4NSacr5sHxH6pZpLOaHgaAdgZxFWdtsfxExwolpveoAE9CJdV+WYjqErNGef6SqA5Mg==", + "peer": true, "requires": { "pure-rand": "^6.0.0" } @@ -839,9 +823,10 @@ "dev": true }, "pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "peer": true }, "source-map": { "version": "0.6.1", diff --git a/test/fixtures/typescript-effect-schema/package.json b/test/fixtures/typescript-effect-schema/package.json index a7c88eb84..059f9656a 100644 --- a/test/fixtures/typescript-effect-schema/package.json +++ b/test/fixtures/typescript-effect-schema/package.json @@ -13,6 +13,6 @@ "typescript": "^4.3.5" }, "dependencies": { - "@effect/schema": "^0.21.1" + "@effect/schema": "^0.47.1" } }