@modochats/widget 0.1.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/.github/workflows/build-and-publish.yml +174 -0
- package/.vscode/settings.json +3 -0
- package/.yarn/install-state.gz +0 -0
- package/README.md +163 -0
- package/cdn-dist/README.md +42 -0
- package/cdn-dist/modo-web-component.js +1344 -0
- package/cdn-dist/modo-web-component.min.js +1 -0
- package/cdn-dist/package.json +27 -0
- package/dist/src/app.d.ts +29 -0
- package/dist/src/app.js +1 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/constants/index.d.ts +9 -0
- package/dist/src/constants/index.js +1 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/src/constants/regex.d.ts +2 -0
- package/dist/src/constants/regex.js +1 -0
- package/dist/src/constants/regex.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/models/chatbot.d.ts +23 -0
- package/dist/src/models/chatbot.js +1 -0
- package/dist/src/models/chatbot.js.map +1 -0
- package/dist/src/models/conversation.d.ts +22 -0
- package/dist/src/models/conversation.js +1 -0
- package/dist/src/models/conversation.js.map +1 -0
- package/dist/src/models/customer-data.d.ts +31 -0
- package/dist/src/models/customer-data.js +1 -0
- package/dist/src/models/customer-data.js.map +1 -0
- package/dist/src/models/message-utils.d.ts +12 -0
- package/dist/src/models/message-utils.js +1 -0
- package/dist/src/models/message-utils.js.map +1 -0
- package/dist/src/services/chat/conversation.d.ts +22 -0
- package/dist/src/services/chat/conversation.js +1 -0
- package/dist/src/services/chat/conversation.js.map +1 -0
- package/dist/src/services/chat/message-utils.d.ts +12 -0
- package/dist/src/services/chat/message-utils.js +1 -0
- package/dist/src/services/chat/message-utils.js.map +1 -0
- package/dist/src/services/chat/model.d.ts +27 -0
- package/dist/src/services/chat/model.js +1 -0
- package/dist/src/services/chat/model.js.map +1 -0
- package/dist/src/services/chatbot/chatbot.d.ts +23 -0
- package/dist/src/services/chatbot/chatbot.js +1 -0
- package/dist/src/services/chatbot/chatbot.js.map +1 -0
- package/dist/src/services/checker.d.ts +3 -0
- package/dist/src/services/checker.js +1 -0
- package/dist/src/services/checker.js.map +1 -0
- package/dist/src/services/listeners/adders.d.ts +3 -0
- package/dist/src/services/listeners/adders.js +1 -0
- package/dist/src/services/listeners/adders.js.map +1 -0
- package/dist/src/services/listeners/fn.d.ts +3 -0
- package/dist/src/services/listeners/fn.js +1 -0
- package/dist/src/services/listeners/fn.js.map +1 -0
- package/dist/src/services/socket/utils.d.ts +2 -0
- package/dist/src/services/socket/utils.js +1 -0
- package/dist/src/services/socket/utils.js.map +1 -0
- package/dist/src/services/ui/fn.d.ts +13 -0
- package/dist/src/services/ui/fn.js +1 -0
- package/dist/src/services/ui/fn.js.map +1 -0
- package/dist/src/services/ui/html.d.ts +3 -0
- package/dist/src/services/ui/html.js +1 -0
- package/dist/src/services/ui/html.js.map +1 -0
- package/dist/src/services/user/customer-data.d.ts +31 -0
- package/dist/src/services/user/customer-data.js +1 -0
- package/dist/src/services/user/customer-data.js.map +1 -0
- package/dist/src/services/voice-chat/model.d.ts +12 -0
- package/dist/src/services/voice-chat/model.js +1 -0
- package/dist/src/services/voice-chat/model.js.map +1 -0
- package/dist/src/services/voice-chat/utils.d.ts +9 -0
- package/dist/src/services/voice-chat/utils.js +1 -0
- package/dist/src/services/voice-chat/utils.js.map +1 -0
- package/dist/src/tools/fetch.d.ts +2 -0
- package/dist/src/tools/fetch.js +1 -0
- package/dist/src/tools/fetch.js.map +1 -0
- package/dist/src/types/app.d.ts +17 -0
- package/dist/src/types/app.js.map +1 -0
- package/dist/src/types/conversation.d.ts +14 -0
- package/dist/src/types/conversation.js +1 -0
- package/dist/src/types/conversation.js.map +1 -0
- package/dist/src/types/socket.d.ts +6 -0
- package/dist/src/types/socket.js +1 -0
- package/dist/src/types/socket.js.map +1 -0
- package/dist/src/types/window.d.ts +9 -0
- package/dist/src/types/window.js +1 -0
- package/dist/src/types/window.js.map +1 -0
- package/dist/src/utils/audio.d.ts +3 -0
- package/dist/src/utils/audio.js +1 -0
- package/dist/src/utils/audio.js.map +1 -0
- package/dist/src/utils/browser.d.ts +2 -0
- package/dist/src/utils/browser.js +1 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +18 -0
- package/dist/src/utils/fetch.js +1 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/uuid.d.ts +6 -0
- package/dist/src/utils/uuid.js +1 -0
- package/dist/src/utils/uuid.js.map +1 -0
- package/dist/types/src/app.d.ts +30 -0
- package/dist/types/src/app.d.ts.map +1 -0
- package/dist/types/src/constants/index.d.ts +10 -0
- package/dist/types/src/constants/index.d.ts.map +1 -0
- package/dist/types/src/constants/regex.d.ts +3 -0
- package/dist/types/src/constants/regex.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +10 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/models/chatbot.d.ts +24 -0
- package/dist/types/src/models/chatbot.d.ts.map +1 -0
- package/dist/types/src/models/conversation.d.ts +23 -0
- package/dist/types/src/models/conversation.d.ts.map +1 -0
- package/dist/types/src/models/customer-data.d.ts +32 -0
- package/dist/types/src/models/customer-data.d.ts.map +1 -0
- package/dist/types/src/models/message-utils.d.ts +13 -0
- package/dist/types/src/models/message-utils.d.ts.map +1 -0
- package/dist/types/src/services/chat/conversation.d.ts +23 -0
- package/dist/types/src/services/chat/conversation.d.ts.map +1 -0
- package/dist/types/src/services/chat/message-utils.d.ts +13 -0
- package/dist/types/src/services/chat/message-utils.d.ts.map +1 -0
- package/dist/types/src/services/chat/model.d.ts +28 -0
- package/dist/types/src/services/chat/model.d.ts.map +1 -0
- package/dist/types/src/services/chatbot/chatbot.d.ts +24 -0
- package/dist/types/src/services/chatbot/chatbot.d.ts.map +1 -0
- package/dist/types/src/services/checker.d.ts +4 -0
- package/dist/types/src/services/checker.d.ts.map +1 -0
- package/dist/types/src/services/listeners/adders.d.ts +4 -0
- package/dist/types/src/services/listeners/adders.d.ts.map +1 -0
- package/dist/types/src/services/listeners/fn.d.ts +4 -0
- package/dist/types/src/services/listeners/fn.d.ts.map +1 -0
- package/dist/types/src/services/socket/utils.d.ts +3 -0
- package/dist/types/src/services/socket/utils.d.ts.map +1 -0
- package/dist/types/src/services/ui/fn.d.ts +14 -0
- package/dist/types/src/services/ui/fn.d.ts.map +1 -0
- package/dist/types/src/services/ui/html.d.ts +4 -0
- package/dist/types/src/services/ui/html.d.ts.map +1 -0
- package/dist/types/src/services/user/customer-data.d.ts +32 -0
- package/dist/types/src/services/user/customer-data.d.ts.map +1 -0
- package/dist/types/src/services/voice-chat/model.d.ts +13 -0
- package/dist/types/src/services/voice-chat/model.d.ts.map +1 -0
- package/dist/types/src/services/voice-chat/utils.d.ts +10 -0
- package/dist/types/src/services/voice-chat/utils.d.ts.map +1 -0
- package/dist/types/src/tools/fetch.d.ts +3 -0
- package/dist/types/src/tools/fetch.d.ts.map +1 -0
- package/dist/types/src/types/app.d.ts +18 -0
- package/dist/types/src/types/app.d.ts.map +1 -0
- package/dist/types/src/types/conversation.d.ts +15 -0
- package/dist/types/src/types/conversation.d.ts.map +1 -0
- package/dist/types/src/types/socket.d.ts +7 -0
- package/dist/types/src/types/socket.d.ts.map +1 -0
- package/dist/types/src/types/window.d.ts +10 -0
- package/dist/types/src/types/window.d.ts.map +1 -0
- package/dist/types/src/utils/audio.d.ts +4 -0
- package/dist/types/src/utils/audio.d.ts.map +1 -0
- package/dist/types/src/utils/browser.d.ts +3 -0
- package/dist/types/src/utils/browser.d.ts.map +1 -0
- package/dist/types/src/utils/fetch.d.ts +19 -0
- package/dist/types/src/utils/fetch.d.ts.map +1 -0
- package/dist/types/src/utils/uuid.d.ts +7 -0
- package/dist/types/src/utils/uuid.d.ts.map +1 -0
- package/package.json +76 -0
- package/rollup.config.js +18 -0
- package/rollup.dev.config.js +22 -0
- package/scripts/create-umd-bundle.js +213 -0
- package/scripts/terser-minify.js +112 -0
- package/src/app.ts +117 -0
- package/src/constants/index.ts +21 -0
- package/src/constants/regex.ts +2 -0
- package/src/index.ts +16 -0
- package/src/services/chat/conversation.ts +135 -0
- package/src/services/chat/message-utils.ts +221 -0
- package/src/services/chat/model.ts +139 -0
- package/src/services/chatbot/chatbot.ts +66 -0
- package/src/services/checker.ts +10 -0
- package/src/services/listeners/adders.ts +178 -0
- package/src/services/listeners/fn.ts +77 -0
- package/src/services/socket/utils.ts +9 -0
- package/src/services/ui/fn.ts +254 -0
- package/src/services/ui/html.ts +192 -0
- package/src/services/user/customer-data.ts +78 -0
- package/src/services/voice-chat/model.ts +79 -0
- package/src/services/voice-chat/utils.ts +137 -0
- package/src/tools/fetch.ts +7 -0
- package/src/types/app.ts +17 -0
- package/src/types/conversation.ts +14 -0
- package/src/types/socket.ts +7 -0
- package/src/types/window.ts +12 -0
- package/src/utils/audio.ts +67 -0
- package/src/utils/browser.ts +4 -0
- package/src/utils/fetch.ts +98 -0
- package/src/utils/uuid.ts +13 -0
- package/temp/audio/new-message.mp3 +0 -0
- package/temp/audio/on-hold.mp3 +0 -0
- package/temp/audio-processor.js +261 -0
- package/temp/css/index.css +2283 -0
- package/temp/dev.html +87 -0
- package/temp/index.html +16 -0
- package/tsconfig.json +119 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Widget } from "#src/app.js";
|
|
2
|
+
declare class CustomerData {
|
|
3
|
+
private _uniqueId?;
|
|
4
|
+
private _userData?;
|
|
5
|
+
private widget;
|
|
6
|
+
phoneNumber?: string;
|
|
7
|
+
constructor(widget: Widget, userData?: Record<string, any>);
|
|
8
|
+
initializePhoneNumber(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize unique ID from localStorage or generate a new one
|
|
11
|
+
* Unique ID is independent of user key/data and is generated by ourselves
|
|
12
|
+
*/
|
|
13
|
+
private initializeUniqueId;
|
|
14
|
+
/**
|
|
15
|
+
* Get the current unique ID
|
|
16
|
+
*/
|
|
17
|
+
get uniqueId(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get the current user data
|
|
20
|
+
*/
|
|
21
|
+
get userData(): Record<string, any>;
|
|
22
|
+
/**
|
|
23
|
+
* Update user data with new values
|
|
24
|
+
* @param newUserData - Object containing new user data to merge
|
|
25
|
+
*/
|
|
26
|
+
updateUserData(newUserData?: Record<string, any>): Promise<void>;
|
|
27
|
+
hasSubmittedPhoneForm(): boolean;
|
|
28
|
+
savePhoneNumber(phoneNumber?: string): void;
|
|
29
|
+
fetchUpdate(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export { CustomerData };
|
|
32
|
+
//# sourceMappingURL=customer-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customer-data.d.ts","sourceRoot":"","sources":["../../../../../src/services/user/customer-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAInC,cAAM,YAAY;IAChB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAsB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;gBAET,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAO1D,qBAAqB;IAOrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAElC;IAED;;;OAGG;IACG,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtE,qBAAqB,IAAI,OAAO;IAIhC,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM;IAK9B,WAAW;CAGlB;AACD,OAAO,EAAC,YAAY,EAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { VoiceClient } from "@modochats/voice-client";
|
|
2
|
+
declare class VoiceChat {
|
|
3
|
+
instance?: VoiceClient;
|
|
4
|
+
isFirstInSession: boolean;
|
|
5
|
+
constructor();
|
|
6
|
+
connect(): Promise<void>;
|
|
7
|
+
disconnect(): Promise<void>;
|
|
8
|
+
initHtml(): void;
|
|
9
|
+
toggleLayout(): void;
|
|
10
|
+
showTooltip(): void;
|
|
11
|
+
}
|
|
12
|
+
export { VoiceChat };
|
|
13
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../src/services/voice-chat/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAY,MAAM,yBAAyB,CAAC;AAW/D,cAAM,SAAS;IACb,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAQ;;IAwC3B,OAAO;IAOP,UAAU;IAGhB,QAAQ;IAGR,YAAY;IAIZ,WAAW;CAOZ;AACD,OAAO,EAAC,SAAS,EAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
declare function toggleVoiceChatLayout(): void;
|
|
2
|
+
declare function initVoiceChatLayout(): void;
|
|
3
|
+
declare function updateVoiceChatStatus(status: string, color?: string): void;
|
|
4
|
+
declare function handleVoiceConnected(): void;
|
|
5
|
+
declare function handleVoiceDisconnected(reason?: string): void;
|
|
6
|
+
declare function handleVoiceConnectionError(message: string): void;
|
|
7
|
+
declare function handleMicrophonePaused(): void;
|
|
8
|
+
declare function handleMicrophoneResumed(): void;
|
|
9
|
+
export { toggleVoiceChatLayout, initVoiceChatLayout, updateVoiceChatStatus, handleVoiceConnected, handleVoiceDisconnected, handleVoiceConnectionError, handleMicrophonePaused, handleMicrophoneResumed };
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/services/voice-chat/utils.ts"],"names":[],"mappings":"AAAA,iBAAS,qBAAqB,SAQ7B;AAED,iBAAS,mBAAmB,SAuD3B;AAED,iBAAS,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,QAU5D;AAED,iBAAS,oBAAoB,SAc5B;AAED,iBAAS,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,QAe/C;AAED,iBAAS,0BAA0B,CAAC,OAAO,EAAE,MAAM,QAKlD;AAED,iBAAS,sBAAsB,SAE9B;AAED,iBAAS,uBAAuB,SAE/B;AAED,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/tools/fetch.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,yBAEV,CAAC;AACH,OAAO,EAAC,MAAM,EAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface WidgetOptions {
|
|
2
|
+
position: "left" | "right";
|
|
3
|
+
theme: "dark" | "light";
|
|
4
|
+
primaryColor: string;
|
|
5
|
+
title: string;
|
|
6
|
+
foregroundColor: string;
|
|
7
|
+
userData?: Record<string, any>;
|
|
8
|
+
autoInit?: boolean;
|
|
9
|
+
fullScreen: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface FetchPaginationRes<T = any> {
|
|
12
|
+
results: T[];
|
|
13
|
+
next: string | null;
|
|
14
|
+
prev: string | null;
|
|
15
|
+
count: number;
|
|
16
|
+
}
|
|
17
|
+
export { WidgetOptions, FetchPaginationRes };
|
|
18
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/types/app.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AACD,UAAU,kBAAkB,CAAC,CAAC,GAAG,GAAG;IAClC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,OAAO,EAAC,aAAa,EAAE,kBAAkB,EAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare enum ConversationStatus {
|
|
2
|
+
AI_CHAT = 0,
|
|
3
|
+
SUPPORTER_CHAT = 1,
|
|
4
|
+
RESOLVED = 2,
|
|
5
|
+
UNKNOWN = 3
|
|
6
|
+
}
|
|
7
|
+
declare enum MessageType {
|
|
8
|
+
USER = 0,
|
|
9
|
+
AI = 1,
|
|
10
|
+
SUPPORTER = 2,
|
|
11
|
+
SYSTEM = 3,
|
|
12
|
+
UNKNOWN = 4
|
|
13
|
+
}
|
|
14
|
+
export type { ConversationStatus, MessageType };
|
|
15
|
+
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/types/conversation.ts"],"names":[],"mappings":"AAAA,aAAK,kBAAkB;IACrB,OAAO,IAAA;IACP,cAAc,IAAA;IACd,QAAQ,IAAA;IACR,OAAO,IAAA;CACR;AACD,aAAK,WAAW;IACd,IAAI,IAAA;IACJ,EAAE,IAAA;IACF,SAAS,IAAA;IACT,MAAM,IAAA;IACN,OAAO,IAAA;CACR;AACD,YAAY,EAAC,kBAAkB,EAAE,WAAW,EAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../../src/types/socket.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACrB,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,4BAA4B,CAAC;IACnE,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,YAAY,EAAC,aAAa,EAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../../src/types/window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,WAAW,CAAC;AAEjC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,EAAE,OAAO,MAAM,CAAC;QACxB,UAAU,EAAE,OAAO,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;KAC3B;CACF;AAGD,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../../../src/utils/audio.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,YAAY,GAAI,WAAW,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAuBjE,CAAC;AAEF,QAAA,MAAM,SAAS,GAAU,WAAW,MAAM,kBAoCzC,CAAC;AAEF,OAAO,EAAC,SAAS,EAAE,YAAY,EAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,QAAA,IAAI,eAAe,eAElB,CAAC;AACF,OAAO,EAAC,eAAe,EAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FetchPaginationRes } from "#src/types/app.js";
|
|
2
|
+
declare const fetchChatbot: (publicKey: string) => Promise<Record<string, any>>;
|
|
3
|
+
declare const fetchSendMessage: (chatbotId: number, content: string, uniqueId: string, conversationUuid?: string, phoneNumber?: string, options?: {
|
|
4
|
+
file?: File;
|
|
5
|
+
replyTo?: number;
|
|
6
|
+
}) => Promise<any>;
|
|
7
|
+
declare const fetchGetAccessTokenForSocket: (chatbotId: string, conversationUuid: string, uniqueId: string) => Promise<{
|
|
8
|
+
access_token: string;
|
|
9
|
+
conversation_uuid: string;
|
|
10
|
+
expires_in: number;
|
|
11
|
+
}>;
|
|
12
|
+
declare const fetchConversationMessages: (conversationUuid: string, chatbotUuid: string) => Promise<Record<string, any>>;
|
|
13
|
+
declare const fetchUpdateUserData: (chatbotUuid: string, uniqueId: string, userData: Record<string, any>) => Promise<any>;
|
|
14
|
+
declare const fetchReadMessage: (id: number) => Promise<any>;
|
|
15
|
+
declare const fetchMarkConversationAsRead: (conversationUuid: string, uniqueId: string) => Promise<any>;
|
|
16
|
+
declare const fetchMessageFeedback: (id: number, uniqueId: string, conversationUuid: string, liked: boolean) => Promise<any>;
|
|
17
|
+
declare const fetchConversations: (conversationUuid: string, uniqueId: string) => Promise<FetchPaginationRes<any>>;
|
|
18
|
+
export { fetchChatbot, fetchSendMessage, fetchGetAccessTokenForSocket, fetchConversationMessages, fetchUpdateUserData, fetchReadMessage, fetchMarkConversationAsRead, fetchMessageFeedback, fetchConversations };
|
|
19
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/utils/fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAErD,QAAA,MAAM,YAAY,GAAU,WAAW,MAAM,iCAE5C,CAAC;AAEF,QAAA,MAAM,gBAAgB,GACpB,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,mBAAmB,MAAM,EACzB,cAAc,MAAM,EACpB,UAAU;IACR,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,iBAkBF,CAAC;AACF,QAAA,MAAM,4BAA4B,GAAU,WAAW,MAAM,EAAE,kBAAkB,MAAM,EAAE,UAAU,MAAM;kBACpE,MAAM;uBAAqB,MAAM;gBAAc,MAAM;EAQzF,CAAC;AACF,QAAA,MAAM,yBAAyB,GAAU,kBAAkB,MAAM,EAAE,aAAa,MAAM,iCAErF,CAAC;AACF,QAAA,MAAM,mBAAmB,GAAU,aAAa,MAAM,EAAE,UAAU,MAAM,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAStG,CAAC;AACF,QAAA,MAAM,gBAAgB,GAAU,IAAI,MAAM,iBAIzC,CAAC;AACF,QAAA,MAAM,2BAA2B,GAAU,kBAAkB,MAAM,EAAE,UAAU,MAAM,iBAOpF,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAU,IAAI,MAAM,EAAE,UAAU,MAAM,EAAE,kBAAkB,MAAM,EAAE,OAAO,OAAO,iBAUzG,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAU,kBAAkB,MAAM,EAAE,UAAU,MAAM,qCAE3E,CAAC;AACF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,kBAAkB,EACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../../../src/utils/uuid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,QAAA,MAAM,YAAY,QAAO,MAMxB,CAAC;AAEF,OAAO,EAAC,YAAY,EAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@modochats/widget",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "dist/src/app.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "tsx watch src/app.ts",
|
|
9
|
+
"dev:ts": "tsc --watch --noCheck",
|
|
10
|
+
"dev:rollup": "rollup --config rollup.dev.config.js --watch",
|
|
11
|
+
"dev:server": "live-server temp --port=3000 --host=localhost --open=/dev.html",
|
|
12
|
+
"dev:full": "concurrently \"yarn dev:ts\" \"yarn dev:rollup\" \"yarn dev:server\" --names \"tsc,rollup,server\" --prefix name ",
|
|
13
|
+
"build:types": "tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist/types",
|
|
14
|
+
"static": "tsx src/app.ts",
|
|
15
|
+
"compile": "npx tsc --noCheck",
|
|
16
|
+
"minify": "node scripts/terser-minify.js",
|
|
17
|
+
"rollup": "rollup --config rollup.config.js",
|
|
18
|
+
"build": "npm run compile && npm run minify && npm run rollup",
|
|
19
|
+
"build:cdn": "npm run build && node scripts/create-umd-bundle.js",
|
|
20
|
+
"render": "npm install && npm run build"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@modochats/chat-client": "^0.3.0",
|
|
24
|
+
"@modochats/voice-client": "^0.2.2",
|
|
25
|
+
"marked": "^16.3.0",
|
|
26
|
+
"ofetch": "^1.5.1",
|
|
27
|
+
"tldts": "^7.0.17"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@rollup/plugin-commonjs": "^29.0.0",
|
|
31
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
32
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
33
|
+
"@types/node": "^24.10.1",
|
|
34
|
+
"concurrently": "^9.2.1",
|
|
35
|
+
"live-server": "^1.2.2",
|
|
36
|
+
"rollup": "^4.53.2",
|
|
37
|
+
"terser": "^5.44.1",
|
|
38
|
+
"tsx": "^4.20.6",
|
|
39
|
+
"typescript": "^5.9.3"
|
|
40
|
+
},
|
|
41
|
+
"imports": {
|
|
42
|
+
"#src/*": "./dist/src/*",
|
|
43
|
+
"#root/*": "./dist/*"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=16.0.0"
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/modochats/webcomponent#readme",
|
|
52
|
+
"keywords": [
|
|
53
|
+
"modo",
|
|
54
|
+
"chat",
|
|
55
|
+
"ai",
|
|
56
|
+
"chatbot",
|
|
57
|
+
"websocket",
|
|
58
|
+
"real-time"
|
|
59
|
+
],
|
|
60
|
+
"author": "Modo Team",
|
|
61
|
+
"license": "MIT",
|
|
62
|
+
"repository": {
|
|
63
|
+
"type": "git",
|
|
64
|
+
"url": "https://github.com/modochats/chat-client"
|
|
65
|
+
},
|
|
66
|
+
"bugs": {
|
|
67
|
+
"url": "https://github.com/modochats/chat-client/issues"
|
|
68
|
+
},
|
|
69
|
+
"exports": {
|
|
70
|
+
".": {
|
|
71
|
+
"types": "./dist/types/src/index.d.ts",
|
|
72
|
+
"import": "./dist/src/index.js"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"types": "dist/types/src/index.d.ts"
|
|
76
|
+
}
|
package/rollup.config.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import nodeResolve from "@rollup/plugin-node-resolve";
|
|
2
|
+
import commonjs from "@rollup/plugin-commonjs";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
input: "dist/src/app.js",
|
|
6
|
+
output: {
|
|
7
|
+
file: "temp/app.js",
|
|
8
|
+
format: "cjs"
|
|
9
|
+
},
|
|
10
|
+
// external: ["ofetch"], // Uncomment this if you want to keep ofetch external
|
|
11
|
+
plugins: [
|
|
12
|
+
nodeResolve({
|
|
13
|
+
browser: true,
|
|
14
|
+
preferBuiltins: false
|
|
15
|
+
}),
|
|
16
|
+
commonjs()
|
|
17
|
+
]
|
|
18
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import nodeResolve from "@rollup/plugin-node-resolve";
|
|
2
|
+
import commonjs from "@rollup/plugin-commonjs";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
input: "dist/src/app.js", // Use compiled TypeScript output
|
|
6
|
+
output: {
|
|
7
|
+
file: "temp/app.dev.js",
|
|
8
|
+
format: "iife", // Better for browser development
|
|
9
|
+
name: "ModoWidget", // Global name for IIFE
|
|
10
|
+
sourcemap: true // Enable source maps for debugging
|
|
11
|
+
},
|
|
12
|
+
plugins: [
|
|
13
|
+
nodeResolve({
|
|
14
|
+
browser: true,
|
|
15
|
+
preferBuiltins: false
|
|
16
|
+
}),
|
|
17
|
+
commonjs()
|
|
18
|
+
],
|
|
19
|
+
watch: {
|
|
20
|
+
clearScreen: false
|
|
21
|
+
}
|
|
22
|
+
};
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import {promises as fs} from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import {fileURLToPath} from "url";
|
|
4
|
+
import {minify} from "terser";
|
|
5
|
+
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
|
|
9
|
+
async function createUMDBundle() {
|
|
10
|
+
const distDir = path.resolve(__dirname, "../dist");
|
|
11
|
+
const outputDir = path.resolve(__dirname, "../cdn-dist");
|
|
12
|
+
|
|
13
|
+
console.log("Creating UMD bundle...");
|
|
14
|
+
console.log("Dist directory:", distDir);
|
|
15
|
+
console.log("Output directory:", outputDir);
|
|
16
|
+
|
|
17
|
+
// Ensure output directory exists
|
|
18
|
+
await fs.mkdir(outputDir, {recursive: true});
|
|
19
|
+
|
|
20
|
+
// Read the main app file from rollup output
|
|
21
|
+
const appPath = path.join(distDir, "../temp/app.js");
|
|
22
|
+
let appCode = "";
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
appCode = await fs.readFile(appPath, "utf8");
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.error("Error reading app.js from temp directory:", error);
|
|
28
|
+
// Fallback to dist/src/app.js if temp doesn't exist
|
|
29
|
+
const fallbackPath = path.join(distDir, "src/app.js");
|
|
30
|
+
try {
|
|
31
|
+
appCode = await fs.readFile(fallbackPath, "utf8");
|
|
32
|
+
} catch (fallbackError) {
|
|
33
|
+
console.error("Error reading app.js from dist directory:", fallbackError);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Clean up the app code
|
|
39
|
+
let cleanedAppCode = appCode;
|
|
40
|
+
|
|
41
|
+
// Remove 'use strict' from the beginning if it exists
|
|
42
|
+
cleanedAppCode = cleanedAppCode.replace(/^['"]use strict['"];\s*/, "");
|
|
43
|
+
|
|
44
|
+
// Check if Widget is properly defined and exported
|
|
45
|
+
const hasWidget = cleanedAppCode.includes("class Widget") || cleanedAppCode.includes("function Widget");
|
|
46
|
+
const hasWindowExport = cleanedAppCode.includes("window.Widget");
|
|
47
|
+
|
|
48
|
+
if (!hasWidget) {
|
|
49
|
+
console.error("Widget class not found in the bundle!");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Create UMD wrapper
|
|
54
|
+
const umdCode = `(function (global, factory) {
|
|
55
|
+
if (typeof exports === 'object' && typeof module !== 'undefined') {
|
|
56
|
+
module.exports = factory();
|
|
57
|
+
} else if (typeof define === 'function' && define.amd) {
|
|
58
|
+
define(factory);
|
|
59
|
+
} else {
|
|
60
|
+
global.ModoWebComponent = factory();
|
|
61
|
+
}
|
|
62
|
+
})(typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : this, function () {
|
|
63
|
+
'use strict';
|
|
64
|
+
|
|
65
|
+
${cleanedAppCode}
|
|
66
|
+
|
|
67
|
+
// Return the ModoChat class for UMD usage
|
|
68
|
+
return typeof ModoChat !== 'undefined' ? ModoChat : (typeof window !== 'undefined' && window.ModoChat ? window.ModoChat : null);
|
|
69
|
+
});`;
|
|
70
|
+
|
|
71
|
+
// Write UMD bundle
|
|
72
|
+
const umdPath = path.join(outputDir, "modo-widget.js");
|
|
73
|
+
const legacyUmdPath = path.join(outputDir, "modo-web-component.js");
|
|
74
|
+
await fs.writeFile(umdPath, umdCode);
|
|
75
|
+
await fs.writeFile(legacyUmdPath, umdCode);
|
|
76
|
+
console.log("Created UMD bundle:", umdPath);
|
|
77
|
+
|
|
78
|
+
// Create minified version using Terser
|
|
79
|
+
console.log("Minifying UMD bundle...");
|
|
80
|
+
try {
|
|
81
|
+
const result = await minify(umdCode, {
|
|
82
|
+
sourceMap: false,
|
|
83
|
+
mangle: true,
|
|
84
|
+
compress: true,
|
|
85
|
+
keep_classnames: false,
|
|
86
|
+
keep_fnames: false
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (result.error) {
|
|
90
|
+
throw result.error;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (result.code) {
|
|
94
|
+
const minPath = path.join(outputDir, "modo-widget.min.js");
|
|
95
|
+
const legacyMinPath = path.join(outputDir, "modo-web-component.min.js");
|
|
96
|
+
await fs.writeFile(minPath, result.code);
|
|
97
|
+
await fs.writeFile(legacyMinPath, result.code);
|
|
98
|
+
console.log("Created minified bundle:", minPath);
|
|
99
|
+
} else {
|
|
100
|
+
console.warn("No minified code generated. Using original code.");
|
|
101
|
+
const minPath = path.join(outputDir, "modo-widget.min.js");
|
|
102
|
+
const legacyMinPath = path.join(outputDir, "modo-web-component.min.js");
|
|
103
|
+
await fs.writeFile(minPath, umdCode);
|
|
104
|
+
await fs.writeFile(legacyMinPath, umdCode);
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error("Error during minification:", error);
|
|
108
|
+
console.log("Falling back to original code for minified version...");
|
|
109
|
+
const minPath = path.join(outputDir, "modo-widget.min.js");
|
|
110
|
+
const legacyMinPath = path.join(outputDir, "modo-web-component.min.js");
|
|
111
|
+
await fs.writeFile(minPath, umdCode);
|
|
112
|
+
await fs.writeFile(legacyMinPath, umdCode);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Copy dist folder
|
|
116
|
+
await copyDirectory(distDir, path.join(outputDir, "dist"));
|
|
117
|
+
|
|
118
|
+
// Create package.json for CDN
|
|
119
|
+
const packageJson = {
|
|
120
|
+
name: "modochat-widget",
|
|
121
|
+
version: "1.0.0",
|
|
122
|
+
description: "Modo Web Component - A lightweight web component library",
|
|
123
|
+
main: "modo-widget.js",
|
|
124
|
+
files: ["modo-widget.js", "modo-widget.min.js", "dist/"],
|
|
125
|
+
keywords: ["web-component", "modo", "javascript", "umd"],
|
|
126
|
+
author: "",
|
|
127
|
+
license: "ISC",
|
|
128
|
+
repository: {
|
|
129
|
+
type: "git",
|
|
130
|
+
url: "https://github.com/your-username/modochat-widget.git"
|
|
131
|
+
},
|
|
132
|
+
homepage: "https://github.com/your-username/modochat-widget#readme",
|
|
133
|
+
bugs: {
|
|
134
|
+
url: "https://github.com/your-username/modochat-widget/issues"
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
await fs.writeFile(path.join(outputDir, "package.json"), JSON.stringify(packageJson, null, 2));
|
|
139
|
+
|
|
140
|
+
// Create README for CDN
|
|
141
|
+
const readmeContent = `# Modo Web Component
|
|
142
|
+
|
|
143
|
+
A lightweight web component library.
|
|
144
|
+
|
|
145
|
+
## CDN Usage
|
|
146
|
+
|
|
147
|
+
### jsDelivr
|
|
148
|
+
\`\`\`html
|
|
149
|
+
<script src="https://cdn.jsdelivr.net/gh/your-username/modochat-widget@main/cdn-dist/modo-widget.min.js"></script>
|
|
150
|
+
\`\`\`
|
|
151
|
+
|
|
152
|
+
### GitHub Raw
|
|
153
|
+
\`\`\`html
|
|
154
|
+
<script src="https://raw.githubusercontent.com/your-username/modochat-widget/main/cdn-dist/modo-widget.min.js"></script>
|
|
155
|
+
\`\`\`
|
|
156
|
+
|
|
157
|
+
## Usage
|
|
158
|
+
|
|
159
|
+
\`\`\`javascript
|
|
160
|
+
// Initialize the chat widget
|
|
161
|
+
const chat = new ModoChat('your-public-key', {
|
|
162
|
+
position: 'right', // 'left' or 'right'
|
|
163
|
+
theme: 'dark', // 'dark' or 'light'
|
|
164
|
+
primaryColor: '#667eea',
|
|
165
|
+
title: 'پشتیبانی چت'
|
|
166
|
+
});
|
|
167
|
+
\`\`\`
|
|
168
|
+
|
|
169
|
+
## Features
|
|
170
|
+
|
|
171
|
+
- 🌙 Dark/Light theme support
|
|
172
|
+
- 🌐 RTL (Persian/Farsi) language support
|
|
173
|
+
- 📱 Mobile responsive design
|
|
174
|
+
- 💬 Real-time chat functionality
|
|
175
|
+
- 🔗 WebSocket connection status
|
|
176
|
+
- 📝 Markdown message support
|
|
177
|
+
|
|
178
|
+
## Files
|
|
179
|
+
|
|
180
|
+
- \`modo-widget.js\` - Development version
|
|
181
|
+
- \`modo-widget.min.js\` - Production version (minified)
|
|
182
|
+
- \`dist/\` - Full distribution files
|
|
183
|
+
`;
|
|
184
|
+
|
|
185
|
+
await fs.writeFile(path.join(outputDir, "README.md"), readmeContent);
|
|
186
|
+
|
|
187
|
+
console.log("UMD bundle created successfully!");
|
|
188
|
+
console.log("Files created:");
|
|
189
|
+
console.log("- modo-widget.js");
|
|
190
|
+
console.log("- modo-widget.min.js");
|
|
191
|
+
console.log("- dist/ (copied from build)");
|
|
192
|
+
console.log("- package.json");
|
|
193
|
+
console.log("- README.md");
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async function copyDirectory(src, dest) {
|
|
197
|
+
await fs.mkdir(dest, {recursive: true});
|
|
198
|
+
|
|
199
|
+
const entries = await fs.readdir(src, {withFileTypes: true});
|
|
200
|
+
|
|
201
|
+
for (const entry of entries) {
|
|
202
|
+
const srcPath = path.join(src, entry.name);
|
|
203
|
+
const destPath = path.join(dest, entry.name);
|
|
204
|
+
|
|
205
|
+
if (entry.isDirectory()) {
|
|
206
|
+
await copyDirectory(srcPath, destPath);
|
|
207
|
+
} else {
|
|
208
|
+
await fs.copyFile(srcPath, destPath);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
createUMDBundle().catch(console.error);
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// scripts/minify.js
|
|
2
|
+
import {promises as fs} from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import {fileURLToPath} from "url";
|
|
5
|
+
import {minify} from "terser";
|
|
6
|
+
|
|
7
|
+
// --- Configuration ---
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
// Resolve the dist directory relative to the project root (assuming scripts/ is one level down)
|
|
11
|
+
const distDir = path.resolve(__dirname, "../dist");
|
|
12
|
+
// Set to true to minify files in subdirectories as well
|
|
13
|
+
const recursive = true;
|
|
14
|
+
// Set to true to keep the original file extension (e.g., file.js -> file.js)
|
|
15
|
+
// Set to false to add .min.js (e.g., file.js -> file.min.js) - Requires output modification
|
|
16
|
+
const overwriteOriginals = true; // WARNING: This will replace your original files in dist!
|
|
17
|
+
// --- End Configuration ---
|
|
18
|
+
|
|
19
|
+
async function findJsFiles(dir) {
|
|
20
|
+
let jsFiles = [];
|
|
21
|
+
try {
|
|
22
|
+
const entries = await fs.readdir(dir, {withFileTypes: true});
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
const fullPath = path.join(dir, entry.name);
|
|
25
|
+
if (entry.isDirectory() && recursive) {
|
|
26
|
+
jsFiles = jsFiles.concat(await findJsFiles(fullPath));
|
|
27
|
+
} else if (entry.isFile() && entry.name.endsWith(".js") && !entry.name.endsWith(".min.js")) {
|
|
28
|
+
// Avoid minifying already minified files if using .min.js extension
|
|
29
|
+
jsFiles.push(fullPath);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
} catch (err) {
|
|
33
|
+
// If distDir doesn't exist, treat it as no JS files found
|
|
34
|
+
if (err.code === "ENOENT") {
|
|
35
|
+
console.warn(`Warning: Directory not found: ${dir}`);
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
console.error(`Error reading directory ${dir}:`, err);
|
|
39
|
+
throw err; // Rethrow other errors
|
|
40
|
+
}
|
|
41
|
+
return jsFiles;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function minifyFile(filePath) {
|
|
45
|
+
try {
|
|
46
|
+
const code = await fs.readFile(filePath, "utf8");
|
|
47
|
+
console.log(`Minifying: ${path.relative(distDir, filePath)}`);
|
|
48
|
+
|
|
49
|
+
const result = await minify(code, {
|
|
50
|
+
sourceMap: false, // Set to true or options object if you need source maps
|
|
51
|
+
mangle: true, // Enable variable name mangling
|
|
52
|
+
compress: true, // Enable compression options
|
|
53
|
+
// Add other Terser options here if needed:
|
|
54
|
+
// https://github.com/terser/terser#minify-options ,
|
|
55
|
+
keep_classnames: false,
|
|
56
|
+
keep_fnames: false
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
if (result.error) {
|
|
60
|
+
throw result.error; // Throw Terser specific errors
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (result.code) {
|
|
64
|
+
const outputPath = overwriteOriginals ? filePath : filePath.replace(/\.js$/, ".min.js"); // Example for adding .min.js
|
|
65
|
+
|
|
66
|
+
if (!overwriteOriginals && outputPath === filePath) {
|
|
67
|
+
console.warn(` -> Skipping write for ${filePath} as output path is the same and overwriteOriginals is false.`);
|
|
68
|
+
return; // Prevent accidental overwrite if logic fails
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await fs.writeFile(outputPath, result.code, "utf8");
|
|
72
|
+
console.log(` -> Success: ${path.relative(distDir, outputPath)}`);
|
|
73
|
+
} else {
|
|
74
|
+
console.warn(` -> No code generated for ${filePath}. Skipping write.`);
|
|
75
|
+
}
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.error(`\nError minifying ${path.relative(distDir, filePath)}:`);
|
|
78
|
+
console.error(error);
|
|
79
|
+
// Decide if you want to stop the whole process on error or continue
|
|
80
|
+
// throw error; // Uncomment to stop on first error
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function runMinification() {
|
|
85
|
+
console.log(`Starting minification in: ${distDir}`);
|
|
86
|
+
console.log(`Recursive: ${recursive}, Overwrite Originals: ${overwriteOriginals}`);
|
|
87
|
+
console.log("---");
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
const jsFiles = await findJsFiles(distDir);
|
|
91
|
+
|
|
92
|
+
if (jsFiles.length === 0) {
|
|
93
|
+
console.log("No .js files found to minify.");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
console.log(`Found ${jsFiles.length} .js file(s).`);
|
|
98
|
+
|
|
99
|
+
// Run minification tasks potentially in parallel (adjust if memory becomes an issue)
|
|
100
|
+
await Promise.all(jsFiles.map(filePath => minifyFile(filePath)));
|
|
101
|
+
|
|
102
|
+
console.log("---");
|
|
103
|
+
console.log("Minification process finished.");
|
|
104
|
+
} catch (error) {
|
|
105
|
+
console.error("\n---");
|
|
106
|
+
console.error("An error occurred during the minification process:", error);
|
|
107
|
+
process.exit(1); // Exit with an error code
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// --- Execute the script ---
|
|
112
|
+
runMinification();
|