@rebasepro/common 0.23.0 → 0.24.1-canary.g19596ef

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 (151) hide show
  1. package/README.md +13 -0
  2. package/dist/collections/CollectionRegistry.d.ts +72 -3
  3. package/dist/collections/CollectionRegistry.es.js +404 -0
  4. package/dist/collections/CollectionRegistry.es.js.map +1 -0
  5. package/dist/collections/auth-secrets.es.js +47 -0
  6. package/dist/collections/auth-secrets.es.js.map +1 -0
  7. package/dist/collections/default-collections.es.js +120 -0
  8. package/dist/collections/default-collections.es.js.map +1 -0
  9. package/dist/collections/engine-support.es.js +35 -0
  10. package/dist/collections/engine-support.es.js.map +1 -0
  11. package/dist/collections/field-access.d.ts +13 -0
  12. package/dist/collections/field-access.es.js +142 -0
  13. package/dist/collections/field-access.es.js.map +1 -0
  14. package/dist/collections/index.d.ts +1 -0
  15. package/dist/collections/soft-delete.es.js +34 -0
  16. package/dist/collections/soft-delete.es.js.map +1 -0
  17. package/dist/collections/unknown-field.d.ts +65 -0
  18. package/dist/collections/unknown-field.es.js +135 -0
  19. package/dist/collections/unknown-field.es.js.map +1 -0
  20. package/dist/data/buildRebaseData.d.ts +39 -2
  21. package/dist/data/buildRebaseData.es.js +1038 -0
  22. package/dist/data/buildRebaseData.es.js.map +1 -0
  23. package/dist/data/buildRoutedRebaseData.d.ts +6 -1
  24. package/dist/data/buildRoutedRebaseData.es.js +47 -0
  25. package/dist/data/buildRoutedRebaseData.es.js.map +1 -0
  26. package/dist/data/call-context.d.ts +48 -0
  27. package/dist/data/call-context.es.js +195 -0
  28. package/dist/data/call-context.es.js.map +1 -0
  29. package/dist/data/collection-accessor.d.ts +54 -0
  30. package/dist/data/collection-accessor.es.js +101 -0
  31. package/dist/data/collection-accessor.es.js.map +1 -0
  32. package/dist/data/cursor.d.ts +1 -1
  33. package/dist/data/cursor.es.js +166 -0
  34. package/dist/data/cursor.es.js.map +1 -0
  35. package/dist/data/filter-conditions.es.js +24 -0
  36. package/dist/data/filter-conditions.es.js.map +1 -0
  37. package/dist/data/filter-dialect.d.ts +3 -3
  38. package/dist/data/filter-dialect.es.js +786 -0
  39. package/dist/data/filter-dialect.es.js.map +1 -0
  40. package/dist/data/include-spec.d.ts +2 -0
  41. package/dist/data/include-spec.es.js +273 -0
  42. package/dist/data/include-spec.es.js.map +1 -0
  43. package/dist/data/paginate.d.ts +8 -1
  44. package/dist/data/paginate.es.js +181 -0
  45. package/dist/data/paginate.es.js.map +1 -0
  46. package/dist/data/query_builder.d.ts +52 -4
  47. package/dist/data/query_builder.es.js +151 -0
  48. package/dist/data/query_builder.es.js.map +1 -0
  49. package/dist/data/resolveDataSource.es.js +87 -0
  50. package/dist/data/resolveDataSource.es.js.map +1 -0
  51. package/dist/data/row-etag.d.ts +46 -0
  52. package/dist/data/row-etag.es.js +64 -0
  53. package/dist/data/row-etag.es.js.map +1 -0
  54. package/dist/data/sort-dialect.es.js +236 -0
  55. package/dist/data/sort-dialect.es.js.map +1 -0
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.es.js +59 -7235
  58. package/dist/table-classification.es.js +107 -0
  59. package/dist/table-classification.es.js.map +1 -0
  60. package/dist/util/auth-default-policies.es.js +184 -0
  61. package/dist/util/auth-default-policies.es.js.map +1 -0
  62. package/dist/util/builders.es.js +15 -0
  63. package/dist/util/builders.es.js.map +1 -0
  64. package/dist/util/callback-errors.es.js +164 -0
  65. package/dist/util/callback-errors.es.js.map +1 -0
  66. package/dist/util/callbacks.es.js +72 -0
  67. package/dist/util/callbacks.es.js.map +1 -0
  68. package/dist/util/collections.es.js +79 -0
  69. package/dist/util/collections.es.js.map +1 -0
  70. package/dist/util/common.es.js +7 -0
  71. package/dist/util/common.es.js.map +1 -0
  72. package/dist/util/compose-callbacks.d.ts +55 -0
  73. package/dist/util/compose-callbacks.es.js +154 -0
  74. package/dist/util/compose-callbacks.es.js.map +1 -0
  75. package/dist/util/conditions.es.js +100 -0
  76. package/dist/util/conditions.es.js.map +1 -0
  77. package/dist/util/copy.d.ts +33 -0
  78. package/dist/util/copy.es.js +74 -0
  79. package/dist/util/copy.es.js.map +1 -0
  80. package/dist/util/deprecation.d.ts +27 -0
  81. package/dist/util/deprecation.es.js +44 -0
  82. package/dist/util/deprecation.es.js.map +1 -0
  83. package/dist/util/download-url-cache.d.ts +122 -0
  84. package/dist/util/download-url-cache.es.js +187 -0
  85. package/dist/util/download-url-cache.es.js.map +1 -0
  86. package/dist/util/email.es.js +36 -0
  87. package/dist/util/email.es.js.map +1 -0
  88. package/dist/util/entities.d.ts +27 -2
  89. package/dist/util/entities.es.js +328 -0
  90. package/dist/util/entities.es.js.map +1 -0
  91. package/dist/util/enums.d.ts +10 -1
  92. package/dist/util/enums.es.js +37 -0
  93. package/dist/util/enums.es.js.map +1 -0
  94. package/dist/util/identity.es.js +138 -0
  95. package/dist/util/identity.es.js.map +1 -0
  96. package/dist/util/index.d.ts +8 -0
  97. package/dist/util/internal-tables.d.ts +10 -0
  98. package/dist/util/internal-tables.es.js +202 -0
  99. package/dist/util/internal-tables.es.js.map +1 -0
  100. package/dist/util/junction-policies.es.js +273 -0
  101. package/dist/util/junction-policies.es.js.map +1 -0
  102. package/dist/util/paths.es.js +26 -0
  103. package/dist/util/paths.es.js.map +1 -0
  104. package/dist/util/permissions.es.js +108 -0
  105. package/dist/util/permissions.es.js.map +1 -0
  106. package/dist/util/pg-column-to-property.es.js +303 -0
  107. package/dist/util/pg-column-to-property.es.js.map +1 -0
  108. package/dist/util/policy/compileRulePolicies.d.ts +32 -0
  109. package/dist/util/policy/compileRulePolicies.es.js +43 -0
  110. package/dist/util/policy/compileRulePolicies.es.js.map +1 -0
  111. package/dist/util/policy/evaluatePolicy.es.js +104 -0
  112. package/dist/util/policy/evaluatePolicy.es.js.map +1 -0
  113. package/dist/util/policy/index.d.ts +1 -0
  114. package/dist/util/policy/policyToPostgres.d.ts +24 -0
  115. package/dist/util/policy/policyToPostgres.es.js +593 -0
  116. package/dist/util/policy/policyToPostgres.es.js.map +1 -0
  117. package/dist/util/policy/policyToSecurityRule.es.js +79 -0
  118. package/dist/util/policy/policyToSecurityRule.es.js.map +1 -0
  119. package/dist/util/policy/securityRuleToConditions.es.js +48 -0
  120. package/dist/util/policy/securityRuleToConditions.es.js.map +1 -0
  121. package/dist/util/policy/sqlToPolicy.es.js +326 -0
  122. package/dist/util/policy/sqlToPolicy.es.js.map +1 -0
  123. package/dist/util/relations.es.js +243 -0
  124. package/dist/util/relations.es.js.map +1 -0
  125. package/dist/util/resolutions.es.js +318 -0
  126. package/dist/util/resolutions.es.js.map +1 -0
  127. package/dist/util/resolve-relation.es.js +163 -0
  128. package/dist/util/resolve-relation.es.js.map +1 -0
  129. package/dist/util/resumable-upload-threshold.d.ts +15 -0
  130. package/dist/util/resumable-upload-threshold.es.js +20 -0
  131. package/dist/util/resumable-upload-threshold.es.js.map +1 -0
  132. package/dist/util/resumable-upload.d.ts +51 -0
  133. package/dist/util/resumable-upload.es.js +121 -0
  134. package/dist/util/resumable-upload.es.js.map +1 -0
  135. package/dist/util/sql-redaction.d.ts +21 -0
  136. package/dist/util/sql-redaction.es.js +107 -0
  137. package/dist/util/sql-redaction.es.js.map +1 -0
  138. package/dist/util/sql-rows.es.js +41 -0
  139. package/dist/util/sql-rows.es.js.map +1 -0
  140. package/dist/util/storage.d.ts +26 -4
  141. package/dist/util/storage.es.js +117 -0
  142. package/dist/util/storage.es.js.map +1 -0
  143. package/dist/util/string-column-length.es.js +31 -0
  144. package/dist/util/string-column-length.es.js.map +1 -0
  145. package/dist/util/tenant.es.js +201 -0
  146. package/dist/util/tenant.es.js.map +1 -0
  147. package/dist/util/untrusted-envelope.d.ts +25 -0
  148. package/dist/util/untrusted-envelope.es.js +40 -0
  149. package/dist/util/untrusted-envelope.es.js.map +1 -0
  150. package/package.json +5 -3
  151. package/dist/index.es.js.map +0 -1
