@sleetch/server 1.0.9 → 1.0.10

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 (2) hide show
  1. package/dist/index.js +54 -11
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -1,21 +1,64 @@
1
+ import module, { createRequire } from "node:module";
1
2
  import { clean_path } from "@sleetch/client";
2
3
  import { resolve_language, to_flat_tree } from "@sleetch/core/compiler";
4
+ import process from "node:process";
3
5
  //#region src/utils/manifest.ts
4
- const isBareESM = typeof module === "undefined" && typeof import.meta !== "undefined" && typeof process !== "undefined" && (!import.meta.env || !import.meta.env.DEV && !import.meta.env.PROD);
5
- const dynamic_import = new Function("specifier", "return import(specifier)");
6
- const get_manifest = async () => {
7
- if (isBareESM) {
8
- const { default: manifest } = await dynamic_import(`@sleetch/client/manifest-cache-bust?t=${Date.now()}`);
9
- return manifest;
6
+ const native_import = new Function("u", "return import(u)");
7
+ let counter = 0;
8
+ const next_version = () => `${Date.now()}-${counter++}`;
9
+ const VITE = Symbol.for("sleetch.vite_server");
10
+ const PARAM = "fresh";
11
+ let hooks_on = false;
12
+ const enable_deep_fresh = () => {
13
+ if (hooks_on || process.versions.bun || !module.registerHooks) return;
14
+ module.registerHooks({ resolve(specifier, context, next) {
15
+ const resolved = next(specifier, context);
16
+ if (!context.parentURL) return resolved;
17
+ if (!resolved.url.startsWith("file:")) return resolved;
18
+ if (resolved.url.includes("/node_modules/")) return resolved;
19
+ const v = new URL(context.parentURL).searchParams.get(PARAM);
20
+ if (!v) return resolved;
21
+ const url = new URL(resolved.url);
22
+ url.searchParams.set(PARAM, v);
23
+ return {
24
+ ...resolved,
25
+ url: url.href
26
+ };
27
+ } });
28
+ hooks_on = true;
29
+ };
30
+ const clear_require_cache = (root) => {
31
+ const cache = createRequire(import.meta.url).cache;
32
+ for (const key of Object.keys(cache)) if (key.startsWith(root) && !key.includes("node_modules")) delete cache[key];
33
+ };
34
+ const is_next = () => !!process.env.NEXT_RUNTIME;
35
+ const can_native_resolve = () => {
36
+ try {
37
+ return typeof import.meta.resolve === "function";
38
+ } catch {
39
+ return false;
40
+ }
41
+ };
42
+ const get_manifest = async ({ fresh = false, root } = {}) => {
43
+ const static_manifest = async () => (await import("@sleetch/client/manifest")).default;
44
+ if (!fresh) return static_manifest();
45
+ const vite = globalThis[VITE];
46
+ if (vite) {
47
+ vite.moduleGraph.invalidateAll();
48
+ return (await vite.ssrLoadModule("@sleetch/client/manifest")).default;
10
49
  }
11
- const { default: manifest } = await import("@sleetch/client/manifest");
12
- return manifest;
50
+ if (is_next() || !can_native_resolve()) return static_manifest();
51
+ enable_deep_fresh();
52
+ if (root) clear_require_cache(root);
53
+ const v = next_version();
54
+ const url = import.meta.resolve("@sleetch/client/manifest-cache-bust");
55
+ return (await native_import(`${url}?${PARAM}=${v}`)).create_manifest(v);
13
56
  };
14
57
  //#endregion
15
58
  //#region src/utils/tree.ts
16
59
  const get_tree = async (_language) => {
17
60
  const language = resolve_language(_language);
18
- const { default: tree } = await (await get_manifest())[language].tree();
61
+ const { default: tree } = await (await get_manifest({ fresh: true }))[language].tree();
19
62
  return {
20
63
  tree,
21
64
  language
@@ -32,14 +75,14 @@ const get_static_paths = async (transformer, _language) => {
32
75
  };
33
76
  };
34
77
  const get_languages = async () => {
35
- return (await get_manifest()).languages;
78
+ return (await get_manifest({ fresh: true })).languages;
36
79
  };
37
80
  //#endregion
38
81
  //#region src/utils/pages.ts
39
82
  const get_page = async (_path, _language) => {
40
83
  _path = clean_path(_path);
41
84
  const language = resolve_language(_language);
42
- const manifest = await get_manifest();
85
+ const manifest = await get_manifest({ fresh: true });
43
86
  for (const path of Object.keys(manifest[language].pages)) if (path === _path) {
44
87
  const { default: page } = await manifest[language].pages[path]();
45
88
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleetch/server",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -13,11 +13,11 @@
13
13
  "dev": "tsdown --watch"
14
14
  },
15
15
  "dependencies": {
16
- "@sleetch/core": "1.0.9",
17
- "@sleetch/client": "1.0.9"
16
+ "@sleetch/core": "1.0.10",
17
+ "@sleetch/client": "1.0.10"
18
18
  },
19
19
  "peerDependencies": {
20
- "@sleetch/client": "1.0.9"
20
+ "@sleetch/client": "1.0.10"
21
21
  },
22
22
  "exports": {
23
23
  ".": "./dist/index.js",