Implementasi JSON Schema berbasis TypeScript dan kumpulan alat pengembangan
(github.com/imhonglu)Ini adalah proyek yang dimulai dengan semangat, “Mari buat library type-safe sesuai selera saya.”
Proyek ini berawal dari implementasi JSON Schema yang type-safe, lalu secara alami berkembang menjadi berbagai alat yang dibutuhkan selama proses pengembangan.
Untuk saat ini, saya memberi penutup tahap pertama sambil mencari pekerjaan.
Prinsip proyek
Pengembangan dilakukan dengan mematuhi prinsip-prinsip inti berikut:
- Memanfaatkan sistem tipe yang ketat
- Menjaga dependensi eksternal seminimal mungkin
- Merancang sistem tipe yang dapat digunakan ulang
- Dokumentasi API
- Menjaga cakupan pengujian yang tinggi
- Implementasi murni TypeScript
Library
@imhonglu/json-schema
Ini adalah implementasi TypeScript yang mematuhi spesifikasi JSON Schema draft 2020-12.
- Repositori: https://github.com/imhonglu/new-wheels/…
- Diverifikasi melalui
JSON-Schema-Test-Suite - Tipe keyword yang dapat digunakan akan diinferensikan secara otomatis sesuai definisi schema.
import { Schema, SchemaDefinition } from "@imhonglu/json-schema";
export const Address = new Schema({
type: "object",
properties: {
street: { type: "string" },
city: { type: "string" },
zip: { type: "string" },
},
required: ["street"] as const,
});
export type Address = SchemaDefinition.Instance<typeof Address>;
// {
// street: string;
// city?: string;
// zip?: string;
// }
@imhonglu/format
Ini adalah proyek yang dimulai untuk mengimplementasikan keyword format pada JSON Schema.
- Repositori: https://github.com/imhonglu/new-wheels/…
- Implementasi berbasis spesifikasi RFC
- Verifikasi berbasis
JSON-Schema-Test-Suite - Menyediakan antarmuka yang mirip dengan API
JSONnative
import { FullTime } from '@imhonglu/format';
const time = FullTime.parse('00:00:00.000Z');
// { hour: 0, minute: 0, second: 0, secfrac: '.000', offset: undefined }
console.log(time.toString()); // '00:00:00.000Z'
console.log(JSON.stringify(time)); // '"00:00:00.000Z"'
const result = FullTime.safeParse('invalid');
if (!result.ok) {
console.error(result.error);
}
@imhonglu/pattern-builder
Ini adalah regex builder yang dibuat untuk meningkatkan keterbacaan regex saat mengimplementasikan tata bahasa ABNF dari spesifikasi RFC.
- Repositori: https://github.com/imhonglu/new-wheels/…
import { characterSet, concat, hexDigit } from "@imhonglu/pattern-builder";
// pct-encoded = "%" HEXDIG HEXDIG
export const pctEncoded = concat(
"%",
hexDigit.clone().exact(2),
);
// unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
export const unreserved = characterSet(
alpha,
digit,
/[\-._~]/,
);
@imhonglu/type-guard
Ini adalah library type guard yang dibuat untuk meningkatkan keterbacaan type guard.
- Repositori: https://github.com/imhonglu/new-wheels/…
- Implementasi berbasis Proxy untuk meminimalkan overhead
- Menyediakan keyword
not
import { composeGuards } from "@imhonglu/type-guard";
const is = composeGuards({
string: (value: unknown): value is string => typeof value === "string",
number: (value: unknown): value is number => typeof value === "number"
});
is.string("hello"); // true
is.not.string(42); // true
let value: string | number | undefined;
if (is.number(value)) {
value.toFixed(2); // 'value' is number
}
if (is.not.number(value)) {
value.toFixed(2); // error: Property 'toFixed' does not exist on type 'undefined'.
}
@imhonglu/type-object
Ini adalah library pembungkus type-safe untuk API Object native. Library ini menyediakan tipe yang mendekati perilaku native.
- Repositori: https://github.com/imhonglu/new-wheels/…
import * as TypeObject from '@imhonglu/type-object';
const data = { a: 1, b: 2, c: 3 };
for (const key of TypeObject.keys(data)) {
// key: "a" | "b" | "c"
console.log(data[key]); // number
}
const string = 'hello';
for (const index of TypeObject.keys(string)) {
// index: number & keyof string
console.log(string[index]); // string
}
@imhonglu/toolkit
Ini adalah kumpulan utility type dan utility function yang digunakan di dalam proyek.
- Repositori: https://github.com/imhonglu/new-wheels/…
import type { Fn } from '@imhonglu/toolkit';
// Menyediakan alias tipe untuk tipe fungsi '(...args: any[]) => any'.
Fn.Callable // (...args: any[]) => any
// Melalui generic, Anda dapat mendefinisikan hanya tipe argumen.
Fn.Callable<{ args: [number, number] }> // (...args: [number, number]) => any
// Melalui generic, Anda dapat mendefinisikan hanya tipe nilai kembalian.
Fn.Callable<{ return: string }> // (...args: any[]) => string
// Melalui generic, Anda dapat mendefinisikan tipe argumen dan tipe nilai kembalian sekaligus.
Fn.Callable<{ args: [number, number], return: string }> // (...args: [number, number]) => string
Rencana ke depan dan pencarian kerja
Tahap berikutnya dari proyek yang sedang berjalan ini adalah menuntaskan implementasi spesifikasi JSON Schema,
dan saya juga ingin mencoba menulis framework backend.
Saat ini saya sedang mencari pekerjaan, jadi saya sangat mengharapkan perhatian dan minat Anda.
Terima kasih sudah membaca.
Semoga harimu menyenangkan!
2 komentar
Di bidang ini ada Zod yang sangat menonjol, jadi kami menggunakannya untuk produk, tetapi ini menarik.
Proyek-proyek mapan seperti ajv, typia, zod, dan lainnya juga merupakan proyek yang saya ikuti dengan minat besar.
Dalam kasus
safeParsedi@imhonglu/format, itu juga merupakan fitur yang terinspirasi dari API zod.Terima kasih atas ketertarikannya!