## Description This PR's adds the custom widget. #### PR fixes following issue(s) Fixes #28607 Fixes #28610 Fixes #28615 Fixes #28608 Fixes #28612 > if no issue exists, please create an issue and ask the maintainers about this first > > #### Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video > > #### Type of change - New feature (non-breaking change which adds functionality) > > > ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [ ] Manual - [ ] JUnit - [x] Jest - [x] Cypress > > #### Test Plan > Add Testsmith test cases links that relate to this PR > > #### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) > > > ## Checklist: #### Dev activity - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [x] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [ ] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [ ] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [ ] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced search functionality with a wildcard option for unmatched widget searches. - Added new routes for custom widget editing. - Implemented additional editor modes for HTML and CSS. - Created new code templates and help components for custom widget builders. - Enhanced property controls with new button controls for custom widget editing. - Updated theming interfaces and constants for better theming support. - Added the CustomWidget component for embedding custom widgets in iframes. - Expanded widgets library to include the CustomWidget. - **Enhancements** - Improved `CodeEditor` with additional modes, props, and resize behavior. - Enhanced `PropertyPaneControlConfig` interface with dynamic dependencies and additional properties. - Refined custom widget scripts with communication channel and event handling. - **Bug Fixes** - Fixed visibility logic for the `ExternalWidget` card. - **Documentation** - Added new messages and documentation links for custom widget features. - **Tests** - Implemented new Cypress tests for custom widget default components and property pane interactions. - Updated workspace commands in Cypress tests. - **Refactor** - Streamlined `PropertyControl` state management and editing functions. - Refactored code editor hint helper logic. - **Style** - Added `borderLess` prop to style components without borders. - **Chores** - Updated constants and messages related to custom widget features. - Adjusted webpack configuration to ignore specific module warnings. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
178 lines
5.1 KiB
JavaScript
178 lines
5.1 KiB
JavaScript
const CracoAlias = require("craco-alias");
|
||
const CracoBabelLoader = require("craco-babel-loader");
|
||
const path = require("path");
|
||
const webpack = require("webpack");
|
||
|
||
module.exports = {
|
||
devServer: {
|
||
client: {
|
||
webSocketURL: {
|
||
hostname: "127.0.0.1",
|
||
pathname: "/ws",
|
||
port: 3000,
|
||
protocol: "ws",
|
||
},
|
||
},
|
||
},
|
||
babel: {
|
||
plugins: ["babel-plugin-lodash"],
|
||
},
|
||
webpack: {
|
||
configure: {
|
||
resolve: {
|
||
alias: {
|
||
"lodash-es": "lodash",
|
||
},
|
||
fallback: {
|
||
assert: false,
|
||
stream: false,
|
||
util: false,
|
||
fs: false,
|
||
os: false,
|
||
path: false,
|
||
},
|
||
},
|
||
module: {
|
||
rules: [
|
||
{
|
||
test: /\.m?js/,
|
||
resolve: { fullySpecified: false },
|
||
},
|
||
{
|
||
test: /\.module\.css$/,
|
||
use: [
|
||
{
|
||
loader: "postcss-loader",
|
||
options: {
|
||
postcssOptions: {
|
||
plugins: [
|
||
"postcss-nesting",
|
||
"postcss-import",
|
||
"postcss-at-rules-variables",
|
||
"postcss-each",
|
||
"postcss-url",
|
||
"postcss-modules-values",
|
||
[
|
||
"cssnano",
|
||
{
|
||
preset: ["default"],
|
||
},
|
||
],
|
||
],
|
||
},
|
||
},
|
||
},
|
||
],
|
||
},
|
||
],
|
||
},
|
||
optimization: {
|
||
splitChunks: {
|
||
cacheGroups: {
|
||
icons: {
|
||
// This determines which modules are considered icons
|
||
test: (module) => {
|
||
const modulePath = module.resource;
|
||
if (!modulePath) return false;
|
||
|
||
return (
|
||
modulePath.match(/node_modules[\\\/]remixicon-react[\\\/]/) ||
|
||
modulePath.endsWith(".svg.js") ||
|
||
modulePath.endsWith(".svg")
|
||
);
|
||
},
|
||
// This determines which chunk to put the icon into.
|
||
//
|
||
// Why have three separate cache groups for three different kinds of
|
||
// icons? Purely as an optimization: not every page needs all icons,
|
||
// so we can avoid loading unused icons sometimes.
|
||
name: (module) => {
|
||
if (
|
||
module.resource?.match(
|
||
/node_modules[\\\/]remixicon-react[\\\/]/,
|
||
)
|
||
) {
|
||
return "remix-icons";
|
||
}
|
||
|
||
if (module.resource?.includes("blueprint")) {
|
||
return "blueprint-icons";
|
||
}
|
||
|
||
return "svg-icons";
|
||
},
|
||
// This specifies that only icons from import()ed chunks should be moved
|
||
chunks: "async",
|
||
// This makes webpack ignore the minimum chunk size requirement
|
||
enforce: true,
|
||
},
|
||
},
|
||
},
|
||
},
|
||
ignoreWarnings: [
|
||
function ignoreSourcemapsloaderWarnings(warning) {
|
||
return (
|
||
(warning.module &&
|
||
warning.module.resource.includes("node_modules") &&
|
||
warning.details &&
|
||
warning.details.includes("source-map-loader")) ||
|
||
warning.module.resource.includes("/node_modules/@babel/standalone/babel.js")
|
||
);
|
||
},
|
||
],
|
||
plugins: [
|
||
// Replace BlueprintJS’s icon component with our own implementation
|
||
// that code-splits icons away
|
||
new webpack.NormalModuleReplacementPlugin(
|
||
/@blueprintjs\/core\/lib\/\w+\/components\/icon\/icon\.\w+/,
|
||
require.resolve(
|
||
"./src/components/designSystems/blueprintjs/icon/index.js",
|
||
),
|
||
),
|
||
],
|
||
},
|
||
},
|
||
plugins: [
|
||
{
|
||
plugin: CracoAlias,
|
||
options: {
|
||
source: "tsconfig",
|
||
// baseUrl SHOULD be specified
|
||
// plugin does not take it from tsconfig
|
||
baseUrl: "./src",
|
||
// tsConfigPath should point to the file where "baseUrl" and "paths" are specified
|
||
tsConfigPath: "./tsconfig.path.json",
|
||
},
|
||
},
|
||
{
|
||
plugin: CracoBabelLoader,
|
||
options: {
|
||
includes: [path.resolve("packages")],
|
||
},
|
||
},
|
||
{
|
||
plugin: "prismjs",
|
||
options: {
|
||
languages: ["javascript"],
|
||
plugins: [],
|
||
theme: "twilight",
|
||
css: false,
|
||
},
|
||
},
|
||
{
|
||
// Prioritize the local src directory over node_modules.
|
||
// This matters for cases where `src/<dirname>` and `node_modules/<dirname>` both exist –
|
||
// e.g., when `<dirname>` is `entities`: https://github.com/appsmithorg/appsmith/pull/20964#discussion_r1124782356
|
||
plugin: {
|
||
overrideWebpackConfig: ({ webpackConfig }) => {
|
||
webpackConfig.resolve.modules = [
|
||
path.resolve(__dirname, "src"),
|
||
...webpackConfig.resolve.modules,
|
||
];
|
||
return webpackConfig;
|
||
},
|
||
},
|
||
},
|
||
],
|
||
};
|