@teleporthq/teleport-plugin-next-data-source 0.44.15 → 0.45.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/__tests__/_helpers/exposure.ts +29 -0
- package/__tests__/_helpers/first-page-runtime.ts +12 -2
- package/__tests__/blog-post-contents.test.ts +3 -1
- package/__tests__/blog-post-page-enrichment.test.ts +2 -1
- package/__tests__/blog-post-seo-fields.test.ts +124 -0
- package/__tests__/browser-row-policy.test.ts +65 -5
- package/__tests__/data-source-cache-wrapping.test.ts +48 -7
- package/__tests__/external-read-routes-guard.test.ts +991 -0
- package/__tests__/null-filter-where.test.ts +19 -2
- package/__tests__/range-control.test.ts +29 -0
- package/__tests__/search-relevance.test.ts +42 -6
- package/__tests__/table-read-route-protected-tables.test.ts +54 -4
- package/dist/cjs/count-fetchers.d.ts.map +1 -1
- package/dist/cjs/count-fetchers.js +1 -1
- package/dist/cjs/count-fetchers.js.map +1 -1
- package/dist/cjs/data-source-fetchers.d.ts +4 -0
- package/dist/cjs/data-source-fetchers.d.ts.map +1 -1
- package/dist/cjs/data-source-fetchers.js +97 -20
- package/dist/cjs/data-source-fetchers.js.map +1 -1
- package/dist/cjs/fetchers/postgresql.d.ts +3 -1
- package/dist/cjs/fetchers/postgresql.d.ts.map +1 -1
- package/dist/cjs/fetchers/postgresql.js +11 -3
- package/dist/cjs/fetchers/postgresql.js.map +1 -1
- package/dist/cjs/fetchers/raw-query.d.ts +20 -1
- package/dist/cjs/fetchers/raw-query.d.ts.map +1 -1
- package/dist/cjs/fetchers/raw-query.js +37 -7
- package/dist/cjs/fetchers/raw-query.js.map +1 -1
- package/dist/cjs/fetchers/redshift.d.ts.map +1 -1
- package/dist/cjs/fetchers/redshift.js +2 -1
- package/dist/cjs/fetchers/redshift.js.map +1 -1
- package/dist/cjs/fetchers/teleport.d.ts.map +1 -1
- package/dist/cjs/fetchers/teleport.js +5 -3
- package/dist/cjs/fetchers/teleport.js.map +1 -1
- package/dist/cjs/fetchers/utils/external-read-guard.d.ts +53 -0
- package/dist/cjs/fetchers/utils/external-read-guard.d.ts.map +1 -0
- package/dist/cjs/fetchers/utils/external-read-guard.js +126 -0
- package/dist/cjs/fetchers/utils/external-read-guard.js.map +1 -0
- package/dist/cjs/fetchers/utils/table-access-guard.d.ts +76 -12
- package/dist/cjs/fetchers/utils/table-access-guard.d.ts.map +1 -1
- package/dist/cjs/fetchers/utils/table-access-guard.js +123 -15
- package/dist/cjs/fetchers/utils/table-access-guard.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/pagination-controls.d.ts +4 -1
- package/dist/cjs/pagination-controls.d.ts.map +1 -1
- package/dist/cjs/pagination-controls.js +4 -1
- package/dist/cjs/pagination-controls.js.map +1 -1
- package/dist/cjs/pagination-plugin.js +1 -0
- package/dist/cjs/pagination-plugin.js.map +1 -1
- package/dist/cjs/range-control.d.ts +10 -5
- package/dist/cjs/range-control.d.ts.map +1 -1
- package/dist/cjs/range-control.js +23 -2
- package/dist/cjs/range-control.js.map +1 -1
- package/dist/cjs/transformations/blog-post.d.ts +5 -0
- package/dist/cjs/transformations/blog-post.d.ts.map +1 -1
- package/dist/cjs/transformations/blog-post.js +6 -2
- package/dist/cjs/transformations/blog-post.js.map +1 -1
- package/dist/cjs/transformations/index.d.ts +18 -2
- package/dist/cjs/transformations/index.d.ts.map +1 -1
- package/dist/cjs/transformations/index.js +26 -1
- package/dist/cjs/transformations/index.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/count-fetchers.d.ts.map +1 -1
- package/dist/esm/count-fetchers.js +1 -1
- package/dist/esm/count-fetchers.js.map +1 -1
- package/dist/esm/data-source-fetchers.d.ts +4 -0
- package/dist/esm/data-source-fetchers.d.ts.map +1 -1
- package/dist/esm/data-source-fetchers.js +97 -20
- package/dist/esm/data-source-fetchers.js.map +1 -1
- package/dist/esm/fetchers/postgresql.d.ts +3 -1
- package/dist/esm/fetchers/postgresql.d.ts.map +1 -1
- package/dist/esm/fetchers/postgresql.js +12 -4
- package/dist/esm/fetchers/postgresql.js.map +1 -1
- package/dist/esm/fetchers/raw-query.d.ts +20 -1
- package/dist/esm/fetchers/raw-query.d.ts.map +1 -1
- package/dist/esm/fetchers/raw-query.js +38 -8
- package/dist/esm/fetchers/raw-query.js.map +1 -1
- package/dist/esm/fetchers/redshift.d.ts.map +1 -1
- package/dist/esm/fetchers/redshift.js +2 -1
- package/dist/esm/fetchers/redshift.js.map +1 -1
- package/dist/esm/fetchers/teleport.d.ts.map +1 -1
- package/dist/esm/fetchers/teleport.js +6 -4
- package/dist/esm/fetchers/teleport.js.map +1 -1
- package/dist/esm/fetchers/utils/external-read-guard.d.ts +53 -0
- package/dist/esm/fetchers/utils/external-read-guard.d.ts.map +1 -0
- package/dist/esm/fetchers/utils/external-read-guard.js +118 -0
- package/dist/esm/fetchers/utils/external-read-guard.js.map +1 -0
- package/dist/esm/fetchers/utils/table-access-guard.d.ts +76 -12
- package/dist/esm/fetchers/utils/table-access-guard.d.ts.map +1 -1
- package/dist/esm/fetchers/utils/table-access-guard.js +119 -15
- package/dist/esm/fetchers/utils/table-access-guard.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/pagination-controls.d.ts +4 -1
- package/dist/esm/pagination-controls.d.ts.map +1 -1
- package/dist/esm/pagination-controls.js +4 -1
- package/dist/esm/pagination-controls.js.map +1 -1
- package/dist/esm/pagination-plugin.js +1 -0
- package/dist/esm/pagination-plugin.js.map +1 -1
- package/dist/esm/range-control.d.ts +10 -5
- package/dist/esm/range-control.d.ts.map +1 -1
- package/dist/esm/range-control.js +23 -2
- package/dist/esm/range-control.js.map +1 -1
- package/dist/esm/transformations/blog-post.d.ts +5 -0
- package/dist/esm/transformations/blog-post.d.ts.map +1 -1
- package/dist/esm/transformations/blog-post.js +6 -2
- package/dist/esm/transformations/blog-post.js.map +1 -1
- package/dist/esm/transformations/index.d.ts +18 -2
- package/dist/esm/transformations/index.d.ts.map +1 -1
- package/dist/esm/transformations/index.js +27 -2
- package/dist/esm/transformations/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/count-fetchers.ts +10 -2
- package/src/data-source-fetchers.ts +144 -23
- package/src/fetchers/postgresql.ts +38 -9
- package/src/fetchers/raw-query.ts +125 -13
- package/src/fetchers/redshift.ts +3 -0
- package/src/fetchers/teleport.ts +29 -8
- package/src/fetchers/utils/external-read-guard.ts +289 -0
- package/src/fetchers/utils/table-access-guard.ts +469 -20
- package/src/index.ts +1 -1
- package/src/pagination-controls.ts +4 -1
- package/src/pagination-plugin.ts +1 -0
- package/src/range-control.ts +40 -8
- package/src/transformations/blog-post.ts +107 -4
- package/src/transformations/index.ts +44 -1
|
@@ -1,22 +1,126 @@
|
|
|
1
|
-
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
13
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
14
|
+
if (ar || !(i in from)) {
|
|
15
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
16
|
+
ar[i] = from[i];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
20
|
+
};
|
|
21
|
+
import { DataExposure, SessionCookieResolver, TableAccess } from '@teleporthq/teleport-shared';
|
|
2
22
|
import { generateBrowserRowAccessCall, generateBrowserRowPolicyCode } from './browser-row-policy';
|
|
3
23
|
/**
|
|
4
|
-
* The
|
|
24
|
+
* The guard of a generated per-table read route
|
|
5
25
|
* (`/api/teleport-<table>-<source>` and its `-count` twin).
|
|
6
26
|
*
|
|
7
|
-
* Every table a page binds gets such a route, and the route
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
27
|
+
* Every table a page binds gets such a route, and the route is a URL anyone
|
|
28
|
+
* can call. Three nets, in this order:
|
|
29
|
+
* 1. the table's EXPOSURE, decided at export time from the pages that bind it
|
|
30
|
+
* (`DataExposure.resolveDataExposure`): a table a public page shows is read
|
|
31
|
+
* by anyone; one only protected pages bind needs a session one of them
|
|
32
|
+
* admits; one no page binds is the app's own server code's;
|
|
33
|
+
* 2. the protected tables (see `TableAccess.PROTECTED_TABLES`): money and
|
|
34
|
+
* customer records, read only by a server segment presenting the app
|
|
35
|
+
* secret or a signed-in member of a trusted role (the generated admin);
|
|
36
|
+
* 3. the browser row policy (see `browser-row-policy.ts`): unpublished rows
|
|
37
|
+
* and private columns of the public tables.
|
|
38
|
+
* A server-side caller (the app secret, or the module's own in-process
|
|
39
|
+
* `fetchData`) passes all three.
|
|
40
|
+
*
|
|
41
|
+
* Every row count a request names is a whole number, and a browser's read is
|
|
42
|
+
* capped (`__taReadWindow`): a missing count gets the table's default, a large
|
|
43
|
+
* one the table's maximum.
|
|
16
44
|
*/
|
|
17
|
-
/**
|
|
18
|
-
export var
|
|
19
|
-
|
|
45
|
+
/** No route reads more than this many rows past the first, from a browser. */
|
|
46
|
+
export var BROWSER_READ_MAX_OFFSET = 1000000;
|
|
47
|
+
/** The columns `config.selectedTables[tableName]` lists, with their types, or null when the config holds no schema for it. */
|
|
48
|
+
export var schemaOf = function (config, tableName) {
|
|
49
|
+
var selected = config === null || config === void 0 ? void 0 : config.selectedTables;
|
|
50
|
+
if (!selected || typeof selected !== 'object') {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
var bare = DataExposure.bareTableName(tableName);
|
|
54
|
+
var table = selected[tableName] ||
|
|
55
|
+
Object.keys(selected)
|
|
56
|
+
.filter(function (key) { return DataExposure.bareTableName(key) === bare; })
|
|
57
|
+
.map(function (key) { return selected[key]; })[0];
|
|
58
|
+
if (!table || !Array.isArray(table.columns)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return table.columns
|
|
62
|
+
.filter(function (column) { return column && typeof column.name === 'string' && column.name.length > 0; })
|
|
63
|
+
.map(function (column) { return (__assign({ name: column.name }, (typeof column.type === 'string' && { type: column.type }))); });
|
|
64
|
+
};
|
|
65
|
+
/** The columns `config.selectedTables[tableName]` lists, or null when the config holds no schema for it. */
|
|
66
|
+
export var schemaColumnsOf = function (config, tableName) {
|
|
67
|
+
var schema = schemaOf(config, tableName);
|
|
68
|
+
return schema ? schema.map(function (column) { return column.name; }) : null;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* The exposure check, the row window and the request-field check, for a
|
|
72
|
+
* module whose table is `exposure`'s. Uses `__taIsInternalRequest`,
|
|
73
|
+
* `__taRoleOf` and `__tqSessionToken` from the preamble.
|
|
74
|
+
*/
|
|
75
|
+
export var generateRouteExposureCode = function (exposure, fieldPolicy, tableName) {
|
|
76
|
+
if (fieldPolicy === void 0) { fieldPolicy = { columns: [] }; }
|
|
77
|
+
if (tableName === void 0) { tableName = ''; }
|
|
78
|
+
var routeExposure = exposure || DataExposure.CLOSED_READ_EXPOSURE;
|
|
79
|
+
var subscriberRules = routeExposure.subscriberRules || [];
|
|
80
|
+
var ownerRules = routeExposure.ownerRules || [];
|
|
81
|
+
var knownColumns = fieldPolicy.columns === null
|
|
82
|
+
? null
|
|
83
|
+
: Array.from(new Set(__spreadArray(__spreadArray([], fieldPolicy.columns, true), (routeExposure.fields || []), true).map(function (column) {
|
|
84
|
+
return String(column).toLowerCase();
|
|
85
|
+
}))).sort();
|
|
86
|
+
return "// GENERATED \u2014 see generateRouteExposureCode in teleport-plugin-next-data-source.\n// Who may read this route's table from a browser, decided at export time from\n// the pages that bind it: anyone when a page every visitor may open does;\n// otherwise a session one of the binding pages admits \u2014 with an entitled\n// subscription, when that page is subscriber-only. The app's own server code\n// always may.\nvar __TA_ROUTE_EXPOSURE = ".concat(JSON.stringify({
|
|
87
|
+
public: routeExposure.public === true,
|
|
88
|
+
anySession: routeExposure.anySession === true,
|
|
89
|
+
roles: routeExposure.roles || [],
|
|
90
|
+
subscriberRules: subscriberRules,
|
|
91
|
+
ownerRules: ownerRules,
|
|
92
|
+
defaultLimit: routeExposure.defaultLimit,
|
|
93
|
+
maxLimit: routeExposure.maxLimit,
|
|
94
|
+
}), ";\nvar __TA_MAX_OFFSET = ").concat(BROWSER_READ_MAX_OFFSET, ";\nvar __TA_ROUTE_TABLE = ").concat(JSON.stringify(DataExposure.bareTableName(tableName)), ";\n// The fields a request may name (see RequestFieldPolicy): null columns = a source\n// without a schema, checked for shape only.\nvar __TA_FIELD_POLICY = ").concat(JSON.stringify({
|
|
95
|
+
columns: knownColumns,
|
|
96
|
+
virtualFields: (fieldPolicy.virtualFields || []).map(function (field) { return field.toLowerCase(); }),
|
|
97
|
+
virtualPrefixes: (fieldPolicy.virtualPrefixes || []).map(function (prefix) { return prefix.toLowerCase(); }),
|
|
98
|
+
documentStore: fieldPolicy.documentStore === true,
|
|
99
|
+
}), ";\nvar __TA_FIELD_PATTERN = ").concat(fieldPolicy.pattern ? fieldPolicy.pattern.toString() : 'null', ";\n").concat(subscriberRules.length > 0 ? DataExposure.generateEntitlementCheckCode() : '', "\n// null when the request may read the table, else { status, message }.\nasync function __taGuardExposure(req) {\n if (__TA_ROUTE_EXPOSURE.public === true) return null;\n if (__taIsInternalRequest(req)) return null;\n // A page's own data, read in-process to render it (`fetchData(params, { as:\n // 'visitor' })`): the page's access guard already admitted whoever opened it,\n // and the read is served as an anonymous visitor's (__taGuardRead, the row\n // policy). It carries no session to check here \u2014 a protected page would\n // otherwise render nothing.\n if (__taIsVisitorView(req)) return null;\n // No page binds the table: no session could read it from a browser.\n if (\n __TA_ROUTE_EXPOSURE.anySession !== true &&\n __TA_ROUTE_EXPOSURE.roles.length === 0 &&\n __TA_ROUTE_EXPOSURE.subscriberRules.length === 0 &&\n __TA_ROUTE_EXPOSURE.ownerRules.length === 0\n ) {\n return { status: 403, message: 'Forbidden' };\n }\n var token = null;\n try {\n token = await __tqSessionToken(req);\n } catch (e) {\n token = null;\n }\n if (!token) return { status: 401, message: 'Unauthenticated' };\n if (__TA_ROUTE_EXPOSURE.anySession === true) return null;\n var role = __taRoleOf(token);\n if (role && __TA_ROUTE_EXPOSURE.roles.indexOf(role) !== -1) return null;\n // A row-owned page: the session reads its own rows only \u2014 the condition is\n // added to the read by the server (__taApplyOwnerScope).\n if (__TA_ROUTE_EXPOSURE.ownerRules.length > 0) {\n var ownerId = token.id || token.sub;\n if (!ownerId) return { status: 403, message: 'Forbidden' };\n req.__tqOwnerScope = { userId: String(ownerId) };\n return null;\n }\n // A subscriber-only page that admits the session: the products its rules\n // name (any product when one rule names none).\n var products = null;\n for (var i = 0; i < __TA_ROUTE_EXPOSURE.subscriberRules.length; i++) {\n var rule = __TA_ROUTE_EXPOSURE.subscriberRules[i];\n if (rule.roles.length > 0 && (!role || rule.roles.indexOf(role) === -1)) continue;\n products = rule.productIds.length === 0 || (products && products.length === 0)\n ? []\n : (products || []).concat(rule.productIds);\n }\n if (products && (await __dxEntitled(token, products))) return null;\n return { status: 403, message: 'Forbidden' };\n}\n\nfunction __taRefuseRequest(label) {\n var err = new Error('Invalid ' + label);\n err.status = 400;\n throw err;\n}\n\n// A row count from the request: a whole number, or nothing. Anything else\n// (`1;--`, `1 OR 1=1`, `-5`, `1e9`) is refused, never parsed into one.\nfunction __taWholeNumber(value, label) {\n if (Array.isArray(value)) value = value[0];\n if (value === undefined || value === null || value === '') return undefined;\n var text = String(value).trim();\n if (!/^[0-9]{1,15}$/.test(text)) __taRefuseRequest(label);\n return parseInt(text, 10);\n}\n\n// The rows a read may ask for. A server-side caller gets what it names; a\n// browser gets the table's default when it names no count, never more than the\n// table's maximum, and starts no further in than __TA_MAX_OFFSET.\nfunction __taReadWindow(req) {\n var q = (req && req.query) || {};\n var limit = __taWholeNumber(q.limit, 'limit');\n var perPage = __taWholeNumber(q.perPage, 'perPage');\n var page = __taWholeNumber(q.page, 'page');\n var offset = __taWholeNumber(q.offset, 'offset');\n if (!__taIsInternalRequest(req)) {\n var max = __TA_ROUTE_EXPOSURE.maxLimit;\n if (limit !== undefined) limit = Math.min(limit, max);\n if (perPage !== undefined) perPage = Math.min(perPage, max);\n if (!limit && !perPage) limit = __TA_ROUTE_EXPOSURE.defaultLimit;\n if (offset !== undefined) offset = Math.min(offset, __TA_MAX_OFFSET);\n if (page !== undefined) {\n page = Math.max(1, Math.min(page, Math.floor(__TA_MAX_OFFSET / Math.max(perPage || 1, 1)) + 1));\n }\n }\n return { limit: limit, perPage: perPage, page: page, offset: offset };\n}\n\n// The parsed value of a JSON request parameter: undefined when absent, and a\n// refusal when it is text that is not JSON (a driver would read it char by char).\nfunction __taJsonParam(value, label) {\n if (value === undefined || value === null || value === '') return undefined;\n if (Array.isArray(value)) __taRefuseRequest(label);\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch (e) {\n __taRefuseRequest(label);\n }\n}\n\n// Every field a filter names, in every shape the drivers accept\n// (normalizeFilterTree): a list of conditions and groups, or an object whose\n// KEYS are the fields. `values` collects what each field is compared with.\nfunction __taFilterFields(parsed, out, values) {\n if (parsed === undefined) return out;\n if (Array.isArray(parsed)) {\n for (var i = 0; i < parsed.length; i++) __taFilterNodeFields(parsed[i], out, values);\n return out;\n }\n if (parsed && typeof parsed === 'object') {\n Object.keys(parsed).forEach(function(key) {\n out.push(key);\n values.push(parsed[key]);\n });\n return out;\n }\n __taRefuseRequest('filters');\n}\n\nfunction __taFilterNodeFields(entry, out, values) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return;\n if (entry.type === 'group') {\n var children = Array.isArray(entry.children) ? entry.children : [];\n for (var i = 0; i < children.length; i++) __taFilterNodeFields(children[i], out, values);\n return;\n }\n if (entry.source !== undefined) {\n out.push(entry.source);\n values.push(entry.destination);\n }\n}\n\n// What a document store compares a field with: a plain value, or a list of\n// plain values (an \"in\" filter). An object would reach the store as an\n// operator (`{ \"$ne\": null }`, `{ \"$regex\": \u2026 }`) and widen the read.\nfunction __taAssertPlainValue(value) {\n if (value === null || value === undefined) return;\n var type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return;\n if (Array.isArray(value)) {\n for (var i = 0; i < value.length; i++) {\n if (value[i] !== null && typeof value[i] === 'object') __taRefuseRequest('filters');\n }\n return;\n }\n __taRefuseRequest('filters');\n}\n\n// The columns a request's projection names (`select`, which Supabase hands\n// PostgREST): the bare star, or a comma list of plain column names. An alias\n// (`name:password`), a cast or an embedded table (`users(email)`) is\n// refused \u2014 it reads a column under another name, or a table no page binds.\nfunction __taSelectFields(select) {\n if (select === undefined || select === null || select === '') return [];\n if (typeof select !== 'string') __taRefuseRequest('select');\n var text = select.trim();\n if (text === '*') return [];\n var parts = text.split(',');\n var out = [];\n for (var i = 0; i < parts.length; i++) {\n var name = parts[i].trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) __taRefuseRequest('select');\n out.push(name);\n }\n return out;\n}\n\nvar __TA_UNSAFE_KEYS = ['__proto__', 'constructor', 'prototype'];\n\n// One field a request names: a column the export knows for the table (or a\n// field the route answers itself), of a safe shape, and \u2014 for a browser \u2014\n// never a credential column.\nfunction __taAssertField(field, browser) {\n if (typeof field !== 'string' || field.length === 0 || field.length > 128) __taRefuseRequest('field');\n if (field.charAt(0) === '$' || __TA_UNSAFE_KEYS.indexOf(field) !== -1) __taRefuseRequest('field');\n if (__TA_FIELD_POLICY.documentStore && field.indexOf('.') !== -1) __taRefuseRequest('field');\n if (__TA_FIELD_PATTERN && !__TA_FIELD_PATTERN.test(field)) __taRefuseRequest('field');\n var name = field.replace(/\"/g, '').toLowerCase();\n if (browser) {\n var column = name.split('.').pop();\n if (__taIsCredentialColumn(column)) __taRefuseRequest('field');\n }\n if (__TA_FIELD_POLICY.columns === null) return;\n if (__TA_FIELD_POLICY.virtualFields.indexOf(name) !== -1) return;\n for (var i = 0; i < __TA_FIELD_POLICY.virtualPrefixes.length; i++) {\n if (name.indexOf(__TA_FIELD_POLICY.virtualPrefixes[i]) === 0) return;\n }\n var parts = name.split('.');\n if (parts.length > 2) __taRefuseRequest('field');\n if (parts.length === 2 && parts[0] !== __TA_ROUTE_TABLE) __taRefuseRequest('field');\n if (__TA_FIELD_POLICY.columns.indexOf(parts[parts.length - 1]) === -1) __taRefuseRequest('field');\n}\n\n// A sort order: ascending or descending, or none.\nfunction __taAssertOrder(order) {\n if (order === undefined || order === null || order === '') return;\n if (typeof order !== 'string' || !/^(asc|desc)$/i.test(order)) __taRefuseRequest('sort order');\n}\n\n// Every field a request filters, sorts or searches by, checked before any\n// driver call: one sort field with asc|desc, no repeated parameter.\nfunction __taAssertReadRequest(req) {\n var q = (req && req.query) || {};\n var browser = !__taIsInternalRequest(req);\n var values = [];\n var fields = __taFilterFields(__taJsonParam(q.filters, 'filters'), [], values);\n if (__TA_FIELD_POLICY.documentStore) {\n for (var v = 0; v < values.length; v++) __taAssertPlainValue(values[v]);\n }\n fields = fields.concat(__taSelectFields(q.select));\n var sorts = __taJsonParam(q.sorts, 'sorts');\n if (sorts !== undefined) {\n if (!Array.isArray(sorts) || sorts.length > 1) __taRefuseRequest('sorts');\n for (var i = 0; i < sorts.length; i++) {\n if (!sorts[i] || typeof sorts[i] !== 'object') __taRefuseRequest('sorts');\n fields.push(sorts[i].field);\n __taAssertOrder(sorts[i].order);\n }\n }\n if (q.sortBy !== undefined && q.sortBy !== '') {\n if (typeof q.sortBy !== 'string') __taRefuseRequest('sortBy');\n fields.push(q.sortBy);\n }\n if (Array.isArray(q.sortOrder)) __taRefuseRequest('sortOrder');\n __taAssertOrder(q.sortOrder);\n var queryColumns = q.queryColumns;\n if (typeof queryColumns === 'string' && queryColumns.length > 0 && queryColumns.charAt(0) !== '[' && queryColumns.charAt(0) !== '\"') {\n queryColumns = JSON.stringify(queryColumns);\n }\n var searchColumns = __taJsonParam(queryColumns, 'queryColumns');\n if (searchColumns !== undefined) {\n var list = Array.isArray(searchColumns) ? searchColumns : [searchColumns];\n for (var c = 0; c < list.length; c++) fields.push(list[c]);\n }\n for (var f = 0; f < fields.length; f++) __taAssertField(fields[f], browser);\n}\n\n// A row-owned page's read (see __taGuardExposure): the owner condition joins\n// whatever the request filters by, so no filter can widen it.\nfunction __taApplyOwnerScope(req) {\n var scope = req && req.__tqOwnerScope;\n if (!scope) return req;\n var q = (req && req.query) || {};\n var parsed = __taJsonParam(q.filters, 'filters');\n var original = Array.isArray(parsed)\n ? parsed\n : parsed && typeof parsed === 'object'\n ? Object.keys(parsed).map(function(key) { return { source: key, destination: parsed[key], operand: '=' }; })\n : [];\n var owners = __TA_ROUTE_EXPOSURE.ownerRules.map(function(rule) {\n return { type: 'condition', source: rule.column, destination: scope.userId, operand: '=' };\n });\n var tree = [{ type: 'group', operator: 'or', children: owners }];\n if (original.length > 0) tree.push({ type: 'group', operator: 'and', children: original });\n req.query = Object.assign({}, q, { filters: JSON.stringify(tree) });\n return req;\n}\n\n// An opaque reference for a refused read: the client gets it, the server log\n// gets the detail under the same reference.\nfunction __taErrorId() {\n try {\n return require('crypto').randomBytes(8).toString('hex');\n } catch (e) {\n return Math.floor(Math.random() * 0xffffffff).toString(16);\n }\n}\n");
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Declares the session resolver, the `__ta*` guard and the route's exposure
|
|
103
|
+
* once per module.
|
|
104
|
+
*/
|
|
105
|
+
export var generateTableAccessPreamble = function (trustedReaderRoles, exposure, fieldPolicy, tableName, reader) {
|
|
106
|
+
if (reader === void 0) { reader = {}; }
|
|
107
|
+
// The fetcher lives in utils/data-sources/ or pages/api/ (two folders below
|
|
108
|
+
// the root) unless the caller says otherwise (pages/api/global-state/).
|
|
109
|
+
var projectRoot = reader.routeProjectRoot || '../..';
|
|
110
|
+
return "".concat(SessionCookieResolver.generateCommonJsSessionTokenResolverCode(projectRoot, {
|
|
111
|
+
withRevocation: reader.sessionRevocation !== false,
|
|
112
|
+
}), "\n").concat(TableAccess.generateTableAccessHelperCode({ trustedReaderRoles: trustedReaderRoles, projectRoot: projectRoot }), "\n").concat(generateBrowserRowPolicyCode(), "\n").concat(generateRouteExposureCode(exposure, fieldPolicy, tableName || ''));
|
|
113
|
+
};
|
|
114
|
+
/** The products table's virtual filter and sort fields (`product-filter-fields.ts`, `product-price-sort.ts`). */
|
|
115
|
+
export var PRODUCT_VIRTUAL_FIELDS = ['rating', 'on_sale', 'price', 'discounts'];
|
|
116
|
+
export var PRODUCT_VIRTUAL_PREFIXES = ['variant_options.'];
|
|
117
|
+
/** What a TeleportHQ / Postgres route's request may name: its schema, plus the products' virtual fields. */
|
|
118
|
+
export var sqlRouteFieldPolicy = function (config, tableName) {
|
|
119
|
+
var products = DataExposure.bareTableName(tableName) === 'teleport_products';
|
|
120
|
+
return __assign({ columns: schemaColumnsOf(config, tableName) || [] }, (products && {
|
|
121
|
+
virtualFields: PRODUCT_VIRTUAL_FIELDS,
|
|
122
|
+
virtualPrefixes: PRODUCT_VIRTUAL_PREFIXES,
|
|
123
|
+
}));
|
|
20
124
|
};
|
|
21
125
|
/**
|
|
22
126
|
* The early return at the top of a handler, before the client connects:
|
|
@@ -24,6 +128,6 @@ export var generateTableAccessPreamble = function (trustedReaderRoles) {
|
|
|
24
128
|
* (or `null` where the handler accepts none).
|
|
25
129
|
*/
|
|
26
130
|
export var generateReadGuardCall = function (tableName, rawQueryExpr) {
|
|
27
|
-
return " const __access = await __taGuardRead(req, ".concat(JSON.stringify(tableName), ", ").concat(rawQueryExpr || 'null', ")\n if (__access) {\n return res.status(__access.status).json({ success: false, error: __access.message, timestamp: Date.now() })\n }\n").concat(generateBrowserRowAccessCall(tableName, rawQueryExpr));
|
|
131
|
+
return " const __exposure = await __taGuardExposure(req)\n if (__exposure) {\n return res.status(__exposure.status).json({ success: false, error: __exposure.message, timestamp: Date.now() })\n }\n const __access = await __taGuardRead(req, ".concat(JSON.stringify(tableName), ", ").concat(rawQueryExpr || 'null', ")\n if (__access) {\n return res.status(__access.status).json({ success: false, error: __access.message, timestamp: Date.now() })\n }\n").concat(generateBrowserRowAccessCall(tableName, rawQueryExpr), " // Every field the request names is one the export knows; a row-owned page's\n // owner condition joins the request's own filters.\n try {\n __taAssertReadRequest(req)\n } catch (__invalid) {\n return res.status(400).json({ success: false, error: __invalid && __invalid.status ? __invalid.message : 'Invalid request', timestamp: Date.now() })\n }\n __taApplyOwnerScope(req)\n");
|
|
28
132
|
};
|
|
29
133
|
//# sourceMappingURL=table-access-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-access-guard.js","sourceRoot":"","sources":["../../../../src/fetchers/utils/table-access-guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"table-access-guard.js","sourceRoot":"","sources":["../../../../src/fetchers/utils/table-access-guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9F,OAAO,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAEjG;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,8EAA8E;AAC9E,MAAM,CAAC,IAAM,uBAAuB,GAAG,OAAO,CAAA;AA6B9C,8HAA8H;AAC9H,MAAM,CAAC,IAAM,QAAQ,GAAG,UAAC,MAAe,EAAE,SAAiB;IACzD,IAAM,QAAQ,GACZ,MAGD,aAHC,MAAM,uBAAN,MAAM,CAGL,cAAc,CAAA;IACjB,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;QAC7C,OAAO,IAAI,CAAA;KACZ;IACD,IAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;IAClD,IAAM,KAAK,GACT,QAAQ,CAAC,SAAS,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;aAClB,MAAM,CAAC,UAAC,GAAG,IAAK,OAAA,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,EAAxC,CAAwC,CAAC;aACzD,GAAG,CAAC,UAAC,GAAG,IAAK,OAAA,QAAQ,CAAC,GAAG,CAAC,EAAb,CAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QAC3C,OAAO,IAAI,CAAA;KACZ;IACD,OAAO,KAAK,CAAC,OAAO;SACjB,MAAM,CAAC,UAAC,MAAM,IAAK,OAAA,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAnE,CAAmE,CAAC;SACvF,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,YACf,IAAI,EAAE,MAAM,CAAC,IAAc,IACxB,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAC7D,EAHe,CAGf,CAAC,CAAA;AACP,CAAC,CAAA;AAED,4GAA4G;AAC5G,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,MAAe,EAAE,SAAiB;IAChE,IAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,MAAM,CAAC,IAAI,EAAX,CAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC5D,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,IAAM,yBAAyB,GAAG,UACvC,QAA6C,EAC7C,WAAiD,EACjD,SAAsB;IADtB,4BAAA,EAAA,gBAAoC,OAAO,EAAE,EAAE,EAAE;IACjD,0BAAA,EAAA,cAAsB;IAEtB,IAAM,aAAa,GAAG,QAAQ,IAAI,YAAY,CAAC,oBAAoB,CAAA;IACnE,IAAM,eAAe,GAAG,aAAa,CAAC,eAAe,IAAI,EAAE,CAAA;IAC3D,IAAM,UAAU,GAAG,aAAa,CAAC,UAAU,IAAI,EAAE,CAAA;IACjD,IAAM,YAAY,GAChB,WAAW,CAAC,OAAO,KAAK,IAAI;QAC1B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,KAAK,CAAC,IAAI,CACR,IAAI,GAAG,CACL,gCAAI,WAAW,CAAC,OAAO,SAAK,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,QAAE,GAAG,CAAC,UAAC,MAAM;YACnE,OAAA,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;QAA5B,CAA4B,CAC7B,CACF,CACF,CAAC,IAAI,EAAE,CAAA;IACd,OAAO,ucAMmB,IAAI,CAAC,SAAS,CAAC;QACvC,MAAM,EAAE,aAAa,CAAC,MAAM,KAAK,IAAI;QACrC,UAAU,EAAE,aAAa,CAAC,UAAU,KAAK,IAAI;QAC7C,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,EAAE;QAChC,eAAe,iBAAA;QACf,UAAU,YAAA;QACV,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,QAAQ,EAAE,aAAa,CAAC,QAAQ;KACjC,CAAC,sCACoB,uBAAuB,uCACtB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,0KAGpD,IAAI,CAAC,SAAS,CAAC;QACrC,OAAO,EAAE,YAAY;QACrB,aAAa,EAAE,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,WAAW,EAAE,EAAnB,CAAmB,CAAC;QACpF,eAAe,EAAE,CAAC,WAAW,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,MAAM,CAAC,WAAW,EAAE,EAApB,CAAoB,CAAC;QAC1F,aAAa,EAAE,WAAW,CAAC,aAAa,KAAK,IAAI;KAClD,CAAC,yCACuB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,gBACtF,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC,EAAE,+jXA8Q9E,CAAA;AACD,CAAC,CAAA;AAaD;;;GAGG;AACH,MAAM,CAAC,IAAM,2BAA2B,GAAG,UACzC,kBAAyC,EACzC,QAAkC,EAClC,WAAgC,EAChC,SAAkB,EAClB,MAAmC;IAAnC,uBAAA,EAAA,WAAmC;IAEnC,4EAA4E;IAC5E,wEAAwE;IACxE,IAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAA;IACtD,OAAO,UAAG,qBAAqB,CAAC,wCAAwC,CAAC,WAAW,EAAE;QACpF,cAAc,EAAE,MAAM,CAAC,iBAAiB,KAAK,KAAK;KACnD,CAAC,eACF,WAAW,CAAC,6BAA6B,CAAC,EAAE,kBAAkB,oBAAA,EAAE,WAAW,aAAA,EAAE,CAAC,eAC9E,4BAA4B,EAAE,eAC9B,yBAAyB,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC,CAAE,CAAA;AACrE,CAAC,CAAA;AAED,iHAAiH;AACjH,MAAM,CAAC,IAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;AACjF,MAAM,CAAC,IAAM,wBAAwB,GAAG,CAAC,kBAAkB,CAAC,CAAA;AAE5D,4GAA4G;AAC5G,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,MAAe,EAAE,SAAiB;IACpE,IAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,mBAAmB,CAAA;IAC9E,kBACE,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,IAC9C,CAAC,QAAQ,IAAI;QACd,aAAa,EAAE,sBAAsB;QACrC,eAAe,EAAE,wBAAwB;KAC1C,CAAC,EACH;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,IAAM,qBAAqB,GAAG,UAAC,SAAiB,EAAE,YAA2B;IAClF,OAAO,wPAIqC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,eAAK,YAAY,IAAI,MAAM,yJAIhG,4BAA4B,CAC5B,SAAS,EACT,YAAY,CACb,yYAQA,CAAA;AACD,CAAC,CAAA"}
|
package/dist/esm/index.js
CHANGED
|
@@ -197,7 +197,7 @@ function wrapDataSourceExpressionsInAttributes(astNode, dataSourceInfo, context,
|
|
|
197
197
|
dependencies.DataProvider = {
|
|
198
198
|
type: 'package',
|
|
199
199
|
path: '@teleporthq/react-components',
|
|
200
|
-
version: '
|
|
200
|
+
version: '1.0.13',
|
|
201
201
|
meta: {
|
|
202
202
|
namedImport: true,
|
|
203
203
|
},
|
|
@@ -32,7 +32,10 @@ export type PaginationControlKind = 'first' | 'previous' | 'pages' | 'page' | 'e
|
|
|
32
32
|
* (`array-mapper-pagination.ts`) copies.
|
|
33
33
|
*/
|
|
34
34
|
export declare const PAGINATION_FOR_ATTR = "data-tq-pagination-for";
|
|
35
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* The words of a `range` control, with `{from}`, `{to}`, `{total}`, `{page}`,
|
|
37
|
+
* `{pages}` and `{perPage}` placeholders — see `range-control.ts`.
|
|
38
|
+
*/
|
|
36
39
|
export declare const RANGE_TEMPLATE_ATTR = "data-tq-range-template";
|
|
37
40
|
/** What a `range` control reads when it carries no template. */
|
|
38
41
|
export declare const DEFAULT_RANGE_TEMPLATE = "{from}\u2013{to} of {total}";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-controls.d.ts","sourceRoot":"","sources":["../../src/pagination-controls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,+BAA+B,CAAA;AAEnE;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAC7B,OAAO,GACP,UAAU,GACV,OAAO,GACP,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,WAAW,GACX,UAAU,GACV,OAAO,CAAA;AAEX;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,2BAA2B,CAAA;AAE3D
|
|
1
|
+
{"version":3,"file":"pagination-controls.d.ts","sourceRoot":"","sources":["../../src/pagination-controls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,+BAA+B,CAAA;AAEnE;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAC7B,OAAO,GACP,UAAU,GACV,OAAO,GACP,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,WAAW,GACX,UAAU,GACV,OAAO,CAAA;AAEX;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,2BAA2B,CAAA;AAE3D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,2BAA2B,CAAA;AAE3D,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,gCAA2B,CAAA;AAO9D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1E;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,qBAAqB,EAC3B,eAAe,CAAC,EAAE,MAAM,GACvB,GAAG,CA2BL;AAED,6GAA6G;AAC7G,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,GAAG,GAAG,EAAE,CAkBvF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAWtD;AAED,wEAAwE;AACxE,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,KAAK,CAAC,UAAU,GAC3B,IAAI,CAON;AAED,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,cAAc,EAAE,GAAG,EACnB,WAAW,EAAE,qBAAqB,EAAE,GACnC,IAAI,CAgBN"}
|
|
@@ -32,7 +32,10 @@ export var PAGINATION_CONTROL_ATTR = 'data-tq-pagination-control';
|
|
|
32
32
|
* (`array-mapper-pagination.ts`) copies.
|
|
33
33
|
*/
|
|
34
34
|
export var PAGINATION_FOR_ATTR = 'data-tq-pagination-for';
|
|
35
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* The words of a `range` control, with `{from}`, `{to}`, `{total}`, `{page}`,
|
|
37
|
+
* `{pages}` and `{perPage}` placeholders — see `range-control.ts`.
|
|
38
|
+
*/
|
|
36
39
|
export var RANGE_TEMPLATE_ATTR = 'data-tq-range-template';
|
|
37
40
|
/** What a `range` control reads when it carries no template. */
|
|
38
41
|
export var DEFAULT_RANGE_TEMPLATE = '{from}–{to} of {total}';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-controls.js","sourceRoot":"","sources":["../../src/pagination-controls.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,IAAM,uBAAuB,GAAG,4BAA4B,CAAA;AAsBnE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,IAAM,mBAAmB,GAAG,wBAAwB,CAAA;AAE3D
|
|
1
|
+
{"version":3,"file":"pagination-controls.js","sourceRoot":"","sources":["../../src/pagination-controls.ts"],"names":[],"mappings":"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"}
|
|
@@ -2085,6 +2085,7 @@ function wireRangeControlFor(control, usage, vars) {
|
|
|
2085
2085
|
wireRangeControl(control, {
|
|
2086
2086
|
totalVar: vars.totalStateVar,
|
|
2087
2087
|
currentPageExpr: currentPageExpr(),
|
|
2088
|
+
maxPagesVar: vars.maxPagesStateVar,
|
|
2088
2089
|
perPage: usage.perPage,
|
|
2089
2090
|
infiniteScroll: usage.infiniteScroll,
|
|
2090
2091
|
});
|