New vite-based examples app (#1226)

Right now this examples app looks exactly the same as our old examples
app, but there are a couple of tiny differences:
- We use `vite` instead of our own esbuild setup for development and
bundling
- We use `@tldraw/assets` for smart asset hashing instead of copying the
assets to a public folder

You can use `@tldraw/assets` with vite with a bunch of extra config, but
it (plus a bunch of other bundlers) also support a special syntax for
specifying asset urls: `new URL('./my/asset.svg',
import.meta.url).href`. This approach is more standards-complient, but
doesn't work with every bundler just yet. This diff also adds a
url-based version of `@tldraw/assets`, although I'd like to tweak the
entry point - right now you need to import from
`@tldraw/assets/lib/urls`, but i'd like to find a way to get this to
`@tldraw/assets/urls` or something at some point.

There are a couple other extra fixes in here:
- vscode builds were broken, they're fixed now!
- there's also a little tweak to the `getBundlerAssetUrls` API to allow
passing in a function instead of an object for URL formatting
- there are new internal-only functions for injecting asset urls
globally instead of passing them in via react props. this means we can
get the benefits of cacheable URLs without having to clutter our
examples by passing them in
This commit is contained in:
alex 2023-05-05 14:10:36 +01:00 committed by GitHub
parent c76dc1596f
commit 880f82e658
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
42 changed files with 1303 additions and 1187 deletions

View file

@ -1,4 +1,5 @@
import { readFile, writeFile as writeFileUnchecked } from 'fs/promises'
import json5 from 'json5'
import { basename, dirname, join, relative } from 'path'
import prettier from 'prettier'
import { fileURLToPath } from 'url'
@ -10,11 +11,11 @@ export const REPO_ROOT = join(__dirname, isBublic ? '../../..' : '../..')
export const BUBLIC_ROOT = join(__dirname, '../..')
export async function readJsonIfExists(file: string) {
try {
return JSON.parse(await readFile(file, 'utf8'))
} catch {
const fileContents = await readFileIfExists(file)
if (fileContents === null) {
return null
}
return json5.parse(fileContents)
}
export async function readFileIfExists(file: string) {