@@ -0,0 +1,135 @@
1
+ import { fieldKeyForColumn, findRelation, resolveCollectionRelations } from "../util/relations.es.js";
2
+ import { apiHiddenFieldNames } from "./field-access.es.js";
3
+ //#region src/collections/unknown-field.ts
4
+ /**
5
+ * The fields an unknown-field answer offers as valid, sorted: what a query on
6
+ * this collection can name as a column. A relation contributes its foreign key
7
+ * (`authorId`) when the key is on this table, and nothing otherwise. An
8
+ * `excludeFromApi` field is never offered.
9
+ *
10
+ * Read off the collection rather than the table, so the REST check — which
11
+ * holds no table — lists exactly what the driver lists.
12
+ */
13
+ function queryableFieldNames(collection) {
14
+ const hidden = apiHiddenFieldNames(collection);
15
+ const names = /* @__PURE__ */ new Set();
16
+ let relations;
17
+ for (const [key, property] of Object.entries(collection.properties ?? {})) {
18
+ if (property?.type === "relation") {
19
+ relations ??= resolveCollectionRelations(collection);
20
+ const relation = findRelation(relations, key);
21
+ if (relation?.kind === "belongsTo") names.add(fieldKeyForColumn(collection, relation.localKey));
22
+ continue;
23
+ }
24
+ names.add(key);
25
+ }
26
+ return [...names].filter((name) => !hidden.has(name)).sort();
27
+ }
28
+ var validList = (validFields) => validFields.length > 0 ? `. Valid fields: ${validFields.join(", ")}` : "";
29
+ /** A filter key that resolves to nothing on `collectionPath`. */
30
+ function unknownFilterField(field, collectionPath, validFields) {
31
+ return {
32
+ message: `Unknown filter field '${field}' on collection '${collectionPath}'${validList(validFields)}`,
33
+ code: "UNKNOWN_FILTER_FIELD",
34
+ details: {
35
+ field,
36
+ collection: collectionPath,
37
+ ...validFields.length > 0 && { validFields }
38
+ }
39
+ };
40
+ }
41
+ /** `author.emial` — a relation path whose last segment names nothing on the relation's target. */
42
+ function unknownRelationTargetField(path, target, collectionPath) {
43
+ return {
44
+ message: `Unknown field '${path.fieldKey}' on '${target.slug}', the target of relation '${path.relationKey}' on collection '${collectionPath}'${validList(target.validFields)}`,
45
+ code: "UNKNOWN_FILTER_FIELD",
46
+ details: {
47
+ field: path.field,
48
+ collection: collectionPath,
49
+ relation: path.relationKey,
50
+ targetCollection: target.slug,
51
+ ...target.validFields.length > 0 && { validFields: target.validFields }
52
+ }
53
+ };
54
+ }
55
+ /** An `orderBy` key that resolves to nothing. `collectionName` is absent when the read carries no collection. */
56
+ function unknownOrderByField(orderBy, collectionName, validFields) {
57
+ return {
58
+ message: `Unknown orderBy field '${orderBy}'${collectionName ? ` on collection '${collectionName}'` : ""}${validList(validFields)}`,
59
+ code: "UNKNOWN_ORDER_BY_FIELD",
60
+ details: {
61
+ field: orderBy,
62
+ ...collectionName && { collection: collectionName },
63
+ ...validFields.length > 0 && { validFields }
64
+ }
65
+ };
66
+ }
67
+ /** A `fields` entry that names nothing. */
68
+ function unknownProjectionField(name, collectionName, validFields) {
69
+ return {
70
+ message: `Unknown field '${name}' in \`fields\` on collection '${collectionName}'. Valid fields: ${validFields.join(", ")}`,
71
+ code: "UNKNOWN_FIELD",
72
+ details: {
73
+ field: name,
74
+ collection: collectionName
75
+ }
76
+ };
77
+ }
78
+ /**
79
+ * An `include` naming no relation of the collection. `validRelations` is what
80
+ * the collection declares, never an `excludeFromApi` relation.
81
+ */
82
+ function unknownIncludeRelation(key, collectionName, validRelations) {
83
+ return {
84
+ message: `Unknown relation '${key}' on collection '${collectionName}'` + (validRelations.length > 0 ? `. Its relations are: ${validRelations.join(", ")}` : ". It declares no relations."),
85
+ code: "UNKNOWN_RELATION",
86
+ details: {
87
+ relation: key,
88
+ collection: collectionName,
89
+ ...validRelations.length > 0 && { validRelations }
90
+ }
91
+ };
92
+ }
93
+ /** The relations an unknown-relation answer offers, sorted — never an `excludeFromApi` one. */
94
+ function includableRelationNames(collection) {
95
+ const hidden = apiHiddenFieldNames(collection);
96
+ return Object.keys(resolveCollectionRelations(collection)).filter((key) => !hidden.has(key)).sort();
97
+ }
98
+ /**
99
+ * An aggregate's `select` field or `groupBy` key that names no column.
100
+ * `forWhat` is where it was named: `sum()`, `count()`, `groupBy`.
101
+ * `validFields` is {@link queryableFieldNames}, never an `excludeFromApi` field.
102
+ */
103
+ function unknownAggregateField(field, forWhat, validFields) {
104
+ return {
105
+ message: `Unknown field '${field}' in ${forWhat}${validList(validFields)}`,
106
+ code: "UNKNOWN_AGGREGATE_FIELD",
107
+ details: {
108
+ field,
109
+ ...validFields.length > 0 && { validFields }
110
+ }
111
+ };
112
+ }
113
+ /**
114
+ * The properties a `vector_search` can name, sorted: those declared
115
+ * `{ type: "vector" }`, never an `excludeFromApi` one.
116
+ */
117
+ function vectorPropertyNames(collection) {
118
+ const hidden = apiHiddenFieldNames(collection);
119
+ return Object.entries(collection.properties ?? {}).filter(([key, property]) => property?.type === "vector" && !hidden.has(key)).map(([key]) => key).sort();
120
+ }
121
+ /** A `vector_search` naming no vector property. `vectorProperties` is {@link vectorPropertyNames}. */
122
+ function unknownVectorProperty(property, vectorProperties) {
123
+ return {
124
+ message: `Unknown vector property "${property}". ` + (vectorProperties.length > 0 ? `This collection's vector properties are: ${vectorProperties.join(", ")}.` : "This collection declares no `vector` property to search."),
125
+ code: "UNKNOWN_VECTOR_PROPERTY",
126
+ details: {
127
+ property,
128
+ ...vectorProperties.length > 0 && { vectorProperties }
129
+ }
130
+ };
131
+ }
132
+ //#endregion
133
+ export { includableRelationNames, queryableFieldNames, unknownAggregateField, unknownFilterField, unknownIncludeRelation, unknownOrderByField, unknownProjectionField, unknownRelationTargetField, unknownVectorProperty, vectorPropertyNames };
134
+
135
+ //# sourceMappingURL=unknown-field.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown-field.es.js","names":[],"sources":["../../src/collections/unknown-field.ts"],"sourcesContent":["import type { CollectionConfig, Property } from \"@rebasepro/types\";\nimport { fieldKeyForColumn, findRelation, resolveCollectionRelations } from \"../util/relations\";\nimport { apiHiddenFieldNames } from \"./field-access\";\n\n/**\n * The answers a query gets for naming a field that does not exist — written\n * once, here, because two layers give them.\n *\n * The driver gives them for a typo. The REST check gives the same ones for a\n * field marked `excludeFromApi`: OpenAPI, `list_collections` and the generated\n * SDK all leave such a field out, so anything but the typo's answer — \"not\n * readable\", a different message, a list that names it — confirms it exists.\n * Both build the answer from these functions, so the two cannot drift apart by\n * a byte. Each returns the parts of the 400 (`message`, `code`, `details`) and\n * the caller wraps them in its own error type.\n *\n * @module\n */\n\nexport interface UnknownFieldAnswer {\n message: string;\n code: string;\n details: Record<string, unknown>;\n}\n\n/**\n * The fields an unknown-field answer offers as valid, sorted: what a query on\n * this collection can name as a column. A relation contributes its foreign key\n * (`authorId`) when the key is on this table, and nothing otherwise. An\n * `excludeFromApi` field is never offered.\n *\n * Read off the collection rather than the table, so the REST check — which\n * holds no table — lists exactly what the driver lists.\n */\nexport function queryableFieldNames(collection: CollectionConfig): string[] {\n const hidden = apiHiddenFieldNames(collection);\n const names = new Set<string>();\n let relations: ReturnType<typeof resolveCollectionRelations> | undefined;\n for (const [key, property] of Object.entries(collection.properties ?? {})) {\n if ((property as Property | undefined)?.type === \"relation\") {\n relations ??= resolveCollectionRelations(collection);\n const relation = findRelation(relations, key);\n if (relation?.kind === \"belongsTo\") names.add(fieldKeyForColumn(collection, relation.localKey));\n continue;\n }\n names.add(key);\n }\n return [...names].filter(name => !hidden.has(name)).sort();\n}\n\nconst validList = (validFields: string[]): string =>\n validFields.length > 0 ? `. Valid fields: ${validFields.join(\", \")}` : \"\";\n\n/** A filter key that resolves to nothing on `collectionPath`. */\nexport function unknownFilterField(field: string, collectionPath: string, validFields: string[]): UnknownFieldAnswer {\n return {\n message: `Unknown filter field '${field}' on collection '${collectionPath}'${validList(validFields)}`,\n code: \"UNKNOWN_FILTER_FIELD\",\n details: { field, collection: collectionPath, ...(validFields.length > 0 && { validFields }) }\n };\n}\n\n/** `author.emial` — a relation path whose last segment names nothing on the relation's target. */\nexport function unknownRelationTargetField(\n path: { field: string; relationKey: string; fieldKey: string },\n target: { slug: string; validFields: string[] },\n collectionPath: string\n): UnknownFieldAnswer {\n return {\n message: `Unknown field '${path.fieldKey}' on '${target.slug}', the target of relation ` +\n `'${path.relationKey}' on collection '${collectionPath}'${validList(target.validFields)}`,\n code: \"UNKNOWN_FILTER_FIELD\",\n details: {\n field: path.field,\n collection: collectionPath,\n relation: path.relationKey,\n targetCollection: target.slug,\n ...(target.validFields.length > 0 && { validFields: target.validFields })\n }\n };\n}\n\n/** An `orderBy` key that resolves to nothing. `collectionName` is absent when the read carries no collection. */\nexport function unknownOrderByField(orderBy: string, collectionName: string | undefined, validFields: string[]): UnknownFieldAnswer {\n const onCollection = collectionName ? ` on collection '${collectionName}'` : \"\";\n return {\n message: `Unknown orderBy field '${orderBy}'${onCollection}${validList(validFields)}`,\n code: \"UNKNOWN_ORDER_BY_FIELD\",\n details: {\n field: orderBy,\n ...(collectionName && { collection: collectionName }),\n ...(validFields.length > 0 && { validFields })\n }\n };\n}\n\n/** A `fields` entry that names nothing. */\nexport function unknownProjectionField(name: string, collectionName: string, validFields: string[]): UnknownFieldAnswer {\n return {\n message: `Unknown field '${name}' in \\`fields\\` on collection '${collectionName}'. Valid fields: ${validFields.join(\", \")}`,\n code: \"UNKNOWN_FIELD\",\n details: { field: name, collection: collectionName }\n };\n}\n\n/**\n * An `include` naming no relation of the collection. `validRelations` is what\n * the collection declares, never an `excludeFromApi` relation.\n */\nexport function unknownIncludeRelation(key: string, collectionName: string, validRelations: string[]): UnknownFieldAnswer {\n return {\n message: `Unknown relation '${key}' on collection '${collectionName}'`\n + (validRelations.length > 0\n ? `. Its relations are: ${validRelations.join(\", \")}`\n : \". It declares no relations.\"),\n code: \"UNKNOWN_RELATION\",\n details: { relation: key, collection: collectionName, ...(validRelations.length > 0 && { validRelations }) }\n };\n}\n\n/** The relations an unknown-relation answer offers, sorted — never an `excludeFromApi` one. */\nexport function includableRelationNames(collection: CollectionConfig): string[] {\n const hidden = apiHiddenFieldNames(collection);\n return Object.keys(resolveCollectionRelations(collection)).filter(key => !hidden.has(key)).sort();\n}\n\n/**\n * An aggregate's `select` field or `groupBy` key that names no column.\n * `forWhat` is where it was named: `sum()`, `count()`, `groupBy`.\n * `validFields` is {@link queryableFieldNames}, never an `excludeFromApi` field.\n */\nexport function unknownAggregateField(field: string, forWhat: string, validFields: string[]): UnknownFieldAnswer {\n return {\n message: `Unknown field '${field}' in ${forWhat}${validList(validFields)}`,\n code: \"UNKNOWN_AGGREGATE_FIELD\",\n details: { field, ...(validFields.length > 0 && { validFields }) }\n };\n}\n\n/**\n * The properties a `vector_search` can name, sorted: those declared\n * `{ type: \"vector\" }`, never an `excludeFromApi` one.\n */\nexport function vectorPropertyNames(collection: CollectionConfig): string[] {\n const hidden = apiHiddenFieldNames(collection);\n return Object.entries(collection.properties ?? {})\n .filter(([key, property]) => (property as Property | undefined)?.type === \"vector\" && !hidden.has(key))\n .map(([key]) => key)\n .sort();\n}\n\n/** A `vector_search` naming no vector property. `vectorProperties` is {@link vectorPropertyNames}. */\nexport function unknownVectorProperty(property: string, vectorProperties: string[]): UnknownFieldAnswer {\n return {\n message: `Unknown vector property \"${property}\". ` +\n (vectorProperties.length > 0\n ? `This collection's vector properties are: ${vectorProperties.join(\", \")}.`\n : \"This collection declares no `vector` property to search.\"),\n code: \"UNKNOWN_VECTOR_PROPERTY\",\n details: { property, ...(vectorProperties.length > 0 && { vectorProperties }) }\n };\n}\n"],"mappings":";;;;;;;;;;;;AAkCA,SAAgB,oBAAoB,YAAwC;CACxE,MAAM,SAAS,oBAAoB,UAAU;CAC7C,MAAM,wBAAQ,IAAI,IAAY;CAC9B,IAAI;CACJ,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,WAAW,cAAc,CAAC,CAAC,GAAG;EACvE,IAAK,UAAmC,SAAS,YAAY;GACzD,cAAc,2BAA2B,UAAU;GACnD,MAAM,WAAW,aAAa,WAAW,GAAG;GAC5C,IAAI,UAAU,SAAS,aAAa,MAAM,IAAI,kBAAkB,YAAY,SAAS,QAAQ,CAAC;GAC9F;EACJ;EACA,MAAM,IAAI,GAAG;CACjB;CACA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,QAAO,SAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK;AAC7D;AAEA,IAAM,aAAa,gBACf,YAAY,SAAS,IAAI,mBAAmB,YAAY,KAAK,IAAI,MAAM;;AAG3E,SAAgB,mBAAmB,OAAe,gBAAwB,aAA2C;CACjH,OAAO;EACH,SAAS,yBAAyB,MAAM,mBAAmB,eAAe,GAAG,UAAU,WAAW;EAClG,MAAM;EACN,SAAS;GAAE;GAAO,YAAY;GAAgB,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;EAAG;CACjG;AACJ;;AAGA,SAAgB,2BACZ,MACA,QACA,gBACkB;CAClB,OAAO;EACH,SAAS,kBAAkB,KAAK,SAAS,QAAQ,OAAO,KAAK,6BACrD,KAAK,YAAY,mBAAmB,eAAe,GAAG,UAAU,OAAO,WAAW;EAC1F,MAAM;EACN,SAAS;GACL,OAAO,KAAK;GACZ,YAAY;GACZ,UAAU,KAAK;GACf,kBAAkB,OAAO;GACzB,GAAI,OAAO,YAAY,SAAS,KAAK,EAAE,aAAa,OAAO,YAAY;EAC3E;CACJ;AACJ;;AAGA,SAAgB,oBAAoB,SAAiB,gBAAoC,aAA2C;CAEhI,OAAO;EACH,SAAS,0BAA0B,QAAQ,GAF1B,iBAAiB,mBAAmB,eAAe,KAAK,KAEZ,UAAU,WAAW;EAClF,MAAM;EACN,SAAS;GACL,OAAO;GACP,GAAI,kBAAkB,EAAE,YAAY,eAAe;GACnD,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;EAChD;CACJ;AACJ;;AAGA,SAAgB,uBAAuB,MAAc,gBAAwB,aAA2C;CACpH,OAAO;EACH,SAAS,kBAAkB,KAAK,iCAAiC,eAAe,mBAAmB,YAAY,KAAK,IAAI;EACxH,MAAM;EACN,SAAS;GAAE,OAAO;GAAM,YAAY;EAAe;CACvD;AACJ;;;;;AAMA,SAAgB,uBAAuB,KAAa,gBAAwB,gBAA8C;CACtH,OAAO;EACH,SAAS,qBAAqB,IAAI,mBAAmB,eAAe,MAC7D,eAAe,SAAS,IACrB,wBAAwB,eAAe,KAAK,IAAI,MAChD;EACV,MAAM;EACN,SAAS;GAAE,UAAU;GAAK,YAAY;GAAgB,GAAI,eAAe,SAAS,KAAK,EAAE,eAAe;EAAG;CAC/G;AACJ;;AAGA,SAAgB,wBAAwB,YAAwC;CAC5E,MAAM,SAAS,oBAAoB,UAAU;CAC7C,OAAO,OAAO,KAAK,2BAA2B,UAAU,CAAC,CAAC,CAAC,QAAO,QAAO,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK;AACpG;;;;;;AAOA,SAAgB,sBAAsB,OAAe,SAAiB,aAA2C;CAC7G,OAAO;EACH,SAAS,kBAAkB,MAAM,OAAO,UAAU,UAAU,WAAW;EACvE,MAAM;EACN,SAAS;GAAE;GAAO,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;EAAG;CACrE;AACJ;;;;;AAMA,SAAgB,oBAAoB,YAAwC;CACxE,MAAM,SAAS,oBAAoB,UAAU;CAC7C,OAAO,OAAO,QAAQ,WAAW,cAAc,CAAC,CAAC,CAAC,CAC7C,QAAQ,CAAC,KAAK,cAAe,UAAmC,SAAS,YAAY,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CACtG,KAAK,CAAC,SAAS,GAAG,CAAC,CACnB,KAAK;AACd;;AAGA,SAAgB,sBAAsB,UAAkB,kBAAgD;CACpG,OAAO;EACH,SAAS,4BAA4B,SAAS,QACzC,iBAAiB,SAAS,IACrB,4CAA4C,iBAAiB,KAAK,IAAI,EAAE,KACxE;EACV,MAAM;EACN,SAAS;GAAE;GAAU,GAAI,iBAAiB,SAAS,KAAK,EAAE,iBAAiB;EAAG;CAClF;AACJ"}
@@ -22,6 +22,28 @@ export interface EntityDataOptions {
22
22
  relations?: unknown[];
23
23
  slug?: string;
24
24
  } | undefined;
