@absolutejs/absolute 0.19.0-beta.847 → 0.19.0-beta.849

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.
@@ -37,7 +37,7 @@ export declare const compileEmberFileSource: (entry: string) => Promise<string>;
37
37
  * lives in `compileEmber` itself, not in a separate cache layer.
38
38
  */
39
39
  export declare const clearEmberCompilerCache: () => void;
40
- export declare const getEmberCompiledRoot: (emberDir: string) => string;
40
+ export declare const getEmberCompiledRoot: (_emberDir?: string) => string;
41
41
  export declare const getEmberServerCompiledDir: (emberDir: string) => string;
42
42
  export declare const getEmberClientCompiledDir: (emberDir: string) => string;
43
43
  export { dirname, basename };
@@ -0,0 +1,39 @@
1
+ import { type ReactNode } from 'react';
2
+ export type UniversalRouterProps = {
3
+ /** The request URL to seed `<StaticRouter>` with on the server. Pages
4
+ * typically forward `props.url` (auto-injected by handleReactPageRequest
5
+ * from `request.url`). Ignored in the browser, where `<BrowserRouter>`
6
+ * reads `window.location` directly. Defaults to '/'. */
7
+ url?: string;
8
+ children?: ReactNode;
9
+ };
10
+ /** SSR-safe wrapper around react-router that picks `<StaticRouter>` on the
11
+ * server and `<BrowserRouter>` in the browser. Without it, every SPA page
12
+ * has to write its own `typeof window === 'undefined'` branch and import
13
+ * both routers — boilerplate that's the same in every page.
14
+ *
15
+ * Usage:
16
+ *
17
+ * export const MySpa = ({ url }: { url?: string }) => (
18
+ * <html>
19
+ * <Head />
20
+ * <body>
21
+ * <UniversalRouter url={url}>
22
+ * <Routes>
23
+ * <Route path="/foo" element={<Foo />} />
24
+ * </Routes>
25
+ * </UniversalRouter>
26
+ * </body>
27
+ * </html>
28
+ * );
29
+ *
30
+ * Implementation note: `<BrowserRouter>` reads `window.history` at
31
+ * construction, so it throws if instantiated on the server. The
32
+ * `typeof window` check has to live at render time (not import time)
33
+ * because the module is loaded in both environments — only the
34
+ * unselected branch's JSX is what the check skips. */
35
+ export declare const UniversalRouter: ({ url, children }: UniversalRouterProps) => import("react").CElement<{}, import("react").Component<{}, any, any>> | import("react").CElement<{
36
+ location: string;
37
+ }, import("react").Component<{
38
+ location: string;
39
+ }, any, any>>;
@@ -1,3 +1,5 @@
1
1
  export { Island } from './Island.browser';
2
2
  export { createTypedIsland } from './createIsland.browser';
3
+ export { UniversalRouter } from './UniversalRouter';
4
+ export type { UniversalRouterProps } from './UniversalRouter';
3
5
  export { useIslandStore } from './hooks/useIslandStore';
@@ -1,4 +1,6 @@
1
1
  export { handleReactPageRequest } from './pageHandler';
2
2
  export { Island } from './Island';
3
3
  export { createTypedIsland } from './createIsland';
4
+ export { UniversalRouter } from './UniversalRouter';
5
+ export type { UniversalRouterProps } from './UniversalRouter';
4
6
  export { useIslandStore } from './hooks/useIslandStore';
@@ -0,0 +1,3 @@
1
+ export type GeneratedFramework = 'angular' | 'vue' | 'svelte' | 'react' | 'ember';
2
+ export declare const getGeneratedRoot: (projectRoot?: string) => string;
3
+ export declare const getFrameworkGeneratedDir: (framework: GeneratedFramework, projectRoot?: string) => string;
@@ -1,5 +1,5 @@
1
1
  export { Island } from './Island.browser';
2
2
  export { createTypedIsland } from './createIsland.browser';
3
3
  export { useIslandStore } from './useIslandStore';
4
- export { defineVueSetupApp } from './defineVuePage';
5
- export type { VueAutoRouter, VueSetupApp, VueSetupAppContext } from '../../types/vue';
4
+ export { defineRoutes, defineVueSetupApp } from './defineVuePage';
5
+ export type { VueAutoRouter, VueRouteRecord, VueRoutes, VueSetupApp, VueSetupAppContext } from '../../types/vue';
@@ -1,5 +1,16 @@
1
- import type { VueSetupApp } from '../../types/vue';
1
+ import type { VueRoutes, VueSetupApp } from '../../types/vue';
2
2
  /** Identity helper that types a Vue page's `setupApp` export without
3
3
  * forcing the user to `import type { VueSetupApp }` every time. Use as
4
4
  * `export const setupApp = defineVueSetupApp(async (app, ctx) => { ... });` */
