@yqg/simple 1.0.0 → 1.0.1-beta.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -87,9 +87,203 @@ export default {
87
87
 
88
88
  ## 工具函数
89
89
 
90
+ ### 完整引入(从主入口)
91
+
90
92
  ```javascript
91
- import { formatMap, object } from '@yqg/simple'
93
+ import { util, formatMap, object, constant } from '@yqg/simple'
94
+
95
+ // 使用加密工具
96
+ const encrypted = util.aesEncrypt('secret message')
97
+ const decrypted = util.aesDecrypt(encrypted)
98
+
99
+ // 使用对象工具
100
+ const value = object.pickValue(data, 'user.name')
101
+ const merged = object.merge(obj1, obj2)
92
102
 
93
- // 使用工具函数
103
+ // 使用格式化工具
94
104
  const formatted = formatMap.formatValue(value, options)
95
- const merged = object.deepMerge(obj1, obj2)
105
+ ```
106
+
107
+ ### 按需引入(推荐)
108
+
109
+ 支持通过子路径按需引入工具函数,减少打包体积:
110
+
111
+ ```javascript
112
+ // 加密和字符串工具
113
+ import { aesEncrypt, aesDecrypt, camelCaseToUnderscore } from '@yqg/simple/util/tool'
114
+
115
+ const encrypted = aesEncrypt('secret message')
116
+ const snakeCase = camelCaseToUnderscore('userName') // 'user_name'
117
+
118
+ // 对象操作工具
119
+ import { pickValue, setValue, merge } from '@yqg/simple/util/object'
120
+
121
+ const data = { user: { name: 'John', age: 30 } }
122
+ const name = pickValue(data, 'user.name') // 'John'
123
+ const updated = setValue(data, 'user.email', 'john@example.com')
124
+ const merged = merge({ a: 1 }, { b: 2 }) // { a: 1, b: 2 }
125
+
126
+ // 格式化工具
127
+ import getFormatter from '@yqg/simple/util/format-map'
128
+
129
+ const listFormatter = getFormatter('list')
130
+ const formatted = listFormatter.format(['a', 'b', 'c']) // 'a\nb\nc'
131
+
132
+ // 枚举工具
133
+ import { boolOf, valueOf } from '@yqg/simple/util/enum'
134
+
135
+ const bool = boolOf('TRUE') // true
136
+ const str = valueOf(true) // 'TRUE'
137
+
138
+ // JSON 工具
139
+ import { pureJSONString, reformatJson } from '@yqg/simple/util/json'
140
+
141
+ const jsonStr = pureJSONString({ name: 'John' })
142
+
143
+ // 本地存储工具
144
+ import { setStorage, getStorage, removeItem } from '@yqg/simple/util/local-storage'
145
+
146
+ setStorage('user', JSON.stringify({ name: 'John' }))
147
+ const user = getStorage('user')
148
+
149
+ // 键码映射
150
+ import keyCodeMap from '@yqg/simple/util/keyCodeMap'
151
+
152
+ if (event.keyCode === keyCodeMap.enter) {
153
+ // 处理回车键
154
+ }
155
+
156
+ // Storage 类
157
+ import Storage from '@yqg/simple/util/storage'
158
+
159
+ const myStorage = new Storage('my-key', true) // 使用 sessionStorage
160
+ myStorage.set({ data: 'value' })
161
+ const data = myStorage.get()
162
+ ```
163
+
164
+ ### TypeScript 支持
165
+
166
+ 所有工具函数都提供完整的 TypeScript 类型声明,开发时会有智能提示:
167
+
168
+ ```typescript
169
+ import { aesEncrypt, pickValue, merge } from '@yqg/simple/util'
170
+
171
+ // ✅ 编辑器自动提示:aesEncrypt(message: string, key?: string): string
172
+ const encrypted = aesEncrypt('hello')
173
+
174
+ // ✅ 编辑器自动提示:pickValue<T = any>(obj: any, keyString: string): T | undefined
175
+ const value = pickValue<number>({ a: { b: 1 } }, 'a.b')
176
+
177
+ // ✅ 编辑器自动提示:merge<T, S>(target?: T, source?: S): T & S
178
+ const merged = merge({ a: 1 }, { b: 2 })
179
+ ```
180
+
181
+ ### 工具函数 API
182
+
183
+ #### 加密工具 (`util/tool`)
184
+
185
+ - `aesEncrypt(message: string, key?: string): string` - AES 加密
186
+ - `aesDecrypt(ciphertext: string, key?: string): string` - AES 解密
187
+ - `camelCaseToUnderscore(camelStr: string): string` - 驼峰转下划线
188
+
189
+ #### 对象工具 (`util/object`)
190
+
191
+ - `evalProp<T, V>(value: T | ((values: V) => T), values?: V): T` - 评估属性(函数或值)
192
+ - `pickValue<T>(obj: any, keyString: string): T | undefined` - 提取嵌套值(支持 'a.b.c' 或 'a[0].b')
193
+ - `setValue<T>(obj: T, keyString: string, value: any): T` - 设置嵌套值
194
+ - `spreadObjectKeys<T>(origin: T): T` - 展开对象键
195
+ - `numbersToStr<T>(val: T | T[]): ...` - 数字转字符串
196
+ - `spreadProps(props): ...` - 展开 Vue 组件属性
197
+ - `appendClass(className, appendix): ...` - 追加类名
198
+ - `merge<T, S>(target?: T, source?: S): T & S` - 深度合并对象
199
+ - `isMobile: boolean` - 是否为移动设备
200
+
201
+ #### 格式化工具 (`util/format-map`)
202
+
203
+ - `getFormatter(format: string | Formatter): Formatter` - 获取格式化器
204
+ - 内置格式化器:`boolean`、`bool`、`list`、`comma`、`listJson`、`json`、`listComma`、`commaToList`、`date`、`dateTime`、`percent`
205
+
206
+ ```javascript
207
+ const listFormatter = getFormatter('list')
208
+ const formatted = listFormatter.format(['a', 'b', 'c']) // 'a\nb\nc'
209
+ const unformatted = listFormatter.unformat('a\nb\nc') // ['a', 'b', 'c']
210
+ ```
211
+
212
+ #### 枚举工具 (`util/enum`)
213
+
214
+ - `boolOf(str: string): boolean` - 字符串转布尔值('TRUE' -> true)
215
+ - `valueOf(bool: boolean): 'TRUE' | 'FALSE' | undefined` - 布尔值转字符串(true -> 'TRUE')
216
+
217
+ #### JSON 工具 (`util/json`)
218
+
219
+ - `pureJSONString(value: any): string` - 转换为格式化的 JSON 字符串
220
+ - `reformatJson(value: string, context?: any): string` - 重新格式化 JSON 字符串
221
+
222
+ #### 本地存储工具 (`util/local-storage`)
223
+
224
+ - `setStorage(itemName: string, item: string): void` - 设置 localStorage
225
+ - `getStorage(itemName: string): string | null` - 获取 localStorage
226
+ - `removeItem(itemName: string): void` - 删除 localStorage 项
227
+
228
+ #### 键码映射 (`util/keyCodeMap`)
229
+
230
+ ```javascript
231
+ const keyCodeMap = {
232
+ esc: 27,
233
+ tab: 9,
234
+ enter: 13,
235
+ up: 38,
236
+ down: 40,
237
+ backSpace: 8
238
+ }
239
+ ```
240
+
241
+ #### Storage 类 (`util/storage`)
242
+
243
+ 封装了 localStorage 或 sessionStorage 的存储类:
244
+
245
+ ```typescript
246
+ class Storage {
247
+ constructor(key: string, useSessionStorage?: boolean)
248
+ set(cache: any): void // 设置存储
249
+ get<T = any>(): T | null // 获取存储
250
+ remove(): void // 删除存储
251
+ on(fn: (event: StorageEvent) => void): void // 监听变化
252
+ off(needsRemove?: boolean): void // 取消监听
253
+ }
254
+ ```
255
+
256
+ ## 常量
257
+
258
+ ```javascript
259
+ import * as constant from '@yqg/simple/constant'
260
+
261
+ // 或按需引入
262
+ import * as commonFields from '@yqg/simple/constant/common-fields'
263
+ import * as fields from '@yqg/simple/constant/fields'
264
+ ```
265
+
266
+ ## 文档
267
+
268
+ - [详细使用示例](./USAGE_EXAMPLE.md)
269
+ - [更新日志](./CHANGELOG.md)
270
+
271
+ ## 开发
272
+
273
+ ```bash
274
+ # 安装依赖
275
+ npm install
276
+
277
+ # 开发模式
278
+ npm run dev
279
+
280
+ # 构建
281
+ npm run build
282
+
283
+ # 代码检查
284
+ npm run lint
285
+ ```
286
+
287
+ ## License
288
+
289
+ MIT
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@vueuse/core"),i=require("moment"),n=require("underscore"),r=require("./index-d7b51690.js");require("ant-design-vue"),require("vue-clipboard2"),require("@yqg/enum"),require("vue"),require("vuex"),require("vue-codemirror"),require("codemirror/mode/clike/clike.js"),require("codemirror/mode/groovy/groovy.js"),require("codemirror/mode/javascript/javascript.js"),require("codemirror/mode/sql/sql.js"),require("codemirror/mode/yaml/yaml.js"),require("codemirror/mode/xml/xml.js"),require("codemirror/lib/codemirror.css"),require("codemirror/theme/neo.css"),require("codemirror/addon/hint/show-hint.css"),require("codemirror/addon/display/placeholder.js"),require("codemirror/addon/edit/closebrackets.js"),require("codemirror/addon/edit/closetag.js"),require("codemirror/addon/edit/matchbrackets.js"),require("codemirror/addon/edit/matchtags.js"),require("codemirror/addon/hint/show-hint.js"),require("codemirror/addon/hint/sql-hint.js"),require("codemirror/addon/fold/foldgutter.css"),require("codemirror/addon/fold/foldcode.js"),require("codemirror/addon/fold/foldgutter.js"),require("codemirror/addon/fold/brace-fold.js"),require("codemirror/addon/fold/comment-fold.js"),require("codemirror/addon/fold/indent-fold.js"),require("yqg-common/core/StageUtil"),require("element-resize-detector"),require("vuedraggable"),require("moment-timezone"),require("crypto-js"),require("@yqg/resource"),require("prismjs"),require("qiniu-js"),require("dompurify"),require("marked"),require("tiptap"),require("tiptap-extensions"),require("tiptap-commands"),require("prosemirror-inputrules"),require("tiptap-utils"),require("@ant-design/icons/lib/outline/LinkOutline"),require("@ant-design/icons/lib/outline/FileOutline"),require("@ant-design/icons/lib/outline/BoldOutline"),require("@ant-design/icons/lib/outline/StrikethroughOutline"),require("@ant-design/icons/lib/outline/UnderlineOutline"),require("@ant-design/icons/lib/outline/UnorderedListOutline"),require("@ant-design/icons/lib/outline/OrderedListOutline"),require("@ant-design/icons/lib/outline/UndoOutline"),require("@ant-design/icons/lib/outline/FontColorsOutline"),require("@ant-design/icons/lib/outline/FontSizeOutline"),require("@ant-design/icons/lib/outline/AlignLeftOutline"),require("@ant-design/icons/lib/outline/AlignCenterOutline"),require("@ant-design/icons/lib/outline/AlignRightOutline"),require("@ant-design/icons/lib/outline/AudioOutline"),require("@ant-design/icons/lib/outline/BgColorsOutline"),require("@ant-design/icons/lib/outline/UserOutline"),require("@ant-design/icons/lib/outline/MenuFoldOutline"),require("@ant-design/icons/lib/outline/MenuUnfoldOutline"),require("@ant-design/icons/lib/outline/UploadOutline"),require("@ant-design/icons/lib/outline/BookOutline"),require("@ant-design/icons/lib/outline/LockOutline"),require("@ant-design/icons/lib/outline/UnlockOutline"),require("@ant-design/icons/lib/outline/PhoneOutline"),require("@ant-design/icons/lib/outline/QuestionOutline"),require("@ant-design/icons/lib/outline/SettingOutline"),require("@ant-design/icons/lib/outline/HeartOutline"),require("@ant-design/icons/lib/outline/CaretLeftOutline"),require("@ant-design/icons/lib/outline/CaretRightOutline"),require("@ant-design/icons/lib/outline/BellOutline"),require("@ant-design/icons/lib/outline/BarChartOutline"),require("@ant-design/icons/lib/outline/RedEnvelopeOutline"),require("@ant-design/icons/lib/outline/CreditCardOutline"),require("@ant-design/icons/lib/outline/ToolOutline"),require("@ant-design/icons/lib/outline/AppstoreOutline"),require("@ant-design/icons/lib/outline/DownloadOutline"),require("@ant-design/icons/lib/outline/SyncOutline"),require("@ant-design/icons/lib/outline/CloseOutline"),require("@ant-design/icons/lib/outline/CheckOutline"),require("@ant-design/icons/lib/outline/LoadingOutline"),require("@ant-design/icons/lib/outline/CheckCircleOutline"),require("@ant-design/icons/lib/outline/InfoCircleOutline"),require("@ant-design/icons/lib/outline/CloseCircleOutline"),require("@ant-design/icons/lib/outline/ExclamationCircleOutline"),require("@ant-design/icons/lib/outline/QuestionCircleOutline"),require("@ant-design/icons/lib/fill/CheckCircleFill"),require("@ant-design/icons/lib/fill/InfoCircleFill"),require("@ant-design/icons/lib/fill/CloseCircleFill"),require("@ant-design/icons/lib/fill/ExclamationCircleFill"),require("@ant-design/icons/lib/outline/UpOutline"),require("@ant-design/icons/lib/outline/DownOutline"),require("@ant-design/icons/lib/outline/LeftOutline"),require("@ant-design/icons/lib/outline/RightOutline"),require("@ant-design/icons/lib/outline/RedoOutline"),require("@ant-design/icons/lib/outline/CalendarOutline"),require("@ant-design/icons/lib/outline/SearchOutline"),require("@ant-design/icons/lib/outline/BarsOutline"),require("@ant-design/icons/lib/fill/StarFill"),require("@ant-design/icons/lib/outline/FilterOutline"),require("@ant-design/icons/lib/fill/CaretUpFill"),require("@ant-design/icons/lib/fill/CaretDownFill"),require("@ant-design/icons/lib/outline/CaretUpOutline"),require("@ant-design/icons/lib/outline/CaretDownOutline"),require("@ant-design/icons/lib/outline/MinusOutline"),require("@ant-design/icons/lib/outline/EditOutline"),require("@ant-design/icons/lib/outline/FolderOpenOutline"),require("@ant-design/icons/lib/outline/FolderOutline"),require("@ant-design/icons/lib/outline/PaperClipOutline"),require("@ant-design/icons/lib/outline/PictureOutline"),require("@ant-design/icons/lib/outline/EyeOutline"),require("@ant-design/icons/lib/outline/EyeInvisibleOutline"),require("@ant-design/icons/lib/outline/DeleteOutline"),require("@ant-design/icons/lib/outline/ItalicOutline"),require("@ant-design/icons/lib/outline/CodeOutline"),require("@ant-design/icons/lib/outline/FileImageOutline"),require("@ant-design/icons/lib/outline/FullscreenOutline"),require("@ant-design/icons/lib/outline/FullscreenExitOutline"),require("@ant-design/icons/lib/outline/GlobalOutline"),require("@ant-design/icons/lib/outline/FastBackwardOutline"),require("@ant-design/icons/lib/outline/FastForwardOutline"),require("@ant-design/icons/lib/outline/BorderOutline"),require("@ant-design/icons/lib/outline/PauseOutline"),require("@ant-design/icons/lib/outline/BulbOutline");const t=3,l=e.useStorage("FIREWORK",{perDay:0,dateRange:[],expired:!0});var o={name:"YqgFirework",props:{getConfig:{type:Function,required:!0},serializer:{type:[Array,String,Boolean],default:()=>["data","body","data"]},options:{type:Object,default:()=>({})},zIndex:{type:Number,default:1e3},intervalPerLaunch:{type:Number,default:1e3},countPerLaunch:{type:Number,default:12},launchCount:{type:Number,default:2},disabledInFrame:{type:Boolean,default:!0}},data(){const{zIndex:e}=this;return{firework:null,canFire:!1,style:{width:0,height:0,position:"fixed",top:0,left:0,zIndex:e}}},async mounted(){if(this.disabledInFrame&&self!==top)return;const{Fireworks:i}=await import("fireworks-js");await this.setStore();if(!this.checkCanFire())return;this.$nextTick(()=>{const n=new i(this.$refs.container,this.options);this.firework=n,this.updateCanvasSize(),this.launch(()=>{this.style.zIndex=-1,this.style.display="none",l.value.perDay=(e.get(l)?.perDay??0)-1})});const n=e.useEventListener(window,"resize",this.updateCanvasSize);this.$once("hook:beforeDestroy",()=>{n(),this.firework?.clear?.(),this.firework=null})},methods:{async setStore(){if("function"!=typeof this.getConfig)return;const r=await this.getConfig(),{DateRange:o="",Perday:u=t,IsOn:s=!1}=this.serializer?n.get(r,this.serializer,Object.create(null)):r;if(!s)return void e.set(l,null);const d=o?.split(",")?.slice(0,2)?.map((e,n)=>i(e)?.[n?"endOf":"startOf"]?.("day"))?.filter(e=>e?.isValid?.())??[],{perDay:a,expired:c}=e.get(l)??{},q=!0===c||i().isAfter(c)?Number(u)||t:a;e.set(l,{perDay:q,dateRange:d,expired:i().endOf("day")})},checkCanFire(){const{perDay:n,dateRange:r}=e.get(l)??{},t=i();return 2===r?.length&&t.isAfter(r?.[0])&&t.isBefore(r?.[1])&&!Number.isNaN(n)&&n>0},updateCanvasSize(){if(!this.firework)return;const{width:i,height:n}=e.useWindowSize();this.firework.updateSize?.({width:e.get(i),height:e.get(n)})},async launch(i){for(let i=0;i<this.launchCount;i++)await e.promiseTimeout(this.intervalPerLaunch),this.firework?.launch?.(this.countPerLaunch);await e.promiseTimeout(2e3),i?.()}},render(){return(0,arguments[0])("div",{class:"firework-container",style:this.style,ref:"container"})}};const u=o,s=r.normalizeComponent({},undefined,u,undefined,undefined,undefined,!1,void 0,void 0,void 0);exports.default=s;
2
+ //# sourceMappingURL=index-1632f3d7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-1632f3d7.js","sources":["../src/component/yqg-firework/index.vue"],"sourcesContent":["<!-- @author youboli -->\n<!-- @email youboli@yangqianguan.com -->\n<!-- @date 2023-01-12 13:34:38.000 -->\n<!-- @desc generated by yqg-cli@5.9.3 -->\n\n<script>\n\n import {\n useStorage,\n useWindowSize,\n useEventListener,\n promiseTimeout,\n get,\n set\n } from '@vueuse/core';\n import moment from 'moment';\n import _ from 'underscore';\n\n const DefaultPerday = 3;\n const StorageKey = 'FIREWORK';\n const store = useStorage(StorageKey, {perDay: 0, dateRange: [], expired: true});\n\n export default {\n name: 'YqgFirework',\n\n props: {\n getConfig: {\n type: Function,\n required: true\n },\n\n serializer: {\n type: [Array, String, Boolean],\n default: () => ['data', 'body', 'data']\n },\n\n options: {\n type: Object,\n default: () => ({})\n },\n\n zIndex: {\n type: Number,\n default: 1000\n },\n\n intervalPerLaunch: {\n type: Number,\n default: 1000\n },\n\n countPerLaunch: {\n type: Number,\n default: 12\n },\n\n launchCount: {\n type: Number,\n default: 2\n },\n\n disabledInFrame: {\n type: Boolean,\n default: true\n }\n },\n\n data() {\n const {zIndex} = this;\n\n return {\n firework: null,\n canFire: false,\n style: {\n width: 0,\n height: 0,\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex\n }\n };\n },\n\n async mounted() {\n if (this.disabledInFrame && self !== top) return;\n\n const {Fireworks} = await import('fireworks-js');\n\n await this.setStore();\n\n const canFire = this.checkCanFire();\n\n if (!canFire) return;\n\n this.$nextTick(() => {\n const firework = new Fireworks(this.$refs.container, this.options);\n\n this.firework = firework;\n\n this.updateCanvasSize();\n\n this.launch(() => {\n this.style.zIndex = -1;\n this.style.display = 'none';\n store.value.perDay = (get(store)?.perDay ?? 0) - 1;\n });\n });\n\n const cleanWindowResize = useEventListener(window, 'resize', this.updateCanvasSize);\n\n this.$once('hook:beforeDestroy', () => {\n cleanWindowResize();\n this.firework?.clear?.();\n this.firework = null;\n });\n },\n\n methods: {\n async setStore() {\n if (typeof this.getConfig !== 'function') return;\n\n const config = await this.getConfig();\n const {\n DateRange = '',\n Perday = DefaultPerday,\n IsOn = false\n } = this.serializer ? _.get(config, this.serializer, Object.create(null)) : config;\n\n if (!IsOn) {\n set(store, null);\n\n return;\n }\n\n const dateRange = DateRange\n ?.split(',')\n ?.slice(0, 2)\n ?.map((date, index) => moment(date)?.[index ? 'endOf' : 'startOf']?.('day'))\n ?.filter(date => date?.isValid?.())\n ?? [];\n\n const {perDay: cachePerday, expired: cacheExpired} = get(store) ?? {};\n const isExpired = cacheExpired === true || moment().isAfter(cacheExpired);\n const perDay = isExpired\n ? Number(Perday) || DefaultPerday\n : cachePerday;\n\n set(store, {\n perDay,\n dateRange,\n expired: moment().endOf('day')\n });\n },\n\n checkCanFire() {\n const {perDay, dateRange} = get(store) ?? {};\n const now = moment();\n\n const canFire = dateRange?.length === 2\n && now.isAfter(dateRange?.[0])\n && now.isBefore(dateRange?.[1])\n && !Number.isNaN(perDay)\n && perDay > 0;\n\n return canFire;\n },\n\n updateCanvasSize() {\n if (!this.firework) return;\n\n const {width, height} = useWindowSize();\n this.firework.updateSize?.({width: get(width), height: get(height)});\n },\n\n async launch(afterLaunchCb) {\n for (let index = 0; index < this.launchCount; index++) {\n await promiseTimeout(this.intervalPerLaunch);\n\n this.firework?.launch?.(this.countPerLaunch);\n }\n\n await promiseTimeout(2000);\n\n afterLaunchCb?.();\n }\n },\n\n render() {\n return (\n <div class=\"firework-container\" style={this.style} ref=\"container\" />\n );\n }\n };\n\n</script>\n"],"names":["DefaultPerday","store","useStorage","perDay","dateRange","expired","script","name","props","getConfig","type","Function","required","serializer","Array","String","Boolean","default","options","Object","zIndex","Number","intervalPerLaunch","countPerLaunch","launchCount","disabledInFrame","data","this","firework","canFire","style","width","height","position","top","left","mounted","self","Fireworks","import","setStore","checkCanFire","$nextTick","$refs","container","updateCanvasSize","launch","display","value","get","cleanWindowResize","useEventListener","window","$once","clear","methods","config","DateRange","Perday","IsOn","_","create","set","split","slice","map","date","index","moment","filter","isValid","cachePerday","cacheExpired","isAfter","endOf","now","length","isBefore","isNaN","useWindowSize","updateSize","afterLaunchCb","promiseTimeout","render","h","arguments","class","ref","__vue_script__"],"mappings":"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"}