@solar-angular/core 18.0.7 → 18.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/esm2022/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './config';
2
+ export * from './operator';
2
3
  export * from './pipes';
3
4
  export * from './provider';
4
5
  export * from './utils';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm92aWRlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbiJdfQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vb3BlcmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3Byb3ZpZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMnO1xuIl19
@@ -0,0 +1,14 @@
1
+ import { finalize } from 'rxjs';
2
+ /**
3
+ * Attaches a loading indicator to an observable.
4
+ *
5
+ * @param loading - A writable signal indicating the loading state.
6
+ * @returns A function that takes an observable and returns a new observable with loading state managed.
7
+ */
8
+ export function attachLoading(loading) {
9
+ return (observable) => {
10
+ loading.set(true);
11
+ return observable.pipe(finalize(() => loading.set(false)));
12
+ };
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9vcGVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTVDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBSSxPQUFnQztJQUMvRCxPQUFPLENBQUMsVUFBeUIsRUFBRSxFQUFFO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUNwQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNuQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEF0dGFjaGVzIGEgbG9hZGluZyBpbmRpY2F0b3IgdG8gYW4gb2JzZXJ2YWJsZS5cbiAqXG4gKiBAcGFyYW0gbG9hZGluZyAtIEEgd3JpdGFibGUgc2lnbmFsIGluZGljYXRpbmcgdGhlIGxvYWRpbmcgc3RhdGUuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gb2JzZXJ2YWJsZSBhbmQgcmV0dXJucyBhIG5ldyBvYnNlcnZhYmxlIHdpdGggbG9hZGluZyBzdGF0ZSBtYW5hZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoTG9hZGluZzxUPihsb2FkaW5nOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPikge1xuICByZXR1cm4gKG9ic2VydmFibGU6IE9ic2VydmFibGU8VD4pID0+IHtcbiAgICBsb2FkaW5nLnNldCh0cnVlKVxuICAgIHJldHVybiBvYnNlcnZhYmxlLnBpcGUoXG4gICAgICBmaW5hbGl6ZSgoKSA9PiBsb2FkaW5nLnNldChmYWxzZSkpXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==
@@ -1,8 +1,22 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, Pipe } from '@angular/core';
3
+ import { finalize } from 'rxjs';
3
4
 
4
5
  const SOLAR_CONFIG = new InjectionToken('');
5
6
 
