flyweight | sequelts | |
---|---|---|
9 | 3 | |
503 | 28 | |
- | - | |
8.9 | 0.0 | |
1 day ago | over 1 year ago | |
JavaScript | TypeScript | |
MIT License | - |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
flyweight
- Flyweight: A Node.js ORM Specifically for SQLite
-
Show HN: Quietone – search audio and video by transcript
Hey. This is my first electron app. It is called Quietone and I just thought it would be cool to navigate and manipulate videos by their transcript because searching through videos for the things I was looking for was very slow otherwise.
I used whisper.cpp to do the transcribing. It has held up really well. The tiny model (the fastest one) can transcribe 2 hours of video in a couple of minutes on my m2 mac mini and the accurate of even the tiny model is pretty good.
I used Electron Forge to package the app for different operating systems and distribution channels. There are no guides on the internet on how to do that properly so that took quite a bit of time to figure out.
At multiple stages I had to look through source code of Electron Forge's dependencies to figure out how I was supposed to use it to correctly sign the app for the mac app store.
I made this app using the tools I like to use, which is not very typical. I use straight javascript, no transpiling, and I wrote every single library myself from the ORM https://github.com/thebinarysearchtree/flyweight to the front-end framework, which is a thin wrapper over web components.
Oh yeah, Electron recently started supporting esm, but Electron Forge doesn't fully support it so I had to use esbuild to compile to cjs just for the packaging step.
I use events to make everything change in real-time in the UI. Umm... oh yeah I did include yt-dlp features but had to remove that for the store versions.
It is available on the mac store, and soon on the windows store. There is also a trial you can download. The windows store experience is not very polished compared to the mac store. I was amazed that there are humans reviewers looking through everything I upload. hah.
Anyway, I have to go find a job now and hope my username doesn't check out. Bye. Thanks for reading my blog.
-
Is TypeScript actually worth It?
I wrote https://github.com/thebinarysearchtree/flyweight in JavaScript, not TypeScript. It generates TypeScript declaration files as it types SQL, which helps with intellisense support in VSCode. That is the only reason I use TypeScript.
I don't like TypeScript though, and would never write anything in it. I have a long history with C# and I came to conclusions about this topic a long time ago. I just prefer writing JavaScript, it is more fun and more productive.
Flyweight is quite a complex library. It parses arbitrarily complex SQL. This is more complex than most of the things people work on and claim they need static typing. It isn't millions of lines of code, but often those codebases aren't complex, they are just many independent components that in themselves are not that complex.
The amount of time I spend having to update the TypeScript aspect of my library is really quite annoying. Also, with regards to your point about libraries not including type information - this is also true for the actual native APIs in the browser and so on as well. For example, TypeScript doesn't recognise the "indices" property of regular expression matches.
- GitHub - thebinarysearchtree/flyweight: An ORM for SQLite
- Flyweight: An ORM for SQLite
sequelts
-
Kysely: TypeScript SQL Query Builder
You can use these template literal types + infer to build an entire SQL parser. I did a POC that infers SQL query types by parsing the SQL query on a type level:
https://github.com/nikeee/sequelts
However, building this parser is pretty cumbersome and supporting multiple SQL dialects would be lots of pain. While I'm not a fan of query builders per se, Kysely pretty much covers everything that my POC tried to cover (except that 0 runtime overhead). However, you get the option to use different DBMs in tests than in production (pg in prod, sqlite in tests), which is a huge benefit for a lot of people. sequelts was designed to work with sqlite only. And it's not a hack.
-
Flyweight: An ORM for SQLite
The only thing I can imagine where this would be useful is when you don't have control about what DB is being used, for example, when building a product that should be compatible with Postgres and MariaDB (and each is getting used). However, in the age of containerization, this isn't a big problem any more.
In some ORMs, I need to create types that the result of a query containing JOINs is mapped to. Others don't support them _at all_. In TypeORM, there is a query builder which forces you to put in _some_ SQL for things like "WHERE a in (b, c)".
I created a proof of concept of a different approach: Just embrace SQL and provide static typing based on the query. The return type of a query is whatever that thing is that the query returns in the context of the database schema. It's possible to do in TypeScript, by parsing the SQL query at development time:
https://github.com/nikeee/sequelts
One benefit is that it does not need any runtime code, as it's just a type layer over SQL. You don't have to rely on some type-metadata that TypeScript emits. That's why it also works with JavaScript only.
-
Deepkit – High-Performance TypeScript Framework
I don't like ORMs that use runtime types either. Most of the time, I want to write raw SQL.
So as an experiment, I created a library that statically types raw SQL:
https://github.com/nikeee/sequelts
The idea is to parse the SQL queries using TS's type system. The parsed query is combined with the database schema and therefore, we know what type the query will return.
This is especially useful due to TS's structural type system.
What are some alternatives?
mayim - The *NOT* ORM hydrator
liveviewjs - LiveView-based library for reactive app development in NodeJS and Deno
d2-playground - An online runner to play, learn, and create with D2, the modern diagram scripting language that turns text to diagrams.
kysely-codegen - Generate Kysely type definitions from your database.
rescript-compiler - The compiler for ReScript.
ts-sql - A SQL database implemented purely in TypeScript type annotations.
LINQ to DB - Linq to database provider.
assert-combinators - Functional assertion combinators.
SQLDelight - SQLDelight - Generates typesafe Kotlin APIs from SQL
postgresql-typed - Haskell PostgreSQL library with compile-time type inference
sqlitedao - Simple dao for sqlite for personal/desktop projects
Npgsql.FSharp.Analyzer - F# analyzer that provides embedded SQL syntax analysis, type-checking for parameters and result sets and nullable column detection when writing queries using Npgsql.FSharp.