@mandujs/core 0.13.0 → 0.13.1
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.ko.md +4 -4
- package/README.md +653 -653
- package/package.json +1 -1
- package/src/bundler/build.ts +91 -91
- package/src/bundler/css.ts +302 -302
- package/src/client/Link.tsx +227 -227
- package/src/client/globals.ts +44 -44
- package/src/client/hooks.ts +267 -267
- package/src/client/index.ts +5 -5
- package/src/client/island.ts +8 -8
- package/src/client/router.ts +435 -435
- package/src/client/runtime.ts +23 -23
- package/src/client/serialize.ts +404 -404
- package/src/client/window-state.ts +101 -101
- package/src/config/mandu.ts +9 -0
- package/src/config/validate.ts +12 -0
- package/src/config/watcher.ts +311 -311
- package/src/constants.ts +40 -40
- package/src/content/content-layer.ts +314 -314
- package/src/content/content.test.ts +433 -433
- package/src/content/data-store.ts +245 -245
- package/src/content/digest.ts +133 -133
- package/src/content/index.ts +164 -164
- package/src/content/loader-context.ts +172 -172
- package/src/content/loaders/api.ts +216 -216
- package/src/content/loaders/file.ts +169 -169
- package/src/content/loaders/glob.ts +252 -252
- package/src/content/loaders/index.ts +34 -34
- package/src/content/loaders/types.ts +137 -137
- package/src/content/meta-store.ts +209 -209
- package/src/content/types.ts +282 -282
- package/src/content/watcher.ts +135 -135
- package/src/contract/client-safe.test.ts +42 -42
- package/src/contract/client-safe.ts +114 -114
- package/src/contract/client.ts +16 -16
- package/src/contract/define.ts +459 -459
- package/src/contract/handler.ts +10 -10
- package/src/contract/normalize.test.ts +276 -276
- package/src/contract/normalize.ts +404 -404
- package/src/contract/registry.test.ts +206 -206
- package/src/contract/registry.ts +568 -568
- package/src/contract/schema.ts +48 -48
- package/src/contract/types.ts +58 -58
- package/src/contract/validator.ts +32 -32
- package/src/devtools/ai/context-builder.ts +375 -375
- package/src/devtools/ai/index.ts +25 -25
- package/src/devtools/ai/mcp-connector.ts +465 -465
- package/src/devtools/client/catchers/error-catcher.ts +327 -327
- package/src/devtools/client/catchers/index.ts +18 -18
- package/src/devtools/client/catchers/network-proxy.ts +363 -363
- package/src/devtools/client/components/index.ts +39 -39
- package/src/devtools/client/components/kitchen-root.tsx +362 -362
- package/src/devtools/client/components/mandu-character.tsx +241 -241
- package/src/devtools/client/components/overlay.tsx +368 -368
- package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
- package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
- package/src/devtools/client/components/panel/index.ts +32 -32
- package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
- package/src/devtools/client/components/panel/network-panel.tsx +292 -292
- package/src/devtools/client/components/panel/panel-container.tsx +259 -259
- package/src/devtools/client/filters/context-filters.ts +282 -282
- package/src/devtools/client/filters/index.ts +16 -16
- package/src/devtools/client/index.ts +63 -63
- package/src/devtools/client/persistence.ts +335 -335
- package/src/devtools/client/state-manager.ts +478 -478
- package/src/devtools/design-tokens.ts +263 -263
- package/src/devtools/hook/create-hook.ts +207 -207
- package/src/devtools/hook/index.ts +13 -13
- package/src/devtools/index.ts +439 -439
- package/src/devtools/init.ts +266 -266
- package/src/devtools/protocol.ts +237 -237
- package/src/devtools/server/index.ts +17 -17
- package/src/devtools/server/source-context.ts +444 -444
- package/src/devtools/types.ts +319 -319
- package/src/devtools/worker/index.ts +25 -25
- package/src/devtools/worker/redaction-worker.ts +222 -222
- package/src/devtools/worker/worker-manager.ts +409 -409
- package/src/error/domains.ts +265 -265
- package/src/error/result.ts +46 -46
- package/src/error/types.ts +6 -6
- package/src/errors/extractor.ts +409 -409
- package/src/errors/index.ts +19 -19
- package/src/filling/auth.ts +308 -308
- package/src/filling/context.ts +24 -1
- package/src/filling/deps.ts +238 -238
- package/src/filling/index.ts +2 -0
- package/src/filling/sse.test.ts +168 -0
- package/src/filling/sse.ts +162 -0
- package/src/generator/index.ts +3 -3
- package/src/guard/analyzer.ts +360 -360
- package/src/guard/ast-analyzer.ts +806 -806
- package/src/guard/contract-guard.ts +9 -9
- package/src/guard/file-type.test.ts +24 -24
- package/src/guard/presets/atomic.ts +70 -70
- package/src/guard/presets/clean.ts +77 -77
- package/src/guard/presets/fsd.ts +79 -79
- package/src/guard/presets/hexagonal.ts +68 -68
- package/src/guard/presets/index.ts +291 -291
- package/src/guard/reporter.ts +445 -445
- package/src/guard/rules.ts +12 -12
- package/src/guard/statistics.ts +578 -578
- package/src/guard/suggestions.ts +358 -358
- package/src/guard/types.ts +348 -348
- package/src/guard/validator.ts +834 -834
- package/src/guard/watcher.ts +404 -404
- package/src/index.ts +6 -1
- package/src/intent/index.ts +310 -310
- package/src/island/index.ts +304 -304
- package/src/logging/index.ts +22 -22
- package/src/logging/transports.ts +365 -365
- package/src/plugins/index.ts +38 -38
- package/src/plugins/registry.ts +377 -377
- package/src/plugins/types.ts +363 -363
- package/src/report/index.ts +1 -1
- package/src/router/fs-patterns.ts +387 -387
- package/src/router/fs-scanner.ts +497 -497
- package/src/runtime/boundary.tsx +232 -232
- package/src/runtime/compose.ts +222 -222
- package/src/runtime/escape.ts +44 -0
- package/src/runtime/lifecycle.ts +381 -381
- package/src/runtime/logger.test.ts +345 -345
- package/src/runtime/logger.ts +677 -677
- package/src/runtime/router.test.ts +476 -476
- package/src/runtime/router.ts +105 -105
- package/src/runtime/security.ts +155 -155
- package/src/runtime/server.ts +257 -0
- package/src/runtime/session-key.ts +328 -328
- package/src/runtime/ssr.ts +16 -21
- package/src/runtime/streaming-ssr.ts +24 -33
- package/src/runtime/trace.ts +144 -144
- package/src/seo/index.ts +214 -214
- package/src/seo/integration/ssr.ts +307 -307
- package/src/seo/render/basic.ts +427 -427
- package/src/seo/render/index.ts +143 -143
- package/src/seo/render/jsonld.ts +539 -539
- package/src/seo/render/opengraph.ts +191 -191
- package/src/seo/render/robots.ts +116 -116
- package/src/seo/render/sitemap.ts +137 -137
- package/src/seo/render/twitter.ts +126 -126
- package/src/seo/resolve/index.ts +353 -353
- package/src/seo/resolve/opengraph.ts +143 -143
- package/src/seo/resolve/robots.ts +73 -73
- package/src/seo/resolve/title.ts +94 -94
- package/src/seo/resolve/twitter.ts +73 -73
- package/src/seo/resolve/url.ts +97 -97
- package/src/seo/routes/index.ts +290 -290
- package/src/seo/types.ts +575 -575
- package/src/slot/validator.ts +39 -39
- package/src/spec/index.ts +3 -3
- package/src/spec/load.ts +76 -76
- package/src/spec/lock.ts +56 -56
- package/src/utils/bun.ts +8 -8
- package/src/utils/lru-cache.ts +75 -75
- package/src/utils/safe-io.ts +188 -188
- package/src/utils/string-safe.ts +298 -298
package/package.json
CHANGED
package/src/bundler/build.ts
CHANGED
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* Bun.build 기반 클라이언트 번들 빌드
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { RoutesManifest, RouteSpec } from "../spec/schema";
|
|
7
|
-
import { needsHydration, getRouteHydration } from "../spec/schema";
|
|
8
|
-
import type {
|
|
9
|
-
BundleResult,
|
|
10
|
-
BundleOutput,
|
|
11
|
-
BundleManifest,
|
|
12
|
-
BundleStats,
|
|
13
|
-
BundlerOptions,
|
|
14
|
-
} from "./types";
|
|
15
|
-
import { HYDRATION } from "../constants";
|
|
16
|
-
import path from "path";
|
|
17
|
-
import fs from "fs/promises";
|
|
6
|
+
import type { RoutesManifest, RouteSpec } from "../spec/schema";
|
|
7
|
+
import { needsHydration, getRouteHydration } from "../spec/schema";
|
|
8
|
+
import type {
|
|
9
|
+
BundleResult,
|
|
10
|
+
BundleOutput,
|
|
11
|
+
BundleManifest,
|
|
12
|
+
BundleStats,
|
|
13
|
+
BundlerOptions,
|
|
14
|
+
} from "./types";
|
|
15
|
+
import { HYDRATION } from "../constants";
|
|
16
|
+
import path from "path";
|
|
17
|
+
import fs from "fs/promises";
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* 빈 매니페스트 생성
|
|
@@ -282,7 +282,7 @@ function hydrateIslands() {
|
|
|
282
282
|
for (const el of islands) {
|
|
283
283
|
const id = el.getAttribute('data-mandu-island');
|
|
284
284
|
const src = el.getAttribute('data-mandu-src');
|
|
285
|
-
const priority = el.getAttribute('data-mandu-priority') || '${HYDRATION.DEFAULT_PRIORITY}';
|
|
285
|
+
const priority = el.getAttribute('data-mandu-priority') || '${HYDRATION.DEFAULT_PRIORITY}';
|
|
286
286
|
|
|
287
287
|
if (!id || !src) {
|
|
288
288
|
console.warn('[Mandu] Island missing id or src:', el);
|
|
@@ -855,21 +855,21 @@ interface VendorBuildResult {
|
|
|
855
855
|
* Vendor shim 번들 빌드
|
|
856
856
|
* React, ReactDOM, ReactDOMClient를 각각의 shim으로 빌드
|
|
857
857
|
*/
|
|
858
|
-
async function buildVendorShims(
|
|
859
|
-
outDir: string,
|
|
860
|
-
options: BundlerOptions
|
|
861
|
-
): Promise<VendorBuildResult> {
|
|
862
|
-
const errors: string[] = [];
|
|
863
|
-
type VendorShimKey = "react" | "reactDom" | "reactDomClient" | "jsxRuntime" | "jsxDevRuntime";
|
|
864
|
-
const results: Record<VendorShimKey, string> = {
|
|
865
|
-
react: "",
|
|
866
|
-
reactDom: "",
|
|
867
|
-
reactDomClient: "",
|
|
868
|
-
jsxRuntime: "",
|
|
869
|
-
jsxDevRuntime: "",
|
|
870
|
-
};
|
|
871
|
-
|
|
872
|
-
const shims: Array<{ name: string; source: string; key: VendorShimKey }> = [
|
|
858
|
+
async function buildVendorShims(
|
|
859
|
+
outDir: string,
|
|
860
|
+
options: BundlerOptions
|
|
861
|
+
): Promise<VendorBuildResult> {
|
|
862
|
+
const errors: string[] = [];
|
|
863
|
+
type VendorShimKey = "react" | "reactDom" | "reactDomClient" | "jsxRuntime" | "jsxDevRuntime";
|
|
864
|
+
const results: Record<VendorShimKey, string> = {
|
|
865
|
+
react: "",
|
|
866
|
+
reactDom: "",
|
|
867
|
+
reactDomClient: "",
|
|
868
|
+
jsxRuntime: "",
|
|
869
|
+
jsxDevRuntime: "",
|
|
870
|
+
};
|
|
871
|
+
|
|
872
|
+
const shims: Array<{ name: string; source: string; key: VendorShimKey }> = [
|
|
873
873
|
{ name: "_react", source: generateReactShimSource(), key: "react" },
|
|
874
874
|
{ name: "_react-dom", source: generateReactDOMShimSource(), key: "reactDom" },
|
|
875
875
|
{ name: "_react-dom-client", source: generateReactDOMClientShimSource(), key: "reactDomClient" },
|
|
@@ -877,68 +877,68 @@ async function buildVendorShims(
|
|
|
877
877
|
{ name: "_jsx-dev-runtime", source: generateJsxDevRuntimeShimSource(), key: "jsxDevRuntime" },
|
|
878
878
|
];
|
|
879
879
|
|
|
880
|
-
const buildShim = async (
|
|
881
|
-
shim: { name: string; source: string; key: VendorShimKey }
|
|
882
|
-
): Promise<{ key: VendorShimKey; outputPath?: string; error?: string }> => {
|
|
883
|
-
const srcPath = path.join(outDir, `${shim.name}.src.js`);
|
|
884
|
-
const outputName = `${shim.name}.js`;
|
|
885
|
-
|
|
886
|
-
try {
|
|
887
|
-
await Bun.write(srcPath, shim.source);
|
|
888
|
-
|
|
889
|
-
// _react.js는 external 없이 React 전체를 번들링
|
|
890
|
-
// _react-dom*, jsx-runtime은 react를 external로 처리하여 동일한 React 인스턴스 공유
|
|
891
|
-
let shimExternal: string[] = [];
|
|
892
|
-
if (shim.name === "_react-dom" || shim.name === "_react-dom-client") {
|
|
893
|
-
shimExternal = ["react"];
|
|
894
|
-
} else if (shim.name === "_jsx-runtime" || shim.name === "_jsx-dev-runtime") {
|
|
895
|
-
shimExternal = ["react"];
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
const result = await Bun.build({
|
|
899
|
-
entrypoints: [srcPath],
|
|
900
|
-
outdir: outDir,
|
|
901
|
-
naming: outputName,
|
|
902
|
-
minify: options.minify ?? process.env.NODE_ENV === "production",
|
|
903
|
-
sourcemap: options.sourcemap ? "external" : "none",
|
|
904
|
-
target: "browser",
|
|
905
|
-
external: shimExternal,
|
|
906
|
-
define: {
|
|
907
|
-
"process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV || "development"),
|
|
908
|
-
...options.define,
|
|
909
|
-
},
|
|
910
|
-
});
|
|
911
|
-
|
|
912
|
-
await fs.unlink(srcPath).catch(() => {});
|
|
913
|
-
|
|
914
|
-
if (!result.success) {
|
|
915
|
-
return {
|
|
916
|
-
key: shim.key,
|
|
917
|
-
error: `[${shim.name}] ${result.logs.map((l) => l.message).join(", ")}`,
|
|
918
|
-
};
|
|
919
|
-
}
|
|
920
|
-
|
|
921
|
-
return {
|
|
922
|
-
key: shim.key,
|
|
923
|
-
outputPath: `/.mandu/client/${outputName}`,
|
|
924
|
-
};
|
|
925
|
-
} catch (error) {
|
|
926
|
-
await fs.unlink(srcPath).catch(() => {});
|
|
927
|
-
return {
|
|
928
|
-
key: shim.key,
|
|
929
|
-
error: `[${shim.name}] ${String(error)}`,
|
|
930
|
-
};
|
|
931
|
-
}
|
|
932
|
-
};
|
|
933
|
-
|
|
934
|
-
const buildResults = await Promise.all(shims.map((shim) => buildShim(shim)));
|
|
935
|
-
for (const result of buildResults) {
|
|
936
|
-
if (result.error) {
|
|
937
|
-
errors.push(result.error);
|
|
938
|
-
} else if (result.outputPath) {
|
|
939
|
-
results[result.key] = result.outputPath;
|
|
940
|
-
}
|
|
941
|
-
}
|
|
880
|
+
const buildShim = async (
|
|
881
|
+
shim: { name: string; source: string; key: VendorShimKey }
|
|
882
|
+
): Promise<{ key: VendorShimKey; outputPath?: string; error?: string }> => {
|
|
883
|
+
const srcPath = path.join(outDir, `${shim.name}.src.js`);
|
|
884
|
+
const outputName = `${shim.name}.js`;
|
|
885
|
+
|
|
886
|
+
try {
|
|
887
|
+
await Bun.write(srcPath, shim.source);
|
|
888
|
+
|
|
889
|
+
// _react.js는 external 없이 React 전체를 번들링
|
|
890
|
+
// _react-dom*, jsx-runtime은 react를 external로 처리하여 동일한 React 인스턴스 공유
|
|
891
|
+
let shimExternal: string[] = [];
|
|
892
|
+
if (shim.name === "_react-dom" || shim.name === "_react-dom-client") {
|
|
893
|
+
shimExternal = ["react"];
|
|
894
|
+
} else if (shim.name === "_jsx-runtime" || shim.name === "_jsx-dev-runtime") {
|
|
895
|
+
shimExternal = ["react"];
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
const result = await Bun.build({
|
|
899
|
+
entrypoints: [srcPath],
|
|
900
|
+
outdir: outDir,
|
|
901
|
+
naming: outputName,
|
|
902
|
+
minify: options.minify ?? process.env.NODE_ENV === "production",
|
|
903
|
+
sourcemap: options.sourcemap ? "external" : "none",
|
|
904
|
+
target: "browser",
|
|
905
|
+
external: shimExternal,
|
|
906
|
+
define: {
|
|
907
|
+
"process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV || "development"),
|
|
908
|
+
...options.define,
|
|
909
|
+
},
|
|
910
|
+
});
|
|
911
|
+
|
|
912
|
+
await fs.unlink(srcPath).catch(() => {});
|
|
913
|
+
|
|
914
|
+
if (!result.success) {
|
|
915
|
+
return {
|
|
916
|
+
key: shim.key,
|
|
917
|
+
error: `[${shim.name}] ${result.logs.map((l) => l.message).join(", ")}`,
|
|
918
|
+
};
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
return {
|
|
922
|
+
key: shim.key,
|
|
923
|
+
outputPath: `/.mandu/client/${outputName}`,
|
|
924
|
+
};
|
|
925
|
+
} catch (error) {
|
|
926
|
+
await fs.unlink(srcPath).catch(() => {});
|
|
927
|
+
return {
|
|
928
|
+
key: shim.key,
|
|
929
|
+
error: `[${shim.name}] ${String(error)}`,
|
|
930
|
+
};
|
|
931
|
+
}
|
|
932
|
+
};
|
|
933
|
+
|
|
934
|
+
const buildResults = await Promise.all(shims.map((shim) => buildShim(shim)));
|
|
935
|
+
for (const result of buildResults) {
|
|
936
|
+
if (result.error) {
|
|
937
|
+
errors.push(result.error);
|
|
938
|
+
} else if (result.outputPath) {
|
|
939
|
+
results[result.key] = result.outputPath;
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
942
|
|
|
943
943
|
return {
|
|
944
944
|
success: errors.length === 0,
|
|
@@ -1052,7 +1052,7 @@ function createBundleManifest(
|
|
|
1052
1052
|
bundles[output.routeId] = {
|
|
1053
1053
|
js: output.outputPath,
|
|
1054
1054
|
dependencies: ["_runtime", "_react"],
|
|
1055
|
-
priority: hydration?.priority || HYDRATION.DEFAULT_PRIORITY,
|
|
1055
|
+
priority: hydration?.priority || HYDRATION.DEFAULT_PRIORITY,
|
|
1056
1056
|
};
|
|
1057
1057
|
}
|
|
1058
1058
|
|