7
+ /**
8
+ * Attaches a loading indicator to an observable.
9
+ *
10
+ * @param loading - A writable signal indicating the loading state.
11
+ * @returns A function that takes an observable and returns a new observable with loading state managed.
12
+ */
13
+ function attachLoading(loading) {
14
+ return (observable) => {
15
+ loading.set(true);
16
+ return observable.pipe(finalize(() => loading.set(false)));
17
+ };
18
+ }
19
+
6
20
  class CnumberPipe {
7
21
  transform(v) {
8
22
  if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(v)) {
@@ -133,5 +147,5 @@ function levels2tree(levels, pid) {
133
147
  * Generated bundle index. Do not edit.
134
148
  */
135
149
 
136
- export { CnumberPipe, FindByIdPipe, SOLAR_CONFIG, levels2tree, list2tree, provideSolar, tree2list };
150
+ export { CnumberPipe, FindByIdPipe, SOLAR_CONFIG, attachLoading, levels2tree, list2tree, provideSolar, tree2list };
137
151
  //# sourceMappingURL=solar-angular-core.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"solar-angular-core.mjs","sources":["../../../packages/core/src/config.ts","../../../packages/core/src/pipes/cnumber.pipe.ts","../../../packages/core/src/pipes/find-by-id.pipe.ts","../../../packages/core/src/provider.ts","../../../packages/core/src/utils/tree.utils.ts","../../../packages/core/src/solar-angular-core.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface SolarConfig {\n clientId: string;\n earthUrl: string;\n mercuryUrl: string;\n}\n\nexport const SOLAR_CONFIG = new InjectionToken<SolarConfig>('');\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'cnumber',\n standalone: true\n})\nexport class CnumberPipe implements PipeTransform {\n\n transform(v: string): any {\n if (!/^(0|[1-9]\\d*)(\\.\\d+)?$/.test(v)) {\n return null;\n }\n let unit = '千百拾亿千百拾万千百拾元角分';\n let str = '';\n v += '00';\n const p = v.indexOf('.');\n if (p >= 0) {\n v = v.substring(0, p) + v.substr(p + 1, 2);\n }\n unit = unit.substr(unit.length - v.length);\n for (let i = 0; i < v.length; i++) {\n str += '零壹贰叁肆伍陆柒捌玖'.charAt(+v.charAt(i)) + unit.charAt(i);\n }\n return str.replace(/零(千|百|拾|角)/g, '零').replace(/(零)+/g, '零').replace(/零(万|亿|元)/g, '$1').replace(/(亿)万|壹(拾)/g, '$1$2').replace(/^元零?|零分/g, '').replace(/元$/g, '元整');\n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'findById',\n standalone: true\n})\nexport class FindByIdPipe<T extends { id: any }> implements PipeTransform {\n\n transform(id: T['id'], array: T[]): unknown {\n return array.find(item => item.id === id) ?? null;\n }\n\n}\n","import { SOLAR_CONFIG, SolarConfig } from './config';\n\nexport function provideSolar(config: SolarConfig) {\n return [\n {\n provide: SOLAR_CONFIG,\n useValue: config\n }\n ];\n}\n","export interface TreeNode {\n id: number | string;\n parent?: TreeNode;\n children?: TreeNode[];\n isLeaf?: boolean;\n [key: string]: any;\n}\n\nexport function list2tree(list: TreeNode[], pid: string) {\n const map = new Map<TreeNode['id'], TreeNode>();\n const tree: TreeNode[] = [];\n\n list = list.map(o => Object.assign({}, o));\n\n // 建立索引\n for (const node of list) {\n map.set(node.id, node);\n }\n\n for (const node of list) {\n const parent = map.get(node[pid]);\n if (parent) {\n node.parent = parent;\n parent.children ??= [];\n parent.children.push(node);\n } else {\n tree.push(node);\n }\n }\n\n for (const node of list) {\n node.isLeaf = !node.children?.length;\n }\n\n return tree;\n}\n\nexport function tree2list<T extends TreeNode>(tree: T[]): T[] {\n const list = [], stack = tree.slice(0);\n\n while (stack.length) {\n const node = stack.pop()!;\n const children = node.children;\n\n if (children?.length) {\n stack.push(...children as T[]);\n }\n\n list.push(node);\n }\n\n return list;\n}\n\n/**\n * 将一个二维数组转为一棵树,二维数组里的每一个子数组对应着树的每一层级\n * @example\n * ```ts\n * levels2tree([channels, categories], 'channel')\n * ```\n * @param levels\n * @param pid\n */\nexport function levels2tree(levels: TreeNode[][], pid: string) {\n const maps: Map<TreeNode['id'], TreeNode>[] = levels.map(() => new Map());\n\n levels = levels.map(list => list.map(o => Object.assign({}, o)));\n\n // 建立索引\n for (let index = 0; index < levels.length; index++) {\n for (const node of levels[index]) {\n maps[index].set(node.id, node);\n }\n }\n\n // 倒序遍历,向前寻找 parent\n for (let index = levels.length - 1; index > 0; index--) {\n for (const node of levels[index]) {\n const parent = maps[index - 1].get(node[pid]);\n if (parent) {\n node.parent = parent;\n parent.children ??= [];\n parent.children.push(node);\n }\n }\n }\n\n // 最后一层,一定是叶子节点\n // TODO:如果枝条之间的层级数不一致,这里就不能这样写,应该遍历每一级的 list,通过判断有无 children 来设置 isLeaf\n for (const node of levels.at(-1)!) {\n node.isLeaf = !node.children?.length;\n }\n\n return levels[0];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solar-angular-core.mjs","sources":["../../../packages/core/src/config.ts","../../../packages/core/src/operator.ts","../../../packages/core/src/pipes/cnumber.pipe.ts","../../../packages/core/src/pipes/find-by-id.pipe.ts","../../../packages/core/src/provider.ts","../../../packages/core/src/utils/tree.utils.ts","../../../packages/core/src/solar-angular-core.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface SolarConfig {\n clientId: string;\n earthUrl: string;\n mercuryUrl: string;\n}\n\nexport const SOLAR_CONFIG = new InjectionToken<SolarConfig>('');\n","import { WritableSignal } from '@angular/core';\nimport { Observable, finalize } from 'rxjs';\n\n/**\n * Attaches a loading indicator to an observable.\n *\n * @param loading - A writable signal indicating the loading state.\n * @returns A function that takes an observable and returns a new observable with loading state managed.\n */\nexport function attachLoading<T>(loading: WritableSignal<boolean>) {\n return (observable: Observable<T>) => {\n loading.set(true)\n return observable.pipe(\n finalize(() => loading.set(false))\n );\n };\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'cnumber',\n standalone: true\n})\nexport class CnumberPipe implements PipeTransform {\n\n transform(v: string): any {\n if (!/^(0|[1-9]\\d*)(\\.\\d+)?$/.test(v)) {\n return null;\n }\n let unit = '千百拾亿千百拾万千百拾元角分';\n let str = '';\n v += '00';\n const p = v.indexOf('.');\n if (p >= 0) {\n v = v.substring(0, p) + v.substr(p + 1, 2);\n }\n unit = unit.substr(unit.length - v.length);\n for (let i = 0; i < v.length; i++) {\n str += '零壹贰叁肆伍陆柒捌玖'.charAt(+v.charAt(i)) + unit.charAt(i);\n }\n return str.replace(/零(千|百|拾|角)/g, '零').replace(/(零)+/g, '零').replace(/零(万|亿|元)/g, '$1').replace(/(亿)万|壹(拾)/g, '$1$2').replace(/^元零?|零分/g, '').replace(/元$/g, '元整');\n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'findById',\n standalone: true\n})\nexport class FindByIdPipe<T extends { id: any }> implements PipeTransform {\n\n transform(id: T['id'], array: T[]): unknown {\n return array.find(item => item.id === id) ?? null;\n }\n\n}\n","import { SOLAR_CONFIG, SolarConfig } from './config';\n\nexport function provideSolar(config: SolarConfig) {\n return [\n {\n provide: SOLAR_CONFIG,\n useValue: config\n }\n ];\n}\n","export interface TreeNode {\n id: number | string;\n parent?: TreeNode;\n children?: TreeNode[];\n isLeaf?: boolean;\n [key: string]: any;\n}\n\nexport function list2tree(list: TreeNode[], pid: string) {\n const map = new Map<TreeNode['id'], TreeNode>();\n const tree: TreeNode[] = [];\n\n list = list.map(o => Object.assign({}, o));\n\n // 建立索引\n for (const node of list) {\n map.set(node.id, node);\n }\n\n for (const node of list) {\n const parent = map.get(node[pid]);\n if (parent) {\n node.parent = parent;\n parent.children ??= [];\n parent.children.push(node);\n } else {\n tree.push(node);\n }\n }\n\n for (const node of list) {\n node.isLeaf = !node.children?.length;\n }\n\n return tree;\n}\n\nexport function tree2list<T extends TreeNode>(tree: T[]): T[] {\n const list = [], stack = tree.slice(0);\n\n while (stack.length) {\n const node = stack.pop()!;\n const children = node.children;\n\n if (children?.length) {\n stack.push(...children as T[]);\n }\n\n list.push(node);\n }\n\n return list;\n}\n\n/**\n * 将一个二维数组转为一棵树,二维数组里的每一个子数组对应着树的每一层级\n * @example\n * ```ts\n * levels2tree([channels, categories], 'channel')\n * ```\n * @param levels\n * @param pid\n */\nexport function levels2tree(levels: TreeNode[][], pid: string) {\n const maps: Map<TreeNode['id'], TreeNode>[] = levels.map(() => new Map());\n\n levels = levels.map(list => list.map(o => Object.assign({}, o)));\n\n // 建立索引\n for (let index = 0; index < levels.length; index++) {\n for (const node of levels[index]) {\n maps[index].set(node.id, node);\n }\n }\n\n // 倒序遍历,向前寻找 parent\n for (let index = levels.length - 1; index > 0; index--) {\n for (const node of levels[index]) {\n const parent = maps[index - 1].get(node[pid]);\n if (parent) {\n node.parent = parent;\n parent.children ??= [];\n parent.children.push(node);\n }\n }\n }\n\n // 最后一层,一定是叶子节点\n // TODO:如果枝条之间的层级数不一致,这里就不能这样写,应该遍历每一级的 list,通过判断有无 children 来设置 isLeaf\n for (const node of levels.at(-1)!) {\n node.isLeaf = !node.children?.length;\n }\n\n return levels[0];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAQa,YAAY,GAAG,IAAI,cAAc,CAAc,EAAE;;ACL9D;;;;;AAKG;AACG,SAAU,aAAa,CAAI,OAAgC,EAAA;IAC/D,OAAO,CAAC,UAAyB,KAAI;AACnC,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACjB,QAAA,OAAO,UAAU,CAAC,IAAI,CACpB,QAAQ,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CACnC,CAAC;AACJ,KAAC,CAAC;AACJ;;MCVa,WAAW,CAAA;AAEtB,IAAA,SAAS,CAAC,CAAS,EAAA;QACjB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;AACrC,YAAA,OAAO,IAAI,CAAC;SACb;QACD,IAAI,IAAI,GAAG,gBAAgB,CAAC;QAC5B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,CAAC,IAAI,IAAI,CAAC;QACV,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE;YACV,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;SAC5C;AACD,QAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjC,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC3D;AACD,QAAA,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;KACpK;+GAlBU,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;6GAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA;;4FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBAJvB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;MCCY,YAAY,CAAA;IAEvB,SAAS,CAAC,EAAW,EAAE,KAAU,EAAA;AAC/B,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;KACnD;+GAJU,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;6GAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA,EAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAJxB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;ACHK,SAAU,YAAY,CAAC,MAAmB,EAAA;IAC9C,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,QAAQ,EAAE,MAAM;AACjB,SAAA;KACF,CAAC;AACJ;;ACDgB,SAAA,SAAS,CAAC,IAAgB,EAAE,GAAW,EAAA;AACrD,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,MAAM,IAAI,GAAe,EAAE,CAAC;AAE5B,IAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;;AAG3C,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;QACvB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;KACxB;AAED,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,YAAA,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC;AACvB,YAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5B;aAAM;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACjB;KACF;AAED,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;QACvB,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;KACtC;AAED,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAEK,SAAU,SAAS,CAAqB,IAAS,EAAA;AACrD,IAAA,MAAM,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEvC,IAAA,OAAO,KAAK,CAAC,MAAM,EAAE;AACnB,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;AAC1B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AAE/B,QAAA,IAAI,QAAQ,EAAE,MAAM,EAAE;AACpB,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,QAAe,CAAC,CAAC;SAChC;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACjB;AAED,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;AAQG;AACa,SAAA,WAAW,CAAC,MAAoB,EAAE,GAAW,EAAA;AAC3D,IAAA,MAAM,IAAI,GAAoC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IAE1E,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGjE,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAClD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SAChC;KACF;;AAGD,IAAA,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE;QACtD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;AAChC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,gBAAA,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC;AACvB,gBAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC5B;SACF;KACF;;;IAID,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE;QACjC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;KACtC;AAED,IAAA,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB;;AC9FA;;AAEG;;;;"}
package/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './config';
2
+ export * from './operator';
2
3
  export * from './pipes';
3
4
  export * from './provider';
4
5
  export * from './utils';
package/operator.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { WritableSignal } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ /**
4
+ * Attaches a loading indicator to an observable.
5
+ *
6
+ * @param loading - A writable signal indicating the loading state.
7
+ * @returns A function that takes an observable and returns a new observable with loading state managed.
8
+ */
9
+ export declare function attachLoading<T>(loading: WritableSignal<boolean>): (observable: Observable<T>) => Observable<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solar-angular/core",
3
- "version": "18.0.7",
3
+ "version": "18.1.0",
4
4
  "sideEffects": false,
5
5
  "publishConfig": {
6
6
  "access": "public"