@acorex/core 22.0.0-next.9 → 22.1.0-next.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
@@ -7,6 +7,7 @@ ACoreX is an UI framework based on angular. With over 50+ beautiful fully respon
7
7
  A few links to help you get started:
8
8
 
9
9
  - [ACoreX: Documentation, Guides](https://acorexui.com)
10
+ - [Angular dependencies by package](./docs/angular-dependencies.md)
10
11
  <picture>
11
12
  <source media="(prefers-color-scheme: dark)" srcset="https://acorexui.com/public/acorex-slang-dark.svg">
12
13
  <img alt="Acorex - Design System, UI Framework, App Builder" src="https://acorexui.com/public/acorex-slang-dark.svg" width="100%">
@@ -261,7 +261,7 @@ function runFileTypeUtility(type, ctx, extension, name, ...args) {
261
261
  /** Runs a catalog utility with optional file-based extension resolution. */
262
262
  function runFileTypeUtilityForFile(type, ctx, file, name, ...args) {
263
263
  const extension = file ? findFileTypeExtension(file, type) : undefined;
264
- return runFileTypeUtility(type, ctx, extension, name, ...args);
264
+ return runFileTypeUtility(type, ctx, extension, name, file, ...args);
265
265
  }
266
266
 
267
267
  /** Runs `open` from extension first, then parent type, in the caller's injection context. */
@@ -389,9 +389,110 @@ async function validateFileAgainstType(validation, file, type, extension) {
389
389
  return validateFileWithValidations(validation, file, resolved);
390
390
  }
391
391
 
392
+ class AXFileMaxSizeValidationRule {
393
+ get name() {
394
+ return 'fileMaxSize';
395
+ }
396
+ async validate(value, options) {
397
+ const size = value instanceof File || value instanceof Blob ? value.size : 0;
398
+ const valid = size <= options.maxSize;
399
+ const limitLabel = formatFileSizeBytes(options.maxSize);
400
+ return {
401
+ rule: this.name,
402
+ result: valid,
403
+ message: valid
404
+ ? ''
405
+ : (options.message ??
406
+ `File is too large. Maximum size is ${limitLabel}.`),
407
+ value: size,
408
+ maxSize: options.maxSize,
409
+ };
410
+ }
411
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMaxSizeValidationRule, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
412
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMaxSizeValidationRule }); }
413
+ }
414
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMaxSizeValidationRule, decorators: [{
415
+ type: Injectable
416
+ }] });
417
+
418
+ class AXFileMimeTypeValidationRule {
419
+ get name() {
420
+ return 'fileMimeType';
421
+ }
422
+ async validate(value, options) {
423
+ const mime = (value instanceof File || value instanceof Blob ? value.type : '').trim().toLowerCase();
424
+ const allowed = options.allowed ?? [];
425
+ const valid = allowed.length === 0 ||
426
+ allowed.some((pattern) => this.matchesMime(mime, pattern.trim().toLowerCase()));
427
+ return {
428
+ rule: this.name,
429
+ result: valid,
430
+ message: valid ? '' : (options.message ?? 'File type is not allowed.'),
431
+ value: mime,
432
+ };
433
+ }
434
+ matchesMime(mime, pattern) {
435
+ if (!pattern || pattern === '*/*' || pattern === '*') {
436
+ return true;
437
+ }
438
+ if (pattern.endsWith('/*')) {
439
+ const category = pattern.slice(0, -2);
440
+ return mime.startsWith(`${category}/`) || (mime === '' && category === 'application');
441
+ }
442
+ return mime === pattern;
443
+ }
444
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMimeTypeValidationRule, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
445
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMimeTypeValidationRule }); }
446
+ }
447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMimeTypeValidationRule, decorators: [{
448
+ type: Injectable
449
+ }] });
450
+
451
+ class AXFileMinSizeValidationRule {
452
+ get name() {
453
+ return 'fileMinSize';
454
+ }
455
+ async validate(value, options) {
456
+ const size = value instanceof File || value instanceof Blob ? value.size : 0;
457
+ const valid = size >= options.minSize;
458
+ const limitLabel = formatFileSizeBytes(options.minSize);
459
+ return {
460
+ rule: this.name,
461
+ result: valid,
462
+ message: valid
463
+ ? ''
464
+ : (options.message ?? `File is too small. Minimum size is ${limitLabel}.`),
465
+ value: size,
466
+ minSize: options.minSize,
467
+ };
468
+ }
469
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMinSizeValidationRule, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
470
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMinSizeValidationRule }); }
471
+ }
472
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMinSizeValidationRule, decorators: [{
473
+ type: Injectable
474
+ }] });
475
+
476
+ /** Validation rule classes to register with {@link AXValidationModule}. */
477
+ const AX_FILE_VALIDATION_RULES = [
478
+ AXFileMimeTypeValidationRule,
479
+ AXFileMinSizeValidationRule,
480
+ AXFileMaxSizeValidationRule,
481
+ ];
482
+ let fileValidationRulesRegistered = false;
483
+ /** Idempotent registration for bootstrap providers and first validation call. */
484
+ function ensureFileValidationRules(registry) {
485
+ if (fileValidationRulesRegistered) {
486
+ return;
487
+ }
488
+ registry.register(...AX_FILE_VALIDATION_RULES);
489
+ fileValidationRulesRegistered = true;
490
+ }
491
+
392
492
  class AXFileTypeRegistryService {
393
493
  constructor() {
394
494
  this.validation = inject(AXValidationService);
495
+ this.validationRegistry = inject(AXValidationRegistryService);
395
496
  this.providers = inject(AX_FILE_TYPE_INFO_PROVIDER, { optional: true }) ?? [];
396
497
  this.registeredTypes = [];
397
498
  this.cache = null;
@@ -491,6 +592,7 @@ class AXFileTypeRegistryService {
491
592
  });
492
593
  }
493
594
  async validate(file, typeName) {
595
+ ensureFileValidationRules(this.validationRegistry);
494
596
  const type = await this.get(typeName);
495
597
  if (!type) {
496
598
  return [
@@ -747,110 +849,23 @@ function provideBuiltinFileTypeProviders() {
747
849
  /** @deprecated Use {@link provideBuiltinFileTypeProviders}. */
748
850
  const provideDefaultFileTypeProviders = provideBuiltinFileTypeProviders;
749
851
 
750
- class AXFileMimeTypeValidationRule {
751
- get name() {
752
- return 'fileMimeType';
753
- }
754
- async validate(value, options) {
755
- const mime = (value instanceof File || value instanceof Blob ? value.type : '').trim().toLowerCase();
756
- const allowed = options.allowed ?? [];
757
- const valid = allowed.length === 0 ||
758
- allowed.some((pattern) => this.matchesMime(mime, pattern.trim().toLowerCase()));
759
- return {
760
- rule: this.name,
761
- result: valid,
762
- message: valid ? '' : (options.message ?? 'File type is not allowed.'),
763
- value: mime,
764
- };
765
- }
766
- matchesMime(mime, pattern) {
767
- if (!pattern || pattern === '*/*' || pattern === '*') {
768
- return true;
769
- }
770
- if (pattern.endsWith('/*')) {
771
- const category = pattern.slice(0, -2);
772
- return mime.startsWith(`${category}/`) || (mime === '' && category === 'application');
773
- }
774
- return mime === pattern;
775
- }
776
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMimeTypeValidationRule, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
777
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMimeTypeValidationRule }); }
778
- }
779
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMimeTypeValidationRule, decorators: [{
780
- type: Injectable
781
- }] });
782
-
783
- class AXFileMinSizeValidationRule {
784
- get name() {
785
- return 'fileMinSize';
786
- }
787
- async validate(value, options) {
788
- const size = value instanceof File || value instanceof Blob ? value.size : 0;
789
- const valid = size >= options.minSize;
790
- const limitLabel = formatFileSizeBytes(options.minSize);
791
- return {
792
- rule: this.name,
793
- result: valid,
794
- message: valid
795
- ? ''
796
- : (options.message ?? `File is too small. Minimum size is ${limitLabel}.`),
797
- value: size,
798
- minSize: options.minSize,
799
- };
800
- }
801
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMinSizeValidationRule, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
802
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMinSizeValidationRule }); }
803
- }
804
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMinSizeValidationRule, decorators: [{
805
- type: Injectable
806
- }] });
807
-
808
- class AXFileMaxSizeValidationRule {
809
- get name() {
810
- return 'fileMaxSize';
811
- }
812
- async validate(value, options) {
813
- const size = value instanceof File || value instanceof Blob ? value.size : 0;
814
- const valid = size <= options.maxSize;
815
- const limitLabel = formatFileSizeBytes(options.maxSize);
816
- return {
817
- rule: this.name,
818
- result: valid,
819
- message: valid
820
- ? ''
821
- : (options.message ??
822
- `File is too large. Maximum size is ${limitLabel}.`),
823
- value: size,
824
- maxSize: options.maxSize,
825
- };
826
- }
827
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMaxSizeValidationRule, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
828
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMaxSizeValidationRule }); }
829
- }
830
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXFileMaxSizeValidationRule, decorators: [{
831
- type: Injectable
832
- }] });
833
-
834
- /** Validation rule classes to register with {@link AXValidationModule}. */
835
- const AX_FILE_VALIDATION_RULES = [
836
- AXFileMimeTypeValidationRule,
837
- AXFileMinSizeValidationRule,
838
- AXFileMaxSizeValidationRule,
839
- ];
840
852
  /** Registers file validation rules with {@link AXValidationRegistryService}. */
841
853
  function provideFileValidationRules() {
842
854
  return {
843
855
  provide: 'AXValidationModuleFactory',
844
856
  useFactory: (registry) => () => {
845
- registry.register(...AX_FILE_VALIDATION_RULES);
857
+ ensureFileValidationRules(registry);
846
858
  },
847
859
  deps: [AXValidationRegistryService],
848
860
  multi: true,
849
861
  };
850
862
  }
851
863
  /**
864
+
852
865
  * Registers validation rules and optional built-in file type providers.
866
+
853
867
  * {@link AXFileTypeRegistryService} and {@link AXFileService} are `providedIn: 'root'`.
868
+
854
869
  */
