everything-dev 1.48.0 → 1.50.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.
- package/dist/app.cjs +66 -86
- package/dist/app.cjs.map +1 -1
- package/dist/app.mjs +66 -87
- package/dist/app.mjs.map +1 -1
- package/dist/cli/db-doctor.cjs +6 -23
- package/dist/cli/db-doctor.cjs.map +1 -1
- package/dist/cli/db-doctor.mjs +7 -24
- package/dist/cli/db-doctor.mjs.map +1 -1
- package/dist/cli/db-repair.cjs +25 -20
- package/dist/cli/db-repair.cjs.map +1 -1
- package/dist/cli/db-repair.mjs +25 -20
- package/dist/cli/db-repair.mjs.map +1 -1
- package/dist/cli/db-studio.cjs +4 -2
- package/dist/cli/db-studio.cjs.map +1 -1
- package/dist/cli/db-studio.mjs +5 -3
- package/dist/cli/db-studio.mjs.map +1 -1
- package/dist/cli/framework-version.cjs +45 -9
- package/dist/cli/framework-version.cjs.map +1 -1
- package/dist/cli/framework-version.mjs +45 -10
- package/dist/cli/framework-version.mjs.map +1 -1
- package/dist/cli/infra.cjs +89 -3
- package/dist/cli/infra.cjs.map +1 -1
- package/dist/cli/infra.mjs +83 -4
- package/dist/cli/infra.mjs.map +1 -1
- package/dist/cli/init.cjs +39 -15
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.d.cts +8 -3
- package/dist/cli/init.d.cts.map +1 -1
- package/dist/cli/init.d.mts +8 -3
- package/dist/cli/init.d.mts.map +1 -1
- package/dist/cli/init.mjs +39 -16
- package/dist/cli/init.mjs.map +1 -1
- package/dist/cli/status.cjs +6 -2
- package/dist/cli/status.cjs.map +1 -1
- package/dist/cli/status.mjs +7 -3
- package/dist/cli/status.mjs.map +1 -1
- package/dist/cli/sync.cjs +1 -3
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +1 -3
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/upgrade.cjs +8 -4
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +8 -4
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/cli.cjs +73 -9
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +74 -10
- package/dist/cli.mjs.map +1 -1
- package/dist/config.cjs +7 -3
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +7 -3
- package/dist/config.mjs.map +1 -1
- package/dist/contract.cjs +76 -4
- package/dist/contract.cjs.map +1 -1
- package/dist/contract.d.cts +164 -19
- package/dist/contract.d.cts.map +1 -1
- package/dist/contract.d.mts +164 -19
- package/dist/contract.d.mts.map +1 -1
- package/dist/contract.meta.cjs +17 -2
- package/dist/contract.meta.cjs.map +1 -1
- package/dist/contract.meta.d.cts +23 -2
- package/dist/contract.meta.d.mts +23 -2
- package/dist/contract.meta.mjs +17 -2
- package/dist/contract.meta.mjs.map +1 -1
- package/dist/contract.mjs +72 -5
- package/dist/contract.mjs.map +1 -1
- package/dist/db.cjs +33 -25
- package/dist/db.cjs.map +1 -1
- package/dist/db.d.cts +16 -9
- package/dist/db.d.cts.map +1 -1
- package/dist/db.d.mts +16 -9
- package/dist/db.d.mts.map +1 -1
- package/dist/db.mjs +33 -24
- package/dist/db.mjs.map +1 -1
- package/dist/dev-session.cjs +28 -0
- package/dist/dev-session.cjs.map +1 -1
- package/dist/dev-session.mjs +29 -1
- package/dist/dev-session.mjs.map +1 -1
- package/dist/index.cjs +5 -0
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/infra/planner.cjs +337 -0
- package/dist/infra/planner.cjs.map +1 -0
- package/dist/infra/planner.mjs +336 -0
- package/dist/infra/planner.mjs.map +1 -0
- package/dist/infra/preflight.cjs +131 -0
- package/dist/infra/preflight.cjs.map +1 -0
- package/dist/infra/preflight.mjs +130 -0
- package/dist/infra/preflight.mjs.map +1 -0
- package/dist/infra/types.cjs +9 -0
- package/dist/infra/types.cjs.map +1 -0
- package/dist/infra/types.mjs +8 -0
- package/dist/infra/types.mjs.map +1 -0
- package/dist/near-cli.cjs +37 -0
- package/dist/near-cli.cjs.map +1 -1
- package/dist/near-cli.mjs +36 -1
- package/dist/near-cli.mjs.map +1 -1
- package/dist/orchestrator.cjs +10 -2
- package/dist/orchestrator.cjs.map +1 -1
- package/dist/orchestrator.mjs +10 -2
- package/dist/orchestrator.mjs.map +1 -1
- package/dist/plugin.cjs +160 -43
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +64 -8
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.mts +64 -8
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +164 -47
- package/dist/plugin.mjs.map +1 -1
- package/dist/process-registry.cjs +88 -0
- package/dist/process-registry.cjs.map +1 -0
- package/dist/process-registry.mjs +83 -0
- package/dist/process-registry.mjs.map +1 -0
- package/dist/publish.cjs +4 -0
- package/dist/publish.cjs.map +1 -1
- package/dist/publish.mjs +4 -0
- package/dist/publish.mjs.map +1 -1
- package/dist/service-descriptor.cjs +4 -0
- package/dist/service-descriptor.cjs.map +1 -1
- package/dist/service-descriptor.mjs +4 -1
- package/dist/service-descriptor.mjs.map +1 -1
- package/dist/types.d.cts +2 -2
- package/dist/types.d.mts +2 -2
- package/dist/ui/index.cjs +2 -1
- package/dist/ui/index.d.cts +2 -2
- package/dist/ui/index.d.mts +2 -2
- package/dist/ui/index.mjs +2 -2
- package/dist/ui/router.cjs +40 -0
- package/dist/ui/router.cjs.map +1 -1
- package/dist/ui/router.d.cts +6 -1
- package/dist/ui/router.d.cts.map +1 -1
- package/dist/ui/router.d.mts +6 -1
- package/dist/ui/router.d.mts.map +1 -1
- package/dist/ui/router.mjs +40 -1
- package/dist/ui/router.mjs.map +1 -1
- package/package.json +4 -1
- package/skills/cli-reference/SKILL.md +5 -4
- package/skills/dev-workflow/SKILL.md +40 -11
- package/skills/plugin-development/SKILL.md +9 -2
package/dist/ui/router.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs","names":[],"sources":["../../src/ui/router.ts"],"sourcesContent":["import type { AnyRouter } from \"@tanstack/react-router\";\nimport type { HeadData, HeadLink, HeadMeta, HeadScript } from \"./types\";\n\nexport function getMetaKey(meta: HeadMeta): string {\n if (!meta) return \"null\";\n if (\"title\" in meta) return \"title\";\n if (\"charSet\" in meta) return \"charSet\";\n if (\"name\" in meta) return `name:${(meta as { name: string }).name}`;\n if (\"property\" in meta) {\n return `property:${(meta as { property: string }).property}`;\n }\n if (\"httpEquiv\" in meta) {\n return `httpEquiv:${(meta as { httpEquiv: string }).httpEquiv}`;\n }\n return JSON.stringify(meta);\n}\n\nexport function getLinkKey(link: HeadLink): string {\n const rel = (link as { rel?: string }).rel ?? \"\";\n const href = (link as { href?: string }).href ?? \"\";\n return `${rel}:${href}`;\n}\n\nexport function getScriptKey(script: HeadScript): string {\n if (!script) return \"null\";\n if (\"src\" in script && script.src) return `src:${script.src}`;\n if (\"children\" in script && script.children) {\n return `children:${typeof script.children === \"string\" ? script.children : JSON.stringify(script.children)}`;\n }\n return JSON.stringify(script);\n}\n\nexport async function collectHeadData(router: AnyRouter): Promise<HeadData> {\n await router.load();\n\n const metaMap = new Map<string, HeadMeta>();\n const linkMap = new Map<string, HeadLink>();\n const scriptMap = new Map<string, HeadScript>();\n\n for (const match of router.state.matches) {\n const route =\n (\n router as AnyRouter & {\n routesById?: Record<string, { options?: { head?: (...args: unknown[]) => unknown } }>;\n }\n ).routesById?.[(match as { routeId: string }).routeId] ??\n (match as { route?: { options?: { head?: (...args: unknown[]) => unknown } } }).route;\n const headFn = route?.options?.head;\n if (!headFn) continue;\n\n try {\n const headResult = (await headFn({\n loaderData: match.loaderData,\n matches: router.state.matches,\n match,\n params: match.params,\n })) as {\n meta?: HeadMeta[];\n links?: HeadLink[];\n scripts?: HeadScript[];\n };\n\n if (headResult?.meta) {\n for (const meta of headResult.meta) {\n metaMap.set(getMetaKey(meta), meta);\n }\n }\n if (headResult?.links) {\n for (const link of headResult.links) {\n linkMap.set(getLinkKey(link), link);\n }\n }\n if (headResult?.scripts) {\n for (const script of headResult.scripts) {\n scriptMap.set(getScriptKey(script), script);\n }\n }\n } catch (error) {\n console.warn(`[collectHeadData] head() failed for ${match.routeId}:`, error);\n }\n }\n\n return {\n meta: [...metaMap.values()],\n links: [...linkMap.values()],\n scripts: [...scriptMap.values()],\n };\n}\n"],"mappings":";;;AAGA,SAAgB,WAAW,MAAwB;AACjD,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,WAAW,KAAM,QAAO;AAC5B,KAAI,aAAa,KAAM,QAAO;AAC9B,KAAI,UAAU,KAAM,QAAO,QAAS,KAA0B;AAC9D,KAAI,cAAc,KAChB,QAAO,YAAa,KAA8B;AAEpD,KAAI,eAAe,KACjB,QAAO,aAAc,KAA+B;AAEtD,QAAO,KAAK,UAAU,KAAK;;AAG7B,SAAgB,WAAW,MAAwB;AAGjD,QAAO,GAFM,KAA0B,OAAO,GAEhC,GADA,KAA2B,QAAQ;;AAInD,SAAgB,aAAa,QAA4B;AACvD,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,SAAS,UAAU,OAAO,IAAK,QAAO,OAAO,OAAO;AACxD,KAAI,cAAc,UAAU,OAAO,SACjC,QAAO,YAAY,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW,KAAK,UAAU,OAAO,SAAS;AAE5G,QAAO,KAAK,UAAU,OAAO;;AAG/B,eAAsB,gBAAgB,QAAsC;AAC1E,OAAM,OAAO,MAAM;CAEnB,MAAM,0BAAU,IAAI,KAAuB;CAC3C,MAAM,0BAAU,IAAI,KAAuB;CAC3C,MAAM,4BAAY,IAAI,KAAyB;AAE/C,MAAK,MAAM,SAAS,OAAO,MAAM,SAAS;EAQxC,MAAM,UALF,OAGA,aAAc,MAA8B,YAC7C,MAA+E,QAC5D,SAAS;AAC/B,MAAI,CAAC,OAAQ;AAEb,MAAI;GACF,MAAM,aAAc,MAAM,OAAO;IAC/B,YAAY,MAAM;IAClB,SAAS,OAAO,MAAM;IACtB;IACA,QAAQ,MAAM;IACf,CAAC;AAMF,OAAI,YAAY,KACd,MAAK,MAAM,QAAQ,WAAW,KAC5B,SAAQ,IAAI,WAAW,KAAK,EAAE,KAAK;AAGvC,OAAI,YAAY,MACd,MAAK,MAAM,QAAQ,WAAW,MAC5B,SAAQ,IAAI,WAAW,KAAK,EAAE,KAAK;AAGvC,OAAI,YAAY,QACd,MAAK,MAAM,UAAU,WAAW,QAC9B,WAAU,IAAI,aAAa,OAAO,EAAE,OAAO;WAGxC,OAAO;AACd,WAAQ,KAAK,uCAAuC,MAAM,QAAQ,IAAI,MAAM;;;AAIhF,QAAO;EACL,MAAM,CAAC,GAAG,QAAQ,QAAQ,CAAC;EAC3B,OAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC;EAC5B,SAAS,CAAC,GAAG,UAAU,QAAQ,CAAC;EACjC"}
|
|
1
|
+
{"version":3,"file":"router.cjs","names":[],"sources":["../../src/ui/router.ts"],"sourcesContent":["import type { AnyRouter } from \"@tanstack/react-router\";\nimport type { HeadData, HeadLink, HeadMeta, HeadScript } from \"./types\";\n\nexport function getMetaKey(meta: HeadMeta): string {\n if (!meta) return \"null\";\n if (\"title\" in meta) return \"title\";\n if (\"charSet\" in meta) return \"charSet\";\n if (\"name\" in meta) return `name:${(meta as { name: string }).name}`;\n if (\"property\" in meta) {\n return `property:${(meta as { property: string }).property}`;\n }\n if (\"httpEquiv\" in meta) {\n return `httpEquiv:${(meta as { httpEquiv: string }).httpEquiv}`;\n }\n return JSON.stringify(meta);\n}\n\nexport function getLinkKey(link: HeadLink): string {\n const rel = (link as { rel?: string }).rel ?? \"\";\n const href = (link as { href?: string }).href ?? \"\";\n return `${rel}:${href}`;\n}\n\nexport function getScriptKey(script: HeadScript): string {\n if (!script) return \"null\";\n if (\"src\" in script && script.src) return `src:${script.src}`;\n if (\"children\" in script && script.children) {\n return `children:${typeof script.children === \"string\" ? script.children : JSON.stringify(script.children)}`;\n }\n return JSON.stringify(script);\n}\n\nexport async function collectHeadData(router: AnyRouter): Promise<HeadData> {\n await router.load();\n\n const metaMap = new Map<string, HeadMeta>();\n const linkMap = new Map<string, HeadLink>();\n const scriptMap = new Map<string, HeadScript>();\n\n for (const match of router.state.matches) {\n const route =\n (\n router as AnyRouter & {\n routesById?: Record<string, { options?: { head?: (...args: unknown[]) => unknown } }>;\n }\n ).routesById?.[(match as { routeId: string }).routeId] ??\n (match as { route?: { options?: { head?: (...args: unknown[]) => unknown } } }).route;\n const headFn = route?.options?.head;\n if (!headFn) continue;\n\n try {\n const headResult = (await headFn({\n loaderData: match.loaderData,\n matches: router.state.matches,\n match,\n params: match.params,\n })) as {\n meta?: HeadMeta[];\n links?: HeadLink[];\n scripts?: HeadScript[];\n };\n\n if (headResult?.meta) {\n for (const meta of headResult.meta) {\n metaMap.set(getMetaKey(meta), meta);\n }\n }\n if (headResult?.links) {\n for (const link of headResult.links) {\n linkMap.set(getLinkKey(link), link);\n }\n }\n if (headResult?.scripts) {\n for (const script of headResult.scripts) {\n scriptMap.set(getScriptKey(script), script);\n }\n }\n } catch (error) {\n console.warn(`[collectHeadData] head() failed for ${match.routeId}:`, error);\n }\n }\n\n return {\n meta: [...metaMap.values()],\n links: [...linkMap.values()],\n scripts: [...scriptMap.values()],\n };\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction serializeMeta(meta: HeadMeta): string {\n if (!meta) return \"\";\n if (\"charSet\" in meta) return `<meta charset=\"${escapeHtml(String(meta.charSet))}\">`;\n if (\"title\" in meta) return `<title>${escapeHtml(String(meta.title))}</title>`;\n const attrs = Object.entries(meta as Record<string, unknown>)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${k}=\"${escapeHtml(String(v))}\"`)\n .join(\" \");\n return `<meta ${attrs}>`;\n}\n\nfunction serializeLink(link: HeadLink): string {\n if (!link) return \"\";\n const attrs = Object.entries(link as Record<string, unknown>)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${k}=\"${escapeHtml(String(v))}\"`)\n .join(\" \");\n return `<link ${attrs}>`;\n}\n\nfunction serializeScript(script: HeadScript, cspNonce?: string): string {\n if (!script) return \"\";\n if (\"src\" in script && script.src) {\n const attrs: string[] = [`src=\"${escapeHtml(script.src)}\"`];\n if (script.integrity) attrs.push(`integrity=\"${escapeHtml(script.integrity)}\"`);\n if (script.crossOrigin) attrs.push(`crossorigin=\"${escapeHtml(script.crossOrigin)}\"`);\n if (script.type) attrs.push(`type=\"${escapeHtml(script.type)}\"`);\n if (cspNonce) attrs.push(`nonce=\"${cspNonce}\"`);\n return `<script ${attrs.join(\" \")}></script>`;\n }\n if (\"children\" in script) {\n const attrs: string[] = [];\n if (script.type) attrs.push(`type=\"${escapeHtml(script.type)}\"`);\n if (cspNonce) attrs.push(`nonce=\"${cspNonce}\"`);\n const content =\n typeof script.children === \"string\" ? script.children : JSON.stringify(script.children);\n return `<script${attrs.length ? ` ${attrs.join(\" \")}` : \"\"}>${content}</script>`;\n }\n return \"\";\n}\n\nexport function serializeHeadData(\n headData: HeadData,\n cspNonce?: string,\n): { metaHtml: string; linkHtml: string; scriptHtml: string } {\n return {\n metaHtml: headData.meta\n .filter(Boolean)\n .map((m) => serializeMeta(m))\n .join(\"\\n\"),\n linkHtml: headData.links\n .filter(Boolean)\n .map((l) => serializeLink(l))\n .join(\"\\n\"),\n scriptHtml: headData.scripts\n .filter(Boolean)\n .map((s) => serializeScript(s, cspNonce))\n .join(\"\\n\"),\n };\n}\n"],"mappings":"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"}
|
package/dist/ui/router.d.cts
CHANGED
|
@@ -6,6 +6,11 @@ declare function getMetaKey(meta: HeadMeta): string;
|
|
|
6
6
|
declare function getLinkKey(link: HeadLink): string;
|
|
7
7
|
declare function getScriptKey(script: HeadScript): string;
|
|
8
8
|
declare function collectHeadData(router: AnyRouter): Promise<HeadData>;
|
|
9
|
+
declare function serializeHeadData(headData: HeadData, cspNonce?: string): {
|
|
10
|
+
metaHtml: string;
|
|
11
|
+
linkHtml: string;
|
|
12
|
+
scriptHtml: string;
|
|
13
|
+
};
|
|
9
14
|
//#endregion
|
|
10
|
-
export { collectHeadData, getLinkKey, getMetaKey, getScriptKey };
|
|
15
|
+
export { collectHeadData, getLinkKey, getMetaKey, getScriptKey, serializeHeadData };
|
|
11
16
|
//# sourceMappingURL=router.d.cts.map
|
package/dist/ui/router.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.cts","names":[],"sources":["../../src/ui/router.ts"],"mappings":";;;;iBAGgB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAcjB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAMjB,YAAA,CAAa,MAAA,EAAQ,UAAA;AAAA,iBASf,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,OAAA,CAAQ,QAAA"}
|
|
1
|
+
{"version":3,"file":"router.d.cts","names":[],"sources":["../../src/ui/router.ts"],"mappings":";;;;iBAGgB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAcjB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAMjB,YAAA,CAAa,MAAA,EAAQ,UAAA;AAAA,iBASf,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,OAAA,CAAQ,QAAA;AAAA,iBA0GlD,iBAAA,CACd,QAAA,EAAU,QAAA,EACV,QAAA;EACG,QAAA;EAAkB,QAAA;EAAkB,UAAA;AAAA"}
|
package/dist/ui/router.d.mts
CHANGED
|
@@ -6,6 +6,11 @@ declare function getMetaKey(meta: HeadMeta): string;
|
|
|
6
6
|
declare function getLinkKey(link: HeadLink): string;
|
|
7
7
|
declare function getScriptKey(script: HeadScript): string;
|
|
8
8
|
declare function collectHeadData(router: AnyRouter): Promise<HeadData>;
|
|
9
|
+
declare function serializeHeadData(headData: HeadData, cspNonce?: string): {
|
|
10
|
+
metaHtml: string;
|
|
11
|
+
linkHtml: string;
|
|
12
|
+
scriptHtml: string;
|
|
13
|
+
};
|
|
9
14
|
//#endregion
|
|
10
|
-
export { collectHeadData, getLinkKey, getMetaKey, getScriptKey };
|
|
15
|
+
export { collectHeadData, getLinkKey, getMetaKey, getScriptKey, serializeHeadData };
|
|
11
16
|
//# sourceMappingURL=router.d.mts.map
|
package/dist/ui/router.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.mts","names":[],"sources":["../../src/ui/router.ts"],"mappings":";;;;iBAGgB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAcjB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAMjB,YAAA,CAAa,MAAA,EAAQ,UAAA;AAAA,iBASf,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,OAAA,CAAQ,QAAA"}
|
|
1
|
+
{"version":3,"file":"router.d.mts","names":[],"sources":["../../src/ui/router.ts"],"mappings":";;;;iBAGgB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAcjB,UAAA,CAAW,IAAA,EAAM,QAAA;AAAA,iBAMjB,YAAA,CAAa,MAAA,EAAQ,UAAA;AAAA,iBASf,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,OAAA,CAAQ,QAAA;AAAA,iBA0GlD,iBAAA,CACd,QAAA,EAAU,QAAA,EACV,QAAA;EACG,QAAA;EAAkB,QAAA;EAAkB,UAAA;AAAA"}
|
package/dist/ui/router.mjs
CHANGED
|
@@ -45,7 +45,46 @@ async function collectHeadData(router) {
|
|
|
45
45
|
scripts: [...scriptMap.values()]
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
+
function escapeHtml(s) {
|
|
49
|
+
return s.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
50
|
+
}
|
|
51
|
+
function serializeMeta(meta) {
|
|
52
|
+
if (!meta) return "";
|
|
53
|
+
if ("charSet" in meta) return `<meta charset="${escapeHtml(String(meta.charSet))}">`;
|
|
54
|
+
if ("title" in meta) return `<title>${escapeHtml(String(meta.title))}</title>`;
|
|
55
|
+
return `<meta ${Object.entries(meta).filter(([, v]) => v != null).map(([k, v]) => `${k}="${escapeHtml(String(v))}"`).join(" ")}>`;
|
|
56
|
+
}
|
|
57
|
+
function serializeLink(link) {
|
|
58
|
+
if (!link) return "";
|
|
59
|
+
return `<link ${Object.entries(link).filter(([, v]) => v != null).map(([k, v]) => `${k}="${escapeHtml(String(v))}"`).join(" ")}>`;
|
|
60
|
+
}
|
|
61
|
+
function serializeScript(script, cspNonce) {
|
|
62
|
+
if (!script) return "";
|
|
63
|
+
if ("src" in script && script.src) {
|
|
64
|
+
const attrs = [`src="${escapeHtml(script.src)}"`];
|
|
65
|
+
if (script.integrity) attrs.push(`integrity="${escapeHtml(script.integrity)}"`);
|
|
66
|
+
if (script.crossOrigin) attrs.push(`crossorigin="${escapeHtml(script.crossOrigin)}"`);
|
|
67
|
+
if (script.type) attrs.push(`type="${escapeHtml(script.type)}"`);
|
|
68
|
+
if (cspNonce) attrs.push(`nonce="${cspNonce}"`);
|
|
69
|
+
return `<script ${attrs.join(" ")}><\/script>`;
|
|
70
|
+
}
|
|
71
|
+
if ("children" in script) {
|
|
72
|
+
const attrs = [];
|
|
73
|
+
if (script.type) attrs.push(`type="${escapeHtml(script.type)}"`);
|
|
74
|
+
if (cspNonce) attrs.push(`nonce="${cspNonce}"`);
|
|
75
|
+
const content = typeof script.children === "string" ? script.children : JSON.stringify(script.children);
|
|
76
|
+
return `<script${attrs.length ? ` ${attrs.join(" ")}` : ""}>${content}<\/script>`;
|
|
77
|
+
}
|
|
78
|
+
return "";
|
|
79
|
+
}
|
|
80
|
+
function serializeHeadData(headData, cspNonce) {
|
|
81
|
+
return {
|
|
82
|
+
metaHtml: headData.meta.filter(Boolean).map((m) => serializeMeta(m)).join("\n"),
|
|
83
|
+
linkHtml: headData.links.filter(Boolean).map((l) => serializeLink(l)).join("\n"),
|
|
84
|
+
scriptHtml: headData.scripts.filter(Boolean).map((s) => serializeScript(s, cspNonce)).join("\n")
|
|
85
|
+
};
|
|
86
|
+
}
|
|
48
87
|
|
|
49
88
|
//#endregion
|
|
50
|
-
export { collectHeadData, getLinkKey, getMetaKey, getScriptKey };
|
|
89
|
+
export { collectHeadData, getLinkKey, getMetaKey, getScriptKey, serializeHeadData };
|
|
51
90
|
//# sourceMappingURL=router.mjs.map
|
package/dist/ui/router.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.mjs","names":[],"sources":["../../src/ui/router.ts"],"sourcesContent":["import type { AnyRouter } from \"@tanstack/react-router\";\nimport type { HeadData, HeadLink, HeadMeta, HeadScript } from \"./types\";\n\nexport function getMetaKey(meta: HeadMeta): string {\n if (!meta) return \"null\";\n if (\"title\" in meta) return \"title\";\n if (\"charSet\" in meta) return \"charSet\";\n if (\"name\" in meta) return `name:${(meta as { name: string }).name}`;\n if (\"property\" in meta) {\n return `property:${(meta as { property: string }).property}`;\n }\n if (\"httpEquiv\" in meta) {\n return `httpEquiv:${(meta as { httpEquiv: string }).httpEquiv}`;\n }\n return JSON.stringify(meta);\n}\n\nexport function getLinkKey(link: HeadLink): string {\n const rel = (link as { rel?: string }).rel ?? \"\";\n const href = (link as { href?: string }).href ?? \"\";\n return `${rel}:${href}`;\n}\n\nexport function getScriptKey(script: HeadScript): string {\n if (!script) return \"null\";\n if (\"src\" in script && script.src) return `src:${script.src}`;\n if (\"children\" in script && script.children) {\n return `children:${typeof script.children === \"string\" ? script.children : JSON.stringify(script.children)}`;\n }\n return JSON.stringify(script);\n}\n\nexport async function collectHeadData(router: AnyRouter): Promise<HeadData> {\n await router.load();\n\n const metaMap = new Map<string, HeadMeta>();\n const linkMap = new Map<string, HeadLink>();\n const scriptMap = new Map<string, HeadScript>();\n\n for (const match of router.state.matches) {\n const route =\n (\n router as AnyRouter & {\n routesById?: Record<string, { options?: { head?: (...args: unknown[]) => unknown } }>;\n }\n ).routesById?.[(match as { routeId: string }).routeId] ??\n (match as { route?: { options?: { head?: (...args: unknown[]) => unknown } } }).route;\n const headFn = route?.options?.head;\n if (!headFn) continue;\n\n try {\n const headResult = (await headFn({\n loaderData: match.loaderData,\n matches: router.state.matches,\n match,\n params: match.params,\n })) as {\n meta?: HeadMeta[];\n links?: HeadLink[];\n scripts?: HeadScript[];\n };\n\n if (headResult?.meta) {\n for (const meta of headResult.meta) {\n metaMap.set(getMetaKey(meta), meta);\n }\n }\n if (headResult?.links) {\n for (const link of headResult.links) {\n linkMap.set(getLinkKey(link), link);\n }\n }\n if (headResult?.scripts) {\n for (const script of headResult.scripts) {\n scriptMap.set(getScriptKey(script), script);\n }\n }\n } catch (error) {\n console.warn(`[collectHeadData] head() failed for ${match.routeId}:`, error);\n }\n }\n\n return {\n meta: [...metaMap.values()],\n links: [...linkMap.values()],\n scripts: [...scriptMap.values()],\n };\n}\n"],"mappings":";AAGA,SAAgB,WAAW,MAAwB;AACjD,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,WAAW,KAAM,QAAO;AAC5B,KAAI,aAAa,KAAM,QAAO;AAC9B,KAAI,UAAU,KAAM,QAAO,QAAS,KAA0B;AAC9D,KAAI,cAAc,KAChB,QAAO,YAAa,KAA8B;AAEpD,KAAI,eAAe,KACjB,QAAO,aAAc,KAA+B;AAEtD,QAAO,KAAK,UAAU,KAAK;;AAG7B,SAAgB,WAAW,MAAwB;AAGjD,QAAO,GAFM,KAA0B,OAAO,GAEhC,GADA,KAA2B,QAAQ;;AAInD,SAAgB,aAAa,QAA4B;AACvD,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,SAAS,UAAU,OAAO,IAAK,QAAO,OAAO,OAAO;AACxD,KAAI,cAAc,UAAU,OAAO,SACjC,QAAO,YAAY,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW,KAAK,UAAU,OAAO,SAAS;AAE5G,QAAO,KAAK,UAAU,OAAO;;AAG/B,eAAsB,gBAAgB,QAAsC;AAC1E,OAAM,OAAO,MAAM;CAEnB,MAAM,0BAAU,IAAI,KAAuB;CAC3C,MAAM,0BAAU,IAAI,KAAuB;CAC3C,MAAM,4BAAY,IAAI,KAAyB;AAE/C,MAAK,MAAM,SAAS,OAAO,MAAM,SAAS;EAQxC,MAAM,UALF,OAGA,aAAc,MAA8B,YAC7C,MAA+E,QAC5D,SAAS;AAC/B,MAAI,CAAC,OAAQ;AAEb,MAAI;GACF,MAAM,aAAc,MAAM,OAAO;IAC/B,YAAY,MAAM;IAClB,SAAS,OAAO,MAAM;IACtB;IACA,QAAQ,MAAM;IACf,CAAC;AAMF,OAAI,YAAY,KACd,MAAK,MAAM,QAAQ,WAAW,KAC5B,SAAQ,IAAI,WAAW,KAAK,EAAE,KAAK;AAGvC,OAAI,YAAY,MACd,MAAK,MAAM,QAAQ,WAAW,MAC5B,SAAQ,IAAI,WAAW,KAAK,EAAE,KAAK;AAGvC,OAAI,YAAY,QACd,MAAK,MAAM,UAAU,WAAW,QAC9B,WAAU,IAAI,aAAa,OAAO,EAAE,OAAO;WAGxC,OAAO;AACd,WAAQ,KAAK,uCAAuC,MAAM,QAAQ,IAAI,MAAM;;;AAIhF,QAAO;EACL,MAAM,CAAC,GAAG,QAAQ,QAAQ,CAAC;EAC3B,OAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC;EAC5B,SAAS,CAAC,GAAG,UAAU,QAAQ,CAAC;EACjC"}
|
|
1
|
+
{"version":3,"file":"router.mjs","names":[],"sources":["../../src/ui/router.ts"],"sourcesContent":["import type { AnyRouter } from \"@tanstack/react-router\";\nimport type { HeadData, HeadLink, HeadMeta, HeadScript } from \"./types\";\n\nexport function getMetaKey(meta: HeadMeta): string {\n if (!meta) return \"null\";\n if (\"title\" in meta) return \"title\";\n if (\"charSet\" in meta) return \"charSet\";\n if (\"name\" in meta) return `name:${(meta as { name: string }).name}`;\n if (\"property\" in meta) {\n return `property:${(meta as { property: string }).property}`;\n }\n if (\"httpEquiv\" in meta) {\n return `httpEquiv:${(meta as { httpEquiv: string }).httpEquiv}`;\n }\n return JSON.stringify(meta);\n}\n\nexport function getLinkKey(link: HeadLink): string {\n const rel = (link as { rel?: string }).rel ?? \"\";\n const href = (link as { href?: string }).href ?? \"\";\n return `${rel}:${href}`;\n}\n\nexport function getScriptKey(script: HeadScript): string {\n if (!script) return \"null\";\n if (\"src\" in script && script.src) return `src:${script.src}`;\n if (\"children\" in script && script.children) {\n return `children:${typeof script.children === \"string\" ? script.children : JSON.stringify(script.children)}`;\n }\n return JSON.stringify(script);\n}\n\nexport async function collectHeadData(router: AnyRouter): Promise<HeadData> {\n await router.load();\n\n const metaMap = new Map<string, HeadMeta>();\n const linkMap = new Map<string, HeadLink>();\n const scriptMap = new Map<string, HeadScript>();\n\n for (const match of router.state.matches) {\n const route =\n (\n router as AnyRouter & {\n routesById?: Record<string, { options?: { head?: (...args: unknown[]) => unknown } }>;\n }\n ).routesById?.[(match as { routeId: string }).routeId] ??\n (match as { route?: { options?: { head?: (...args: unknown[]) => unknown } } }).route;\n const headFn = route?.options?.head;\n if (!headFn) continue;\n\n try {\n const headResult = (await headFn({\n loaderData: match.loaderData,\n matches: router.state.matches,\n match,\n params: match.params,\n })) as {\n meta?: HeadMeta[];\n links?: HeadLink[];\n scripts?: HeadScript[];\n };\n\n if (headResult?.meta) {\n for (const meta of headResult.meta) {\n metaMap.set(getMetaKey(meta), meta);\n }\n }\n if (headResult?.links) {\n for (const link of headResult.links) {\n linkMap.set(getLinkKey(link), link);\n }\n }\n if (headResult?.scripts) {\n for (const script of headResult.scripts) {\n scriptMap.set(getScriptKey(script), script);\n }\n }\n } catch (error) {\n console.warn(`[collectHeadData] head() failed for ${match.routeId}:`, error);\n }\n }\n\n return {\n meta: [...metaMap.values()],\n links: [...linkMap.values()],\n scripts: [...scriptMap.values()],\n };\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction serializeMeta(meta: HeadMeta): string {\n if (!meta) return \"\";\n if (\"charSet\" in meta) return `<meta charset=\"${escapeHtml(String(meta.charSet))}\">`;\n if (\"title\" in meta) return `<title>${escapeHtml(String(meta.title))}</title>`;\n const attrs = Object.entries(meta as Record<string, unknown>)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${k}=\"${escapeHtml(String(v))}\"`)\n .join(\" \");\n return `<meta ${attrs}>`;\n}\n\nfunction serializeLink(link: HeadLink): string {\n if (!link) return \"\";\n const attrs = Object.entries(link as Record<string, unknown>)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${k}=\"${escapeHtml(String(v))}\"`)\n .join(\" \");\n return `<link ${attrs}>`;\n}\n\nfunction serializeScript(script: HeadScript, cspNonce?: string): string {\n if (!script) return \"\";\n if (\"src\" in script && script.src) {\n const attrs: string[] = [`src=\"${escapeHtml(script.src)}\"`];\n if (script.integrity) attrs.push(`integrity=\"${escapeHtml(script.integrity)}\"`);\n if (script.crossOrigin) attrs.push(`crossorigin=\"${escapeHtml(script.crossOrigin)}\"`);\n if (script.type) attrs.push(`type=\"${escapeHtml(script.type)}\"`);\n if (cspNonce) attrs.push(`nonce=\"${cspNonce}\"`);\n return `<script ${attrs.join(\" \")}></script>`;\n }\n if (\"children\" in script) {\n const attrs: string[] = [];\n if (script.type) attrs.push(`type=\"${escapeHtml(script.type)}\"`);\n if (cspNonce) attrs.push(`nonce=\"${cspNonce}\"`);\n const content =\n typeof script.children === \"string\" ? script.children : JSON.stringify(script.children);\n return `<script${attrs.length ? ` ${attrs.join(\" \")}` : \"\"}>${content}</script>`;\n }\n return \"\";\n}\n\nexport function serializeHeadData(\n headData: HeadData,\n cspNonce?: string,\n): { metaHtml: string; linkHtml: string; scriptHtml: string } {\n return {\n metaHtml: headData.meta\n .filter(Boolean)\n .map((m) => serializeMeta(m))\n .join(\"\\n\"),\n linkHtml: headData.links\n .filter(Boolean)\n .map((l) => serializeLink(l))\n .join(\"\\n\"),\n scriptHtml: headData.scripts\n .filter(Boolean)\n .map((s) => serializeScript(s, cspNonce))\n .join(\"\\n\"),\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -155,15 +155,16 @@ bos deploy --service my-railway # override Railway service name
|
|
|
155
155
|
|
|
156
156
|
→ [`publish-sync`](.) skill and [`super-app`](.) for tenant-aware deploy considerations.
|
|
157
157
|
|
|
158
|
-
### `bos key
|
|
158
|
+
### `bos key generate`
|
|
159
159
|
|
|
160
160
|
Generate a publish access key (NEAR function-call key) scoped to the FastKV registry contract.
|
|
161
|
+
If existing publish keys are found on the account, you will be prompted to remove them.
|
|
161
162
|
|
|
162
|
-
**Flags:** `--allowance <amount>` (default: `
|
|
163
|
+
**Flags:** `--allowance <amount>` (default: `1NEAR`)
|
|
163
164
|
|
|
164
165
|
```bash
|
|
165
|
-
bos key
|
|
166
|
-
bos key
|
|
166
|
+
bos key generate # generate key with default allowance
|
|
167
|
+
bos key generate --allowance 2NEAR # custom allowance
|
|
167
168
|
```
|
|
168
169
|
|
|
169
170
|
Outputs the public key, private key, and registry contract address. The generated key can only call the set and get methods on the BOS registry contract — it cannot transfer funds or call other contracts.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: dev-workflow
|
|
3
3
|
description: Development workflow for everything-dev projects using bos dev, bos start, and the Module Federation runtime. Use when starting dev servers, debugging hot reload, or understanding the service-descriptor architecture.
|
|
4
4
|
metadata:
|
|
5
|
-
sources: "packages/everything-dev/src/service-descriptor.ts,packages/everything-dev/src/orchestrator.ts,packages/everything-dev/src/dev-logs.ts,packages/everything-dev/src/dev-session.ts"
|
|
5
|
+
sources: "packages/everything-dev/src/service-descriptor.ts,packages/everything-dev/src/orchestrator.ts,packages/everything-dev/src/dev-logs.ts,packages/everything-dev/src/dev-session.ts,packages/everything-dev/src/process-registry.ts,packages/everything-dev/src/app.ts"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# everything-dev Development Workflow
|
|
@@ -17,12 +17,29 @@ bos dev
|
|
|
17
17
|
bos dev --api remote # UI only
|
|
18
18
|
bos dev --ui remote # API only
|
|
19
19
|
bos dev # Full local (rarely needed)
|
|
20
|
+
|
|
21
|
+
# Pin individual service ports (unset flags are picked automatically and persisted)
|
|
22
|
+
bos dev --port 3100 --api-port 3101 --ui-port 3103 --auth-port 3102 --plugin-port-start 3110
|
|
20
23
|
```
|
|
21
24
|
|
|
25
|
+
### Port persistence
|
|
26
|
+
|
|
27
|
+
`bos dev` writes the resolved host/api/ui/auth/plugin-port-start values to `.bos/infra-state.json`
|
|
28
|
+
under a `devPorts` key. Subsequent runs reuse the same ports unless you pass an explicit flag
|
|
29
|
+
(or delete the file). This keeps CORS, browser bookmarks, and wallet-allowlisted origins stable
|
|
30
|
+
across restarts.
|
|
31
|
+
|
|
32
|
+
### Port budgets (forward-compat for `--workspaces`)
|
|
33
|
+
|
|
34
|
+
`prepareDevelopmentRuntimeConfig` accepts an optional `portBudget: { min, max }`. When set,
|
|
35
|
+
`pickAvailablePort` skips candidates outside the budget and throws `RangeError` if no free port
|
|
36
|
+
is found inside it. The standalone `bos dev` path does not pass a budget today; a future
|
|
37
|
+
`bos dev --workspaces` orchestrator will slice disjoint budgets per child project.
|
|
38
|
+
|
|
22
39
|
## Port Assignments
|
|
23
40
|
|
|
24
|
-
| Service |
|
|
25
|
-
|
|
41
|
+
| Service | Default | URL |
|
|
42
|
+
|---------|---------|-----|
|
|
26
43
|
| host | 3000 | http://localhost:3000 |
|
|
27
44
|
| api | 3001 | http://localhost:3001 |
|
|
28
45
|
| auth | 3002 | http://localhost:3002 |
|
|
@@ -118,13 +135,16 @@ lsof -i :3003 # Check what is using port 3003
|
|
|
118
135
|
|
|
119
136
|
Kill the conflicting process and retry, or stop the existing `bos dev` session first.
|
|
120
137
|
|
|
121
|
-
### Stale PID
|
|
138
|
+
### Stale PID registry
|
|
122
139
|
|
|
123
|
-
If `bos kill` doesn't run cleanly (e.g., terminal was closed), stale
|
|
140
|
+
If `bos kill` doesn't run cleanly (e.g., terminal was closed), stale entries can linger in the
|
|
141
|
+
global registry at `~/.cache/everything-dev/pids.json`. `bos ps` and `bos kill` always prune
|
|
142
|
+
ESRCH (dead) PIDs on read, so stale entries don't block restart — but you can wipe the file
|
|
143
|
+
manually if you want a clean slate:
|
|
124
144
|
|
|
125
145
|
```bash
|
|
126
|
-
rm
|
|
127
|
-
bos dev
|
|
146
|
+
rm ~/.cache/everything-dev/pids.json # Clear global registry
|
|
147
|
+
bos dev # Start fresh
|
|
128
148
|
```
|
|
129
149
|
|
|
130
150
|
### API not responding
|
|
@@ -157,9 +177,18 @@ bos start --account foo.near --domain bar.com # Load specific config
|
|
|
157
177
|
## Process Management
|
|
158
178
|
|
|
159
179
|
```bash
|
|
160
|
-
bos ps
|
|
161
|
-
bos kill
|
|
162
|
-
bos kill --
|
|
180
|
+
bos ps # List tracked development processes (cwd's entries, with role/ports)
|
|
181
|
+
bos kill # SIGTERM processes owned by cwd
|
|
182
|
+
bos kill --all # SIGTERM across all config directories
|
|
183
|
+
bos kill --signal SIGKILL # Force kill (cwd)
|
|
184
|
+
bos kill --config-dir /path # Target a specific project
|
|
163
185
|
```
|
|
164
186
|
|
|
165
|
-
|
|
187
|
+
The registry lives at `~/.cache/everything-dev/pids.json`, keyed by `pid`. Each entry stores
|
|
188
|
+
`configDir`, `role` (`standalone` today; `workspace-parent`/`workspace-child` reserved for the
|
|
189
|
+
planned `bos dev --workspaces` orchestrator), `ports`, optional `budget`, `startedAt`, and
|
|
190
|
+
`description`. `bos dev` registers on startup and unregisters on graceful shutdown; the
|
|
191
|
+
`BOS_WORKSPACE_CHILD=1` env var suppresses standalone registration so a future parent
|
|
192
|
+
orchestrator owns registry entries.
|
|
193
|
+
|
|
194
|
+
Process tracking uses `~/.cache/everything-dev/pids.json` (global, atomic writes).
|
|
@@ -418,7 +418,10 @@ export function DatabaseLive(url: string) {
|
|
|
418
418
|
1. Create `drizzle.config.ts` in your plugin directory
|
|
419
419
|
2. Run `drizzle-kit generate` to produce SQL migration files
|
|
420
420
|
3. Store migrations in `src/db/migrations/`
|
|
421
|
-
4. Use the custom `migrate()` function during `initialize
|
|
421
|
+
4. Use the custom `migrate()` function during `initialize`. Pass an explicit
|
|
422
|
+
`storage` resolved from the workspace so the journal slug is reliable
|
|
423
|
+
under rspack/Module Federation bundling (the no-arg fallback reads
|
|
424
|
+
`npm_package_name`, which is unreliable in bundled remotes):
|
|
422
425
|
|
|
423
426
|
```ts
|
|
424
427
|
initialize: (config) =>
|
|
@@ -427,8 +430,12 @@ initialize: (config) =>
|
|
|
427
430
|
// Or load and apply migrations directly:
|
|
428
431
|
const { loadMigrations } = yield* Effect.promise(() => import("./db/load-migrations"));
|
|
429
432
|
const { migrate } = yield* Effect.promise(() => import("./db/migrator"));
|
|
433
|
+
const { getMigrationSlug, getMigrationStorage } = yield* Effect.promise(
|
|
434
|
+
() => import("everything-dev/db"),
|
|
435
|
+
);
|
|
436
|
+
const storage = getMigrationStorage(getMigrationSlug(import.meta.dirname));
|
|
430
437
|
const migrations = yield* loadMigrations();
|
|
431
|
-
yield* migrate(driver.db, migrations);
|
|
438
|
+
yield* migrate(driver.db, migrations, storage);
|
|
432
439
|
|
|
433
440
|
return { db: driver.db, ... };
|
|
434
441
|
}),
|