hunk.code_window:   createDatasource: (value: string) => {
       AnalyticsUtil.logEvent("CREATE_DATA_SOURCE_CLICK", {
         appName: ownProps.appName,
         dataSource: value,
       });
       dispatch(
         createDatasource({
           // Datasource name should not end with /
  
hunk.labels: keep keep keep keep add keep keep keep
hunk.after_edit:     // "https://example.com/ "
       // "https://example.com "
       const trimmedValue = value.trim();
  
hunk.file_path: app/client/src/components/editorComponents/form/fields/DatasourcesField.tsx
hunk.type: add
file: import { all, takeEvery, call, put } from "redux-saga/effects";
  import { ReduxActionTypes } from "constants/ReduxActionConstants";
  import PluginsApi from "api/PluginApi";
  import { validateResponse } from "sagas/ErrorSagas";
  
  function* fetchPluginsSaga() {
    try {
      const pluginsResponse = yield call(PluginsApi.fetchPlugins);
      const isValid = yield validateResponse(pluginsResponse);
      if (isValid) {
        yield put({
          type: ReduxActionTypes.FETCH_PLUGINS_SUCCESS,
          payload: pluginsResponse.data,
        });
      }
    } catch (error) {
      yield put({
        type: ReduxActionTypes.FETCH_PLUGINS_ERROR,
        payload: { error },
      });
    }
  }
  
  function* root() {
    yield all([
      takeEvery(ReduxActionTypes.FETCH_PLUGINS_REQUEST, fetchPluginsSaga),
    ]);
  }
  
  export default root;
  