fix: new submodule setup

This commit is contained in:
Ritvik Sardana
2026-04-06 12:59:20 +05:30
parent 6b800f6b22
commit b2ae6d8fc0
4 changed files with 203 additions and 149 deletions
+86
View File
@@ -0,0 +1,86 @@
import { existsSync } from "node:fs";
import path from "path";
import type { PluginOption } from "vite";
interface LocalFrappeUIDevConfigParams {
mode: string;
rootDir: string;
}
interface LocalFrappeUIDevConfig {
useLocalFrappeUI: boolean;
localFrappeUIPath: string;
localFrappeUIAliases: Record<string, string>;
}
interface ImportFrappeUIPluginParams {
useLocalFrappeUI: boolean;
}
type FrappeUIPluginFactory = (...args: any[]) => PluginOption;
type FrappeUIPluginModule = { default: FrappeUIPluginFactory };
async function loadFrappeUIPluginModule(
modulePath: string
): Promise<FrappeUIPluginModule> {
return (await import(modulePath)) as FrappeUIPluginModule;
}
export function getLocalFrappeUIDevConfig({
mode,
rootDir,
}: LocalFrappeUIDevConfigParams): LocalFrappeUIDevConfig {
const isDev = mode === "development";
const localFrappeUIPath = path.resolve(rootDir, "../frappe-ui");
const useLocalFrappeUI =
isDev && existsSync(path.join(localFrappeUIPath, "node_modules"));
if (isDev && existsSync(localFrappeUIPath) && !useLocalFrappeUI) {
console.warn("⚠️ Local frappe-ui found but dependencies not installed.");
console.warn(" Run: cd ../frappe-ui && yarn install");
}
const localFrappeUIAliases: Record<string, string> = useLocalFrappeUI
? {
"frappe-ui/style.css": path.resolve(
localFrappeUIPath,
"src",
"style.css"
),
"frappe-ui": localFrappeUIPath,
}
: {};
return {
useLocalFrappeUI,
localFrappeUIPath,
localFrappeUIAliases,
};
}
export async function importFrappeUIPlugin({
useLocalFrappeUI,
}: ImportFrappeUIPluginParams): Promise<FrappeUIPluginFactory> {
const npmModulePath = "frappe-ui/vite";
const modulePath = useLocalFrappeUI
? "../frappe-ui/vite/index.js"
: npmModulePath;
try {
const module = await loadFrappeUIPluginModule(modulePath);
return module.default as FrappeUIPluginFactory;
} catch (error) {
if (useLocalFrappeUI) {
console.warn(
"⚠️ Failed to import local frappe-ui plugin, falling back to npm package"
);
console.warn(
" Error:",
error instanceof Error ? error.message : String(error)
);
const fallbackModule = await loadFrappeUIPluginModule(npmModulePath);
return fallbackModule.default as FrappeUIPluginFactory;
}
throw error;
}
}
+108 -92
View File
@@ -1,102 +1,118 @@
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";
import frappeui from "frappe-ui/vite";
import path from "path";
import { defineConfig } from "vite";
import { VitePWA } from "vite-plugin-pwa";
import {
getLocalFrappeUIDevConfig,
importFrappeUIPlugin,
} from "./vite-helpers";
export default defineConfig({
plugins: [
frappeui({
frappeProxy: true,
lucideIcons: true,
jinjaBootData: true,
buildConfig: {
outDir: `../helpdesk/public/desk`,
emptyOutDir: true,
indexHtmlPath: "../helpdesk/www/helpdesk/index.html",
},
frappeTypes: {
input: {
helpdesk: [
"hd_ticket_status",
"hd_ticket",
"hd_service_holiday_list",
"hd_service_level_agreement",
"hd_agent",
],
frappe: ["assignment_rule"],
export default defineConfig(async ({ mode }) => {
const { useLocalFrappeUI, localFrappeUIAliases } = getLocalFrappeUIDevConfig({
mode,
rootDir: __dirname,
});
const frappeui = await importFrappeUIPlugin({ useLocalFrappeUI });
const config = {
plugins: [
frappeui({
frappeProxy: true,
lucideIcons: true,
jinjaBootData: true,
buildConfig: {
outDir: `../helpdesk/public/desk`,
emptyOutDir: true,
indexHtmlPath: "../helpdesk/www/helpdesk/index.html",
},
},
}),
frappeTypes: {
input: {
helpdesk: [
"hd_ticket_status",
"hd_ticket",
"hd_service_holiday_list",
"hd_service_level_agreement",
"hd_agent",
],
frappe: ["assignment_rule"],
},
},
}),
vue(),
vueJsx(),
VitePWA({
registerType: "autoUpdate",
devOptions: {
enabled: true,
},
workbox: {
cleanupOutdatedCaches: true,
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024,
},
manifest: {
display: "standalone",
name: "Frappe Helpdesk",
short_name: "Helpdesk",
start_url: "/helpdesk",
description:
"Modern, Streamlined, Free and Open Source Customer Service Software",
icons: [
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-192.maskable.png",
sizes: "192x192",
type: "image/png",
purpose: "any",
},
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-192.maskable.png",
sizes: "192x192",
type: "image/png",
purpose: "maskable",
},
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-512.maskable.png",
sizes: "512x512",
type: "image/png",
purpose: "any",
},
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-512.maskable.png",
sizes: "512x512",
type: "image/png",
purpose: "maskable",
},
],
},
}),
],
server: {
allowedHosts: true,
},
resolve: {
alias: {
"@": path.resolve(__dirname, "src"),
"tailwind.config.js": path.resolve(__dirname, "tailwind.config.js"),
},
},
optimizeDeps: {
include: [
"feather-icons",
"tailwind.config.js",
"prosemirror-state",
"prosemirror-view",
"prosemirror-gapcursor",
"prosemirror-tables",
"lowlight",
"interactjs",
vue(),
vueJsx(),
VitePWA({
registerType: "autoUpdate",
devOptions: {
enabled: true,
},
workbox: {
cleanupOutdatedCaches: true,
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024,
},
manifest: {
display: "standalone",
name: "Frappe Helpdesk",
short_name: "Helpdesk",
start_url: "/helpdesk",
description:
"Modern, Streamlined, Free and Open Source Customer Service Software",
icons: [
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-192.maskable.png",
sizes: "192x192",
type: "image/png",
purpose: "any",
},
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-192.maskable.png",
sizes: "192x192",
type: "image/png",
purpose: "maskable",
},
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-512.maskable.png",
sizes: "512x512",
type: "image/png",
purpose: "any",
},
{
src: "/assets/helpdesk/desk/manifest/manifest-icon-512.maskable.png",
sizes: "512x512",
type: "image/png",
purpose: "maskable",
},
],
},
}),
],
exclude: ["frappe-ui"],
},
server: {
allowedHosts: true,
fs: {
allow: [".."],
},
},
resolve: {
alias: {
"@": path.resolve(__dirname, "src"),
"tailwind.config.js": path.resolve(__dirname, "tailwind.config.js"),
...localFrappeUIAliases,
},
},
optimizeDeps: {
include: [
"feather-icons",
"tailwind.config.js",
"prosemirror-state",
"prosemirror-view",
"prosemirror-gapcursor",
"prosemirror-tables",
"lowlight",
"interactjs",
],
exclude: ["frappe-ui"],
},
};
return config;
});
+1 -7
View File
@@ -3,14 +3,8 @@
"scripts": {
"postinstall": "cd desk && yarn install",
"dev": "cd desk && yarn dev",
"build": "cd desk && yarn build",
"disable-workspaces": "sed -i '' 's/\"workspaces\"/\"aworkspaces\"/g' package.json",
"enable-workspaces": "sed -i '' 's/\"aworkspaces\"/\"workspaces\"/g' package.json && rm -rf node_modules ./desk/node_modules/ frappe-ui/node_modules/ && yarn install"
"build": "cd desk && yarn build"
},
"workspaces": [
"desk",
"frappe-ui"
],
"resolutions": {
"cheerio": "1.0.0-rc.12",
"prosemirror-model": "1.25.4"
+8 -50
View File
@@ -2632,14 +2632,6 @@ agent-base@6:
dependencies:
debug "4"
aggregate-error@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
dependencies:
clean-stack "^2.0.0"
indent-string "^4.0.0"
ajv@^8.6.0:
version "8.18.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc"
@@ -2737,11 +2729,6 @@ arraybuffer.prototype.slice@^1.0.4:
get-intrinsic "^1.2.6"
is-array-buffer "^3.0.4"
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
assertion-error@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7"
@@ -3049,11 +3036,6 @@ classnames@^2.2.5:
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
@@ -3207,11 +3189,6 @@ core-js@^3.1.3:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.49.0.tgz#8b4d520ac034311fa21aa616f017ada0e0dbbddd"
integrity sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==
core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
crelt@^1.0.0, crelt@^1.0.5, crelt@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72"
@@ -3794,16 +3771,6 @@ extend-shallow@^2.0.1:
dependencies:
is-extendable "^0.1.0"
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
extsprintf@^1.2.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -4338,11 +4305,6 @@ ignore@^5.2.4:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -4717,7 +4679,7 @@ json-schema-traverse@^1.0.0:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
json-schema@0.4.0, json-schema@^0.4.0:
json-schema@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
@@ -5573,7 +5535,7 @@ prosemirror-menu@^1.2.4:
prosemirror-history "^1.0.0"
prosemirror-state "^1.0.0"
prosemirror-model@1.25.4, prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.24.1, prosemirror-model@^1.25.0, prosemirror-model@^1.25.4:
prosemirror-model@1.25.4, prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.23.0, prosemirror-model@^1.24.1, prosemirror-model@^1.25.0, prosemirror-model@^1.25.4:
version "1.25.4"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.25.4.tgz#8ebfbe29ecbee9e5e2e4048c4fe8e363fcd56e7c"
integrity sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==
@@ -5587,7 +5549,7 @@ prosemirror-schema-basic@^1.2.3:
dependencies:
prosemirror-model "^1.25.0"
prosemirror-schema-list@^1.5.0:
prosemirror-schema-list@^1.4.1, prosemirror-schema-list@^1.5.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz#5869c8f749e8745c394548bb11820b0feb1e32f5"
integrity sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==
@@ -6051,6 +6013,11 @@ set-proto@^1.0.0:
es-errors "^1.3.0"
es-object-atoms "^1.0.0"
shell-quote@^1.8.3:
version "1.8.3"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b"
integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==
shiki-es@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/shiki-es/-/shiki-es-0.2.0.tgz#ae5bced62dca0ba46ee81149e68d428565a3e6fb"
@@ -6883,15 +6850,6 @@ vee-validate@4.15.1:
"@vue/devtools-api" "^7.5.2"
type-fest "^4.8.3"
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
vite-node@2.1.9:
version "2.1.9"
resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.9.tgz#549710f76a643f1c39ef34bdb5493a944e4f895f"