@etohq/framework 1.5.1-alpha.3 → 1.5.1-alpha.5

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 (146) hide show
  1. package/dist/config/loader.d.ts +1 -1
  2. package/dist/config/loader.d.ts.map +1 -1
  3. package/dist/config/loader.js +3 -2
  4. package/dist/config/loader.js.map +1 -1
  5. package/dist/deps/awilix.d.ts +2 -0
  6. package/dist/deps/awilix.d.ts.map +1 -0
  7. package/dist/deps/awilix.js +18 -0
  8. package/dist/deps/awilix.js.map +1 -0
  9. package/dist/deps/mikro-orm-cli.d.ts +2 -0
  10. package/dist/deps/mikro-orm-cli.d.ts.map +1 -0
  11. package/dist/deps/mikro-orm-cli.js +18 -0
  12. package/dist/deps/mikro-orm-cli.js.map +1 -0
  13. package/dist/deps/mikro-orm-core.d.ts +2 -0
  14. package/dist/deps/mikro-orm-core.d.ts.map +1 -0
  15. package/dist/deps/mikro-orm-core.js +18 -0
  16. package/dist/deps/mikro-orm-core.js.map +1 -0
  17. package/dist/deps/mikro-orm-knex.d.ts +2 -0
  18. package/dist/deps/mikro-orm-knex.d.ts.map +1 -0
  19. package/dist/deps/mikro-orm-knex.js +18 -0
  20. package/dist/deps/mikro-orm-knex.js.map +1 -0
  21. package/dist/deps/mikro-orm-migrations.d.ts +2 -0
  22. package/dist/deps/mikro-orm-migrations.d.ts.map +1 -0
  23. package/dist/deps/mikro-orm-migrations.js +18 -0
  24. package/dist/deps/mikro-orm-migrations.js.map +1 -0
  25. package/dist/deps/mikro-orm-postgresql.d.ts +2 -0
  26. package/dist/deps/mikro-orm-postgresql.d.ts.map +1 -0
  27. package/dist/deps/mikro-orm-postgresql.js +18 -0
  28. package/dist/deps/mikro-orm-postgresql.js.map +1 -0
  29. package/dist/deps/opentelemetry-api.d.ts +2 -0
  30. package/dist/deps/opentelemetry-api.d.ts.map +1 -0
  31. package/dist/deps/opentelemetry-api.js +18 -0
  32. package/dist/deps/opentelemetry-api.js.map +1 -0
  33. package/dist/deps/opentelemetry-instrumentation-pg.d.ts +2 -0
  34. package/dist/deps/opentelemetry-instrumentation-pg.d.ts.map +1 -0
  35. package/dist/deps/opentelemetry-instrumentation-pg.js +18 -0
  36. package/dist/deps/opentelemetry-instrumentation-pg.js.map +1 -0
  37. package/dist/deps/opentelemetry-resources.d.ts +2 -0
  38. package/dist/deps/opentelemetry-resources.d.ts.map +1 -0
  39. package/dist/deps/opentelemetry-resources.js +18 -0
  40. package/dist/deps/opentelemetry-resources.js.map +1 -0
  41. package/dist/deps/opentelemetry-sdk-node.d.ts +2 -0
  42. package/dist/deps/opentelemetry-sdk-node.d.ts.map +1 -0
  43. package/dist/deps/opentelemetry-sdk-node.js +18 -0
  44. package/dist/deps/opentelemetry-sdk-node.js.map +1 -0
  45. package/dist/deps/opentelemetry-sdk-trace-node.d.ts +2 -0
  46. package/dist/deps/opentelemetry-sdk-trace-node.d.ts.map +1 -0
  47. package/dist/deps/opentelemetry-sdk-trace-node.js +18 -0
  48. package/dist/deps/opentelemetry-sdk-trace-node.js.map +1 -0
  49. package/dist/deps/pg.d.ts +2 -0
  50. package/dist/deps/pg.d.ts.map +1 -0
  51. package/dist/deps/pg.js +18 -0
  52. package/dist/deps/pg.js.map +1 -0
  53. package/dist/deps/zod.d.ts +2 -0
  54. package/dist/deps/zod.d.ts.map +1 -0
  55. package/dist/deps/zod.js +18 -0
  56. package/dist/deps/zod.js.map +1 -0
  57. package/dist/eto-app-loader.d.ts.map +1 -1
  58. package/dist/eto-app-loader.js +4 -2
  59. package/dist/eto-app-loader.js.map +1 -1
  60. package/dist/eto.d.ts +11 -2
  61. package/dist/eto.d.ts.map +1 -1
  62. package/dist/eto.js +29 -18
  63. package/dist/eto.js.map +1 -1
  64. package/dist/http/express-loader.d.ts +10 -0
  65. package/dist/http/express-loader.d.ts.map +1 -0
  66. package/dist/http/express-loader.js +130 -0
  67. package/dist/http/express-loader.js.map +1 -0
  68. package/dist/http/middleware-file-loader.d.ts +33 -0
  69. package/dist/http/middleware-file-loader.d.ts.map +1 -0
  70. package/dist/http/middleware-file-loader.js +186 -0
  71. package/dist/http/middleware-file-loader.js.map +1 -0
  72. package/dist/http/middlewares/apply-locale.d.ts +12 -0
  73. package/dist/http/middlewares/apply-locale.d.ts.map +1 -0
  74. package/dist/http/middlewares/apply-locale.js +31 -0
  75. package/dist/http/middlewares/apply-locale.js.map +1 -0
  76. package/dist/http/middlewares/check-permissions.d.ts +15 -0
  77. package/dist/http/middlewares/check-permissions.d.ts.map +1 -0
  78. package/dist/http/middlewares/check-permissions.js +54 -0
  79. package/dist/http/middlewares/check-permissions.js.map +1 -0
  80. package/dist/http/router.d.ts +36 -0
  81. package/dist/http/router.d.ts.map +1 -0
  82. package/dist/http/router.js +317 -0
  83. package/dist/http/router.js.map +1 -0
  84. package/dist/http/routes-finder.d.ts +22 -0
  85. package/dist/http/routes-finder.d.ts.map +1 -0
  86. package/dist/http/routes-finder.js +68 -0
  87. package/dist/http/routes-finder.js.map +1 -0
  88. package/dist/http/routes-loader.d.ts +39 -0
  89. package/dist/http/routes-loader.d.ts.map +1 -0
  90. package/dist/http/routes-loader.js +232 -0
  91. package/dist/http/routes-loader.js.map +1 -0
  92. package/dist/http/routes-sorter.d.ts +105 -0
  93. package/dist/http/routes-sorter.d.ts.map +1 -0
  94. package/dist/http/routes-sorter.js +146 -0
  95. package/dist/http/routes-sorter.js.map +1 -0
  96. package/dist/http/utils/define-middlewares.d.ts +22 -0
  97. package/dist/http/utils/define-middlewares.d.ts.map +1 -0
  98. package/dist/http/utils/define-middlewares.js +27 -0
  99. package/dist/http/utils/define-middlewares.js.map +1 -0
  100. package/dist/http/utils/field-filtering/field-parser.d.ts +32 -0
  101. package/dist/http/utils/field-filtering/field-parser.d.ts.map +1 -0
  102. package/dist/http/utils/field-filtering/field-parser.js +87 -0
  103. package/dist/http/utils/field-filtering/field-parser.js.map +1 -0
  104. package/dist/http/utils/field-filtering/field-validator.d.ts +24 -0
  105. package/dist/http/utils/field-filtering/field-validator.d.ts.map +1 -0
  106. package/dist/http/utils/field-filtering/field-validator.js +67 -0
  107. package/dist/http/utils/field-filtering/field-validator.js.map +1 -0
  108. package/dist/http/utils/field-filtering/index.d.ts +33 -0
  109. package/dist/http/utils/field-filtering/index.d.ts.map +1 -0
  110. package/dist/http/utils/field-filtering/index.js +9 -0
  111. package/dist/http/utils/field-filtering/index.js.map +1 -0
  112. package/dist/http/utils/policies/rbac-field-filter.d.ts +19 -0
  113. package/dist/http/utils/policies/rbac-field-filter.d.ts.map +1 -0
  114. package/dist/http/utils/policies/rbac-field-filter.js +348 -0
  115. package/dist/http/utils/policies/rbac-field-filter.js.map +1 -0
  116. package/dist/links/link-loader.d.ts +2 -1
  117. package/dist/links/link-loader.d.ts.map +1 -1
  118. package/dist/links/link-loader.js +9 -7
  119. package/dist/links/link-loader.js.map +1 -1
  120. package/dist/policies/has-permission.d.ts +33 -0
  121. package/dist/policies/has-permission.d.ts.map +1 -0
  122. package/dist/policies/has-permission.js +110 -0
  123. package/dist/policies/has-permission.js.map +1 -0
  124. package/dist/policies/index.d.ts +3 -0
  125. package/dist/policies/index.d.ts.map +1 -0
  126. package/dist/policies/index.js +19 -0
  127. package/dist/policies/index.js.map +1 -0
  128. package/dist/policies/policy-loader.d.ts +6 -0
  129. package/dist/policies/policy-loader.d.ts.map +1 -0
  130. package/dist/policies/policy-loader.js +17 -0
  131. package/dist/policies/policy-loader.js.map +1 -0
  132. package/dist/telemetry/index.d.ts +50 -0
  133. package/dist/telemetry/index.d.ts.map +1 -0
  134. package/dist/telemetry/index.js +81 -0
  135. package/dist/telemetry/index.js.map +1 -0
  136. package/dist/types/container.d.ts +5 -1
  137. package/dist/types/container.d.ts.map +1 -1
  138. package/dist/utils/resource-loader.d.ts +3 -1
  139. package/dist/utils/resource-loader.d.ts.map +1 -1
  140. package/dist/utils/resource-loader.js +18 -7
  141. package/dist/utils/resource-loader.js.map +1 -1
  142. package/dist/zod/index.d.ts +1 -0
  143. package/dist/zod/index.d.ts.map +1 -1
  144. package/dist/zod/index.js +1 -0
  145. package/dist/zod/index.js.map +1 -1
  146. package/package.json +21 -9
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FieldParser = void 0;
4
+ const utils_1 = require("@etohq/utils");
5
+ /**
6
+ * Handles parsing of field strings into structured field sets
7
+ * Supports various field modifiers:
8
+ * - `+field` or ` field`: Add to defaults
9
+ * - `-field`: Remove from defaults
10
+ * - `*field` or `field.*`: Select all properties of a relation
11
+ */
12
+ class FieldParser {
13
+ /**
14
+ * Parse field string and defaults into structured field sets
15
+ * @param fields - Comma-separated field string from query
16
+ * @param defaults - Default fields to include
17
+ * @returns ParsedFields with fields and starFields sets
18
+ */
19
+ static parse(fields, defaults = []) {
20
+ const starFields = new Set();
21
+ let allFields = new Set(defaults);
22
+ if ((0, utils_1.isDefined)(fields)) {
23
+ const customFields = fields.split(",").filter(Boolean);
24
+ const shouldReplaceDefaultFields = this.shouldReplaceDefaults(customFields);
25
+ if (shouldReplaceDefaultFields) {
26
+ allFields = new Set(customFields.map((f) => f.replace(/^[+ -]/, "")));
27
+ }
28
+ else {
29
+ this.applyFieldModifiers(customFields, allFields);
30
+ }
31
+ allFields.add("id");
32
+ }
33
+ this.extractStarFields(allFields, starFields);
34
+ return { fields: allFields, starFields };
35
+ }
36
+ /**
37
+ * Determines if custom fields should replace defaults
38
+ * Fields replace defaults when any field doesn't have a modifier prefix
39
+ */
40
+ static shouldReplaceDefaults(customFields) {
41
+ return (!customFields.length ||
42
+ customFields.some((field) => {
43
+ return !(field.startsWith("-") ||
44
+ field.startsWith("+") ||
45
+ field.startsWith(" ") ||
46
+ field.startsWith("*") ||
47
+ field.endsWith(".*"));
48
+ }));
49
+ }
50
+ /**
51
+ * Apply field modifiers (+, -, etc) to the field set
52
+ */
53
+ static applyFieldModifiers(customFields, allFields) {
54
+ customFields.forEach((field) => {
55
+ if (field.startsWith("+") || field.startsWith(" ")) {
56
+ allFields.add(field.trim().replace(/^\+/, ""));
57
+ }
58
+ else if (field.startsWith("-")) {
59
+ const fieldName = field.replace(/^-/, "");
60
+ for (const reqField of allFields) {
61
+ const reqFieldName = reqField.replace(/^\*/, "");
62
+ if (reqFieldName === fieldName ||
63
+ reqFieldName.startsWith(fieldName + ".")) {
64
+ allFields.delete(reqField);
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ allFields.add(field);
70
+ }
71
+ });
72
+ }
73
+ /**
74
+ * Extract star fields (* prefix or .* suffix) from allFields into starFields set
75
+ * Star fields represent "select all properties" for a relation
76
+ */
77
+ static extractStarFields(allFields, starFields) {
78
+ allFields.forEach((field) => {
79
+ if (field.startsWith("*") || field.endsWith(".*")) {
80
+ starFields.add(field.replace(/(^\*|\.\*$)/, ""));
81
+ allFields.delete(field);
82
+ }
83
+ });
84
+ }
85
+ }
86
+ exports.FieldParser = FieldParser;
87
+ //# sourceMappingURL=field-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-parser.js","sourceRoot":"","sources":["../../../../src/http/utils/field-filtering/field-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { FieldFilterContext, IFieldFilter } from "./index";
2
+ /**
3
+ * Filter that only allows explicitly specified fields
4
+ * Fields not in the allowed list are returned as not allowed
5
+ */
6
+ export declare class AllowedFieldFilter implements IFieldFilter {
7
+ private allowed;
8
+ constructor({ allowed }: {
9
+ allowed: string[];
10
+ });
11
+ getNotAllowedFields(context: FieldFilterContext): string[];
12
+ }
13
+ /**
14
+ * Filter that restricts specific fields
15
+ * Fields containing any restricted segment are returned as not allowed
16
+ */
17
+ export declare class RestrictedFieldFilter implements IFieldFilter {
18
+ private restricted;
19
+ constructor({ restricted }: {
20
+ restricted: string[];
21
+ });
22
+ getNotAllowedFields(context: FieldFilterContext): string[];
23
+ }
24
+ //# sourceMappingURL=field-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-validator.d.ts","sourceRoot":"","sources":["../../../../src/http/utils/field-filtering/field-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE1D;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,OAAO,CAAU;gBAEb,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;IAI9C,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE;CAmC3D;AAED;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACxD,OAAO,CAAC,UAAU,CAAU;gBAEhB,EAAE,UAAU,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAIpD,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE;CAqB3D"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RestrictedFieldFilter = exports.AllowedFieldFilter = void 0;
4
+ /**
5
+ * Filter that only allows explicitly specified fields
6
+ * Fields not in the allowed list are returned as not allowed
7
+ */
8
+ class AllowedFieldFilter {
9
+ constructor({ allowed }) {
10
+ this.allowed = allowed;
11
+ }
12
+ getNotAllowedFields(context) {
13
+ const { parsedFields } = context;
14
+ const { fields, starFields } = parsedFields;
15
+ const fieldsToCheck = [...fields, ...Array.from(starFields)];
16
+ const notAllowedFields = [];
17
+ fieldsToCheck.forEach((field) => {
18
+ const hasAllowedField = this.allowed.includes(field);
19
+ if (hasAllowedField) {
20
+ return;
21
+ }
22
+ // Select full relation - must match an allowed field fully
23
+ // e.g product.variants must have product.variants in allowedFields
24
+ if (starFields.has(field)) {
25
+ if (hasAllowedField) {
26
+ return;
27
+ }
28
+ notAllowedFields.push(field);
29
+ return;
30
+ }
31
+ const fieldStartsWithAllowedField = this.allowed.some((allowedField) => field.startsWith(allowedField));
32
+ if (!fieldStartsWithAllowedField) {
33
+ notAllowedFields.push(field);
34
+ return;
35
+ }
36
+ });
37
+ return notAllowedFields;
38
+ }
39
+ }
40
+ exports.AllowedFieldFilter = AllowedFieldFilter;
41
+ /**
42
+ * Filter that restricts specific fields
43
+ * Fields containing any restricted segment are returned as not allowed
44
+ */
45
+ class RestrictedFieldFilter {
46
+ constructor({ restricted }) {
47
+ this.restricted = restricted;
48
+ }
49
+ getNotAllowedFields(context) {
50
+ const { parsedFields } = context;
51
+ const { fields, starFields } = parsedFields;
52
+ const fieldsToCheck = [...fields, ...Array.from(starFields)];
53
+ const notAllowedFields = [];
54
+ fieldsToCheck.forEach((field) => {
55
+ const fieldSegments = field.split(".");
56
+ const hasRestrictedField = this.restricted.some((restrictedField) => fieldSegments.includes(restrictedField));
57
+ if (hasRestrictedField) {
58
+ notAllowedFields.push(field);
59
+ return;
60
+ }
61
+ return;
62
+ });
63
+ return notAllowedFields;
64
+ }
65
+ }
66
+ exports.RestrictedFieldFilter = RestrictedFieldFilter;
67
+ //# sourceMappingURL=field-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-validator.js","sourceRoot":"","sources":["../../../../src/http/utils/field-filtering/field-validator.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,kBAAkB;IAG7B,YAAY,EAAE,OAAO,EAAyB;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,mBAAmB,CAAC,OAA2B;QAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;QAChC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,CAAA;QAC3C,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QAC5D,MAAM,gBAAgB,GAAa,EAAE,CAAA;QAErC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAEpD,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAM;YACR,CAAC;YAED,2DAA2D;YAC3D,mEAAmE;YACnE,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,eAAe,EAAE,CAAC;oBACpB,OAAM;gBACR,CAAC;gBACD,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5B,OAAM;YACR,CAAC;YAED,MAAM,2BAA2B,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CACrE,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAC/B,CAAA;YAED,IAAI,CAAC,2BAA2B,EAAE,CAAC;gBACjC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5B,OAAM;YACR,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,gBAAgB,CAAA;IACzB,CAAC;CACF;AA1CD,gDA0CC;AAED;;;GAGG;AACH,MAAa,qBAAqB;IAGhC,YAAY,EAAE,UAAU,EAA4B;QAClD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,mBAAmB,CAAC,OAA2B;QAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;QAChC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,CAAA;QAC3C,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QAC5D,MAAM,gBAAgB,GAAa,EAAE,CAAA;QAErC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACtC,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,EAAE,CAClE,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,CACxC,CAAA;YACD,IAAI,kBAAkB,EAAE,CAAC;gBACvB,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5B,OAAM;YACR,CAAC;YAED,OAAM;QACR,CAAC,CAAC,CAAA;QAEF,OAAO,gBAAgB,CAAA;IACzB,CAAC;CACF;AA5BD,sDA4BC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Parsed fields structure after processing field strings
3
+ */
4
+ export interface ParsedFields {
5
+ /** Regular fields to select */
6
+ fields: Set<string>;
7
+ /** Star fields representing full relation selections (e.g., *product.variants) */
8
+ starFields: Set<string>;
9
+ }
10
+ /**
11
+ * Context passed to field filters for determining access
12
+ */
13
+ export interface FieldFilterContext {
14
+ /** The main entity being queried (e.g., "product", "order") */
15
+ entity: string;
16
+ /** Parsed fields to filter */
17
+ parsedFields: ParsedFields;
18
+ }
19
+ /**
20
+ * Interface for field filters following the Strategy pattern
21
+ * Allows adding new field filtering logic without modifying prepareListQuery
22
+ */
23
+ export interface IFieldFilter {
24
+ /**
25
+ * Returns fields that should be excluded from the query
26
+ * @param context - The filter context containing entity and parsed fields
27
+ * @returns Array of field names that are not allowed
28
+ */
29
+ getNotAllowedFields(context: FieldFilterContext): Promise<string[]> | string[];
30
+ }
31
+ export { FieldParser } from "./field-parser";
32
+ export { AllowedFieldFilter, RestrictedFieldFilter } from "./field-validator";
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http/utils/field-filtering/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,kFAAkF;IAClF,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAA;CAC/E;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RestrictedFieldFilter = exports.AllowedFieldFilter = exports.FieldParser = void 0;
4
+ var field_parser_1 = require("./field-parser");
5
+ Object.defineProperty(exports, "FieldParser", { enumerable: true, get: function () { return field_parser_1.FieldParser; } });
6
+ var field_validator_1 = require("./field-validator");
7
+ Object.defineProperty(exports, "AllowedFieldFilter", { enumerable: true, get: function () { return field_validator_1.AllowedFieldFilter; } });
8
+ Object.defineProperty(exports, "RestrictedFieldFilter", { enumerable: true, get: function () { return field_validator_1.RestrictedFieldFilter; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/http/utils/field-filtering/index.ts"],"names":[],"mappings":";;;AAiCA,+CAA4C;AAAnC,2GAAA,WAAW,OAAA;AACpB,qDAA6E;AAApE,qHAAA,kBAAkB,OAAA;AAAE,wHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,19 @@
1
+ import { PolicyDefinition } from "@etohq/framework/utils";
2
+ import type { EtoContainer } from "@etohq/types";
3
+ import { FieldFilterContext, IFieldFilter } from "../field-filtering/index";
4
+ /**
5
+ * RBAC Field Filter using the Strategy pattern
6
+ * Optimized for parallel permission checks
7
+ */
8
+ export declare class RBACFieldFilter implements IFieldFilter {
9
+ private policies;
10
+ private userRoles;
11
+ private container;
12
+ constructor({ policies, userRoles, container, }: {
13
+ policies: PolicyDefinition[];
14
+ userRoles: string[];
15
+ container: EtoContainer;
16
+ });
17
+ getNotAllowedFields(context: FieldFilterContext): Promise<string[]>;
18
+ }
19
+ //# sourceMappingURL=rbac-field-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-field-filter.d.ts","sourceRoot":"","sources":["../../../../src/http/utils/policies/rbac-field-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAIjB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAqY3E;;;GAGG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,SAAS,CAAc;gBAEnB,EACV,QAAQ,EACR,SAAS,EACT,SAAS,GACV,EAAE;QACD,QAAQ,EAAE,gBAAgB,EAAE,CAAA;QAC5B,SAAS,EAAE,MAAM,EAAE,CAAA;QACnB,SAAS,EAAE,YAAY,CAAA;KACxB;IAMK,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CA+D1E"}
@@ -0,0 +1,348 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RBACFieldFilter = void 0;
4
+ const utils_1 = require("@etohq/framework/utils");
5
+ const modules_sdk_1 = require("@etohq/modules-sdk");
6
+ const has_permission_1 = require("../../../policies/has-permission");
7
+ /**
8
+ * Base GraphQL schema with common scalars
9
+ */
10
+ const baseGraphqlSchema = `
11
+ scalar DateTime
12
+ scalar Date
13
+ scalar Time
14
+ scalar JSON
15
+ `;
16
+ const primitiveTypes = new Set([
17
+ "String",
18
+ "Int",
19
+ "Float",
20
+ "Boolean",
21
+ "ID",
22
+ "DateTime",
23
+ "JSON",
24
+ ]);
25
+ // Cache for the schema and entity mappings to avoid re-parsing the GraphQL
26
+ let cachedSchema = null;
27
+ let cachedEntityMap = null;
28
+ let cachedEntityAliasMap = null;
29
+ function isString(value) {
30
+ return typeof value === "string";
31
+ }
32
+ /**
33
+ * Makes a GraphQL schema executable
34
+ */
35
+ function makeSchemaExecutable(inputSchema) {
36
+ const { schema: cleanedSchema } = utils_1.GraphQLUtils.cleanGraphQLSchema(inputSchema);
37
+ if (!cleanedSchema) {
38
+ return;
39
+ }
40
+ return utils_1.GraphQLUtils.makeExecutableSchema({
41
+ typeDefs: cleanedSchema,
42
+ });
43
+ }
44
+ function getExecutableSchema() {
45
+ if (cachedSchema) {
46
+ return cachedSchema;
47
+ }
48
+ cachedSchema = buildExecutableSchema();
49
+ return cachedSchema;
50
+ }
51
+ /**
52
+ * Builds entity alias map from joiner configs
53
+ * Maps all possible aliases (e.g., "variant", "variants") to canonical entity names (e.g., "ProductVariant")
54
+ */
55
+ function buildEntityAliasMap() {
56
+ const moduleJoinerConfigs = modules_sdk_1.EtoModule.getAllJoinerConfigs();
57
+ const aliasMap = new Map();
58
+ for (const config of moduleJoinerConfigs) {
59
+ if (!config.alias) {
60
+ continue;
61
+ }
62
+ const aliases = Array.isArray(config.alias) ? config.alias : [config.alias];
63
+ for (const alias of aliases) {
64
+ const aliasNames = Array.isArray(alias.name) ? alias.name : [alias.name];
65
+ if (!alias.entity) {
66
+ continue;
67
+ }
68
+ const targetEntity = alias.entity;
69
+ for (const aliasName of aliasNames) {
70
+ aliasMap.set(aliasName, targetEntity);
71
+ }
72
+ }
73
+ }
74
+ return aliasMap;
75
+ }
76
+ /**
77
+ * Gets the entity alias map, building it if necessary
78
+ */
79
+ function getEntityAliasMap() {
80
+ if (!cachedEntityAliasMap) {
81
+ cachedEntityAliasMap = buildEntityAliasMap();
82
+ }
83
+ return cachedEntityAliasMap;
84
+ }
85
+ function getSchemaFromJoinerConfigs(moduleJoinerConfigs) {
86
+ const schemaParts = [];
87
+ for (const config of moduleJoinerConfigs) {
88
+ if (!config?.schema) {
89
+ continue;
90
+ }
91
+ schemaParts.push(config.schema);
92
+ }
93
+ return schemaParts.join("\n");
94
+ }
95
+ function buildCompleteEntityMap() {
96
+ const moduleJoinerConfigs = modules_sdk_1.EtoModule.getAllJoinerConfigs();
97
+ const entityMap = new Map();
98
+ // base GraphQL schema
99
+ const schema = buildExecutableSchema();
100
+ if (!schema) {
101
+ return entityMap;
102
+ }
103
+ const entitiesMap = schema.getTypeMap();
104
+ // Process each service configuration to build alias field mappings
105
+ for (const config of moduleJoinerConfigs) {
106
+ processServiceConfig(config, entitiesMap, entityMap);
107
+ }
108
+ return entityMap;
109
+ }
110
+ /**
111
+ * Processes a service configuration to extract field mappings
112
+ */
113
+ function processServiceConfig(config, entitiesMap, entityMap) {
114
+ if (!config.extends) {
115
+ return;
116
+ }
117
+ for (const extend of config.extends) {
118
+ if (!entitiesMap[extend?.entity]) {
119
+ continue;
120
+ }
121
+ const extendedFieldAlias = extend.fieldAlias || {};
122
+ if (Object.keys(extendedFieldAlias).length > 0) {
123
+ processFieldAliases(extendedFieldAlias, extend.entity, entitiesMap, entityMap);
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * Processes field aliases to build entity mappings
129
+ */
130
+ function processFieldAliases(fieldAlias, baseEntity, entitiesMap, entityMap) {
131
+ for (const [aliasName, aliasConfig] of Object.entries(fieldAlias)) {
132
+ const aliasPath = isString(aliasConfig) ? aliasConfig : aliasConfig.path;
133
+ if (!aliasPath) {
134
+ continue;
135
+ }
136
+ // Build the complete path from base entity through alias path
137
+ const pathSegments = aliasPath.split(".");
138
+ let currentEntity = baseEntity;
139
+ let finalEntity = baseEntity;
140
+ let isValidPath = true;
141
+ // Traverse the path to find the final entity
142
+ for (const segment of pathSegments) {
143
+ const entityMapping = findFieldInEntity(currentEntity, segment, entitiesMap);
144
+ if (!entityMapping) {
145
+ isValidPath = false;
146
+ break;
147
+ }
148
+ currentEntity = entityMapping.targetEntity;
149
+ finalEntity = entityMapping.targetEntity;
150
+ }
151
+ if (isValidPath) {
152
+ const fullPath = `${baseEntity}.${aliasName}`;
153
+ entityMap.set(fullPath, {
154
+ entityName: aliasName,
155
+ targetEntity: finalEntity,
156
+ path: pathSegments,
157
+ });
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Finds a field in an entity and returns its target entity
163
+ */
164
+ function findFieldInEntity(entityName, fieldName, entitiesMap) {
165
+ const entity = entitiesMap[entityName];
166
+ if (!entity?.astNode?.fields) {
167
+ return null;
168
+ }
169
+ for (const field of entity.astNode.fields) {
170
+ if (field.name?.value === fieldName) {
171
+ let type = field.type;
172
+ while (type.type) {
173
+ type = type.type;
174
+ }
175
+ const targetEntity = type.name?.value;
176
+ if (targetEntity && !primitiveTypes.has(targetEntity)) {
177
+ return { targetEntity };
178
+ }
179
+ }
180
+ }
181
+ return null;
182
+ }
183
+ /**
184
+ * Gets the complete entity map with all aliases resolved
185
+ */
186
+ function getEntityMap() {
187
+ if (!cachedEntityMap) {
188
+ cachedEntityMap = buildCompleteEntityMap();
189
+ }
190
+ return cachedEntityMap;
191
+ }
192
+ /**
193
+ * Builds executable schema from all joiner configs
194
+ */
195
+ function buildExecutableSchema() {
196
+ const moduleJoinerConfigs = modules_sdk_1.EtoModule.getAllJoinerConfigs();
197
+ const schemaFromJoinerConfigs = getSchemaFromJoinerConfigs(moduleJoinerConfigs);
198
+ const augmentedSchema = baseGraphqlSchema + "\n" + schemaFromJoinerConfigs;
199
+ const executableSchema = makeSchemaExecutable(augmentedSchema);
200
+ return executableSchema || null;
201
+ }
202
+ /**
203
+ * Gets the actual GraphQL entity name from a field path using the complete entity map
204
+ * This now uses the pre-built entity map with all aliases resolved
205
+ * e.g., "product.variants.prices" -> "Price" (from resolved alias path)
206
+ */
207
+ function getActualEntityName(fieldPath) {
208
+ const schema = getExecutableSchema();
209
+ if (!schema) {
210
+ return null;
211
+ }
212
+ const entitiesMap = schema.getTypeMap();
213
+ const entityMap = getEntityMap();
214
+ const entityAliasMap = getEntityAliasMap();
215
+ const parts = fieldPath.split(".");
216
+ const entryPoint = parts[0];
217
+ const resolvedEntityName = entityAliasMap.get(entryPoint);
218
+ if (!resolvedEntityName) {
219
+ return null;
220
+ }
221
+ let currentEntity = entitiesMap[resolvedEntityName];
222
+ let currentEntityName = resolvedEntityName;
223
+ if (!currentEntity) {
224
+ return null;
225
+ }
226
+ for (let i = 1; i < parts.length; i++) {
227
+ const fieldName = parts[i];
228
+ const mappingKey = `${currentEntityName}.${fieldName}`;
229
+ const entityMapping = entityMap.get(mappingKey);
230
+ if (entityMapping) {
231
+ // field alias paths
232
+ const targetEntityName = entityMapping.targetEntity;
233
+ currentEntityName = targetEntityName;
234
+ currentEntity = entitiesMap[currentEntityName];
235
+ if (!currentEntity) {
236
+ return null;
237
+ }
238
+ }
239
+ else {
240
+ const fieldResult = findFieldInEntity(currentEntityName, fieldName, entitiesMap);
241
+ if (!fieldResult) {
242
+ return null;
243
+ }
244
+ currentEntityName = fieldResult.targetEntity;
245
+ currentEntity = entitiesMap[currentEntityName];
246
+ if (!currentEntity) {
247
+ return null;
248
+ }
249
+ }
250
+ }
251
+ return currentEntityName;
252
+ }
253
+ /**
254
+ * Gets the normalized snake_case entity name for policy comparison
255
+ * e.g., "product.variants" -> "product_variant", "Price" -> "price"
256
+ */
257
+ function getNormalizedEntityName(fieldPath) {
258
+ const actualEntityName = getActualEntityName(fieldPath);
259
+ if (!actualEntityName) {
260
+ return null;
261
+ }
262
+ return (0, utils_1.toSnakeCase)(actualEntityName);
263
+ }
264
+ /**
265
+ * Collects all unique entity paths that need permission checks
266
+ * This avoids duplicate permission checks for shared path prefixes
267
+ */
268
+ function collectUniqueEntityPaths(entity, fields) {
269
+ const uniquePaths = new Map();
270
+ for (const field of fields) {
271
+ const fullFieldPath = entity + "." + field;
272
+ const pathSegments = fullFieldPath.split(".");
273
+ // Build paths incrementally using string concatenation (more efficient than slice + join)
274
+ let currentPath = "";
275
+ for (let i = 0; i < pathSegments.length; i++) {
276
+ currentPath =
277
+ i === 0 ? pathSegments[i] : currentPath + "." + pathSegments[i];
278
+ if (!uniquePaths.has(currentPath)) {
279
+ const entityName = getNormalizedEntityName(currentPath);
280
+ uniquePaths.set(currentPath, { path: currentPath, entityName });
281
+ }
282
+ }
283
+ }
284
+ return uniquePaths;
285
+ }
286
+ /**
287
+ * RBAC Field Filter using the Strategy pattern
288
+ * Optimized for parallel permission checks
289
+ */
290
+ class RBACFieldFilter {
291
+ constructor({ policies, userRoles, container, }) {
292
+ this.policies = policies;
293
+ this.userRoles = userRoles;
294
+ this.container = container;
295
+ }
296
+ async getNotAllowedFields(context) {
297
+ const { entity, parsedFields } = context;
298
+ const { fields, starFields } = parsedFields;
299
+ const fieldsToCheck = [...fields, ...Array.from(starFields)];
300
+ if (!fieldsToCheck.length || !this.policies.length || !entity) {
301
+ return [];
302
+ }
303
+ const uniquePaths = collectUniqueEntityPaths(entity, fieldsToCheck);
304
+ const pathsNeedingCheck = [];
305
+ for (const [path, info] of uniquePaths) {
306
+ if (info.entityName && utils_1.PolicyResource[info.entityName]) {
307
+ pathsNeedingCheck.push({ path, entityName: info.entityName });
308
+ }
309
+ }
310
+ const permissionResults = await (0, utils_1.promiseAll)(pathsNeedingCheck.map(async ({ path, entityName }) => {
311
+ const hasAccess = await (0, has_permission_1.hasPermission)({
312
+ roles: this.userRoles,
313
+ actions: { resource: entityName, operation: "read" },
314
+ container: this.container,
315
+ });
316
+ return { path, hasAccess };
317
+ }));
318
+ const accessMap = new Map();
319
+ for (const result of permissionResults) {
320
+ accessMap.set(result.path, result.hasAccess);
321
+ }
322
+ const notAllowedFields = [];
323
+ for (const field of fieldsToCheck) {
324
+ const fullFieldPath = entity + "." + field;
325
+ const pathSegments = fullFieldPath.split(".");
326
+ let currentPath = "";
327
+ let fieldAllowed = true;
328
+ for (let i = 0; i < pathSegments.length; i++) {
329
+ currentPath =
330
+ i === 0 ? pathSegments[i] : currentPath + "." + pathSegments[i];
331
+ // Check if this path was in our permission check results
332
+ if (accessMap.has(currentPath)) {
333
+ const hasAccess = accessMap.get(currentPath);
334
+ if (!hasAccess) {
335
+ fieldAllowed = false;
336
+ break;
337
+ }
338
+ }
339
+ }
340
+ if (!fieldAllowed) {
341
+ notAllowedFields.push(field);
342
+ }
343
+ }
344
+ return notAllowedFields;
345
+ }
346
+ }
347
+ exports.RBACFieldFilter = RBACFieldFilter;
348
+ //# sourceMappingURL=rbac-field-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-field-filter.js","sourceRoot":"","sources":["../../../../src/http/utils/policies/rbac-field-filter.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
+ import { Logger } from "@etohq/types";
1
2
  export declare class LinkLoader {
2
3
  #private;
3
- constructor(sourceDir: string | string[]);
4
+ constructor(sourceDir: string | string[], logger?: Logger);
4
5
  /**
5
6
  * Load links from the source paths, links are registering themselves,
6
7
  * therefore we only need to import them
@@ -1 +1 @@
1
- {"version":3,"file":"link-loader.d.ts","sourceRoot":"","sources":["../../src/links/link-loader.ts"],"names":[],"mappings":"AAMA,qBAAa,UAAU;;gBAmBT,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC;;;OAGG;IACG,IAAI;CAoCX"}
1
+ {"version":3,"file":"link-loader.d.ts","sourceRoot":"","sources":["../../src/links/link-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AASrC,qBAAa,UAAU;;gBAqBT,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM;IAKzD;;;OAGG;IACG,IAAI;CAoCX"}