@plurid/joiner
Version:
Multi/Mono-Repository Task Runner
1,530 lines (1,459 loc) • 130 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var PluridServer = require('@plurid/plurid-react-server');
var client$1 = require('@apollo/client');
var reactRedux = require('react-redux');
var redux = require('redux');
var thunk = require('redux-thunk');
var themes$1 = require('@plurid/plurid-themes');
var React = require('react');
var fetch = require('cross-fetch');
var pluridUiComponentsReact = require('@plurid/plurid-ui-components-react');
var styled = require('styled-components');
var gql = require('graphql-tag');
var pluridIconsReact = require('@plurid/plurid-icons-react');
var pluridFunctionsReact = require('@plurid/plurid-functions-react');
var pluridFunctions = require('@plurid/plurid-functions');
var pluridReact = require('@plurid/plurid-react');
var reactHelmetAsync = require('react-helmet-async');
var fs = require('fs');
var os = require('os');
var path = require('path');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var apolloServerExpress = require('apollo-server-express');
var apolloServerCore = require('apollo-server-core');
var merge = require('lodash.merge');
var yaml = require('js-yaml');
var Deon = require('@plurid/deon');
var crypto = require('crypto');
var child_process = require('child_process');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var PluridServer__default = /*#__PURE__*/_interopDefaultLegacy(PluridServer);
var thunk__default = /*#__PURE__*/_interopDefaultLegacy(thunk);
var themes__default = /*#__PURE__*/_interopDefaultLegacy(themes$1);
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);
var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
var gql__default = /*#__PURE__*/_interopDefaultLegacy(gql);
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
var cookieParser__default = /*#__PURE__*/_interopDefaultLegacy(cookieParser);
var merge__default = /*#__PURE__*/_interopDefaultLegacy(merge);
var yaml__default = /*#__PURE__*/_interopDefaultLegacy(yaml);
var Deon__default = /*#__PURE__*/_interopDefaultLegacy(Deon);
var crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
// #region module
const helmetContext = {};
// #endregion exports
// #region module
const environment = {
local: process.env.ENV_MODE === 'local',
localExternal: process.env.ENV_MODE === 'localExternal',
development: process.env.ENV_MODE === 'development',
production: process.env.ENV_MODE === 'production',
};
// #endregion exports
const ADD_ENTITY = 'ADD_ENTITY';
const REMOVE_ENTITY = 'REMOVE_ENTITY';
const ADD_ENTITIES = 'ADD_ENTITIES';
const REMOVE_ENTITIES = 'REMOVE_ENTITIES';
const CLEAR_DATA = 'CLEAR_DATA';
// #endregion module
var index$2 = /*#__PURE__*/Object.freeze({
__proto__: null,
ADD_ENTITY: ADD_ENTITY,
REMOVE_ENTITY: REMOVE_ENTITY,
ADD_ENTITIES: ADD_ENTITIES,
REMOVE_ENTITIES: REMOVE_ENTITIES,
CLEAR_DATA: CLEAR_DATA
});
// #region imports
// #endregion external
// #endregion imports
// #region module
const addEntity$1 = (payload) => {
return {
type: ADD_ENTITY,
payload,
};
};
const removeEntity$1 = (payload) => {
return {
type: REMOVE_ENTITY,
payload,
};
};
const addEntities$1 = (payload) => {
return {
type: ADD_ENTITIES,
payload,
};
};
const removeEntities$1 = (payload) => {
return {
type: REMOVE_ENTITIES,
payload,
};
};
const clearData$1 = () => {
return {
type: CLEAR_DATA,
payload: undefined,
};
};
const actions$3 = {
addEntity: addEntity$1,
removeEntity: removeEntity$1,
addEntities: addEntities$1,
removeEntities: removeEntities$1,
clearData: clearData$1,
};
// #endregion exports
// #endregion external
// #endregion imports
// #region module
const initialState$2 = {
id: '',
configurations: [],
logs: [],
};
// #endregion exports
// #endregion internal
// #endregion imports
// #region module
const addEntity = (state, action) => {
const { type, data, } = action.payload;
const newState = Object.assign({}, state);
let configurations = [
...newState.configurations,
];
switch (type) {
case 'configuration':
configurations = [
...configurations,
Object.assign({}, data),
];
break;
}
return Object.assign(Object.assign({}, newState), { configurations: [
...configurations,
] });
};
const removeEntity = (state, action) => {
const { id, type, } = action.payload;
const newState = Object.assign({}, state);
let configurations = [
...newState.configurations,
];
switch (type) {
case 'configuration':
configurations = configurations.filter(configuration => configuration.id !== id);
break;
}
return Object.assign(Object.assign({}, newState), { configurations: [
...configurations,
] });
};
const addEntities = (state, action) => {
const { type, data, push, } = action.payload;
const newState = Object.assign({}, state);
let configurations = [
...newState.configurations,
];
switch (type) {
case 'configurations':
configurations = [
...data,
];
break;
}
return Object.assign(Object.assign({}, newState), { configurations: [
...configurations,
] });
};
const removeEntities = (state, action) => {
action.payload;
const newState = Object.assign({}, state);
// switch (type) {
// }
return Object.assign({}, newState);
};
const clearData = (state, action) => {
return Object.assign({}, initialState$2);
};
const resolvers$4 = {
addEntity,
removeEntity,
addEntities,
removeEntities,
clearData,
};
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
const reducer$2 = (state = initialState$2, action) => {
switch (action.type) {
case ADD_ENTITY:
return resolvers$4.addEntity(state, action);
case REMOVE_ENTITY:
return resolvers$4.removeEntity(state, action);
case ADD_ENTITIES:
return resolvers$4.addEntities(state, action);
case REMOVE_ENTITIES:
return resolvers$4.removeEntities(state, action);
case CLEAR_DATA:
return resolvers$4.clearData(state, action);
default:
return Object.assign({}, state);
}
};
// #endregion exports
// #endregion external
// #endregion imports
// #region module
const getID = (state) => state.data.id;
const getConfigurations$1 = (state) => state.data.configurations;
const getLogs = (state) => state.data.logs;
const selectors$3 = {
getID,
getConfigurations: getConfigurations$1,
getLogs,
};
// #endregion exports
// #region imports
// #endregion exports
var data = /*#__PURE__*/Object.freeze({
__proto__: null,
actions: actions$3,
initialState: initialState$2,
reducer: reducer$2,
resolvers: resolvers$4,
selectors: selectors$3,
Types: index$2
});
// #endregion libraries
// #endregion imports
// #region module
const SET_GENERAL_THEME = 'SET_GENERAL_THEME';
const SET_INTERACTION_THEME = 'SET_INTERACTION_THEME';
// #endregion module
var index$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
SET_GENERAL_THEME: SET_GENERAL_THEME,
SET_INTERACTION_THEME: SET_INTERACTION_THEME
});
// #endregion libraries
// #endregion externalr
// #endregion imports
// #region module
const setGeneralTheme$1 = (theme) => {
return {
type: SET_GENERAL_THEME,
payload: theme,
};
};
const setInteractionTheme$1 = (theme) => {
return {
type: SET_INTERACTION_THEME,
payload: theme,
};
};
const actions$2 = {
setGeneralTheme: setGeneralTheme$1,
setInteractionTheme: setInteractionTheme$1,
};
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
const initialState$1 = {
general: themes__default["default"].plurid,
interaction: themes__default["default"].plurid,
};
// #endregion exports
// #endregion external
// #endregion imports
// #region module
const setGeneralTheme = (state, action) => {
return Object.assign(Object.assign({}, state), { general: Object.assign({}, action.payload) });
};
const setInteractionTheme = (state, action) => {
return Object.assign(Object.assign({}, state), { interaction: Object.assign({}, action.payload) });
};
const resolvers$3 = {
setGeneralTheme,
setInteractionTheme,
};
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
const reducer$1 = (state = initialState$1, action) => {
switch (action.type) {
case SET_GENERAL_THEME:
return resolvers$3.setGeneralTheme(state, action);
case SET_INTERACTION_THEME:
return resolvers$3.setInteractionTheme(state, action);
default:
return Object.assign({}, state);
}
};
const metareducer = (initialState) => (state = initialState, actions) => reducer$1(state, actions);
// #endregion exports
// #endregion external
// #endregion imports
// #region module
const getGeneralTheme = (state) => state.themes.general;
const getInteractionTheme = (state) => state.themes.interaction;
const selectors$2 = {
getGeneralTheme,
getInteractionTheme,
};
// #endregion exports
// #region imports
// #endregion exports
var themes = /*#__PURE__*/Object.freeze({
__proto__: null,
actions: actions$2,
initialState: initialState$1,
reducer: reducer$1,
metareducer: metareducer,
resolvers: resolvers$3,
selectors: selectors$2,
Types: index$1
});
// #region imports
// #region libraries
// #endregion libraries
// #endregion imports
// #region module
const SET_VIEW_LOADING = 'SET_VIEW_LOADING';
const SET_VIEW_TYPE = 'SET_VIEW_TYPE';
const SET_EDIT_ID = 'SET_EDIT_ID';
const SET_VIEW_COMPACT_SELECTORS = 'SET_VIEW_COMPACT_SELECTORS';
const SET_VIEW_OWNER_ID = 'SET_VIEW_OWNER_ID';
const SET_VIEW_USAGE_TYPE = 'SET_VIEW_USAGE_TYPE';
// #endregion module
var index = /*#__PURE__*/Object.freeze({
__proto__: null,
SET_VIEW_LOADING: SET_VIEW_LOADING,
SET_VIEW_TYPE: SET_VIEW_TYPE,
SET_EDIT_ID: SET_EDIT_ID,
SET_VIEW_COMPACT_SELECTORS: SET_VIEW_COMPACT_SELECTORS,
SET_VIEW_OWNER_ID: SET_VIEW_OWNER_ID,
SET_VIEW_USAGE_TYPE: SET_VIEW_USAGE_TYPE
});
// #region imports
// #endregion external
// #endregion imports
// #region module
const setViewLoading$1 = (payload) => {
return {
type: SET_VIEW_LOADING,
payload,
};
};
const setViewType$1 = (payload) => {
return {
type: SET_VIEW_TYPE,
payload,
};
};
const setEditID$1 = (payload) => {
return {
type: SET_EDIT_ID,
payload,
};
};
const setViewCompactSelectors$1 = (payload) => {
return {
type: SET_VIEW_COMPACT_SELECTORS,
payload,
};
};
const setViewOwnerID$1 = (id) => {
return {
type: SET_VIEW_OWNER_ID,
payload: id,
};
};
const setViewUsageType$1 = (usageType) => {
return {
type: SET_VIEW_USAGE_TYPE,
payload: usageType,
};
};
const actions$1 = {
setViewLoading: setViewLoading$1,
setViewType: setViewType$1,
setEditID: setEditID$1,
setViewCompactSelectors: setViewCompactSelectors$1,
setViewOwnerID: setViewOwnerID$1,
setViewUsageType: setViewUsageType$1,
};
// #endregion exports
// #endregion external
// #endregion imports
// #region module
const initialState = {
loading: true,
indexView: '',
indexGeneralView: 'general',
indexGeneralSelector: 'configurations',
indexEditWebhookID: '',
indexEditTriggerID: '',
compactSelectors: false,
ownerID: '',
usageType: '',
};
// #endregion exports
// #endregion internal
// #endregion imports
// #region module
const setViewLoading = (state, action) => {
return Object.assign(Object.assign({}, state), { loading: action.payload });
};
const setViewType = (state, action) => {
const { type, value, } = action.payload;
switch (type) {
case 'indexView':
return Object.assign(Object.assign({}, state), { indexView: value });
case 'indexGeneralView':
return Object.assign(Object.assign({}, state), { indexGeneralView: value });
case 'indexGeneralSelector':
return Object.assign(Object.assign({}, state), { indexGeneralSelector: value });
default:
return Object.assign({}, state);
}
};
const setEditID = (state, action) => {
const { type, value, } = action.payload;
switch (type) {
case 'trigger':
return Object.assign(Object.assign({}, state), { indexEditTriggerID: value });
case 'webhook':
return Object.assign(Object.assign({}, state), { indexEditWebhookID: value });
default:
return Object.assign({}, state);
}
};
const setViewCompactSelectors = (state, action) => {
return Object.assign(Object.assign({}, state), { compactSelectors: action.payload });
};
const setViewOwnerID = (state, action) => {
return Object.assign(Object.assign({}, state), { ownerID: action.payload });
};
const setViewUsageType = (state, action) => {
return Object.assign(Object.assign({}, state), { usageType: action.payload });
};
const resolvers$2 = {
setViewLoading,
setViewType,
setEditID,
setViewCompactSelectors,
setViewOwnerID,
setViewUsageType,
};
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
const reducer = (state = initialState, action) => {
switch (action.type) {
case SET_VIEW_LOADING:
return resolvers$2.setViewLoading(state, action);
case SET_VIEW_TYPE:
return resolvers$2.setViewType(state, action);
case SET_EDIT_ID:
return resolvers$2.setEditID(state, action);
case SET_VIEW_COMPACT_SELECTORS:
return resolvers$2.setViewCompactSelectors(state, action);
case SET_VIEW_OWNER_ID:
return resolvers$2.setViewOwnerID(state, action);
case SET_VIEW_USAGE_TYPE:
return resolvers$2.setViewUsageType(state, action);
default:
return Object.assign({}, state);
}
};
// #endregion exports
// #endregion external
// #endregion imports
// #region module
const getLoading = (state) => state.view.loading;
const getIndexView = (state) => state.view.indexView;
const getIndexGeneralView = (state) => state.view.indexGeneralView;
const getIndexGeneralSelector = (state) => state.view.indexGeneralSelector;
const getIndexEditTriggerID = (state) => state.view.indexEditTriggerID;
const getIndexEditWebhookID = (state) => state.view.indexEditWebhookID;
const getViewCompactSelectors = (state) => state.view.compactSelectors;
const getViewOwnerID = (state) => state.view.ownerID;
const getViewUsageType = (state) => state.view.usageType;
const selectors$1 = {
getLoading,
getIndexView,
getIndexGeneralView,
getIndexGeneralSelector,
getViewCompactSelectors,
getIndexEditTriggerID,
getIndexEditWebhookID,
getViewOwnerID,
getViewUsageType,
};
// #endregion exports
// #region imports
// #endregion exports
var view = /*#__PURE__*/Object.freeze({
__proto__: null,
actions: actions$1,
initialState: initialState,
reducer: reducer,
resolvers: resolvers$2,
selectors: selectors$1,
Types: index
});
// #region imports
// #endregion internal
// #endregion imports
// #region exports
var modules = {
data,
themes,
view,
};
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
const reducers = redux.combineReducers({
data: modules.data.reducer,
themes: modules.themes.reducer,
view: modules.view.reducer,
});
// #endregion exports
// #region imports
const store$2 = (preloadedState) => {
// const localState = localStorage.loadState();
// const persistedState = {
// themes: localState?.themes,
// };
const _store = redux.createStore(reducers, preloadedState,
// persistedState || preloadedState,
redux.applyMiddleware(thunk__default["default"]));
// _store.subscribe(
// () => {
// const localState = localStorage.loadState();
// localStorage.saveState({
// ...localState,
// themes: _store.getState().themes,
// });
// },
// );
return _store;
};
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
let composeWithDevTools;
if (!environment.production) {
try {
const reduxDevTools = require('@redux-devtools/extension');
composeWithDevTools = reduxDevTools.composeWithDevTools;
}
catch (error) {
composeWithDevTools = undefined;
}
}
const store$1 = (preloadedState) => {
const middleware = [
thunk__default["default"],
];
// const localState = localStorage.loadState();
// const persistedState = {
// themes: localState?.themes,
// };
const _store = redux.createStore(reducers, preloadedState,
// persistedState || preloadedState,
composeWithDevTools(redux.applyMiddleware(...middleware)));
// _store.subscribe(
// () => {
// const localState = localStorage.loadState();
// localStorage.saveState({
// ...localState,
// themes: _store.getState().themes,
// });
// },
// );
return _store;
};
// #endregion exports
// #region imports
const store = environment.production
? store$2
: store$1;
// #endregion exports
// #region imports
// #endregion libraries
// #endregion imports
// #region module
var reduxContext = React__default["default"].createContext({});
// #endregion module
// #region module
const GRAPHQL_FAVICON = '/favicon.ico';
const GRAPHQL_TITLE = 'API · joiner';
const GRAPHQL_ENDPOINT = process.env.JOINER_ENDPOINT_GRAPHQL || '/joiner';
// #endregion module
// #region imports
// #endregion external
// #endregion imports
// #region module
const client = new client$1.ApolloClient({
link: client$1.createHttpLink({
uri: GRAPHQL_ENDPOINT,
credentials: 'include',
fetch: fetch__default["default"],
}),
cache: new client$1.InMemoryCache(),
});
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
const selectors = {
data: modules.data.selectors,
themes: modules.themes.selectors,
view: modules.view.selectors,
};
// #endregion exports
var joinerLogo = "client/assets/joiner-logo.png";
// #region imports
const StyledInitialView = styled__default["default"].div.withConfig({ displayName: "StyledInitialView", componentId: "-69p5dr" }) `
padding: 3rem;
display: grid;
place-content: center;
text-align: center;
h1 {
font-size: 1.3rem;
margin: 1.5rem;
}
h2 {
font-size: 1.1rem;
margin: 1.5rem;
}
`;
// #endregion module
// #region imports
// #endregion internal
// #endregion imports
// #region module
const { buttons: { PureButton: PluridPureButton$2, }, } = pluridUiComponentsReact.universal;
const InitialView = (properties) => {
// #region properties
// const {
// } = properties;
// #endregion properties
// #region render
return (React__default["default"].createElement(StyledInitialView, null,
React__default["default"].createElement("div", null,
React__default["default"].createElement("img", { src: joinerLogo, alt: "joiner logo", height: 250 })),
React__default["default"].createElement("h1", null, "joiner"),
React__default["default"].createElement("h2", null, "Multi/Mono-Repository Task Runner"),
React__default["default"].createElement("div", { style: {
width: '200px',
margin: '50px auto',
} },
React__default["default"].createElement(PluridPureButton$2, { text: "Initial Setup", atClick: () => {
// setView('setup');
}, level: 2 }))));
// #endregion render
};
// #endregion exports
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
// #region module
const JOINER_MANUAL_LINK = 'https://manual.plurid.com/joiner';
// #endregion module
// #region imports
// #endregion libraries
// #endregion imports
// #region module
const OBLITERATE_CONFIGURATION = gql__default["default"] `
mutation ObliterateConfiguration($input: InputValueString!) {
obliterateConfiguration(input: $input) {
status
error {
type
path
message
}
}
}
`;
const OBLITERATE_LOG = gql__default["default"] `
mutation ObliterateLog($input: InputValueString!) {
obliterateLog(input: $input) {
status
error {
type
path
message
}
}
}
`;
const EXECUTE_COMMAND = gql__default["default"] `
mutation ExecuteCommand($input: InputExecuteCommand!) {
executeCommand(input: $input) {
status
error {
type
path
message
}
}
}
`;
const LOGIN = gql__default["default"] `
mutation Login($input: InputLogin!) {
login(input: $input) {
status
error {
type
path
message
}
data {
id
}
}
}
`;
const LOGOUT = gql__default["default"] `
mutation Logout {
logout {
status
error {
type
path
message
}
}
}
`;
// #endregion module
// #region imports
// #endregion external
// #endregion imports
// #region module
const actions = {
data: actions$3,
themes: actions$2,
view: actions$1,
};
// #endregion exports
// #region module
const compareValues = (key, order = 'asc') => {
return (a, b) => {
if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
// property doesn't exist on either object
return 0;
}
const varA = (typeof a[key] === 'string')
? a[key].toUpperCase()
: a[key];
const varB = (typeof b[key] === 'string')
? b[key].toUpperCase()
: b[key];
let comparison = 0;
if (varA > varB) {
comparison = 1;
}
else if (varA < varB) {
comparison = -1;
}
return ((order === 'desc')
? (comparison * -1)
: comparison);
};
};
// #endregion module
// #region imports
const StyledEntityView = styled__default["default"].div.withConfig({ displayName: "StyledEntityView", componentId: "-ojp1ub" }) `
position: relative;
height: 100%;
button {
font-family: 'Ubuntu', -apple-system, BlinkMacSystemFont, 'Segoe UI',
'Open Sans', 'Helvetica Neue', sans-serif;
}
`;
const StyledEntityViewTop = styled__default["default"].div.withConfig({ displayName: "StyledEntityViewTop", componentId: "-1mk7sxg" }) `
display: grid;
grid-template-columns: 3fr 1fr;
align-items: center;
margin-bottom: 30px;
`;
const StyledEntityFilterLine = styled__default["default"].div.withConfig({ displayName: "StyledEntityFilterLine", componentId: "-1kqmxs8" }) `
position: relative;
`;
const StyledEntityFilterCancel = styled__default["default"].div.withConfig({ displayName: "StyledEntityFilterCancel", componentId: "-5bvbq6" }) `
position: absolute;
top: 10px;
left: ${({ filterLength, }) => filterLength === 'SMALL' ? '275px' : '575px'};
`;
const StyledTopButtons = styled__default["default"].div.withConfig({ displayName: "StyledTopButtons", componentId: "-6gpxw9" }) `
text-align: right;
`;
const StyledEntityListContainer = styled__default["default"].div.withConfig({ displayName: "StyledEntityListContainer", componentId: "-1bqy0ns" }) `
`;
const StyledEntityList = styled__default["default"].ul.withConfig({ displayName: "StyledEntityList", componentId: "-jwxljr" }) `
padding: 0;
margin: 0;
list-style: none;
max-height: 500px;
overflow: auto;
background-color: ${({ theme, }) => theme.backgroundColorSecondaryAlpha};
box-shadow: ${({ theme, }) => theme.boxShadowUmbraInset};
opacity: ${({ loading, }) => {
if (loading) {
return '0.5';
}
return '1';
}};
li:first-child {
background-color: ${({ theme, header, }) => {
if (header) {
return theme.backgroundColorTertiary;
}
return 'initial';
}};
}
${({ header, }) => {
if (header) {
return;
}
return styled.css `
li:hover {
background-color: ${({ theme, }) => theme.backgroundColorPrimary};
}
`;
}}
`;
const StyledEntityListItem = styled__default["default"].li.withConfig({ displayName: "StyledEntityListItem", componentId: "-u9f1n6" }) `
display: grid;
grid-template-columns: ${({ rowTemplate, }) => rowTemplate};
grid-gap: 0.5rem;
padding: 0.7rem;
align-items: center;
min-height: 45px;
word-break: break-all;
`;
const StyledActionButton = styled__default["default"].div.withConfig({ displayName: "StyledActionButton", componentId: "-wyrzno" }) `
width: 200px;
position: absolute;
bottom: 0;
right: 0;
`;
const StyledNoRows = styled__default["default"].div.withConfig({ displayName: "StyledNoRows", componentId: "-i1cr7z" }) `
margin: 20px 0;
text-align: center;
`;
// #endregion module
// #region imports
// #endregion internal
// #endregion imports
// #region module
const { buttons: { PureButton: PluridPureButton$1, }, inputs: { Textline: PluridTextline, }, markers: { Spinner: PluridSpinner, }, } = pluridUiComponentsReact.universal;
const EntityView = React.forwardRef((properties, reference) => {
// #region properties
const {
// #region required
// #region values
generalTheme, interactionTheme, rowsHeader, rowTemplate, rows, noRows,
// #endregion values
// #region methods
// #endregion methods
// #endregion required
// #region optional
// #region values.
entities, actionButtonText, loading,
// #endregion values
// #region methods
actionButtonClick, filterUpdate, refresh, actionScrollBottom,
// #endregion methods
// #endregion optional
} = properties;
// #endregion properties
// #region references
const bottomTimeout = React.useRef(null);
const entityList = React.useRef(null);
// #endregion references
// #region state
const [searchValue, setSearchValue,] = React.useState('');
const [filterLength, setFilterLength,] = React.useState('SMALL');
const [refreshClicked, setRefreshClicked,] = React.useState(false);
// #endregion state
// #region handlers
const handleScroll = pluridFunctionsReact.useThrottledCallback(() => {
const element = entityList.current;
if (!element) {
return;
}
const scrolledAmount = element.scrollTop + element.getBoundingClientRect().height;
const bottomReached = scrolledAmount >= element.scrollHeight;
if (bottomReached && actionScrollBottom && entities) {
actionScrollBottom(entities);
}
}, 1000);
const clearFilterValue = () => {
setSearchValue('');
if (filterUpdate) {
filterUpdate('');
}
};
// #endregion handlers
// #region effects
React.useEffect(() => {
if (refreshClicked) {
setTimeout(() => {
setRefreshClicked(false);
}, 1500);
}
}, [
refreshClicked,
]);
/**
* Action at Bottom of List.
*/
React.useEffect(() => {
bottomTimeout.current = setTimeout(() => {
if (entityList.current && actionScrollBottom) {
entityList.current.addEventListener('scroll', handleScroll);
}
}, 100);
return () => {
if (bottomTimeout.current) {
clearTimeout(bottomTimeout.current);
}
if (entityList.current && actionScrollBottom) {
entityList.current.removeEventListener('scroll', handleScroll);
}
};
}, [
entities,
]);
/**
* Filter length
*/
React.useEffect(() => {
if (searchValue.length <= 30) {
if (filterLength !== 'SMALL') {
setFilterLength('SMALL');
}
}
else {
if (filterLength !== 'LARGE') {
setFilterLength('LARGE');
}
}
}, [
searchValue,
]);
React.useImperativeHandle(reference, () => ({
resetFilterValue() {
clearFilterValue();
}
}));
// #endregion effects
// #region render
return (React__default["default"].createElement(StyledEntityView, { theme: generalTheme },
!!loading
&& (React__default["default"].createElement(PluridSpinner, { theme: generalTheme })),
React__default["default"].createElement(StyledEntityViewTop, null,
React__default["default"].createElement(StyledEntityFilterLine, null,
React__default["default"].createElement(PluridTextline, { text: searchValue, placeholder: "filter", atChange: (event) => {
const { value, } = event.target;
setSearchValue(value);
if (filterUpdate) {
filterUpdate(value);
}
}, atKeyDown: (event) => {
if (event.key === 'Escape') {
clearFilterValue();
}
}, theme: interactionTheme, spellCheck: false, autoCapitalize: "false", autoComplete: "false", autoCorrect: "false", level: 2, style: {
width: filterLength === 'SMALL' ? '300px' : '600px',
paddingRight: '2rem',
} }),
searchValue && (React__default["default"].createElement(StyledEntityFilterCancel, { filterLength: filterLength },
React__default["default"].createElement(pluridIconsReact.PluridIconDelete, { atClick: () => {
clearFilterValue();
} })))),
React__default["default"].createElement(StyledTopButtons, null, refresh
&& !refreshClicked
&& (React__default["default"].createElement(pluridIconsReact.PluridIconReset, { atClick: () => {
setRefreshClicked(true);
refresh();
}, theme: generalTheme })))),
rows.length === 0 && (React__default["default"].createElement(StyledNoRows, null, noRows)),
rows.length !== 0 && (React__default["default"].createElement(StyledEntityListContainer, { theme: generalTheme },
React__default["default"].createElement(StyledEntityList, { theme: generalTheme, header: true },
React__default["default"].createElement(StyledEntityListItem, { rowTemplate: rowTemplate }, rowsHeader)),
React__default["default"].createElement(StyledEntityList, { theme: generalTheme, ref: entityList, loading: loading }, rows.map(row => {
return (React__default["default"].createElement(StyledEntityListItem, { key: Math.random() + '', rowTemplate: rowTemplate }, row));
})))),
actionButtonText && (React__default["default"].createElement(StyledActionButton, null,
React__default["default"].createElement(PluridPureButton$1, { text: actionButtonText, atClick: () => actionButtonClick
? actionButtonClick() : undefined, theme: interactionTheme, level: 2 })))));
// #endregion render
});
// #endregion exports
// #region imports
// #endregion libraries
// #endregion imports
// #region module
const GET_CURRENT_OWNER = gql__default["default"] `
query GetCurrentOwner {
getCurrentOwner {
status
error {
path
type
message
}
data {
id
configurations {
id
path
name
packages
}
}
}
}
`;
const GET_USAGE_TYPE = gql__default["default"] `
query GetUsageType {
getUsageType {
status
error {
path
type
message
}
data
}
}
`;
// #endregion module
// #endregion external
// #endregion imports
// #region module
/**
* Get current owner.
*
* @param dispatch
*/
const getCurrentOwner$1 = (dispatch) => __awaiter(void 0, void 0, void 0, function* () {
const dispatchSetOwnerID = (payload) => dispatch(actions.view.setViewOwnerID(payload));
const dispatchDataAddEntities = (payload) => dispatch(actions.data.addEntities(payload));
try {
const query = yield client.query({
query: GET_CURRENT_OWNER,
fetchPolicy: 'no-cache',
});
const response = query.data.getCurrentOwner;
if (!response.status) {
return false;
}
const { id, configurations, } = pluridFunctions.graphql.deleteTypenames(response.data);
dispatchSetOwnerID(id);
dispatchDataAddEntities({
type: 'configurations',
data: configurations,
});
return true;
}
catch (error) {
return false;
}
});
/**
* Get current owner and return true if set.
*
* @param setViewUsageType
*/
const getUsageType$1 = (setViewUsageType) => __awaiter(void 0, void 0, void 0, function* () {
const query = yield client.query({
query: GET_USAGE_TYPE,
});
const response = query.data.getUsageType;
if (response.status) {
const usageType = response.data;
setViewUsageType(usageType);
switch (usageType) {
case 'PRIVATE_USAGE':
return 'private';
case 'PUBLIC':
return 'general';
case 'CUSTOM_LOGIC':
return 'general';
}
}
return;
});
// #endregion exports
// #region module
const getFilterIDs = (filterTerms, value) => {
const filterIDs = [];
for (const filterTerm of filterTerms) {
let added = false;
for (const filterTermData of filterTerm.data) {
if (filterTermData.includes(value)) {
if (!added) {
filterIDs.push(filterTerm.id);
added = true;
}
}
}
}
return filterIDs;
};
// #endregion module
// #region imports
// #endregion external
// #endregion imports
// #region module
const { varia: { CopyableLine: PluridCopyableLine, }, } = pluridUiComponentsReact.universal;
const configurationRowRenderer = (configuration, handleConfigurationObliterate) => {
const { id, name, path, } = configuration;
return (React__default["default"].createElement(React__default["default"].Fragment, null,
name ? (React__default["default"].createElement("div", null, name)) : (React__default["default"].createElement(PluridCopyableLine, { data: path })),
React__default["default"].createElement(pluridReact.PluridLink, { route: `/configuration/${id}`, devisible: true, style: {
display: 'grid',
} },
React__default["default"].createElement(pluridIconsReact.PluridIconInfo
// title="details"
, {
// title="details"
atClick: () => { } })),
React__default["default"].createElement(pluridIconsReact.PluridIconDelete
// title="deregister"
, {
// title="deregister"
atClick: () => handleConfigurationObliterate(id) })));
};
const createSearchTerms$1 = (configurations) => {
const searchTerms = configurations.map(configuration => {
const { id, path, } = configuration;
const searchTerm = {
id,
data: [
path.toLowerCase(),
id.toLowerCase(),
],
};
return searchTerm;
});
return searchTerms;
};
// #endregion module
const ConfigurationsView = (properties) => {
// #region properties
const {
// #region required
// #region values
// #endregion values
// #region methods
setGeneralView,
// #endregion methods
// #endregion required
// #region optional
// #region values
// #endregion values
// #region methods
// #endregion methods
// #endregion optional
// #region state
stateGeneralTheme, stateInteractionTheme, stateConfigurations,
// #endregion state
// #region dispatch
dispatch, dispatchRemoveEntity,
// #endregion dispatch
} = properties;
// #endregion properties
// #region handlers
const handleConfigurationObliterate = (id) => __awaiter(void 0, void 0, void 0, function* () {
try {
dispatchRemoveEntity({
type: 'configuration',
id,
});
const input = {
value: id,
};
yield client.mutate({
mutation: OBLITERATE_CONFIGURATION,
variables: {
input,
},
});
}
catch (error) {
return;
}
});
// #endregion handlers
// #region state
const [searchTerms, setSearchTerms] = React.useState(createSearchTerms$1(stateConfigurations));
const [filteredRows, setFilteredRows] = React.useState(stateConfigurations.map(configuration => configurationRowRenderer(configuration, handleConfigurationObliterate)));
// #endregion state
// #region handlers
const filterUpdate = (rawValue) => {
const value = rawValue.toLowerCase();
const filterIDs = getFilterIDs(searchTerms, value);
const filteredConfigurations = stateConfigurations.filter(stateConfiguration => {
if (filterIDs.includes(stateConfiguration.id)) {
return true;
}
return false;
});
const sortedConfigurations = filteredConfigurations.sort(compareValues('name'));
setFilteredRows(sortedConfigurations.map(configuration => configurationRowRenderer(configuration, handleConfigurationObliterate)));
};
const registerJoiner = () => __awaiter(void 0, void 0, void 0, function* () {
const input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('accept', '.json, .deon');
input.addEventListener('change', (event) => {
try {
const files = event.path[0].files;
const file = files[0];
// read contents
// send name and contents to backend to find the file
// register it as joiner
}
catch (error) {
return;
}
});
input.click();
});
// #endregion handlers
// #region effects
React.useEffect(() => {
const searchTerms = createSearchTerms$1(stateConfigurations);
const filteredRows = stateConfigurations.map(configuration => configurationRowRenderer(configuration, handleConfigurationObliterate));
setSearchTerms(searchTerms);
setFilteredRows(filteredRows);
}, [
stateConfigurations,
]);
// #endregion effects
// #region render
const rowsHeader = (React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement("div", null, "joiner"),
React__default["default"].createElement("div", null),
React__default["default"].createElement("div", null)));
return (React__default["default"].createElement(EntityView, { generalTheme: stateGeneralTheme, interactionTheme: stateInteractionTheme, rowTemplate: "3fr 30px 30px", rowsHeader: rowsHeader, rows: filteredRows, noRows: "no configurations", filterUpdate: filterUpdate, refresh: () => {
getCurrentOwner$1(dispatch);
}, actionButtonText: "Register Joiner", actionButtonClick: () => {
registerJoiner();
} }));
// #endregion render
};
const mapStateToProperties$7 = (state) => ({
stateGeneralTheme: selectors.themes.getGeneralTheme(state),
stateInteractionTheme: selectors.themes.getInteractionTheme(state),
stateConfigurations: selectors.data.getConfigurations(state),
});
const mapDispatchToProperties$7 = (dispatch) => ({
dispatch,
dispatchRemoveEntity: (payload) => dispatch(actions.data.removeEntity(payload)),
});
const ConnectedConfigurationsView = reactRedux.connect(mapStateToProperties$7, mapDispatchToProperties$7, null, {
context: reduxContext,
})(ConfigurationsView);
// #endregion exports
// #region imports
// #endregion external
// #endregion imports
// #region module
const logRowRenderer = (log, handleLogObliterate) => {
const { id, package: packageName, command, startAt, finishedAt, } = log;
return (React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement("div", null,
startAt,
" ",
packageName,
" ",
command),
React__default["default"].createElement(pluridReact.PluridLink, { route: `/log/${id}`, devisible: true, style: {
display: 'grid',
} },
React__default["default"].createElement(pluridIconsReact.PluridIconInfo
// title="details"
, {
// title="details"
atClick: () => { } })),
React__default["default"].createElement(pluridIconsReact.PluridIconDelete
// title="delete"
, {
// title="delete"
atClick: () => handleLogObliterate(id) })));
};
const createSearchTerms = (logs) => {
const searchTerms = logs.map(log => {
const { id, package: packageName, command, } = log;
const searchTerm = {
id,
data: [
packageName.toLowerCase(),
command.toLowerCase(),
id.toLowerCase(),
],
};
return searchTerm;
});
return searchTerms;
};
// #endregion module
const LogsView = (properties) => {
// #region properties
const {
// #region required
// #region values
// #endregion values
// #region methods
setGeneralView,
// #endregion methods
// #endregion required
// #region state
stateGeneralTheme, stateInteractionTheme, stateLogs,
// #endregion state
// #region dispatch
dispatch, dispatchRemoveEntity,
// #endregion dispatch
} = properties;
// #endregion properties
// #region handlers
const handleLogObliterate = (id) => __awaiter(void 0, void 0, void 0, function* () {
try {
dispatchRemoveEntity({
type: 'log',
id,
});
const input = {
value: id,
};
yield client.mutate({
mutation: OBLITERATE_LOG,
variables: {
input,
},
});
}
catch (error) {
return;
}
});
// #endregion handlers
// #region state
const [searchTerms, setSearchTerms] = React.useState(createSearchTerms(stateLogs));
const [filteredRows, setFilteredRows] = React.useState(stateLogs.map(log => logRowRenderer(log, handleLogObliterate)));
// #endregion state
// #region handlers
const filterUpdate = (rawValue) => {
const value = rawValue.toLowerCase();
const filterIDs = getFilterIDs(searchTerms, value);
const filteredLogs = stateLogs.filter(stateLog => {
if (filterIDs.includes(stateLog.id)) {
return true;
}
return false;
});
const sortedLogs = filteredLogs.sort(compareValues('name'));
setFilteredRows(sortedLogs.map(log => logRowRenderer(log, handleLogObliterate)));
};
// #endregion handlers
// #region effects
React.useEffect(() => {
const searchTerms = createSearchTerms(stateLogs);
const filteredRows = stateLogs.map(log => logRowRenderer(log, handleLogObliterate));
setSearchTerms(searchTerms);
setFilteredRows(filteredRows);
}, [
stateLogs,
]);
// #endregion effects
// #region render
const rowsHeader = (React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement("div", null, "log"),
React__default["default"].createElement("div", null),
React__default["default"].createElement("div", null)));
return (React__default["default"].createElement(EntityView, { generalTheme: stateGeneralTheme, interactionTheme: stateInteractionTheme, rowTemplate: "3fr 30px 30px", rowsHeader: rowsHeader, rows: filteredRows, noRows: "no logs", filterUpdate: filterUpdate, refresh: () => {
} }));
// #endregion render
};
const mapStateToProperties$6 = (state) => ({
stateGeneralTheme: selectors.themes.getGeneralTheme(state),
stateInteractionTheme: selectors.themes.getInteractionTheme(state),
stateLogs: selectors.data.getLogs(state),
});
const mapDispatchToProperties$6 = (dispatch) => ({
dispatch,
dispatchRemoveEntity: (payload) => dispatch(actions.data.removeEntity(payload)),
});
const ConnectedLogsView = reactRedux.connect(mapStateToProperties$6, mapDispatchToProperties$6, null, {
context: reduxContext,
})(LogsView);
// #endregion exports
// #region imports
const StyledGeneralView = styled__default["default"].div.withConfig({ displayName: "StyledGeneralView", componentId: "-w7gw4x" }) `
display: grid;
grid-template-columns: ${({ compactSelectors, }) => compactSelectors
? '60px 4fr'
: '1fr 4fr'};
min-height: 700px;
`;
const StyledGeneralSelectors = styled__default["default"].div.withConfig({ displayName: "StyledGeneralSelectors", componentId: "-11ksfyu" }) `
display: grid;
justify-content: space-between;
grid-template-columns: 1fr;
grid-template-rows: ${({ viewUsageType, }) => {
// if (viewUsageType) {
// return '100px auto 80px';
// }
return '100px auto 40px';
}};
background-color: ${({ theme, }) =>