@ossido-labs/ossido 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,28 +1,83 @@
1
- # ossido
1
+ <div align="center">
2
+ <a href="https://ossido.dev">
3
+ <img src="https://raw.githubusercontent.com/ossido-labs/ossido/main/assets/header.png" alt="Ossido" width="100%">
4
+ </a>
2
5
 
3
- The core JavaScript runtime for [Ossido](https://ossido.dev)the React/Rust
4
- full-stack framework.
6
+ <p><strong>The full-stack React framework powered by a Rust backend built for usability and performance.</strong></p>
5
7
 
6
- This package is installed into every scaffolded Ossido app. It provides the
7
- client entry/hydration, the server-side rendering entry, the build tooling, and
8
- the config types the framework relies on. You normally don't import it directly
9
- the [`ossido` CLI](https://github.com/ossido-labs/ossido) and the framework's
10
- generated code wire it up for you.
8
+ <p>
9
+ <a href="https://crates.io/crates/ossido_cli"><img src="https://img.shields.io/crates/v/ossido_cli?logo=rust&label=crates.io&color=E43717" alt="crates.io version"></a>
10
+ <a href="https://www.npmjs.com/package/@ossido-labs/ossido"><img src="https://img.shields.io/npm/v/@ossido-labs/ossido?logo=npm&label=npm&color=CB3837" alt="npm version"></a>
11
+ <a href="https://github.com/ossido-labs/ossido/actions/workflows/rust-ci.yml"><img src="https://github.com/ossido-labs/ossido/actions/workflows/rust-ci.yml/badge.svg" alt="Rust CI"></a>
12
+ <a href="https://github.com/ossido-labs/ossido/actions/workflows/typescript-ci.yml"><img src="https://github.com/ossido-labs/ossido/actions/workflows/typescript-ci.yml/badge.svg" alt="TypeScript CI"></a>
13
+ <a href="./LICENSE.md"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"></a>
14
+ <a href="https://discord.com/invite/3ddKV4e83M"><img src="https://img.shields.io/discord/1536194582889627658?style=flat" alt="Discord"></a>
15
+ </p>
16
+
17
+ <p>
18
+ <a href="https://ossido.dev">Documentation</a> ·
19
+ <a href="https://discord.com/invite/3ddKV4e83M">Discord</a> ·
20
+ <a href="https://ossido.dev/documentation/contributing">Contributing</a>
21
+ </p>
22
+ </div>
23
+
24
+ ---
25
+
26
+ Ossido is a full-stack web framework for building React applications with a Rust backend. If you have
27
+ experience with [Next.js](https://nextjs.org/), you will feel right at home.
28
+
29
+ > ### **🚨 This project is still in early development. Please report any issues you find. 🚨**
30
+
31
+ > **Ossido is the successor to [Tuono](https://github.com/tuono-labs/tuono).** It began as a fork of
32
+ > the (now unmaintained) Tuono framework and carries its development forward.
33
+ >
34
+ > The name is a nod to its origin: _Tuono_ is Italian for "thunder", and _Ossido_ is Italian for
35
+ > "oxide" — a rust-themed wink to the Rust core that powers the backend.
36
+
37
+ ## Features
38
+
39
+ - 🟦 **Native TypeScript** — first-class TypeScript support out of the box
40
+ - 🌐 **File-based routing** — Next.js-like routing conventions
41
+ - 🍭 **CSS/SCSS modules** — scoped styling with zero configuration
42
+ - 🧬 **Server-side rendering** — fast, SEO-friendly SSR
43
+ - 🔥 **Hot module reload** — instant feedback during development
44
+ - ⚡ **Rust backend** — a high-performance core built on Rust
45
+
46
+ ## Installation
47
+
48
+ Available on macOS, Linux and Windows.
49
+
50
+ ```sh
51
+ cargo install ossido_cli
52
+ ```
11
53
 
12
54
  ## Getting started
13
55
 
14
- Create a new project with the CLI (installs this package for you):
56
+ Create a new project:
15
57
 
16
58
  ```sh
17
59
  ossido new [PROJECT_NAME]
18
60
  ```
19
61
 
20
- ## Entry points
62
+ > Pass the `--template` (or `-t`) flag to start from an existing
63
+ > [template](https://github.com/ossido-labs/ossido/tree/main/examples).
64
+
65
+ Install the dependencies with your favourite JavaScript package manager (e.g. `npm install`), then
66
+ start the development server:
67
+
68
+ ```sh
69
+ ossido dev
70
+ ```
71
+
72
+ ## Documentation
73
+
74
+ Full documentation is available at [ossido.dev](https://ossido.dev/).
75
+
76
+ ## Contributing
77
+
78
+ Contributions, ideas and suggestions are welcome and encouraged. See the
79
+ [Contributing guide](https://ossido.dev/documentation/contributing) to get started.
21
80
 
22
- - `ossido` — framework primitives (e.g. `Link`) used in app code
23
- - `ossido/config` — `OssidoConfig` type and config helpers
24
- - `ossido/client` / `ossido/hydration` — client bootstrap + hydration
25
- - `ossido/ssr` — server-side rendering entry
26
- - `ossido/build` / `ossido/build-client` — build pipeline
81
+ ## License
27
82
 
28
- Check [ossido](https://github.com/ossido-labs/ossido) for more.
83
+ Licensed under the [MIT License](./LICENSE.md).
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/build/index.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { resolve, join } from 'node:path';\nimport { readdirSync, readFileSync } from 'node:fs';\nimport { gzipSync } from 'node:zlib';\n\nimport type { InlineConfig, Plugin } from 'vite';\nimport { build, createServer, mergeConfig } from 'vite';\nimport react from '@vitejs/plugin-react-swc';\nimport inject from '@rollup/plugin-inject';\nimport { OssidoReactPlugin, routeGenerator } from '@ossido-labs/ossido-react-vite-plugin';\nimport { ErrorOverlayVitePlugin } from '@ossido-labs/ossido-ui/vite-plugin';\n\nimport type { OssidoConfig } from '../config';\n\nimport type { InternalOssidoConfig } from './types';\nimport { blockingAsync, listFilesRecursive } from './utils';\nimport { createJsonConfig, loadConfig } from './config';\nimport { ENV_PREFIX } from './constants';\nimport { createOssidoViteLogger } from './logger';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Absolute entry paths for the generated `.ossido` scaffold.\n *\n * The vite config sets `root: '.ossido'`. Vite's `build()` resolves a relative\n * `rollupOptions.input` against the CWD, but the dev server's dependency\n * scanner (rolldown, vite 8+) resolves it against `root` — so a path like\n * `./.ossido/client-main.tsx` double-nests to `.ossido/.ossido/...` and fails to\n * resolve. Absolute paths are unambiguous across both code paths.\n */\nconst CLIENT_MAIN_ENTRY = resolve('.ossido/client-main.tsx');\nconst SERVER_MAIN_ENTRY = resolve('.ossido/server-main.tsx');\n\n/**\n * `@rollup/plugin-inject` injects these imports into every module that\n * references the globals below — including third-party files deep in\n * `node_modules` (e.g. `react-dom/server`). Vite 8's bundler (rolldown)\n * resolves an injected bare specifier relative to the *importing* file, so\n * `'@ossido-labs/ossido/ssr'` fails to resolve from within `react-dom`. Resolving to\n * absolute paths up-front makes the injected imports resolvable from anywhere\n * (and is a no-op for rollup on Vite <= 7).\n */\nconst SSR_POLYFILLS_MODULE = require.resolve('@ossido-labs/ossido/ssr');\nconst WEB_STREAMS_POLYFILL_MODULE = require.resolve('web-streams-polyfill');\n\nconst VITE_SSR_PLUGINS: Array<Plugin> = [\n {\n enforce: 'post',\n // `@rollup/plugin-inject` is typed against an older rollup than the one\n // bundled with vite, so its `Plugin` type needs widening to vite's.\n ...(inject({\n ReadableStream: [WEB_STREAMS_POLYFILL_MODULE, 'ReadableStream'],\n\n /**\n * Added to support `react@19`\n * @see https://github.com/tuono-labs/tuono/issues/218\n */\n MessageChannel: [SSR_POLYFILLS_MODULE, 'MessageChannelPolyfill'],\n MessageEvent: [SSR_POLYFILLS_MODULE, 'MessageEventPolyfill'],\n Event: [SSR_POLYFILLS_MODULE, 'EventPolyfill'],\n }) as unknown as Plugin),\n },\n];\n\n/**\n * From a resolved {@link InternalOssidoConfig} return a `vite` \"mergeable\"\n * {@link InlineConfig} including all default ossido related options\n */\nfunction createBaseViteConfigFromOssidoConfig(\n ossidoConfig: InternalOssidoConfig,\n): InlineConfig {\n /**\n * @warning Keep in sync with {@link LazyLoadingPlugin} tests:\n * packages/lazy-fn-vite-plugin/tests/transpileSource.test.ts\n */\n const pluginFilesInclude = /\\.(jsx|js|mdx|md|tsx|ts)$/;\n\n const viteBaseConfig: InlineConfig = {\n root: '.ossido',\n // `'error'` (not `'silent'`) so build failures surface instead of\n // degrading to a silent client-side fallback with hydration mismatches.\n logLevel: 'error',\n // Tag vite's output `[FE]` so it matches the rest of the Ossido logs. The\n // level is passed explicitly so the logger honours it (see the logger docs)\n // — this keeps vite's info/benign-warning noise out at `'error'`.\n customLogger: createOssidoViteLogger('error'),\n publicDir: '../public',\n cacheDir: 'cache',\n envDir: '../',\n envPrefix: ENV_PREFIX,\n\n define: {\n // Baked into the client bundle for `ossido build --static` (the CLI sets\n // `OSSIDO_STATIC` for the react build). The router reads it to fetch the\n // pre-rendered `.json` data files instead of the extensionless\n // `/__ossido/data{path}` route, which has no server in a static export.\n __OSSIDO_STATIC__: JSON.stringify(process.env.OSSIDO_STATIC === 'true'),\n // Baked into both bundles so `<CriticalCss>` skips rendering its dev\n // stylesheet links when `dev.criticalCss: false` — the vite endpoint is\n // disabled in that case, so the links would otherwise be dead requests\n // that block rendering.\n __OSSIDO_CRITICAL_CSS__: JSON.stringify(\n ossidoConfig.dev?.criticalCss ?? true,\n ),\n // Baked into both bundles so the router wraps client navigations in\n // `document.startViewTransition` only when the app opted in via\n // `viewTransitions: true`. Off by default.\n __OSSIDO_VIEW_TRANSITIONS__: JSON.stringify(\n ossidoConfig.viewTransitions ?? false,\n ),\n },\n\n resolve: {\n alias: ossidoConfig.vite?.alias ?? {},\n },\n\n css: ossidoConfig.vite?.css,\n\n optimizeDeps: ossidoConfig.vite?.optimizeDeps,\n\n plugins: [\n ...(ossidoConfig.vite?.plugins ?? []),\n\n /**\n * even if `include` is not a valid option for this\n * plugin, we have to use it.\n * If not specified, when running `ossido dev`, the mdx\n * won't be compiled include any style in the page and it might\n * seem broken.\n */\n // @ts-expect-error see above comment\n react({ include: pluginFilesInclude }),\n\n OssidoReactPlugin({ criticalCss: ossidoConfig.dev?.criticalCss ?? true }),\n ],\n };\n\n // seems redundant but it's useful to log the value when debugging, until we have a logging infrastructure.\n return viteBaseConfig;\n}\n\nconst developmentSSRBundle = (): void => {\n blockingAsync(async () => {\n const config = await loadConfig();\n await build(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n // A dedicated cache dir, separate from the client dev server's\n // (`.ossido/cache`). Both run concurrently in dev, and this SSR bundle\n // is rebuilt on every `.tsx`/`.mdx`/CSS-module edit — sharing the cache\n // makes each rebuild invalidate the dev server's optimized-deps cache,\n // which triggers a spurious full-page reload (and data refetch) right\n // after the in-place Fast Refresh has already applied.\n cacheDir: 'cache-ssr',\n plugins: VITE_SSR_PLUGINS,\n build: {\n ssr: true,\n minify: false,\n outDir: 'server',\n emptyOutDir: true,\n rollupOptions: {\n input: SERVER_MAIN_ENTRY,\n output: {\n entryFileNames: 'dev-server.js',\n // ESM (not IIFE) so the SSR entry can use top-level `await`; the\n // Rust runtime compiles it as a V8 module (`Ssr::from_module`).\n // The build stays a single `dev-server.js` — the only file the\n // runtime reads — because the SSR build disables code splitting.\n format: 'es',\n },\n },\n },\n ssr: {\n target: 'webworker',\n noExternal: true,\n },\n },\n ),\n );\n });\n};\n\nconst developmentCSRWatch = (): void => {\n blockingAsync(async () => {\n const config = await loadConfig();\n\n const server = await createServer(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n // Entry point for the development vite proxy\n base: '/vite-server/',\n plugins: [ErrorOverlayVitePlugin],\n\n server: {\n host: config.server.host,\n port: config.server.port + 1,\n strictPort: true,\n },\n build: {\n manifest: true,\n emptyOutDir: true,\n rollupOptions: {\n input: CLIENT_MAIN_ENTRY,\n },\n },\n },\n ),\n );\n await server.listen();\n });\n};\n\nconst KB = 1024;\n\nconst formatKb = (bytes: number): string => `${(bytes / KB).toFixed(1)} kB`;\n\n/**\n * Print a compact per-asset size summary (raw + gzip) for the prod build, so\n * size regressions are visible on every `ossido build` without extra tooling.\n * Reads the emitted files directly — works regardless of vite's log level.\n */\nconst printBundleSummary = (): void => {\n interface AssetRow {\n label: string;\n size: number;\n gzip: number;\n }\n\n const collectDir = (dir: string, prefix: string): Array<AssetRow> => {\n try {\n return readdirSync(dir, { recursive: true, encoding: 'utf-8' })\n .filter((file) => /\\.(js|css)$/.test(file))\n .map((file) => {\n const content = readFileSync(join(dir, file));\n return {\n label: `${prefix}/${file}`,\n size: content.length,\n gzip: gzipSync(content).length,\n };\n });\n } catch {\n return [];\n }\n };\n\n const assets = [\n ...collectDir(resolve('out/client'), 'client'),\n ...collectDir(resolve('out/server'), 'server'),\n ].sort((a, b) => b.size - a.size);\n\n if (!assets.length) return;\n\n const labelWidth = Math.max(...assets.map((asset) => asset.label.length));\n console.log('');\n for (const asset of assets) {\n console.log(\n ` ${asset.label.padEnd(labelWidth)} ${formatKb(asset.size).padStart(10)} │ gzip: ${formatKb(asset.gzip).padStart(9)}`,\n );\n }\n const total = assets.reduce((sum, asset) => sum + asset.size, 0);\n const totalGzip = assets.reduce((sum, asset) => sum + asset.gzip, 0);\n console.log(\n ` ${'total'.padEnd(labelWidth)} ${formatKb(total).padStart(10)} │ gzip: ${formatKb(totalGzip).padStart(9)}`,\n );\n console.log('');\n};\n\nconst buildProd = (): void => {\n blockingAsync(async () => {\n const config = await loadConfig();\n\n // Generate the route tree once up front. Both builds' plugin instances\n // re-run the generator on `configResolved`, but it skips the write when\n // the content is unchanged — pre-generating removes the concurrent-write\n // hazard so the two builds (independent outputs) can run in parallel.\n await routeGenerator();\n\n await Promise.all([\n build(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n build: {\n manifest: true,\n emptyOutDir: true,\n outDir: '../out/client',\n rollupOptions: {\n input: CLIENT_MAIN_ENTRY,\n },\n },\n },\n ),\n ),\n build(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n plugins: VITE_SSR_PLUGINS,\n build: {\n ssr: true,\n minify: true,\n outDir: '../out/server',\n emptyOutDir: true,\n rollupOptions: {\n input: SERVER_MAIN_ENTRY,\n output: {\n entryFileNames: 'prod-server.js',\n // ESM (not IIFE) so the SSR entry can use top-level `await`;\n // the Rust runtime compiles it as a V8 module\n // (`Ssr::from_module`). The build stays a single\n // `prod-server.js` — the only file the runtime reads —\n // because the SSR build disables code splitting.\n format: 'es',\n },\n },\n },\n ssr: {\n target: 'webworker',\n noExternal: true,\n },\n },\n ),\n ),\n ]);\n\n printBundleSummary();\n });\n};\n\nconst buildConfig = (): void => {\n blockingAsync(async (): Promise<void> => {\n await build({\n root: '.ossido',\n // `'error'` (not `'silent'`) so config build failures are visible.\n logLevel: 'error',\n cacheDir: 'cache',\n envDir: '../',\n build: {\n ssr: true,\n outDir: 'config',\n emptyOutDir: true,\n rollupOptions: {\n input: './ossido.config.ts',\n output: {\n entryFileNames: 'config.mjs',\n },\n },\n },\n });\n\n const config = await loadConfig();\n await createJsonConfig(config);\n });\n};\n\n/**\n * Run a user-defined build lifecycle hook (`prebuild` / `postbuild`) from\n * `ossido.config.ts`. Invoked by the Rust CLI (`ossido-run-build-hook <name>`)\n * at the matching point of `ossido build`. No-ops when the hook is undefined.\n *\n * The output/public dirs and mode mirror what the build produces: static builds\n * deploy `out/static`, server builds `out`. `postbuild` gets the emitted-file\n * manifest; `prebuild` runs before anything is emitted, so its manifest is empty.\n */\nconst runBuildHook = (name: 'prebuild' | 'postbuild'): void =>\n blockingAsync(async () => {\n const config = await loadConfig();\n const hook = config.build?.[name];\n if (typeof hook !== 'function') return;\n\n const mode = process.env.OSSIDO_STATIC === 'true' ? 'static' : 'server';\n const outputDirectory = resolve(mode === 'static' ? 'out/static' : 'out');\n const publicDirectory = resolve('public');\n const manifest =\n name === 'postbuild' ? listFilesRecursive(outputDirectory) : [];\n\n // `loadConfig` returns the resolved `InternalOssidoConfig` (a structural\n // superset of the public `OssidoConfig` the hook context exposes).\n await hook({\n mode,\n outputDirectory,\n publicDirectory,\n manifest,\n config: config as OssidoConfig,\n });\n });\n\nexport {\n buildProd,\n buildConfig,\n developmentCSRWatch,\n developmentSSRBundle,\n runBuildHook,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/build/index.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { resolve, join } from 'node:path';\nimport { readdirSync, readFileSync } from 'node:fs';\nimport { gzipSync } from 'node:zlib';\n\nimport type { InlineConfig, Plugin } from 'vite';\nimport { build, createServer, mergeConfig } from 'vite';\nimport react from '@vitejs/plugin-react-swc';\nimport inject from '@rollup/plugin-inject';\nimport {\n OssidoReactPlugin,\n routeGenerator,\n} from '@ossido-labs/ossido-react-vite-plugin';\nimport { ErrorOverlayVitePlugin } from '@ossido-labs/ossido-ui/vite-plugin';\n\nimport type { OssidoConfig } from '../config';\n\nimport type { InternalOssidoConfig } from './types';\nimport { blockingAsync, listFilesRecursive } from './utils';\nimport { createJsonConfig, loadConfig } from './config';\nimport { ENV_PREFIX } from './constants';\nimport { createOssidoViteLogger } from './logger';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Absolute entry paths for the generated `.ossido` scaffold.\n *\n * The vite config sets `root: '.ossido'`. Vite's `build()` resolves a relative\n * `rollupOptions.input` against the CWD, but the dev server's dependency\n * scanner (rolldown, vite 8+) resolves it against `root` — so a path like\n * `./.ossido/client-main.tsx` double-nests to `.ossido/.ossido/...` and fails to\n * resolve. Absolute paths are unambiguous across both code paths.\n */\nconst CLIENT_MAIN_ENTRY = resolve('.ossido/client-main.tsx');\nconst SERVER_MAIN_ENTRY = resolve('.ossido/server-main.tsx');\n\n/**\n * `@rollup/plugin-inject` injects these imports into every module that\n * references the globals below — including third-party files deep in\n * `node_modules` (e.g. `react-dom/server`). Vite 8's bundler (rolldown)\n * resolves an injected bare specifier relative to the *importing* file, so\n * `'@ossido-labs/ossido/ssr'` fails to resolve from within `react-dom`. Resolving to\n * absolute paths up-front makes the injected imports resolvable from anywhere\n * (and is a no-op for rollup on Vite <= 7).\n */\nconst SSR_POLYFILLS_MODULE = require.resolve('@ossido-labs/ossido/ssr');\nconst WEB_STREAMS_POLYFILL_MODULE = require.resolve('web-streams-polyfill');\n\nconst VITE_SSR_PLUGINS: Array<Plugin> = [\n {\n enforce: 'post',\n // `@rollup/plugin-inject` is typed against an older rollup than the one\n // bundled with vite, so its `Plugin` type needs widening to vite's.\n ...(inject({\n ReadableStream: [WEB_STREAMS_POLYFILL_MODULE, 'ReadableStream'],\n\n /**\n * Added to support `react@19`\n * @see https://github.com/tuono-labs/tuono/issues/218\n */\n MessageChannel: [SSR_POLYFILLS_MODULE, 'MessageChannelPolyfill'],\n MessageEvent: [SSR_POLYFILLS_MODULE, 'MessageEventPolyfill'],\n Event: [SSR_POLYFILLS_MODULE, 'EventPolyfill'],\n }) as unknown as Plugin),\n },\n];\n\n/**\n * From a resolved {@link InternalOssidoConfig} return a `vite` \"mergeable\"\n * {@link InlineConfig} including all default ossido related options\n */\nfunction createBaseViteConfigFromOssidoConfig(\n ossidoConfig: InternalOssidoConfig,\n): InlineConfig {\n /**\n * @warning Keep in sync with {@link LazyLoadingPlugin} tests:\n * packages/lazy-fn-vite-plugin/tests/transpileSource.test.ts\n */\n const pluginFilesInclude = /\\.(jsx|js|mdx|md|tsx|ts)$/;\n\n const viteBaseConfig: InlineConfig = {\n root: '.ossido',\n // `'error'` (not `'silent'`) so build failures surface instead of\n // degrading to a silent client-side fallback with hydration mismatches.\n logLevel: 'error',\n // Tag vite's output `[FE]` so it matches the rest of the Ossido logs. The\n // level is passed explicitly so the logger honours it (see the logger docs)\n // — this keeps vite's info/benign-warning noise out at `'error'`.\n customLogger: createOssidoViteLogger('error'),\n publicDir: '../public',\n cacheDir: 'cache',\n envDir: '../',\n envPrefix: ENV_PREFIX,\n\n define: {\n // Baked into the client bundle for `ossido build --static` (the CLI sets\n // `OSSIDO_STATIC` for the react build). The router reads it to fetch the\n // pre-rendered `.json` data files instead of the extensionless\n // `/__ossido/data{path}` route, which has no server in a static export.\n __OSSIDO_STATIC__: JSON.stringify(process.env.OSSIDO_STATIC === 'true'),\n // Baked into both bundles so `<CriticalCss>` skips rendering its dev\n // stylesheet links when `dev.criticalCss: false` — the vite endpoint is\n // disabled in that case, so the links would otherwise be dead requests\n // that block rendering.\n __OSSIDO_CRITICAL_CSS__: JSON.stringify(\n ossidoConfig.dev?.criticalCss ?? true,\n ),\n // Baked into both bundles so the router wraps client navigations in\n // `document.startViewTransition` only when the app opted in via\n // `viewTransitions: true`. Off by default.\n __OSSIDO_VIEW_TRANSITIONS__: JSON.stringify(\n ossidoConfig.viewTransitions ?? false,\n ),\n },\n\n resolve: {\n alias: ossidoConfig.vite?.alias ?? {},\n },\n\n css: ossidoConfig.vite?.css,\n\n optimizeDeps: ossidoConfig.vite?.optimizeDeps,\n\n plugins: [\n ...(ossidoConfig.vite?.plugins ?? []),\n\n /**\n * even if `include` is not a valid option for this\n * plugin, we have to use it.\n * If not specified, when running `ossido dev`, the mdx\n * won't be compiled include any style in the page and it might\n * seem broken.\n */\n // @ts-expect-error see above comment\n react({ include: pluginFilesInclude }),\n\n OssidoReactPlugin({ criticalCss: ossidoConfig.dev?.criticalCss ?? true }),\n ],\n };\n\n // seems redundant but it's useful to log the value when debugging, until we have a logging infrastructure.\n return viteBaseConfig;\n}\n\nconst developmentSSRBundle = (): void => {\n blockingAsync(async () => {\n const config = await loadConfig();\n await build(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n // A dedicated cache dir, separate from the client dev server's\n // (`.ossido/cache`). Both run concurrently in dev, and this SSR bundle\n // is rebuilt on every `.tsx`/`.mdx`/CSS-module edit — sharing the cache\n // makes each rebuild invalidate the dev server's optimized-deps cache,\n // which triggers a spurious full-page reload (and data refetch) right\n // after the in-place Fast Refresh has already applied.\n cacheDir: 'cache-ssr',\n plugins: VITE_SSR_PLUGINS,\n build: {\n ssr: true,\n minify: false,\n outDir: 'server',\n emptyOutDir: true,\n rollupOptions: {\n input: SERVER_MAIN_ENTRY,\n output: {\n entryFileNames: 'dev-server.js',\n // ESM (not IIFE) so the SSR entry can use top-level `await`; the\n // Rust runtime compiles it as a V8 module (`Ssr::from_module`).\n // The build stays a single `dev-server.js` — the only file the\n // runtime reads — because the SSR build disables code splitting.\n format: 'es',\n },\n },\n },\n ssr: {\n target: 'webworker',\n noExternal: true,\n },\n },\n ),\n );\n });\n};\n\nconst developmentCSRWatch = (): void => {\n blockingAsync(async () => {\n const config = await loadConfig();\n\n const server = await createServer(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n // Entry point for the development vite proxy\n base: '/vite-server/',\n plugins: [ErrorOverlayVitePlugin],\n\n server: {\n host: config.server.host,\n port: config.server.port + 1,\n strictPort: true,\n },\n build: {\n manifest: true,\n emptyOutDir: true,\n rollupOptions: {\n input: CLIENT_MAIN_ENTRY,\n },\n },\n },\n ),\n );\n await server.listen();\n });\n};\n\nconst KB = 1024;\n\nconst formatKb = (bytes: number): string => `${(bytes / KB).toFixed(1)} kB`;\n\n/**\n * Print a compact per-asset size summary (raw + gzip) for the prod build, so\n * size regressions are visible on every `ossido build` without extra tooling.\n * Reads the emitted files directly — works regardless of vite's log level.\n */\nconst printBundleSummary = (): void => {\n interface AssetRow {\n label: string;\n size: number;\n gzip: number;\n }\n\n const collectDir = (dir: string, prefix: string): Array<AssetRow> => {\n try {\n return readdirSync(dir, { recursive: true, encoding: 'utf-8' })\n .filter((file) => /\\.(js|css)$/.test(file))\n .map((file) => {\n const content = readFileSync(join(dir, file));\n return {\n label: `${prefix}/${file}`,\n size: content.length,\n gzip: gzipSync(content).length,\n };\n });\n } catch {\n return [];\n }\n };\n\n const assets = [\n ...collectDir(resolve('out/client'), 'client'),\n ...collectDir(resolve('out/server'), 'server'),\n ].sort((a, b) => b.size - a.size);\n\n if (!assets.length) return;\n\n const labelWidth = Math.max(...assets.map((asset) => asset.label.length));\n console.log('');\n for (const asset of assets) {\n console.log(\n ` ${asset.label.padEnd(labelWidth)} ${formatKb(asset.size).padStart(10)} │ gzip: ${formatKb(asset.gzip).padStart(9)}`,\n );\n }\n const total = assets.reduce((sum, asset) => sum + asset.size, 0);\n const totalGzip = assets.reduce((sum, asset) => sum + asset.gzip, 0);\n console.log(\n ` ${'total'.padEnd(labelWidth)} ${formatKb(total).padStart(10)} │ gzip: ${formatKb(totalGzip).padStart(9)}`,\n );\n console.log('');\n};\n\nconst buildProd = (): void => {\n blockingAsync(async () => {\n const config = await loadConfig();\n\n // Generate the route tree once up front. Both builds' plugin instances\n // re-run the generator on `configResolved`, but it skips the write when\n // the content is unchanged — pre-generating removes the concurrent-write\n // hazard so the two builds (independent outputs) can run in parallel.\n await routeGenerator();\n\n await Promise.all([\n build(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n build: {\n manifest: true,\n emptyOutDir: true,\n outDir: '../out/client',\n rollupOptions: {\n input: CLIENT_MAIN_ENTRY,\n },\n },\n },\n ),\n ),\n build(\n mergeConfig<InlineConfig, InlineConfig>(\n createBaseViteConfigFromOssidoConfig(config),\n {\n plugins: VITE_SSR_PLUGINS,\n build: {\n ssr: true,\n minify: true,\n outDir: '../out/server',\n emptyOutDir: true,\n rollupOptions: {\n input: SERVER_MAIN_ENTRY,\n output: {\n entryFileNames: 'prod-server.js',\n // ESM (not IIFE) so the SSR entry can use top-level `await`;\n // the Rust runtime compiles it as a V8 module\n // (`Ssr::from_module`). The build stays a single\n // `prod-server.js` — the only file the runtime reads —\n // because the SSR build disables code splitting.\n format: 'es',\n },\n },\n },\n ssr: {\n target: 'webworker',\n noExternal: true,\n },\n },\n ),\n ),\n ]);\n\n printBundleSummary();\n });\n};\n\nconst buildConfig = (): void => {\n blockingAsync(async (): Promise<void> => {\n await build({\n root: '.ossido',\n // `'error'` (not `'silent'`) so config build failures are visible.\n logLevel: 'error',\n cacheDir: 'cache',\n envDir: '../',\n build: {\n ssr: true,\n outDir: 'config',\n emptyOutDir: true,\n rollupOptions: {\n input: './ossido.config.ts',\n output: {\n entryFileNames: 'config.mjs',\n },\n },\n },\n });\n\n const config = await loadConfig();\n await createJsonConfig(config);\n });\n};\n\n/**\n * Run a user-defined build lifecycle hook (`prebuild` / `postbuild`) from\n * `ossido.config.ts`. Invoked by the Rust CLI (`ossido-run-build-hook <name>`)\n * at the matching point of `ossido build`. No-ops when the hook is undefined.\n *\n * The output/public dirs and mode mirror what the build produces: static builds\n * deploy `out/static`, server builds `out`. `postbuild` gets the emitted-file\n * manifest; `prebuild` runs before anything is emitted, so its manifest is empty.\n */\nconst runBuildHook = (name: 'prebuild' | 'postbuild'): void =>\n blockingAsync(async () => {\n const config = await loadConfig();\n const hook = config.build?.[name];\n if (typeof hook !== 'function') return;\n\n const mode = process.env.OSSIDO_STATIC === 'true' ? 'static' : 'server';\n const outputDirectory = resolve(mode === 'static' ? 'out/static' : 'out');\n const publicDirectory = resolve('public');\n const manifest =\n name === 'postbuild' ? listFilesRecursive(outputDirectory) : [];\n\n // `loadConfig` returns the resolved `InternalOssidoConfig` (a structural\n // superset of the public `OssidoConfig` the hook context exposes).\n await hook({\n mode,\n outputDirectory,\n publicDirectory,\n manifest,\n config: config as OssidoConfig,\n });\n });\n\nexport {\n buildProd,\n buildConfig,\n developmentCSRWatch,\n developmentSSRBundle,\n runBuildHook,\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ossido-labs/ossido",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -77,9 +77,9 @@
77
77
  "@rollup/plugin-inject": "^5.0.5",
78
78
  "@vitejs/plugin-react-swc": "^4.3.2",
79
79
  "fast-text-encoding": "^1.0.6",
80
- "@ossido-labs/ossido-react-vite-plugin": "0.1.0",
81
- "@ossido-labs/ossido-router": "0.1.0",
82
- "@ossido-labs/ossido-ui": "0.1.0",
80
+ "@ossido-labs/ossido-react-vite-plugin": "0.1.2",
81
+ "@ossido-labs/ossido-router": "0.1.2",
82
+ "@ossido-labs/ossido-ui": "0.1.2",
83
83
  "url-search-params-polyfill": "^8.2.5",
84
84
  "web-streams-polyfill": "^4.0.0"
85
85
  },