import type { ITagObject } from "bp/content/interface" ; /**  action 的選項不應該有 renderer 存在  type ActionOption = Omit < Shrewd . IDecoratorOptions < unknown > , "renderer" > ; /**
 * 跟  shrewd 的效果一樣，不過在值即將發生變更的時候會觸發動作。
 *
 * 所有有註記  action 的屬性都不能夠被改編，
 * 因為必須確保即使程式改版、歷史紀錄仍然能夠被正確移動。
  export function action ( option ) ; export function action ( target , name ) ; export function action ( ... p ) { if ( p . length == 1 ) return ( obj , name ) => actionInner ( obj , name , p [ 0 ] ) ; else actionInner ( p [ 0 ] , p [ 1 ] , { } ) ; } /**
 *  action 裝飾器的內部實作
  function actionInner ( target , name , option ) { shrewd ( { validator ( this , v ) { let record = actionMap . get ( this ) ; if ( ! record ) actionMap . set ( this , record = { } ) ; let valid = option . validator ?. apply ( this , [ v ] ) ?? true ; if ( valid ) { if ( name in record && record [ name ] !== v ) { /** 如果這是一次有效的變更，則產生一個對應的  FieldCommand this . $design . $history ?. $fieldChange ( this , name , record [ name ] , v ) ; } record [ name ] = v ; } return valid ; } , } ) ( target , name ) ; } /**
 * 從物件實體到對應的動作  Record 的映射
  const actionMap = new WeakMap < object , Record < string | symbol , unknown > > ( ) ;