@acorex/core 20.9.0 → 20.9.1

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/file/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as i1 from '@acorex/core/format';
2
2
  import { AXFormatOptions, AXFormatter } from '@acorex/core/format';
3
3
  import * as i0 from '@angular/core';
4
- import { Injector, InjectionToken, Type, Provider, ModuleWithProviders } from '@angular/core';
4
+ import { Injector, Type, InputSignal, Signal, Provider, InjectionToken, ModuleWithProviders } from '@angular/core';
5
5
  import * as i2 from '@acorex/core/validation';
6
6
  import { AXValidationRuleOptions, AXValidationRuleResult, AXValidationService, AXValidationRule } from '@acorex/core/validation';
7
7
 
@@ -61,6 +61,31 @@ type AXFileOpenResult = void | boolean | null | undefined;
61
61
  /** Runs `open` from extension first, then parent type, in the caller's injection context. */
62
62
  declare function runFileTypeOpen(type: AXFileType, ctx: AXFileTypeOpenContext, payload: unknown, extension?: AXFileTypeExtension): Promise<AXFileOpenResult> | AXFileOpenResult;
63
63
 
64
+ /**
65
+ * View component for a file type — either an Angular component class or a lazy loader.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * // eager
70
+ * component: ImageViewerComponent,
71
+ *
72
+ * // lazy
73
+ * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),
74
+ * ```
75
+ */
76
+ type AXFileTypeComponent = Type<AXFileTypeViewComponent> | (() => Promise<Type<AXFileTypeViewComponent>>);
77
+ /**
78
+ * Recommended contract for file-type view components.
79
+ * Implement `readonly payload = input.required<TPayload>()` in new components.
80
+ */
81
+ interface AXFileTypeViewComponent<TPayload = unknown> {
82
+ readonly payload: InputSignal<TPayload> | Signal<TPayload>;
83
+ }
84
+ /** Resolves a {@link AXFileTypeComponent} to an Angular component type. */
85
+ declare function resolveFileTypeComponentType(component: AXFileTypeComponent): Promise<Type<unknown>>;
86
+ /** Whether `value` is a lazy loader rather than an Angular component class. */
87
+ declare function isLazyFileTypeComponentLoader(value: AXFileTypeComponent): value is () => Promise<Type<AXFileTypeViewComponent>>;
88
+
64
89
  /** Metadata key for catalog usage context. */
65
90
  declare const AX_FILE_TYPE_METADATA_PURPOSE: "purpose";
66
91
  /** Catalog metadata bag; `purpose` lists usage contexts (e.g. `['system']`). */
@@ -86,14 +111,14 @@ interface AXFileValidations {
86
111
  maxSize?: number;
87
112
  rules?: AXFileValidationRule[];
88
113
  }
