dtwo 3.0.0 → 3.1.0

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.
Files changed (61) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -2
  3. package/bin/dtwo.mjs +1 -1
  4. package/config.d.ts +1 -1
  5. package/dist/app/compat/idle-callback.d.ts +2 -0
  6. package/dist/app/compat/idle-callback.mjs +13 -0
  7. package/dist/app/components/dtwo-island.d.ts +33 -0
  8. package/dist/app/components/dtwo-island.mjs +62 -0
  9. package/dist/app/components/dtwo-link.d.ts +3 -3
  10. package/dist/app/components/dtwo-link.mjs +26 -28
  11. package/dist/app/components/dtwo-loading-indicator.d.ts +3 -3
  12. package/dist/app/components/dtwo-loading-indicator.mjs +8 -7
  13. package/dist/app/components/dtwo-root.kdu +10 -2
  14. package/dist/app/components/island-renderer.d.ts +20 -0
  15. package/dist/app/components/island-renderer.mjs +26 -0
  16. package/dist/app/components/layout.d.ts +1 -1
  17. package/dist/app/components/layout.mjs +12 -3
  18. package/dist/app/components/utils.mjs +1 -0
  19. package/dist/app/composables/asyncData.d.ts +4 -1
  20. package/dist/app/composables/asyncData.mjs +15 -2
  21. package/dist/app/composables/component.d.ts +1 -1
  22. package/dist/app/composables/cookie.d.ts +5 -4
  23. package/dist/app/composables/cookie.mjs +8 -2
  24. package/dist/app/composables/error.d.ts +1 -1
  25. package/dist/app/composables/fetch.d.ts +6 -6
  26. package/dist/app/composables/fetch.mjs +2 -1
  27. package/dist/app/composables/index.d.ts +2 -1
  28. package/dist/app/composables/index.mjs +2 -1
  29. package/dist/app/composables/ready.d.ts +1 -0
  30. package/dist/app/composables/ready.mjs +12 -0
  31. package/dist/app/composables/router.d.ts +1 -1
  32. package/dist/app/composables/router.mjs +5 -0
  33. package/dist/app/composables/ssr.d.ts +1 -1
  34. package/dist/app/config.mjs +1 -0
  35. package/dist/app/dtwo.d.ts +5 -4
  36. package/dist/app/plugins/cross-origin-prefetch.client.mjs +19 -14
  37. package/dist/app/plugins/router.mjs +13 -5
  38. package/dist/app/types/augments.d.ts +1 -1
  39. package/dist/components/runtime/server-component.d.ts +3 -0
  40. package/dist/components/runtime/server-component.mjs +87 -0
  41. package/dist/core/runtime/hole/renderer.d.ts +19 -0
  42. package/dist/core/runtime/hole/renderer.mjs +71 -9
  43. package/dist/head/runtime/components.d.ts +14 -14
  44. package/dist/head/runtime/components.mjs +12 -1
  45. package/dist/head/runtime/composables.d.ts +17 -0
  46. package/dist/head/runtime/composables.mjs +9 -0
  47. package/dist/head/runtime/lib/kduse-head.plugin.mjs +2 -1
  48. package/dist/index.mjs +298 -77
  49. package/dist/pages/runtime/composables.d.ts +1 -1
  50. package/dist/pages/runtime/page.d.ts +5 -1
  51. package/dist/pages/runtime/page.mjs +6 -3
  52. package/dist/pages/runtime/plugins/prefetch.client.mjs +36 -0
  53. package/dist/pages/runtime/{router.d.ts → plugins/router.d.ts} +1 -1
  54. package/dist/pages/runtime/{router.mjs → plugins/router.mjs} +11 -8
  55. package/dist/pages/runtime/utils.d.ts +1 -1
  56. package/dist/pages/runtime/utils.mjs +1 -1
  57. package/dist/pages/runtime/validate.mjs +4 -4
  58. package/package.json +51 -51
  59. package/types.d.ts +3 -0
  60. package/dist/head/runtime/lib/kdu-meta.plugin.mjs +0 -31
  61. /package/dist/{head/runtime/lib/kdu-meta.plugin.d.ts → pages/runtime/plugins/prefetch.client.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { KeepAliveProps, TransitionProps, UnwrapRef } from 'kdu';
1
+ import type { KeepAliveProps, TransitionProps, UnwrapRef } from 'kdu';
2
2
  import type { RouteLocationNormalized, RouteLocationNormalizedLoaded, RouteRecordRedirectOption } from 'kdu-router';
3
3
  import type { DtwoError } from '#app';
4
4
  export interface PageMeta {
@@ -1,12 +1,16 @@
1
- import type { DefineComponent } from 'kdu';
1
+ import type { DefineComponent, KeepAliveProps, TransitionProps } from 'kdu';
2
2
  declare const _default: DefineComponent<{
3
3
  [key: string]: any;
4
4
  name?: string | undefined;
5
+ transition?: boolean | TransitionProps | undefined;
6
+ keepalive?: boolean | KeepAliveProps | undefined;
5
7
  route?: any;
6
8
  pageKey?: string | ((route: RouteLocationNormalizedLoaded) => string) | undefined;
7
9
  }, {}, {}, import("kdu").ComputedOptions, import("kdu").MethodOptions, import("kdu").ComponentOptionsMixin, import("kdu").ComponentOptionsMixin, {}, string, import("kdu").KNodeProps & import("kdu").AllowedComponentProps & import("kdu").ComponentCustomProps, Readonly<import("kdu").ExtractPropTypes<{
8
10
  [key: string]: any;
9
11
  name?: string | undefined;
12
+ transition?: boolean | TransitionProps | undefined;
13
+ keepalive?: boolean | KeepAliveProps | undefined;
10
14
  route?: any;
11
15
  pageKey?: string | ((route: RouteLocationNormalizedLoaded) => string) | undefined;
12
16
  }>>, {
@@ -36,7 +36,7 @@ export default defineComponent({
36
36
  if (!routeProps.Component) {
37
37
  return;
38
38
  }
39
- const key = generateRouteKey(props.pageKey, routeProps);
39
+ const key = generateRouteKey(routeProps, props.pageKey);
40
40
  const done = dtwoApp.deferHydration();
41
41
  const hasTransition = !!(props.transition ?? routeProps.route.meta.pageTransition ?? defaultPageTransition);
42
42
  const transitionProps = hasTransition && _mergeTransitionProps([
@@ -57,7 +57,7 @@ export default defineComponent({
57
57
  onResolve: () => {
58
58
  nextTick(() => dtwoApp.callHook("page:finish", routeProps.Component).finally(done));
59
59
  }
60
- }, { default: () => h(Component, { key, routeProps, pageKey: key, hasTransition }) })
60
+ }, { default: () => h(RouteProvider, { key, routeProps, pageKey: key, hasTransition }) })
61
61
  )
62
62
  ).default();
63
63
  }
@@ -75,7 +75,10 @@ function _mergeTransitionProps(routeProps) {
75
75
  }));