855
870
  function provideFileTypeSystem() {
856
871
  return [provideFileValidationRules(), ...provideBuiltinFileTypeProviders()];
@@ -1009,5 +1024,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1009
1024
  * Generated bundle index. Do not edit.
1010
1025
  */
1011
1026
 
1012
- 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 };
1027
+ 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, ensureFileValidationRules, 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 };
1013
1028
  //# sourceMappingURL=acorex-core-file.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-core-file.mjs","sources":["../../../../packages/core/file/src/lib/file-size-formatter.ts","../../../../packages/core/file/src/lib/format-file-size.ts","../../../../packages/core/file/src/lib/file-type/file-type.models.ts","../../../../packages/core/file/src/lib/file-type/file-type.metadata.ts","../../../../packages/core/file/src/lib/file-type/file-type.copy.ts","../../../../packages/core/file/src/lib/file-type/file-type.merge.ts","../../../../packages/core/file/src/lib/file-type/file-type.renderer.ts","../../../../packages/core/file/src/lib/file-type/file-type.resolve.ts","../../../../packages/core/file/src/lib/file-type/file-type.open.ts","../../../../packages/core/file/src/lib/file-type/file-type.define.ts","../../../../packages/core/file/src/lib/file-type/file-type-info-provider.ts","../../../../packages/core/file/src/lib/file-type/file-type.providers.ts","../../../../packages/core/file/src/lib/file-type/file-type.validate.ts","../../../../packages/core/file/src/lib/file-type/file-type-registry.service.ts","../../../../packages/core/file/src/lib/file-type/file-type-renderer-outlet.component.ts","../../../../packages/core/file/src/lib/file-type/types.providers/audio-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/document-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/file-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/image-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/video-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/index.ts","../../../../packages/core/file/src/lib/file-type/rules/file-mime-type.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-min-size.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-max-size.rule.ts","../../../../packages/core/file/src/lib/file-type/index.ts","../../../../packages/core/file/src/lib/file.module.ts","../../../../packages/core/file/src/lib/file.service.ts","../../../../packages/core/file/src/acorex-core-file.ts"],"sourcesContent":["import { AXFormatOptions, AXFormatter } from '@acorex/core/format';\nimport { Injectable } from '@angular/core';\n\nexport interface AXFileSizeFormatterOptions extends AXFormatOptions {\n format: string;\n}\n\ndeclare module '@acorex/core/format' {\n interface AXFormatOptionsMap {\n filesize: AXFileSizeFormatterOptions;\n }\n}\n\n@Injectable()\nexport class AXFileSizeFormatter implements AXFormatter {\n /**\n * Gets the name of the formatter.\n *\n * @returns string - The formatter name 'filesize'\n */\n\n get name(): string {\n return 'filesize';\n }\n\n /**\n * Formats a file size value to human-readable format.\n *\n * @param value - The file size in bytes\n * @returns string - The formatted file size string (e.g., '1.5 MB')\n */\n\n format(value: number): string {\n const size = Number(value);\n\n if (size === 0) return '0 Bytes';\n if (Number.isNaN(size)) return 'Unknown';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(size) / Math.log(k));\n\n return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n}\n","/** Human-readable file size (binary units, e.g. `41.5 MB`). */\nexport function formatFileSizeBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return '0 B';\n }\n if (bytes === 0) {\n return '0 B';\n }\n\n const k = 1024;\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), units.length - 1);\n const value = bytes / Math.pow(k, i);\n\n if (i === 0) {\n return `${bytes} B`;\n }\n\n const digits = value >= 100 ? 0 : value >= 10 ? 1 : 2;\n return `${value.toFixed(digits)} ${units[i]}`;\n}\n","import type { AXValidationRuleOptions } from '@acorex/core/validation';\nimport type { AXFileTypeContext, AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport type { AXFileOpenResult } from './file-type.open';\nimport type { AXFileTypeComponent } from './file-type.renderer';\n\n/** Metadata key for catalog usage context. */\nexport const AX_FILE_TYPE_METADATA_PURPOSE = 'purpose' as const;\n\n/** Catalog metadata bag; `purpose` lists usage contexts (e.g. `['system']`). */\nexport type AXFileTypeMetadata = Record<string, unknown> & {\n [AX_FILE_TYPE_METADATA_PURPOSE]?: string[];\n};\n\n/** Filter catalog entries by {@link AX_FILE_TYPE_METADATA_PURPOSE}. */\nexport interface AXFileTypeQuery {\n purpose?: string | string[];\n}\n\n/** Generic rule executed via {@link AXValidationService}. */\nexport interface AXFileValidationRule {\n rule: string;\n options?: AXValidationRuleOptions;\n}\n\n/**\n * Common file constraints shared by {@link AXFileType} and {@link AXFileTypeExtension}.\n * Extension `validations` override the parent type field-by-field when merged.\n */\nexport interface AXFileValidations {\n mimeTypes?: string[];\n minSize?: number;\n maxSize?: number;\n rules?: AXFileValidationRule[];\n}\n\ntype AXFileTypeUtilities = Record<\n string,\n (ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\n>;\n\n/**\n * Logical file category (image, video, …).\n *\n * - With type `validations` set: any file matching those rules is allowed; `extensions` only override when matched.\n * - With empty / omitted `validations` and `extensions` listed: only those extensions are allowed.\n */\nexport interface AXFileType<T extends AXFileTypeUtilities = AXFileTypeUtilities> {\n name: string;\n title?: string;\n icon?: string;\n metadata?: AXFileTypeMetadata;\n validations?: AXFileValidations;\n extensions?: AXFileTypeExtension<T>[];\n /** Dynamic utility functions available for this file type. */\n utilities?: T;\n paste?: () => Promise<unknown>;\n /**\n * Produce copyable content from a payload (does not write to the clipboard).\n * Returns a plain string or {@link AXFileCopyData} with `text` and optional `meta`.\n */\n copy?: (payload: unknown) => Promise<AXFileCopyResult> | AXFileCopyResult;\n /**\n * Open or preview a payload (e.g. navigate, show a dialog).\n * Invoke via {@link runFileTypeOpen} so `inject()` works in the caller's context.\n */\n open?: (\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\n /** Optional view component (eager class or lazy `() => import(...)`) for this file type's payload. */\n component?: AXFileTypeComponent;\n}\n\n/** Extension entry — {@link AXFileType} without nested `extensions`. */\nexport type AXFileTypeExtension<T extends AXFileTypeUtilities = AXFileTypeUtilities> = Omit<\n AXFileType<T>,\n 'extensions'\n>;\n","import type { AXFileType } from './file-type.models';\nimport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nexport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nconst CONVERSATION_NAME_PREFIX = 'conversation-';\n\nexport function getFileTypePurposes(type: AXFileType): string[] {\n const raw = type.metadata?.[AX_FILE_TYPE_METADATA_PURPOSE];\n if (Array.isArray(raw)) {\n const values = raw.filter((entry): entry is string => typeof entry === 'string' && entry.trim().length > 0);\n if (values.length) {\n return values;\n }\n }\n if (type.name.startsWith(CONVERSATION_NAME_PREFIX)) {\n return ['conversation'];\n }\n return ['system'];\n}\n\nexport function fileTypeMatchesPurpose(type: AXFileType, purpose: string | string[]): boolean {\n const allowed = Array.isArray(purpose) ? purpose : [purpose];\n return getFileTypePurposes(type).some((entry) => allowed.includes(entry));\n}\n\nexport function filterFileTypesByPurpose(types: AXFileType[], purpose?: string | string[]): AXFileType[] {\n if (!purpose) {\n return types;\n }\n return types.filter((type) => fileTypeMatchesPurpose(type, purpose));\n}\n\nexport function createFileTypeMetadata(purpose: string | string[]): NonNullable<AXFileType['metadata']> {\n const values = (Array.isArray(purpose) ? purpose : [purpose]).filter(\n (entry): entry is string => typeof entry === 'string' && entry.trim().length > 0,\n );\n return { [AX_FILE_TYPE_METADATA_PURPOSE]: values };\n}\n","/** Structured copy payload from {@link AXFileType.copy}. */\nexport interface AXFileCopyData {\n /** Primary plain-text value for clipboard or previews. */\n text: string;\n /** Optional type-specific metadata for consumers (URLs, names, mime types, …). */\n meta?: Record<string, unknown>;\n}\n\n/** Return value of {@link AXFileType.copy} — shorthand string or structured data. */\nexport type AXFileCopyResult = string | AXFileCopyData | null | undefined;\n\n/** Resolves clipboard/plain text from a copy result. */\nexport function resolveFileCopyText(result: AXFileCopyResult): string | null {\n if (result == null) {\n return null;\n }\n if (typeof result === 'string') {\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n const trimmed = result.text?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n}\n","import type { AXFileType, AXFileTypeExtension, AXFileValidations } from './file-type.models';\n\n/** Merges type-level validations with extension overrides (extension wins per field). */\nexport function mergeFileValidations(\n base: AXFileValidations,\n override?: Partial<AXFileValidations>,\n): AXFileValidations {\n if (!override) {\n return { ...base };\n }\n\n return {\n mimeTypes: override.mimeTypes ?? base.mimeTypes,\n minSize: override.minSize ?? base.minSize,\n maxSize: override.maxSize ?? base.maxSize,\n rules: override.rules ?? base.rules,\n };\n}\n\n/** Resolved validations for a type + optional extension entry. */\nexport function resolveFileValidations(type: AXFileType, extension?: AXFileTypeExtension): AXFileValidations {\n return mergeFileValidations(type.validations ?? {}, extension?.validations);\n}\n\n/** True when no mime/size/rules are defined on the type. */\nexport function isEmptyFileValidations(validations?: AXFileValidations): boolean {\n if (!validations) {\n return true;\n }\n return (\n (validations.mimeTypes?.length ?? 0) === 0 &&\n validations.minSize == null &&\n validations.maxSize == null &&\n (validations.rules?.length ?? 0) === 0\n );\n}\n\n/**\n * Extension-only mode: empty type `validations` and a non-empty `extensions` list.\n * Files must match a listed extension; rules come from that extension entry.\n */\nexport function isExtensionsOnlyType(type: AXFileType): boolean {\n return isEmptyFileValidations(type.validations) && (type.extensions?.length ?? 0) > 0;\n}\n\n/** File extension from name (lowercase, no dot). */\nexport function getFileExtension(fileName: string): string {\n const parts = fileName.trim().split('.');\n return parts.length > 1 ? (parts.pop()?.toLowerCase() ?? '') : '';\n}\n","import type { InputSignal, Signal, Type } from '@angular/core';\n\n/**\n * View component for a file type — either an Angular component class or a lazy loader.\n *\n * @example\n * ```ts\n * // eager\n * component: ImageViewerComponent,\n *\n * // lazy\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\n * ```\n */\nexport type AXFileTypeComponent =\n | Type<AXFileTypeViewComponent>\n | (() => Promise<Type<AXFileTypeViewComponent>>);\n\n/**\n * Recommended contract for file-type view components.\n * Implement `readonly payload = input.required<TPayload>()` in new components.\n */\nexport interface AXFileTypeViewComponent<TPayload = unknown> {\n readonly payload: InputSignal<TPayload> | Signal<TPayload>;\n}\n\n/** Resolves a {@link AXFileTypeComponent} to an Angular component type. */\nexport async function resolveFileTypeComponentType(\n component: AXFileTypeComponent,\n): Promise<Type<unknown>> {\n if (isLazyFileTypeComponentLoader(component)) {\n return component();\n }\n return component;\n}\n\n/** Whether `value` is a lazy loader rather than an Angular component class. */\nexport function isLazyFileTypeComponentLoader(\n value: AXFileTypeComponent,\n): value is () => Promise<Type<AXFileTypeViewComponent>> {\n return typeof value === 'function' && !('ɵcmp' in value);\n}\n","import type { Type } from '@angular/core';\n\nimport type { AXFileTypeContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport { getFileExtension } from './file-type.merge';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport type { AXFileTypeComponent } from './file-type.renderer';\nimport { resolveFileTypeComponentType } from './file-type.renderer';\n\n/** Hint for resolving a catalog extension entry. */\nexport interface AXFileTypeExtensionHint {\n file?: File;\n extensionName?: string;\n mimeType?: string;\n}\n\n/** Matches a MIME type against a catalog pattern (`image/*`, exact type, …). */\nexport function matchesFileMime(mime: string, pattern: string): boolean {\n const normalizedMime = mime.trim().toLowerCase();\n const normalizedPattern = pattern.trim().toLowerCase();\n\n if (!normalizedPattern || normalizedPattern === '*/*' || normalizedPattern === '*') {\n return true;\n }\n\n if (normalizedPattern.endsWith('/*')) {\n const category = normalizedPattern.slice(0, -2);\n return normalizedMime.startsWith(`${category}/`) || (normalizedMime === '' && category === 'application');\n }\n\n return normalizedMime === normalizedPattern;\n}\n\n/** Finds an extension entry by its `name` (without dot). */\nexport function findFileTypeExtensionByName(\n type: AXFileType,\n extensionName: string,\n): AXFileTypeExtension | undefined {\n const ext = extensionName.replace(/^\\./, '').trim().toLowerCase();\n if (!ext || !type.extensions?.length) {\n return undefined;\n }\n return type.extensions.find((entry) => entry.name.toLowerCase() === ext);\n}\n\n/** Finds an extension entry whose validations include the given MIME type. */\nexport function findFileTypeExtensionForMime(\n type: AXFileType,\n mimeType: string,\n): AXFileTypeExtension | undefined {\n const mime = mimeType.trim().toLowerCase();\n if (!mime || !type.extensions?.length) {\n return undefined;\n }\n\n return type.extensions.find((entry) =>\n entry.validations?.mimeTypes?.some((pattern) => matchesFileMime(mime, pattern)),\n );\n}\n\n/** Matching extension entry for a file within a type, if any. */\nexport function findFileTypeExtension(file: File, type: AXFileType): AXFileTypeExtension | undefined {\n return resolveFileTypeExtension(type, { file });\n}\n\n/** Resolves the best-matching extension entry for a file or hint. */\nexport function resolveFileTypeExtension(\n type: AXFileType,\n hint?: AXFileTypeExtensionHint,\n): AXFileTypeExtension | undefined {\n if (!hint) {\n return undefined;\n }\n\n if (hint.file) {\n const byFileName = findFileTypeExtensionByName(type, getFileExtension(hint.file.name));\n if (byFileName) {\n return byFileName;\n }\n if (hint.file.type) {\n const byFileMime = findFileTypeExtensionForMime(type, hint.file.type);\n if (byFileMime) {\n return byFileMime;\n }\n }\n }\n\n if (hint.extensionName) {\n const byName = findFileTypeExtensionByName(type, hint.extensionName);\n if (byName) {\n return byName;\n }\n }\n\n if (hint.mimeType) {\n return findFileTypeExtensionForMime(type, hint.mimeType);\n }\n\n return undefined;\n}\n\nexport function resolveFileTypeCopy(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['copy'] | undefined {\n return extension?.copy ?? type.copy;\n}\n\nexport function resolveFileTypeOpen(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['open'] | undefined {\n return extension?.open ?? type.open;\n}\n\nexport function resolveFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['component'] | undefined {\n return extension?.component ?? type.component;\n}\n\n/** Loads the resolved view component (extension override first). */\nexport async function loadFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<Type<unknown> | undefined> {\n const component = resolveFileTypeComponent(type, extension);\n if (!component) {\n return undefined;\n }\n return resolveFileTypeComponentType(component);\n}\n\nexport function resolveFileTypePaste(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['paste'] | undefined {\n return extension?.paste ?? type.paste;\n}\n\nexport function resolveFileTypeUtility(\n type: AXFileType,\n extension: AXFileTypeExtension | undefined,\n name: string,\n): ((ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown) | undefined {\n const fromExtension = extension?.utilities?.[name];\n if (fromExtension) {\n return fromExtension;\n }\n return type.utilities?.[name];\n}\n\n/** Runs `copy` from extension first, then parent type. */\nexport async function runFileTypeCopy(\n type: AXFileType,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileCopyResult> {\n const copy = resolveFileTypeCopy(type, extension);\n if (!copy) {\n return undefined;\n }\n return copy(payload);\n}\n\n/** Runs a utility from extension first, then parent type. */\nexport function runFileTypeUtility(\n type: AXFileType,\n ctx: AXFileTypeContext,\n extension: AXFileTypeExtension | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const utility = resolveFileTypeUtility(type, extension, name);\n if (!utility) {\n return undefined;\n }\n return utility(ctx, ...args);\n}\n\n/** Runs a catalog utility with optional file-based extension resolution. */\nexport function runFileTypeUtilityForFile(\n type: AXFileType,\n ctx: AXFileTypeContext,\n file: File | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const extension = file ? findFileTypeExtension(file, type) : undefined;\n return runFileTypeUtility(type, ctx, extension, name, ...args);\n}\n","import { runInInjectionContext } from '@angular/core';\n\nimport type { AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport { resolveFileTypeOpen } from './file-type.resolve';\n\n/** Result of {@link AXFileType.open}; `false` means the payload was not opened. */\nexport type AXFileOpenResult = void | boolean | null | undefined;\n\n/** Runs `open` from extension first, then parent type, in the caller's injection context. */\nexport function runFileTypeOpen(\n type: AXFileType,\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileOpenResult> | AXFileOpenResult {\n const open = resolveFileTypeOpen(type, extension);\n if (!open) {\n return false;\n }\n return runInInjectionContext(ctx.injector, () => open(ctx, payload));\n}\n","import type { Type } from '@angular/core';\r\r\n\r\r\nimport type { AXFileCopyResult } from './file-type.copy';\r\r\nimport type { AXFileType, AXFileTypeExtension, AXFileValidations, AXFileTypeMetadata } from './file-type.models';\r\r\nimport type { AXFileOpenResult } from './file-type.open';\r\r\nimport type { AXFileTypeOpenContext } from './file-type.context';\r\r\nimport type { AXFileTypeComponent } from './file-type.renderer';\r\r\n\r\r\ntype AXFileTypeUtilities = Record<\r\r\n string,\r\r\n (ctx: import('./file-type.context').AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\r\r\n>;\r\r\n\r\r\n/** Config for {@link defineFileType}. */\r\r\nexport interface DefineFileTypeConfig<\r\r\n TPayload = unknown,\r\r\n TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities,\r\r\n> {\r\r\n name: string;\r\r\n title?: string;\r\r\n icon?: string;\r\r\n metadata?: AXFileTypeMetadata;\r\r\n validations?: AXFileValidations;\r\r\n extensions?: AXFileTypeExtension<TUtilities>[];\r\r\n utilities?: TUtilities;\r\r\n paste?: AXFileType<TUtilities>['paste'];\r\r\n copy?: (payload: TPayload) => Promise<AXFileCopyResult> | AXFileCopyResult;\r\r\n open?: (\r\r\n ctx: AXFileTypeOpenContext,\r\r\n payload: TPayload,\r\r\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\r\r\n /** Eager component class or lazy `() => import(...).then(m => m.Component)`. */\r\r\n component?: AXFileTypeComponent;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Builds an {@link AXFileType} with optional typed handlers and view component.\r\r\n *\r\r\n * @example\r\r\n * ```ts\r\r\n * export const imageFileType = defineFileType<ImagePayload>({\r\r\n * name: 'image',\r\r\n * copy: (p) => p.caption ?? p.url,\r\r\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\r\r\n * });\r\r\n * ```\r\r\n */\r\r\nexport function defineFileType<TPayload = unknown, TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities>(\r\r\n config: DefineFileTypeConfig<TPayload, TUtilities>,\r\r\n): AXFileType<TUtilities> {\r\r\n const { copy, open, ...rest } = config;\r\r\n\r\r\n return {\r\r\n ...rest,\r\r\n ...(copy ? { copy: copy as AXFileType<TUtilities>['copy'] } : {}),\r\r\n ...(open ? { open: open as AXFileType<TUtilities>['open'] } : {}),\r\r\n };\r\r\n}\r\r\n\r","import { InjectionToken, Provider, Type } from '@angular/core';\nimport type { AXFileType } from './file-type.models';\n\n/** Contributes {@link AXFileType} entries (multi provider). */\nexport abstract class AXFileTypeInfoProvider {\n abstract items(): Promise<AXFileType[]>;\n}\n\nexport const AX_FILE_TYPE_INFO_PROVIDER = new InjectionToken<AXFileTypeInfoProvider[]>('AX_FILE_TYPE_INFO_PROVIDER');\n\nexport function provideFileTypeInfoProvider(provider: Type<AXFileTypeInfoProvider>): Provider {\n return {\n provide: AX_FILE_TYPE_INFO_PROVIDER,\n useClass: provider,\n multi: true,\n };\n}\n","import { Injectable, Provider } from '@angular/core';\n\nimport type { AXFileType } from './file-type.models';\nimport { AXFileTypeInfoProvider, provideFileTypeInfoProvider } from './file-type-info-provider';\n\n/** Registers static file types via the existing {@link AXFileTypeInfoProvider} multi-token. */\nexport function provideFileTypes(types: AXFileType[] | (() => AXFileType[] | Promise<AXFileType[]>)): Provider {\n @Injectable()\n class AXStaticFileTypeProvider extends AXFileTypeInfoProvider {\n override items(): Promise<AXFileType[]> {\n const value = typeof types === 'function' ? types() : types;\n return Promise.resolve(value);\n }\n }\n\n return provideFileTypeInfoProvider(AXStaticFileTypeProvider);\n}\n","import { AXValidationService, type AXValidationRuleResult } from '@acorex/core/validation';\nimport {\n getFileExtension,\n isExtensionsOnlyType,\n resolveFileValidations,\n} from './file-type.merge';\nimport { findFileTypeExtension } from './file-type.resolve';\nimport type { AXFileType, AXFileTypeExtension, AXFileValidationRule, AXFileValidations } from './file-type.models';\n\n/** Maps {@link AXFileValidations} to executable validation entries. */\nexport function fileValidationsToRules(validations: AXFileValidations): AXFileValidationRule[] {\n const rules: AXFileValidationRule[] = [];\n\n if (validations.mimeTypes?.length) {\n rules.push({\n rule: 'fileMimeType',\n options: { allowed: validations.mimeTypes },\n });\n }\n\n if (validations.minSize != null) {\n rules.push({\n rule: 'fileMinSize',\n options: { minSize: validations.minSize },\n });\n }\n\n if (validations.maxSize != null) {\n rules.push({\n rule: 'fileMaxSize',\n options: { maxSize: validations.maxSize },\n });\n }\n\n if (validations.rules?.length) {\n rules.push(...validations.rules);\n }\n\n return rules;\n}\n\n/** Failed validation results; empty array means the file is valid. */\nexport async function validateFileWithValidations(\n validation: AXValidationService,\n file: File,\n validations: AXFileValidations,\n): Promise<AXValidationRuleResult[]> {\n const entries = fileValidationsToRules(validations);\n const errors: AXValidationRuleResult[] = [];\n\n for (const { rule, options } of entries) {\n const result = await validation.validate(rule, file, options);\n if (!result.result) {\n errors.push(result);\n }\n }\n\n return errors;\n}\n\n/** Validates a file against a type; extension rules override when the file name matches. */\nexport async function validateFileAgainstType(\n validation: AXValidationService,\n file: File,\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<AXValidationRuleResult[]> {\n const matchedExtension = extension ?? findFileTypeExtension(file, type);\n\n if (isExtensionsOnlyType(type) && !matchedExtension) {\n const ext = getFileExtension(file.name);\n return [\n {\n rule: 'fileExtension',\n result: false,\n message: ext ? `Extension \".${ext}\" is not allowed.` : 'File must have an allowed extension.',\n value: ext,\n },\n ];\n }\n\n const resolved = resolveFileValidations(type, matchedExtension);\n return validateFileWithValidations(validation, file, resolved);\n}\n","import type { AXValidationRuleResult } from '@acorex/core/validation';\n\nimport { AXValidationService } from '@acorex/core/validation';\n\nimport { Injectable, Type, inject } from '@angular/core';\n\nimport { AX_FILE_TYPE_INFO_PROVIDER } from './file-type-info-provider';\n\nimport {\n findFileTypeExtension,\n loadFileTypeComponent,\n matchesFileMime,\n resolveFileTypeComponent,\n resolveFileTypeExtension,\n type AXFileTypeExtensionHint,\n} from './file-type.resolve';\n\nimport type { AXFileType, AXFileTypeQuery } from './file-type.models';\n\nimport { filterFileTypesByPurpose } from './file-type.metadata';\n\nimport { validateFileAgainstType } from './file-type.validate';\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileTypeRegistryService {\n private readonly validation = inject(AXValidationService);\n\n private readonly providers = inject(AX_FILE_TYPE_INFO_PROVIDER, { optional: true }) ?? [];\n\n private readonly registeredTypes: AXFileType[] = [];\n\n private cache: AXFileType[] | null = null;\n\n /** Registers or replaces catalog entries (e.g. from feature bootstrap). */\n\n registerTypes(types: AXFileType[]): void {\n for (const type of types) {\n const index = this.registeredTypes.findIndex((t) => t.name === type.name);\n\n if (index >= 0) {\n this.registeredTypes[index] = type;\n } else {\n this.registeredTypes.push(type);\n }\n }\n\n this.invalidateCache();\n }\n\n invalidateCache(): void {\n this.cache = null;\n }\n\n private async resolveTypes(): Promise<AXFileType[]> {\n if (this.cache) {\n return this.cache;\n }\n\n const byName = new Map<string, AXFileType>();\n\n if (this.providers.length) {\n const batches = await Promise.all(this.providers.map((p) => p.items()));\n\n for (const batch of batches) {\n for (const type of batch) {\n if (!byName.has(type.name)) {\n byName.set(type.name, type);\n }\n }\n }\n }\n\n for (const type of this.registeredTypes) {\n byName.set(type.name, type);\n }\n\n this.cache = [...byName.values()];\n\n return this.cache;\n }\n\n async getTypes(query?: AXFileTypeQuery): Promise<AXFileType[]> {\n const types = await this.resolveTypes();\n return filterFileTypesByPurpose(types, query?.purpose);\n }\n\n async get(name: string): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n return types.find((t) => t.name === name);\n }\n\n /** Resolved view component ref for a catalog entry (optional extension hint). */\n async getComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<AXFileType['component'] | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return resolveFileTypeComponent(type, extension);\n }\n\n /** Loads the view component for a catalog entry. */\n async loadComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<Type<unknown> | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return loadFileTypeComponent(type, extension);\n }\n\n async accept(typeNames?: string | string[]): Promise<string> {\n const names = typeNames ? (Array.isArray(typeNames) ? typeNames : [typeNames]) : undefined;\n\n const types = await this.resolveTypes();\n\n const selected = names?.length ? types.filter((t) => names.includes(t.name)) : types;\n\n if (names?.length && selected.length === 0) {\n return '';\n }\n\n const parts = new Set<string>();\n\n for (const type of selected) {\n type.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n type.extensions?.forEach((ext) => {\n ext.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n parts.add(`.${ext.name.replace(/^\\./, '')}`);\n });\n }\n\n return [...parts].join(',');\n }\n\n async matchType(file: File): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n const mime = file.type.trim().toLowerCase();\n\n return types.find((type) => {\n const patterns = [\n ...(type.validations?.mimeTypes ?? []),\n\n ...(type.extensions?.flatMap((e) => e.validations?.mimeTypes ?? []) ?? []),\n ];\n\n if (!patterns.length) {\n return false;\n }\n\n return patterns.some((pattern) => matchesFileMime(mime, pattern));\n });\n }\n\n async validate(file: File, typeName: string): Promise<AXValidationRuleResult[]> {\n const type = await this.get(typeName);\n\n if (!type) {\n return [\n {\n rule: 'fileType',\n\n result: false,\n\n message: `Unknown file type: ${typeName}`,\n\n value: typeName,\n },\n ];\n }\n\n const extension = findFileTypeExtension(file, type);\n\n return validateFileAgainstType(this.validation, file, type, extension);\n }\n\n async validateAgainstTypes(\n file: File,\n\n typeNames: string | string[],\n ): Promise<AXValidationRuleResult[]> {\n const names = Array.isArray(typeNames) ? typeNames : [typeNames];\n\n let lastErrors: AXValidationRuleResult[] = [];\n\n for (const name of names) {\n const errors = await this.validate(file, name);\n\n if (errors.length === 0) {\n return [];\n }\n\n lastErrors = errors;\n }\n\n return lastErrors;\n }\n\n async validateMany(\n files: File[],\n\n typeNames: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const accepted: File[] = [];\n\n const rejected: { file: File; errors: AXValidationRuleResult[] }[] = [];\n\n for (const file of files) {\n const errors = await this.validateAgainstTypes(file, typeNames);\n\n if (errors.length === 0) {\n accepted.push(file);\n } else {\n rejected.push({ file, errors });\n }\n }\n\n return { accepted, rejected };\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { Component, effect, inject, input, signal, type Type } from '@angular/core';\n\nimport { AXFileTypeRegistryService } from '../file-type/file-type-registry.service';\nimport type { AXFileTypeExtensionHint } from '../file-type/file-type.resolve';\n\n@Component({\n selector: 'ax-file-type-renderer',\n\n imports: [NgComponentOutlet],\n template: `\n @if (resolvedComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: mergedInputs()\" />\n } @else if (loading()) {\n <span class=\"ax-file-type-renderer__loading\" aria-hidden=\"true\"></span>\n }\n `,\n styles: `\n :host {\n display: contents;\n }\n\n .ax-file-type-renderer__loading {\n display: inline-block;\n min-height: 1rem;\n min-width: 1rem;\n }\n `,\n})\nexport class AXFileTypeRendererOutletComponent {\n private readonly registry = inject(AXFileTypeRegistryService);\n\n /** Catalog name (e.g. `image`, `conversation-image`). */\n readonly fileType = input.required<string>();\n\n /** Payload passed to the file-type view component. */\n readonly payload = input.required<unknown>();\n\n /** Optional extension / MIME hint for extension-level renderer overrides. */\n readonly extensionHint = input<AXFileTypeExtensionHint>();\n\n /** Extra inputs merged with `payload` (e.g. `message` in conversation). */\n readonly inputs = input<Record<string, unknown>>({});\n\n readonly resolvedComponent = signal<Type<unknown> | null>(null);\n readonly loading = signal(false);\n\n readonly mergedInputs = signal<Record<string, unknown>>({});\n\n constructor() {\n effect(() => {\n const name = this.fileType();\n const payload = this.payload();\n const hint = this.extensionHint();\n const extra = this.inputs();\n\n this.mergedInputs.set({ payload, ...extra });\n this.loading.set(true);\n this.resolvedComponent.set(null);\n\n void this.registry.loadComponent(name, hint).then((component) => {\n this.resolvedComponent.set(component ?? null);\n this.loading.set(false);\n });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_AUDIO_FILE_TYPE: AXFileType = {\n name: 'audio',\n metadata: createFileTypeMetadata('system'),\n title: 'Audio',\n icon: 'fa-light fa-music ax-text-amber-500',\n validations: {\n mimeTypes: ['audio/*'],\n minSize: 1,\n maxSize: 50 * MB,\n },\n extensions: [\n { name: 'mp3', title: 'MP3' },\n { name: 'wav', title: 'WAV', validations: { maxSize: 30 * MB } },\n { name: 'ogg', title: 'OGG' },\n { name: 'm4a', title: 'M4A' },\n ],\n};\n\n@Injectable()\nexport class AXAudioFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_AUDIO_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\n/** Extension-only: no type `validations` — only listed extensions are allowed. */\nexport const AX_DOCUMENT_FILE_TYPE: AXFileType = {\n name: 'document',\n metadata: createFileTypeMetadata('system'),\n title: 'Document',\n icon: 'fa-light fa-file-lines ax-text-red-500',\n extensions: [{ name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 5 * MB } }],\n};\n\n@Injectable()\nexport class AXDocumentFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_DOCUMENT_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_FILE_FILE_TYPE: AXFileType = {\n name: 'file',\n metadata: createFileTypeMetadata('system'),\n title: 'File',\n icon: 'fa-light fa-file ax-text-neutral-500',\n validations: {\n mimeTypes: ['application/*', 'text/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 25 * MB } },\n { name: 'doc', title: 'Word' },\n { name: 'docx', title: 'Word' },\n { name: 'txt', title: 'Text', validations: { mimeTypes: ['text/plain'], maxSize: 5 * MB } },\n { name: 'zip', title: 'ZIP', validations: { maxSize: 50 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXFileFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_FILE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_IMAGE_FILE_TYPE: AXFileType = {\n name: 'image',\n metadata: createFileTypeMetadata('system'),\n title: 'Image',\n icon: 'fa-light fa-image ax-text-purple-500',\n validations: {\n mimeTypes: ['image/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'jpg', title: 'JPEG' },\n { name: 'jpeg', title: 'JPEG', validations: { maxSize: 5 * MB } },\n { name: 'png', title: 'PNG' },\n { name: 'gif', title: 'GIF' },\n { name: 'webp', title: 'WebP' },\n { name: 'svg', title: 'SVG', validations: { maxSize: 2 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXImageFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_IMAGE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_VIDEO_FILE_TYPE: AXFileType = {\n name: 'video',\n metadata: createFileTypeMetadata('system'),\n title: 'Video',\n icon: 'fa-light fa-video ax-text-blue-500',\n validations: {\n mimeTypes: ['video/*'],\n minSize: 1,\n maxSize: 500 * MB,\n },\n extensions: [\n { name: 'mp4', title: 'MP4' },\n { name: 'webm', title: 'WebM', validations: { maxSize: 200 * MB } },\n { name: 'ogg', title: 'OGG' },\n ],\n};\n\n@Injectable()\nexport class AXVideoFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_VIDEO_FILE_TYPE]);\n }\n}\n","import { Provider, Type } from '@angular/core';\nimport { provideFileTypeInfoProvider, AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { AXAudioFileTypeProvider } from './audio-file-type.provider';\nimport { AXDocumentFileTypeProvider } from './document-file-type.provider';\nimport { AXFileFileTypeProvider } from './file-file-type.provider';\nimport { AXImageFileTypeProvider } from './image-file-type.provider';\nimport { AXVideoFileTypeProvider } from './video-file-type.provider';\n\nexport * from './image-file-type.provider';\nexport * from './video-file-type.provider';\nexport * from './audio-file-type.provider';\nexport * from './file-file-type.provider';\nexport * from './document-file-type.provider';\n\n/** Built-in file type provider classes (one logical type per provider). */\nexport const AX_BUILTIN_FILE_TYPE_PROVIDERS = [\n AXImageFileTypeProvider,\n AXVideoFileTypeProvider,\n AXAudioFileTypeProvider,\n AXFileFileTypeProvider,\n AXDocumentFileTypeProvider,\n] as const satisfies readonly Type<AXFileTypeInfoProvider>[];\n\n/** Registers all built-in file type providers (image, video, audio, file, document). */\nexport function provideBuiltinFileTypeProviders(): Provider[] {\n return AX_BUILTIN_FILE_TYPE_PROVIDERS.map((provider) => provideFileTypeInfoProvider(provider));\n}\n\n/** @deprecated Use {@link provideBuiltinFileTypeProviders}. */\nexport const provideDefaultFileTypeProviders = provideBuiltinFileTypeProviders;\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\n\nexport interface AXFileMimeTypeValidationRuleOptions extends AXValidationRuleOptions {\n /** MIME patterns, e.g. `image/*`, `image/png`. */\n allowed: string[];\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMimeType: AXFileMimeTypeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMimeTypeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMimeType';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMimeTypeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const mime = (value instanceof File || value instanceof Blob ? value.type : '').trim().toLowerCase();\n const allowed = options.allowed ?? [];\n const valid =\n allowed.length === 0 ||\n allowed.some((pattern) => this.matchesMime(mime, pattern.trim().toLowerCase()));\n\n return {\n rule: this.name,\n result: valid,\n message: valid ? '' : (options.message ?? 'File type is not allowed.'),\n value: mime,\n };\n }\n\n private matchesMime(mime: string, pattern: string): boolean {\n if (!pattern || pattern === '*/*' || pattern === '*') {\n return true;\n }\n if (pattern.endsWith('/*')) {\n const category = pattern.slice(0, -2);\n return mime.startsWith(`${category}/`) || (mime === '' && category === 'application');\n }\n return mime === pattern;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMinSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Minimum size in bytes. */\n minSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMinSize: AXFileMinSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMinSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMinSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMinSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size >= options.minSize;\n const limitLabel = formatFileSizeBytes(options.minSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ?? `File is too small. Minimum size is ${limitLabel}.`),\n value: size,\n minSize: options.minSize,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMaxSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Maximum size in bytes. */\n maxSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMaxSize: AXFileMaxSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMaxSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMaxSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMaxSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size <= options.maxSize;\n const limitLabel = formatFileSizeBytes(options.maxSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ??\n `File is too large. Maximum size is ${limitLabel}.`),\n value: size,\n maxSize: options.maxSize,\n };\n }\n}\n","export * from './file-type.metadata';\nexport * from './file-type.models';\nexport * from './file-type.context';\nexport * from './file-type.copy';\nexport * from './file-type.open';\nexport * from './file-type.resolve';\nexport * from './file-type.renderer';\nexport * from './file-type.define';\nexport * from './file-type.providers';\nexport * from './file-type-renderer-outlet.component';\nexport * from './file-type-info-provider';\nexport * from './file-type-registry.service';\nexport * from './file-type.merge';\nexport * from './file-type.validate';\nexport * from './types.providers';\nexport * from './rules/file-mime-type.rule';\nexport * from './rules/file-min-size.rule';\nexport * from './rules/file-max-size.rule';\n\nimport { Provider } from '@angular/core';\nimport { AXValidationRegistryService } from '@acorex/core/validation';\nimport { provideBuiltinFileTypeProviders } from './types.providers';\nimport { AXFileMaxSizeValidationRule } from './rules/file-max-size.rule';\nimport { AXFileMimeTypeValidationRule } from './rules/file-mime-type.rule';\nimport { AXFileMinSizeValidationRule } from './rules/file-min-size.rule';\n\n/** Validation rule classes to register with {@link AXValidationModule}. */\nexport const AX_FILE_VALIDATION_RULES = [\n AXFileMimeTypeValidationRule,\n AXFileMinSizeValidationRule,\n AXFileMaxSizeValidationRule,\n] as const;\n\n/** Registers file validation rules with {@link AXValidationRegistryService}. */\nexport function provideFileValidationRules(): Provider {\n return {\n provide: 'AXValidationModuleFactory',\n useFactory: (registry: AXValidationRegistryService) => () => {\n registry.register(...AX_FILE_VALIDATION_RULES);\n },\n deps: [AXValidationRegistryService],\n multi: true,\n };\n}\n\n/** Registers built-in image / video / audio / file / document type providers. */\nexport { provideBuiltinFileTypeProviders, provideDefaultFileTypeProviders } from './types.providers';\n\n/**\n * Registers validation rules and optional built-in file type providers.\n * {@link AXFileTypeRegistryService} and {@link AXFileService} are `providedIn: 'root'`.\n */\nexport function provideFileTypeSystem(): Provider[] {\n return [provideFileValidationRules(), ...provideBuiltinFileTypeProviders()];\n}\n","import { AXFormatModule } from '@acorex/core/format';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { AXFileSizeFormatter } from './file-size-formatter';\nimport {\n AX_FILE_VALIDATION_RULES,\n provideDefaultFileTypeProviders,\n provideFileValidationRules,\n} from './file-type';\n\nexport interface AXFileModuleConfig {\n fileTypeProviders?: Provider[];\n includeDefaultFileTypes?: boolean;\n}\n\n@NgModule({\n imports: [\n AXFormatModule.forChild({ formatters: [AXFileSizeFormatter] }),\n AXValidationModule.forChild({ rules: [...AX_FILE_VALIDATION_RULES] }),\n ],\n providers: [AXFileSizeFormatter],\n})\nexport class AXFileModule {\n static forRoot(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n const includeDefaults = config?.includeDefaultFileTypes !== false;\n\n return {\n ngModule: AXFileModule,\n providers: [\n provideFileValidationRules(),\n ...(includeDefaults ? provideDefaultFileTypeProviders() : []),\n ...(config?.fileTypeProviders ?? []),\n ],\n };\n }\n\n static forChild(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n return AXFileModule.forRoot(config);\n }\n}\n","import type { AXValidationRuleResult } from '@acorex/core/validation';\nimport { DOCUMENT, inject, Injectable, isDevMode } from '@angular/core';\nimport { AXFileTypeRegistryService } from './file-type/file-type-registry.service';\nimport type { AXFileType } from './file-type/file-type.models';\n\nexport interface AXFileChooseOptions {\n /** Logical type name(s) from {@link AXFileTypeRegistryService}. When set, files are validated against the catalog. */\n fileType?: string | string[];\n accept?: string;\n multiple?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileService {\n private readonly document = inject(DOCUMENT);\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n\n async getFileTypes(): Promise<AXFileType[]> {\n return this.fileTypes.getTypes();\n }\n\n async getFileType(name: string): Promise<AXFileType | undefined> {\n return this.fileTypes.get(name);\n }\n\n async getAcceptAttribute(fileType?: string | string[]): Promise<string> {\n return this.fileTypes.accept(fileType);\n }\n\n async matchFileType(file: File): Promise<AXFileType | undefined> {\n return this.fileTypes.matchType(file);\n }\n\n validate(file: File, fileType: string | string[]): Promise<AXValidationRuleResult[]> {\n return this.fileTypes.validateAgainstTypes(file, fileType);\n }\n\n validateMany(\n files: File[],\n fileType: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n return this.fileTypes.validateMany(files, fileType);\n }\n\n /**\n * Opens a file selection dialog.\n * With `fileType`, returns files that pass catalog validation (`accept` defaults from the catalog).\n * Without `fileType`, returns all selected files (legacy `accept` / `multiple` only).\n */\n async chooseValidated(\n options: AXFileChooseOptions,\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const resolved = await this.resolveChooseOptions(options);\n const files = await this.openFileDialog(resolved);\n\n if (files.length === 0) {\n return { accepted: [], rejected: [] };\n }\n\n if (options.fileType) {\n return this.validateMany(files, options.fileType);\n }\n\n return { accepted: files, rejected: [] };\n }\n\n async choose(options: AXFileChooseOptions): Promise<File[]> {\n const { accepted } = await this.chooseValidated(options);\n return accepted;\n }\n\n blobToBase64(blob: Blob): Promise<string> {\n if (!(blob instanceof Blob)) {\n return Promise.reject(new Error('input is not blob'));\n }\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(reader.error);\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n }\n\n getSize(file: File | Blob | string): number | false {\n if (this.isBase64(file as string)) {\n return this.getBase64Size(file as string);\n }\n return false;\n }\n\n isBase64(base64: string): boolean {\n const regx = /[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/;\n return regx.test(base64);\n }\n\n getBase64Size(base64: string): number {\n return atob(base64.substring(base64.indexOf(',') + 1)).length;\n }\n\n private async resolveChooseOptions(\n options: AXFileChooseOptions,\n ): Promise<{ accept: string; multiple: boolean }> {\n const multiple = options.multiple ?? false;\n\n if (options.fileType) {\n const accept = options.accept ?? (await this.getAcceptAttribute(options.fileType));\n\n if (isDevMode() && !accept) {\n const name = Array.isArray(options.fileType) ? options.fileType.join(', ') : options.fileType;\n console.warn(\n `[AXFileService] No accept filter for file type \"${name}\". ` +\n 'Register a file type provider (e.g. provideConversationFileCatalog).',\n );\n }\n\n return { accept, multiple };\n }\n\n return { accept: options.accept ?? '', multiple };\n }\n\n private openFileDialog(options: { accept: string; multiple: boolean }): Promise<File[]> {\n return new Promise<File[]>((resolve, reject) => {\n const input: HTMLInputElement = this.document.createElement('input');\n input.style.display = 'none';\n this.document.body.appendChild(input);\n input.type = 'file';\n input.accept = options.accept;\n input.multiple = options.multiple;\n\n const cleanup = () => {\n input.removeEventListener('change', onChange);\n input.removeEventListener('error', onError);\n if (input.parentNode) {\n this.document.body.removeChild(input);\n }\n input.remove();\n };\n\n const onError = (e: Event) => {\n cleanup();\n reject(e);\n };\n\n const onChange = () => {\n const files = Array.from(input.files ?? []);\n cleanup();\n resolve(files);\n };\n\n input.addEventListener('change', onChange);\n input.addEventListener('error', onError);\n input.click();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["MB"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-core-file.mjs","sources":["../../../../packages/core/file/src/lib/file-size-formatter.ts","../../../../packages/core/file/src/lib/format-file-size.ts","../../../../packages/core/file/src/lib/file-type/file-type.models.ts","../../../../packages/core/file/src/lib/file-type/file-type.metadata.ts","../../../../packages/core/file/src/lib/file-type/file-type.copy.ts","../../../../packages/core/file/src/lib/file-type/file-type.merge.ts","../../../../packages/core/file/src/lib/file-type/file-type.renderer.ts","../../../../packages/core/file/src/lib/file-type/file-type.resolve.ts","../../../../packages/core/file/src/lib/file-type/file-type.open.ts","../../../../packages/core/file/src/lib/file-type/file-type.define.ts","../../../../packages/core/file/src/lib/file-type/file-type-info-provider.ts","../../../../packages/core/file/src/lib/file-type/file-type.providers.ts","../../../../packages/core/file/src/lib/file-type/file-type.validate.ts","../../../../packages/core/file/src/lib/file-type/rules/file-max-size.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-mime-type.rule.ts","../../../../packages/core/file/src/lib/file-type/rules/file-min-size.rule.ts","../../../../packages/core/file/src/lib/file-type/file-validation-rules.bootstrap.ts","../../../../packages/core/file/src/lib/file-type/file-type-registry.service.ts","../../../../packages/core/file/src/lib/file-type/file-type-renderer-outlet.component.ts","../../../../packages/core/file/src/lib/file-type/types.providers/audio-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/document-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/file-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/image-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/video-file-type.provider.ts","../../../../packages/core/file/src/lib/file-type/types.providers/index.ts","../../../../packages/core/file/src/lib/file-type/index.ts","../../../../packages/core/file/src/lib/file.module.ts","../../../../packages/core/file/src/lib/file.service.ts","../../../../packages/core/file/src/acorex-core-file.ts"],"sourcesContent":["import { AXFormatOptions, AXFormatter } from '@acorex/core/format';\nimport { Injectable } from '@angular/core';\n\nexport interface AXFileSizeFormatterOptions extends AXFormatOptions {\n format: string;\n}\n\ndeclare module '@acorex/core/format' {\n interface AXFormatOptionsMap {\n filesize: AXFileSizeFormatterOptions;\n }\n}\n\n@Injectable()\nexport class AXFileSizeFormatter implements AXFormatter {\n /**\n * Gets the name of the formatter.\n *\n * @returns string - The formatter name 'filesize'\n */\n\n get name(): string {\n return 'filesize';\n }\n\n /**\n * Formats a file size value to human-readable format.\n *\n * @param value - The file size in bytes\n * @returns string - The formatted file size string (e.g., '1.5 MB')\n */\n\n format(value: number): string {\n const size = Number(value);\n\n if (size === 0) return '0 Bytes';\n if (Number.isNaN(size)) return 'Unknown';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(size) / Math.log(k));\n\n return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n}\n","/** Human-readable file size (binary units, e.g. `41.5 MB`). */\nexport function formatFileSizeBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return '0 B';\n }\n if (bytes === 0) {\n return '0 B';\n }\n\n const k = 1024;\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), units.length - 1);\n const value = bytes / Math.pow(k, i);\n\n if (i === 0) {\n return `${bytes} B`;\n }\n\n const digits = value >= 100 ? 0 : value >= 10 ? 1 : 2;\n return `${value.toFixed(digits)} ${units[i]}`;\n}\n","import type { AXValidationRuleOptions } from '@acorex/core/validation';\nimport type { AXFileTypeContext, AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport type { AXFileOpenResult } from './file-type.open';\nimport type { AXFileTypeComponent } from './file-type.renderer';\n\n/** Metadata key for catalog usage context. */\nexport const AX_FILE_TYPE_METADATA_PURPOSE = 'purpose' as const;\n\n/** Catalog metadata bag; `purpose` lists usage contexts (e.g. `['system']`). */\nexport type AXFileTypeMetadata = Record<string, unknown> & {\n [AX_FILE_TYPE_METADATA_PURPOSE]?: string[];\n};\n\n/** Filter catalog entries by {@link AX_FILE_TYPE_METADATA_PURPOSE}. */\nexport interface AXFileTypeQuery {\n purpose?: string | string[];\n}\n\n/** Generic rule executed via {@link AXValidationService}. */\nexport interface AXFileValidationRule {\n rule: string;\n options?: AXValidationRuleOptions;\n}\n\n/**\n * Common file constraints shared by {@link AXFileType} and {@link AXFileTypeExtension}.\n * Extension `validations` override the parent type field-by-field when merged.\n */\nexport interface AXFileValidations {\n mimeTypes?: string[];\n minSize?: number;\n maxSize?: number;\n rules?: AXFileValidationRule[];\n}\n\ntype AXFileTypeUtilities = Record<\n string,\n (ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\n>;\n\n/**\n * Logical file category (image, video, …).\n *\n * - With type `validations` set: any file matching those rules is allowed; `extensions` only override when matched.\n * - With empty / omitted `validations` and `extensions` listed: only those extensions are allowed.\n */\nexport interface AXFileType<T extends AXFileTypeUtilities = AXFileTypeUtilities> {\n name: string;\n title?: string;\n icon?: string;\n metadata?: AXFileTypeMetadata;\n validations?: AXFileValidations;\n extensions?: AXFileTypeExtension<T>[];\n /** Dynamic utility functions available for this file type. */\n utilities?: T;\n paste?: () => Promise<unknown>;\n /**\n * Produce copyable content from a payload (does not write to the clipboard).\n * Returns a plain string or {@link AXFileCopyData} with `text` and optional `meta`.\n */\n copy?: (payload: unknown) => Promise<AXFileCopyResult> | AXFileCopyResult;\n /**\n * Open or preview a payload (e.g. navigate, show a dialog).\n * Invoke via {@link runFileTypeOpen} so `inject()` works in the caller's context.\n */\n open?: (\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\n /** Optional view component (eager class or lazy `() => import(...)`) for this file type's payload. */\n component?: AXFileTypeComponent;\n}\n\n/** Extension entry — {@link AXFileType} without nested `extensions`. */\nexport type AXFileTypeExtension<T extends AXFileTypeUtilities = AXFileTypeUtilities> = Omit<\n AXFileType<T>,\n 'extensions'\n>;\n","import type { AXFileType } from './file-type.models';\nimport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nexport { AX_FILE_TYPE_METADATA_PURPOSE } from './file-type.models';\n\nconst CONVERSATION_NAME_PREFIX = 'conversation-';\n\nexport function getFileTypePurposes(type: AXFileType): string[] {\n const raw = type.metadata?.[AX_FILE_TYPE_METADATA_PURPOSE];\n if (Array.isArray(raw)) {\n const values = raw.filter((entry): entry is string => typeof entry === 'string' && entry.trim().length > 0);\n if (values.length) {\n return values;\n }\n }\n if (type.name.startsWith(CONVERSATION_NAME_PREFIX)) {\n return ['conversation'];\n }\n return ['system'];\n}\n\nexport function fileTypeMatchesPurpose(type: AXFileType, purpose: string | string[]): boolean {\n const allowed = Array.isArray(purpose) ? purpose : [purpose];\n return getFileTypePurposes(type).some((entry) => allowed.includes(entry));\n}\n\nexport function filterFileTypesByPurpose(types: AXFileType[], purpose?: string | string[]): AXFileType[] {\n if (!purpose) {\n return types;\n }\n return types.filter((type) => fileTypeMatchesPurpose(type, purpose));\n}\n\nexport function createFileTypeMetadata(purpose: string | string[]): NonNullable<AXFileType['metadata']> {\n const values = (Array.isArray(purpose) ? purpose : [purpose]).filter(\n (entry): entry is string => typeof entry === 'string' && entry.trim().length > 0,\n );\n return { [AX_FILE_TYPE_METADATA_PURPOSE]: values };\n}\n","/** Structured copy payload from {@link AXFileType.copy}. */\nexport interface AXFileCopyData {\n /** Primary plain-text value for clipboard or previews. */\n text: string;\n /** Optional type-specific metadata for consumers (URLs, names, mime types, …). */\n meta?: Record<string, unknown>;\n}\n\n/** Return value of {@link AXFileType.copy} — shorthand string or structured data. */\nexport type AXFileCopyResult = string | AXFileCopyData | null | undefined;\n\n/** Resolves clipboard/plain text from a copy result. */\nexport function resolveFileCopyText(result: AXFileCopyResult): string | null {\n if (result == null) {\n return null;\n }\n if (typeof result === 'string') {\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n const trimmed = result.text?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n}\n","import type { AXFileType, AXFileTypeExtension, AXFileValidations } from './file-type.models';\n\n/** Merges type-level validations with extension overrides (extension wins per field). */\nexport function mergeFileValidations(\n base: AXFileValidations,\n override?: Partial<AXFileValidations>,\n): AXFileValidations {\n if (!override) {\n return { ...base };\n }\n\n return {\n mimeTypes: override.mimeTypes ?? base.mimeTypes,\n minSize: override.minSize ?? base.minSize,\n maxSize: override.maxSize ?? base.maxSize,\n rules: override.rules ?? base.rules,\n };\n}\n\n/** Resolved validations for a type + optional extension entry. */\nexport function resolveFileValidations(type: AXFileType, extension?: AXFileTypeExtension): AXFileValidations {\n return mergeFileValidations(type.validations ?? {}, extension?.validations);\n}\n\n/** True when no mime/size/rules are defined on the type. */\nexport function isEmptyFileValidations(validations?: AXFileValidations): boolean {\n if (!validations) {\n return true;\n }\n return (\n (validations.mimeTypes?.length ?? 0) === 0 &&\n validations.minSize == null &&\n validations.maxSize == null &&\n (validations.rules?.length ?? 0) === 0\n );\n}\n\n/**\n * Extension-only mode: empty type `validations` and a non-empty `extensions` list.\n * Files must match a listed extension; rules come from that extension entry.\n */\nexport function isExtensionsOnlyType(type: AXFileType): boolean {\n return isEmptyFileValidations(type.validations) && (type.extensions?.length ?? 0) > 0;\n}\n\n/** File extension from name (lowercase, no dot). */\nexport function getFileExtension(fileName: string): string {\n const parts = fileName.trim().split('.');\n return parts.length > 1 ? (parts.pop()?.toLowerCase() ?? '') : '';\n}\n","import type { InputSignal, Signal, Type } from '@angular/core';\n\n/**\n * View component for a file type — either an Angular component class or a lazy loader.\n *\n * @example\n * ```ts\n * // eager\n * component: ImageViewerComponent,\n *\n * // lazy\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\n * ```\n */\nexport type AXFileTypeComponent =\n | Type<AXFileTypeViewComponent>\n | (() => Promise<Type<AXFileTypeViewComponent>>);\n\n/**\n * Recommended contract for file-type view components.\n * Implement `readonly payload = input.required<TPayload>()` in new components.\n */\nexport interface AXFileTypeViewComponent<TPayload = unknown> {\n readonly payload: InputSignal<TPayload> | Signal<TPayload>;\n}\n\n/** Resolves a {@link AXFileTypeComponent} to an Angular component type. */\nexport async function resolveFileTypeComponentType(\n component: AXFileTypeComponent,\n): Promise<Type<unknown>> {\n if (isLazyFileTypeComponentLoader(component)) {\n return component();\n }\n return component;\n}\n\n/** Whether `value` is a lazy loader rather than an Angular component class. */\nexport function isLazyFileTypeComponentLoader(\n value: AXFileTypeComponent,\n): value is () => Promise<Type<AXFileTypeViewComponent>> {\n return typeof value === 'function' && !('ɵcmp' in value);\n}\n","import type { Type } from '@angular/core';\n\nimport type { AXFileTypeContext } from './file-type.context';\nimport type { AXFileCopyResult } from './file-type.copy';\nimport { getFileExtension } from './file-type.merge';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport type { AXFileTypeComponent } from './file-type.renderer';\nimport { resolveFileTypeComponentType } from './file-type.renderer';\n\n/** Hint for resolving a catalog extension entry. */\nexport interface AXFileTypeExtensionHint {\n file?: File;\n extensionName?: string;\n mimeType?: string;\n}\n\n/** Matches a MIME type against a catalog pattern (`image/*`, exact type, …). */\nexport function matchesFileMime(mime: string, pattern: string): boolean {\n const normalizedMime = mime.trim().toLowerCase();\n const normalizedPattern = pattern.trim().toLowerCase();\n\n if (!normalizedPattern || normalizedPattern === '*/*' || normalizedPattern === '*') {\n return true;\n }\n\n if (normalizedPattern.endsWith('/*')) {\n const category = normalizedPattern.slice(0, -2);\n return normalizedMime.startsWith(`${category}/`) || (normalizedMime === '' && category === 'application');\n }\n\n return normalizedMime === normalizedPattern;\n}\n\n/** Finds an extension entry by its `name` (without dot). */\nexport function findFileTypeExtensionByName(\n type: AXFileType,\n extensionName: string,\n): AXFileTypeExtension | undefined {\n const ext = extensionName.replace(/^\\./, '').trim().toLowerCase();\n if (!ext || !type.extensions?.length) {\n return undefined;\n }\n return type.extensions.find((entry) => entry.name.toLowerCase() === ext);\n}\n\n/** Finds an extension entry whose validations include the given MIME type. */\nexport function findFileTypeExtensionForMime(\n type: AXFileType,\n mimeType: string,\n): AXFileTypeExtension | undefined {\n const mime = mimeType.trim().toLowerCase();\n if (!mime || !type.extensions?.length) {\n return undefined;\n }\n\n return type.extensions.find((entry) =>\n entry.validations?.mimeTypes?.some((pattern) => matchesFileMime(mime, pattern)),\n );\n}\n\n/** Matching extension entry for a file within a type, if any. */\nexport function findFileTypeExtension(file: File, type: AXFileType): AXFileTypeExtension | undefined {\n return resolveFileTypeExtension(type, { file });\n}\n\n/** Resolves the best-matching extension entry for a file or hint. */\nexport function resolveFileTypeExtension(\n type: AXFileType,\n hint?: AXFileTypeExtensionHint,\n): AXFileTypeExtension | undefined {\n if (!hint) {\n return undefined;\n }\n\n if (hint.file) {\n const byFileName = findFileTypeExtensionByName(type, getFileExtension(hint.file.name));\n if (byFileName) {\n return byFileName;\n }\n if (hint.file.type) {\n const byFileMime = findFileTypeExtensionForMime(type, hint.file.type);\n if (byFileMime) {\n return byFileMime;\n }\n }\n }\n\n if (hint.extensionName) {\n const byName = findFileTypeExtensionByName(type, hint.extensionName);\n if (byName) {\n return byName;\n }\n }\n\n if (hint.mimeType) {\n return findFileTypeExtensionForMime(type, hint.mimeType);\n }\n\n return undefined;\n}\n\nexport function resolveFileTypeCopy(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['copy'] | undefined {\n return extension?.copy ?? type.copy;\n}\n\nexport function resolveFileTypeOpen(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['open'] | undefined {\n return extension?.open ?? type.open;\n}\n\nexport function resolveFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['component'] | undefined {\n return extension?.component ?? type.component;\n}\n\n/** Loads the resolved view component (extension override first). */\nexport async function loadFileTypeComponent(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<Type<unknown> | undefined> {\n const component = resolveFileTypeComponent(type, extension);\n if (!component) {\n return undefined;\n }\n return resolveFileTypeComponentType(component);\n}\n\nexport function resolveFileTypePaste(\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): AXFileType['paste'] | undefined {\n return extension?.paste ?? type.paste;\n}\n\nexport function resolveFileTypeUtility(\n type: AXFileType,\n extension: AXFileTypeExtension | undefined,\n name: string,\n): ((ctx: AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown) | undefined {\n const fromExtension = extension?.utilities?.[name];\n if (fromExtension) {\n return fromExtension;\n }\n return type.utilities?.[name];\n}\n\n/** Runs `copy` from extension first, then parent type. */\nexport async function runFileTypeCopy(\n type: AXFileType,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileCopyResult> {\n const copy = resolveFileTypeCopy(type, extension);\n if (!copy) {\n return undefined;\n }\n return copy(payload);\n}\n\n/** Runs a utility from extension first, then parent type. */\nexport function runFileTypeUtility(\n type: AXFileType,\n ctx: AXFileTypeContext,\n extension: AXFileTypeExtension | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const utility = resolveFileTypeUtility(type, extension, name);\n if (!utility) {\n return undefined;\n }\n return utility(ctx, ...args);\n}\n\n/** Runs a catalog utility with optional file-based extension resolution. */\nexport function runFileTypeUtilityForFile(\n type: AXFileType,\n ctx: AXFileTypeContext,\n file: File | undefined,\n name: string,\n ...args: unknown[]\n): Promise<unknown> | unknown {\n const extension = file ? findFileTypeExtension(file, type) : undefined;\n return runFileTypeUtility(type, ctx, extension, name, file, ...args);\n}\n","import { runInInjectionContext } from '@angular/core';\n\nimport type { AXFileTypeOpenContext } from './file-type.context';\nimport type { AXFileType, AXFileTypeExtension } from './file-type.models';\nimport { resolveFileTypeOpen } from './file-type.resolve';\n\n/** Result of {@link AXFileType.open}; `false` means the payload was not opened. */\nexport type AXFileOpenResult = void | boolean | null | undefined;\n\n/** Runs `open` from extension first, then parent type, in the caller's injection context. */\nexport function runFileTypeOpen(\n type: AXFileType,\n ctx: AXFileTypeOpenContext,\n payload: unknown,\n extension?: AXFileTypeExtension,\n): Promise<AXFileOpenResult> | AXFileOpenResult {\n const open = resolveFileTypeOpen(type, extension);\n if (!open) {\n return false;\n }\n return runInInjectionContext(ctx.injector, () => open(ctx, payload));\n}\n","import type { Type } from '@angular/core';\r\r\n\r\r\nimport type { AXFileCopyResult } from './file-type.copy';\r\r\nimport type { AXFileType, AXFileTypeExtension, AXFileValidations, AXFileTypeMetadata } from './file-type.models';\r\r\nimport type { AXFileOpenResult } from './file-type.open';\r\r\nimport type { AXFileTypeOpenContext } from './file-type.context';\r\r\nimport type { AXFileTypeComponent } from './file-type.renderer';\r\r\n\r\r\ntype AXFileTypeUtilities = Record<\r\r\n string,\r\r\n (ctx: import('./file-type.context').AXFileTypeContext, ...args: unknown[]) => Promise<unknown> | unknown\r\r\n>;\r\r\n\r\r\n/** Config for {@link defineFileType}. */\r\r\nexport interface DefineFileTypeConfig<\r\r\n TPayload = unknown,\r\r\n TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities,\r\r\n> {\r\r\n name: string;\r\r\n title?: string;\r\r\n icon?: string;\r\r\n metadata?: AXFileTypeMetadata;\r\r\n validations?: AXFileValidations;\r\r\n extensions?: AXFileTypeExtension<TUtilities>[];\r\r\n utilities?: TUtilities;\r\r\n paste?: AXFileType<TUtilities>['paste'];\r\r\n copy?: (payload: TPayload) => Promise<AXFileCopyResult> | AXFileCopyResult;\r\r\n open?: (\r\r\n ctx: AXFileTypeOpenContext,\r\r\n payload: TPayload,\r\r\n ) => Promise<AXFileOpenResult> | AXFileOpenResult;\r\r\n /** Eager component class or lazy `() => import(...).then(m => m.Component)`. */\r\r\n component?: AXFileTypeComponent;\r\r\n}\r\r\n\r\r\n/**\r\r\n * Builds an {@link AXFileType} with optional typed handlers and view component.\r\r\n *\r\r\n * @example\r\r\n * ```ts\r\r\n * export const imageFileType = defineFileType<ImagePayload>({\r\r\n * name: 'image',\r\r\n * copy: (p) => p.caption ?? p.url,\r\r\n * component: () => import('./image-viewer.component').then(m => m.ImageViewerComponent),\r\r\n * });\r\r\n * ```\r\r\n */\r\r\nexport function defineFileType<TPayload = unknown, TUtilities extends AXFileTypeUtilities = AXFileTypeUtilities>(\r\r\n config: DefineFileTypeConfig<TPayload, TUtilities>,\r\r\n): AXFileType<TUtilities> {\r\r\n const { copy, open, ...rest } = config;\r\r\n\r\r\n return {\r\r\n ...rest,\r\r\n ...(copy ? { copy: copy as AXFileType<TUtilities>['copy'] } : {}),\r\r\n ...(open ? { open: open as AXFileType<TUtilities>['open'] } : {}),\r\r\n };\r\r\n}\r\r\n\r","import { InjectionToken, Provider, Type } from '@angular/core';\nimport type { AXFileType } from './file-type.models';\n\n/** Contributes {@link AXFileType} entries (multi provider). */\nexport abstract class AXFileTypeInfoProvider {\n abstract items(): Promise<AXFileType[]>;\n}\n\nexport const AX_FILE_TYPE_INFO_PROVIDER = new InjectionToken<AXFileTypeInfoProvider[]>('AX_FILE_TYPE_INFO_PROVIDER');\n\nexport function provideFileTypeInfoProvider(provider: Type<AXFileTypeInfoProvider>): Provider {\n return {\n provide: AX_FILE_TYPE_INFO_PROVIDER,\n useClass: provider,\n multi: true,\n };\n}\n","import { Injectable, Provider } from '@angular/core';\n\nimport type { AXFileType } from './file-type.models';\nimport { AXFileTypeInfoProvider, provideFileTypeInfoProvider } from './file-type-info-provider';\n\n/** Registers static file types via the existing {@link AXFileTypeInfoProvider} multi-token. */\nexport function provideFileTypes(types: AXFileType[] | (() => AXFileType[] | Promise<AXFileType[]>)): Provider {\n @Injectable()\n class AXStaticFileTypeProvider extends AXFileTypeInfoProvider {\n override items(): Promise<AXFileType[]> {\n const value = typeof types === 'function' ? types() : types;\n return Promise.resolve(value);\n }\n }\n\n return provideFileTypeInfoProvider(AXStaticFileTypeProvider);\n}\n","import { AXValidationService, type AXValidationRuleResult } from '@acorex/core/validation';\nimport {\n getFileExtension,\n isExtensionsOnlyType,\n resolveFileValidations,\n} from './file-type.merge';\nimport { findFileTypeExtension } from './file-type.resolve';\nimport type { AXFileType, AXFileTypeExtension, AXFileValidationRule, AXFileValidations } from './file-type.models';\n\n/** Maps {@link AXFileValidations} to executable validation entries. */\nexport function fileValidationsToRules(validations: AXFileValidations): AXFileValidationRule[] {\n const rules: AXFileValidationRule[] = [];\n\n if (validations.mimeTypes?.length) {\n rules.push({\n rule: 'fileMimeType',\n options: { allowed: validations.mimeTypes },\n });\n }\n\n if (validations.minSize != null) {\n rules.push({\n rule: 'fileMinSize',\n options: { minSize: validations.minSize },\n });\n }\n\n if (validations.maxSize != null) {\n rules.push({\n rule: 'fileMaxSize',\n options: { maxSize: validations.maxSize },\n });\n }\n\n if (validations.rules?.length) {\n rules.push(...validations.rules);\n }\n\n return rules;\n}\n\n/** Failed validation results; empty array means the file is valid. */\nexport async function validateFileWithValidations(\n validation: AXValidationService,\n file: File,\n validations: AXFileValidations,\n): Promise<AXValidationRuleResult[]> {\n const entries = fileValidationsToRules(validations);\n const errors: AXValidationRuleResult[] = [];\n\n for (const { rule, options } of entries) {\n const result = await validation.validate(rule, file, options);\n if (!result.result) {\n errors.push(result);\n }\n }\n\n return errors;\n}\n\n/** Validates a file against a type; extension rules override when the file name matches. */\nexport async function validateFileAgainstType(\n validation: AXValidationService,\n file: File,\n type: AXFileType,\n extension?: AXFileTypeExtension,\n): Promise<AXValidationRuleResult[]> {\n const matchedExtension = extension ?? findFileTypeExtension(file, type);\n\n if (isExtensionsOnlyType(type) && !matchedExtension) {\n const ext = getFileExtension(file.name);\n return [\n {\n rule: 'fileExtension',\n result: false,\n message: ext ? `Extension \".${ext}\" is not allowed.` : 'File must have an allowed extension.',\n value: ext,\n },\n ];\n }\n\n const resolved = resolveFileValidations(type, matchedExtension);\n return validateFileWithValidations(validation, file, resolved);\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMaxSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Maximum size in bytes. */\n maxSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMaxSize: AXFileMaxSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMaxSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMaxSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMaxSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size <= options.maxSize;\n const limitLabel = formatFileSizeBytes(options.maxSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ??\n `File is too large. Maximum size is ${limitLabel}.`),\n value: size,\n maxSize: options.maxSize,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\n\nexport interface AXFileMimeTypeValidationRuleOptions extends AXValidationRuleOptions {\n /** MIME patterns, e.g. `image/*`, `image/png`. */\n allowed: string[];\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMimeType: AXFileMimeTypeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMimeTypeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMimeType';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMimeTypeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const mime = (value instanceof File || value instanceof Blob ? value.type : '').trim().toLowerCase();\n const allowed = options.allowed ?? [];\n const valid =\n allowed.length === 0 ||\n allowed.some((pattern) => this.matchesMime(mime, pattern.trim().toLowerCase()));\n\n return {\n rule: this.name,\n result: valid,\n message: valid ? '' : (options.message ?? 'File type is not allowed.'),\n value: mime,\n };\n }\n\n private matchesMime(mime: string, pattern: string): boolean {\n if (!pattern || pattern === '*/*' || pattern === '*') {\n return true;\n }\n if (pattern.endsWith('/*')) {\n const category = pattern.slice(0, -2);\n return mime.startsWith(`${category}/`) || (mime === '' && category === 'application');\n }\n return mime === pattern;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n AXValidationRule,\n AXValidationRuleOptions,\n AXValidationRuleResult,\n} from '@acorex/core/validation';\nimport { formatFileSizeBytes } from '../../format-file-size';\n\nexport interface AXFileMinSizeValidationRuleOptions extends AXValidationRuleOptions {\n /** Minimum size in bytes. */\n minSize: number;\n}\n\ndeclare module '@acorex/core/validation' {\n interface AXValidationRuleOptionsMap {\n fileMinSize: AXFileMinSizeValidationRuleOptions;\n }\n}\n\n@Injectable()\nexport class AXFileMinSizeValidationRule implements AXValidationRule {\n get name(): string {\n return 'fileMinSize';\n }\n\n async validate(\n value: File | Blob,\n options: AXFileMinSizeValidationRuleOptions,\n ): Promise<AXValidationRuleResult> {\n const size = value instanceof File || value instanceof Blob ? value.size : 0;\n const valid = size >= options.minSize;\n const limitLabel = formatFileSizeBytes(options.minSize);\n\n return {\n rule: this.name,\n result: valid,\n message: valid\n ? ''\n : (options.message ?? `File is too small. Minimum size is ${limitLabel}.`),\n value: size,\n minSize: options.minSize,\n };\n }\n}\n","import { AXValidationRegistryService } from '@acorex/core/validation';\nimport { AXFileMaxSizeValidationRule } from './rules/file-max-size.rule';\nimport { AXFileMimeTypeValidationRule } from './rules/file-mime-type.rule';\nimport { AXFileMinSizeValidationRule } from './rules/file-min-size.rule';\n\n/** Validation rule classes to register with {@link AXValidationModule}. */\nexport const AX_FILE_VALIDATION_RULES = [\n AXFileMimeTypeValidationRule,\n AXFileMinSizeValidationRule,\n AXFileMaxSizeValidationRule,\n] as const;\n\nlet fileValidationRulesRegistered = false;\n\n/** Idempotent registration for bootstrap providers and first validation call. */\nexport function ensureFileValidationRules(registry: AXValidationRegistryService): void {\n if (fileValidationRulesRegistered) {\n return;\n }\n registry.register(...AX_FILE_VALIDATION_RULES);\n fileValidationRulesRegistered = true;\n}\n","import { AXValidationRegistryService, AXValidationService, type AXValidationRuleResult } from '@acorex/core/validation';\n\nimport { inject, Injectable, Type } from '@angular/core';\n\nimport { AX_FILE_TYPE_INFO_PROVIDER } from './file-type-info-provider';\n\nimport {\n findFileTypeExtension,\n loadFileTypeComponent,\n matchesFileMime,\n resolveFileTypeComponent,\n resolveFileTypeExtension,\n type AXFileTypeExtensionHint,\n} from './file-type.resolve';\n\nimport type { AXFileType, AXFileTypeQuery } from './file-type.models';\n\nimport { filterFileTypesByPurpose } from './file-type.metadata';\n\nimport { validateFileAgainstType } from './file-type.validate';\nimport { ensureFileValidationRules } from './file-validation-rules.bootstrap';\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileTypeRegistryService {\n private readonly validation = inject(AXValidationService);\n private readonly validationRegistry = inject(AXValidationRegistryService);\n\n private readonly providers = inject(AX_FILE_TYPE_INFO_PROVIDER, { optional: true }) ?? [];\n\n private readonly registeredTypes: AXFileType[] = [];\n\n private cache: AXFileType[] | null = null;\n\n /** Registers or replaces catalog entries (e.g. from feature bootstrap). */\n\n registerTypes(types: AXFileType[]): void {\n for (const type of types) {\n const index = this.registeredTypes.findIndex((t) => t.name === type.name);\n\n if (index >= 0) {\n this.registeredTypes[index] = type;\n } else {\n this.registeredTypes.push(type);\n }\n }\n\n this.invalidateCache();\n }\n\n invalidateCache(): void {\n this.cache = null;\n }\n\n private async resolveTypes(): Promise<AXFileType[]> {\n if (this.cache) {\n return this.cache;\n }\n\n const byName = new Map<string, AXFileType>();\n\n if (this.providers.length) {\n const batches = await Promise.all(this.providers.map((p) => p.items()));\n\n for (const batch of batches) {\n for (const type of batch) {\n if (!byName.has(type.name)) {\n byName.set(type.name, type);\n }\n }\n }\n }\n\n for (const type of this.registeredTypes) {\n byName.set(type.name, type);\n }\n\n this.cache = [...byName.values()];\n\n return this.cache;\n }\n\n async getTypes(query?: AXFileTypeQuery): Promise<AXFileType[]> {\n const types = await this.resolveTypes();\n return filterFileTypesByPurpose(types, query?.purpose);\n }\n\n async get(name: string): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n return types.find((t) => t.name === name);\n }\n\n /** Resolved view component ref for a catalog entry (optional extension hint). */\n async getComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<AXFileType['component'] | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return resolveFileTypeComponent(type, extension);\n }\n\n /** Loads the view component for a catalog entry. */\n async loadComponent(name: string, hint?: AXFileTypeExtensionHint): Promise<Type<unknown> | undefined> {\n const type = await this.get(name);\n if (!type) {\n return undefined;\n }\n const extension = hint ? resolveFileTypeExtension(type, hint) : undefined;\n return loadFileTypeComponent(type, extension);\n }\n\n async accept(typeNames?: string | string[]): Promise<string> {\n const names = typeNames ? (Array.isArray(typeNames) ? typeNames : [typeNames]) : undefined;\n\n const types = await this.resolveTypes();\n\n const selected = names?.length ? types.filter((t) => names.includes(t.name)) : types;\n\n if (names?.length && selected.length === 0) {\n return '';\n }\n\n const parts = new Set<string>();\n\n for (const type of selected) {\n type.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n type.extensions?.forEach((ext) => {\n ext.validations?.mimeTypes?.forEach((m) => parts.add(m));\n\n parts.add(`.${ext.name.replace(/^\\./, '')}`);\n });\n }\n\n return [...parts].join(',');\n }\n\n async matchType(file: File): Promise<AXFileType | undefined> {\n const types = await this.resolveTypes();\n\n const mime = file.type.trim().toLowerCase();\n\n return types.find((type) => {\n const patterns = [\n ...(type.validations?.mimeTypes ?? []),\n\n ...(type.extensions?.flatMap((e) => e.validations?.mimeTypes ?? []) ?? []),\n ];\n\n if (!patterns.length) {\n return false;\n }\n\n return patterns.some((pattern) => matchesFileMime(mime, pattern));\n });\n }\n\n async validate(file: File, typeName: string): Promise<AXValidationRuleResult[]> {\n ensureFileValidationRules(this.validationRegistry);\n\n const type = await this.get(typeName);\n\n if (!type) {\n return [\n {\n rule: 'fileType',\n\n result: false,\n\n message: `Unknown file type: ${typeName}`,\n\n value: typeName,\n },\n ];\n }\n\n const extension = findFileTypeExtension(file, type);\n\n return validateFileAgainstType(this.validation, file, type, extension);\n }\n\n async validateAgainstTypes(\n file: File,\n\n typeNames: string | string[],\n ): Promise<AXValidationRuleResult[]> {\n const names = Array.isArray(typeNames) ? typeNames : [typeNames];\n\n let lastErrors: AXValidationRuleResult[] = [];\n\n for (const name of names) {\n const errors = await this.validate(file, name);\n\n if (errors.length === 0) {\n return [];\n }\n\n lastErrors = errors;\n }\n\n return lastErrors;\n }\n\n async validateMany(\n files: File[],\n\n typeNames: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const accepted: File[] = [];\n\n const rejected: { file: File; errors: AXValidationRuleResult[] }[] = [];\n\n for (const file of files) {\n const errors = await this.validateAgainstTypes(file, typeNames);\n\n if (errors.length === 0) {\n accepted.push(file);\n } else {\n rejected.push({ file, errors });\n }\n }\n\n return { accepted, rejected };\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { Component, effect, inject, input, signal, type Type } from '@angular/core';\n\nimport { AXFileTypeRegistryService } from '../file-type/file-type-registry.service';\nimport type { AXFileTypeExtensionHint } from '../file-type/file-type.resolve';\n\n@Component({\n selector: 'ax-file-type-renderer',\n\n imports: [NgComponentOutlet],\n template: `\n @if (resolvedComponent(); as component) {\n <ng-container *ngComponentOutlet=\"component; inputs: mergedInputs()\" />\n } @else if (loading()) {\n <span class=\"ax-file-type-renderer__loading\" aria-hidden=\"true\"></span>\n }\n `,\n styles: `\n :host {\n display: contents;\n }\n\n .ax-file-type-renderer__loading {\n display: inline-block;\n min-height: 1rem;\n min-width: 1rem;\n }\n `,\n})\nexport class AXFileTypeRendererOutletComponent {\n private readonly registry = inject(AXFileTypeRegistryService);\n\n /** Catalog name (e.g. `image`, `conversation-image`). */\n readonly fileType = input.required<string>();\n\n /** Payload passed to the file-type view component. */\n readonly payload = input.required<unknown>();\n\n /** Optional extension / MIME hint for extension-level renderer overrides. */\n readonly extensionHint = input<AXFileTypeExtensionHint>();\n\n /** Extra inputs merged with `payload` (e.g. `message` in conversation). */\n readonly inputs = input<Record<string, unknown>>({});\n\n readonly resolvedComponent = signal<Type<unknown> | null>(null);\n readonly loading = signal(false);\n\n readonly mergedInputs = signal<Record<string, unknown>>({});\n\n constructor() {\n effect(() => {\n const name = this.fileType();\n const payload = this.payload();\n const hint = this.extensionHint();\n const extra = this.inputs();\n\n this.mergedInputs.set({ payload, ...extra });\n this.loading.set(true);\n this.resolvedComponent.set(null);\n\n void this.registry.loadComponent(name, hint).then((component) => {\n this.resolvedComponent.set(component ?? null);\n this.loading.set(false);\n });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_AUDIO_FILE_TYPE: AXFileType = {\n name: 'audio',\n metadata: createFileTypeMetadata('system'),\n title: 'Audio',\n icon: 'fa-light fa-music ax-text-amber-500',\n validations: {\n mimeTypes: ['audio/*'],\n minSize: 1,\n maxSize: 50 * MB,\n },\n extensions: [\n { name: 'mp3', title: 'MP3' },\n { name: 'wav', title: 'WAV', validations: { maxSize: 30 * MB } },\n { name: 'ogg', title: 'OGG' },\n { name: 'm4a', title: 'M4A' },\n ],\n};\n\n@Injectable()\nexport class AXAudioFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_AUDIO_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\n/** Extension-only: no type `validations` — only listed extensions are allowed. */\nexport const AX_DOCUMENT_FILE_TYPE: AXFileType = {\n name: 'document',\n metadata: createFileTypeMetadata('system'),\n title: 'Document',\n icon: 'fa-light fa-file-lines ax-text-red-500',\n extensions: [{ name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 5 * MB } }],\n};\n\n@Injectable()\nexport class AXDocumentFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_DOCUMENT_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_FILE_FILE_TYPE: AXFileType = {\n name: 'file',\n metadata: createFileTypeMetadata('system'),\n title: 'File',\n icon: 'fa-light fa-file ax-text-neutral-500',\n validations: {\n mimeTypes: ['application/*', 'text/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'pdf', title: 'PDF', validations: { mimeTypes: ['application/pdf'], maxSize: 25 * MB } },\n { name: 'doc', title: 'Word' },\n { name: 'docx', title: 'Word' },\n { name: 'txt', title: 'Text', validations: { mimeTypes: ['text/plain'], maxSize: 5 * MB } },\n { name: 'zip', title: 'ZIP', validations: { maxSize: 50 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXFileFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_FILE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_IMAGE_FILE_TYPE: AXFileType = {\n name: 'image',\n metadata: createFileTypeMetadata('system'),\n title: 'Image',\n icon: 'fa-light fa-image ax-text-purple-500',\n validations: {\n mimeTypes: ['image/*'],\n minSize: 1,\n maxSize: 100 * MB,\n },\n extensions: [\n { name: 'jpg', title: 'JPEG' },\n { name: 'jpeg', title: 'JPEG', validations: { maxSize: 5 * MB } },\n { name: 'png', title: 'PNG' },\n { name: 'gif', title: 'GIF' },\n { name: 'webp', title: 'WebP' },\n { name: 'svg', title: 'SVG', validations: { maxSize: 2 * MB } },\n ],\n};\n\n@Injectable()\nexport class AXImageFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_IMAGE_FILE_TYPE]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { createFileTypeMetadata } from '../file-type.metadata';\nimport type { AXFileType } from '../file-type.models';\n\nconst MB = 1024 * 1024;\n\nexport const AX_VIDEO_FILE_TYPE: AXFileType = {\n name: 'video',\n metadata: createFileTypeMetadata('system'),\n title: 'Video',\n icon: 'fa-light fa-video ax-text-blue-500',\n validations: {\n mimeTypes: ['video/*'],\n minSize: 1,\n maxSize: 500 * MB,\n },\n extensions: [\n { name: 'mp4', title: 'MP4' },\n { name: 'webm', title: 'WebM', validations: { maxSize: 200 * MB } },\n { name: 'ogg', title: 'OGG' },\n ],\n};\n\n@Injectable()\nexport class AXVideoFileTypeProvider extends AXFileTypeInfoProvider {\n items(): Promise<AXFileType[]> {\n return Promise.resolve([AX_VIDEO_FILE_TYPE]);\n }\n}\n","import { Provider, Type } from '@angular/core';\nimport { provideFileTypeInfoProvider, AXFileTypeInfoProvider } from '../file-type-info-provider';\nimport { AXAudioFileTypeProvider } from './audio-file-type.provider';\nimport { AXDocumentFileTypeProvider } from './document-file-type.provider';\nimport { AXFileFileTypeProvider } from './file-file-type.provider';\nimport { AXImageFileTypeProvider } from './image-file-type.provider';\nimport { AXVideoFileTypeProvider } from './video-file-type.provider';\n\nexport * from './image-file-type.provider';\nexport * from './video-file-type.provider';\nexport * from './audio-file-type.provider';\nexport * from './file-file-type.provider';\nexport * from './document-file-type.provider';\n\n/** Built-in file type provider classes (one logical type per provider). */\nexport const AX_BUILTIN_FILE_TYPE_PROVIDERS = [\n AXImageFileTypeProvider,\n AXVideoFileTypeProvider,\n AXAudioFileTypeProvider,\n AXFileFileTypeProvider,\n AXDocumentFileTypeProvider,\n] as const satisfies readonly Type<AXFileTypeInfoProvider>[];\n\n/** Registers all built-in file type providers (image, video, audio, file, document). */\nexport function provideBuiltinFileTypeProviders(): Provider[] {\n return AX_BUILTIN_FILE_TYPE_PROVIDERS.map((provider) => provideFileTypeInfoProvider(provider));\n}\n\n/** @deprecated Use {@link provideBuiltinFileTypeProviders}. */\nexport const provideDefaultFileTypeProviders = provideBuiltinFileTypeProviders;\n","export * from './file-type.metadata';\r\r\nexport * from './file-type.models';\r\r\nexport * from './file-type.context';\r\r\nexport * from './file-type.copy';\r\r\nexport * from './file-type.open';\r\r\nexport * from './file-type.resolve';\r\r\nexport * from './file-type.renderer';\r\r\nexport * from './file-type.define';\r\r\nexport * from './file-type.providers';\r\r\nexport * from './file-type-renderer-outlet.component';\r\r\nexport * from './file-type-info-provider';\r\r\nexport * from './file-type-registry.service';\r\r\nexport * from './file-type.merge';\r\r\nexport * from './file-type.validate';\r\r\nexport * from './types.providers';\r\r\nexport * from './rules/file-mime-type.rule';\r\r\nexport * from './rules/file-min-size.rule';\r\r\nexport * from './rules/file-max-size.rule';\r\r\nexport * from './file-validation-rules.bootstrap';\r\r\n\r\r\nimport { Provider } from '@angular/core';\r\r\nimport { AXValidationRegistryService } from '@acorex/core/validation';\r\r\nimport { provideBuiltinFileTypeProviders } from './types.providers';\r\r\nimport { AX_FILE_VALIDATION_RULES, ensureFileValidationRules } from './file-validation-rules.bootstrap';\r\r\n\r\r\nexport { AX_FILE_VALIDATION_RULES } from './file-validation-rules.bootstrap';\r\r\n\r\r\n/** Registers file validation rules with {@link AXValidationRegistryService}. */\r\r\nexport function provideFileValidationRules(): Provider {\r\r\n return {\r\r\n provide: 'AXValidationModuleFactory',\r\r\n useFactory: (registry: AXValidationRegistryService) => () => {\r\r\n ensureFileValidationRules(registry);\r\r\n },\r\r\n deps: [AXValidationRegistryService],\r\r\n multi: true,\r\r\n };\r\r\n}\r\r\n\r\r\n/** Registers built-in image / video / audio / file / document type providers. */\r\r\nexport { provideBuiltinFileTypeProviders, provideDefaultFileTypeProviders } from './types.providers';\r\r\n\r\r\n/**\r\r\n * Registers validation rules and optional built-in file type providers.\r\r\n * {@link AXFileTypeRegistryService} and {@link AXFileService} are `providedIn: 'root'`.\r\r\n */\r\r\nexport function provideFileTypeSystem(): Provider[] {\r\r\n return [provideFileValidationRules(), ...provideBuiltinFileTypeProviders()];\r\r\n}\r\r\n\r","import { AXFormatModule } from '@acorex/core/format';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { AXFileSizeFormatter } from './file-size-formatter';\nimport {\n AX_FILE_VALIDATION_RULES,\n provideDefaultFileTypeProviders,\n provideFileValidationRules,\n} from './file-type';\n\nexport interface AXFileModuleConfig {\n fileTypeProviders?: Provider[];\n includeDefaultFileTypes?: boolean;\n}\n\n@NgModule({\n imports: [\n AXFormatModule.forChild({ formatters: [AXFileSizeFormatter] }),\n AXValidationModule.forChild({ rules: [...AX_FILE_VALIDATION_RULES] }),\n ],\n providers: [AXFileSizeFormatter],\n})\nexport class AXFileModule {\n static forRoot(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n const includeDefaults = config?.includeDefaultFileTypes !== false;\n\n return {\n ngModule: AXFileModule,\n providers: [\n provideFileValidationRules(),\n ...(includeDefaults ? provideDefaultFileTypeProviders() : []),\n ...(config?.fileTypeProviders ?? []),\n ],\n };\n }\n\n static forChild(config?: AXFileModuleConfig): ModuleWithProviders<AXFileModule> {\n return AXFileModule.forRoot(config);\n }\n}\n","import type { AXValidationRuleResult } from '@acorex/core/validation';\nimport { DOCUMENT, inject, Injectable, isDevMode } from '@angular/core';\nimport { AXFileTypeRegistryService } from './file-type/file-type-registry.service';\nimport type { AXFileType } from './file-type/file-type.models';\n\nexport interface AXFileChooseOptions {\n /** Logical type name(s) from {@link AXFileTypeRegistryService}. When set, files are validated against the catalog. */\n fileType?: string | string[];\n accept?: string;\n multiple?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXFileService {\n private readonly document = inject(DOCUMENT);\n private readonly fileTypes = inject(AXFileTypeRegistryService);\n\n async getFileTypes(): Promise<AXFileType[]> {\n return this.fileTypes.getTypes();\n }\n\n async getFileType(name: string): Promise<AXFileType | undefined> {\n return this.fileTypes.get(name);\n }\n\n async getAcceptAttribute(fileType?: string | string[]): Promise<string> {\n return this.fileTypes.accept(fileType);\n }\n\n async matchFileType(file: File): Promise<AXFileType | undefined> {\n return this.fileTypes.matchType(file);\n }\n\n validate(file: File, fileType: string | string[]): Promise<AXValidationRuleResult[]> {\n return this.fileTypes.validateAgainstTypes(file, fileType);\n }\n\n validateMany(\n files: File[],\n fileType: string | string[],\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n return this.fileTypes.validateMany(files, fileType);\n }\n\n /**\n * Opens a file selection dialog.\n * With `fileType`, returns files that pass catalog validation (`accept` defaults from the catalog).\n * Without `fileType`, returns all selected files (legacy `accept` / `multiple` only).\n */\n async chooseValidated(\n options: AXFileChooseOptions,\n ): Promise<{ accepted: File[]; rejected: { file: File; errors: AXValidationRuleResult[] }[] }> {\n const resolved = await this.resolveChooseOptions(options);\n const files = await this.openFileDialog(resolved);\n\n if (files.length === 0) {\n return { accepted: [], rejected: [] };\n }\n\n if (options.fileType) {\n return this.validateMany(files, options.fileType);\n }\n\n return { accepted: files, rejected: [] };\n }\n\n async choose(options: AXFileChooseOptions): Promise<File[]> {\n const { accepted } = await this.chooseValidated(options);\n return accepted;\n }\n\n blobToBase64(blob: Blob): Promise<string> {\n if (!(blob instanceof Blob)) {\n return Promise.reject(new Error('input is not blob'));\n }\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(reader.error);\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n }\n\n getSize(file: File | Blob | string): number | false {\n if (this.isBase64(file as string)) {\n return this.getBase64Size(file as string);\n }\n return false;\n }\n\n isBase64(base64: string): boolean {\n const regx = /[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/;\n return regx.test(base64);\n }\n\n getBase64Size(base64: string): number {\n return atob(base64.substring(base64.indexOf(',') + 1)).length;\n }\n\n private async resolveChooseOptions(\n options: AXFileChooseOptions,\n ): Promise<{ accept: string; multiple: boolean }> {\n const multiple = options.multiple ?? false;\n\n if (options.fileType) {\n const accept = options.accept ?? (await this.getAcceptAttribute(options.fileType));\n\n if (isDevMode() && !accept) {\n const name = Array.isArray(options.fileType) ? options.fileType.join(', ') : options.fileType;\n console.warn(\n `[AXFileService] No accept filter for file type \"${name}\". ` +\n 'Register a file type provider (e.g. provideConversationFileCatalog).',\n );\n }\n\n return { accept, multiple };\n }\n\n return { accept: options.accept ?? '', multiple };\n }\n\n private openFileDialog(options: { accept: string; multiple: boolean }): Promise<File[]> {\n return new Promise<File[]>((resolve, reject) => {\n const input: HTMLInputElement = this.document.createElement('input');\n input.style.display = 'none';\n this.document.body.appendChild(input);\n input.type = 'file';\n input.accept = options.accept;\n input.multiple = options.multiple;\n\n const cleanup = () => {\n input.removeEventListener('change', onChange);\n input.removeEventListener('error', onError);\n if (input.parentNode) {\n this.document.body.removeChild(input);\n }\n input.remove();\n };\n\n const onError = (e: Event) => {\n cleanup();\n reject(e);\n };\n\n const onChange = () => {\n const files = Array.from(input.files ?? []);\n cleanup();\n resolve(files);\n };\n\n input.addEventListener('change', onChange);\n input.addEventListener('error', onError);\n input.click();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["MB"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acorex/core",