25
+ /**
26
+ * Translate the path a collection is addressed by into the path its driver
27
+ * stores it under.
28
+ *
29
+ * The admin addresses every collection by its slug, and a Firestore or
30
+ * MongoDB collection may declare a `path` of its own: `fs_diagnosis` stored
31
+ * at `diagnosis`, and `fs_diagnosis/abc/locales` at `diagnosis/abc/locales`.
32
+ * Only the driver is handed the stored path. Rows keep the address they
33
+ * were asked for by, because that is what the admin resolves their
34
+ * collection, routes and deletes by.
35
+ *
36
+ * Late-bound, like `resolveCollection`. Absent, or answering `undefined`,
37
+ * the address is the stored path.
38
+ */
39
+ resolveDataPath?: (path: string) => string | undefined;
40
+ /**
41
+ * The slug a property of the proxy names (`data.myNotes`). Absent, a
42
+ * property is its snake_case (`my_notes`). The server passes
43
+ * `createAccessorSlugResolver` over its collection registry, so a
44
+ * collection is reachable under the accessor its generated type has.
45
+ */
46
+ resolveAccessor?: (property: string) => string;
25
47
  }
26
48
  export declare function buildRebaseData(driver: DataDriver, options?: EntityDataOptions): RebaseData;
27
49
  /**
@@ -50,8 +72,15 @@ export declare function wrapAsEntityData(sdkData: Pick<RebaseSdkData, "collectio
50
72
  * the flat SDK data layer (`context.data`) from an existing Entity data layer
51
73
  * — e.g. the admin routes its Entity data via `useData()` and exposes the
52
74
  * same routing as flat `context.data` for callbacks by wrapping it here.
75
+ *
76
+ * `DB` is the generated `Database` the result is typed from. One object serves
77
+ * every `Database` — each accessor is resolved by name when it is read — so it
78
+ * describes the result and changes nothing it does. Only an explicit type
79
+ * argument sets it (`NoInfer`): inferred from where the result is assigned, it
80
+ * would be whatever that place declares — an untyped `Promise<RebaseSdkData>`
81
+ * made it `RebaseSdkData | PromiseLike<RebaseSdkData>`. Untyped by default.
53
82
  */