5
5
  export declare const defineVueSetupApp: (hook: VueSetupApp) => VueSetupApp;
6
+ /** Identity helper that signals — to humans and to TypeScript — that a
7
+ * Vue page's `routes` export is the input to AbsoluteJS's auto-generated
8
+ * vue-router. Without this, `export const routes = [...]` reads as an
9
+ * ordinary const that nobody references locally; the import + call make
10
+ * the contract explicit (mirroring Vue's `defineProps` convention).
11
+ *
12
+ * At runtime this is identity (`(routes) => routes`); the actual
13
+ * router-creation code lives in the compile-time transform applied to
14
+ * the page's `<script>` block. Use as
15
+ * `export const routes = defineRoutes([{ path: '/foo', component: Foo }]);` */
16
+ export declare const defineRoutes: <T extends VueRoutes>(routes: T) => T;
@@ -1,7 +1,7 @@
1
1
  export { handleVuePageRequest } from './pageHandler';
2
2
  export { applyVueRouterRedirect } from './routerRedirectProviders';
3
- export { defineVueSetupApp } from './defineVuePage';
4
- export type { VueAutoRouter, VueSetupApp, VueSetupAppContext } from '../../types/vue';
3
+ export { defineRoutes, defineVueSetupApp } from './defineVuePage';
4
+ export type { VueAutoRouter, VueRouteRecord, VueRoutes, VueSetupApp, VueSetupAppContext } from '../../types/vue';
5
5
  export { Island } from './Island';
6
6
  export { createTypedIsland } from './createIsland';
7
7
  export { useIslandStore } from './useIslandStore';
@@ -749,12 +749,42 @@ ${contents}` : contents, normalizePostcssModule = (mod) => {
749
749
  code: await compileStyleSource(path, content, language, config)
750
750
  };
751
751
  }
752
- }), compileStyleFileIfNeeded = async (filePath, config) => {
752
+ }), CSS_IMPORT_PATTERN, resolveCssImportsAsync = async (content, baseDir, visited) => {
753
+ const matches = Array.from(content.matchAll(CSS_IMPORT_PATTERN));
754
+ if (matches.length === 0)
755
+ return content;
756
+ let cursor = 0;
757
+ const parts = [];
758
+ for (const match of matches) {
759
+ const importPath = match[1];
760
+ if (importPath === undefined)
761
+ continue;
762
+ const start = match.index ?? 0;
763
+ const end = start + match[0].length;
764
+ parts.push(content.slice(cursor, start));
765
+ const fullPath = isAbsolute(importPath) ? importPath : resolve2(baseDir, importPath);
766
+ if (visited.has(fullPath) || !existsSync2(fullPath)) {
767
+ parts.push(visited.has(fullPath) ? "" : match[0]);
768
+ cursor = end;
769
+ continue;
770
+ }
771
+ const nextVisited = new Set(visited);
772
+ nextVisited.add(fullPath);
773
+ const imported = await readFile(fullPath, "utf-8");
774
+ parts.push(await resolveCssImportsAsync(imported, dirname(fullPath), nextVisited));
775
+ cursor = end;
776
+ }
777
+ parts.push(content.slice(cursor));
778
+ return parts.join("");
779
+ }, compileStyleFileIfNeeded = async (filePath, config) => {
753
780
  if (!isPreprocessableStylePath(filePath)) {
754
- return runPostcss(await readFile(filePath, "utf-8"), filePath, config);
781
+ const raw = await readFile(filePath, "utf-8");
782
+ const processed = await runPostcss(raw, filePath, config);
783
+ return resolveCssImportsAsync(processed, dirname(filePath), new Set([filePath]));
755
784
  }
756
- return compileStyleSource(filePath, undefined, undefined, config);
757
- }, CSS_IMPORT_PATTERN, resolveCssImportsSync = (content, baseDir, visited) => {
785
+ const compiled = await compileStyleSource(filePath, undefined, undefined, config);
786
+ return resolveCssImportsAsync(compiled, dirname(filePath), new Set([filePath]));
787
+ }, resolveCssImportsSync = (content, baseDir, visited) => {
758
788
  return content.replace(CSS_IMPORT_PATTERN, (match, importPath) => {
759
789
  const fullPath = isAbsolute(importPath) ? importPath : resolve2(baseDir, importPath);
760
790
  if (visited.has(fullPath))
@@ -3786,5 +3816,5 @@ export {
3786
3816
  createTypedIsland
3787
3817
  };
3788
3818
 
3789
- //# debugId=E4D8E2ADF4965B6964756E2164756E21
3819
+ //# debugId=56694EE8B35B170664756E2164756E21
3790
3820
  //# sourceMappingURL=index.js.map