76
76
  return defu(..._props);
77
77
  }
78
- const Component = defineComponent({
78
+ const RouteProvider = defineComponent({
79
+ name: "RouteProvider",
80
+ // TODO: Type props
81
+ // eslint-disable-next-line kdu/require-prop-types
79
82
  props: ["routeProps", "pageKey", "hasTransition"],
80
83
  setup(props) {
81
84
  const previousKey = props.pageKey;
@@ -0,0 +1,36 @@
1
+ import { hasProtocol } from "ufo";
2
+ import { defineDtwoPlugin, useDtwoApp, useRouter } from "#app";
3
+ import layouts from "#build/layouts";
4
+ import { namedMiddleware } from "#build/middleware";
5
+ export default defineDtwoPlugin(() => {
6
+ const dtwoApp = useDtwoApp();
7
+ const router = useRouter();
8
+ dtwoApp.hooks.hook("app:mounted", () => {
9
+ router.beforeEach(async (to) => {
10
+ const layout = to?.meta?.layout;
11
+ if (layout && typeof layouts[layout] === "function") {
12
+ await layouts[layout]();
13
+ }
14
+ });
15
+ });
16
+ dtwoApp.hooks.hook("link:prefetch", (url) => {
17
+ if (hasProtocol(url)) {
18
+ return;
19
+ }
20
+ const route = router.resolve(url);
21
+ if (!route) {
22
+ return;
23
+ }
24
+ const layout = route?.meta?.layout;
25
+ let middleware = Array.isArray(route?.meta?.middleware) ? route?.meta?.middleware : [route?.meta?.middleware];
26
+ middleware = middleware.filter((m) => typeof m === "string");
27
+ for (const name of middleware) {
28
+ if (typeof namedMiddleware[name] === "function") {
29
+ namedMiddleware[name]();
30
+ }
31
+ }
32
+ if (layout && typeof layouts[layout] === "function") {
33
+ layouts[layout]();
34
+ }
35
+ });
36
+ });
@@ -1,4 +1,4 @@
1
- import DtwoPage from './page';
1
+ import type DtwoPage from '../page';
2
2
  declare module '@kdujs/runtime-core' {
3
3
  interface GlobalComponents {
4
4
  DtwoPage: typeof DtwoPage;
@@ -1,4 +1,4 @@
1
- import { computed, reactive, shallowRef } from "kdu";
1
+ import { computed, isReadonly, reactive, shallowRef } from "kdu";
2
2
  import {
3
3
  createRouter,
4
4
  createWebHistory,
@@ -7,7 +7,7 @@ import {
7
7
  } from "kdu-router";
8
8
  import { createError } from "h3";
9
9
  import { withoutBase, isEqual } from "ufo";
10
- import { callWithDtwo, defineDtwoPlugin, useRuntimeConfig, showError, clearError, navigateTo, useError, useState } from "#app";
10
+ import { callWithDtwo, defineDtwoPlugin, useRuntimeConfig, showError, clearError, navigateTo, useError, useState, useRequestEvent } from "#app";
11
11
  import _routes from "#build/routes";
12
12
  import routerOptions from "#build/router.options";
13
13
  import { globalMiddleware, namedMiddleware } from "#build/middleware";
@@ -72,13 +72,13 @@ export default defineDtwoPlugin(async (dtwoApp) => {
72
72
  }
73
73
  await router.isReady();
74
74
  } catch (error2) {
75
- callWithDtwo(dtwoApp, showError, [error2]);
75
+ await callWithDtwo(dtwoApp, showError, [error2]);
76
76
  }
77
77
  const initialLayout = useState("_layout");
78
78
  router.beforeEach(async (to, from) => {
79
79
  to.meta = reactive(to.meta);
80
- if (dtwoApp.isHydrating) {
81
- to.meta.layout = initialLayout.value ?? to.meta.layout;
80
+ if (dtwoApp.isHydrating && initialLayout.value && !isReadonly(to.meta.layout)) {
81
+ to.meta.layout = initialLayout.value;
82
82
  }
83
83
  dtwoApp._processingMiddleware = true;
84
84
  const middlewareEntries = /* @__PURE__ */ new Set([...globalMiddleware, ...dtwoApp._middleware.global]);
@@ -125,7 +125,7 @@ export default defineDtwoPlugin(async (dtwoApp) => {
125
125
  await callWithDtwo(dtwoApp, clearError);
126
126
  }
127
127
  if (to.matched.length === 0) {
128
- callWithDtwo(dtwoApp, showError, [createError({
128
+ await callWithDtwo(dtwoApp, showError, [createError({
129
129
  statusCode: 404,
130
130
  fatal: false,
131
131
  statusMessage: `Page not found: ${to.fullPath}`
@@ -133,7 +133,9 @@ export default defineDtwoPlugin(async (dtwoApp) => {
133
133
  } else if (process.server) {
134
134
  const currentURL = to.fullPath || "/";
135
135
  if (!isEqual(currentURL, initialURL)) {
136
- await callWithDtwo(dtwoApp, navigateTo, [currentURL]);
136
+ const event = await callWithDtwo(dtwoApp, useRequestEvent);
137
+ const options = { redirectCode: event.node.res.statusCode !== 200 ? event.node.res.statusCode || 302 : 302 };
138
+ await callWithDtwo(dtwoApp, navigateTo, [currentURL, options]);
137
139
  }
138
140
  }
139
141
  });
@@ -142,10 +144,11 @@ export default defineDtwoPlugin(async (dtwoApp) => {
142
144
  await router.replace({
143
145
  ...router.resolve(initialURL),
144
146
  name: void 0,
147
+ // #4920, #$4982
145
148
  force: true
146
149
  });
147
150
  } catch (error2) {
148
- callWithDtwo(dtwoApp, showError, [error2]);
151
+ await callWithDtwo(dtwoApp, showError, [error2]);
149
152
  }
150
153
  });
151
154
  return { provide: { router } };
@@ -2,7 +2,7 @@ import type { RouterView, RouteLocationNormalizedLoaded } from 'kdu-router';
2
2
  type InstanceOf<T> = T extends new (...args: any[]) => infer R ? R : never;
3
3
  type RouterViewSlot = Exclude<InstanceOf<typeof RouterView>['$slots']['default'], undefined>;
4
4
  export type RouterViewSlotProps = Parameters<RouterViewSlot>[0];
5
- export declare const generateRouteKey: (override: string | ((route: RouteLocationNormalizedLoaded) => string), routeProps: RouterViewSlotProps) => string;
5
+ export declare const generateRouteKey: (routeProps: RouterViewSlotProps, override?: string | ((route: RouteLocationNormalizedLoaded) => string) | undefined) => any;
6
6
  export declare const wrapInKeepAlive: (props: any, children: any) => {
7
7
  default: () => any;
8
8
  };
@@ -2,7 +2,7 @@ import { KeepAlive, h } from "kdu";
2
2
  const interpolatePath = (route, match) => {
3
3
  return match.path.replace(/(:\w+)\([^)]+\)/g, "$1").replace(/(:\w+)[?+*]/g, "$1").replace(/:\w+/g, (r) => route.params[r.slice(1)]?.toString() || "");
4
4
  };
5
- export const generateRouteKey = (override, routeProps) => {
5
+ export const generateRouteKey = (routeProps, override) => {
6
6
  const matchedRoute = routeProps.route.matched.find((m) => m.components?.default === routeProps.Component.type);
7
7
  const source = override ?? matchedRoute?.meta.key ?? (matchedRoute && interpolatePath(routeProps.route, matchedRoute));
8
8
  return typeof source === "function" ? source(routeProps.route) : source;
@@ -1,11 +1,11 @@
1
- import { createError, defineDtwoRouteMiddleware } from "#app";
1
+ import { defineDtwoRouteMiddleware } from "#app";
2
2
  export default defineDtwoRouteMiddleware(async (to) => {
3
3
  if (!to.meta?.validate) {
4
4
  return;
5
5
  }
6
6
  const result = await Promise.resolve(to.meta.validate(to));
7
- if (typeof result === "boolean") {
8
- return result;
7
+ if (result === true) {
8
+ return;
9
9
  }
10
- return createError(result);
10
+ return result;
11
11
  });
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "dtwo",
3
- "version": "3.0.0",
4
- "repository": "d2js/framework",
3
+ "version": "3.1.0",
4
+ "repository": "d2js/dtwo",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./dist/index.mjs",
8
8
  "types": "./types.d.ts",
9
9
  "bin": {
10
- "dcli": "./bin/dtwo.mjs",
10
+ "dtwc": "./bin/dtwo.mjs",
11
11
  "dtwo": "./bin/dtwo.mjs"
12
12
  },
13
13
  "exports": {
@@ -33,56 +33,56 @@
33
33
  "config.*"
34
34
  ],
35
35
  "dependencies": {
36
- "@d2js/devalue": "^2.0.2",
37
- "@dtwo/cli": "3.0.0",
38
- "@dtwo/kit": "3.0.0",
39
- "@dtwo/schema": "3.0.0",
40
- "@dtwo/telemetry": "^2.1.8",
41
- "@dtwo/ui-templates": "^1.0.0",
42
- "@dtwo/unplugin": "^1.0.0",
43
- "@dtwo/wite-builder": "3.0.0",
44
- "@kdhead/ssr": "^1.0.0",
45
- "@kdujs/reactivity": "^3.2.45",
46
- "@kdujs/shared": "^3.2.45",
47
- "@kduse/head": "^1.0.15",
48
- "chokidar": "^3.5.3",
49
- "cookie-es": "^0.5.0",
50
- "defu": "^6.1.1",
51
- "destr": "^1.2.1",
52
- "escape-string-regexp": "^5.0.0",
53
- "estree-walker": "^3.0.1",
54
- "fs-extra": "^10.1.0",
55
- "globby": "^13.1.2",
56
- "h3": "^1.0.1",
57
- "hash-sum": "^2.0.0",
58
- "holepack": "^1.0.0",
59
- "hookable": "^5.4.2",
60
- "kdhead": "^1.0.0",
61
- "kdimport": "^1.0.0",
62
- "kdu": "^3.2.45",
63
- "kdu-bundle-renderer": "^1.0.0",
64
- "kdu-devtools-stub": "^0.1.0",
65
- "kdu-router": "^4.1.6",
66
- "knitwork": "^1.0.0",
67
- "magic-string": "^0.26.7",
68
- "mlly": "^1.0.0",
69
- "ohash": "^1.0.0",
70
- "ofetch": "^1.0.0",
71
- "pathe": "^1.0.0",
72
- "perfect-debounce": "^0.1.3",
73
- "scule": "^1.0.0",
74
- "strip-literal": "^1.0.0",
75
- "ufo": "^1.0.0",
76
- "ultrahtml": "^1.0.0",
77
- "unctx": "^2.1.0",
78
- "unenv": "^1.0.0",
79
- "untyped": "^1.0.0"
36
+ "@d2js/devalue": "2.0.2",
37
+ "@dtwo/kit": "3.1.0",
38
+ "@dtwo/schema": "3.1.0",
39
+ "@dtwo/telemetry": "2.1.8",
40
+ "@dtwo/ui-templates": "1.1.0",
41
+ "@dtwo/unplugin": "1.0.0",
42
+ "@dtwo/wite-builder": "3.1.0",
43
+ "@kdhead/ssr": "1.0.19",
44
+ "@kdujs/reactivity": "3.2.45",
45
+ "@kdujs/shared": "3.2.45",
46
+ "@kduse/head": "1.0.15",
47
+ "chokidar": "3.5.3",
48
+ "cookie-es": "0.5.0",
49
+ "defu": "6.1.1",
50
+ "destr": "1.2.2",
51
+ "dtwc": "3.1.0",
52
+ "escape-string-regexp": "5.0.0",
53
+ "estree-walker": "3.0.3",
54
+ "fs-extra": "11.1.0",
55
+ "globby": "13.1.3",
56
+ "h3": "1.0.2",
57
+ "hash-sum": "2.0.0",
58
+ "holepack": "2.0.0",
59
+ "hookable": "5.4.2",
60
+ "jiti": "1.16.2",
61
+ "kdhead": "1.0.19",
62
+ "kdimport": "2.0.1",
63
+ "kdu": "3.2.45",
64
+ "kdu-bundle-renderer": "1.0.0",
65
+ "kdu-devtools-stub": "0.1.0",
66
+ "kdu-router": "4.1.6",
67
+ "knitwork": "1.0.0",
68
+ "magic-string": "0.27.0",
69
+ "mlly": "1.1.0",
70
+ "ofetch": "1.0.0",
71
+ "ohash": "1.0.0",
72
+ "pathe": "1.0.0",
73
+ "perfect-debounce": "0.1.3",
74
+ "scule": "1.0.0",
75
+ "strip-literal": "1.0.0",
76
+ "ufo": "1.0.1",
77
+ "ultrahtml": "1.2.0",
78
+ "unctx": "2.1.1",
79
+ "unenv": "1.0.1",
80
+ "untyped": "1.2.2"
80
81
  },
81
82
  "devDependencies": {
82
- "@types/fs-extra": "^9.0.13",
83
- "@types/hash-sum": "^1.0.0",
84
- "kdu-meta": "next",
85
- "unbuild": "latest"
83
+ "@types/fs-extra": "11.0.1",
84
+ "@types/hash-sum": "1.0.0",
85
+ "unbuild": "1.1.1"
86
86
  },
87
87
  "engines": {
88
88
  "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
package/types.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  /// <reference types="holepack" />
2
2
  export * from './dist/index'
3
3
 
4
+ import type { Schema, SchemaDefinition } from '@dtwo/schema'
5
+
4
6
  declare global {
5
7
  const defineDtwoConfig: typeof import('dtwo/config')['defineDtwoConfig']
8
+ const defineDtwoSchema: (schema: SchemaDefinition) => SchemaDefinition
6
9
  }
7
10
 
8
11
  declare module 'holepack' {
@@ -1,31 +0,0 @@
1
- import { createApp } from "kdu";
2
- import { createMetaManager } from "kdu-meta";
3
- import { defineDtwoPlugin } from "#app";
4
- import { appHead } from "#build/dtwo.config.mjs";
5
- export default defineDtwoPlugin((dtwoApp) => {
6
- const manager = createMetaManager(process.server);
7
- manager.addMeta(appHead);
8
- dtwoApp.kduApp.use(manager);
9
- dtwoApp._useHead = (meta) => manager.addMeta(meta);
10
- if (process.client) {
11
- const teleportTarget = document.createElement("div");
12
- teleportTarget.id = "head-target";
13
- document.body.appendChild(teleportTarget);
14
- createApp({ render: () => manager.render({}) }).mount("#head-target");
15
- }
16
- if (process.server) {
17
- dtwoApp.ssrContext.renderMeta = async () => {
18
- const { renderMetaToString } = await import("kdu-meta/ssr");
19
- dtwoApp.ssrContext.teleports = dtwoApp.ssrContext.teleports || {};
20
- await renderMetaToString(dtwoApp.app, dtwoApp.ssrContext);
21
- return {
22
- htmlAttrs: dtwoApp.ssrContext.teleports.htmlAttrs || "",
23
- headAttrs: dtwoApp.ssrContext.teleports.headAttrs || "",
24
- bodyAttrs: dtwoApp.ssrContext.teleports.bodyAttrs || "",
25
- headTags: dtwoApp.ssrContext.teleports.head || "",
26
- bodyScriptsPrepend: dtwoApp.ssrContext.teleports["body-prepend"] || "",
27
- bodyScripts: dtwoApp.ssrContext.teleports.body || ""
28
- };
29
- };
30
- }
31
- });