@jogak/core 0.1.0-alpha.1 → 0.1.0-alpha.10.2
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/CHANGELOG.md +112 -0
- package/dist/actions-BvvUNlgo.js +69 -0
- package/dist/actions-D9bnuJ1b.cjs +1 -0
- package/dist/adapter.d.ts +80 -0
- package/dist/adapters/next/index.cjs +73 -0
- package/dist/adapters/next/index.d.ts +5 -0
- package/dist/adapters/next/index.mjs +222 -0
- package/dist/adapters/next/scaffold.d.ts +23 -0
- package/dist/adapters/next/spawn-dev.d.ts +2 -0
- package/dist/adapters/standalone/index.cjs +1 -0
- package/dist/adapters/standalone/index.d.ts +3 -0
- package/dist/adapters/standalone/index.mjs +21 -0
- package/dist/adapters/vite/build.d.ts +2 -0
- package/dist/adapters/vite/index.cjs +22 -0
- package/dist/adapters/vite/index.d.ts +5 -0
- package/dist/adapters/vite/index.mjs +134 -0
- package/dist/adapters/vite/preview-frame-plugin.d.ts +6 -0
- package/dist/adapters/vite/spawn-dev.d.ts +2 -0
- package/dist/adapters/webpack/index.cjs +74 -0
- package/dist/adapters/webpack/index.d.ts +5 -0
- package/dist/adapters/webpack/index.mjs +214 -0
- package/dist/adapters/webpack/scaffold.d.ts +18 -0
- package/dist/adapters/webpack/spawn-dev.d.ts +2 -0
- package/dist/builder-detect.d.ts +9 -0
- package/dist/config.d.ts +71 -0
- package/dist/detect-global-css-CDcuUAYE.cjs +1 -0
- package/dist/detect-global-css-CIVMmgzy.js +33 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.mjs +13 -413
- package/dist/plugin-DhT-PH1R.js +354 -0
- package/dist/plugin-Wtlz0hae.cjs +50 -0
- package/dist/preview-entry/protocol.d.ts +29 -0
- package/dist/preview-entry/source.d.ts +30 -0
- package/dist/registry-CnBX6XxF.js +397 -0
- package/dist/registry-DRRMxvoz.cjs +1 -0
- package/dist/registry.d.ts +3 -0
- package/dist/renderers/next/client/Preview.d.ts +27 -0
- package/dist/renderers/next/client/index.d.ts +2 -0
- package/dist/renderers/next/index.cjs +1 -0
- package/dist/renderers/next/index.d.ts +4 -0
- package/dist/renderers/next/index.mjs +53 -0
- package/dist/renderers/next/server/JogakLayout.d.ts +28 -0
- package/dist/renderers/next/server/index.d.ts +2 -0
- package/dist/renderers/react/JogakProvider.d.ts +8 -0
- package/dist/renderers/react/adapter.d.ts +2 -0
- package/dist/renderers/react/index.cjs +1 -0
- package/dist/renderers/react/index.d.ts +7 -0
- package/dist/renderers/react/index.mjs +101 -0
- package/dist/renderers/react/useEntry.d.ts +40 -0
- package/dist/renderers/react/useRegistryMeta.d.ts +27 -0
- package/dist/renderers/web-components/define.d.ts +11 -0
- package/dist/renderers/web-components/index.cjs +1 -0
- package/dist/renderers/web-components/index.d.ts +1 -0
- package/dist/renderers/web-components/index.mjs +48 -0
- package/dist/server.cjs +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.mjs +45 -0
- package/dist/source-9OiU8x_y.cjs +43 -0
- package/dist/source-D44KTQPu.js +50 -0
- package/dist/types.d.ts +161 -0
- package/dist/vite/index.cjs +1 -0
- package/dist/vite/index.mjs +2 -275
- package/dist/vite-plugin/detect-global-css.d.ts +33 -0
- package/dist/vite-plugin/index.cjs +1 -0
- package/dist/vite-plugin/index.d.ts +12 -0
- package/dist/vite-plugin/index.mjs +4 -0
- package/dist/vite-plugin/resolve-paths.d.ts +32 -0
- package/dist/{vite → vite-plugin}/virtual-ids.d.ts +17 -0
- package/package.json +101 -10
- package/dist/index.js +0 -1
- package/dist/vite/index.js +0 -41
- /package/dist/build/{index.js → index.cjs} +0 -0
- /package/dist/meta/{extractor-child.js → extractor-child.cjs} +0 -0
- /package/dist/{vite → vite-plugin}/cache-validate.d.ts +0 -0
- /package/dist/{vite → vite-plugin}/plugin.d.ts +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";var w=Object.create;var v=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var E=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var y=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of h(t))!b.call(e,o)&&o!==r&&v(e,o,{get:()=>t[o],enumerable:!(i=_(t,o))||i.enumerable});return e};var j=(e,t,r)=>(r=e!=null?w(E(e)):{},y(t||!e||!e.__esModule?v(r,"default",{value:e,enumerable:!0}):r,e));Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const k=require("node:fs"),I=require("node:path"),C=require("../../plugin-Wtlz0hae.cjs"),R=require("../../source-9OiU8x_y.cjs"),P=require("../../detect-global-css-CDcuUAYE.cjs"),c="virtual:jogak/preview-entry",g="\0"+c,l="virtual:jogak/preview-global-css",p="\0"+l,T="/__jogak_preview__/index.html";function f(e){return{name:"vite-plugin-jogak-preview-frame",enforce:"pre",configureServer(t){t.middlewares.use((r,i,o)=>{if(r.url===void 0||r.url.split("?")[0]!==T||r.method!=="GET")return o();const n=V();t.transformIndexHtml(r.url,n).then(a=>{i.statusCode=200,i.setHeader("Content-Type","text/html; charset=utf-8"),i.end(a)}).catch(o)})},resolveId(t){if(t===c)return g;if(t===l)return p},load(t){if(t===p){const r=P.resolveGlobalCssPaths(e.globalCss,e.userRoot);return r.length===0?`// [jogak] preview-global-css: no candidates
|
|
2
|
+
export {}
|
|
3
|
+
`:r.map(i=>`import ${JSON.stringify(i)}`).join(`
|
|
4
|
+
`)+`
|
|
5
|
+
export {}
|
|
6
|
+
`}if(t===g)return R.renderPreviewEntrySource({extraImports:[l,"virtual:jogak"]})}}}function V(){return`<!doctype html>
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="UTF-8" />
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
11
|
+
<title>jogak preview</title>
|
|
12
|
+
<style>
|
|
13
|
+
html, body { margin: 0; padding: 0; }
|
|
14
|
+
#jogak-preview-root { display: block; }
|
|
15
|
+
</style>
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<div id="jogak-preview-root"></div>
|
|
19
|
+
<script type="module" src="/@id/${c}"><\/script>
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|
|
22
|
+
`}const S=["ts","mts","js","mjs","cjs"];async function F(e){const t=e.extra??{};if(t.disabled===!0)throw new Error("[jogak/vite-adapter] disabled=true. dispatch should fall back to standalone or skip spawn.");const r=t.configFile??L(e.cwd);if(r===void 0)throw new Error(`[jogak/vite-adapter] vite.config not found in ${e.cwd}. 명시 경로: jogak.config.ts의 builderOptions: { configFile: '...' }`);const i=await import("vite"),o=await i.loadConfigFromFile({command:"serve",mode:"development"},r,e.cwd),d=(o==null?void 0:o.config)??{},n=e.port??5174,a=e.host??"localhost",m=i.mergeConfig(d,{plugins:[C.jogak({cwd:e.cwd,previewFrame:!0,...e.globalCss!==void 0?{globalCss:e.globalCss}:{}}),f({userRoot:e.cwd,...e.globalCss!==void 0?{globalCss:e.globalCss}:{}})],server:{port:n,host:a,strictPort:!1,cors:!0},appType:"mpa",configFile:!1}),s=await i.createServer(m);await s.listen();const u=s.config.server.port??n;return{url:`http://localhost:${String(u)}`,port:u,close:async()=>{try{await s.close()}catch{}}}}function L(e){for(const t of S){const r=I.resolve(e,`vite.config.${t}`);if(k.existsSync(r))return r}}async function x(e){throw new Error("[jogak/vite-adapter] build is not implemented yet (alpha.9 v1). Use `jogak dev` for now.")}const O={devEntryPath:"/__jogak_preview__/index.html",buildEntryName:"index.html",previewEntryVirtualId:"virtual:jogak/preview-entry"},A={name:"vite",spawnDev:F,build:x,previewEntryMeta:O};exports.default=A;exports.jogakPreviewFramePlugin=f;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BuilderAdapter } from '../../index.js';
|
|
2
|
+
declare const viteAdapter: BuilderAdapter;
|
|
3
|
+
export default viteAdapter;
|
|
4
|
+
export { jogakPreviewFramePlugin } from './preview-frame-plugin.js';
|
|
5
|
+
export type { JogakPreviewFramePluginOptions } from './preview-frame-plugin.js';
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { existsSync as p } from "node:fs";
|
|
2
|
+
import { resolve as f } from "node:path";
|
|
3
|
+
import { j as w } from "../../plugin-DhT-PH1R.js";
|
|
4
|
+
import { r as h } from "../../source-D44KTQPu.js";
|
|
5
|
+
import { r as E } from "../../detect-global-css-CIVMmgzy.js";
|
|
6
|
+
const c = "virtual:jogak/preview-entry", v = "\0" + c, l = "virtual:jogak/preview-global-css", g = "\0" + l, _ = "/__jogak_preview__/index.html";
|
|
7
|
+
function y(e) {
|
|
8
|
+
return {
|
|
9
|
+
name: "vite-plugin-jogak-preview-frame",
|
|
10
|
+
enforce: "pre",
|
|
11
|
+
configureServer(t) {
|
|
12
|
+
t.middlewares.use((r, o, i) => {
|
|
13
|
+
if (r.url === void 0 || r.url.split("?")[0] !== _ || r.method !== "GET") return i();
|
|
14
|
+
const n = j();
|
|
15
|
+
t.transformIndexHtml(r.url, n).then((a) => {
|
|
16
|
+
o.statusCode = 200, o.setHeader("Content-Type", "text/html; charset=utf-8"), o.end(a);
|
|
17
|
+
}).catch(i);
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
resolveId(t) {
|
|
21
|
+
if (t === c) return v;
|
|
22
|
+
if (t === l) return g;
|
|
23
|
+
},
|
|
24
|
+
load(t) {
|
|
25
|
+
if (t === g) {
|
|
26
|
+
const r = E(e.globalCss, e.userRoot);
|
|
27
|
+
return r.length === 0 ? `// [jogak] preview-global-css: no candidates
|
|
28
|
+
export {}
|
|
29
|
+
` : r.map((o) => `import ${JSON.stringify(o)}`).join(`
|
|
30
|
+
`) + `
|
|
31
|
+
export {}
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
if (t === v)
|
|
35
|
+
return h({
|
|
36
|
+
extraImports: [l, "virtual:jogak"]
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function j() {
|
|
42
|
+
return `<!doctype html>
|
|
43
|
+
<html lang="en">
|
|
44
|
+
<head>
|
|
45
|
+
<meta charset="UTF-8" />
|
|
46
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
47
|
+
<title>jogak preview</title>
|
|
48
|
+
<style>
|
|
49
|
+
html, body { margin: 0; padding: 0; }
|
|
50
|
+
#jogak-preview-root { display: block; }
|
|
51
|
+
</style>
|
|
52
|
+
</head>
|
|
53
|
+
<body>
|
|
54
|
+
<div id="jogak-preview-root"></div>
|
|
55
|
+
<script type="module" src="/@id/${c}"><\/script>
|
|
56
|
+
</body>
|
|
57
|
+
</html>
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
const b = ["ts", "mts", "js", "mjs", "cjs"];
|
|
61
|
+
async function k(e) {
|
|
62
|
+
const t = e.extra ?? {};
|
|
63
|
+
if (t.disabled === !0)
|
|
64
|
+
throw new Error(
|
|
65
|
+
"[jogak/vite-adapter] disabled=true. dispatch should fall back to standalone or skip spawn."
|
|
66
|
+
);
|
|
67
|
+
const r = t.configFile ?? I(e.cwd);
|
|
68
|
+
if (r === void 0)
|
|
69
|
+
throw new Error(
|
|
70
|
+
`[jogak/vite-adapter] vite.config not found in ${e.cwd}. 명시 경로: jogak.config.ts의 builderOptions: { configFile: '...' }`
|
|
71
|
+
);
|
|
72
|
+
const o = await import("vite"), i = await o.loadConfigFromFile(
|
|
73
|
+
{ command: "serve", mode: "development" },
|
|
74
|
+
r,
|
|
75
|
+
e.cwd
|
|
76
|
+
), d = (i == null ? void 0 : i.config) ?? {}, n = e.port ?? 5174, a = e.host ?? "localhost", m = o.mergeConfig(d, {
|
|
77
|
+
plugins: [
|
|
78
|
+
w({
|
|
79
|
+
cwd: e.cwd,
|
|
80
|
+
previewFrame: !0,
|
|
81
|
+
...e.globalCss !== void 0 ? { globalCss: e.globalCss } : {}
|
|
82
|
+
}),
|
|
83
|
+
y({
|
|
84
|
+
userRoot: e.cwd,
|
|
85
|
+
...e.globalCss !== void 0 ? { globalCss: e.globalCss } : {}
|
|
86
|
+
})
|
|
87
|
+
],
|
|
88
|
+
server: {
|
|
89
|
+
port: n,
|
|
90
|
+
host: a,
|
|
91
|
+
strictPort: !1,
|
|
92
|
+
cors: !0
|
|
93
|
+
},
|
|
94
|
+
appType: "mpa",
|
|
95
|
+
configFile: !1
|
|
96
|
+
}), s = await o.createServer(m);
|
|
97
|
+
await s.listen();
|
|
98
|
+
const u = s.config.server.port ?? n;
|
|
99
|
+
return {
|
|
100
|
+
url: `http://localhost:${String(u)}`,
|
|
101
|
+
port: u,
|
|
102
|
+
close: async () => {
|
|
103
|
+
try {
|
|
104
|
+
await s.close();
|
|
105
|
+
} catch {
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function I(e) {
|
|
111
|
+
for (const t of b) {
|
|
112
|
+
const r = f(e, `vite.config.${t}`);
|
|
113
|
+
if (p(r)) return r;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function R(e) {
|
|
117
|
+
throw new Error(
|
|
118
|
+
"[jogak/vite-adapter] build is not implemented yet (alpha.9 v1). Use `jogak dev` for now."
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const C = {
|
|
122
|
+
devEntryPath: "/__jogak_preview__/index.html",
|
|
123
|
+
buildEntryName: "index.html",
|
|
124
|
+
previewEntryVirtualId: "virtual:jogak/preview-entry"
|
|
125
|
+
}, x = {
|
|
126
|
+
name: "vite",
|
|
127
|
+
spawnDev: k,
|
|
128
|
+
build: R,
|
|
129
|
+
previewEntryMeta: C
|
|
130
|
+
};
|
|
131
|
+
export {
|
|
132
|
+
x as default,
|
|
133
|
+
y as jogakPreviewFramePlugin
|
|
134
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
export interface JogakPreviewFramePluginOptions {
|
|
3
|
+
readonly userRoot: string;
|
|
4
|
+
readonly globalCss?: boolean | string | readonly string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function jogakPreviewFramePlugin(options: JogakPreviewFramePluginOptions): Plugin;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";var j=Object.create;var f=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var P=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of E(t))!C.call(e,o)&&o!==n&&f(e,o,{get:()=>t[o],enumerable:!(r=_(t,o))||r.enumerable});return e};var g=(e,t,n)=>(n=e!=null?j(S(e)):{},P(t||!e||!e.__esModule?f(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("node:fs"),c=require("node:path"),F=require("node:url"),A=require("../../detect-global-css-CDcuUAYE.cjs"),$=".jogak/webpack-preview";function y(e){const t=c.resolve(e.cwd,$);l.mkdirSync(t,{recursive:!0});const n=A.resolveGlobalCssPaths(e.globalCss,e.cwd).map(u=>`import ${JSON.stringify(u)}`).join(`
|
|
2
|
+
`),r=c.resolve(t,"preview-entry.tsx"),o=c.resolve(t,"preview-template.html"),s=c.resolve(e.cwd,".jogak/registry"),i=x(c.relative(t,s)),d=i.startsWith(".")?i:`./${i}`;return l.writeFileSync(r,R(n,d),"utf-8"),l.writeFileSync(o,M(),"utf-8"),I(e.cwd,".jogak/"),{entryAbsPath:r,htmlTemplateAbsPath:o,cleanup:()=>{try{l.rmSync(c.resolve(e.cwd,".jogak"),{recursive:!0,force:!0})}catch{}}}}function I(e,t){const n=c.resolve(e,".gitignore");let r="";if(l.existsSync(n))try{r=l.readFileSync(n,"utf-8")}catch{return}if(r.split(`
|
|
3
|
+
`).some(d=>d.trim()===t))return;const s="# jogak (auto-generated, do not commit preview scaffolding)",i=r.endsWith(`
|
|
4
|
+
`)||r===""?`${r}${s}
|
|
5
|
+
${t}
|
|
6
|
+
`:`${r}
|
|
7
|
+
${s}
|
|
8
|
+
${t}
|
|
9
|
+
`;try{l.writeFileSync(n,i,"utf-8")}catch{}}function M(){return`<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="UTF-8" />
|
|
13
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
14
|
+
<title>jogak preview</title>
|
|
15
|
+
<style>
|
|
16
|
+
html, body { margin: 0; padding: 0; }
|
|
17
|
+
#jogak-preview-root { display: block; }
|
|
18
|
+
</style>
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
<div id="jogak-preview-root"></div>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
|
24
|
+
`}function x(e){return e.split(/[\\/]/u).join("/")}function R(e,t){return`import { reactAdapter } from '@jogak/core/renderers/react'
|
|
25
|
+
import { defaultRegistry } from '@jogak/core'
|
|
26
|
+
import { entries as _jogakEntries } from ${JSON.stringify(t)}
|
|
27
|
+
${e}
|
|
28
|
+
|
|
29
|
+
for (const entry of _jogakEntries) {
|
|
30
|
+
if (defaultRegistry.get(entry.id) === undefined) {
|
|
31
|
+
defaultRegistry.register(entry)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const rootEl = document.getElementById('jogak-preview-root')
|
|
36
|
+
if (rootEl === null) throw new Error('[jogak] #jogak-preview-root not found')
|
|
37
|
+
|
|
38
|
+
let currentContainer: HTMLDivElement | null = null
|
|
39
|
+
|
|
40
|
+
async function renderEntry(entryId: string, args: Record<string, unknown>): Promise<void> {
|
|
41
|
+
const entry = await defaultRegistry.requestEntry(entryId)
|
|
42
|
+
if (currentContainer === null) {
|
|
43
|
+
currentContainer = document.createElement('div')
|
|
44
|
+
rootEl.replaceChildren(currentContainer)
|
|
45
|
+
}
|
|
46
|
+
reactAdapter.render(entry, args, currentContainer)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function unmount(): void {
|
|
50
|
+
if (currentContainer !== null) {
|
|
51
|
+
reactAdapter.unmount(currentContainer)
|
|
52
|
+
currentContainer = null
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
window.addEventListener('message', (event: MessageEvent) => {
|
|
57
|
+
const data = event.data
|
|
58
|
+
if (data == null || typeof data !== 'object') return
|
|
59
|
+
if (data.type === 'jogak:setProps') {
|
|
60
|
+
void renderEntry(data.entryId, data.args ?? {}).then(() => {
|
|
61
|
+
window.parent.postMessage({ type: 'jogak:rendered', entryId: data.entryId }, '*')
|
|
62
|
+
}).catch((err: unknown) => {
|
|
63
|
+
window.parent.postMessage({ type: 'jogak:error', message: String((err as Error)?.message ?? err) }, '*')
|
|
64
|
+
})
|
|
65
|
+
} else if (data.type === 'jogak:unmount') {
|
|
66
|
+
unmount()
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
window.parent.postMessage({ type: 'jogak:ready' }, '*')
|
|
71
|
+
`}const T=["ts","js","mjs","cjs"];async function W(e){const n=(e.extra??{}).configFile??D(e.cwd),r=y({cwd:e.cwd,...e.globalCss!==void 0?{globalCss:e.globalCss}:{}});let o={};if(n!==void 0)try{const a=await import(F.pathToFileURL(n).toString());o=a.default??a,typeof o=="function"&&(o=o({development:!0},{mode:"development"}))}catch(a){const m=a instanceof Error?a.message:String(a);process.stderr.write(`[jogak/webpack-adapter] webpack.config evaluate failed: ${m}
|
|
72
|
+
`)}let s,i,d,u;try{s=await import("webpack"),i=await import("webpack-dev-server"),d=await import("html-webpack-plugin"),u=(await import("webpack-merge")).merge}catch(a){r.cleanup();const m=a instanceof Error?a.message:String(a);throw new Error(`[jogak/webpack-adapter] required deps not installed.
|
|
73
|
+
install: pnpm add -D webpack webpack-dev-server webpack-merge html-webpack-plugin
|
|
74
|
+
original: ${m}`)}const p=e.port??5174,v=d.default??d,h=u(o,{mode:"development",entry:{__jogak_preview__:r.entryAbsPath},plugins:[new v({filename:"__jogak_preview__/index.html",chunks:["__jogak_preview__"],template:r.htmlTemplateAbsPath})],devServer:{port:p,host:e.host??"localhost",historyApiFallback:!1,hot:!0}}),k=(s.default??s)(h),b=i.default??i,w=new b({port:p,host:e.host??"localhost",historyApiFallback:!1,hot:!0},k);try{await w.start()}catch(a){throw r.cleanup(),a}return{url:`http://localhost:${String(p)}`,port:p,close:async()=>{try{await w.stop()}catch{}r.cleanup()}}}function D(e){for(const t of T){const n=c.resolve(e,`webpack.config.${t}`);if(l.existsSync(n))return n}}const q={devEntryPath:"/__jogak_preview__/index.html",buildEntryName:"__jogak_preview__/index.html",previewEntryVirtualId:"virtual:jogak/preview-entry"},N={name:"webpack",spawnDev:W,async build(e){throw new Error("[jogak/webpack-adapter] build is not implemented yet (alpha.9 v1). Use `jogak dev` for now.")},previewEntryMeta:q};exports.default=N;exports.scaffoldPreviewEntry=y;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { mkdirSync as v, writeFileSync as u, rmSync as b, existsSync as w, readFileSync as j } from "node:fs";
|
|
2
|
+
import { resolve as l, relative as _ } from "node:path";
|
|
3
|
+
import { pathToFileURL as E } from "node:url";
|
|
4
|
+
import { r as C } from "../../detect-global-css-CIVMmgzy.js";
|
|
5
|
+
const P = ".jogak/webpack-preview";
|
|
6
|
+
function S(e) {
|
|
7
|
+
const r = l(e.cwd, P);
|
|
8
|
+
v(r, { recursive: !0 });
|
|
9
|
+
const a = C(e.globalCss, e.cwd).map((d) => `import ${JSON.stringify(d)}`).join(`
|
|
10
|
+
`), t = l(r, "preview-entry.tsx"), o = l(r, "preview-template.html"), s = l(e.cwd, ".jogak/registry"), i = $(_(r, s)), c = i.startsWith(".") ? i : `./${i}`;
|
|
11
|
+
return u(t, I(a, c), "utf-8"), u(o, F(), "utf-8"), A(e.cwd, ".jogak/"), {
|
|
12
|
+
entryAbsPath: t,
|
|
13
|
+
htmlTemplateAbsPath: o,
|
|
14
|
+
cleanup: () => {
|
|
15
|
+
try {
|
|
16
|
+
b(l(e.cwd, ".jogak"), { recursive: !0, force: !0 });
|
|
17
|
+
} catch {
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function A(e, r) {
|
|
23
|
+
const a = l(e, ".gitignore");
|
|
24
|
+
let t = "";
|
|
25
|
+
if (w(a))
|
|
26
|
+
try {
|
|
27
|
+
t = j(a, "utf-8");
|
|
28
|
+
} catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (t.split(`
|
|
32
|
+
`).some((c) => c.trim() === r)) return;
|
|
33
|
+
const s = "# jogak (auto-generated, do not commit preview scaffolding)", i = t.endsWith(`
|
|
34
|
+
`) || t === "" ? `${t}${s}
|
|
35
|
+
${r}
|
|
36
|
+
` : `${t}
|
|
37
|
+
${s}
|
|
38
|
+
${r}
|
|
39
|
+
`;
|
|
40
|
+
try {
|
|
41
|
+
u(a, i, "utf-8");
|
|
42
|
+
} catch {
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function F() {
|
|
46
|
+
return `<!doctype html>
|
|
47
|
+
<html lang="en">
|
|
48
|
+
<head>
|
|
49
|
+
<meta charset="UTF-8" />
|
|
50
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
51
|
+
<title>jogak preview</title>
|
|
52
|
+
<style>
|
|
53
|
+
html, body { margin: 0; padding: 0; }
|
|
54
|
+
#jogak-preview-root { display: block; }
|
|
55
|
+
</style>
|
|
56
|
+
</head>
|
|
57
|
+
<body>
|
|
58
|
+
<div id="jogak-preview-root"></div>
|
|
59
|
+
</body>
|
|
60
|
+
</html>
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
function $(e) {
|
|
64
|
+
return e.split(/[\\/]/u).join("/");
|
|
65
|
+
}
|
|
66
|
+
function I(e, r) {
|
|
67
|
+
return `import { reactAdapter } from '@jogak/core/renderers/react'
|
|
68
|
+
import { defaultRegistry } from '@jogak/core'
|
|
69
|
+
import { entries as _jogakEntries } from ${JSON.stringify(r)}
|
|
70
|
+
${e}
|
|
71
|
+
|
|
72
|
+
for (const entry of _jogakEntries) {
|
|
73
|
+
if (defaultRegistry.get(entry.id) === undefined) {
|
|
74
|
+
defaultRegistry.register(entry)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const rootEl = document.getElementById('jogak-preview-root')
|
|
79
|
+
if (rootEl === null) throw new Error('[jogak] #jogak-preview-root not found')
|
|
80
|
+
|
|
81
|
+
let currentContainer: HTMLDivElement | null = null
|
|
82
|
+
|
|
83
|
+
async function renderEntry(entryId: string, args: Record<string, unknown>): Promise<void> {
|
|
84
|
+
const entry = await defaultRegistry.requestEntry(entryId)
|
|
85
|
+
if (currentContainer === null) {
|
|
86
|
+
currentContainer = document.createElement('div')
|
|
87
|
+
rootEl.replaceChildren(currentContainer)
|
|
88
|
+
}
|
|
89
|
+
reactAdapter.render(entry, args, currentContainer)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function unmount(): void {
|
|
93
|
+
if (currentContainer !== null) {
|
|
94
|
+
reactAdapter.unmount(currentContainer)
|
|
95
|
+
currentContainer = null
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
window.addEventListener('message', (event: MessageEvent) => {
|
|
100
|
+
const data = event.data
|
|
101
|
+
if (data == null || typeof data !== 'object') return
|
|
102
|
+
if (data.type === 'jogak:setProps') {
|
|
103
|
+
void renderEntry(data.entryId, data.args ?? {}).then(() => {
|
|
104
|
+
window.parent.postMessage({ type: 'jogak:rendered', entryId: data.entryId }, '*')
|
|
105
|
+
}).catch((err: unknown) => {
|
|
106
|
+
window.parent.postMessage({ type: 'jogak:error', message: String((err as Error)?.message ?? err) }, '*')
|
|
107
|
+
})
|
|
108
|
+
} else if (data.type === 'jogak:unmount') {
|
|
109
|
+
unmount()
|
|
110
|
+
}
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
window.parent.postMessage({ type: 'jogak:ready' }, '*')
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
const x = ["ts", "js", "mjs", "cjs"];
|
|
117
|
+
async function M(e) {
|
|
118
|
+
const a = (e.extra ?? {}).configFile ?? R(e.cwd), t = S({
|
|
119
|
+
cwd: e.cwd,
|
|
120
|
+
...e.globalCss !== void 0 ? { globalCss: e.globalCss } : {}
|
|
121
|
+
});
|
|
122
|
+
let o = {};
|
|
123
|
+
if (a !== void 0)
|
|
124
|
+
try {
|
|
125
|
+
const n = await import(E(a).toString());
|
|
126
|
+
o = n.default ?? n, typeof o == "function" && (o = o(
|
|
127
|
+
{ development: !0 },
|
|
128
|
+
{ mode: "development" }
|
|
129
|
+
));
|
|
130
|
+
} catch (n) {
|
|
131
|
+
const g = n instanceof Error ? n.message : String(n);
|
|
132
|
+
process.stderr.write(
|
|
133
|
+
`[jogak/webpack-adapter] webpack.config evaluate failed: ${g}
|
|
134
|
+
`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
let s, i, c, d;
|
|
138
|
+
try {
|
|
139
|
+
s = await import("webpack"), i = await import("webpack-dev-server"), c = await import("html-webpack-plugin"), d = (await import("webpack-merge")).merge;
|
|
140
|
+
} catch (n) {
|
|
141
|
+
t.cleanup();
|
|
142
|
+
const g = n instanceof Error ? n.message : String(n);
|
|
143
|
+
throw new Error(
|
|
144
|
+
`[jogak/webpack-adapter] required deps not installed.
|
|
145
|
+
install: pnpm add -D webpack webpack-dev-server webpack-merge html-webpack-plugin
|
|
146
|
+
original: ${g}`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
const p = e.port ?? 5174, f = c.default ?? c, y = d(o, {
|
|
150
|
+
mode: "development",
|
|
151
|
+
entry: { __jogak_preview__: t.entryAbsPath },
|
|
152
|
+
plugins: [
|
|
153
|
+
new f({
|
|
154
|
+
filename: "__jogak_preview__/index.html",
|
|
155
|
+
chunks: ["__jogak_preview__"],
|
|
156
|
+
template: t.htmlTemplateAbsPath
|
|
157
|
+
})
|
|
158
|
+
],
|
|
159
|
+
devServer: {
|
|
160
|
+
port: p,
|
|
161
|
+
host: e.host ?? "localhost",
|
|
162
|
+
historyApiFallback: !1,
|
|
163
|
+
hot: !0
|
|
164
|
+
}
|
|
165
|
+
}), h = (s.default ?? s)(y), k = i.default ?? i, m = new k(
|
|
166
|
+
{
|
|
167
|
+
port: p,
|
|
168
|
+
host: e.host ?? "localhost",
|
|
169
|
+
historyApiFallback: !1,
|
|
170
|
+
hot: !0
|
|
171
|
+
},
|
|
172
|
+
h
|
|
173
|
+
);
|
|
174
|
+
try {
|
|
175
|
+
await m.start();
|
|
176
|
+
} catch (n) {
|
|
177
|
+
throw t.cleanup(), n;
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
url: `http://localhost:${String(p)}`,
|
|
181
|
+
port: p,
|
|
182
|
+
close: async () => {
|
|
183
|
+
try {
|
|
184
|
+
await m.stop();
|
|
185
|
+
} catch {
|
|
186
|
+
}
|
|
187
|
+
t.cleanup();
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function R(e) {
|
|
192
|
+
for (const r of x) {
|
|
193
|
+
const a = l(e, `webpack.config.${r}`);
|
|
194
|
+
if (w(a)) return a;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const W = {
|
|
198
|
+
devEntryPath: "/__jogak_preview__/index.html",
|
|
199
|
+
buildEntryName: "__jogak_preview__/index.html",
|
|
200
|
+
previewEntryVirtualId: "virtual:jogak/preview-entry"
|
|
201
|
+
}, O = {
|
|
202
|
+
name: "webpack",
|
|
203
|
+
spawnDev: M,
|
|
204
|
+
async build(e) {
|
|
205
|
+
throw new Error(
|
|
206
|
+
"[jogak/webpack-adapter] build is not implemented yet (alpha.9 v1). Use `jogak dev` for now."
|
|
207
|
+
);
|
|
208
|
+
},
|
|
209
|
+
previewEntryMeta: W
|
|
210
|
+
};
|
|
211
|
+
export {
|
|
212
|
+
O as default,
|
|
213
|
+
S as scaffoldPreviewEntry
|
|
214
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 알파.9: webpack-adapter — `<userRoot>/.jogak/webpack-preview/preview-entry.tsx` scaffold.
|
|
3
|
+
*
|
|
4
|
+
* webpack은 vite처럼 가상 모듈을 직접 지원 안 함 (custom resolver/loader 필요). 단순화 위해
|
|
5
|
+
* 사용자 cwd의 `.jogak/webpack-preview/`에 entry 파일을 generate하고 webpack entry로 등록.
|
|
6
|
+
*
|
|
7
|
+
* `.jogak/`는 .gitignore에 자동 추가.
|
|
8
|
+
*/
|
|
9
|
+
export interface ScaffoldOptions {
|
|
10
|
+
readonly cwd: string;
|
|
11
|
+
readonly globalCss?: boolean | string | readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export interface ScaffoldHandle {
|
|
14
|
+
readonly entryAbsPath: string;
|
|
15
|
+
readonly htmlTemplateAbsPath: string;
|
|
16
|
+
cleanup(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare function scaffoldPreviewEntry(opts: ScaffoldOptions): ScaffoldHandle;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BuilderName } from './adapter.js';
|
|
2
|
+
export interface DetectBuilderResult {
|
|
3
|
+
readonly name: Exclude<BuilderName, 'custom'>;
|
|
4
|
+
/** 감지에 사용된 시그널 — 디버깅용. */
|
|
5
|
+
readonly signal: string;
|
|
6
|
+
/** 모호 환경 검출 시 추가 매칭 시그널 (warning 출력용). */
|
|
7
|
+
readonly ambiguous?: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function detectBuilder(cwd: string): DetectBuilderResult;
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { BuilderName } from './adapter.js';
|
|
2
|
+
import { JogakPluginOptions, UserViteOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* `jogak.config.{ts,mts,mjs,js,json}`의 default export 타입.
|
|
5
|
+
*
|
|
6
|
+
* `JogakPluginOptions`의 모든 필드 + 사용자가 자주 변경하는 dev/build 옵션을
|
|
7
|
+
* 통합한다. 모든 필드 optional — 미지정 시 jogak 기본값 또는 CLI 플래그가 적용.
|
|
8
|
+
*
|
|
9
|
+
* **CLI 플래그 우선순위**: CLI 플래그가 본 config의 값을 override한다 (Vite 패턴).
|
|
10
|
+
* 예: `jogak.config.ts`에 `port: 3000`, CLI에 `--port 4000` → 4000 적용.
|
|
11
|
+
*
|
|
12
|
+
* 미노출 필드(예: `cwd`, `framework`, `disableCacheValidation`, `noGenerate`,
|
|
13
|
+
* `emitRegistry`)는 CLI 플래그 전용 또는 자동 감지로만 처리 — 사용자가 config
|
|
14
|
+
* 파일에서 자주 만지지 않는 옵션이라 표면을 줄였다.
|
|
15
|
+
*/
|
|
16
|
+
export interface JogakConfig extends JogakPluginOptions {
|
|
17
|
+
/** dev server 포트. 기본 5173. CLI `--port`로 override. */
|
|
18
|
+
readonly port?: number;
|
|
19
|
+
/** dev server bind host. 기본 'localhost'. CLI `--host`로 override. */
|
|
20
|
+
readonly host?: string | boolean;
|
|
21
|
+
/** dev 시작 시 브라우저 자동 오픈. 기본 false. CLI `--open`로 override. */
|
|
22
|
+
readonly open?: boolean | string;
|
|
23
|
+
/** 정적 빌드 출력 디렉토리. 기본 'jogak-static'. CLI `--out-dir`로 override. */
|
|
24
|
+
readonly outDir?: string;
|
|
25
|
+
/** 정적 빌드 base public path. 기본 './'. CLI `--base`로 override. */
|
|
26
|
+
readonly base?: string;
|
|
27
|
+
/** 빌드 minify 모드. 기본 'esbuild'. CLI `--minify`로 override. */
|
|
28
|
+
readonly minify?: boolean | 'esbuild' | 'terser';
|
|
29
|
+
/** 빌드 소스맵. 기본 false. CLI `--sourcemap`로 override. */
|
|
30
|
+
readonly sourcemap?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated 알파.10 제거 예정. `builder: 'vite' + builderOptions`로 마이그.
|
|
33
|
+
*
|
|
34
|
+
* 알파.8 alias. 알파.9에서는 `builder: 'vite'` + `builderOptions: { configFile, port, host }`로 권장.
|
|
35
|
+
*/
|
|
36
|
+
readonly userVite?: UserViteOptions;
|
|
37
|
+
/**
|
|
38
|
+
* 알파.9: 사용자 빌더 명시. 미지정 시 cwd 시그널로 자동 감지
|
|
39
|
+
* (`vite.config.*` / `next.config.*` / `webpack.config.*` / `react-scripts` dep 등).
|
|
40
|
+
*
|
|
41
|
+
* - `'vite' | 'next' | 'webpack' | 'standalone'`: 해당 어댑터 강제.
|
|
42
|
+
* - `undefined` (default): 자동 감지.
|
|
43
|
+
*
|
|
44
|
+
* `'custom'`은 알파.10에서 사용자 정의 어댑터 인스턴스 통로 도입 시 활성.
|
|
45
|
+
*/
|
|
46
|
+
readonly builder?: Exclude<BuilderName, 'custom'>;
|
|
47
|
+
/**
|
|
48
|
+
* 알파.9: 어댑터별 추가 옵션. 어댑터 ABI의 `extra`로 그대로 전달.
|
|
49
|
+
*
|
|
50
|
+
* - vite-adapter: `{ configFile?, port?, host?, disabled? }`
|
|
51
|
+
* - next-adapter: `{ appDir?, port? }`
|
|
52
|
+
* - webpack-adapter: `{ configFile?, port? }`
|
|
53
|
+
* - standalone-adapter: 미지원
|
|
54
|
+
*/
|
|
55
|
+
readonly builderOptions?: Readonly<Record<string, unknown>>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `jogak.config.ts`에서 사용자가 호출하는 identity helper.
|
|
59
|
+
*
|
|
60
|
+
* TypeScript 타입 추론을 위해서만 존재 — 런타임에는 입력 그대로 반환.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* import { defineJogakConfig } from '@jogak/core'
|
|
64
|
+
*
|
|
65
|
+
* export default defineJogakConfig({
|
|
66
|
+
* globalCss: true,
|
|
67
|
+
* previewIsolation: 'none',
|
|
68
|
+
* port: 3000,
|
|
69
|
+
* })
|
|
70
|
+
*/
|
|
71
|
+
export declare function defineJogakConfig<T extends JogakConfig>(config: T): T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const n=require("node:fs"),t=require("node:path"),a=["src/index.css","src/main.css","src/styles.css","src/styles/globals.css","src/styles/index.css","src/app/globals.css","src/global.css","src/app.css"];function l(s){for(const e of a){const r=t.resolve(s,e);if(n.existsSync(r))return[r]}return[]}function f(s,e){if(s===void 0||s===!1)return[];if(s===!0)return l(e);if(typeof s=="string")return s.length>0?[t.resolve(e,s)]:[];const r=[];for(const c of s)typeof c=="string"&&c.length>0&&r.push(t.resolve(e,c));return r}exports.detectUserGlobalCss=l;exports.resolveGlobalCssPaths=f;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { existsSync as l } from "node:fs";
|
|
2
|
+
import { resolve as t } from "node:path";
|
|
3
|
+
const n = [
|
|
4
|
+
"src/index.css",
|
|
5
|
+
"src/main.css",
|
|
6
|
+
"src/styles.css",
|
|
7
|
+
"src/styles/globals.css",
|
|
8
|
+
"src/styles/index.css",
|
|
9
|
+
"src/app/globals.css",
|
|
10
|
+
"src/global.css",
|
|
11
|
+
"src/app.css"
|
|
12
|
+
];
|
|
13
|
+
function f(s) {
|
|
14
|
+
for (const r of n) {
|
|
15
|
+
const e = t(s, r);
|
|
16
|
+
if (l(e)) return [e];
|
|
17
|
+
}
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
function o(s, r) {
|
|
21
|
+
if (s === void 0 || s === !1) return [];
|
|
22
|
+
if (s === !0) return f(r);
|
|
23
|
+
if (typeof s == "string")
|
|
24
|
+
return s.length > 0 ? [t(r, s)] : [];
|
|
25
|
+
const e = [];
|
|
26
|
+
for (const c of s)
|
|
27
|
+
typeof c == "string" && c.length > 0 && e.push(t(r, c));
|
|
28
|
+
return e;
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
f as d,
|
|
32
|
+
o as r
|
|
33
|
+
};
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./registry-DRRMxvoz.cjs"),n=require("./actions-D9bnuJ1b.cjs"),t=require("./source-9OiU8x_y.cjs");function o(r){return r}exports.ComponentRegistry=e.ComponentRegistry;exports.UnknownEntryError=e.UnknownEntryError;exports.defaultRegistry=e.defaultRegistry;exports.ActionChannel=n.ActionChannel;exports.action=n.action;exports.defaultActionChannel=n.defaultActionChannel;exports.injectActions=n.injectActions;exports.renderPreviewEntrySource=t.renderPreviewEntrySource;exports.defineJogakConfig=o;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
export type { ArgType, JogakMeta, Jogak, RegistryEntry, RegistryEntryMeta, CategoryTree, CategoryMetaTree, JogakAdapter, JogakPluginOptions, } from './types.js';
|
|
1
|
+
export type { ArgType, JogakMeta, Jogak, RegistryEntry, RegistryEntryMeta, CategoryTree, CategoryMetaTree, JogakAdapter, JogakPluginOptions, UserViteOptions, } from './types.js';
|
|
2
2
|
export { ComponentRegistry, defaultRegistry, UnknownEntryError } from './registry.js';
|
|
3
3
|
export { ActionChannel, defaultActionChannel, action, injectActions, type ActionLog, type ActionListener, } from './actions.js';
|
|
4
|
+
export { defineJogakConfig, type JogakConfig } from './config.js';
|
|
5
|
+
export type { BuilderAdapter, BuilderName, GlobalCssSpec, SpawnDevOptions, DevHandle, BuildOptions, BuildResult, PreviewEntryMeta, HostLogger, } from './adapter.js';
|
|
6
|
+
export type { JogakMessageToFrame, JogakMessageFromFrame, } from './preview-entry/protocol.js';
|
|
7
|
+
export { renderPreviewEntrySource, type RenderPreviewEntryOptions, } from './preview-entry/source.js';
|