6 poin oleh honglu 2025-01-08 | 2 komentar | Bagikan ke WhatsApp

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.

[IMG] demo-1

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.

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.

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.

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.

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.

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

 
jjpark78 2025-01-09

Di bidang ini ada Zod yang sangat menonjol, jadi kami menggunakannya untuk produk, tetapi ini menarik.

 
honglu 2025-01-09

Proyek-proyek mapan seperti ajv, typia, zod, dan lainnya juga merupakan proyek yang saya ikuti dengan minat besar.

Dalam kasus safeParse di @imhonglu/format, itu juga merupakan fitur yang terinspirasi dari API zod.

Terima kasih atas ketertarikannya!