jetify-com / tyson

🥊 TypeScript as a Configuration Language. TySON stands for TypeScript Object Notation
Apache License 2.0
539 stars 4 forks source link

Embeddable configuration types #6

Open Xe opened 1 year ago

Xe commented 1 year ago

I've been playing with TySON and I've been liking where this can go. I would like to be able to have my application ship a "config drive" or something in the form of an io.FS/embed.FS that's pre-baked with the type definitions. This would let me ship the types by default so I can write TySON configs like this:

import { Config } from "internal/config.ts";

export default {
  foo: "bar",
} satisfies Config;

What do you think about this? Shipping the types to editors would probably be a little bit hard, but I think it could be doable with some legwork.

loreto commented 1 year ago

I think we definitely need a way for applications to define types and easily make those types available.

I've been debating two options:

  1. Something like you are suggesting, where the application embeds the types and makes them available
  2. Support for url-based imports, so that the types can easily be published anywhere

For case 2, you could imagine creating your types under a github repo, let's say org/types-repo

And after you've published that repo you can now write the following config:

import { Config } from "github.com/org/types-repo/config.ts";

export default {
  foo: "bar",
} satisfies Config;

Would approach 2 also address your use case? Or are there reasons why you would prefer one approach vs the other?

Xe commented 1 year ago

I'd prefer embedding things directly into the application because adding a URL means that trying to validate configs in an environment like Nix builds (where there is no network stack) is nontrivial/annoying.