@teleporthq/teleport-plugin-next-data-source 0.43.66 → 0.43.68
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__/array-mapper-cache-wiring.test.ts +11 -0
- package/__tests__/array-overlap-sql.test.ts +53 -0
- package/__tests__/blog-post-page-enrichment.test.ts +214 -0
- package/__tests__/browser-row-policy.test.ts +503 -0
- package/__tests__/data-source-cache-wrapping.test.ts +18 -2
- package/__tests__/data-source-request-locale.test.ts +313 -0
- package/__tests__/ecommerce-product-options.test.ts +206 -0
- package/__tests__/ecommerce-product-pages.test.ts +82 -0
- package/__tests__/ecommerce-product-pre-options.golden.json +505 -0
- package/__tests__/ecommerce-product-storefront-contract.test.ts +293 -0
- package/__tests__/ecommerce-product-subscriptions.test.ts +121 -0
- package/__tests__/fetchers.test.ts +2 -2
- package/__tests__/gated-data-provider.test.ts +88 -0
- package/__tests__/items-path.test.ts +150 -0
- package/__tests__/localized-columns.test.ts +217 -0
- package/__tests__/numbered-pagination.test.ts +15 -0
- package/__tests__/product-filter-fields.ts +230 -0
- package/__tests__/product-filter-sql.fixture.json +7 -0
- package/__tests__/product-options-storefront.fixture.json +2510 -0
- package/__tests__/product-page-url-fixtures.json +25 -0
- package/__tests__/product-price-sort.ts +4 -2
- package/__tests__/raw-rows-mode.test.ts +111 -0
- package/__tests__/refetch-loading-state.test.ts +23 -0
- package/__tests__/rest-api-response-cache.test.ts +434 -0
- package/__tests__/search-clear-button.test.ts +122 -0
- package/__tests__/table-read-route-protected-tables.test.ts +493 -0
- package/dist/cjs/array-overlap-sql.d.ts +21 -0
- package/dist/cjs/array-overlap-sql.d.ts.map +1 -0
- package/dist/cjs/array-overlap-sql.js +25 -0
- package/dist/cjs/array-overlap-sql.js.map +1 -0
- package/dist/cjs/content-localization.d.ts +37 -0
- package/dist/cjs/content-localization.d.ts.map +1 -0
- package/dist/cjs/content-localization.js +29 -0
- package/dist/cjs/content-localization.js.map +1 -0
- package/dist/cjs/count-effect.d.ts +11 -1
- package/dist/cjs/count-effect.d.ts.map +1 -1
- package/dist/cjs/count-effect.js +30 -2
- package/dist/cjs/count-effect.js.map +1 -1
- package/dist/cjs/data-source-fetchers.d.ts.map +1 -1
- package/dist/cjs/data-source-fetchers.js +10 -4
- package/dist/cjs/data-source-fetchers.js.map +1 -1
- package/dist/cjs/fetchers/airtable.d.ts.map +1 -1
- package/dist/cjs/fetchers/airtable.js +1 -1
- package/dist/cjs/fetchers/airtable.js.map +1 -1
- package/dist/cjs/fetchers/clickhouse.d.ts.map +1 -1
- package/dist/cjs/fetchers/clickhouse.js +1 -1
- package/dist/cjs/fetchers/clickhouse.js.map +1 -1
- package/dist/cjs/fetchers/firestore.d.ts.map +1 -1
- package/dist/cjs/fetchers/firestore.js +1 -1
- package/dist/cjs/fetchers/firestore.js.map +1 -1
- package/dist/cjs/fetchers/javascript.d.ts.map +1 -1
- package/dist/cjs/fetchers/javascript.js +1 -1
- package/dist/cjs/fetchers/javascript.js.map +1 -1
- package/dist/cjs/fetchers/mariadb.d.ts.map +1 -1
- package/dist/cjs/fetchers/mariadb.js +1 -1
- package/dist/cjs/fetchers/mariadb.js.map +1 -1
- package/dist/cjs/fetchers/mongodb.d.ts.map +1 -1
- package/dist/cjs/fetchers/mongodb.js +1 -1
- package/dist/cjs/fetchers/mongodb.js.map +1 -1
- package/dist/cjs/fetchers/mysql.d.ts.map +1 -1
- package/dist/cjs/fetchers/mysql.js +1 -1
- package/dist/cjs/fetchers/mysql.js.map +1 -1
- package/dist/cjs/fetchers/postgresql.d.ts +1 -1
- package/dist/cjs/fetchers/postgresql.d.ts.map +1 -1
- package/dist/cjs/fetchers/postgresql.js +9 -4
- package/dist/cjs/fetchers/postgresql.js.map +1 -1
- package/dist/cjs/fetchers/raw-query.d.ts +8 -1
- package/dist/cjs/fetchers/raw-query.d.ts.map +1 -1
- package/dist/cjs/fetchers/raw-query.js +42 -4
- 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 +1 -1
- package/dist/cjs/fetchers/redshift.js.map +1 -1
- package/dist/cjs/fetchers/rest-api.d.ts.map +1 -1
- package/dist/cjs/fetchers/rest-api.js +7 -2
- package/dist/cjs/fetchers/rest-api.js.map +1 -1
- package/dist/cjs/fetchers/teleport.d.ts.map +1 -1
- package/dist/cjs/fetchers/teleport.js +16 -6
- package/dist/cjs/fetchers/teleport.js.map +1 -1
- package/dist/cjs/fetchers/turso.d.ts.map +1 -1
- package/dist/cjs/fetchers/turso.js +1 -1
- package/dist/cjs/fetchers/turso.js.map +1 -1
- package/dist/cjs/fetchers/utils/browser-row-policy.d.ts +43 -0
- package/dist/cjs/fetchers/utils/browser-row-policy.d.ts.map +1 -0
- package/dist/cjs/fetchers/utils/browser-row-policy.js +66 -0
- package/dist/cjs/fetchers/utils/browser-row-policy.js.map +1 -0
- package/dist/cjs/fetchers/utils/request-sql-guards.d.ts +8 -0
- package/dist/cjs/fetchers/utils/request-sql-guards.d.ts.map +1 -0
- package/dist/cjs/fetchers/utils/request-sql-guards.js +12 -0
- package/dist/cjs/fetchers/utils/request-sql-guards.js.map +1 -0
- package/dist/cjs/fetchers/utils/rest-api-response-cache.d.ts +40 -0
- package/dist/cjs/fetchers/utils/rest-api-response-cache.d.ts.map +1 -0
- package/dist/cjs/fetchers/utils/rest-api-response-cache.js +64 -0
- package/dist/cjs/fetchers/utils/rest-api-response-cache.js.map +1 -0
- package/dist/cjs/fetchers/utils/table-access-guard.d.ts +23 -0
- package/dist/cjs/fetchers/utils/table-access-guard.d.ts.map +1 -0
- package/dist/cjs/fetchers/utils/table-access-guard.js +34 -0
- package/dist/cjs/fetchers/utils/table-access-guard.js.map +1 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +60 -8
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/items-path.d.ts +10 -0
- package/dist/cjs/items-path.d.ts.map +1 -0
- package/dist/cjs/items-path.js +86 -0
- package/dist/cjs/items-path.js.map +1 -0
- package/dist/cjs/loading-state.d.ts +16 -1
- package/dist/cjs/loading-state.d.ts.map +1 -1
- package/dist/cjs/loading-state.js +69 -3
- package/dist/cjs/loading-state.js.map +1 -1
- package/dist/cjs/localized-columns.d.ts +56 -0
- package/dist/cjs/localized-columns.d.ts.map +1 -0
- package/dist/cjs/localized-columns.js +137 -0
- package/dist/cjs/localized-columns.js.map +1 -0
- package/dist/cjs/pagination-plugin.d.ts.map +1 -1
- package/dist/cjs/pagination-plugin.js +140 -50
- package/dist/cjs/pagination-plugin.js.map +1 -1
- package/dist/cjs/product-filter-fields.d.ts +87 -0
- package/dist/cjs/product-filter-fields.d.ts.map +1 -0
- package/dist/cjs/product-filter-fields.js +161 -0
- package/dist/cjs/product-filter-fields.js.map +1 -0
- package/dist/cjs/request-locale.d.ts +49 -0
- package/dist/cjs/request-locale.d.ts.map +1 -0
- package/dist/cjs/request-locale.js +130 -0
- package/dist/cjs/request-locale.js.map +1 -0
- package/dist/cjs/search-clear.d.ts +31 -0
- package/dist/cjs/search-clear.d.ts.map +1 -0
- package/dist/cjs/search-clear.js +103 -0
- package/dist/cjs/search-clear.js.map +1 -0
- package/dist/cjs/transformations/blog-adjacent-posts.d.ts +16 -0
- package/dist/cjs/transformations/blog-adjacent-posts.d.ts.map +1 -0
- package/dist/cjs/transformations/blog-adjacent-posts.js +25 -0
- package/dist/cjs/transformations/blog-adjacent-posts.js.map +1 -0
- package/dist/cjs/transformations/blog-comments.d.ts +30 -0
- package/dist/cjs/transformations/blog-comments.d.ts.map +1 -0
- package/dist/cjs/transformations/blog-comments.js +34 -0
- package/dist/cjs/transformations/blog-comments.js.map +1 -0
- package/dist/cjs/transformations/blog-post.d.ts +2 -0
- package/dist/cjs/transformations/blog-post.d.ts.map +1 -1
- package/dist/cjs/transformations/blog-post.js +4 -1
- package/dist/cjs/transformations/blog-post.js.map +1 -1
- package/dist/cjs/transformations/ecommerce-product.d.ts +9 -1
- package/dist/cjs/transformations/ecommerce-product.d.ts.map +1 -1
- package/dist/cjs/transformations/ecommerce-product.js +28 -1
- package/dist/cjs/transformations/ecommerce-product.js.map +1 -1
- package/dist/cjs/transformations/heading-anchors.d.ts +25 -0
- package/dist/cjs/transformations/heading-anchors.d.ts.map +1 -0
- package/dist/cjs/transformations/heading-anchors.js +29 -0
- package/dist/cjs/transformations/heading-anchors.js.map +1 -0
- package/dist/cjs/transformations/index.d.ts +61 -4
- package/dist/cjs/transformations/index.d.ts.map +1 -1
- package/dist/cjs/transformations/index.js +69 -19
- package/dist/cjs/transformations/index.js.map +1 -1
- package/dist/cjs/transformations/shared-utils.d.ts.map +1 -1
- package/dist/cjs/transformations/shared-utils.js +1 -1
- package/dist/cjs/transformations/shared-utils.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils.d.ts +11 -1
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +60 -16
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/array-overlap-sql.d.ts +21 -0
- package/dist/esm/array-overlap-sql.d.ts.map +1 -0
- package/dist/esm/array-overlap-sql.js +21 -0
- package/dist/esm/array-overlap-sql.js.map +1 -0
- package/dist/esm/content-localization.d.ts +37 -0
- package/dist/esm/content-localization.d.ts.map +1 -0
- package/dist/esm/content-localization.js +24 -0
- package/dist/esm/content-localization.js.map +1 -0
- package/dist/esm/count-effect.d.ts +11 -1
- package/dist/esm/count-effect.d.ts.map +1 -1
- package/dist/esm/count-effect.js +28 -1
- package/dist/esm/count-effect.js.map +1 -1
- package/dist/esm/data-source-fetchers.d.ts.map +1 -1
- package/dist/esm/data-source-fetchers.js +11 -5
- package/dist/esm/data-source-fetchers.js.map +1 -1
- package/dist/esm/fetchers/airtable.d.ts.map +1 -1
- package/dist/esm/fetchers/airtable.js +1 -1
- package/dist/esm/fetchers/airtable.js.map +1 -1
- package/dist/esm/fetchers/clickhouse.d.ts.map +1 -1
- package/dist/esm/fetchers/clickhouse.js +1 -1
- package/dist/esm/fetchers/clickhouse.js.map +1 -1
- package/dist/esm/fetchers/firestore.d.ts.map +1 -1
- package/dist/esm/fetchers/firestore.js +1 -1
- package/dist/esm/fetchers/firestore.js.map +1 -1
- package/dist/esm/fetchers/javascript.d.ts.map +1 -1
- package/dist/esm/fetchers/javascript.js +1 -1
- package/dist/esm/fetchers/javascript.js.map +1 -1
- package/dist/esm/fetchers/mariadb.d.ts.map +1 -1
- package/dist/esm/fetchers/mariadb.js +1 -1
- package/dist/esm/fetchers/mariadb.js.map +1 -1
- package/dist/esm/fetchers/mongodb.d.ts.map +1 -1
- package/dist/esm/fetchers/mongodb.js +1 -1
- package/dist/esm/fetchers/mongodb.js.map +1 -1
- package/dist/esm/fetchers/mysql.d.ts.map +1 -1
- package/dist/esm/fetchers/mysql.js +1 -1
- package/dist/esm/fetchers/mysql.js.map +1 -1
- package/dist/esm/fetchers/postgresql.d.ts +1 -1
- package/dist/esm/fetchers/postgresql.d.ts.map +1 -1
- package/dist/esm/fetchers/postgresql.js +9 -4
- package/dist/esm/fetchers/postgresql.js.map +1 -1
- package/dist/esm/fetchers/raw-query.d.ts +8 -1
- package/dist/esm/fetchers/raw-query.d.ts.map +1 -1
- package/dist/esm/fetchers/raw-query.js +42 -4
- 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 +1 -1
- package/dist/esm/fetchers/redshift.js.map +1 -1
- package/dist/esm/fetchers/rest-api.d.ts.map +1 -1
- package/dist/esm/fetchers/rest-api.js +7 -2
- package/dist/esm/fetchers/rest-api.js.map +1 -1
- package/dist/esm/fetchers/teleport.d.ts.map +1 -1
- package/dist/esm/fetchers/teleport.js +16 -6
- package/dist/esm/fetchers/teleport.js.map +1 -1
- package/dist/esm/fetchers/turso.d.ts.map +1 -1
- package/dist/esm/fetchers/turso.js +1 -1
- package/dist/esm/fetchers/turso.js.map +1 -1
- package/dist/esm/fetchers/utils/browser-row-policy.d.ts +43 -0
- package/dist/esm/fetchers/utils/browser-row-policy.d.ts.map +1 -0
- package/dist/esm/fetchers/utils/browser-row-policy.js +60 -0
- package/dist/esm/fetchers/utils/browser-row-policy.js.map +1 -0
- package/dist/esm/fetchers/utils/request-sql-guards.d.ts +8 -0
- package/dist/esm/fetchers/utils/request-sql-guards.d.ts.map +1 -0
- package/dist/esm/fetchers/utils/request-sql-guards.js +8 -0
- package/dist/esm/fetchers/utils/request-sql-guards.js.map +1 -0
- package/dist/esm/fetchers/utils/rest-api-response-cache.d.ts +40 -0
- package/dist/esm/fetchers/utils/rest-api-response-cache.d.ts.map +1 -0
- package/dist/esm/fetchers/utils/rest-api-response-cache.js +59 -0
- package/dist/esm/fetchers/utils/rest-api-response-cache.js.map +1 -0
- package/dist/esm/fetchers/utils/table-access-guard.d.ts +23 -0
- package/dist/esm/fetchers/utils/table-access-guard.d.ts.map +1 -0
- package/dist/esm/fetchers/utils/table-access-guard.js +29 -0
- package/dist/esm/fetchers/utils/table-access-guard.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +55 -7
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/items-path.d.ts +10 -0
- package/dist/esm/items-path.d.ts.map +1 -0
- package/dist/esm/items-path.js +58 -0
- package/dist/esm/items-path.js.map +1 -0
- package/dist/esm/loading-state.d.ts +16 -1
- package/dist/esm/loading-state.d.ts.map +1 -1
- package/dist/esm/loading-state.js +69 -3
- package/dist/esm/loading-state.js.map +1 -1
- package/dist/esm/localized-columns.d.ts +56 -0
- package/dist/esm/localized-columns.d.ts.map +1 -0
- package/dist/esm/localized-columns.js +132 -0
- package/dist/esm/localized-columns.js.map +1 -0
- package/dist/esm/pagination-plugin.d.ts.map +1 -1
- package/dist/esm/pagination-plugin.js +141 -51
- package/dist/esm/pagination-plugin.js.map +1 -1
- package/dist/esm/product-filter-fields.d.ts +87 -0
- package/dist/esm/product-filter-fields.d.ts.map +1 -0
- package/dist/esm/product-filter-fields.js +154 -0
- package/dist/esm/product-filter-fields.js.map +1 -0
- package/dist/esm/request-locale.d.ts +49 -0
- package/dist/esm/request-locale.d.ts.map +1 -0
- package/dist/esm/request-locale.js +98 -0
- package/dist/esm/request-locale.js.map +1 -0
- package/dist/esm/search-clear.d.ts +31 -0
- package/dist/esm/search-clear.d.ts.map +1 -0
- package/dist/esm/search-clear.js +74 -0
- package/dist/esm/search-clear.js.map +1 -0
- package/dist/esm/transformations/blog-adjacent-posts.d.ts +16 -0
- package/dist/esm/transformations/blog-adjacent-posts.d.ts.map +1 -0
- package/dist/esm/transformations/blog-adjacent-posts.js +21 -0
- package/dist/esm/transformations/blog-adjacent-posts.js.map +1 -0
- package/dist/esm/transformations/blog-comments.d.ts +30 -0
- package/dist/esm/transformations/blog-comments.d.ts.map +1 -0
- package/dist/esm/transformations/blog-comments.js +30 -0
- package/dist/esm/transformations/blog-comments.js.map +1 -0
- package/dist/esm/transformations/blog-post.d.ts +2 -0
- package/dist/esm/transformations/blog-post.d.ts.map +1 -1
- package/dist/esm/transformations/blog-post.js +4 -1
- package/dist/esm/transformations/blog-post.js.map +1 -1
- package/dist/esm/transformations/ecommerce-product.d.ts +9 -1
- package/dist/esm/transformations/ecommerce-product.d.ts.map +1 -1
- package/dist/esm/transformations/ecommerce-product.js +29 -2
- package/dist/esm/transformations/ecommerce-product.js.map +1 -1
- package/dist/esm/transformations/heading-anchors.d.ts +25 -0
- package/dist/esm/transformations/heading-anchors.d.ts.map +1 -0
- package/dist/esm/transformations/heading-anchors.js +25 -0
- package/dist/esm/transformations/heading-anchors.js.map +1 -0
- package/dist/esm/transformations/index.d.ts +61 -4
- package/dist/esm/transformations/index.d.ts.map +1 -1
- package/dist/esm/transformations/index.js +69 -19
- package/dist/esm/transformations/index.js.map +1 -1
- package/dist/esm/transformations/shared-utils.d.ts.map +1 -1
- package/dist/esm/transformations/shared-utils.js +1 -1
- package/dist/esm/transformations/shared-utils.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +11 -1
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +60 -16
- package/dist/esm/utils.js.map +1 -1
- package/package.json +5 -5
- package/src/array-overlap-sql.ts +41 -0
- package/src/content-localization.ts +53 -0
- package/src/count-effect.ts +53 -2
- package/src/data-source-fetchers.ts +41 -5
- package/src/fetchers/airtable.ts +4 -2
- package/src/fetchers/clickhouse.ts +4 -2
- package/src/fetchers/firestore.ts +4 -2
- package/src/fetchers/javascript.ts +9 -1
- package/src/fetchers/mariadb.ts +4 -2
- package/src/fetchers/mongodb.ts +4 -2
- package/src/fetchers/mysql.ts +4 -2
- package/src/fetchers/postgresql.ts +53 -12
- package/src/fetchers/raw-query.ts +60 -5
- package/src/fetchers/redshift.ts +4 -2
- package/src/fetchers/rest-api.ts +27 -5
- package/src/fetchers/teleport.ts +85 -22
- package/src/fetchers/turso.ts +4 -2
- package/src/fetchers/utils/browser-row-policy.ts +212 -0
- package/src/fetchers/utils/request-sql-guards.ts +25 -0
- package/src/fetchers/utils/rest-api-response-cache.ts +188 -0
- package/src/fetchers/utils/table-access-guard.ts +39 -0
- package/src/index.ts +79 -11
- package/src/items-path.ts +74 -0
- package/src/loading-state.ts +134 -3
- package/src/localized-columns.ts +146 -0
- package/src/pagination-plugin.ts +206 -60
- package/src/product-filter-fields.ts +173 -0
- package/src/request-locale.ts +113 -0
- package/src/search-clear.ts +102 -0
- package/src/transformations/blog-adjacent-posts.ts +74 -0
- package/src/transformations/blog-comments.ts +132 -0
- package/src/transformations/blog-post.ts +38 -5
- package/src/transformations/ecommerce-product.ts +568 -5
- package/src/transformations/heading-anchors.ts +85 -0
- package/src/transformations/index.ts +191 -23
- package/src/transformations/shared-utils.ts +6 -0
- package/src/utils.ts +109 -19
|
@@ -14,13 +14,17 @@ export function getLoadingStateVars(index) {
|
|
|
14
14
|
isFetchingVar: "ds_".concat(index, "_isFetching"),
|
|
15
15
|
setIsFetchingVar: "setDs_".concat(index, "_isFetching"),
|
|
16
16
|
inFlightRefVar: "ds_".concat(index, "_fetchesInFlight"),
|
|
17
|
+
fetchSeqRefVar: "ds_".concat(index, "_fetchSeq"),
|
|
18
|
+
latestDataRefVar: "ds_".concat(index, "_latestData"),
|
|
17
19
|
};
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* `const ds_N_fetchesInFlight = useRef(0)`
|
|
23
|
+
* `const ds_N_fetchSeq = useRef(0)`
|
|
24
|
+
* `const ds_N_latestData = useRef(undefined)`
|
|
21
25
|
* `const [ds_N_isFetching, setDs_N_isFetching] = useState(false)`
|
|
22
26
|
*
|
|
23
|
-
*
|
|
27
|
+
* All are stable across renders (ref objects and a `useState` setter), which
|
|
24
28
|
* is what lets the wrapped `fetchData` keep its empty `useCallback` dependency
|
|
25
29
|
* array — a changing `fetchData` identity would retrigger the provider's fetch
|
|
26
30
|
* effect on every render.
|
|
@@ -30,6 +34,12 @@ export function buildLoadingStateDeclarations(vars) {
|
|
|
30
34
|
types.variableDeclaration('const', [
|
|
31
35
|
types.variableDeclarator(types.identifier(vars.inFlightRefVar), types.callExpression(types.identifier('useRef'), [types.numericLiteral(0)])),
|
|
32
36
|
]),
|
|
37
|
+
types.variableDeclaration('const', [
|
|
38
|
+
types.variableDeclarator(types.identifier(vars.fetchSeqRefVar), types.callExpression(types.identifier('useRef'), [types.numericLiteral(0)])),
|
|
39
|
+
]),
|
|
40
|
+
types.variableDeclaration('const', [
|
|
41
|
+
types.variableDeclarator(types.identifier(vars.latestDataRefVar), types.callExpression(types.identifier('useRef'), [types.identifier('undefined')])),
|
|
42
|
+
]),
|
|
33
43
|
types.variableDeclaration('const', [
|
|
34
44
|
types.variableDeclarator(types.arrayPattern([
|
|
35
45
|
types.identifier(vars.isFetchingVar),
|
|
@@ -108,8 +118,39 @@ function injectTrackingIntoCachedBody(body, vars) {
|
|
|
108
118
|
}
|
|
109
119
|
var tracked = buildTrackedFetchBody(networkChain.statement.argument, vars);
|
|
110
120
|
(_a = body.body).splice.apply(_a, __spreadArray([networkChain.index, 1], tracked.body, false));
|
|
121
|
+
markCacheHitAsNewest(body, vars);
|
|
111
122
|
return true;
|
|
112
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* A cache hit answers synchronously with the rows of THIS request, so it is
|
|
126
|
+
* the newest settled result too: it advances the sequence and records its rows,
|
|
127
|
+
* or an older network request still in flight would resolve after it and paint
|
|
128
|
+
* over it. Adds the two statements at the head of the hit branch — before its
|
|
129
|
+
* `return Promise.resolve(__tqHit)` — and nothing else, so the flag the branch
|
|
130
|
+
* deliberately never raises stays untouched.
|
|
131
|
+
*/
|
|
132
|
+
function markCacheHitAsNewest(body, vars) {
|
|
133
|
+
var hit = body.body.find(function (statement) {
|
|
134
|
+
return statement.type === 'IfStatement' &&
|
|
135
|
+
statement.test.type === 'BinaryExpression' &&
|
|
136
|
+
statement.test.left.type === 'Identifier' &&
|
|
137
|
+
statement.test.left.name === CACHE_HIT_IDENTIFIER &&
|
|
138
|
+
statement.consequent.type === 'BlockStatement';
|
|
139
|
+
});
|
|
140
|
+
if (!hit || hit.consequent.type !== 'BlockStatement') {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
hit.consequent.body.unshift(types.expressionStatement(types.updateExpression('++', refCurrent(vars.fetchSeqRefVar), true)), types.expressionStatement(types.assignmentExpression('=', refCurrent(vars.latestDataRefVar), types.identifier(CACHE_HIT_IDENTIFIER))));
|
|
144
|
+
}
|
|
145
|
+
/** The identifier the cache wiring binds a hit to — see `cache/ast.ts`. */
|
|
146
|
+
var CACHE_HIT_IDENTIFIER = '__tqHit';
|
|
147
|
+
/** The rows a tracked request resolved with, inside its own `then`. */
|
|
148
|
+
var TRACKED_ROWS_IDENTIFIER = '__tqRows';
|
|
149
|
+
/** This request's sequence number. */
|
|
150
|
+
var TRACKED_SEQ_IDENTIFIER = '__tqSeq';
|
|
151
|
+
function refCurrent(refVar) {
|
|
152
|
+
return types.memberExpression(types.identifier(refVar), types.identifier('current'));
|
|
153
|
+
}
|
|
113
154
|
// tslint:disable-next-line:no-any
|
|
114
155
|
function containsIdentifier(node, name) {
|
|
115
156
|
if (!node || typeof node !== 'object') {
|
|
@@ -173,9 +214,16 @@ function findMemoizedFetchDataArrow(attribute) {
|
|
|
173
214
|
* Turns `(params) => fetch(...).then(...)` into
|
|
174
215
|
*
|
|
175
216
|
* (params) => {
|
|
217
|
+
* const __tqSeq = ++ds_N_fetchSeq.current
|
|
176
218
|
* ds_N_fetchesInFlight.current += 1
|
|
177
219
|
* setDs_N_isFetching(true)
|
|
178
|
-
* return fetch(...).then(...).
|
|
220
|
+
* return fetch(...).then(...).then((__tqRows) => {
|
|
221
|
+
* if (__tqSeq !== ds_N_fetchSeq.current) {
|
|
222
|
+
* return ds_N_latestData.current !== undefined ? ds_N_latestData.current : __tqRows
|
|
223
|
+
* }
|
|
224
|
+
* ds_N_latestData.current = __tqRows
|
|
225
|
+
* return __tqRows
|
|
226
|
+
* }).finally(() => {
|
|
179
227
|
* ds_N_fetchesInFlight.current -= 1
|
|
180
228
|
* if (ds_N_fetchesInFlight.current <= 0) {
|
|
181
229
|
* ds_N_fetchesInFlight.current = 0
|
|
@@ -184,6 +232,12 @@ function findMemoizedFetchDataArrow(attribute) {
|
|
|
184
232
|
* })
|
|
185
233
|
* }
|
|
186
234
|
*
|
|
235
|
+
* The `then` is the stale guard (see `fetchSeqRefVar`): a request overtaken by
|
|
236
|
+
* a newer one resolves with the newest settled rows rather than its own, so
|
|
237
|
+
* the provider — which keeps whatever resolves LAST — never paints older rows
|
|
238
|
+
* over newer ones. An overtaken request whose successor has not settled yet
|
|
239
|
+
* resolves with its own rows; the successor then replaces them.
|
|
240
|
+
*
|
|
187
241
|
* `finally` (rather than a `then` pair) keeps the flag honest when the request
|
|
188
242
|
* rejects: the provider switches to its error status and the loading state must
|
|
189
243
|
* not stay on screen. The counter is clamped at 0 so a late settle from a
|
|
@@ -205,10 +259,22 @@ function buildTrackedFetchBody(fetchExpression, vars) {
|
|
|
205
259
|
])),
|
|
206
260
|
])),
|
|
207
261
|
]));
|
|
262
|
+
var latestData = refCurrent(vars.latestDataRefVar);
|
|
263
|
+
var staleGuard = types.arrowFunctionExpression([types.identifier(TRACKED_ROWS_IDENTIFIER)], types.blockStatement([
|
|
264
|
+
types.ifStatement(types.binaryExpression('!==', types.identifier(TRACKED_SEQ_IDENTIFIER), refCurrent(vars.fetchSeqRefVar)), types.blockStatement([
|
|
265
|
+
types.returnStatement(types.conditionalExpression(types.binaryExpression('!==', types.cloneNode(latestData, true), types.identifier('undefined')), types.cloneNode(latestData, true), types.identifier(TRACKED_ROWS_IDENTIFIER))),
|
|
266
|
+
])),
|
|
267
|
+
types.expressionStatement(types.assignmentExpression('=', types.cloneNode(latestData, true), types.identifier(TRACKED_ROWS_IDENTIFIER))),
|
|
268
|
+
types.returnStatement(types.identifier(TRACKED_ROWS_IDENTIFIER)),
|
|
269
|
+
]));
|
|
270
|
+
var guardedFetch = types.callExpression(types.memberExpression(fetchExpression, types.identifier('then')), [staleGuard]);
|
|
208
271
|
return types.blockStatement([
|
|
272
|
+
types.variableDeclaration('const', [
|
|
273
|
+
types.variableDeclarator(types.identifier(TRACKED_SEQ_IDENTIFIER), types.updateExpression('++', refCurrent(vars.fetchSeqRefVar), true)),
|
|
274
|
+
]),
|
|
209
275
|
types.expressionStatement(types.assignmentExpression('+=', types.cloneNode(inFlightCount, true), types.numericLiteral(1))),
|
|
210
276
|
types.expressionStatement(types.callExpression(types.identifier(vars.setIsFetchingVar), [types.booleanLiteral(true)])),
|
|
211
|
-
types.returnStatement(types.callExpression(types.memberExpression(
|
|
277
|
+
types.returnStatement(types.callExpression(types.memberExpression(guardedFetch, types.identifier('finally')), [
|
|
212
278
|
settleHandler,
|
|
213
279
|
])),
|
|
214
280
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading-state.js","sourceRoot":"","sources":["../../src/loading-state.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"loading-state.js","sourceRoot":"","sources":["../../src/loading-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filtering and sorting a translatable column in the visitor's language.
|
|
3
|
+
*
|
|
4
|
+
* A translatable column of a platform table exists once per language:
|
|
5
|
+
* `slug` holds the main language and `es_slug` the Spanish copy (see
|
|
6
|
+
* `ContentLocalization`). The row transform resolves what a page DISPLAYS —
|
|
7
|
+
* a Spanish listing shows `es_name` and links to `es_slug` — but the SQL a
|
|
8
|
+
* fetch runs still names the base column, so without this file:
|
|
9
|
+
*
|
|
10
|
+
* - the details page a Spanish card links to (`/es/products/<es_slug>`)
|
|
11
|
+
* looks the row up with `slug = $1` and answers 404;
|
|
12
|
+
* - "sort by name" on the Spanish listing orders the Spanish names by
|
|
13
|
+
* their ENGLISH counterparts.
|
|
14
|
+
*
|
|
15
|
+
* The teleport fetcher (`fetchers/teleport.ts`) therefore embeds the helper
|
|
16
|
+
* emitted here:
|
|
17
|
+
*
|
|
18
|
+
* - equality on a translatable column matches the value in ANY language:
|
|
19
|
+
* `("slug" = $1 OR "es_slug" = $1)`. Deliberately every language, not the
|
|
20
|
+
* request's: the language switcher keeps the URL and changes the locale,
|
|
21
|
+
* so `/products/<es_slug>` (English page, Spanish slug) has to resolve as
|
|
22
|
+
* well as `/es/products/<slug>`. Only `=` (and the `in` it is normalised
|
|
23
|
+
* to) — a translatable column is never compared with `<`, and `!=` on one
|
|
24
|
+
* has no sensible cross-language reading;
|
|
25
|
+
* - ordering by a translatable column orders by the REQUEST's language,
|
|
26
|
+
* falling back to the base column exactly like the transform does:
|
|
27
|
+
* `COALESCE(NULLIF("es_name", ''), "name")`.
|
|
28
|
+
*
|
|
29
|
+
* Which columns take part is decided at GENERATION time from the table's
|
|
30
|
+
* schema and the project's languages — never by prefix-sniffing column names,
|
|
31
|
+
* which would mistake `og_title` for a translation. A copy the schema does not
|
|
32
|
+
* list (a language added before a column became translatable) is simply not
|
|
33
|
+
* referenced, so the SQL can only ever name columns that exist.
|
|
34
|
+
*/
|
|
35
|
+
import type { ContentLocalization } from './content-localization';
|
|
36
|
+
/**
|
|
37
|
+
* Base column → `{ locale: copy column }`, for every translatable column of a
|
|
38
|
+
* table that has at least one per-language copy in the schema.
|
|
39
|
+
*/
|
|
40
|
+
export type LocalizedColumnMap = Record<string, Record<string, string>>;
|
|
41
|
+
/**
|
|
42
|
+
* Pairs every column with the per-language copies the schema actually holds.
|
|
43
|
+
* Empty (no families) when the project has one language or the table has no
|
|
44
|
+
* translated column — the emitted helper is then inert.
|
|
45
|
+
*/
|
|
46
|
+
export declare const collectLocalizedColumns: (columnNames: string[], localization: ContentLocalization | undefined) => LocalizedColumnMap;
|
|
47
|
+
/**
|
|
48
|
+
* The `localizedEqualityClause` / `localizedSortFieldSql` helpers a fetcher
|
|
49
|
+
* embeds, with the column map baked in.
|
|
50
|
+
*
|
|
51
|
+
* Emitted as plain source with no backtick and no `${`, because the fetcher
|
|
52
|
+
* interpolates it into a template literal. Every identifier it quotes comes
|
|
53
|
+
* from the baked map, so a request can only ever name a column the schema had.
|
|
54
|
+
*/
|
|
55
|
+
export declare const generateLocalizedColumnsHelper: (families: LocalizedColumnMap) => string;
|
|
56
|
+
//# sourceMappingURL=localized-columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localized-columns.d.ts","sourceRoot":"","sources":["../../src/localized-columns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAEjE;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAQvE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,gBACrB,MAAM,EAAE,gBACP,mBAAmB,GAAG,SAAS,KAC5C,kBAmBF,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,aAAc,kBAAkB,KAAG,MA2D7E,CAAA"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filtering and sorting a translatable column in the visitor's language.
|
|
3
|
+
*
|
|
4
|
+
* A translatable column of a platform table exists once per language:
|
|
5
|
+
* `slug` holds the main language and `es_slug` the Spanish copy (see
|
|
6
|
+
* `ContentLocalization`). The row transform resolves what a page DISPLAYS —
|
|
7
|
+
* a Spanish listing shows `es_name` and links to `es_slug` — but the SQL a
|
|
8
|
+
* fetch runs still names the base column, so without this file:
|
|
9
|
+
*
|
|
10
|
+
* - the details page a Spanish card links to (`/es/products/<es_slug>`)
|
|
11
|
+
* looks the row up with `slug = $1` and answers 404;
|
|
12
|
+
* - "sort by name" on the Spanish listing orders the Spanish names by
|
|
13
|
+
* their ENGLISH counterparts.
|
|
14
|
+
*
|
|
15
|
+
* The teleport fetcher (`fetchers/teleport.ts`) therefore embeds the helper
|
|
16
|
+
* emitted here:
|
|
17
|
+
*
|
|
18
|
+
* - equality on a translatable column matches the value in ANY language:
|
|
19
|
+
* `("slug" = $1 OR "es_slug" = $1)`. Deliberately every language, not the
|
|
20
|
+
* request's: the language switcher keeps the URL and changes the locale,
|
|
21
|
+
* so `/products/<es_slug>` (English page, Spanish slug) has to resolve as
|
|
22
|
+
* well as `/es/products/<slug>`. Only `=` (and the `in` it is normalised
|
|
23
|
+
* to) — a translatable column is never compared with `<`, and `!=` on one
|
|
24
|
+
* has no sensible cross-language reading;
|
|
25
|
+
* - ordering by a translatable column orders by the REQUEST's language,
|
|
26
|
+
* falling back to the base column exactly like the transform does:
|
|
27
|
+
* `COALESCE(NULLIF("es_name", ''), "name")`.
|
|
28
|
+
*
|
|
29
|
+
* Which columns take part is decided at GENERATION time from the table's
|
|
30
|
+
* schema and the project's languages — never by prefix-sniffing column names,
|
|
31
|
+
* which would mistake `og_title` for a translation. A copy the schema does not
|
|
32
|
+
* list (a language added before a column became translatable) is simply not
|
|
33
|
+
* referenced, so the SQL can only ever name columns that exist.
|
|
34
|
+
*/
|
|
35
|
+
/** The only identifiers the generated SQL is allowed to quote — same rule as the search columns. */
|
|
36
|
+
var SQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
37
|
+
/** The column holding `column` in `locale` — the editor's `getI18nColumnName`. */
|
|
38
|
+
var localizedColumnName = function (locale, column) { return "".concat(locale, "_").concat(column); };
|
|
39
|
+
/**
|
|
40
|
+
* Pairs every column with the per-language copies the schema actually holds.
|
|
41
|
+
* Empty (no families) when the project has one language or the table has no
|
|
42
|
+
* translated column — the emitted helper is then inert.
|
|
43
|
+
*/
|
|
44
|
+
export var collectLocalizedColumns = function (columnNames, localization) {
|
|
45
|
+
var families = {};
|
|
46
|
+
if (!localization || localization.secondaryLocales.length === 0) {
|
|
47
|
+
return families;
|
|
48
|
+
}
|
|
49
|
+
var present = new Set(columnNames.filter(function (name) { return SQL_IDENTIFIER_PATTERN.test(name); }));
|
|
50
|
+
present.forEach(function (column) {
|
|
51
|
+
localization.secondaryLocales.forEach(function (locale) {
|
|
52
|
+
var copy = localizedColumnName(locale, column);
|
|
53
|
+
if (!present.has(copy)) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (!families[column]) {
|
|
57
|
+
families[column] = {};
|
|
58
|
+
}
|
|
59
|
+
families[column][locale] = copy;
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
return families;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* The `localizedEqualityClause` / `localizedSortFieldSql` helpers a fetcher
|
|
66
|
+
* embeds, with the column map baked in.
|
|
67
|
+
*
|
|
68
|
+
* Emitted as plain source with no backtick and no `${`, because the fetcher
|
|
69
|
+
* interpolates it into a template literal. Every identifier it quotes comes
|
|
70
|
+
* from the baked map, so a request can only ever name a column the schema had.
|
|
71
|
+
*/
|
|
72
|
+
export var generateLocalizedColumnsHelper = function (families) {
|
|
73
|
+
var lines = [
|
|
74
|
+
'// Per-language copies of the translatable columns, base column -> locale -> copy.',
|
|
75
|
+
'// Baked from the table schema and the project languages at generation time.',
|
|
76
|
+
"var LOCALIZED_COLUMNS = ".concat(JSON.stringify(families)),
|
|
77
|
+
'',
|
|
78
|
+
'function quoteLocalizedColumn(column) {',
|
|
79
|
+
" return '\"' + column + '\"'",
|
|
80
|
+
'}',
|
|
81
|
+
'',
|
|
82
|
+
'// Equality on a translatable column matches the value in ANY language, so a',
|
|
83
|
+
'// localized slug resolves whichever locale the URL is under. Answers null',
|
|
84
|
+
'// for every other column and operand, leaving them to the ordinary branches.',
|
|
85
|
+
'function localizedEqualityClause(field, operand, value, pushParam) {',
|
|
86
|
+
' var copies = LOCALIZED_COLUMNS[field]',
|
|
87
|
+
" if (!copies || operand !== '=' || value === null || value === undefined) return null",
|
|
88
|
+
' // An empty set means "no filter", as it does in the ordinary array branch.',
|
|
89
|
+
' if (Array.isArray(value) && value.length === 0) return null',
|
|
90
|
+
' var columns = [field]',
|
|
91
|
+
' for (var locale in copies) {',
|
|
92
|
+
' if (Object.prototype.hasOwnProperty.call(copies, locale)) columns.push(copies[locale])',
|
|
93
|
+
' }',
|
|
94
|
+
' var param = Array.isArray(value) ? pushParam(value.map(String)) : pushParam(value)',
|
|
95
|
+
' var clauses = []',
|
|
96
|
+
' for (var i = 0; i < columns.length; i++) {',
|
|
97
|
+
' clauses.push(',
|
|
98
|
+
' Array.isArray(value)',
|
|
99
|
+
" ? quoteLocalizedColumn(columns[i]) + '::text = ANY(' + param + '::text[])'",
|
|
100
|
+
" : quoteLocalizedColumn(columns[i]) + ' = ' + param",
|
|
101
|
+
' )',
|
|
102
|
+
' }',
|
|
103
|
+
" return '(' + clauses.join(' OR ') + ')'",
|
|
104
|
+
'}',
|
|
105
|
+
'',
|
|
106
|
+
'// A translatable list (tags) and its per-language copies, for a filter that',
|
|
107
|
+
'// matches a value in ANY language (a localized tag link resolves under every',
|
|
108
|
+
'// locale, like a localized slug). Null for a column with no copies.',
|
|
109
|
+
'function localizedColumnList(field) {',
|
|
110
|
+
' var copies = LOCALIZED_COLUMNS[field]',
|
|
111
|
+
' if (!copies) return null',
|
|
112
|
+
' var columns = [quoteLocalizedColumn(field)]',
|
|
113
|
+
' for (var locale in copies) {',
|
|
114
|
+
' if (Object.prototype.hasOwnProperty.call(copies, locale)) columns.push(quoteLocalizedColumn(copies[locale]))',
|
|
115
|
+
' }',
|
|
116
|
+
' return columns',
|
|
117
|
+
'}',
|
|
118
|
+
'',
|
|
119
|
+
"// ORDER BY a translatable column in the request's language, falling back to",
|
|
120
|
+
'// the base column for a row with no translation — the same resolution the',
|
|
121
|
+
'// row transform applies to what is displayed. Null when the field or the',
|
|
122
|
+
'// locale has no copy, so the ordinary sort runs.',
|
|
123
|
+
'function localizedSortFieldSql(field, locale) {',
|
|
124
|
+
' var copies = LOCALIZED_COLUMNS[field]',
|
|
125
|
+
" var copy = copies && typeof locale === 'string' ? copies[locale] : null",
|
|
126
|
+
' if (!copy) return null',
|
|
127
|
+
" return 'COALESCE(NULLIF(' + quoteLocalizedColumn(copy) + \", ''), \" + quoteLocalizedColumn(field) + ')'",
|
|
128
|
+
'}',
|
|
129
|
+
];
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=localized-columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localized-columns.js","sourceRoot":"","sources":["../../src/localized-columns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAUH,oGAAoG;AACpG,IAAM,sBAAsB,GAAG,0BAA0B,CAAA;AAEzD,kFAAkF;AAClF,IAAM,mBAAmB,GAAG,UAAC,MAAc,EAAE,MAAc,IAAa,OAAA,UAAG,MAAM,cAAI,MAAM,CAAE,EAArB,CAAqB,CAAA;AAE7F;;;;GAIG;AACH,MAAM,CAAC,IAAM,uBAAuB,GAAG,UACrC,WAAqB,EACrB,YAA6C;IAE7C,IAAM,QAAQ,GAAuB,EAAE,CAAA;IACvC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;QAC/D,OAAO,QAAQ,CAAA;KAChB;IACD,IAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAjC,CAAiC,CAAC,CAAC,CAAA;IACxF,OAAO,CAAC,OAAO,CAAC,UAAC,MAAM;QACrB,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAC,MAAM;YAC3C,IAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACtB,OAAM;aACP;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBACrB,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;aACtB;YACD,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,IAAM,8BAA8B,GAAG,UAAC,QAA4B;IACzE,IAAM,KAAK,GAAG;QACZ,oFAAoF;QACpF,8EAA8E;QAC9E,kCAA2B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAE;QACrD,EAAE;QACF,yCAAyC;QACzC,+BAA+B;QAC/B,GAAG;QACH,EAAE;QACF,8EAA8E;QAC9E,4EAA4E;QAC5E,+EAA+E;QAC/E,sEAAsE;QACtE,yCAAyC;QACzC,wFAAwF;QACxF,+EAA+E;QAC/E,+DAA+D;QAC/D,yBAAyB;QACzB,gCAAgC;QAChC,4FAA4F;QAC5F,KAAK;QACL,sFAAsF;QACtF,oBAAoB;QACpB,8CAA8C;QAC9C,mBAAmB;QACnB,4BAA4B;QAC5B,oFAAoF;QACpF,4DAA4D;QAC5D,OAAO;QACP,KAAK;QACL,2CAA2C;QAC3C,GAAG;QACH,EAAE;QACF,8EAA8E;QAC9E,+EAA+E;QAC/E,sEAAsE;QACtE,uCAAuC;QACvC,yCAAyC;QACzC,4BAA4B;QAC5B,+CAA+C;QAC/C,gCAAgC;QAChC,kHAAkH;QAClH,KAAK;QACL,kBAAkB;QAClB,GAAG;QACH,EAAE;QACF,8EAA8E;QAC9E,4EAA4E;QAC5E,2EAA2E;QAC3E,mDAAmD;QACnD,iDAAiD;QACjD,yCAAyC;QACzC,2EAA2E;QAC3E,0BAA0B;QAC1B,4GAA4G;QAC5G,GAAG;KACJ,CAAA;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-plugin.d.ts","sourceRoot":"","sources":["../../src/pagination-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAGvB,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"pagination-plugin.d.ts","sourceRoot":"","sources":["../../src/pagination-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAGvB,MAAM,4BAA4B,CAAA;AAqkCnC,eAAO,MAAM,qCAAqC,EAAE,sBAAsB,CAAC,EAAE,CAs1B5E,CAAA"}
|