solidstep 0.1.3 → 0.1.5

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
@@ -48,6 +48,7 @@ Configure your app in `app.config.ts`:
48
48
 
49
49
  ```tsx
50
50
  import { defineConfig } from 'solidstep';
51
+ import tailwindcss from '@tailwindcss/vite';
51
52
 
52
53
  export default defineConfig({
53
54
  server: {
@@ -55,13 +56,53 @@ export default defineConfig({
55
56
  },
56
57
  plugins: [
57
58
  {
58
- type: 'both',
59
- plugin: myVitePlugin(),
60
- },
59
+ type: 'client', // or 'server' or 'both' - depends on where you want to use the plugin
60
+ plugin: tailwindcss()
61
+ }
61
62
  ],
62
63
  });
63
64
  ```
64
65
 
66
+ #### Vite Configuration
67
+
68
+ You can customize Vite settings for both client and server builds.
69
+
70
+ __When trying to configure absolute path imports__
71
+ 1. Add the path alias in tsconfig.json (for TypeScript support):
72
+ ```json
73
+ {
74
+ "compilerOptions": {
75
+ "baseUrl": ".",
76
+ "paths": {
77
+ "@/*": ["./*"]
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ 2. Then add the same alias in the Vite config inside `app.config.ts` to ensure it works during build and runtime:
84
+ ```tsx
85
+ import { defineConfig } from 'solidstep';
86
+ import { resolve } from 'node:path';
87
+ import { dirname } from 'node:path';
88
+ import { fileURLToPath } from 'node:url';
89
+
90
+ const __dirname = dirname(fileURLToPath(import.meta.url));
91
+
92
+ export default defineConfig({
93
+ server: {
94
+ preset: 'node',
95
+ },
96
+ vite: {
97
+ resolve: {
98
+ alias: {
99
+ '@': resolve(__dirname, '.'),
100
+ },
101
+ },
102
+ },
103
+ });
104
+ ```
105
+
65
106
  ### Project Structure
66
107
 
67
108
  ```
@@ -169,15 +210,13 @@ export default function RootLayout(props: {
169
210
  slots: { graph1: any; graph2: any; };
170
211
  }) {
171
212
  return (
172
- <div>
173
- <main>
174
- {props.children()}
175
- <aside>
176
- <div>{props.slots.graph1()}</div>
177
- <div>{props.slots.graph2()}</div>
178
- </aside>
179
- </main>
180
- </div>
213
+ <main>
214
+ {props.children()}
215
+ <aside>
216
+ <div>{props.slots.graph1()}</div>
217
+ <div>{props.slots.graph2()}</div>
218
+ </aside>
219
+ </main>
181
220
  );
182
221
  }
183
222
  ```
@@ -323,7 +362,7 @@ Configure page-level caching:
323
362
  ```tsx
324
363
  export const options = {
325
364
  cache: {
326
- ttl: 60000,
365
+ ttl: 60000, // Cache for 60 seconds
327
366
  },
328
367
  };
329
368
  ```
@@ -350,6 +389,21 @@ export async function POST(request: Request) {
350
389
  }
351
390
  ```
352
391
 
392
+ ## Server Assets
393
+ Serve static files from the `server-assets/` directory:
394
+
395
+ ```my-app/
396
+ ├── server-assets/
397
+ │ └── secret.txt
398
+ ```
399
+
400
+ Access via `my-app/server-assets/secret.txt` URL:
401
+
402
+ ```ts
403
+ const TEMPLATE_PATH = join(process.cwd(), 'server-assets', 'templates', 'template.ejs');
404
+ const template = await fs.promises.readFile(TEMPLATE_PATH, 'utf-8');
405
+ ```
406
+
353
407
  ## Utilities
354
408
 
355
409
  ### Cookies
@@ -400,7 +454,7 @@ const corsHeaders = corsMiddleware(origin, event.node.req.method === 'OPTIONS');
400
454
 
401
455
  ### CSP
402
456
  ```tsx
403
- import { createBasePolicy, serializePolicy, withNonce } from '@varlabs/solidstep/utils/csp';
457
+ import { createBasePolicy, serializePolicy, withNonce } from 'solidstep/utils/csp';
404
458
 
405
459
  let cspPolicy = createBasePolicy();
406
460
 
@@ -417,7 +471,7 @@ event.response.headers.set('Content-Security-Policy', serializePolicy(cspPolicy)
417
471
 
418
472
  ### CSRF Protection
419
473
  ```tsx
420
- import { csrf } from '@varlabs/solidstep/utils/csrf';
474
+ import { csrf } from 'solidstep/utils/csrf';
421
475
 
422
476
  const trustedOrigins = ['https://example.com', 'https://another-example.com'];
423
477
 