89
- type AXFileTypeUtilities = Record<string, (ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown>;
114
+ type AXFileTypeUtilities$1 = Record<string, (ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown>;
90
115
  /**
91
116
  * Logical file category (image, video, …).
92
117
  *
93
118
  * - With type `validations` set: any file matching those rules is allowed; `extensions` only override when matched.
94
119
  * - With empty / omitted `validations` and `extensions` listed: only those extensions are allowed.
95
120
  */
96
- interface AXFileType<T extends AXFileTypeUtilities = AXFileTypeUtilities> {
121
+ interface AXFileType<T extends AXFileTypeUtilities$1 = AXFileTypeUtilities$1> {
97
122
  name: string;
98
123
  title?: string;
99
124
  icon?: string;
@@ -113,9 +138,11 @@ interface AXFileType<T extends AXFileTypeUtilities = AXFileTypeUtilities> {
113
138
  * Invoke via {@link runFileTypeOpen} so `inject()` works in the caller's context.
114
139
  */
115
140
  open?: (ctx: AXFileTypeOpenContext, payload: unknown) => Promise<AXFileOpenResult> | AXFileOpenResult;
141
+ /** Optional view component (eager class or lazy `() => import(...)`) for this file type's payload. */
142
+ component?: AXFileTypeComponent;
116
143
  }
117
144
  /** Extension entry — {@link AXFileType} without nested `extensions`. */
118
- type AXFileTypeExtension<T extends AXFileTypeUtilities = AXFileTypeUtilities> = Omit<AXFileType<T>, 'extensions'>;
145
+ type AXFileTypeExtension<T extends AXFileTypeUtilities$1 = AXFileTypeUtilities$1> = Omit<AXFileType<T>, 'extensions'>;
119
146
 
120
147
  declare function getFileTypePurposes(type: AXFileType): string[];
121
148
  declare function fileTypeMatchesPurpose(type: AXFileType, purpose: string | string[]): boolean;
@@ -140,6 +167,9 @@ declare function findFileTypeExtension(file: File, type: AXFileType): AXFileType
140
167
  declare function resolveFileTypeExtension(type: AXFileType, hint?: AXFileTypeExtensionHint): AXFileTypeExtension | undefined;
141
168
  declare function resolveFileTypeCopy(type: AXFileType, extension?: AXFileTypeExtension): AXFileType['copy'] | undefined;
142
169
  declare function resolveFileTypeOpen(type: AXFileType, extension?: AXFileTypeExtension): AXFileType['open'] | undefined;
170
+ declare function resolveFileTypeComponent(type: AXFileType, extension?: AXFileTypeExtension): AXFileType['component'] | undefined;
171
+ /** Loads the resolved view component (extension override first). */
172
+ declare function loadFileTypeComponent(type: AXFileType, extension?: AXFileTypeExtension): Promise<Type<unknown> | undefined>;
143
173
  declare function resolveFileTypePaste(type: AXFileType, extension?: AXFileTypeExtension): AXFileType['paste'] | undefined;
144
174
  declare function resolveFileTypeUtility(type: AXFileType, extension: AXFileTypeExtension | undefined, name: string): ((ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown) | undefined;
145
175
  /** Runs `copy` from extension first, then parent type. */
@@ -149,6 +179,68 @@ declare function runFileTypeUtility(type: AXFileType, ctx: AXFileTypeContext, ex
149
179
  /** Runs a catalog utility with optional file-based extension resolution. */
150
180
  declare function runFileTypeUtilityForFile(type: AXFileType, ctx: AXFileTypeContext, file: File | undefined, name: string, ...args: unknown[]): Promise<unknown> | unknown;
151
181
 
182
+ type AXFileTypeUtilities = Record<string, (ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown>;
183
+ /** Config for {@link defineFileType}. */
184
+ interface DefineFileTypeConfig<TPayload = unknown, TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities> {
185
+ name: string;
186
+ title?: string;
187
+ icon?: string;
188
+ metadata?: AXFileTypeMetadata;
189
+ validations?: AXFileValidations;
190
+ extensions?: AXFileTypeExtension<TUtilities>[];
191
+ utilities?: TUtilities;
192
+ paste?: AXFileType<TUtilities>['paste'];
193
+ copy?: (payload: TPayload) => Promise<AXFileCopyResult> | AXFileCopyResult;
194
+ open?: (ctx: AXFileTypeOpenContext, payload: TPayload) => Promise<AXFileOpenResult> | AXFileOpenResult;
195
+ /** Eager component class or lazy `() => import(...).then(m => m.Component)`. */
196
+ component?: AXFileTypeComponent;
197
+ }
198
+ /**
199
+
200
+ * Builds an {@link AXFileType} with optional typed handlers and view component.
201
+
202
+ *
203
+
204
+ * @example
205
+
206
+ * ```ts
207
+
208
+ * export const imageFileType = defineFileType<ImagePayload>({
209
+
210
+ * name: 'image',
211
+
212
+ * copy: (p) => p.caption ?? p.url,
213
+
214
+ * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),
215
+
216
+ * });
217
+
218
+ * ```
219
+
220
+ */
221
+ declare function defineFileType<TPayload = unknown, TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities>(config: DefineFileTypeConfig<TPayload, TUtilities>): AXFileType<TUtilities>;
222
+
223
+ /** Registers static file types via the existing {@link AXFileTypeInfoProvider} multi-token. */
224
+ declare function provideFileTypes(types: AXFileType[] | (() => AXFileType[] | Promise<AXFileType[]>)): Provider;
225
+
226
+ declare class AXFileTypeRendererOutletComponent {
227
+ private readonly registry;
228
+ /** Catalog name (e.g. `image`, `conversation-image`). */
229
+ readonly fileType: i0.InputSignal<string>;
230
+ /** Payload passed to the file-type view component. */
231
+ readonly payload: i0.InputSignal<unknown>;
232
+ /** Optional extension / MIME hint for extension-level renderer overrides. */
233
+ readonly extensionHint: i0.InputSignal<AXFileTypeExtensionHint>;
234
+ /** Extra inputs merged with `payload` (e.g. `message` in conversation). */
235
+ readonly inputs: i0.InputSignal<Record<string, unknown>>;
236
+ readonly resolvedComponent: i0.WritableSignal<Type<unknown>>;
237
+ readonly loading: i0.WritableSignal<boolean>;
238
+ readonly mergedInputs: i0.WritableSignal<Record<string, unknown>>;
239
+ constructor();
240
+ static ɵfac: i0.ɵɵFactoryDeclaration<AXFileTypeRendererOutletComponent, never>;
241
+ static ɵcmp: i0.ɵɵComponentDeclaration<AXFileTypeRendererOutletComponent, "ax-file-type-renderer", never, { "fileType": { "alias": "fileType"; "required": true; "isSignal": true; }; "payload": { "alias": "payload"; "required": true; "isSignal": true; }; "extensionHint": { "alias": "extensionHint"; "required": false; "isSignal": true; }; "inputs": { "alias": "inputs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
242
+ }
243
+
152
244
  /** Contributes {@link AXFileType} entries (multi provider). */
153
245
  declare abstract class AXFileTypeInfoProvider {
154
246
  abstract items(): Promise<AXFileType[]>;
@@ -167,6 +259,10 @@ declare class AXFileTypeRegistryService {
167
259
  private resolveTypes;
168
260
  getTypes(query?: AXFileTypeQuery): Promise<AXFileType[]>;
169
261
  get(name: string): Promise<AXFileType | undefined>;
262
+ /** Resolved view component ref for a catalog entry (optional extension hint). */
263
+ getComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<AXFileType['component'] | undefined>;
264
+ /** Loads the view component for a catalog entry. */
265
+ loadComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<Type<unknown> | undefined>;
170
266
  accept(typeNames?: string | string[]): Promise<string>;
171
267
  matchType(file: File): Promise<AXFileType | undefined>;
172
268
  validate(file: File, typeName: string): Promise<AXValidationRuleResult[]>;
@@ -362,5 +458,5 @@ declare class AXFileService {
362
458
  static ɵprov: i0.ɵɵInjectableDeclaration<AXFileService>;
363
459
  }
364
460
 
365
- export { AXAudioFileTypeProvider, AXDocumentFileTypeProvider, AXFileFileTypeProvider, AXFileMaxSizeValidationRule, AXFileMimeTypeValidationRule, AXFileMinSizeValidationRule, AXFileModule, AXFileService, AXFileSizeFormatter, AXFileTypeInfoProvider, AXFileTypeRegistryService, AXImageFileTypeProvider, AXVideoFileTypeProvider, AX_AUDIO_FILE_TYPE, AX_BUILTIN_FILE_TYPE_PROVIDERS, AX_DOCUMENT_FILE_TYPE, AX_FILE_FILE_TYPE, AX_FILE_TYPE_INFO_PROVIDER, AX_FILE_TYPE_METADATA_PURPOSE, AX_FILE_VALIDATION_RULES, AX_IMAGE_FILE_TYPE, AX_VIDEO_FILE_TYPE, createFileTypeMetadata, fileTypeMatchesPurpose, fileValidationsToRules, filterFileTypesByPurpose, findFileTypeExtension, findFileTypeExtensionByName, findFileTypeExtensionForMime, formatFileSizeBytes, getFileExtension, getFileTypePurposes, isEmptyFileValidations, isExtensionsOnlyType, matchesFileMime, mergeFileValidations, provideBuiltinFileTypeProviders, provideDefaultFileTypeProviders, provideFileTypeInfoProvider, provideFileTypeSystem, provideFileValidationRules, resolveFileCopyText, resolveFileTypeCopy, resolveFileTypeExtension, resolveFileTypeOpen, resolveFileTypePaste, resolveFileTypeUtility, resolveFileValidations, runFileTypeCopy, runFileTypeOpen, runFileTypeUtility, runFileTypeUtilityForFile, validateFileAgainstType, validateFileWithValidations };
366
- export type { AXFileChooseOptions, AXFileCopyData, AXFileCopyResult, AXFileMaxSizeValidationRuleOptions, AXFileMimeTypeValidationRuleOptions, AXFileMinSizeValidationRuleOptions, AXFileModuleConfig, AXFileOpenResult, AXFileSizeFormatterOptions, AXFileType, AXFileTypeContext, AXFileTypeExtension, AXFileTypeExtensionHint, AXFileTypeMetadata, AXFileTypeOpenContext, AXFileTypeQuery, AXFileValidationRule, AXFileValidations };
461
+ export { AXAudioFileTypeProvider, AXDocumentFileTypeProvider, AXFileFileTypeProvider, AXFileMaxSizeValidationRule, AXFileMimeTypeValidationRule, AXFileMinSizeValidationRule, AXFileModule, AXFileService, AXFileSizeFormatter, AXFileTypeInfoProvider, AXFileTypeRegistryService, AXFileTypeRendererOutletComponent, AXImageFileTypeProvider, AXVideoFileTypeProvider, AX_AUDIO_FILE_TYPE, AX_BUILTIN_FILE_TYPE_PROVIDERS, AX_DOCUMENT_FILE_TYPE, AX_FILE_FILE_TYPE, AX_FILE_TYPE_INFO_PROVIDER, AX_FILE_TYPE_METADATA_PURPOSE, AX_FILE_VALIDATION_RULES, AX_IMAGE_FILE_TYPE, AX_VIDEO_FILE_TYPE, createFileTypeMetadata, defineFileType, fileTypeMatchesPurpose, fileValidationsToRules, filterFileTypesByPurpose, findFileTypeExtension, findFileTypeExtensionByName, findFileTypeExtensionForMime, formatFileSizeBytes, getFileExtension, getFileTypePurposes, isEmptyFileValidations, isExtensionsOnlyType, isLazyFileTypeComponentLoader, loadFileTypeComponent, matchesFileMime, mergeFileValidations, provideBuiltinFileTypeProviders, provideDefaultFileTypeProviders, provideFileTypeInfoProvider, provideFileTypeSystem, provideFileTypes, provideFileValidationRules, resolveFileCopyText, resolveFileTypeComponent, resolveFileTypeComponentType, resolveFileTypeCopy, resolveFileTypeExtension, resolveFileTypeOpen, resolveFileTypePaste, resolveFileTypeUtility, resolveFileValidations, runFileTypeCopy, runFileTypeOpen, runFileTypeUtility, runFileTypeUtilityForFile, validateFileAgainstType, validateFileWithValidations };
462
+ export type { AXFileChooseOptions, AXFileCopyData, AXFileCopyResult, AXFileMaxSizeValidationRuleOptions, AXFileMimeTypeValidationRuleOptions, AXFileMinSizeValidationRuleOptions, AXFileModuleConfig, AXFileOpenResult, AXFileSizeFormatterOptions, AXFileType, AXFileTypeComponent, AXFileTypeContext, AXFileTypeExtension, AXFileTypeExtensionHint, AXFileTypeMetadata, AXFileTypeOpenContext, AXFileTypeQuery, AXFileTypeViewComponent, AXFileValidationRule, AXFileValidations, DefineFileTypeConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acorex/core",
3
- "version": "20.9.0",
3
+ "version": "20.9.1",
4
4
  "peerDependencies": {
5
5
  "lodash-es": ">=4.17.21",
6
6
  "memoizee": ">=0.4.15",