diff --git a/packages/core/src/helpers/assert.ts b/packages/core/src/helpers/assert.ts index 73a0a4e..fbcb62b 100644 --- a/packages/core/src/helpers/assert.ts +++ b/packages/core/src/helpers/assert.ts @@ -35,7 +35,7 @@ export function isTangoVariable(name: string) { return /^tango\??\.(stores|services)\??\./.test(name) && name.split('.').length > 2; } -const templatePattern = /^{(.+)}$/s; +const templatePattern = /^{(.+)}$/; /** * 判断给定字符串是否被表达式容器`{expCode}`包裹 diff --git a/packages/core/src/helpers/object.ts b/packages/core/src/helpers/object.ts index 2969fcc..034a6a8 100644 --- a/packages/core/src/helpers/object.ts +++ b/packages/core/src/helpers/object.ts @@ -11,7 +11,7 @@ export function namesToImportDeclarations( names: string[], nameMap: Dict, ) { - const map = {}; + const map: Dict = {}; names.forEach((name) => { const mod = nameMap[name]; if (mod) { diff --git a/packages/core/src/helpers/schema-helpers.ts b/packages/core/src/helpers/schema-helpers.ts index 8caff9f..a6445e4 100644 --- a/packages/core/src/helpers/schema-helpers.ts +++ b/packages/core/src/helpers/schema-helpers.ts @@ -1,9 +1,9 @@ -import { parseDndId, uuid } from '@music163/tango-helpers'; +import { Dict, parseDndId, uuid } from '@music163/tango-helpers'; // { id: 1, component, props: { id: 1 }, children: [ { id: 2, component } ] } export function deepCloneNode(obj: any, component?: string): any { function deepCloneObject() { - const target = {}; + const target: Dict = {}; for (const key in obj) { if (Object.hasOwn(obj, key)) { target[key] = deepCloneNode(obj[key], component); diff --git a/packages/designer/src/components/variable-tree/add-service.tsx b/packages/designer/src/components/variable-tree/add-service.tsx index 25833dd..2f83b0a 100644 --- a/packages/designer/src/components/variable-tree/add-service.tsx +++ b/packages/designer/src/components/variable-tree/add-service.tsx @@ -1,11 +1,11 @@ -import { isValidFunctionCode, url2serviceName } from '@music163/tango-helpers'; +import { Dict, isValidFunctionCode, url2serviceName } from '@music163/tango-helpers'; import { InputCode } from '@music163/tango-ui'; import { Button, Dropdown, Form, FormProps, Input, Select, Space } from 'antd'; import { Box } from 'coral-system'; import React, { useState } from 'react'; interface AddServiceFormProps extends FormProps { - initialValues?: object; + initialValues?: Dict; onSubmit: (values: object) => void; onCancel: () => void; serviceModules: object[]; diff --git a/packages/designer/src/dnd/hotkey.ts b/packages/designer/src/dnd/hotkey.ts index 4fd89ea..1312384 100644 --- a/packages/designer/src/dnd/hotkey.ts +++ b/packages/designer/src/dnd/hotkey.ts @@ -1,8 +1,10 @@ +import { Dict } from '@music163/tango-helpers'; + /** * 快捷键 */ export class Hotkey { - private readonly hotkeyMap = {}; + private readonly hotkeyMap: Dict = {}; constructor(hotkeys: Record) { Object.keys(hotkeys).forEach((hotkey) => { diff --git a/packages/designer/src/sandbox/sandbox.tsx b/packages/designer/src/sandbox/sandbox.tsx index c3665ba..b918b56 100644 --- a/packages/designer/src/sandbox/sandbox.tsx +++ b/packages/designer/src/sandbox/sandbox.tsx @@ -1,7 +1,7 @@ import React, { useImperativeHandle, ForwardedRef, useRef, useState, useEffect } from 'react'; import { Box } from 'coral-system'; import { CodeSandbox, CodeSandboxProps } from '@music163/tango-sandbox'; -import { getValue, isFunction, logger, pick, setValue } from '@music163/tango-helpers'; +import { Dict, getValue, isFunction, logger, pick, setValue } from '@music163/tango-helpers'; import { observer, useWorkspace, useDesigner } from '@music163/tango-context'; import { Simulator, Viewport } from '../simulator'; import { useSandboxQuery } from '../context'; @@ -88,7 +88,7 @@ function useSandbox({ onViewChange: (data) => onViewChange && onViewChange(data, getSandboxConfig()), }); - let files = Array.from(workspace.files.keys()).reduce((prev, filename) => { + let files = Array.from(workspace.files.keys()).reduce((prev, filename) => { let code = workspace.getFile(filename).code; if (filename === '/tango.config.json') { code = mergeTangoConfigJson(code, { isPreview, injectScript, formatter: configFormatter }); diff --git a/packages/designer/src/setters/event-setter.tsx b/packages/designer/src/setters/event-setter.tsx index cffe051..793eaac 100644 --- a/packages/designer/src/setters/event-setter.tsx +++ b/packages/designer/src/setters/event-setter.tsx @@ -4,7 +4,7 @@ import { AutoComplete } from 'antd'; import { ActionSelect } from '@music163/tango-ui'; import { FormItemComponentProps } from '@music163/tango-setting-form'; import { useWorkspace, useWorkspaceData } from '@music163/tango-context'; -import { wrapCode } from '@music163/tango-helpers'; +import { Dict, wrapCode } from '@music163/tango-helpers'; import { ExpressionPopover } from './expression-setter'; import { value2code } from '@music163/tango-core'; @@ -141,7 +141,7 @@ export function EventSetter(props: EventSetterProps) { ); } -const handlerMap = { +const handlerMap: Dict = { [EventAction.OpenModal]: 'openModal', [EventAction.CloseModal]: 'closeModal', [EventAction.NavigateTo]: 'navigateTo', diff --git a/packages/designer/src/setters/expression-setter.tsx b/packages/designer/src/setters/expression-setter.tsx index 2cbcc8a..e6d8aca 100644 --- a/packages/designer/src/setters/expression-setter.tsx +++ b/packages/designer/src/setters/expression-setter.tsx @@ -182,7 +182,7 @@ export function ExpressionPopover({ })); const sandbox = useSandboxQuery(); - const evaluateContext = sandbox.window; + const evaluateContext: any = sandbox.window; const handleExpInputChange = (val: string) => { setExp(val?.trim()); @@ -253,7 +253,7 @@ export function ExpressionPopover({ height="100%" showViewButton dataSource={dataSource || expressionVariables} - appContext={sandbox?.window['tango']} + appContext={evaluateContext['tango']} getStoreNames={() => Object.keys(workspace.storeModules)} serviceModules={serviceModules} getServiceData={(serviceKey) => { diff --git a/packages/designer/src/setters/list-setter.tsx b/packages/designer/src/setters/list-setter.tsx index 24dddd1..e4e0b44 100644 --- a/packages/designer/src/setters/list-setter.tsx +++ b/packages/designer/src/setters/list-setter.tsx @@ -3,10 +3,11 @@ import { css, Box } from 'coral-system'; import { Form, Input, Button, Popover } from 'antd'; import { DeleteOutlined, EditOutlined, HolderOutlined } from '@ant-design/icons'; import { FormItemComponentProps } from '@music163/tango-setting-form'; +import { Dict } from '@music163/tango-helpers'; import { DragBox } from '../components'; -function copyWithoutUndefined(source: Record) { - const ret = {}; +function copyWithoutUndefined(source: Dict) { + const ret: Dict = {}; for (const key in source) { if (source[key] !== undefined) { ret[key] = source[key]; diff --git a/packages/designer/src/setters/model-setter.tsx b/packages/designer/src/setters/model-setter.tsx index bb8b877..7e93ec0 100644 --- a/packages/designer/src/setters/model-setter.tsx +++ b/packages/designer/src/setters/model-setter.tsx @@ -60,7 +60,7 @@ export function ModelSetter({ }: FormItemComponentProps) { const [inputValue, setInputValue] = useState(value); const { modelVariables } = useWorkspaceData(); - const evaluateContext = useSandboxQuery().window || {}; + const evaluateContext: any = useSandboxQuery().window || {}; const workspace = useWorkspace(); const definedVariables = useMemo(() => { const list: string[] = []; diff --git a/packages/designer/src/setters/render-setter.tsx b/packages/designer/src/setters/render-setter.tsx index c038b42..0e6560c 100644 --- a/packages/designer/src/setters/render-setter.tsx +++ b/packages/designer/src/setters/render-setter.tsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { ActionSelect, InputCode } from '@music163/tango-ui'; import { FormItemComponentProps } from '@music163/tango-setting-form'; import { Box } from 'coral-system'; +import { Dict } from '@music163/tango-helpers'; interface IRenderOption { label: string; @@ -37,7 +38,7 @@ export function RenderSetter({ }, [value]); const optionsMap = useMemo(() => { - return options.reduce((prev, cur) => { + return options.reduce((prev, cur) => { prev[cur.value] = cur; return prev; }, {}); diff --git a/packages/designer/src/setters/router-setter.tsx b/packages/designer/src/setters/router-setter.tsx index 5cc5a36..d65c6fb 100644 --- a/packages/designer/src/setters/router-setter.tsx +++ b/packages/designer/src/setters/router-setter.tsx @@ -1,11 +1,17 @@ import React, { useEffect, useState } from 'react'; import { Box } from 'coral-system'; import { Input, Radio } from 'antd'; -import { isValidUrl } from '@music163/tango-helpers'; +import { Dict, isValidUrl } from '@music163/tango-helpers'; import { FormItemComponentProps } from '@music163/tango-setting-form'; import { useWorkspaceData } from '@music163/tango-context'; import { PickerSetter } from './picker-setter'; +const routerModeMap: Dict = { + link: '链接', + router: '路由', + both: '', +}; + export function RouterSetter(props: FormItemComponentProps) { const [type, setType] = useState<'input' | 'select'>(() => { return isValidUrl(props.value) ? 'input' : 'select'; @@ -37,7 +43,7 @@ export function RouterSetter(props: FormItemComponentProps) { )} {type === 'input' && ( setInput(e.target.value)} diff --git a/packages/designer/src/setting-panel.tsx b/packages/designer/src/setting-panel.tsx index 1be927e..b678455 100644 --- a/packages/designer/src/setting-panel.tsx +++ b/packages/designer/src/setting-panel.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Box } from 'coral-system'; import { SettingForm, FormModel, SettingFormProps } from '@music163/tango-setting-form'; import { Panel } from '@music163/tango-ui'; -import { clone, parseDndId } from '@music163/tango-helpers'; +import { clone, Dict, parseDndId } from '@music163/tango-helpers'; import { observer, useDesigner, useWorkspace } from '@music163/tango-context'; import { registerBuiltinSetters } from './setters'; @@ -34,7 +34,7 @@ export const SettingPanel = observer((props: SettingPanelProps) => { } const getSettingValue = (attributes: Record) => { - const ret = {}; + const ret: Dict = {}; const keys = Object.keys(attributes); for (const key of keys) { if (/^data-/.test(key)) { diff --git a/packages/designer/src/sidebar/components-panel.tsx b/packages/designer/src/sidebar/components-panel.tsx index 6110903..258694c 100644 --- a/packages/designer/src/sidebar/components-panel.tsx +++ b/packages/designer/src/sidebar/components-panel.tsx @@ -2,6 +2,7 @@ import React, { useMemo, useState } from 'react'; import { Box, Grid, Text } from 'coral-system'; import styled, { css } from 'styled-components'; import { + Dict, IComponentPrototype, MenuDataType, MenuValueType, @@ -66,7 +67,7 @@ export interface ComponentsPanelProps { layout?: 'grid' | 'line'; } -const localeMap = { +const localeMap: Dict = { common: '基础组件', atom: '原子组件', snippet: '组合', @@ -124,7 +125,7 @@ export const ComponentsPanel = observer( const tabs = Object.keys(menuData).map((key) => ({ key, label: localeMap[key], - children: , + children: , })); if (showBizComps) { diff --git a/packages/designer/src/sidebar/datasource-panel/interface-config.tsx b/packages/designer/src/sidebar/datasource-panel/interface-config.tsx index 4437948..604bdfa 100644 --- a/packages/designer/src/sidebar/datasource-panel/interface-config.tsx +++ b/packages/designer/src/sidebar/datasource-panel/interface-config.tsx @@ -24,7 +24,7 @@ const DataSourceView = observer(() => { { workspace.removeServiceFunction(variableKey); diff --git a/packages/designer/src/sidebar/datasource-panel/proxy-config.tsx b/packages/designer/src/sidebar/datasource-panel/proxy-config.tsx index 107795d..127d4d3 100644 --- a/packages/designer/src/sidebar/datasource-panel/proxy-config.tsx +++ b/packages/designer/src/sidebar/datasource-panel/proxy-config.tsx @@ -4,6 +4,7 @@ import { ConfigGroup, ConfigItem } from '@music163/tango-ui'; import { Box, css } from 'coral-system'; import { Input, Switch, Form, Button, message, FormProps } from 'antd'; import { CloseCircleOutlined, CloseOutlined } from '@ant-design/icons'; +import { Dict } from '@music163/tango-helpers'; export default observer(() => { const workspace = useWorkspace(); @@ -63,7 +64,7 @@ function ProxyManage({ initialValues: initialValuesProp = {}, onSave, }: { - initialValues?: object; + initialValues?: Dict; onSave?: (values: any) => void; }) { const initialValues = useMemo(() => { @@ -84,7 +85,7 @@ function ProxyManage({ {...proxyManageFormStyle} initialValues={initialValues} onFinish={(values) => { - const proxy = values.proxy.reduce((prev: object, { path, ...rest }: any) => { + const proxy = values.proxy.reduce((prev: any, { path, ...rest }: any) => { prev[path] = rest; return prev; }, {}); diff --git a/packages/designer/src/sidebar/outline-panel/state-tree.tsx b/packages/designer/src/sidebar/outline-panel/state-tree.tsx index 87953a1..5385bfb 100644 --- a/packages/designer/src/sidebar/outline-panel/state-tree.tsx +++ b/packages/designer/src/sidebar/outline-panel/state-tree.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useReducer } from 'react'; import { observer } from '@music163/tango-context'; -import { isFunction, isObject, pick } from '@music163/tango-helpers'; +import { Dict, isFunction, isObject, pick } from '@music163/tango-helpers'; import { CollapsePanel, IconButton, JsonView } from '@music163/tango-ui'; import { ReloadOutlined } from '@ant-design/icons'; import { useSandboxQuery } from '../../context'; -function processTango(obj: any = {}, index = 0) { - const ret = {}; +function processTango(obj: Dict = {}, index = 0) { + const ret: Dict = {}; Object.keys(obj).forEach((key) => { const val = obj[key]; if (index > 2) { @@ -25,7 +25,7 @@ function processTango(obj: any = {}, index = 0) { export const StateTree = observer(() => { const sandboxQuery = useSandboxQuery(); const [, forceUpdate] = useReducer((x) => x + 1, 0); - const tangoContext = pick(sandboxQuery.window['tango'] || {}, [ + const tangoContext = pick((sandboxQuery.window as any)['tango'] || {}, [ 'stores', 'pageStore', 'services', diff --git a/packages/designer/src/sidebar/resizable-box.tsx b/packages/designer/src/sidebar/resizable-box.tsx index 3afca06..4db9b97 100644 --- a/packages/designer/src/sidebar/resizable-box.tsx +++ b/packages/designer/src/sidebar/resizable-box.tsx @@ -19,7 +19,7 @@ const resizeHandleStyle = (axis: ResizableBoxProps['axis'], barStyle: HTMLCoralP cursor: ${axis === 'x' ? 'col-resize' : 'row-resize'}; ${barStyle && Object.keys(barStyle) - .map((key) => `${key}: ${barStyle[key]};`) + .map((key) => `${key}: ${(barStyle as any)[key]};`) .join('')} &:hover, &:active { diff --git a/packages/helpers/src/helpers/array.ts b/packages/helpers/src/helpers/array.ts index 16e5794..f1c3e31 100644 --- a/packages/helpers/src/helpers/array.ts +++ b/packages/helpers/src/helpers/array.ts @@ -43,7 +43,7 @@ export function filterTreeData( childrenProp = 'children', onlyLeaf = false, ) { - const reducer = (result: T[], current: T) => { + const reducer = (result: T[], current: any) => { if (current[childrenProp]) { const newChildren = current[childrenProp].reduce(reducer, []); if (newChildren.length) { @@ -70,7 +70,7 @@ export function mapTreeData( mapper: (node: T) => any, childrenProp = 'children', ) { - return treeData.map((node) => { + return treeData.map((node: any) => { const newNode = mapper(node); if (node[childrenProp]) { newNode[childrenProp] = mapTreeData(node[childrenProp], mapper, childrenProp); diff --git a/packages/helpers/src/helpers/code-helper.ts b/packages/helpers/src/helpers/code-helper.ts index 0fcb608..0ffed10 100644 --- a/packages/helpers/src/helpers/code-helper.ts +++ b/packages/helpers/src/helpers/code-helper.ts @@ -32,7 +32,7 @@ export function isValidFunctionCode(str: string) { } } -const templatePattern = /^{{(.+)}}$/s; +const templatePattern = /^{{(.+)}}$/; /** * 判断给定代码是否被双花括号包裹 diff --git a/packages/helpers/src/helpers/object.ts b/packages/helpers/src/helpers/object.ts index 0d90580..d4dc077 100644 --- a/packages/helpers/src/helpers/object.ts +++ b/packages/helpers/src/helpers/object.ts @@ -1,5 +1,6 @@ import get from 'lodash.get'; import set from 'lodash.set'; +import { Dict } from '../types'; /** * 合并 target 和 source 对象,source 对象的优先级更高,如存在重名,覆盖 target 中的 key @@ -45,7 +46,7 @@ export function clone(obj: any, withUndefined = true) { return obj; } - const target = {}; + const target: Dict = {}; for (const key in obj) { if (withUndefined) { target[key] = obj[key]; @@ -65,7 +66,7 @@ export function omit(obj: any, keys: string[]) { } export function pick(obj: any, keys: string[]) { - const target = {}; + const target: Dict = {}; for (const key of keys) { target[key] = obj[key]; } diff --git a/packages/helpers/src/hoc/with-dnd.tsx b/packages/helpers/src/hoc/with-dnd.tsx index 81fab2e..728e51d 100644 --- a/packages/helpers/src/hoc/with-dnd.tsx +++ b/packages/helpers/src/hoc/with-dnd.tsx @@ -57,7 +57,7 @@ export function withDnd(options: IWithDndOptions) { const override = options.overrideProps || {}; const renderFooter = options.renderFooter || renderEmpty; - const Component = forwardRef((props, refProp) => { + const Component = forwardRef((props: any, refProp) => { const dndProps = { [SLOT.id]: props.tid, // id 作为唯一标记 [SLOT.dnd]: props[SLOT.dnd], // dnd 作为追踪标记 diff --git a/packages/helpers/src/stores/list-store.ts b/packages/helpers/src/stores/list-store.ts index 9acada4..e3dd851 100644 --- a/packages/helpers/src/stores/list-store.ts +++ b/packages/helpers/src/stores/list-store.ts @@ -1,13 +1,14 @@ import { warning } from '../helpers'; +import { Dict } from '../types'; -type ListStoreOptionsType = { +type ListStoreOptionsType = { data: T[]; keyProp?: string; labelProp?: string; childrenProp?: string; }; -export class ListStore { +export class ListStore { private nodeMap: Map; private keyProp: string; private childrenProp: string; diff --git a/packages/setting-form/src/form.tsx b/packages/setting-form/src/form.tsx index 8d19229..8387cb3 100644 --- a/packages/setting-form/src/form.tsx +++ b/packages/setting-form/src/form.tsx @@ -7,6 +7,7 @@ import { noop, filterTreeData, mapTreeData, + Dict, } from '@music163/tango-helpers'; import { Action, Search, Tabs } from '@music163/tango-ui'; import { SettingFormItem, register } from './form-item'; @@ -24,7 +25,7 @@ function normalizeComponentProps( props: IComponentPrototype['props'], groupOptions: IFormTabsGroupOption[], ) { - const groups: Record = groupOptions.reduce((prev, cur) => { + const groups: Record = groupOptions.reduce((prev, cur) => { prev[cur.value] = []; return prev; }, {}); diff --git a/packages/ui/src/context-action.tsx b/packages/ui/src/context-action.tsx index 8d40ff7..bfcf80a 100644 --- a/packages/ui/src/context-action.tsx +++ b/packages/ui/src/context-action.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from 'react'; import { Menu, Space } from 'antd'; import { Box, css } from 'coral-system'; -import { isApplePlatform } from '@music163/tango-helpers'; +import { Dict, isApplePlatform } from '@music163/tango-helpers'; const contextActionStyle = css` display: flex; @@ -46,7 +46,7 @@ export function ContextAction({ if (!hotkey) { return null; } - const keyMap = isApplePlatform() + const keyMap: Dict = isApplePlatform() ? { command: '⌘', meta: '⌘',