@@ -539,7 +593,7 @@ export default defineConfig({
539
593
  logger: {
540
594
  level: 'info',
541
595
  transport: {
542
- target: 'pino-pretty',
596
+ target: 'pino-pretty', // Use pino-pretty for human-readable logs
543
597
  options: {
544
598
  colorize: true
545
599
  }
package/index.d.ts CHANGED
@@ -1,5 +1,11 @@
1
1
  import type { AppOptions } from 'vinxi';
2
2
  import type { LoggerOptions } from 'pino';
3
+ import type { CustomizableConfig } from 'vinxi/dist/types/lib/vite-dev';
4
+ import type { InlineConfig } from 'vite';
5
+ type VinxiViteServerOptions = Omit<InlineConfig["server"], "port" | "strictPort" | "host" | "middlewareMode" | "open">;
6
+ type ViteCustomizableConfig = CustomizableConfig & {
7
+ server?: VinxiViteServerOptions;
8
+ };
3
9
  type Config = {
4
10
  server?: Omit<AppOptions['server'], 'experimental'>;
5
11
  plugins?: {
@@ -7,6 +13,9 @@ type Config = {
7
13
  plugin: any;
8
14
  }[];
9
15
  logger?: true | LoggerOptions;
16
+ vite?: ViteCustomizableConfig | ((options: {
17
+ router: 'server' | 'client';
18
+ }) => ViteCustomizableConfig);
10
19
  };
11
20
  export declare const defineConfig: (config?: Config) => import("vinxi").App;
12
21
  export {};
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAUxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE1C,KAAK,MAAM,GAAG;IACV,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE;QACN,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC;KACf,EAAE,CAAC;IACJ,MAAM,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,SAAQ,MAGpC,wBA4GA,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAUxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAGzC,KAAK,sBAAsB,GAAG,IAAI,CAC9B,YAAY,CAAC,QAAQ,CAAC,EACtB,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAC7D,CAAC;AAEF,KAAK,sBAAsB,GAAG,kBAAkB,GAAG;IAC/C,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACnC,CAAC;AAEF,KAAK,MAAM,GAAG;IACV,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE;QACN,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC;KACf,EAAE,CAAC;IACJ,MAAM,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC;IAC9B,IAAI,CAAC,EACC,sBAAsB,GACtB,CAAC,CAAC,OAAO,EAAE;QACT,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC/B,KAAK,sBAAsB,CAAC,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,SAAQ,MAIpC,wBAsHA,CAAC"}
package/index.js CHANGED
@@ -7,9 +7,11 @@ import { join } from 'node:path';
7
7
  import { fileURLToPath } from 'node:url';
8
8
  import { cpSync, mkdirSync, existsSync, writeFileSync } from 'node:fs';
9
9
  import { normalize } from 'vinxi/lib/path';
10
+ import { config as viteConfigPlugin } from 'vinxi/plugins/config';
10
11
  export const defineConfig = (config = {
11
12
  server: {},
12
13
  plugins: [],
14
+ vite: {},
13
15
  }) => {
14
16
  let middlewarePath = join(process.cwd(), 'app', 'middleware.ts');
15
17
  if (!existsSync(middlewarePath)) {
@@ -20,6 +22,9 @@ export const defineConfig = (config = {
20
22
  };
21
23
  // @ts-ignore
22
24
  globalThis.__SOLIDSTEP_CONFIG__ = sharedConfig;
25
+ const viteConfig = typeof config.vite === 'function'
26
+ ? config.vite
27
+ : () => config.vite || {};
23
28
  const app = createApp({
24
29
  server: {
25
30
  ...config.server,
@@ -47,6 +52,9 @@ export const defineConfig = (config = {
47
52
  runtime: normalize(fileURLToPath(new URL('./utils/server-action.client.js', import.meta.url))),
48
53
  }),
49
54
  solid({ ssr: true }),
55
+ viteConfigPlugin('app-client', {
56
+ ...(viteConfig({ router: 'client' }) || {}),
57
+ }),
50
58
  ],
51
59
  base: '/_build',
52
60
  routes: (router, app) => {
@@ -68,6 +76,9 @@ export const defineConfig = (config = {
68
76
  .map(p => p.plugin) || []),
69
77
  serverFunctions.server(),
70
78
  solid({ ssr: true }),
79
+ viteConfigPlugin('app-server', {
80
+ ...(viteConfig({ router: 'server' }) || {}),
81
+ }),
71
82
  ],
72
83
  middleware: './app/middleware.ts',
73
84
  routes: (router, app) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solidstep",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Next Step SolidJS Framework for building web applications.",
5
5
  "type": "module",
6
6
  "author": "HamzaKV <hamzakv333@gmail.com>",
package/server.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAygBA,QAAA,MAAM,OAAO,+FA+TX,CAAC;AAEH,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAygBA,QAAA,MAAM,OAAO,+FAqUX,CAAC;AAEH,eAAe,OAAO,CAAC"}
package/server.js CHANGED
@@ -577,7 +577,8 @@ const handler = eventHandler(async (event) => {
577
577
  }
578
578
  }
579
579
  catch (e1) {
580
- if (e1 instanceof RedirectError) {
580
+ if (e1 instanceof RedirectError ||
581
+ e1.name === 'RedirectError') {
581
582
  throw e1;
582
583
  }
583
584
  try {
@@ -662,7 +663,8 @@ const handler = eventHandler(async (event) => {
662
663
  return res.end(transformHtml);
663
664
  }
664
665
  catch (e) {
665
- if (e instanceof RedirectError) {
666
+ if (e instanceof RedirectError ||
667
+ e.name === 'RedirectError') {
666
668
  res.statusCode = 302;
667
669
  res.setHeader('Location', e.message);
668
670
  return res.end('Redirecting...');