3
- "version": "22.0.0-next.9",
3
+ "version": "22.1.0-next.0",
4
4
  "peerDependencies": {
5
5
  "lodash-es": ">=4.17.21",
6
6
  "memoizee": ">=0.4.15",
@@ -3,7 +3,7 @@ import { AXFormatOptions, AXFormatter } from '@acorex/core/format';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Injector, Type, InputSignal, Signal, Provider, InjectionToken, ModuleWithProviders } from '@angular/core';
5
5
  import * as i2 from '@acorex/core/validation';
6
- import { AXValidationRuleOptions, AXValidationRuleResult, AXValidationService, AXValidationRule } from '@acorex/core/validation';
6
+ import { AXValidationRuleOptions, AXValidationRuleResult, AXValidationService, AXValidationRule, AXValidationRegistryService } from '@acorex/core/validation';
7
7
 
8
8
  interface AXFileSizeFormatterOptions extends AXFormatOptions {
9
9
  format: string;
@@ -250,6 +250,7 @@ declare function provideFileTypeInfoProvider(provider: Type<AXFileTypeInfoProvid
250
250
 
251
251
  declare class AXFileTypeRegistryService {
252
252
  private readonly validation;
253
+ private readonly validationRegistry;
253
254
  private readonly providers;
254
255
  private readonly registeredTypes;
255
256
  private cache;
@@ -393,12 +394,18 @@ declare class AXFileMaxSizeValidationRule implements AXValidationRule {
393
394
 
394
395
  /** Validation rule classes to register with {@link AXValidationModule}. */
395
396
  declare const AX_FILE_VALIDATION_RULES: readonly [typeof AXFileMimeTypeValidationRule, typeof AXFileMinSizeValidationRule, typeof AXFileMaxSizeValidationRule];
397
+ /** Idempotent registration for bootstrap providers and first validation call. */
398
+ declare function ensureFileValidationRules(registry: AXValidationRegistryService): void;
399
+
396
400
  /** Registers file validation rules with {@link AXValidationRegistryService}. */
397
401
  declare function provideFileValidationRules(): Provider;
398
402
 
399
403
  /**
404
+
400
405
  * Registers validation rules and optional built-in file type providers.
406
+
401
407
  * {@link AXFileTypeRegistryService} and {@link AXFileService} are `providedIn: 'root'`.
408
+
402
409
  */
403
410
  declare function provideFileTypeSystem(): Provider[];
404
411
 
@@ -458,5 +465,5 @@ declare class AXFileService {
458
465
  static ɵprov: i0.ɵɵInjectableDeclaration<AXFileService>;
459
466
  }
460
467
 
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 };
468
+ 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, ensureFileValidationRules, 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
469
  export type { AXFileChooseOptions, AXFileCopyData, AXFileCopyResult, AXFileMaxSizeValidationRuleOptions, AXFileMimeTypeValidationRuleOptions, AXFileMinSizeValidationRuleOptions, AXFileModuleConfig, AXFileOpenResult, AXFileSizeFormatterOptions, AXFileType, AXFileTypeComponent, AXFileTypeContext, AXFileTypeExtension, AXFileTypeExtensionHint, AXFileTypeMetadata, AXFileTypeOpenContext, AXFileTypeQuery, AXFileTypeViewComponent, AXFileValidationRule, AXFileValidations, DefineFileTypeConfig };