Files
Automata/packages/editor-ui/src/plugins/i18n/utils.ts
Iván Ovejero 5ca2148c7e refactor(editor): Apply Prettier (no-changelog) (#4920)
*  Adjust `format` script

* 🔥 Remove exemption for `editor-ui`

* 🎨 Prettify

* 👕 Fix lint
2022-12-14 10:04:10 +01:00

68 lines
2.3 KiB
TypeScript

/**
* Derive the middle key, i.e. the segment of the render key located between
* the initial key (path to parameters root) and the property to render.
*
* Used by `nodeText()` to handle nested params.
*
* Location: `n8n-nodes-base.nodes.github.nodeView.<middleKey>.placeholder`
*/
export function deriveMiddleKey(path: string, parameter: { name: string; type: string }) {
let middleKey = parameter.name;
if (isTopLevelCollection(path, parameter) || isNestedInCollectionLike(path)) {
const pathSegments = normalize(path).split('.');
middleKey = insertOptionsAndValues(pathSegments).join('.');
}
if (isNestedCollection(path, parameter) || isFixedCollection(path, parameter)) {
const pathSegments = [...normalize(path).split('.'), parameter.name];
middleKey = insertOptionsAndValues(pathSegments).join('.');
}
return middleKey;
}
/**
* Check if a param path is for a param nested inside a `collection` or
* `fixedCollection` param.
*/
export const isNestedInCollectionLike = (path: string) => path.split('.').length >= 3;
const isTopLevelCollection = (path: string, parameter: { type: string }) =>
path.split('.').length === 2 && parameter.type === 'collection';
const isNestedCollection = (path: string, parameter: { type: string }) =>
path.split('.').length > 2 && parameter.type === 'collection';
/**
* Check if the param is a normal `fixedCollection`, i.e. a FC other than the wrapper
* that sits at the root of a node's top-level param and contains all of them.
*/
const isFixedCollection = (path: string, parameter: { type: string }) =>
parameter.type === 'fixedCollection' && path !== 'parameters';
/**
* Remove all indices and the `parameters.` prefix from a parameter path.
*
* Example: `parameters.a[0].b` → `a.b`
*/
export const normalize = (path: string) => path.replace(/\[.*?\]/g, '').replace('parameters.', '');
/**
* Insert `'options'` and `'values'` on an alternating basis in a string array of
* indefinite length. Helper to create a valid render key for a collection-like param.
*
* Example: `['a', 'b', 'c']` → `['a', 'options', 'b', 'values', 'c']`
*/
export const insertOptionsAndValues = (pathSegments: string[]) => {
return pathSegments.reduce<string[]>((acc, cur, i) => {
acc.push(cur);
if (i === pathSegments.length - 1) return acc;
acc.push(i % 2 === 0 ? 'options' : 'values');
return acc;
}, []);
};