@yelon/util
Version:
1 lines • 7.62 kB
Source Map (JSON)
{"version":3,"file":"decorator.mjs","sources":["../../../../packages/util/decorator/convert.ts","../../../../packages/util/decorator/zone-outside.ts","../../../../packages/util/decorator/decorator.ts"],"sourcesContent":["import { warn } from '@yelon/util/other';\n\nexport type BooleanInput = boolean | string | undefined | null;\nexport type NumberInput = number | string | undefined | null;\n\nfunction propDecoratorFactory<T, D>(\n name: string,\n fallback: (v: T, defaultValue: D) => D,\n defaultValue: any\n): (target: any, propName: string) => void {\n function propDecorator(target: any, propName: string, originalDescriptor?: TypedPropertyDescriptor<any>): any {\n const privatePropName = `$$__${propName}`;\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (Object.prototype.hasOwnProperty.call(target, privatePropName)) {\n warn(`The prop \"${privatePropName}\" is already exist, it will be overrided by ${name} decorator.`);\n }\n }\n\n Object.defineProperty(target, privatePropName, {\n configurable: true,\n writable: true\n });\n\n return {\n get(): string {\n return originalDescriptor && originalDescriptor.get\n ? originalDescriptor.get.bind(this)()\n : this[privatePropName];\n },\n set(value: T): void {\n if (originalDescriptor && originalDescriptor.set) {\n originalDescriptor.set.bind(this)(fallback(value, defaultValue));\n }\n this[privatePropName] = fallback(value, defaultValue);\n }\n };\n }\n\n return propDecorator;\n}\n\nexport function toBoolean(\n value: unknown,\n defaultValue: boolean | null | undefined = false\n): boolean | null | undefined {\n return value == null ? defaultValue : `${value}` !== 'false';\n}\n\n/**\n * @deprecated Recommended to use the built-in `transform` and `static ngAcceptInputType_` can be removed\n * - Use `@Input({ transform: booleanAttribute })` instead of `@InputBoolean()`\n * - Use `@Input({ transform: (v: unknown) => (v == null ? null : booleanAttribute(v)) })` instead of `@InputBoolean(null)`\n *\n * Input decorator that handle a prop to do get/set automatically with toBoolean\n *\n * ```ts\n * {AT}Input() {AT}InputBoolean() visible: boolean = false;\n * {AT}Input() {AT}InputBoolean(null) visible: boolean = false;\n * ```\n */\nexport function InputBoolean(defaultValue: boolean | null = false): any {\n return propDecoratorFactory('InputBoolean', toBoolean, defaultValue);\n}\n\nexport function toNumber(value: unknown): number;\nexport function toNumber<D>(value: unknown, fallback: D): number | D;\nexport function toNumber(value: unknown, fallbackValue: number = 0): number {\n return !isNaN(parseFloat(value as any)) && !isNaN(Number(value)) ? Number(value) : fallbackValue;\n}\n\n/**\n * @deprecated Recommended to use the built-in `transform` and `static ngAcceptInputType_` can be removed\n * - Use `@Input({ transform: numberAttribute })` instead of `@InputNumber()`\n * - Use `@Input({ transform: (v: unknown) => (v == null ? null : numberAttribute(v)) })` instead of `@InputNumber(null)`\n *\n * Input decorator that handle a prop to do get/set automatically with toNumber\n *\n * ```ts\n * {AT}Input() {AT}InputNumber() visible: number = 1;\n * {AT}Input() {AT}InputNumber(null) visible: number = 2;\n * ```\n */\nexport function InputNumber(defaultValue: number | null = 0): any {\n return propDecoratorFactory('InputNumber', toNumber, defaultValue);\n}\n","import { warn } from '@yelon/util/other';\n\nexport interface ZoneOptions {\n ngZoneName?: string;\n}\n\ntype DecoratorType = (target: unknown, fn: string, descriptor: PropertyDescriptor) => PropertyDescriptor;\n\nfunction makeFn(type: 'runOutsideAngular' | 'run', options?: ZoneOptions): DecoratorType {\n return (_, __, descriptor) => {\n const source = descriptor.value;\n descriptor.value = function (...data: any[]): () => void {\n const that = this as any;\n const ngZone = that[options?.ngZoneName || 'ngZone'];\n if (!ngZone) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n warn(`ZoneOutside: Decorator should have 'ngZone' property with 'NgZone' class.`);\n }\n return source.call(this, ...data);\n }\n let res: any;\n ngZone[type](() => {\n res = source.call(this, ...data);\n });\n return res;\n };\n\n return descriptor;\n };\n}\n\n/**\n * The decoration method runs in `runOutsideAngular`\n *\n * 装饰方法运行在 `runOutsideAngular` 内\n *\n * ```ts\n * class MockClass {\n * readonly ngZone = inject(NgZone);\n *\n * {AT}ZoneOutside()\n * runOutsideAngular(): void {}\n * }\n * ```\n */\nexport function ZoneOutside(options?: ZoneOptions): DecoratorType {\n return makeFn('runOutsideAngular', options);\n}\n\n/**\n * The decoration method runs in `run`\n *\n * 装饰方法运行在 `run` 内\n *\n * ```ts\n * class MockClass {\n * readonly ngZone = inject(NgZone);\n *\n * {AT}ZoneRun()\n * run(): void {}\n * }\n * ```\n */\nexport function ZoneRun(options?: ZoneOptions): DecoratorType {\n return makeFn('run', options);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}