@solidxai/core 0.1.13-beta.13 → 0.1.13-beta.14

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +573 -0
  2. package/README.md +19 -0
  3. package/dist/constants/media-file-types.d.ts +1 -0
  4. package/dist/constants/media-file-types.d.ts.map +1 -1
  5. package/dist/constants/media-file-types.js +2 -1
  6. package/dist/constants/media-file-types.js.map +1 -1
  7. package/dist/controllers/field-metadata.controller.d.ts +2 -2
  8. package/dist/dtos/create-field-metadata.dto.d.ts +2 -6
  9. package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
  10. package/dist/dtos/create-field-metadata.dto.js +4 -10
  11. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  12. package/dist/dtos/create-model-sequence.dto.d.ts +1 -1
  13. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -1
  14. package/dist/dtos/create-model-sequence.dto.js +1 -1
  15. package/dist/dtos/create-model-sequence.dto.js.map +1 -1
  16. package/dist/helpers/bootstrap.helper.d.ts +2 -1
  17. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  18. package/dist/helpers/bootstrap.helper.js +2 -2
  19. package/dist/helpers/bootstrap.helper.js.map +1 -1
  20. package/dist/helpers/security.helper.d.ts +5 -1
  21. package/dist/helpers/security.helper.d.ts.map +1 -1
  22. package/dist/helpers/security.helper.js +15 -4
  23. package/dist/helpers/security.helper.js.map +1 -1
  24. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  25. package/dist/seeders/module-metadata-seeder.service.js +7 -3
  26. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  27. package/dist/services/field-metadata.service.d.ts +2 -2
  28. package/dist/services/field-metadata.service.d.ts.map +1 -1
  29. package/dist/services/field-metadata.service.js +2 -1
  30. package/dist/services/field-metadata.service.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/constants/media-file-types.ts +2 -0
  33. package/src/dtos/create-field-metadata.dto.ts +4 -9
  34. package/src/dtos/create-model-sequence.dto.ts +1 -1
  35. package/src/helpers/bootstrap.helper.ts +17 -3
  36. package/src/helpers/security.helper.ts +35 -8
  37. package/src/seeders/module-metadata-seeder.service.ts +11 -3
  38. package/src/services/field-metadata.service.ts +3 -2
@@ -1,15 +1,39 @@
1
1
  import { HelmetOptions } from "helmet";
2
2
  import { Environment } from "src/decorators/disallow-in-production.decorator";
3
3
 
4
+ export interface SolidSecurityOptions {
5
+ /**
6
+ * Origins that may embed this application in an iframe.
7
+ * Defaults to the local HTTP/HTTPS loopback origins on any port.
8
+ */
9
+ frameAncestors?: string[];
10
+ }
11
+
12
+ export const DEFAULT_FRAME_ANCESTORS = [
13
+ "'self'",
14
+ "http://localhost:*",
15
+ "https://localhost:*",
16
+ "http://127.0.0.1:*",
17
+ "https://127.0.0.1:*",
18
+ "http://[::1]:*",
19
+ "https://[::1]:*",
20
+ ];
21
+
4
22
  /**
5
23
  * Default security headers for SolidX apps.
6
24
  * - HSTS only in prod over HTTPS
7
- * - CSP with frame-ancestors 'none' (prevents clickjacking)
8
- * - X-Frame-Options: DENY (legacy fallback)
25
+ * - CSP with configurable frame-ancestors
26
+ * - X-Frame-Options disabled when cross-origin frame ancestors are allowed
9
27
  * - No X-XSS-Protection (deprecated)
10
28
  */
