olovaplugin 1.0.13 → 1.0.15
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 +26 -17
- package/dist/auto-generate.d.ts +3 -0
- package/dist/auto-generate.d.ts.map +1 -0
- package/dist/auto-generate.js +114 -0
- package/dist/auto-generate.js.map +1 -0
- package/dist/clean-url.d.ts +3 -0
- package/dist/clean-url.d.ts.map +1 -0
- package/dist/clean-url.js +40 -0
- package/dist/clean-url.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -0
- package/dist/error-overlay.d.ts +3 -0
- package/dist/error-overlay.d.ts.map +1 -0
- package/dist/error-overlay.js +59 -0
- package/dist/error-overlay.js.map +1 -0
- package/dist/framework.d.ts +3 -0
- package/dist/framework.d.ts.map +1 -0
- package/dist/framework.js +41 -0
- package/dist/framework.js.map +1 -0
- package/dist/hydration.d.ts +19 -0
- package/dist/hydration.d.ts.map +1 -0
- package/dist/hydration.js +221 -0
- package/dist/hydration.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/router.d.ts +3 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +165 -0
- package/dist/router.js.map +1 -0
- package/dist/runtime/router.d.ts +81 -0
- package/dist/runtime/router.d.ts.map +1 -0
- package/dist/runtime/router.js +284 -0
- package/dist/runtime/router.js.map +1 -0
- package/dist/ssg.d.ts +3 -0
- package/dist/ssg.d.ts.map +1 -0
- package/dist/ssg.js +376 -0
- package/dist/ssg.js.map +1 -0
- package/dist/terminal.d.ts +68 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +143 -0
- package/dist/terminal.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +68 -0
- package/dist/utils.js.map +1 -0
- package/dist/virtual-html.d.ts +3 -0
- package/dist/virtual-html.d.ts.map +1 -0
- package/dist/virtual-html.js +178 -0
- package/dist/virtual-html.js.map +1 -0
- package/package.json +33 -30
- package/runtime/client.tsx +119 -0
- package/runtime/index.ts +18 -0
- package/runtime/router.tsx +381 -0
- package/runtime/server.tsx +110 -0
- package/dist/olova-plugins.cjs +0 -1683
- package/dist/olova-plugins.d.cts +0 -123
- package/dist/olova-plugins.d.ts +0 -123
- package/dist/olova-plugins.js +0 -1622
package/README.md
CHANGED
|
@@ -1,33 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# olovaplugin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Vite plugin for Olova framework - file-based routing, SSG, SSR, and hydration.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install
|
|
8
|
+
npm install olovaplugin
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
```ts
|
|
13
|
+
```typescript
|
|
14
|
+
// vite.config.ts
|
|
16
15
|
import { defineConfig } from "vite";
|
|
17
|
-
import
|
|
16
|
+
import react from "@vitejs/plugin-react";
|
|
17
|
+
import { olovaPlugins } from "olovaplugin";
|
|
18
18
|
|
|
19
19
|
export default defineConfig({
|
|
20
|
-
plugins: [olovaPlugins()],
|
|
20
|
+
plugins: [react(), ...olovaPlugins()],
|
|
21
21
|
});
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
##
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
- **File-based routing** - Create routes by adding files to `src/`
|
|
27
|
+
- **SSG (Static Site Generation)** - Pre-render pages at build time
|
|
28
|
+
- **SSR (Server-Side Rendering)** - Full hydration support
|
|
29
|
+
- **Dynamic routes** - Use `$param` or `:param` syntax
|
|
30
|
+
- **Route groups** - Organize routes with `(folder)` syntax
|
|
31
|
+
- **HMR support** - Hot reload for route changes
|
|
32
|
+
|
|
33
|
+
## Importing from olova
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
import { Router, Link, useParams, usePathname } from "olova";
|
|
37
|
+
import type { Metadata } from "olova";
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## License
|
|
25
41
|
|
|
26
|
-
|
|
27
|
-
- Router Plugin
|
|
28
|
-
- Framework Plugin
|
|
29
|
-
- Virtual HTML Plugin
|
|
30
|
-
- SSG Plugin
|
|
31
|
-
- Clean URL Plugin
|
|
32
|
-
- Auto Generate Plugin
|
|
33
|
-
- Error Overlay Plugin
|
|
42
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-generate.d.ts","sourceRoot":"","sources":["../auto-generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAwDnC,wBAAgB,kBAAkB,IAAI,MAAM,CAoF3C"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// AUTO GENERATE PLUGIN - Auto-generates boilerplate code for new route files
|
|
5
|
+
// =============================================================================
|
|
6
|
+
/**
|
|
7
|
+
* Converts a folder name to PascalCase for component naming
|
|
8
|
+
*/
|
|
9
|
+
function toPascalCase(str) {
|
|
10
|
+
// Remove $ prefix for dynamic routes
|
|
11
|
+
const cleanStr = str.replace(/^\$/, "");
|
|
12
|
+
return cleanStr
|
|
13
|
+
.split(/[-_]/)
|
|
14
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
15
|
+
.join("");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generates the boilerplate code for a new route component
|
|
19
|
+
*/
|
|
20
|
+
function generateBoilerplate(folderName, isDynamic) {
|
|
21
|
+
const componentName = toPascalCase(folderName);
|
|
22
|
+
if (isDynamic) {
|
|
23
|
+
// Dynamic route with useParams
|
|
24
|
+
const paramName = folderName.replace(/^\$/, "");
|
|
25
|
+
return `import { useParams } from '../../route';
|
|
26
|
+
|
|
27
|
+
export default function ${componentName}() {
|
|
28
|
+
const { ${paramName} } = useParams();
|
|
29
|
+
return (
|
|
30
|
+
<div>
|
|
31
|
+
<h1>${componentName} Page</h1>
|
|
32
|
+
<p>{${paramName}}</p>
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
// Regular static route
|
|
39
|
+
return `export default function ${componentName}() {
|
|
40
|
+
return (
|
|
41
|
+
<div>
|
|
42
|
+
<h1>${componentName} Page</h1>
|
|
43
|
+
<p>Welcome to ${componentName}</p>
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
}
|
|
49
|
+
export function autoGeneratePlugin() {
|
|
50
|
+
let srcDir;
|
|
51
|
+
return {
|
|
52
|
+
name: "olova-auto-generate",
|
|
53
|
+
configResolved(config) {
|
|
54
|
+
srcDir = path.resolve(config.root, "src");
|
|
55
|
+
},
|
|
56
|
+
configureServer(server) {
|
|
57
|
+
console.log("\x1b[36m[olova] Auto-generate plugin active - watching for new route files\x1b[0m");
|
|
58
|
+
// Watch for file creation events
|
|
59
|
+
server.watcher.on("add", (filePath) => {
|
|
60
|
+
// Normalize path for Windows compatibility
|
|
61
|
+
const normalizedPath = path.normalize(filePath);
|
|
62
|
+
const normalizedSrcDir = path.normalize(srcDir);
|
|
63
|
+
// Only process .tsx or .jsx files
|
|
64
|
+
const ext = path.extname(normalizedPath);
|
|
65
|
+
if (ext !== ".tsx" && ext !== ".jsx") {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Check if file is inside src directory
|
|
69
|
+
if (!normalizedPath.startsWith(normalizedSrcDir)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Get the file name without extension
|
|
73
|
+
const fileName = path.basename(normalizedPath, ext);
|
|
74
|
+
// Only auto-generate for index files
|
|
75
|
+
if (fileName !== "index") {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Get the folder name
|
|
79
|
+
const folderPath = path.dirname(normalizedPath);
|
|
80
|
+
const folderName = path.basename(folderPath);
|
|
81
|
+
// Skip root src folder and route groups (folders starting with parentheses)
|
|
82
|
+
if (folderName === "src" || folderName.startsWith("(")) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Check if file is empty or very small (just created)
|
|
86
|
+
try {
|
|
87
|
+
fs.statSync(normalizedPath);
|
|
88
|
+
const content = fs.readFileSync(normalizedPath, "utf-8");
|
|
89
|
+
// Only generate if file is empty or has minimal content
|
|
90
|
+
if (content.trim().length > 10) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
// File might not exist yet or other error, skip
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Check if it's a dynamic route (folder starts with $)
|
|
99
|
+
const isDynamic = folderName.startsWith("$");
|
|
100
|
+
// Generate the boilerplate
|
|
101
|
+
const boilerplate = generateBoilerplate(folderName, isDynamic);
|
|
102
|
+
// Write the boilerplate to the file
|
|
103
|
+
try {
|
|
104
|
+
fs.writeFileSync(normalizedPath, boilerplate, "utf-8");
|
|
105
|
+
console.log(`\x1b[32m✓ [olova] Auto-generated: ${folderName}/index${ext}\x1b[0m`);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.error(`\x1b[31m✗ [olova] Failed to write boilerplate:\x1b[0m`, err);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=auto-generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-generate.js","sourceRoot":"","sources":["../auto-generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean-url.d.ts","sourceRoot":"","sources":["../clean-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAOnC,wBAAgB,cAAc,IAAI,MAAM,CAoCvC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// CLEAN URL PLUGIN - Handles clean URLs in preview mode
|
|
5
|
+
// =============================================================================
|
|
6
|
+
export function cleanUrlPlugin() {
|
|
7
|
+
return {
|
|
8
|
+
name: 'olova-clean-url',
|
|
9
|
+
configurePreviewServer(server) {
|
|
10
|
+
// Use middleware that runs BEFORE Vite's static serving
|
|
11
|
+
server.middlewares.use((req, res, next) => {
|
|
12
|
+
const urlPath = (req.url || '/').split('?')[0];
|
|
13
|
+
const distDir = path.resolve('.olova/dist');
|
|
14
|
+
// Handle root path
|
|
15
|
+
if (urlPath === '/') {
|
|
16
|
+
const indexPath = path.join(distDir, 'index.html');
|
|
17
|
+
if (fs.existsSync(indexPath)) {
|
|
18
|
+
const content = fs.readFileSync(indexPath, 'utf-8');
|
|
19
|
+
res.setHeader('Content-Type', 'text/html');
|
|
20
|
+
res.end(content);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Skip if it has a file extension (assets, scripts, etc.)
|
|
25
|
+
if (urlPath.includes('.'))
|
|
26
|
+
return next();
|
|
27
|
+
// Check if /route/index.html exists (clean URLs)
|
|
28
|
+
const indexPath = path.join(distDir, urlPath, 'index.html');
|
|
29
|
+
if (fs.existsSync(indexPath)) {
|
|
30
|
+
const content = fs.readFileSync(indexPath, 'utf-8');
|
|
31
|
+
res.setHeader('Content-Type', 'text/html');
|
|
32
|
+
res.end(content);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
next();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=clean-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean-url.js","sourceRoot":"","sources":["../clean-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,gFAAgF;AAChF,wDAAwD;AACxD,gFAAgF;AAChF,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,sBAAsB,CAAC,MAAM;YAC3B,wDAAwD;YACxD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAE5C,mBAAmB;gBACnB,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;oBACpB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBACnD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;wBACpD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;wBAC3C,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBACjB,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,0DAA0D;gBAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAEzC,iDAAiD;gBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;gBAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACpD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;oBAC3C,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACjB,OAAO;gBACT,CAAC;gBAED,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAiBnC,wBAAgB,YAAY,IAAI,MAAM,CAwFrC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
// Terminal colors
|
|
4
|
+
const colors = {
|
|
5
|
+
reset: '\x1b[0m',
|
|
6
|
+
bold: '\x1b[1m',
|
|
7
|
+
dim: '\x1b[2m',
|
|
8
|
+
cyan: '\x1b[36m',
|
|
9
|
+
green: '\x1b[32m',
|
|
10
|
+
white: '\x1b[37m',
|
|
11
|
+
};
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// CONFIG PLUGIN - Creates .olova folder and configures Vite settings
|
|
14
|
+
// =============================================================================
|
|
15
|
+
export function configPlugin() {
|
|
16
|
+
const olovaDir = path.resolve('.olova');
|
|
17
|
+
return {
|
|
18
|
+
name: 'olova-config',
|
|
19
|
+
config(_config, { command }) {
|
|
20
|
+
// Create .olova folder on startup
|
|
21
|
+
if (!fs.existsSync(olovaDir)) {
|
|
22
|
+
fs.mkdirSync(olovaDir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
// Skip build config for SSG builds
|
|
25
|
+
if (process.env.IS_SSG_BUILD) {
|
|
26
|
+
return {
|
|
27
|
+
appType: 'custom',
|
|
28
|
+
cacheDir: './.olova/cache',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// Show startup banner for dev mode
|
|
32
|
+
if (command === 'serve') {
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log(` ${colors.bold}${colors.cyan}▲ Olova${colors.reset} ${colors.dim}v1.0.0${colors.reset}`);
|
|
35
|
+
console.log('');
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
appType: 'custom',
|
|
39
|
+
cacheDir: './.olova/cache',
|
|
40
|
+
build: {
|
|
41
|
+
outDir: './.olova/dist',
|
|
42
|
+
sourcemap: false,
|
|
43
|
+
chunkSizeWarningLimit: 500,
|
|
44
|
+
rollupOptions: {
|
|
45
|
+
onwarn(warning, warn) {
|
|
46
|
+
// Suppress "dynamic import will not move module" warnings
|
|
47
|
+
if (warning.code === 'PLUGIN_WARNING' && warning.message?.includes('dynamic import will not move')) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Suppress "static" directive warnings (Olova uses this for static routes)
|
|
51
|
+
if (warning.message?.includes('Module level directives') && warning.message?.includes('static')) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Suppress sourcemap warnings for static directive
|
|
55
|
+
if (warning.message?.includes('sourcemap') && warning.message?.includes("Can't resolve original location")) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
warn(warning);
|
|
59
|
+
},
|
|
60
|
+
output: {
|
|
61
|
+
chunkFileNames: 'pro_olova_static/chunks/[name]-[hash].js',
|
|
62
|
+
entryFileNames: 'pro_olova_static/olova-[hash].js',
|
|
63
|
+
assetFileNames: 'pro_olova_static/[name]-[hash][extname]',
|
|
64
|
+
manualChunks(id) {
|
|
65
|
+
if (id.includes('node_modules')) {
|
|
66
|
+
if (id.includes('react-dom')) {
|
|
67
|
+
return 'vendor-react-dom';
|
|
68
|
+
}
|
|
69
|
+
if (id.includes('react')) {
|
|
70
|
+
return 'vendor-react';
|
|
71
|
+
}
|
|
72
|
+
return 'vendor';
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
preview: {
|
|
79
|
+
port: 4173,
|
|
80
|
+
strictPort: false,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
configureServer(server) {
|
|
85
|
+
// Show ready message when server starts
|
|
86
|
+
server.httpServer?.once('listening', () => {
|
|
87
|
+
const address = server.httpServer?.address();
|
|
88
|
+
const port = typeof address === 'object' && address ? address.port : 5173;
|
|
89
|
+
setTimeout(() => {
|
|
90
|
+
console.log(` ${colors.green}✓${colors.reset} Ready in ${colors.dim}${Math.round(performance.now())}ms${colors.reset}`);
|
|
91
|
+
console.log('');
|
|
92
|
+
console.log(` ${colors.dim}➜${colors.reset} ${colors.bold}Local:${colors.reset} ${colors.cyan}http://localhost:${port}/${colors.reset}`);
|
|
93
|
+
console.log('');
|
|
94
|
+
}, 100);
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-overlay.d.ts","sourceRoot":"","sources":["../error-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAsB,MAAM,MAAM,CAAC;AAQvD,wBAAgB,oBAAoB,IAAI,MAAM,CA0D7C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// PROACTIVE ERROR CHECKER - Validates all files on save like Next.js
|
|
4
|
+
// This makes Vite's error overlay show instantly for ANY file with an error
|
|
5
|
+
// =============================================================================
|
|
6
|
+
export function proactiveErrorPlugin() {
|
|
7
|
+
return {
|
|
8
|
+
name: 'olova-proactive-error',
|
|
9
|
+
enforce: 'post',
|
|
10
|
+
configureServer(devServer) {
|
|
11
|
+
const srcDir = path.resolve(process.cwd(), 'src');
|
|
12
|
+
// Function to validate a file and send error to Vite's overlay
|
|
13
|
+
const validateFile = async (filePath) => {
|
|
14
|
+
if (!filePath.startsWith(srcDir))
|
|
15
|
+
return;
|
|
16
|
+
if (!/\.(tsx?|jsx?)$/.test(filePath))
|
|
17
|
+
return;
|
|
18
|
+
const relativePath = path.relative(srcDir, filePath);
|
|
19
|
+
console.log('\x1b[36m[olova]\x1b[0m Checking:', relativePath);
|
|
20
|
+
try {
|
|
21
|
+
// Convert file path to URL format for Vite
|
|
22
|
+
const url = '/' + path.relative(process.cwd(), filePath).replace(/\\/g, '/');
|
|
23
|
+
// Proactively transform the file
|
|
24
|
+
await devServer.transformRequest(url);
|
|
25
|
+
console.log('\x1b[32m[olova]\x1b[0m ✓', relativePath, 'OK');
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.log('\x1b[31m[olova]\x1b[0m ✗', relativePath);
|
|
29
|
+
// Send error to Vite's error overlay via WebSocket
|
|
30
|
+
// This is the official way Vite shows errors in the overlay
|
|
31
|
+
devServer.ws.send({
|
|
32
|
+
type: 'error',
|
|
33
|
+
err: {
|
|
34
|
+
message: err.message || String(err),
|
|
35
|
+
stack: err.stack || '',
|
|
36
|
+
id: err.id || filePath,
|
|
37
|
+
frame: err.frame || '',
|
|
38
|
+
plugin: err.plugin || 'olova',
|
|
39
|
+
loc: err.loc || undefined,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
// Watch for file changes
|
|
45
|
+
devServer.watcher.on('change', async (filePath) => {
|
|
46
|
+
// Small delay to ensure file is fully written
|
|
47
|
+
await new Promise(r => setTimeout(r, 50));
|
|
48
|
+
await validateFile(filePath);
|
|
49
|
+
});
|
|
50
|
+
// Also check new files when they're added
|
|
51
|
+
devServer.watcher.on('add', async (filePath) => {
|
|
52
|
+
// Wait for file to be fully written
|
|
53
|
+
await new Promise(r => setTimeout(r, 100));
|
|
54
|
+
await validateFile(filePath);
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=error-overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-overlay.js","sourceRoot":"","sources":["../error-overlay.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,gFAAgF;AAChF,qEAAqE;AACrE,4EAA4E;AAC5E,gFAAgF;AAEhF,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,MAAM;QAEf,eAAe,CAAC,SAAwB;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;YAElD,+DAA+D;YAC/D,MAAM,YAAY,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;gBAC9C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,OAAO;gBACzC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,OAAO;gBAE7C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,YAAY,CAAC,CAAC;gBAE9D,IAAI,CAAC;oBACH,2CAA2C;oBAC3C,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAE7E,iCAAiC;oBACjC,MAAM,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBAEtC,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC9D,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC;oBAEtD,mDAAmD;oBACnD,4DAA4D;oBAC5D,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,OAAO;wBACb,GAAG,EAAE;4BACH,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;4BACnC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;4BACtB,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,QAAQ;4BACtB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;4BACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,OAAO;4BAC7B,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,SAAS;yBAC1B;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC;YAEF,yBAAyB;YACzB,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;gBACxD,8CAA8C;gBAC9C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC1C,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,0CAA0C;YAC1C,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;gBACrD,oCAAoC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3C,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../framework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAgBnC,wBAAgB,eAAe,IAAI,MAAM,CAiCxC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// FRAMEWORK PLUGIN - Uses Vite aliases to serve real files (TanStack style)
|
|
5
|
+
// Routes virtual module is handled by routerPlugin via resolveId/load
|
|
6
|
+
// =============================================================================
|
|
7
|
+
// Get the package root directory (works both in dev and production)
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
// When compiled, __dirname is dist/, so we need to go up to get to runtime/
|
|
11
|
+
// When in dev (source), __dirname is olovaplugin/, runtime is a child
|
|
12
|
+
const packageRoot = __dirname.endsWith('dist') ? path.resolve(__dirname, '..') : __dirname;
|
|
13
|
+
export function frameworkPlugin() {
|
|
14
|
+
// Runtime folder is at package root level
|
|
15
|
+
const runtimeDir = path.resolve(packageRoot, 'runtime');
|
|
16
|
+
return {
|
|
17
|
+
name: 'olova-framework',
|
|
18
|
+
enforce: 'pre',
|
|
19
|
+
// Use resolveId instead of config aliases to avoid catching olova/routes
|
|
20
|
+
resolveId(id) {
|
|
21
|
+
const routerPath = path.join(runtimeDir, 'router.tsx');
|
|
22
|
+
const clientPath = path.join(runtimeDir, 'client.tsx');
|
|
23
|
+
const serverPath = path.join(runtimeDir, 'server.tsx');
|
|
24
|
+
// Main olova package → real router.tsx file
|
|
25
|
+
// But NOT olova/routes - that's handled by routerPlugin
|
|
26
|
+
if (id === 'olova' || id === 'olova/index') {
|
|
27
|
+
return routerPath;
|
|
28
|
+
}
|
|
29
|
+
// Client entry → real client.tsx file
|
|
30
|
+
if (id === 'olova/client' || id === '/olova/client') {
|
|
31
|
+
return clientPath;
|
|
32
|
+
}
|
|
33
|
+
// Server entry → real server.tsx file
|
|
34
|
+
if (id === 'olova/server' || id === '/olova/server') {
|
|
35
|
+
return serverPath;
|
|
36
|
+
}
|
|
37
|
+
// Let olova/routes pass through to routerPlugin
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=framework.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.js","sourceRoot":"","sources":["../framework.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,gFAAgF;AAChF,4EAA4E;AAC5E,sEAAsE;AACtE,gFAAgF;AAEhF,oEAAoE;AACpE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,4EAA4E;AAC5E,sEAAsE;AACtE,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAE3F,MAAM,UAAU,eAAe;IAC7B,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAExD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,KAAK;QAEd,yEAAyE;QACzE,SAAS,CAAC,EAAU;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAEvD,4CAA4C;YAC5C,wDAAwD;YACxD,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,aAAa,EAAE,CAAC;gBAC3C,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,sCAAsC;YACtC,IAAI,EAAE,KAAK,cAAc,IAAI,EAAE,KAAK,eAAe,EAAE,CAAC;gBACpD,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,sCAAsC;YACtC,IAAI,EAAE,KAAK,cAAc,IAAI,EAAE,KAAK,eAAe,EAAE,CAAC;gBACpD,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,gDAAgD;QAClD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface OlovaHydrationData {
|
|
2
|
+
route: string;
|
|
3
|
+
metadata?: Record<string, unknown>;
|
|
4
|
+
params?: Record<string, string>;
|
|
5
|
+
chunks?: string[];
|
|
6
|
+
isStatic?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateOlovaHydration(data: OlovaHydrationData, buildId: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Generate JSON-LD structured data script for SEO
|
|
11
|
+
* This is injected into <head> for search engine crawlers
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateJsonLd(data: OlovaHydrationData): string;
|
|
14
|
+
/**
|
|
15
|
+
* Parse flight data from the page (client-side utility)
|
|
16
|
+
* Use this to access hydration data in your components
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseFlightData(): Record<string, unknown> | null;
|
|
19
|
+
//# sourceMappingURL=hydration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../hydration.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA+JxF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CA8B/D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAiChE"}
|