54
- export declare function wrapAsSdkData(entityData: RebaseData): RebaseSdkData;
83
+ export declare function wrapAsSdkData<DB = unknown>(entityData: RebaseData, options?: Pick<EntityDataOptions, "resolveAccessor">): RebaseSdkData<NoInfer<DB>>;
55
84
  /**
56
85
  * Build a flat {@link RebaseSdkData} from a `DataDriver`.
57
86
  *
@@ -63,5 +92,13 @@ export declare function wrapAsSdkData(entityData: RebaseData): RebaseSdkData;
63
92
  * the admin's view-model and never reaches here.
64
93
  *
65
94
  * The admin uses {@link buildRebaseData} (Entity) over its own driver.
95
+ *
96
+ * `options.resolveAccessor` names the slug a property is (see
97
+ * `createAccessorSlugResolver`); absent, `data.myNotes` is `my_notes`.
98
+ *
99
+ * `DB` types the result from a generated `Database` — `buildSdkData<Database>(driver)`
100
+ * is the plane `context.data` is in a project that registered it. It describes
101
+ * the object and changes nothing it does, and only an explicit type argument
102
+ * sets it (see {@link wrapAsSdkData}); untyped by default.
66
103
  */
67
- export declare function buildSdkData(driver: DataDriver): RebaseSdkData;
104
+ export declare function buildSdkData<DB = unknown>(driver: DataDriver, options?: Pick<EntityDataOptions, "resolveAccessor">): RebaseSdkData<NoInfer<DB>>;