@teleporthq/teleport-plugin-next-data-source 0.43.75 → 0.44.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/pagination-widget-fixture.ts +87 -4
- package/__tests__/booking-item-transform.test.ts +120 -0
- package/__tests__/browser-row-policy.test.ts +8 -2
- package/__tests__/fetchers.test.ts +1 -1
- package/__tests__/fixed-list-sort.test.ts +1 -1
- package/__tests__/infinite-scroll.test.ts +154 -5
- package/__tests__/list-sort-order.test.ts +61 -0
- package/__tests__/null-filter-where.test.ts +132 -0
- package/__tests__/pg-date-parser.test.ts +73 -0
- package/__tests__/plain-list-sort.test.ts +1 -1
- package/__tests__/product-price-sort.ts +11 -6
- package/__tests__/range-control.test.ts +159 -0
- package/__tests__/search-input-marker.test.ts +86 -0
- package/__tests__/search-url-sync.test.ts +34 -8
- package/__tests__/table-read-route-protected-tables.test.ts +33 -3
- package/dist/cjs/count-effect.d.ts +7 -1
- package/dist/cjs/count-effect.d.ts.map +1 -1
- package/dist/cjs/count-effect.js +15 -5
- package/dist/cjs/count-effect.js.map +1 -1
- package/dist/cjs/fetchers/pg-client-import.d.ts +12 -0
- package/dist/cjs/fetchers/pg-client-import.d.ts.map +1 -0
- package/dist/cjs/fetchers/pg-client-import.js +15 -0
- package/dist/cjs/fetchers/pg-client-import.js.map +1 -0
- package/dist/cjs/fetchers/postgresql.d.ts.map +1 -1
- package/dist/cjs/fetchers/postgresql.js +3 -1
- package/dist/cjs/fetchers/postgresql.js.map +1 -1
- package/dist/cjs/fetchers/raw-query.d.ts.map +1 -1
- package/dist/cjs/fetchers/raw-query.js +2 -1
- package/dist/cjs/fetchers/raw-query.js.map +1 -1
- package/dist/cjs/fetchers/teleport.d.ts.map +1 -1
- package/dist/cjs/fetchers/teleport.js +4 -2
- package/dist/cjs/fetchers/teleport.js.map +1 -1
- package/dist/cjs/infinite-scroll.d.ts +25 -2
- package/dist/cjs/infinite-scroll.d.ts.map +1 -1
- package/dist/cjs/infinite-scroll.js +144 -33
- package/dist/cjs/infinite-scroll.js.map +1 -1
- package/dist/cjs/list-sort-order.d.ts +14 -0
- package/dist/cjs/list-sort-order.d.ts.map +1 -0
- package/dist/cjs/list-sort-order.js +36 -0
- package/dist/cjs/list-sort-order.js.map +1 -0
- package/dist/cjs/pagination-controls.d.ts +22 -3
- package/dist/cjs/pagination-controls.d.ts.map +1 -1
- package/dist/cjs/pagination-controls.js +29 -3
- package/dist/cjs/pagination-controls.js.map +1 -1
- package/dist/cjs/pagination-plugin.d.ts.map +1 -1
- package/dist/cjs/pagination-plugin.js +137 -101
- package/dist/cjs/pagination-plugin.js.map +1 -1
- package/dist/cjs/range-control.d.ts +45 -0
- package/dist/cjs/range-control.d.ts.map +1 -0
- package/dist/cjs/range-control.js +165 -0
- package/dist/cjs/range-control.js.map +1 -0
- package/dist/cjs/row-order.d.ts +3 -2
- package/dist/cjs/row-order.d.ts.map +1 -1
- package/dist/cjs/row-order.js +5 -4
- package/dist/cjs/row-order.js.map +1 -1
- package/dist/cjs/search-input.d.ts +42 -0
- package/dist/cjs/search-input.d.ts.map +1 -0
- package/dist/cjs/search-input.js +158 -0
- package/dist/cjs/search-input.js.map +1 -0
- package/dist/cjs/transformations/booking-item.d.ts +24 -0
- package/dist/cjs/transformations/booking-item.d.ts.map +1 -0
- package/dist/cjs/transformations/booking-item.js +27 -0
- package/dist/cjs/transformations/booking-item.js.map +1 -0
- package/dist/cjs/transformations/index.d.ts +4 -2
- package/dist/cjs/transformations/index.d.ts.map +1 -1
- package/dist/cjs/transformations/index.js +14 -5
- package/dist/cjs/transformations/index.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/count-effect.d.ts +7 -1
- package/dist/esm/count-effect.d.ts.map +1 -1
- package/dist/esm/count-effect.js +15 -5
- package/dist/esm/count-effect.js.map +1 -1
- package/dist/esm/fetchers/pg-client-import.d.ts +12 -0
- package/dist/esm/fetchers/pg-client-import.d.ts.map +1 -0
- package/dist/esm/fetchers/pg-client-import.js +12 -0
- package/dist/esm/fetchers/pg-client-import.js.map +1 -0
- package/dist/esm/fetchers/postgresql.d.ts.map +1 -1
- package/dist/esm/fetchers/postgresql.js +3 -1
- package/dist/esm/fetchers/postgresql.js.map +1 -1
- package/dist/esm/fetchers/raw-query.d.ts.map +1 -1
- package/dist/esm/fetchers/raw-query.js +2 -1
- package/dist/esm/fetchers/raw-query.js.map +1 -1
- package/dist/esm/fetchers/teleport.d.ts.map +1 -1
- package/dist/esm/fetchers/teleport.js +4 -2
- package/dist/esm/fetchers/teleport.js.map +1 -1
- package/dist/esm/infinite-scroll.d.ts +25 -2
- package/dist/esm/infinite-scroll.d.ts.map +1 -1
- package/dist/esm/infinite-scroll.js +142 -32
- package/dist/esm/infinite-scroll.js.map +1 -1
- package/dist/esm/list-sort-order.d.ts +14 -0
- package/dist/esm/list-sort-order.d.ts.map +1 -0
- package/dist/esm/list-sort-order.js +32 -0
- package/dist/esm/list-sort-order.js.map +1 -0
- package/dist/esm/pagination-controls.d.ts +22 -3
- package/dist/esm/pagination-controls.d.ts.map +1 -1
- package/dist/esm/pagination-controls.js +28 -2
- package/dist/esm/pagination-controls.js.map +1 -1
- package/dist/esm/pagination-plugin.d.ts.map +1 -1
- package/dist/esm/pagination-plugin.js +138 -102
- package/dist/esm/pagination-plugin.js.map +1 -1
- package/dist/esm/range-control.d.ts +45 -0
- package/dist/esm/range-control.d.ts.map +1 -0
- package/dist/esm/range-control.js +137 -0
- package/dist/esm/range-control.js.map +1 -0
- package/dist/esm/row-order.d.ts +3 -2
- package/dist/esm/row-order.d.ts.map +1 -1
- package/dist/esm/row-order.js +5 -4
- package/dist/esm/row-order.js.map +1 -1
- package/dist/esm/search-input.d.ts +42 -0
- package/dist/esm/search-input.d.ts.map +1 -0
- package/dist/esm/search-input.js +129 -0
- package/dist/esm/search-input.js.map +1 -0
- package/dist/esm/transformations/booking-item.d.ts +24 -0
- package/dist/esm/transformations/booking-item.d.ts.map +1 -0
- package/dist/esm/transformations/booking-item.js +23 -0
- package/dist/esm/transformations/booking-item.js.map +1 -0
- package/dist/esm/transformations/index.d.ts +4 -2
- package/dist/esm/transformations/index.d.ts.map +1 -1
- package/dist/esm/transformations/index.js +14 -5
- package/dist/esm/transformations/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/count-effect.ts +31 -8
- package/src/fetchers/pg-client-import.ts +16 -0
- package/src/fetchers/postgresql.ts +15 -9
- package/src/fetchers/raw-query.ts +2 -1
- package/src/fetchers/teleport.ts +11 -8
- package/src/infinite-scroll.ts +240 -79
- package/src/list-sort-order.ts +34 -0
- package/src/pagination-controls.ts +26 -3
- package/src/pagination-plugin.ts +163 -135
- package/src/range-control.ts +207 -0
- package/src/row-order.ts +5 -4
- package/src/search-input.ts +190 -0
- package/src/transformations/booking-item.ts +71 -0
- package/src/transformations/index.ts +25 -2
|
@@ -9,6 +9,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
9
9
|
};
|
|
10
10
|
import { SessionCookieResolver } from '@teleporthq/teleport-shared';
|
|
11
11
|
import { replaceSecretReference } from '../utils';
|
|
12
|
+
import { PG_CLIENT_IMPORT } from './pg-client-import';
|
|
12
13
|
var FORBIDDEN_KEYWORDS = ['CREATE', 'ALTER', 'DROP', 'TRUNCATE', 'RENAME', 'GRANT', 'REVOKE'];
|
|
13
14
|
/** The param a `{{Current User.<field>}}` token becomes: `currentUser` + the field, capitalised. */
|
|
14
15
|
var CURRENT_USER_PARAM_PREFIX = 'currentUser';
|
|
@@ -61,7 +62,7 @@ export var generateRawQueryFetcher = function (config, query, paramFields) {
|
|
|
61
62
|
? "{\n ".concat(pgConfig.sslConfig.ca ? "ca: ".concat(replaceSecretReference(pgConfig.sslConfig.ca), ",") : '', "\n ").concat(pgConfig.sslConfig.cert ? "cert: ".concat(replaceSecretReference(pgConfig.sslConfig.cert), ",") : '', "\n ").concat(pgConfig.sslConfig.key ? "key: ".concat(replaceSecretReference(pgConfig.sslConfig.key), ",") : '', "\n rejectUnauthorized: false\n }")
|
|
62
63
|
: '{ rejectUnauthorized: false }'
|
|
63
64
|
: 'false';
|
|
64
|
-
return "
|
|
65
|
+
return "".concat(PG_CLIENT_IMPORT, "\n\nconst FORBIDDEN_KEYWORDS = ").concat(JSON.stringify(FORBIDDEN_KEYWORDS), "\n").concat(sessionHelpers, "\nconst getClient = () => {\n const connStr = process.env.TELEPORT_DB_CONNECTION_STRING\n if (connStr) {\n const sslEnv = process.env.TELEPORT_DB_SSL\n const sslOpt = sslEnv === 'false' ? false : sslEnv === 'true' ? { rejectUnauthorized: false } : undefined\n return new Client(Object.assign({ connectionString: connStr }, sslOpt !== undefined ? { ssl: sslOpt } : {}))\n }\n return new Client({\n host: process.env.TELEPORT_DB_HOST || ").concat(JSON.stringify((_a = pgConfig.host) !== null && _a !== void 0 ? _a : null), ",\n port: parseInt(process.env.TELEPORT_DB_PORT || '").concat(pgConfig.port || 5432, "', 10),\n user: process.env.TELEPORT_DB_USER || ").concat(JSON.stringify((_c = (_b = pgConfig.user) !== null && _b !== void 0 ? _b : pgConfig.username) !== null && _c !== void 0 ? _c : null), ",\n password: process.env.TELEPORT_DB_PASSWORD || ").concat(replaceSecretReference(pgConfig.password) !== 'undefined'
|
|
65
66
|
? replaceSecretReference(pgConfig.password)
|
|
66
67
|
: 'null', ",\n database: process.env.TELEPORT_DB_NAME || ").concat(JSON.stringify((_d = pgConfig.database) !== null && _d !== void 0 ? _d : null), ",\n ssl: ").concat(sslValue, "\n })\n}\n\nconst validateQuery = (query) => {\n const trimmed = query.trim().toUpperCase()\n for (const keyword of FORBIDDEN_KEYWORDS) {\n if (trimmed.startsWith(keyword)) {\n return false\n }\n }\n return true\n}\n\nexport default async function handler(req, res) {\n try {\n ").concat(paramDestructure, "\n ").concat(paramValidation, "\n\n const query = ").concat(JSON.stringify(query), "\n\n if (!validateQuery(query)) {\n return res.status(400).json({\n success: false,\n error: 'Only SELECT queries are allowed',\n timestamp: Date.now()\n })\n }\n\n const client = getClient()\n await client.connect()\n\n try {\n const result = await client.query(query, ").concat(paramArray, ")\n\n return res.status(200).json({\n success: true,\n data: result.rows,\n timestamp: Date.now()\n })\n } finally {\n await client.end()\n }\n } catch (error) {\n // A database error names tables, columns and values: server log only.\n console.error('Raw query fetch error:', error)\n return res.status(500).json({\n success: false,\n error: 'Failed to fetch data',\n timestamp: Date.now()\n })\n }\n}\n");
|
|
67
68
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-query.js","sourceRoot":"","sources":["../../../src/fetchers/raw-query.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"raw-query.js","sourceRoot":"","sources":["../../../src/fetchers/raw-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teleport.d.ts","sourceRoot":"","sources":["../../../src/fetchers/teleport.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"teleport.d.ts","sourceRoot":"","sources":["../../../src/fetchers/teleport.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAA;AA0C3B,eAAO,MAAM,sBAAsB,WACzB,OAAO,MAAM,EAAE,OAAO,CAAC,KAC9B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAMpC,CAAA;AAED,eAAO,MAAM,uBAAuB,WAC1B,OAAO,MAAM,EAAE,OAAO,CAAC,aACpB,MAAM,qBACC,sBAAsB,KACvC,MA2bF,CAAA;AAED,eAAO,MAAM,4BAA4B,WAC/B,OAAO,MAAM,EAAE,OAAO,CAAC,aACpB,MAAM,KAChB,MA8FF,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { replaceSecretReference, generateDateFormatterCode, generateSafeJSONParseCode, generateFilterTreeHelpersCode, generateSearchEscapeHelpersCode, } from '../utils';
|
|
2
2
|
import { getTransformationCode, getTransformExpression, getTransformWrapperCode, } from '../transformations';
|
|
3
3
|
import { generateSortFallbackFieldHelper, generateSortFieldSqlHelper } from '../product-price-sort';
|
|
4
|
+
import { SORT_NULLS_LAST_SQL } from '../list-sort-order';
|
|
4
5
|
import { generateRowOrderTiebreakHelper, rowIdentityColumn } from '../row-order';
|
|
5
6
|
import { generateProductFilterClauseHelper } from '../product-filter-fields';
|
|
6
7
|
import { collectLocalizedColumns, generateLocalizedColumnsHelper } from '../localized-columns';
|
|
@@ -8,6 +9,7 @@ import { REQUEST_LOCALE_PARAM } from '../request-locale';
|
|
|
8
9
|
import { generateReadGuardCall, generateTableAccessPreamble } from './utils/table-access-guard';
|
|
9
10
|
import { generateRequestSqlGuardsCode } from './utils/request-sql-guards';
|
|
10
11
|
import { generateArrayOverlapSqlCode } from '../array-overlap-sql';
|
|
12
|
+
import { PG_CLIENT_IMPORT } from './pg-client-import';
|
|
11
13
|
var DEFAULT_ENV_KEYS = {
|
|
12
14
|
host: 'TELEPORT_DB_HOST',
|
|
13
15
|
port: 'TELEPORT_DB_PORT',
|
|
@@ -53,9 +55,9 @@ export var generateTeleportFetcher = function (config, tableName, transformOptio
|
|
|
53
55
|
? "key: ".concat(resolveEnvReference(dbConfig.sslConfig.key, 'TELEPORT_DB_SSL_KEY'), ",")
|
|
54
56
|
: '', "\n rejectUnauthorized: false\n }")
|
|
55
57
|
: "(process.env.".concat(DEFAULT_ENV_KEYS.ssl, " === 'false' ? false : process.env.").concat(DEFAULT_ENV_KEYS.ssl, " === 'true' ? { rejectUnauthorized: false } : undefined)");
|
|
56
|
-
return "import { Client } from 'pg'\n\n".concat(generateTableAccessPreamble(transformOptions.trustedReaderRoles || []), "\nfunction normalizePostgresConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n if (/^postgresql:\\/(?!\\/)/i.test(connectionString)) {\n return connectionString.replace(/^postgresql:\\//i, 'postgresql://');\n }\n return connectionString;\n}\n\nfunction stripSslQueryParamsFromConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n try {\n var u = new URL(connectionString.replace(/^postgresql:/i, 'postgres:'));\n u.searchParams.delete('sslmode');\n u.searchParams.delete('ssl');\n u.searchParams.delete('sslrootcert');\n u.searchParams.delete('sslcert');\n u.searchParams.delete('sslkey');\n return u.toString().replace(/^postgres:/i, 'postgresql:');\n } catch (e) {\n return connectionString;\n }\n}\n\nconst getClient = () => {\n var ssl = ").concat(sslCode, ";\n var connStr = process.env.TELEPORT_DB_CONNECTION_STRING;\n if (connStr) {\n connStr = normalizePostgresConnectionString(connStr);\n }\n if (ssl === false && connStr) {\n connStr = stripSslQueryParamsFromConnectionString(connStr);\n }\n if (connStr) {\n return new Client(Object.assign(\n { connectionString: connStr },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n }\n return new Client(Object.assign(\n {\n host: ").concat(hostRef, ",\n port: parseInt(").concat(portRef, " || '5432', 10),\n user: ").concat(userRef, ",\n password: ").concat(passwordRef, ",\n database: ").concat(databaseRef, ",\n },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n}\n\n").concat(generateSafeJSONParseCode(), "\n\n").concat(generateFilterTreeHelpersCode(), "\n\n").concat(generateSearchEscapeHelpersCode(), "\n").concat(generateArrayOverlapSqlCode(), "\n").concat(getTransformationCode(tableName, transformOptions), "\n").concat(getTransformWrapperCode(tableName, transformOptions), "\n").concat(generateRequestSqlGuardsCode(), "\nconst processFilters = (filters, conditions, queryParams, paramIndex) => {\n if (!filters) return paramIndex\n \n const filterTree = normalizeFilterTree(safeJSONParse(filters))\n if (!filterTree) return paramIndex\n \n const buildCondition = (condition) => {\n const field = condition.source\n const normalizedCondition = normalizeInOperand(condition.operand, condition.destination)\n if (normalizedCondition === null) return null\n const value = normalizedCondition.value\n const operand = normalizedCondition.operand\n \n // The products table's virtual fields (effective price, rating bucket,\n // on-sale flag, variant axes) are whole clauses, not columns - so they are\n // answered before any branch below can interpolate the field name raw.\n const productClause = productFilterClause(field, operand, value, (param) => {\n queryParams.push(param)\n return '$' + paramIndex++\n })\n if (productClause !== null) return productClause\n\n // A translatable column is compared against the value in every language,\n // so a localized slug resolves under any locale - see localized-columns.ts.\n const localizedClause = localizedEqualityClause(field, operand, value, (param) => {\n queryParams.push(param)\n return '$' + paramIndex++\n })\n if (localizedClause !== null) return localizedClause\n assertRequestColumn(field, 'filter field')\n \n if (Array.isArray(value)) {\n if (value.length === 0) return null\n if (operand === 'array_overlap') {\n // The row's list (see array-overlap-sql.ts) shares any value with the set.\n const clause = arrayOverlapSql((localizedColumnList(field) || [field]), '$' + paramIndex)\n queryParams.push(value.map((entry) => String(entry)))\n paramIndex++\n return clause\n }\n const placeholders = value.map(() => `$${paramIndex++}`)\n queryParams.push(...value)\n return operand === '!='\n ? `${field} NOT IN (${placeholders.join(', ')})`\n : `${field} IN (${placeholders.join(', ')})`\n }\n \n if (operand === 'array_overlap') {\n if (value === '' || value === null || value === undefined) return null\n // A single comma-joined string (the multi-select Category Filter's\n // ?categoryFilter=a,b,c) expands to multiple ids; one id stays one.\n const overlapValues = String(value).split(',').map((entry) => entry.trim()).filter(Boolean)\n if (overlapValues.length === 0) return null\n const clause = arrayOverlapSql((localizedColumnList(field) || [field]), '$' + paramIndex)\n queryParams.push(overlapValues)\n paramIndex++\n return clause\n }\n \n if (value === null) {\n if (operand === '=') return `${field} IS NULL`\n if (operand === '!=') return `${field} IS NOT NULL`\n return null\n }\n \n const validOps = ['=', '!=', '>', '<', '>=', '<=']\n const sqlOperator = validOps.includes(operand) ? operand : '='\n const clause = `${field} ${sqlOperator} $${paramIndex}`\n queryParams.push(value)\n paramIndex++\n return clause\n }\n \n const clause = buildFilterTreeClause(filterTree, buildCondition)\n if (clause) conditions.push(clause)\n \n return paramIndex\n}\n\n").concat(generateDateFormatterCode(), "\n\n").concat(generateSortFieldSqlHelper(tableName), "\n\n").concat(generateSortFallbackFieldHelper(tableName), "\n\n").concat(generateRowOrderTiebreakHelper(rowIdentityColumn(config, tableName)), "\n\n").concat(generateProductFilterClauseHelper(tableName), "\n\n").concat(generateLocalizedColumnsHelper(localizedColumns), "\n\n// Matches DDL / dangerous statements the raw-query branch should refuse.\n// Keep this list conservative \u2014 anything destructive or schema-changing is\n// out of scope for a client-triggered fetch. SELECT and CTEs (WITH ...) are\n// the only shapes consumers legitimately need.\nconst BLOCKED_RAW_QUERY_PATTERNS = [\n /\\bcreate\\s+(?:temporary\\s+|temp\\s+|unlogged\\s+|global\\s+|local\\s+)?table\\b/i,\n /\\bcreate\\s+(?:unique\\s+)?index\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?(?:materialized\\s+)?view\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?trigger\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?(?:aggregate\\s+)?function\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?procedure\\b/i,\n /\\bcreate\\s+(?:database|schema|sequence|extension|type|role|user)\\b/i,\n /\\bdrop\\s+(?:table|view|index|schema|database|sequence|trigger|function|procedure|role|user|extension|type|materialized)\\b/i,\n /\\balter\\s+(?:table|view|index|schema|database|sequence|role|user|system)\\b/i,\n /\\btruncate\\b/i,\n /\\bgrant\\b/i,\n /\\brevoke\\b/i,\n /\\binsert\\b/i,\n /\\bupdate\\b/i,\n /\\bdelete\\b/i,\n /\\bcopy\\b/i,\n /\\bvacuum\\b/i,\n /\\breindex\\b/i,\n /\\bcluster\\b/i,\n]\n\nfunction assertRawQuerySafe(rawQuery) {\n if (typeof rawQuery !== 'string' || rawQuery.length === 0) {\n throw new Error('rawQuery must be a non-empty string')\n }\n // Reject multi-statement payloads \u2014 only single SELECT / WITH statements.\n // A trailing semicolon is tolerated but any content after it fails.\n var trimmed = rawQuery.trim().replace(/;\\s*$/, '')\n if (trimmed.indexOf(';') !== -1) {\n throw new Error('rawQuery must contain exactly one statement')\n }\n for (var i = 0; i < BLOCKED_RAW_QUERY_PATTERNS.length; i++) {\n if (BLOCKED_RAW_QUERY_PATTERNS[i].test(trimmed)) {\n throw new Error('rawQuery contains a blocked statement')\n }\n }\n}\n\nexport default async function handler(req, res) {\n").concat(generateReadGuardCall(tableName, 'req.query && req.query.rawQuery'), "\n const client = getClient()\n\n try {\n await client.connect()\n ").concat(schema ? "await client.query('SET search_path TO ".concat(schema, "')") : '', "\n\n // If the caller supplied a rawQuery, run it verbatim (after a safety\n // guard). The schema-driven branch below builds `SELECT * FROM ").concat(tableName, "`\n // with optional filters \u2014 it's the default read path and ignores\n // rawQuery. Page-load workflows and other consumers that need a JOIN\n // or a user-scoped filter pass their fully-rendered SQL here via\n // `fetchData({ rawQuery })` and expect it to execute verbatim.\n if (req.query && typeof req.query.rawQuery === 'string' && req.query.rawQuery.length > 0) {\n assertRawQuerySafe(req.query.rawQuery)\n const rawResult = await client.query(req.query.rawQuery)\n const rawRows = Array.isArray(rawResult?.rows) ? rawResult.rows : []\n const rawPlain = rawRows.map((row) =>\n row && typeof row.toJSON === 'function' ? row.toJSON() : row\n )\n const rawSafe = JSON.parse(JSON.stringify(rawPlain, dateReplacer))\n return res.status(200).json({\n success: true,\n // Every row here ends up in a browser (a page's props or a client\n // refetch), so no credential column survives, whatever joined it.\n data: __taWithoutCredentials(rawSafe, null),\n timestamp: Date.now()\n })\n }\n\n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset } = req.query\n // A visitor never filters, sorts or searches by a column it is not served.\n if (__rowPolicy) __brpAssertVisibleFields(__rowPolicy, req.query)\n // The language the page is in - what a translatable sort orders by.\n const requestLocale = typeof req.query.").concat(REQUEST_LOCALE_PARAM, " === 'string' ? req.query.").concat(REQUEST_LOCALE_PARAM, " : null\n \n const conditions = []\n const queryParams = []\n let paramIndex = 1\n \n if (query) {\n let columns = []\n \n if (queryColumns) {\n const parsed = safeJSONParse(queryColumns)\n columns = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : [])\n } else {\n try {\n const schemaQuery = `\n SELECT column_name \n FROM information_schema.columns \n WHERE table_name = $1\n ").concat(schema ? "AND table_schema = $2" : '', "\n ORDER BY ordinal_position\n `\n const schemaParams = ").concat(schema
|
|
58
|
+
return "".concat(PG_CLIENT_IMPORT, "\n\n").concat(generateTableAccessPreamble(transformOptions.trustedReaderRoles || []), "\nfunction normalizePostgresConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n if (/^postgresql:\\/(?!\\/)/i.test(connectionString)) {\n return connectionString.replace(/^postgresql:\\//i, 'postgresql://');\n }\n return connectionString;\n}\n\nfunction stripSslQueryParamsFromConnectionString(connectionString) {\n if (!connectionString || typeof connectionString !== 'string') return connectionString;\n try {\n var u = new URL(connectionString.replace(/^postgresql:/i, 'postgres:'));\n u.searchParams.delete('sslmode');\n u.searchParams.delete('ssl');\n u.searchParams.delete('sslrootcert');\n u.searchParams.delete('sslcert');\n u.searchParams.delete('sslkey');\n return u.toString().replace(/^postgres:/i, 'postgresql:');\n } catch (e) {\n return connectionString;\n }\n}\n\nconst getClient = () => {\n var ssl = ").concat(sslCode, ";\n var connStr = process.env.TELEPORT_DB_CONNECTION_STRING;\n if (connStr) {\n connStr = normalizePostgresConnectionString(connStr);\n }\n if (ssl === false && connStr) {\n connStr = stripSslQueryParamsFromConnectionString(connStr);\n }\n if (connStr) {\n return new Client(Object.assign(\n { connectionString: connStr },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n }\n return new Client(Object.assign(\n {\n host: ").concat(hostRef, ",\n port: parseInt(").concat(portRef, " || '5432', 10),\n user: ").concat(userRef, ",\n password: ").concat(passwordRef, ",\n database: ").concat(databaseRef, ",\n },\n ssl !== undefined ? { ssl: ssl } : {}\n ));\n}\n\n").concat(generateSafeJSONParseCode(), "\n\n").concat(generateFilterTreeHelpersCode(), "\n\n").concat(generateSearchEscapeHelpersCode(), "\n").concat(generateArrayOverlapSqlCode(), "\n").concat(getTransformationCode(tableName, transformOptions), "\n").concat(getTransformWrapperCode(tableName, transformOptions), "\n").concat(generateRequestSqlGuardsCode(), "\nconst processFilters = (filters, conditions, queryParams, paramIndex) => {\n if (!filters) return paramIndex\n \n const filterTree = normalizeFilterTree(safeJSONParse(filters))\n if (!filterTree) return paramIndex\n \n const buildCondition = (condition) => {\n const field = condition.source\n const normalizedCondition = normalizeInOperand(condition.operand, condition.destination)\n if (normalizedCondition === null) return null\n const value = normalizedCondition.value\n const operand = normalizedCondition.operand\n \n // The products table's virtual fields (effective price, rating bucket,\n // on-sale flag, variant axes) are whole clauses, not columns - so they are\n // answered before any branch below can interpolate the field name raw.\n const productClause = productFilterClause(field, operand, value, (param) => {\n queryParams.push(param)\n return '$' + paramIndex++\n })\n if (productClause !== null) return productClause\n\n // A translatable column is compared against the value in every language,\n // so a localized slug resolves under any locale - see localized-columns.ts.\n const localizedClause = localizedEqualityClause(field, operand, value, (param) => {\n queryParams.push(param)\n return '$' + paramIndex++\n })\n if (localizedClause !== null) return localizedClause\n assertRequestColumn(field, 'filter field')\n \n if (Array.isArray(value)) {\n if (value.length === 0) return null\n if (operand === 'array_overlap') {\n // The row's list (see array-overlap-sql.ts) shares any value with the set.\n const clause = arrayOverlapSql((localizedColumnList(field) || [field]), '$' + paramIndex)\n queryParams.push(value.map((entry) => String(entry)))\n paramIndex++\n return clause\n }\n const placeholders = value.map(() => `$${paramIndex++}`)\n queryParams.push(...value)\n return operand === '!='\n ? `${field} NOT IN (${placeholders.join(', ')})`\n : `${field} IN (${placeholders.join(', ')})`\n }\n \n if (operand === 'array_overlap') {\n if (value === '' || value === null || value === undefined) return null\n // A single comma-joined string (the multi-select Category Filter's\n // ?categoryFilter=a,b,c) expands to multiple ids; one id stays one.\n const overlapValues = String(value).split(',').map((entry) => entry.trim()).filter(Boolean)\n if (overlapValues.length === 0) return null\n const clause = arrayOverlapSql((localizedColumnList(field) || [field]), '$' + paramIndex)\n queryParams.push(overlapValues)\n paramIndex++\n return clause\n }\n \n if (value === null) {\n if (operand === '=') return `${field} IS NULL`\n if (operand === '!=') return `${field} IS NOT NULL`\n return null\n }\n \n const validOps = ['=', '!=', '>', '<', '>=', '<=']\n const sqlOperator = validOps.includes(operand) ? operand : '='\n const clause = `${field} ${sqlOperator} $${paramIndex}`\n queryParams.push(value)\n paramIndex++\n return clause\n }\n \n const clause = buildFilterTreeClause(filterTree, buildCondition)\n if (clause) conditions.push(clause)\n \n return paramIndex\n}\n\n").concat(generateDateFormatterCode(), "\n\n").concat(generateSortFieldSqlHelper(tableName), "\n\n").concat(generateSortFallbackFieldHelper(tableName), "\n\n").concat(generateRowOrderTiebreakHelper(rowIdentityColumn(config, tableName)), "\n\n").concat(generateProductFilterClauseHelper(tableName), "\n\n").concat(generateLocalizedColumnsHelper(localizedColumns), "\n\n// Matches DDL / dangerous statements the raw-query branch should refuse.\n// Keep this list conservative \u2014 anything destructive or schema-changing is\n// out of scope for a client-triggered fetch. SELECT and CTEs (WITH ...) are\n// the only shapes consumers legitimately need.\nconst BLOCKED_RAW_QUERY_PATTERNS = [\n /\\bcreate\\s+(?:temporary\\s+|temp\\s+|unlogged\\s+|global\\s+|local\\s+)?table\\b/i,\n /\\bcreate\\s+(?:unique\\s+)?index\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?(?:materialized\\s+)?view\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?trigger\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?(?:aggregate\\s+)?function\\b/i,\n /\\bcreate\\s+(?:or\\s+replace\\s+)?procedure\\b/i,\n /\\bcreate\\s+(?:database|schema|sequence|extension|type|role|user)\\b/i,\n /\\bdrop\\s+(?:table|view|index|schema|database|sequence|trigger|function|procedure|role|user|extension|type|materialized)\\b/i,\n /\\balter\\s+(?:table|view|index|schema|database|sequence|role|user|system)\\b/i,\n /\\btruncate\\b/i,\n /\\bgrant\\b/i,\n /\\brevoke\\b/i,\n /\\binsert\\b/i,\n /\\bupdate\\b/i,\n /\\bdelete\\b/i,\n /\\bcopy\\b/i,\n /\\bvacuum\\b/i,\n /\\breindex\\b/i,\n /\\bcluster\\b/i,\n]\n\nfunction assertRawQuerySafe(rawQuery) {\n if (typeof rawQuery !== 'string' || rawQuery.length === 0) {\n throw new Error('rawQuery must be a non-empty string')\n }\n // Reject multi-statement payloads \u2014 only single SELECT / WITH statements.\n // A trailing semicolon is tolerated but any content after it fails.\n var trimmed = rawQuery.trim().replace(/;\\s*$/, '')\n if (trimmed.indexOf(';') !== -1) {\n throw new Error('rawQuery must contain exactly one statement')\n }\n for (var i = 0; i < BLOCKED_RAW_QUERY_PATTERNS.length; i++) {\n if (BLOCKED_RAW_QUERY_PATTERNS[i].test(trimmed)) {\n throw new Error('rawQuery contains a blocked statement')\n }\n }\n}\n\nexport default async function handler(req, res) {\n").concat(generateReadGuardCall(tableName, 'req.query && req.query.rawQuery'), "\n const client = getClient()\n\n try {\n await client.connect()\n ").concat(schema ? "await client.query('SET search_path TO ".concat(schema, "')") : '', "\n\n // If the caller supplied a rawQuery, run it verbatim (after a safety\n // guard). The schema-driven branch below builds `SELECT * FROM ").concat(tableName, "`\n // with optional filters \u2014 it's the default read path and ignores\n // rawQuery. Page-load workflows and other consumers that need a JOIN\n // or a user-scoped filter pass their fully-rendered SQL here via\n // `fetchData({ rawQuery })` and expect it to execute verbatim.\n if (req.query && typeof req.query.rawQuery === 'string' && req.query.rawQuery.length > 0) {\n assertRawQuerySafe(req.query.rawQuery)\n const rawResult = await client.query(req.query.rawQuery)\n const rawRows = Array.isArray(rawResult?.rows) ? rawResult.rows : []\n const rawPlain = rawRows.map((row) =>\n row && typeof row.toJSON === 'function' ? row.toJSON() : row\n )\n const rawSafe = JSON.parse(JSON.stringify(rawPlain, dateReplacer))\n return res.status(200).json({\n success: true,\n // Every row here ends up in a browser (a page's props or a client\n // refetch), so no credential column survives, whatever joined it.\n data: __taWithoutCredentials(rawSafe, null),\n timestamp: Date.now()\n })\n }\n\n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset } = req.query\n // A visitor never filters, sorts or searches by a column it is not served.\n if (__rowPolicy) __brpAssertVisibleFields(__rowPolicy, req.query)\n // The language the page is in - what a translatable sort orders by.\n const requestLocale = typeof req.query.").concat(REQUEST_LOCALE_PARAM, " === 'string' ? req.query.").concat(REQUEST_LOCALE_PARAM, " : null\n \n const conditions = []\n const queryParams = []\n let paramIndex = 1\n \n if (query) {\n let columns = []\n \n if (queryColumns) {\n const parsed = safeJSONParse(queryColumns)\n columns = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : [])\n } else {\n try {\n const schemaQuery = `\n SELECT column_name \n FROM information_schema.columns \n WHERE table_name = $1\n ").concat(schema ? "AND table_schema = $2" : '', "\n ORDER BY ordinal_position\n `\n const schemaParams = ").concat(schema
|
|
57
59
|
? "[".concat(JSON.stringify(tableName), ", ").concat(JSON.stringify(schema), "]")
|
|
58
|
-
: "[".concat(JSON.stringify(tableName), "]"), "\n \n const schemaResult = await client.query(schemaQuery, schemaParams)\n columns = schemaResult.rows.map(row => row.column_name)\n } catch (schemaError) {\n console.warn('Failed to fetch column names from information_schema:', schemaError.message)\n }\n }\n if (__rowPolicy) columns = __brpVisibleColumns(__rowPolicy, columns)\n \n if (columns.length > 0) {\n const pattern = '%' + escapeLikePattern(query) + '%'\n const placeholder = '$' + paramIndex\n paramIndex++\n queryParams.push(pattern)\n const searchConditions = columns.map(\n (col) => '\"' + sanitizeSearchIdentifier(col) + '\"::text ILIKE ' + placeholder + \" ESCAPE '|'\"\n )\n conditions.push('(' + searchConditions.join(' OR ') + ')')\n }\n }\n \n paramIndex = processFilters(filters, conditions, queryParams, paramIndex)\n if (__rowPolicy) conditions.push('(' + __rowPolicy.predicate + ')')\n \n let sql = `SELECT * FROM ").concat(tableName, "`\n \n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`\n }\n \n // Handle sorts - new array format. Two ORDER BY clauses are built: the one\n // actually used (a translatable column in the request's language, the\n // products table's price rewrites), and a plain-column twin kept only as
|
|
60
|
+
: "[".concat(JSON.stringify(tableName), "]"), "\n \n const schemaResult = await client.query(schemaQuery, schemaParams)\n columns = schemaResult.rows.map(row => row.column_name)\n } catch (schemaError) {\n console.warn('Failed to fetch column names from information_schema:', schemaError.message)\n }\n }\n if (__rowPolicy) columns = __brpVisibleColumns(__rowPolicy, columns)\n \n if (columns.length > 0) {\n const pattern = '%' + escapeLikePattern(query) + '%'\n const placeholder = '$' + paramIndex\n paramIndex++\n queryParams.push(pattern)\n const searchConditions = columns.map(\n (col) => '\"' + sanitizeSearchIdentifier(col) + '\"::text ILIKE ' + placeholder + \" ESCAPE '|'\"\n )\n conditions.push('(' + searchConditions.join(' OR ') + ')')\n }\n }\n \n paramIndex = processFilters(filters, conditions, queryParams, paramIndex)\n if (__rowPolicy) conditions.push('(' + __rowPolicy.predicate + ')')\n \n let sql = `SELECT * FROM ").concat(tableName, "`\n \n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`\n }\n \n // Handle sorts - new array format. Two ORDER BY clauses are built: the one\n // actually used (a translatable column in the request's language, the\n // products table's price rewrites, rows without a value last), and a\n // plain-column twin kept only as the fallback below.\n let orderBySql = ''\n let plainOrderBySql = ''\n if (sorts) {\n const parsedSorts = safeJSONParse(sorts)\n if (Array.isArray(parsedSorts) && parsedSorts.length > 0) {\n const valid = parsedSorts.filter((sort) => sort && sort.field)\n valid.forEach((sort) => assertRequestColumn(sort.field, 'sort field'))\n const orderOf = (sort) => (sort.order || '').toUpperCase().startsWith('DESC') ? 'DESC' : 'ASC'\n const orderClauses = valid.map((sort) => `${localizedSortFieldSql(sort.field, requestLocale) || sortFieldSql(sort.field)} ${orderOf(sort)}").concat(SORT_NULLS_LAST_SQL, "`)\n const plainClauses = valid.map((sort) => `${sortFallbackField(sort.field)} ${orderOf(sort)}`)\n\n if (orderClauses.length > 0) {\n // The row's own key last, so equal rows can't repeat across pages\n // or vanish between them.\n const tiebreak = rowOrderTiebreak(valid.map((sort) => sort.field), orderOf(valid[valid.length - 1]))\n orderBySql = ` ORDER BY ${orderClauses.join(', ')}${tiebreak}`\n plainOrderBySql = ` ORDER BY ${plainClauses.join(', ')}${tiebreak}`\n }\n }\n } else if (sortBy) {\n assertRequestColumn(sortBy, 'sort field')\n const sortByDirection = (sortOrder || '').toUpperCase().startsWith('DESC') ? 'DESC' : 'ASC'\n const tiebreak = rowOrderTiebreak([sortBy], sortByDirection)\n orderBySql = ` ORDER BY ${localizedSortFieldSql(sortBy, requestLocale) || sortBy} ${sortByDirection}").concat(SORT_NULLS_LAST_SQL, "${tiebreak}`\n plainOrderBySql = ` ORDER BY ${sortBy} ${sortByDirection}${tiebreak}`\n }\n const usedRewrittenSort = orderBySql !== plainOrderBySql\n\n const limitValue = requestRowCount(limit || perPage)\n const offsetValue = offset !== undefined ? parseInt(offset) : (page && perPage ? (parseInt(page) - 1) * parseInt(perPage) : undefined)\n\n let sqlTail = ''\n if (limitValue !== undefined) {\n sqlTail += ` LIMIT ${limitValue}`\n }\n \n if (offsetValue !== undefined) {\n sqlTail += ` OFFSET ${offsetValue}`\n }\n\n const baseSql = sql\n sql = baseSql + orderBySql + sqlTail\n\n // The discount-aware price ordering is an inline sub-select over a JSON\n // column. It is written to be unraisable, but it runs inside ORDER BY for\n // the whole table - so if a database ever rejects it, fall back to ordering\n // by the stored list price rather than serving an empty products page. The\n // translatable-column ordering takes the same exit: a per-language column\n // the schema had at generation time may have been dropped since. So does\n // the empty-values-last ordering.\n let result\n try {\n result = await client.query(sql, queryParams)\n } catch (sortError) {\n if (!usedRewrittenSort) throw sortError\n console.warn(\n 'Rewritten sort failed; falling back to the plain column:',\n sortError && sortError.message\n )\n result = await client.query(baseSql + plainOrderBySql + sqlTail, queryParams)\n }\n const rows = Array.isArray(result?.rows) ? result.rows : []\n const plainRows = rows.map((row) =>\n row && typeof row.toJSON === 'function' ? row.toJSON() : row\n )\n const safeData = JSON.parse(JSON.stringify(plainRows, dateReplacer))\n ").concat(getTransformExpression(tableName)
|
|
59
61
|
? "const transformedData = ".concat(getTransformExpression(tableName))
|
|
60
62
|
: '', "\n\n // Stamp each row with a globally-correct 1-based `__rowNumber` (the page\n // offset is applied server-side above), so list index columns keep counting\n // across pages instead of restarting at 1. Renderer-internal field \u2014 it is\n // filtered from ordinary field bindings and only read by the index column.\n const __finalData = ").concat(getTransformExpression(tableName) ? 'transformedData' : 'safeData', "\n const __rowNumberStart = (typeof offsetValue === 'number' && !isNaN(offsetValue)) ? offsetValue : 0\n const __numberedData = Array.isArray(__finalData)\n ? __finalData.map((__row, __i) =>\n __row && typeof __row === 'object' && !Array.isArray(__row)\n ? Object.assign({}, __row, { __rowNumber: __rowNumberStart + __i + 1 })\n : __row)\n : __finalData\n\n return res.status(200).json({\n success: true,\n data: __taWithoutCredentials(\n __rowPolicy ? __brpStripHidden(__rowPolicy, __numberedData) : __numberedData,\n ").concat(JSON.stringify(tableName), "\n ),\n timestamp: Date.now()\n })\n } catch (error) {\n console.error('Teleport DB fetch error:', error)\n // A database error names tables, columns and values: it stays in the server\n // log. Only an error this route raised for the caller (it carries a status)\n // is repeated to it.\n return res.status(error.status || 500).json({\n success: false,\n error: error.status ? error.message : 'Failed to fetch data',\n timestamp: Date.now()\n })\n } finally {\n if (client) {\n try {\n await client.end()\n } catch (error) {\n console.error('Error closing database client:', error)\n }\n }\n }\n}\n");
|
|
61
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teleport.js","sourceRoot":"","sources":["../../../src/fetchers/teleport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GAExB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AACnG,OAAO,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChF,OAAO,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAA;AAC5E,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAA;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAC/F,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"teleport.js","sourceRoot":"","sources":["../../../src/fetchers/teleport.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,15 @@ import * as types from '@babel/types';
|
|
|
14
14
|
* and re-enter it. The ref is keyed by a SIGNATURE of every fetch param except
|
|
15
15
|
* the page, so a filter, sort or search change starts a fresh list instead of
|
|
16
16
|
* interleaving rows from two different queries.
|
|
17
|
+
*
|
|
18
|
+
* `fetchData` records the query and the page the list stands on BEFORE it
|
|
19
|
+
* requests them (`latest`), and only the answer to that request changes the
|
|
20
|
+
* list. A filter, sort or search change made past page 1 fires the old page
|
|
21
|
+
* under the new query first, then page 1 once the page is reset: kept, the
|
|
22
|
+
* stray page sat in the list, the page counter said 1, and the next "Load
|
|
23
|
+
* more" fetched a page already on show. `DataProvider` also renders whichever
|
|
24
|
+
* answer arrives LAST, so a late answer to an earlier query must not replace
|
|
25
|
+
* the list either.
|
|
17
26
|
*/
|
|
18
27
|
export interface InfiniteScrollVars {
|
|
19
28
|
accumRefVar: string;
|
|
@@ -37,11 +46,20 @@ export declare const getInfiniteScrollVars: (index: number) => InfiniteScrollVar
|
|
|
37
46
|
* being made at all; it is `0` while unknown, hence the explicit escape.
|
|
38
47
|
*/
|
|
39
48
|
export declare const buildInfiniteScrollDeclarations: (vars: InfiniteScrollVars, maxPagesVar: string, currentPageExpr: types.Expression, includeSentinel: boolean) => types.Statement[];
|
|
49
|
+
/**
|
|
50
|
+
* What `fetchData` runs before its request: the query and the page the list
|
|
51
|
+
* now stands on.
|
|
52
|
+
*
|
|
53
|
+
* ds_0_accumRef.current.latest = { sig: JSON.stringify({ ...params, page: 0 }), page: Number(params.page) || 1 }
|
|
54
|
+
*/
|
|
55
|
+
export declare const buildAccumulatingRequestMark: (vars: InfiniteScrollVars) => types.Statement;
|
|
40
56
|
/**
|
|
41
57
|
* The `.then(...)` tail that accumulates a page and reports whether more exist.
|
|
42
58
|
*
|
|
43
59
|
* Returned as the resolved value of `fetchData`, so `DataProvider` stores the
|
|
44
|
-
* whole accumulated list as its data
|
|
60
|
+
* whole accumulated list as its data: the pages of the query on show, first
|
|
61
|
+
* to the page it stands on. An answer to anything but the latest request
|
|
62
|
+
* (`buildAccumulatingRequestMark`) is not kept, and gets the list as it is.
|
|
45
63
|
*
|
|
46
64
|
* `itemsPath` is where the rows sit inside a payload that wraps them
|
|
47
65
|
* (`{ items: [...], total }`): the rows are read there and the accumulated list
|
|
@@ -66,6 +84,11 @@ export declare const buildSentinelObserverEffect: (vars: InfiniteScrollVars, max
|
|
|
66
84
|
* An invisible one-pixel row after the list. It is generated rather than
|
|
67
85
|
* authored because it is not a control — there is nothing to style or click,
|
|
68
86
|
* only a position in the document for the observer to watch.
|
|
87
|
+
*
|
|
88
|
+
* It takes the element its parent may hold: a table section holds rows, a
|
|
89
|
+
* list holds items, a paragraph holds phrasing. A `<div>` among a table's
|
|
90
|
+
* rows is moved out of the table by the parser, so the server's markup and
|
|
91
|
+
* the client's tree differ and React's hydration fails on every such list.
|
|
69
92
|
*/
|
|
70
|
-
export declare const buildSentinelElement: (vars: InfiniteScrollVars) => types.JSXElement;
|
|
93
|
+
export declare const buildSentinelElement: (vars: InfiniteScrollVars, parentTag?: string | null) => types.JSXElement;
|
|
71
94
|
//# sourceMappingURL=infinite-scroll.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infinite-scroll.d.ts","sourceRoot":"","sources":["../../src/infinite-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC
|
|
1
|
+
{"version":3,"file":"infinite-scroll.d.ts","sourceRoot":"","sources":["../../src/infinite-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,qBAAqB,UAAW,MAAM,KAAG,kBAMpD,CAAA;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,+BAA+B,SACpC,kBAAkB,eACX,MAAM,mBACF,MAAM,UAAU,mBAChB,OAAO,KACvB,MAAM,SAAS,EAuDjB,CAAA;AA+ED;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,SAAU,kBAAkB,KAAG,MAAM,SAU3E,CAAA;AAEH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gCAAgC,SACrC,kBAAkB,WACf,MAAM,cACH,MAAM,EAAE,KACnB,MAAM,uBA+KR,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,SAChC,kBAAkB,eACX,MAAM,6BACQ,MAAM,MAAM,SAAS,KAC/C,MAAM,mBAoGN,CAAA;AAmDH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,SACzB,kBAAkB,cACb,MAAM,GAAG,IAAI,KACvB,MAAM,UAmCR,CAAA"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
2
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3
|
+
if (ar || !(i in from)) {
|
|
4
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
5
|
+
ar[i] = from[i];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
9
|
+
};
|
|
1
10
|
import * as types from '@babel/types';
|
|
2
11
|
export var getInfiniteScrollVars = function (index) { return ({
|
|
3
12
|
accumRefVar: "ds_".concat(index, "_accumRef"),
|
|
@@ -26,6 +35,7 @@ export var buildInfiniteScrollDeclarations = function (vars, maxPagesVar, curren
|
|
|
26
35
|
types.objectExpression([
|
|
27
36
|
types.objectProperty(types.identifier('sig'), types.stringLiteral('')),
|
|
28
37
|
types.objectProperty(types.identifier('pages'), types.objectExpression([])),
|
|
38
|
+
types.objectProperty(types.identifier('latest'), types.nullLiteral()),
|
|
29
39
|
]),
|
|
30
40
|
])),
|
|
31
41
|
]),
|
|
@@ -84,11 +94,43 @@ var writeAtPath = function (node, path, value) {
|
|
|
84
94
|
types.objectProperty(types.isValidIdentifier(segment) ? types.identifier(segment) : types.stringLiteral(segment), child),
|
|
85
95
|
]);
|
|
86
96
|
};
|
|
97
|
+
/** `JSON.stringify({ ...params, page: 0 })`: everything that identifies the query but the page. */
|
|
98
|
+
var buildQuerySignature = function () {
|
|
99
|
+
return types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [
|
|
100
|
+
types.objectExpression([
|
|
101
|
+
types.spreadElement(types.identifier('params')),
|
|
102
|
+
types.objectProperty(types.identifier('page'), types.numericLiteral(0)),
|
|
103
|
+
]),
|
|
104
|
+
]);
|
|
105
|
+
};
|
|
106
|
+
/** `Number(params.page) || 1` */
|
|
107
|
+
var buildRequestedPage = function () {
|
|
108
|
+
return types.logicalExpression('||', types.callExpression(types.identifier('Number'), [
|
|
109
|
+
types.memberExpression(types.identifier('params'), types.identifier('page')),
|
|
110
|
+
]), types.numericLiteral(1));
|
|
111
|
+
};
|
|
112
|
+
var accumCurrentOf = function (vars) {
|
|
113
|
+
return types.memberExpression(types.identifier(vars.accumRefVar), types.identifier('current'));
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* What `fetchData` runs before its request: the query and the page the list
|
|
117
|
+
* now stands on.
|
|
118
|
+
*
|
|
119
|
+
* ds_0_accumRef.current.latest = { sig: JSON.stringify({ ...params, page: 0 }), page: Number(params.page) || 1 }
|
|
120
|
+
*/
|
|
121
|
+
export var buildAccumulatingRequestMark = function (vars) {
|
|
122
|
+
return types.expressionStatement(types.assignmentExpression('=', types.memberExpression(accumCurrentOf(vars), types.identifier('latest')), types.objectExpression([
|
|
123
|
+
types.objectProperty(types.identifier('sig'), buildQuerySignature()),
|
|
124
|
+
types.objectProperty(types.identifier('page'), buildRequestedPage()),
|
|
125
|
+
])));
|
|
126
|
+
};
|
|
87
127
|
/**
|
|
88
128
|
* The `.then(...)` tail that accumulates a page and reports whether more exist.
|
|
89
129
|
*
|
|
90
130
|
* Returned as the resolved value of `fetchData`, so `DataProvider` stores the
|
|
91
|
-
* whole accumulated list as its data
|
|
131
|
+
* whole accumulated list as its data: the pages of the query on show, first
|
|
132
|
+
* to the page it stands on. An answer to anything but the latest request
|
|
133
|
+
* (`buildAccumulatingRequestMark`) is not kept, and gets the list as it is.
|
|
92
134
|
*
|
|
93
135
|
* `itemsPath` is where the rows sit inside a payload that wraps them
|
|
94
136
|
* (`{ items: [...], total }`): the rows are read there and the accumulated list
|
|
@@ -97,17 +139,22 @@ var writeAtPath = function (node, path, value) {
|
|
|
97
139
|
* first page and rendered nothing.
|
|
98
140
|
*/
|
|
99
141
|
export var buildAccumulatingResponseHandler = function (vars, perPage, itemsPath) {
|
|
100
|
-
var accumCurrent = function () {
|
|
101
|
-
return types.memberExpression(types.identifier(vars.accumRefVar), types.identifier('current'));
|
|
102
|
-
};
|
|
142
|
+
var accumCurrent = function () { return accumCurrentOf(vars); };
|
|
103
143
|
var accumPages = function () {
|
|
104
144
|
return types.memberExpression(accumCurrent(), types.identifier('pages'));
|
|
105
145
|
};
|
|
146
|
+
var latestOf = function (key) {
|
|
147
|
+
return types.memberExpression(types.identifier('latest'), types.identifier(key));
|
|
148
|
+
};
|
|
106
149
|
var payload = function () {
|
|
107
150
|
return types.optionalMemberExpression(types.identifier('response'), types.identifier('data'), false, true);
|
|
108
151
|
};
|
|
109
152
|
var rowsPath = (itemsPath === null || itemsPath === void 0 ? void 0 : itemsPath.length) ? itemsPath : undefined;
|
|
110
|
-
|
|
153
|
+
// Every page held up to `last`, flattened in page order — a numeric sort, so
|
|
154
|
+
// page 10 does not land between 1 and 2.
|
|
155
|
+
var accumulatedRows = types.callExpression(types.memberExpression(types.callExpression(types.memberExpression(types.callExpression(types.memberExpression(types.callExpression(types.memberExpression(types.callExpression(types.memberExpression(types.identifier('Object'), types.identifier('keys')), [accumPages()]), types.identifier('map')), [types.identifier('Number')]), types.identifier('filter')), [
|
|
156
|
+
types.arrowFunctionExpression([types.identifier('p')], types.binaryExpression('<=', types.identifier('p'), types.identifier('last'))),
|
|
157
|
+
]), types.identifier('sort')), [
|
|
111
158
|
types.arrowFunctionExpression([types.identifier('a'), types.identifier('b')], types.binaryExpression('-', types.identifier('a'), types.identifier('b'))),
|
|
112
159
|
]), types.identifier('reduce')), [
|
|
113
160
|
types.arrowFunctionExpression([types.identifier('acc'), types.identifier('p')], types.callExpression(types.memberExpression(types.identifier('acc'), types.identifier('concat')), [types.memberExpression(accumPages(), types.identifier('p'), true)])),
|
|
@@ -118,35 +165,42 @@ export var buildAccumulatingResponseHandler = function (vars, perPage, itemsPath
|
|
|
118
165
|
types.variableDeclarator(types.identifier('rows'), types.logicalExpression('||', rowsPath ? readAtPath(payload(), rowsPath) : payload(), types.arrayExpression([]))),
|
|
119
166
|
]),
|
|
120
167
|
types.variableDeclaration('const', [
|
|
121
|
-
types.variableDeclarator(types.identifier('page'),
|
|
122
|
-
types.memberExpression(types.identifier('params'), types.identifier('page')),
|
|
123
|
-
]), types.numericLiteral(1))),
|
|
168
|
+
types.variableDeclarator(types.identifier('page'), buildRequestedPage()),
|
|
124
169
|
]),
|
|
125
170
|
// Everything that identifies the QUERY, with the page zeroed out: two
|
|
126
171
|
// fetches that differ only by page belong to the same accumulated list.
|
|
127
172
|
types.variableDeclaration('const', [
|
|
128
|
-
types.variableDeclarator(types.identifier('sig'),
|
|
129
|
-
types.objectExpression([
|
|
130
|
-
types.spreadElement(types.identifier('params')),
|
|
131
|
-
types.objectProperty(types.identifier('page'), types.numericLiteral(0)),
|
|
132
|
-
]),
|
|
133
|
-
])),
|
|
173
|
+
types.variableDeclarator(types.identifier('sig'), buildQuerySignature()),
|
|
134
174
|
]),
|
|
135
|
-
|
|
136
|
-
|
|
175
|
+
// The request the list stands on now, recorded when it was made.
|
|
176
|
+
types.variableDeclaration('const', [
|
|
177
|
+
types.variableDeclarator(types.identifier('latest'), types.logicalExpression('||', types.memberExpression(accumCurrent(), types.identifier('latest')), types.objectExpression([
|
|
137
178
|
types.objectProperty(types.identifier('sig'), types.identifier('sig'), false, true),
|
|
138
|
-
types.objectProperty(types.identifier('
|
|
179
|
+
types.objectProperty(types.identifier('page'), types.identifier('page'), false, true),
|
|
139
180
|
]))),
|
|
181
|
+
]),
|
|
182
|
+
// Only its answer is kept: an earlier query's, or a page past the one a
|
|
183
|
+
// filter / sort / search change restarted the list at, changes nothing.
|
|
184
|
+
types.ifStatement(types.logicalExpression('&&', types.binaryExpression('===', types.identifier('sig'), latestOf('sig')), types.binaryExpression('<=', types.identifier('page'), latestOf('page'))), types.blockStatement([
|
|
185
|
+
types.ifStatement(types.binaryExpression('!==', types.memberExpression(accumCurrent(), types.identifier('sig')), types.identifier('sig')), types.blockStatement([
|
|
186
|
+
types.expressionStatement(types.assignmentExpression('=', types.memberExpression(accumCurrent(), types.identifier('sig')), types.identifier('sig'))),
|
|
187
|
+
types.expressionStatement(types.assignmentExpression('=', accumPages(), types.objectExpression([]))),
|
|
188
|
+
])),
|
|
189
|
+
types.expressionStatement(types.assignmentExpression('=', types.memberExpression(accumPages(), types.identifier('page'), true), types.identifier('rows'))),
|
|
190
|
+
// A page that came back short is the last one. This is the only
|
|
191
|
+
// end-of-data signal a data source that cannot count ever gives.
|
|
192
|
+
types.ifStatement(types.binaryExpression('===', types.identifier('page'), latestOf('page')), types.blockStatement([
|
|
193
|
+
types.expressionStatement(types.callExpression(types.identifier(vars.setHasMoreFlagVar), [
|
|
194
|
+
types.binaryExpression('>=', types.memberExpression(types.identifier('rows'), types.identifier('length')), types.numericLiteral(perPage)),
|
|
195
|
+
])),
|
|
196
|
+
])),
|
|
140
197
|
])),
|
|
141
|
-
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
// Every page held so far, flattened in page order — a numeric sort, so
|
|
148
|
-
// page 10 does not land between 1 and 2. This is what DataProvider stores
|
|
149
|
-
// as its data, and so what the list renders.
|
|
198
|
+
// The pages of the query on show, up to the page the list stands on; all
|
|
199
|
+
// of them while the latest query has not answered yet.
|
|
200
|
+
types.variableDeclaration('const', [
|
|
201
|
+
types.variableDeclarator(types.identifier('last'), types.conditionalExpression(types.binaryExpression('===', types.memberExpression(accumCurrent(), types.identifier('sig')), latestOf('sig')), latestOf('page'), types.identifier('Infinity'))),
|
|
202
|
+
]),
|
|
203
|
+
// This is what DataProvider stores as its data, and so what the list renders.
|
|
150
204
|
types.returnStatement(rowsPath ? writeAtPath(payload(), rowsPath, accumulatedRows) : accumulatedRows),
|
|
151
205
|
]));
|
|
152
206
|
};
|
|
@@ -189,20 +243,76 @@ export var buildSentinelObserverEffect = function (vars, maxPagesVar, buildAdvan
|
|
|
189
243
|
types.arrayExpression([types.identifier(vars.hasMoreVar), types.identifier(maxPagesVar)]),
|
|
190
244
|
]));
|
|
191
245
|
};
|
|
246
|
+
var styleAttribute = function (entries) {
|
|
247
|
+
return types.jsxAttribute(types.jsxIdentifier('style'), types.jsxExpressionContainer(types.objectExpression(Object.entries(entries).map(function (_a) {
|
|
248
|
+
var key = _a[0], value = _a[1];
|
|
249
|
+
return types.objectProperty(types.identifier(key), typeof value === 'number' ? types.numericLiteral(value) : types.stringLiteral(value));
|
|
250
|
+
}))));
|
|
251
|
+
};
|
|
252
|
+
var sentinelTag = function (tag, attributes, children) {
|
|
253
|
+
if (children === void 0) { children = []; }
|
|
254
|
+
return types.jsxElement(types.jsxOpeningElement(types.jsxIdentifier(tag), attributes, children.length === 0), children.length === 0 ? null : types.jsxClosingElement(types.jsxIdentifier(tag)), children, children.length === 0);
|
|
255
|
+
};
|
|
256
|
+
/** Parents whose content is phrasing only: a `<div>` in one closes it in the parser. */
|
|
257
|
+
var PHRASING_PARENTS = new Set([
|
|
258
|
+
'p',
|
|
259
|
+
'span',
|
|
260
|
+
'a',
|
|
261
|
+
'button',
|
|
262
|
+
'label',
|
|
263
|
+
'legend',
|
|
264
|
+
'caption',
|
|
265
|
+
'h1',
|
|
266
|
+
'h2',
|
|
267
|
+
'h3',
|
|
268
|
+
'h4',
|
|
269
|
+
'h5',
|
|
270
|
+
'h6',
|
|
271
|
+
'strong',
|
|
272
|
+
'em',
|
|
273
|
+
'b',
|
|
274
|
+
'i',
|
|
275
|
+
'small',
|
|
276
|
+
]);
|
|
192
277
|
/**
|
|
193
278
|
* `<div ref={ds_N_sentinelRef} aria-hidden="true" style={{ height: '1px' }} />`
|
|
194
279
|
*
|
|
195
280
|
* An invisible one-pixel row after the list. It is generated rather than
|
|
196
281
|
* authored because it is not a control — there is nothing to style or click,
|
|
197
282
|
* only a position in the document for the observer to watch.
|
|
283
|
+
*
|
|
284
|
+
* It takes the element its parent may hold: a table section holds rows, a
|
|
285
|
+
* list holds items, a paragraph holds phrasing. A `<div>` among a table's
|
|
286
|
+
* rows is moved out of the table by the parser, so the server's markup and
|
|
287
|
+
* the client's tree differ and React's hydration fails on every such list.
|
|
198
288
|
*/
|
|
199
|
-
export var buildSentinelElement = function (vars) {
|
|
200
|
-
|
|
289
|
+
export var buildSentinelElement = function (vars, parentTag) {
|
|
290
|
+
if (parentTag === void 0) { parentTag = null; }
|
|
291
|
+
var observed = [
|
|
201
292
|
types.jsxAttribute(types.jsxIdentifier('ref'), types.jsxExpressionContainer(types.identifier(vars.sentinelRefVar))),
|
|
202
293
|
types.jsxAttribute(types.jsxIdentifier('aria-hidden'), types.stringLiteral('true')),
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
294
|
+
];
|
|
295
|
+
var emptyCell = function () { return sentinelTag('td', [styleAttribute({ padding: 0, border: 0 })]); };
|
|
296
|
+
switch (parentTag) {
|
|
297
|
+
case 'tbody':
|
|
298
|
+
case 'thead':
|
|
299
|
+
case 'tfoot':
|
|
300
|
+
return sentinelTag('tr', __spreadArray(__spreadArray([], observed, true), [styleAttribute({ height: '1px' })], false), [emptyCell()]);
|
|
301
|
+
case 'table':
|
|
302
|
+
return sentinelTag('tbody', __spreadArray(__spreadArray([], observed, true), [styleAttribute({ height: '1px' })], false), [sentinelTag('tr', [], [emptyCell()])]);
|
|
303
|
+
case 'tr':
|
|
304
|
+
return sentinelTag('td', __spreadArray(__spreadArray([], observed, true), [styleAttribute({ height: '1px', padding: 0 })], false));
|
|
305
|
+
case 'ul':
|
|
306
|
+
case 'ol':
|
|
307
|
+
case 'menu':
|
|
308
|
+
return sentinelTag('li', __spreadArray(__spreadArray([], observed, true), [styleAttribute({ height: '1px', listStyle: 'none' })], false));
|
|
309
|
+
default:
|
|
310
|
+
if (parentTag && PHRASING_PARENTS.has(parentTag)) {
|
|
311
|
+
return sentinelTag('span', __spreadArray(__spreadArray([], observed, true), [
|
|
312
|
+
styleAttribute({ display: 'block', height: '1px' }),
|
|
313
|
+
], false));
|
|
314
|
+
}
|
|
315
|
+
return sentinelTag('div', __spreadArray(__spreadArray([], observed, true), [styleAttribute({ height: '1px' })], false));
|
|
316
|
+
}
|
|
207
317
|
};
|
|
208
318
|
//# sourceMappingURL=infinite-scroll.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infinite-scroll.js","sourceRoot":"","sources":["../../src/infinite-scroll.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"infinite-scroll.js","sourceRoot":"","sources":["../../src/infinite-scroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a table is one of those listing tables, so its rows are told apart
|
|
3
|
+
* by `id` even when the project saved no columns for it (see `row-order.ts`).
|
|
4
|
+
*/
|
|
5
|
+
export declare const isListingTableWithId: (tableName: string) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Appended to every sorted column: a row without a value comes after the
|
|
8
|
+
* rows with one, whichever the direction. PostgreSQL puts NULLs FIRST in a
|
|
9
|
+
* descending order, so "longest read first" opened on the posts without a
|
|
10
|
+
* reading time. Only on the ORDER BY a fetcher tries first — its plain-column
|
|
11
|
+
* fallback leaves it out, for a database that rejects the clause.
|
|
12
|
+
*/
|
|
13
|
+
export declare const SORT_NULLS_LAST_SQL = " NULLS LAST";
|
|
14
|
+
//# sourceMappingURL=list-sort-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-sort-order.d.ts","sourceRoot":"","sources":["../../src/list-sort-order.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,cAAe,MAAM,KAAG,OAClB,CAAA;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { PRODUCTS_TABLE_NAME } from './product-price-sort';
|
|
2
|
+
/**
|
|
3
|
+
* How a generated list route orders the rows a visitor's sort leaves tied or
|
|
4
|
+
* empty, in the SQL fetchers that serve the platform's listing pages
|
|
5
|
+
* (`teleport.ts`, `postgresql.ts`).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The platform tables whose listing pages offer visitors a sort — the
|
|
9
|
+
* products page, the blog listing, the booking page — each with an `id` from
|
|
10
|
+
* its first migration.
|
|
11
|
+
*/
|
|
12
|
+
var LISTING_TABLES_WITH_ID = new Set([
|
|
13
|
+
PRODUCTS_TABLE_NAME,
|
|
14
|
+
'teleport_blog_posts',
|
|
15
|
+
'teleport_booking_items',
|
|
16
|
+
]);
|
|
17
|
+
/**
|
|
18
|
+
* Whether a table is one of those listing tables, so its rows are told apart
|
|
19
|
+
* by `id` even when the project saved no columns for it (see `row-order.ts`).
|
|
20
|
+
*/
|
|
21
|
+
export var isListingTableWithId = function (tableName) {
|
|
22
|
+
return LISTING_TABLES_WITH_ID.has(tableName);
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Appended to every sorted column: a row without a value comes after the
|
|
26
|
+
* rows with one, whichever the direction. PostgreSQL puts NULLs FIRST in a
|
|
27
|
+
* descending order, so "longest read first" opened on the posts without a
|
|
28
|
+
* reading time. Only on the ORDER BY a fetcher tries first — its plain-column
|
|
29
|
+
* fallback leaves it out, for a database that rejects the clause.
|
|
30
|
+
*/
|
|
31
|
+
export var SORT_NULLS_LAST_SQL = ' NULLS LAST';
|
|
32
|
+
//# sourceMappingURL=list-sort-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-sort-order.js","sourceRoot":"","sources":["../../src/list-sort-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D;;;;GAIG;AAEH;;;;GAIG;AACH,IAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IAC1D,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;CACzB,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,SAAiB;IACpD,OAAA,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC;AAArC,CAAqC,CAAA;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,IAAM,mBAAmB,GAAG,aAAa,CAAA"}
|