{"_id":"@aieasyto/history","_rev":"3-510671bfbdee76a62e011aaa6a5ea89f","name":"@aieasyto/history","dist-tags":{"latest":"1.2.2"},"versions":{"1.2.1":{"name":"@aieasyto/history","version":"1.2.1","keywords":[],"license":"Proprietary","_id":"@aieasyto/history@1.2.1","maintainers":[{"name":"wanghaha123","email":"w15705573237@gmail.com"}],"dist":{"shasum":"56816ab9bb6ace7d8e964f15c9f37581e124d50a","tarball":"https://registry.npmjs.org/@aieasyto/history/-/history-1.2.1.tgz","fileCount":3,"integrity":"sha512-X9ansTkz6iJIxgSBLIA09E4AfC8UhmtPnVqdyjRIHhDkiNXXyymCE9hYXtBPzBRpeSreJp9rpvHKBfRC1hU/cw==","signatures":[{"sig":"MEUCIBhR7o0tAeZOSvLcPbI4ODaYHikddxr40NXh3+/UoU5bAiEAniIjNWSjjY02J0myBDyhfe/dgVgJzRPqkf/MnWdt6s4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4402},"main":"index.js","type":"module","types":"dist/history.d.ts","module":"dist/history.esm-bundler.js","gitHead":"ce57fae97d93c339e0835caac6291ee1b1b17b37","_npmUser":{"name":"wanghaha123","email":"w15705573237@gmail.com"},"_npmVersion":"10.9.2","description":"```typescript\r export abstract class Action<\r   AUTO_MERGE = boolean | undefined,\r   NAME = AUTO_MERGE extends true ? string : boolean | undefined,\r > {\r   name?: NAME\r   autoMerge?: AUTO_MERGE","directories":{},"_nodeVersion":"23.8.0","buildOptions":{"name":"History","formats":["esm-bundler","cjs"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/history_1.2.1_1753862385114_0.5022399948488772","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@aieasyto/history","version":"1.2.2","keywords":[],"license":"Proprietary","_id":"@aieasyto/history@1.2.2","maintainers":[{"name":"wanghaha123","email":"w15705573237@gmail.com"}],"dist":{"shasum":"255eb6de35b09cb8092b11878963c3f0220a5e90","tarball":"https://registry.npmjs.org/@aieasyto/history/-/history-1.2.2.tgz","fileCount":7,"integrity":"sha512-ii4l+ba48WvciDazZbxdaqBUdOxXJwl2M3cE+6nQb+J4rSTDXRHWDz2iLZd1ml9e7rHEJyGZu6KYX4qDpwY+HA==","signatures":[{"sig":"MEQCIB7HvPYGGauzxSlPh0U5h1cjFyv2HvbO9puDa7dWiXZfAiARA396hqYO2xcJhp+fr3kMbMTYdymknnsk+8vDIqk5sw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32398},"main":"index.js","type":"module","types":"dist/history.d.ts","module":"dist/history.esm-bundler.js","gitHead":"ce57fae97d93c339e0835caac6291ee1b1b17b37","_npmUser":{"name":"wanghaha123","email":"w15705573237@gmail.com"},"_npmVersion":"10.9.2","description":"```typescript\r export abstract class Action<\r   AUTO_MERGE = boolean | undefined,\r   NAME = AUTO_MERGE extends true ? string : boolean | undefined,\r > {\r   name?: NAME\r   autoMerge?: AUTO_MERGE","directories":{},"_nodeVersion":"23.8.0","buildOptions":{"name":"History","formats":["esm-bundler","cjs"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/history_1.2.2_1753868460755_0.04728334224552322","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-07-30T07:59:44.989Z","modified":"2025-08-21T03:32:12.343Z","1.2.1":"2025-07-30T07:59:45.306Z","1.2.2":"2025-07-30T09:41:00.992Z"},"license":"Proprietary","keywords":[],"description":"```typescript\r export abstract class Action<\r   AUTO_MERGE = boolean | undefined,\r   NAME = AUTO_MERGE extends true ? string : boolean | undefined,\r > {\r   name?: NAME\r   autoMerge?: AUTO_MERGE","maintainers":[{"email":"w15705573237@gmail.com","name":"wanghaha123"},{"email":"1316143551@qq.com","name":"hff213"}],"readme":"\r\n# Action\r\n\r\n## abstract Action\r\n\r\n```typescript\r\nexport abstract class Action<\r\n  AUTO_MERGE = boolean | undefined,\r\n  NAME = AUTO_MERGE extends true ? string : boolean | undefined,\r\n> {\r\n  name?: NAME\r\n  autoMerge?: AUTO_MERGE\r\n\r\n  constructor(config?: { name?: NAME; autoMerge?: AUTO_MERGE }) {\r\n    config && (this.name = config.name)\r\n    config && (this.autoMerge = config.autoMerge)\r\n  }\r\n  do(): Promise<any> {\r\n    return Promise.resolve()\r\n  }\r\n  undo(): Promise<any> {\r\n    return Promise.resolve()\r\n  }\r\n}\r\n```\r\n\r\n根据抽象类Action派生需要复用的Action，比如 BatchAction\r\n\r\n\r\n## BatchAction\r\n\r\n批量执行的行为，想要某些操作一同执行，撤销的时候也一同撤销\r\n\r\n```typescript\r\n/**\r\n * 批量执行多个action，会按照顺序执行，并且会等待上一个action执行完成再执行下一个action\r\n */\r\nexport class BatchAction extends Action {\r\n  constructor(protected actions: Action[]) {\r\n    super()\r\n  }\r\n\r\n  async do() {\r\n    return Promise.all(this.actions.map(a => a.do()))\r\n  }\r\n\r\n  async undo() {\r\n    const actionList = this.actions.slice().reverse()\r\n    return Promise.all(actionList.map(a => a.undo()))\r\n  }\r\n}\r\n\r\n```\r\n\r\n## createAction & 自动合并Action\r\n\r\n```typescript\r\ntype CreateActionFunction = <Data>(config: ActionConfig<Data>) => MyAction<Data>\r\nexport const createAction: CreateActionFunction = config => {\r\n  return new MyAction(config)\r\n}\r\n```\r\n\r\nconfig 中如果设置了 autoMerge 为true，则一定需要传递name字段。\r\n\r\n```typescript\r\nconfig: {\r\n  autoMerge?: undefined\r\n  name?: string\r\n  data?: DATA\r\n  do: Function\r\n  undo: Function\r\n}\r\n```\r\n\r\ndo 以及 undo 中可以通过this访问到配置中的data属性\r\n\r\n```typescript\r\n\r\n\r\nconst action = createAction({\r\n  autoMerge: true,\r\n  name: 'changeColor',\r\n  data: { color: '#ff0000' },\r\n  do: () => {\r\n    console.log('do', this.data!.color)\r\n  },\r\n  undo: () => {\r\n    console.log('undo', this.data!.color)\r\n  },\r\n})\r\n```\r\n\r\n\r\n\r\nhistory 会自动将相同name的action合并成一个`BatchAction`，用于ColorPicker这类改变值非常频繁的情况。ColorPicker 一次可能创建上百个Action，可能会超出limit限制\r\n\r\n\r\n```typescript\r\nexport class CommonAction<Data> extends Action {\r\n  private doFn: Function\r\n  private undoFn: Function\r\n\r\n  // @ts-expect-error\r\n  private data?: Data\r\n\r\n  constructor(config: ActionConfig<Data>) {\r\n    super()\r\n    this.doFn = config.do\r\n    this.undoFn = config.undo\r\n    this.data = config.data\r\n    this.name = config.name\r\n    this.autoMerge = config.autoMerge\r\n  }\r\n\r\n  do() {\r\n    return wrapPromise(() => this.doFn())\r\n  }\r\n\r\n  undo() {\r\n    return wrapPromise(() => this.undoFn())\r\n  }\r\n}\r\n```\r\n\r\nCommonAction 是从 abstract Action 派生的类，也是createAction会创建并加入到history中的类\r\n\r\n## useAction\r\n\r\n```typescript\r\n\r\nconst { createHelloAction } = useAction('hello')\r\n\r\nconfig action createHelloAction({\r\n  ...config\r\n})\r\n\r\n```\r\n\r\nuseAction 参数是一个name，会根据这个name返回一个action creator，并且动态生成函数命名 \r\n\r\n# History\r\n\r\n```typescript\r\nimport ActionHistory from 'src/lib/history'\r\n\r\nconst history = new ActionHistory({ limit: 100, logger: __DEV__, mergeTime: 500 })\r\n\r\n```\r\n\r\n- logger: `__DEV__` 在研发模式下开启logger\r\n- limit: 限制history最大容量\r\n- mergeTime: 自动合并同类Action的时间间隔，默认2_000\r\n\r\n## history.do\r\n\r\n\r\n```typescript\r\nimport ActionHistory from 'src/lib/history'\r\n\r\nconst history = new ActionHistory({ limit: 100, logger: __DEV__, mergeTime: 500 })\r\n\r\nconst action = createAction({...config})\r\n\r\nhistory.do(action)\r\n```\r\n\r\n`history.do(action)` 会执行`action`的`do`方法，并将此`action`加入到`history`的`undoStack`中\r\n\r\n\r\n","readmeFilename":"README.md"}