11
- export function buildDefaultSecurityHeaderOptions(): Readonly<HelmetOptions> {
29
+ export function buildDefaultSecurityHeaderOptions(
30
+ options: SolidSecurityOptions = {},
31
+ ): Readonly<HelmetOptions> {
12
32
  const isProd = process.env.ENV === Environment.Production;
33
+ const frameAncestors = options.frameAncestors ?? DEFAULT_FRAME_ANCESTORS;
34
+ const allowsCrossOriginFrames = frameAncestors.some(
35
+ (source) => source !== "'self'" && source !== "'none'",
36
+ );
13
37
 
14
38
  return {
15
39
  // Modern CSP. Add more directives as your app needs (script-src, connect-src, etc.)
@@ -23,7 +47,7 @@ export function buildDefaultSecurityHeaderOptions(): Readonly<HelmetOptions> {
23
47
  // "form-action": ["'self'"],
24
48
 
25
49
  // clickjacking defense (modern)
26
- "frame-ancestors": ["'none'"],
50
+ "frame-ancestors": frameAncestors,
27
51
  "style-src": ["'self'"],
28
52
  // add/adjust as needed for your app:
29
53
  // "script-src": ["'self'"], // add hashes/nonces/CSPRO if needed
@@ -34,9 +58,12 @@ export function buildDefaultSecurityHeaderOptions(): Readonly<HelmetOptions> {
34
58
  },
35
59
  },
36
60
 
37
-
38
- // Legacy clickjacking defense (kept for older UAs)
39
- frameguard: { action: "deny" },
61
+ // Legacy clickjacking defense for configurations that do not allow
62
+ // cross-origin parents (kept for older UAs).
63
+ // X-Frame-Options cannot express an allowlist. It must be omitted when
64
+ // CSP allows a parent on another origin, otherwise older browsers may
65
+ // still block the iframe despite the CSP configuration.
66
+ frameguard: allowsCrossOriginFrames ? false : { action: "deny" },
40
67
 
41
68
  // Referrer/cross-origin policies
42
69
  referrerPolicy: { policy: "strict-origin-when-cross-origin" },
@@ -115,4 +142,4 @@ export function setDefaultCacheControl() {
115
142
  // res.setHeader("Permissions-Policy", buildPermissionsPolicyHeader());
116
143
  // next();
117
144
  // });
118
- // app.use(setDefaultCacheControl());
145
+ // app.use(setDefaultCacheControl());
@@ -1049,17 +1049,25 @@ export class ModuleMetadataSeederService {
1049
1049
 
1050
1050
  private async seedModelSequences(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {
1051
1051
  const modelSequences = this.getSeedArray<CreateModelSequenceDto>(overallMetadata?.modelSequences);
1052
- const pruned = this.enablePruning ? await this.timeOperation('prune-model-sequences', () => this.pruneModelSequences(modelSequences, overallMetadata?.moduleMetadata?.name), {
1052
+
1053
+ // Getting rid of currentValue even if it is present in the seed data.
1054
+ // This is because we don't want to overwrite the currentValue in the database with the seed data.
1055
+ // The currentValue should be managed by the application and not by the seed data.
1056
+ const cleanModelSequences = modelSequences.map((sequence) => {
1057
+ const { currentValue, ...cleanModelSequence }: CreateModelSequenceDto = sequence;
1058
+ return cleanModelSequence;
1059
+ });
1060
+ const pruned = this.enablePruning ? await this.timeOperation('prune-model-sequences', () => this.pruneModelSequences(cleanModelSequences, overallMetadata?.moduleMetadata?.name), {
1053
1061
  moduleName: overallMetadata?.moduleMetadata?.name,
1054
1062
  component: 'model-sequences',
1055
1063
  serviceCall: 'pruneModelSequences',
1056
1064
  }) : 0;
1057
- await this.timeOperation('handle-model-sequences', () => this.handleSeedModelSequences(modelSequences), {
1065
+ await this.timeOperation('handle-model-sequences', () => this.handleSeedModelSequences(cleanModelSequences), {
1058
1066
  moduleName: overallMetadata?.moduleMetadata?.name,
1059
1067
  component: 'model-sequences',
1060
1068
  serviceCall: 'handleSeedModelSequences',
1061
1069
  });
1062
- return { pruned, upserted: modelSequences.length };
1070
+ return { pruned, upserted: cleanModelSequences.length };
1063
1071
  }
1064
1072
 
1065
1073
  // OK
@@ -7,12 +7,13 @@ import { ComputedFieldMetadata, SolidRegistry } from 'src/helpers/solid-registry
7
7
  import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
8
8
  import { DataSource, Repository, SelectQueryBuilder } from 'typeorm';
9
9
  import { BasicFilterDto } from '../dtos/basic-filters.dto';
10
- import { CascadeType, ComputedFieldValueType, CreateFieldMetadataDto, DecryptWhenType, EncryptionType, MediaType, MSSQLType, PSQLType, RelationType, SelectionValueType, SolidFieldType } from '../dtos/create-field-metadata.dto';
10
+ import { CascadeType, ComputedFieldValueType, CreateFieldMetadataDto, DecryptWhenType, EncryptionType, MSSQLType, PSQLType, RelationType, SelectionValueType, SolidFieldType } from '../dtos/create-field-metadata.dto';
11
11
  import { SelectionDynamicQueryDto } from '../dtos/selection-dynamic-query.dto';
12
12
  import { UpdateFieldMetaDataDto } from '../dtos/update-field-metadata.dto';
13
13
  import { FieldMetadata } from '../entities/field-metadata.entity';
14
14
  import { ModelMetadata } from '../entities/model-metadata.entity';
15
15
  import { ISelectionProviderValues, MediaStorageProvider } from '../interfaces';
16
+ import { MEDIA_CATEGORIES } from '../constants/media-file-types';
16
17
  import { CrudHelperService } from './crud-helper.service';
17
18
  import { ERROR_MESSAGES } from 'src/constants/error-messages';
18
19
  import qs from 'qs';
@@ -414,7 +415,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
414
415
  encryptionTypes: enumToResponseArray(EncryptionType),
415
416
  ormType: ormFieldTypeForSolid,
416
417
  decryptWhenTypes: enumToResponseArray(DecryptWhenType),
417
- mediaTypes: enumToResponseArray(MediaType),
418
+ mediaTypes: MEDIA_CATEGORIES.map((value) => ({ label: value, value })),
418
419
  relationTypes: enumToResponseArray(RelationType),
419
420
  selectionDynamicProviders: sps,
420
421
  computedProviders: cps,