@teleporthq/teleport-plugin-next-data-source 0.43.57 → 0.43.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/__tests__/_helpers/pagination-widget-fixture.ts +230 -0
  2. package/__tests__/ecommerce-product-allow-backorders.test.ts +156 -0
  3. package/__tests__/ecommerce-product-discounts.test.ts +196 -0
  4. package/__tests__/ecommerce-product-model.test.ts +179 -0
  5. package/__tests__/infinite-scroll.test.ts +143 -0
  6. package/__tests__/numbered-pagination.test.ts +113 -0
  7. package/__tests__/page-reset-on-filter-sort.test.ts +182 -0
  8. package/__tests__/page-url-sync.test.ts +208 -0
  9. package/__tests__/product-price-sort.ts +313 -0
  10. package/__tests__/search-url-sync.test.ts +7 -3
  11. package/dist/cjs/array-mapper-pagination.d.ts +9 -0
  12. package/dist/cjs/array-mapper-pagination.d.ts.map +1 -1
  13. package/dist/cjs/array-mapper-pagination.js.map +1 -1
  14. package/dist/cjs/count-effect.d.ts +42 -0
  15. package/dist/cjs/count-effect.d.ts.map +1 -0
  16. package/dist/cjs/count-effect.js +81 -0
  17. package/dist/cjs/count-effect.js.map +1 -0
  18. package/dist/cjs/fetchers/postgresql.d.ts.map +1 -1
  19. package/dist/cjs/fetchers/postgresql.js +2 -1
  20. package/dist/cjs/fetchers/postgresql.js.map +1 -1
  21. package/dist/cjs/fetchers/teleport.d.ts.map +1 -1
  22. package/dist/cjs/fetchers/teleport.js +3 -2
  23. package/dist/cjs/fetchers/teleport.js.map +1 -1
  24. package/dist/cjs/infinite-scroll.d.ts +65 -0
  25. package/dist/cjs/infinite-scroll.d.ts.map +1 -0
  26. package/dist/cjs/infinite-scroll.js +190 -0
  27. package/dist/cjs/infinite-scroll.js.map +1 -0
  28. package/dist/cjs/numbered-pagination.d.ts +42 -0
  29. package/dist/cjs/numbered-pagination.d.ts.map +1 -0
  30. package/dist/cjs/numbered-pagination.js +167 -0
  31. package/dist/cjs/numbered-pagination.js.map +1 -0
  32. package/dist/cjs/page-reset.d.ts +42 -0
  33. package/dist/cjs/page-reset.d.ts.map +1 -0
  34. package/dist/cjs/page-reset.js +116 -0
  35. package/dist/cjs/page-reset.js.map +1 -0
  36. package/dist/cjs/page-url-sync.d.ts +42 -0
  37. package/dist/cjs/page-url-sync.d.ts.map +1 -0
  38. package/dist/cjs/page-url-sync.js +180 -0
  39. package/dist/cjs/page-url-sync.js.map +1 -0
  40. package/dist/cjs/pagination-controls.d.ts +55 -0
  41. package/dist/cjs/pagination-controls.d.ts.map +1 -0
  42. package/dist/cjs/pagination-controls.js +159 -0
  43. package/dist/cjs/pagination-controls.js.map +1 -0
  44. package/dist/cjs/pagination-plugin.d.ts.map +1 -1
  45. package/dist/cjs/pagination-plugin.js +506 -160
  46. package/dist/cjs/pagination-plugin.js.map +1 -1
  47. package/dist/cjs/product-price-sort.d.ts +116 -0
  48. package/dist/cjs/product-price-sort.d.ts.map +1 -0
  49. package/dist/cjs/product-price-sort.js +169 -0
  50. package/dist/cjs/product-price-sort.js.map +1 -0
  51. package/dist/cjs/transformations/ecommerce-product.d.ts +12 -0
  52. package/dist/cjs/transformations/ecommerce-product.d.ts.map +1 -1
  53. package/dist/cjs/transformations/ecommerce-product.js +2 -1
  54. package/dist/cjs/transformations/ecommerce-product.js.map +1 -1
  55. package/dist/cjs/transformations/index.d.ts +2 -1
  56. package/dist/cjs/transformations/index.d.ts.map +1 -1
  57. package/dist/cjs/transformations/index.js +17 -1
  58. package/dist/cjs/transformations/index.js.map +1 -1
  59. package/dist/cjs/transformations/shared-utils.d.ts.map +1 -1
  60. package/dist/cjs/transformations/shared-utils.js +1 -1
  61. package/dist/cjs/transformations/shared-utils.js.map +1 -1
  62. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  63. package/dist/esm/array-mapper-pagination.d.ts +9 -0
  64. package/dist/esm/array-mapper-pagination.d.ts.map +1 -1
  65. package/dist/esm/array-mapper-pagination.js.map +1 -1
  66. package/dist/esm/count-effect.d.ts +42 -0
  67. package/dist/esm/count-effect.d.ts.map +1 -0
  68. package/dist/esm/count-effect.js +53 -0
  69. package/dist/esm/count-effect.js.map +1 -0
  70. package/dist/esm/fetchers/postgresql.d.ts.map +1 -1
  71. package/dist/esm/fetchers/postgresql.js +2 -1
  72. package/dist/esm/fetchers/postgresql.js.map +1 -1
  73. package/dist/esm/fetchers/teleport.d.ts.map +1 -1
  74. package/dist/esm/fetchers/teleport.js +3 -2
  75. package/dist/esm/fetchers/teleport.js.map +1 -1
  76. package/dist/esm/infinite-scroll.d.ts +65 -0
  77. package/dist/esm/infinite-scroll.d.ts.map +1 -0
  78. package/dist/esm/infinite-scroll.js +159 -0
  79. package/dist/esm/infinite-scroll.js.map +1 -0
  80. package/dist/esm/numbered-pagination.d.ts +42 -0
  81. package/dist/esm/numbered-pagination.d.ts.map +1 -0
  82. package/dist/esm/numbered-pagination.js +138 -0
  83. package/dist/esm/numbered-pagination.js.map +1 -0
  84. package/dist/esm/page-reset.d.ts +42 -0
  85. package/dist/esm/page-reset.d.ts.map +1 -0
  86. package/dist/esm/page-reset.js +87 -0
  87. package/dist/esm/page-reset.js.map +1 -0
  88. package/dist/esm/page-url-sync.d.ts +42 -0
  89. package/dist/esm/page-url-sync.d.ts.map +1 -0
  90. package/dist/esm/page-url-sync.js +152 -0
  91. package/dist/esm/page-url-sync.js.map +1 -0
  92. package/dist/esm/pagination-controls.d.ts +55 -0
  93. package/dist/esm/pagination-controls.d.ts.map +1 -0
  94. package/dist/esm/pagination-controls.js +126 -0
  95. package/dist/esm/pagination-controls.js.map +1 -0
  96. package/dist/esm/pagination-plugin.d.ts.map +1 -1
  97. package/dist/esm/pagination-plugin.js +507 -161
  98. package/dist/esm/pagination-plugin.js.map +1 -1
  99. package/dist/esm/product-price-sort.d.ts +116 -0
  100. package/dist/esm/product-price-sort.d.ts.map +1 -0
  101. package/dist/esm/product-price-sort.js +160 -0
  102. package/dist/esm/product-price-sort.js.map +1 -0
  103. package/dist/esm/transformations/ecommerce-product.d.ts +12 -0
  104. package/dist/esm/transformations/ecommerce-product.d.ts.map +1 -1
  105. package/dist/esm/transformations/ecommerce-product.js +3 -2
  106. package/dist/esm/transformations/ecommerce-product.js.map +1 -1
  107. package/dist/esm/transformations/index.d.ts +2 -1
  108. package/dist/esm/transformations/index.d.ts.map +1 -1
  109. package/dist/esm/transformations/index.js +17 -1
  110. package/dist/esm/transformations/index.js.map +1 -1
  111. package/dist/esm/transformations/shared-utils.d.ts.map +1 -1
  112. package/dist/esm/transformations/shared-utils.js +1 -1
  113. package/dist/esm/transformations/shared-utils.js.map +1 -1
  114. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +5 -5
  116. package/src/array-mapper-pagination.ts +10 -0
  117. package/src/count-effect.ts +137 -0
  118. package/src/fetchers/postgresql.ts +52 -13
  119. package/src/fetchers/teleport.ts +53 -13
  120. package/src/infinite-scroll.ts +401 -0
  121. package/src/numbered-pagination.ts +292 -0
  122. package/src/page-reset.ts +162 -0
  123. package/src/page-url-sync.ts +241 -0
  124. package/src/pagination-controls.ts +176 -0
  125. package/src/pagination-plugin.ts +755 -346
  126. package/src/product-price-sort.ts +204 -0
  127. package/src/transformations/ecommerce-product.ts +141 -10
  128. package/src/transformations/index.ts +19 -1
  129. package/src/transformations/shared-utils.ts +14 -0
  130. package/dist/cjs/array-mapper-registry.d.ts +0 -85
  131. package/dist/cjs/array-mapper-registry.d.ts.map +0 -1
  132. package/dist/cjs/array-mapper-registry.js +0 -296
  133. package/dist/cjs/array-mapper-registry.js.map +0 -1
  134. package/dist/cjs/pagination-with-count.d.ts +0 -6
  135. package/dist/cjs/pagination-with-count.d.ts.map +0 -1
  136. package/dist/cjs/pagination-with-count.js +0 -63
  137. package/dist/cjs/pagination-with-count.js.map +0 -1
  138. package/dist/esm/array-mapper-registry.d.ts +0 -85
  139. package/dist/esm/array-mapper-registry.d.ts.map +0 -1
  140. package/dist/esm/array-mapper-registry.js +0 -292
  141. package/dist/esm/array-mapper-registry.js.map +0 -1
  142. package/dist/esm/pagination-with-count.d.ts +0 -6
  143. package/dist/esm/pagination-with-count.d.ts.map +0 -1
  144. package/dist/esm/pagination-with-count.js +0 -34
  145. package/dist/esm/pagination-with-count.js.map +0 -1
  146. package/src/array-mapper-registry.ts +0 -416
  147. package/src/pagination-with-count.ts +0 -89
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.wireNumberedPagination = exports.buildPageTokensDeclaration = exports.getPageTokensVar = void 0;
27
+ var types = __importStar(require("@babel/types"));
28
+ var pagination_controls_1 = require("./pagination-controls");
29
+ /**
30
+ * Numbered pagination: First / Prev / 1 … 4 5 6 … 12 / Next / Last.
31
+ *
32
+ * The builder authors ONE page-number button and a container to repeat it into;
33
+ * this module turns that template into a `.map` over a windowed token list, so
34
+ * every number the visitor sees is the author's own styled node rather than
35
+ * something the generator invented.
36
+ */
37
+ // tslint:disable:no-any
38
+ /** `ds_N_pageTokens` — the windowed list of page numbers and ellipsis markers. */
39
+ var getPageTokensVar = function (index) { return "ds_".concat(index, "_pageTokens"); };
40
+ exports.getPageTokensVar = getPageTokensVar;
41
+ /**
42
+ * Builds the `useMemo` that decides which page numbers are visible.
43
+ *
44
+ * The window is deliberately small and fixed (first, last, and one neighbour
45
+ * either side of the current page, so at most seven entries): an unbounded
46
+ * strip is unusable at 300 pages and wraps the layout the author styled. The
47
+ * two ellipsis markers are distinct strings because React needs unique keys and
48
+ * a list can legitimately need a gap on both sides.
49
+ *
50
+ * ⛔ Keep this in step with `computePageWindow` in the editor's renderer — the
51
+ * canvas and the published page must agree on which numbers are shown, or the
52
+ * author styles a strip they will never see.
53
+ */
54
+ var buildPageTokensDeclaration = function (index, maxPagesVar, currentPageExpr) {
55
+ var total = types.identifier('total');
56
+ var current = types.identifier('current');
57
+ var tokens = types.identifier('tokens');
58
+ var start = types.identifier('start');
59
+ var end = types.identifier('end');
60
+ var pageVar = types.identifier('p');
61
+ var body = types.blockStatement([
62
+ types.variableDeclaration('const', [
63
+ types.variableDeclarator(total, types.identifier(maxPagesVar)),
64
+ ]),
65
+ types.variableDeclaration('const', [
66
+ types.variableDeclarator(current, types.cloneNode(currentPageExpr, true)),
67
+ ]),
68
+ // Nothing matched at all — the empty branch of the list is what renders.
69
+ types.ifStatement(types.binaryExpression('<=', types.cloneNode(total, true), types.numericLiteral(0)), types.returnStatement(types.arrayExpression([]))),
70
+ types.ifStatement(types.binaryExpression('===', types.cloneNode(total, true), types.numericLiteral(1)), types.returnStatement(types.arrayExpression([types.numericLiteral(1)]))),
71
+ types.variableDeclaration('const', [
72
+ types.variableDeclarator(tokens, types.arrayExpression([types.numericLiteral(1)])),
73
+ ]),
74
+ types.variableDeclaration('const', [
75
+ types.variableDeclarator(start, types.callExpression(types.memberExpression(types.identifier('Math'), types.identifier('max')), [
76
+ types.numericLiteral(2),
77
+ types.binaryExpression('-', types.cloneNode(current, true), types.numericLiteral(1)),
78
+ ])),
79
+ ]),
80
+ types.variableDeclaration('const', [
81
+ types.variableDeclarator(end, types.callExpression(types.memberExpression(types.identifier('Math'), types.identifier('min')), [
82
+ types.binaryExpression('-', types.cloneNode(total, true), types.numericLiteral(1)),
83
+ types.binaryExpression('+', types.cloneNode(current, true), types.numericLiteral(1)),
84
+ ])),
85
+ ]),
86
+ types.ifStatement(types.binaryExpression('>', types.cloneNode(start, true), types.numericLiteral(2)), types.expressionStatement(types.callExpression(types.memberExpression(types.cloneNode(tokens, true), types.identifier('push')), [types.stringLiteral('start-ellipsis')]))),
87
+ types.forStatement(types.variableDeclaration('let', [
88
+ types.variableDeclarator(pageVar, types.cloneNode(start, true)),
89
+ ]), types.binaryExpression('<=', types.cloneNode(pageVar, true), types.cloneNode(end, true)), types.assignmentExpression('+=', types.cloneNode(pageVar, true), types.numericLiteral(1)), types.expressionStatement(types.callExpression(types.memberExpression(types.cloneNode(tokens, true), types.identifier('push')), [types.cloneNode(pageVar, true)]))),
90
+ types.ifStatement(types.binaryExpression('<', types.cloneNode(end, true), types.binaryExpression('-', types.cloneNode(total, true), types.numericLiteral(1))), types.expressionStatement(types.callExpression(types.memberExpression(types.cloneNode(tokens, true), types.identifier('push')), [types.stringLiteral('end-ellipsis')]))),
91
+ types.expressionStatement(types.callExpression(types.memberExpression(types.cloneNode(tokens, true), types.identifier('push')), [types.cloneNode(total, true)])),
92
+ types.returnStatement(types.cloneNode(tokens, true)),
93
+ ]);
94
+ return types.variableDeclaration('const', [
95
+ types.variableDeclarator(types.identifier((0, exports.getPageTokensVar)(index)), types.callExpression(types.identifier('useMemo'), [
96
+ types.arrowFunctionExpression([], body),
97
+ types.arrayExpression([
98
+ types.identifier(maxPagesVar),
99
+ types.cloneNode(currentPageExpr, true),
100
+ ]),
101
+ ])),
102
+ ]);
103
+ };
104
+ exports.buildPageTokensDeclaration = buildPageTokensDeclaration;
105
+ /** `<setter>(<page>)` wrapped so an already-current page does not re-render. */
106
+ var buildJumpHandler = function (vars, targetExpr) { return types.arrowFunctionExpression([], vars.buildSetPageStatement(targetExpr)); };
107
+ /**
108
+ * Wires the First / Last buttons and expands the page-number template.
109
+ *
110
+ * Prev / Next are left to `wirePaginationButtons`, which already emits them and
111
+ * whose output must stay byte-identical for every project that never switches
112
+ * mode.
113
+ */
114
+ var wireNumberedPagination = function (paginationNode, vars) {
115
+ var firstButton = (0, pagination_controls_1.findPaginationControl)(paginationNode, 'first');
116
+ var lastButton = (0, pagination_controls_1.findPaginationControl)(paginationNode, 'last');
117
+ var pagesContainer = (0, pagination_controls_1.findPaginationControl)(paginationNode, 'pages');
118
+ if (firstButton) {
119
+ (0, pagination_controls_1.convertControlToButton)(firstButton);
120
+ (0, pagination_controls_1.setJSXExpressionAttribute)(firstButton, 'onClick', buildJumpHandler(vars, types.numericLiteral(1)));
121
+ (0, pagination_controls_1.setJSXExpressionAttribute)(firstButton, 'disabled', types.binaryExpression('<=', vars.currentPageExpr(), types.numericLiteral(1)));
122
+ }
123
+ if (lastButton) {
124
+ (0, pagination_controls_1.convertControlToButton)(lastButton);
125
+ (0, pagination_controls_1.setJSXExpressionAttribute)(lastButton, 'onClick', buildJumpHandler(vars, types.identifier(vars.maxPagesVar)));
126
+ // `maxPages === 0` is "no results", where jumping to the last page would
127
+ // mean jumping to page 0.
128
+ (0, pagination_controls_1.setJSXExpressionAttribute)(lastButton, 'disabled', types.logicalExpression('||', types.binaryExpression('===', types.identifier(vars.maxPagesVar), types.numericLiteral(0)), types.binaryExpression('>=', vars.currentPageExpr(), types.identifier(vars.maxPagesVar))));
129
+ }
130
+ if (!pagesContainer) {
131
+ return;
132
+ }
133
+ var template = (0, pagination_controls_1.findPaginationControl)(pagesContainer, 'page');
134
+ if (!template) {
135
+ // A container with no template to repeat: leave whatever the author put
136
+ // there alone rather than inventing an unstyled strip.
137
+ return;
138
+ }
139
+ var ellipsisTemplate = (0, pagination_controls_1.findPaginationControl)(pagesContainer, 'ellipsis');
140
+ var tokenId = types.identifier('token');
141
+ // The author's own button, cloned per visible page: their class name (and so
142
+ // every style they applied) rides along.
143
+ var numberButton = types.cloneNode(template, true);
144
+ (0, pagination_controls_1.convertControlToButton)(numberButton);
145
+ (0, pagination_controls_1.setJSXExpressionAttribute)(numberButton, 'onClick', buildJumpHandler(vars, types.cloneNode(tokenId, true)));
146
+ // The current page is marked, not disabled: `[aria-current='page']` is
147
+ // styleable and keeps the button reachable for screen readers.
148
+ (0, pagination_controls_1.setJSXExpressionAttribute)(numberButton, 'aria-current', types.conditionalExpression(types.binaryExpression('===', vars.currentPageExpr(), types.cloneNode(tokenId, true)), types.stringLiteral('page'), types.identifier('undefined')));
149
+ (0, pagination_controls_1.setJSXExpressionAttribute)(numberButton, 'key', types.templateLiteral([
150
+ types.templateElement({ raw: 'page-', cooked: 'page-' }),
151
+ types.templateElement({ raw: '', cooked: '' }, true),
152
+ ], [types.cloneNode(tokenId, true)]));
153
+ // Whatever label the template carried ('1') is replaced by the real number.
154
+ numberButton.children = [types.jsxExpressionContainer(types.cloneNode(tokenId, true))];
155
+ var gapNode = ellipsisTemplate
156
+ ? types.cloneNode(ellipsisTemplate, true)
157
+ : types.jsxElement(types.jsxOpeningElement(types.jsxIdentifier('span'), [], false), types.jsxClosingElement(types.jsxIdentifier('span')), [types.jsxText('…')], false);
158
+ (0, pagination_controls_1.setJSXExpressionAttribute)(gapNode, 'key', types.cloneNode(tokenId, true));
159
+ // {ds_N_pageTokens.map(token => typeof token === 'number' ? <button…> : <span…>)}
160
+ pagesContainer.children = [
161
+ types.jsxExpressionContainer(types.callExpression(types.memberExpression(types.identifier((0, exports.getPageTokensVar)(vars.index)), types.identifier('map')), [
162
+ types.arrowFunctionExpression([types.cloneNode(tokenId, true)], types.conditionalExpression(types.binaryExpression('===', types.unaryExpression('typeof', types.cloneNode(tokenId, true)), types.stringLiteral('number')), numberButton, gapNode)),
163
+ ])),
164
+ ];
165
+ };
166
+ exports.wireNumberedPagination = wireNumberedPagination;
167
+ //# sourceMappingURL=numbered-pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numbered-pagination.js","sourceRoot":"","sources":["../../src/numbered-pagination.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import * as types from '@babel/types';
2
+ /**
3
+ * Resetting a paginated list back to page 1 when its FILTER or SORT changes.
4
+ *
5
+ * Without this a visitor on page 5 who picks a category with twelve results
6
+ * fetches page 5 of twelve rows and is shown an empty grid, with only
7
+ * "Previous" to get out of it. The search input never had this bug: its
8
+ * debounce effect REPLACES the whole `{ page, debouncedQuery }` state, and so
9
+ * has always dropped the page back to 1 as a side effect.
10
+ *
11
+ * ⛔ Why the guard is a signature and not the usual `useRef(true)` skip-first:
12
+ * URL-driven dependencies (`router.query.categoryFilter`) are `undefined` on
13
+ * the first render and only take their real value once the router hydrates.
14
+ * A skip-first guard would treat that hydration as a change and reset the page
15
+ * of a deep link like `?page=3&categoryFilter=Rings` back to 1 — the very
16
+ * sharing case the page-in-URL feature exists to support. Comparing a
17
+ * serialised signature instead means the first OBSERVED value is recorded
18
+ * rather than acted on, whatever render it arrives in, and any later genuine
19
+ * change resets exactly once.
20
+ */
21
+ export interface PageResetDeps {
22
+ /** Bare identifiers: state-bound filter destinations and dynamic-sort deps. */
23
+ stateIds: string[];
24
+ /** Emitted as `props.<id>` — props are never destructured into scope. */
25
+ propIds: string[];
26
+ /** Emitted as `router.query.<key>`. */
27
+ urlSearchParamKeys: string[];
28
+ }
29
+ /** True when there is nothing that could ever change the filtering of this list. */
30
+ export declare const hasNoPageResetDeps: (deps: PageResetDeps) => boolean;
31
+ /**
32
+ * Builds the reset effect.
33
+ *
34
+ * @param refVar name of the `useRef` holding the last seen signature
35
+ * @param buildResetStatement how this usage writes page 1 — the combined
36
+ * `{ page, debouncedQuery }` state and the standalone
37
+ * page state need different setters
38
+ */
39
+ export declare const buildFilterSortPageResetEffect: (refVar: string, deps: PageResetDeps, buildResetStatement: () => types.Statement) => types.ExpressionStatement;
40
+ /** `const <refVar> = useRef(null)` — the signature store for the effect above. */
41
+ export declare const buildPageResetRefDeclaration: (refVar: string) => types.VariableDeclaration;
42
+ //# sourceMappingURL=page-reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-reset.d.ts","sourceRoot":"","sources":["../../src/page-reset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,yEAAyE;IACzE,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,uCAAuC;IACvC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAC7B;AAED,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,SAAU,aAAa,KAAG,OACwC,CAAA;AAuCjG;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,WACjC,MAAM,QACR,aAAa,uBACE,MAAM,MAAM,SAAS,KACzC,MAAM,mBAoER,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,WAAY,MAAM,KAAG,MAAM,mBAMhE,CAAA"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.buildPageResetRefDeclaration = exports.buildFilterSortPageResetEffect = exports.hasNoPageResetDeps = void 0;
27
+ var types = __importStar(require("@babel/types"));
28
+ /** True when there is nothing that could ever change the filtering of this list. */
29
+ var hasNoPageResetDeps = function (deps) {
30
+ return deps.stateIds.length === 0 && deps.propIds.length === 0 && deps.urlSearchParamKeys.length === 0;
31
+ };
32
+ exports.hasNoPageResetDeps = hasNoPageResetDeps;
33
+ var routerQueryAccess = function (key) {
34
+ return types.memberExpression(types.memberExpression(types.identifier('router'), types.identifier('query')), types.identifier(key));
35
+ };
36
+ /**
37
+ * The expressions the effect both depends on and hashes into its signature.
38
+ *
39
+ * Kept in one place so the two can never drift: a value in the signature but
40
+ * not the deps would be read stale, and one in the deps but not the signature
41
+ * would re-run the effect without being able to explain why it changed.
42
+ */
43
+ var buildTrackedExpressions = function (deps) {
44
+ var tracked = [];
45
+ var seen = new Set();
46
+ for (var _i = 0, _a = deps.stateIds; _i < _a.length; _i++) {
47
+ var id = _a[_i];
48
+ if (seen.has(id)) {
49
+ continue;
50
+ }
51
+ seen.add(id);
52
+ tracked.push(types.identifier(id));
53
+ }
54
+ for (var _b = 0, _c = deps.propIds; _b < _c.length; _b++) {
55
+ var id = _c[_b];
56
+ var key = "props.".concat(id);
57
+ if (seen.has(key)) {
58
+ continue;
59
+ }
60
+ seen.add(key);
61
+ tracked.push(types.memberExpression(types.identifier('props'), types.identifier(id)));
62
+ }
63
+ for (var _d = 0, _e = deps.urlSearchParamKeys; _d < _e.length; _d++) {
64
+ var key = _e[_d];
65
+ tracked.push(routerQueryAccess(key));
66
+ }
67
+ return tracked;
68
+ };
69
+ /**
70
+ * Builds the reset effect.
71
+ *
72
+ * @param refVar name of the `useRef` holding the last seen signature
73
+ * @param buildResetStatement how this usage writes page 1 — the combined
74
+ * `{ page, debouncedQuery }` state and the standalone
75
+ * page state need different setters
76
+ */
77
+ var buildFilterSortPageResetEffect = function (refVar, deps, buildResetStatement) {
78
+ var body = [];
79
+ var hasRouterDeps = deps.urlSearchParamKeys.length > 0;
80
+ // Reading `router.query` before the router is ready would hash `undefined`
81
+ // for every URL-driven filter and record a signature that is about to change
82
+ // on its own.
83
+ if (hasRouterDeps) {
84
+ body.push(types.ifStatement(types.unaryExpression('!', types.memberExpression(types.identifier('router'), types.identifier('isReady')), true), types.returnStatement()));
85
+ }
86
+ var refCurrent = types.memberExpression(types.identifier(refVar), types.identifier('current'));
87
+ // `?? null` so a missing URL param serialises as `null` rather than dropping
88
+ // out of the array and shifting every later entry.
89
+ var signatureEntries = buildTrackedExpressions(deps).map(function (expr) {
90
+ return expr.type === 'MemberExpression' && expr.object.type === 'MemberExpression'
91
+ ? types.logicalExpression('??', expr, types.nullLiteral())
92
+ : expr;
93
+ });
94
+ body.push(types.variableDeclaration('const', [
95
+ types.variableDeclarator(types.identifier('__sig'), types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [types.arrayExpression(signatureEntries)])),
96
+ ]), types.ifStatement(types.binaryExpression('===', types.cloneNode(refCurrent, true), types.identifier('__sig')), types.returnStatement()), types.variableDeclaration('const', [
97
+ types.variableDeclarator(types.identifier('__first'), types.binaryExpression('===', types.cloneNode(refCurrent, true), types.nullLiteral())),
98
+ ]), types.expressionStatement(types.assignmentExpression('=', types.cloneNode(refCurrent, true), types.identifier('__sig'))), types.ifStatement(types.identifier('__first'), types.returnStatement()), buildResetStatement());
99
+ var effectDeps = buildTrackedExpressions(deps);
100
+ if (hasRouterDeps) {
101
+ effectDeps.push(types.memberExpression(types.identifier('router'), types.identifier('isReady')));
102
+ }
103
+ return types.expressionStatement(types.callExpression(types.identifier('useEffect'), [
104
+ types.arrowFunctionExpression([], types.blockStatement(body)),
105
+ types.arrayExpression(effectDeps),
106
+ ]));
107
+ };
108
+ exports.buildFilterSortPageResetEffect = buildFilterSortPageResetEffect;
109
+ /** `const <refVar> = useRef(null)` — the signature store for the effect above. */
110
+ var buildPageResetRefDeclaration = function (refVar) {
111
+ return types.variableDeclaration('const', [
112
+ types.variableDeclarator(types.identifier(refVar), types.callExpression(types.identifier('useRef'), [types.nullLiteral()])),
113
+ ]);
114
+ };
115
+ exports.buildPageResetRefDeclaration = buildPageResetRefDeclaration;
116
+ //# sourceMappingURL=page-reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-reset.js","sourceRoot":"","sources":["../../src/page-reset.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAqC;AA+BrC,oFAAoF;AAC7E,IAAM,kBAAkB,GAAG,UAAC,IAAmB;IACpD,OAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC;AAA/F,CAA+F,CAAA;AADpF,QAAA,kBAAkB,sBACkE;AAEjG,IAAM,iBAAiB,GAAG,UAAC,GAAW;IACpC,OAAA,KAAK,CAAC,gBAAgB,CACpB,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAC7E,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CACtB;AAHD,CAGC,CAAA;AAEH;;;;;;GAMG;AACH,IAAM,uBAAuB,GAAG,UAAC,IAAmB;IAClD,IAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,IAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAiB,UAAa,EAAb,KAAA,IAAI,CAAC,QAAQ,EAAb,cAAa,EAAb,IAAa,EAAE;QAA3B,IAAM,EAAE,SAAA;QACX,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAChB,SAAQ;SACT;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;KACnC;IACD,KAAiB,UAAY,EAAZ,KAAA,IAAI,CAAC,OAAO,EAAZ,cAAY,EAAZ,IAAY,EAAE;QAA1B,IAAM,EAAE,SAAA;QACX,IAAM,GAAG,GAAG,gBAAS,EAAE,CAAE,CAAA;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACjB,SAAQ;SACT;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;KACtF;IACD,KAAkB,UAAuB,EAAvB,KAAA,IAAI,CAAC,kBAAkB,EAAvB,cAAuB,EAAvB,IAAuB,EAAE;QAAtC,IAAM,GAAG,SAAA;QACZ,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAA;KACrC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;;;;;GAOG;AACI,IAAM,8BAA8B,GAAG,UAC5C,MAAc,EACd,IAAmB,EACnB,mBAA0C;IAE1C,IAAM,IAAI,GAAsB,EAAE,CAAA;IAClC,IAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAA;IAExD,2EAA2E;IAC3E,6EAA6E;IAC7E,cAAc;IACd,IAAI,aAAa,EAAE;QACjB,IAAI,CAAC,IAAI,CACP,KAAK,CAAC,WAAW,CACf,KAAK,CAAC,eAAe,CACnB,GAAG,EACH,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAC/E,IAAI,CACL,EACD,KAAK,CAAC,eAAe,EAAE,CACxB,CACF,CAAA;KACF;IAED,IAAM,UAAU,GAAG,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;IAEhG,6EAA6E;IAC7E,mDAAmD;IACnD,IAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI;QAC9D,OAAA,IAAI,CAAC,IAAI,KAAK,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB;YACzE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1D,CAAC,CAAC,IAAI;IAFR,CAEQ,CACT,CAAA;IAED,IAAI,CAAC,IAAI,CACP,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE;QACjC,KAAK,CAAC,kBAAkB,CACtB,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EACzB,KAAK,CAAC,cAAc,CAClB,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAC/E,CAAC,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAC1C,CACF;KACF,CAAC,EACF,KAAK,CAAC,WAAW,CACf,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAC3F,KAAK,CAAC,eAAe,EAAE,CACxB,EACD,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE;QACjC,KAAK,CAAC,kBAAkB,CACtB,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAC3B,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CACtF;KACF,CAAC,EACF,KAAK,CAAC,mBAAmB,CACvB,KAAK,CAAC,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAC9F,EACD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,EACvE,mBAAmB,EAAE,CACtB,CAAA;IAED,IAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;IAChD,IAAI,aAAa,EAAE;QACjB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;KACjG;IAED,OAAO,KAAK,CAAC,mBAAmB,CAC9B,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QAClD,KAAK,CAAC,uBAAuB,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7D,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC;KAClC,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAxEY,QAAA,8BAA8B,kCAwE1C;AAED,kFAAkF;AAC3E,IAAM,4BAA4B,GAAG,UAAC,MAAc;IACzD,OAAA,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE;QACjC,KAAK,CAAC,kBAAkB,CACtB,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EACxB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CACxE;KACF,CAAC;AALF,CAKE,CAAA;AANS,QAAA,4BAA4B,gCAMrC"}
@@ -0,0 +1,42 @@
1
+ import * as types from '@babel/types';
2
+ /** `const <refVar> = useRef(null)` — the last `?page=` value this effect saw. */
3
+ export declare const buildPageUrlRefDeclaration: (refVar: string) => types.VariableDeclaration;
4
+ export interface PageUrlSyncOptions {
5
+ paramKey: string;
6
+ /** Ref holding the previously seen URL page. */
7
+ refVar: string;
8
+ /** How this usage reads its current page. */
9
+ currentPageExpr: () => types.Expression;
10
+ /** How this usage writes a page back. */
11
+ buildSetPageStatement: (pageExpr: types.Expression) => types.Expression;
12
+ }
13
+ /**
14
+ * Emitted shape (for `?page=`, a combined `{ page, debouncedQuery }` state):
15
+ *
16
+ * useEffect(() => {
17
+ * if (!router.isReady) return
18
+ * const __urlValue = router.query.page
19
+ * const __raw = typeof __urlValue === 'string' ? __urlValue
20
+ * : Array.isArray(__urlValue) ? __urlValue[0] || '' : ''
21
+ * const __urlPage = Math.max(1, parseInt(__raw, 10) || 1)
22
+ * const __statePage = ds_0_state.page
23
+ * const __seenUrlPage = ds_0_pageUrlRef.current
24
+ * if (__tqQuerySyncRef.current.inFlight === 0 &&
25
+ * __seenUrlPage !== __urlPage && __urlPage !== __statePage) {
26
+ * ds_0_pageUrlRef.current = __urlPage
27
+ * setDs_0_state(state => state.page === __urlPage ? state : { ...state, page: __urlPage })
28
+ * return
29
+ * }
30
+ * ds_0_pageUrlRef.current = __urlPage
31
+ * if (__urlPage === __statePage) return
32
+ * __tqWriteQueryParam('page', __statePage <= 1 ? undefined : __statePage)
33
+ * }, [router.query.page, router.isReady, ds_0_state.page])
34
+ *
35
+ * The write goes through `URLQueryWriter` rather than spreading `router.query`
36
+ * here. This effect and a filter's write-back fire in the SAME flush on every
37
+ * filter change (the reset moves the page), and two effects each merging into
38
+ * their own stale snapshot of `router.query` erase each other's keys — see
39
+ * `url-query-writer.ts` for why that then never settles.
40
+ */
41
+ export declare const buildPageUrlSyncEffect: (options: PageUrlSyncOptions) => types.ExpressionStatement;
42
+ //# sourceMappingURL=page-url-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-url-sync.d.ts","sourceRoot":"","sources":["../../src/page-url-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AA4DrC,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,WAAY,MAAM,KAAG,MAAM,mBAM9D,CAAA;AAEJ,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,eAAe,EAAE,MAAM,KAAK,CAAC,UAAU,CAAA;IACvC,yCAAyC;IACzC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAA;CACxE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,sBAAsB,YAAa,kBAAkB,KAAG,MAAM,mBAqI1E,CAAA"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.buildPageUrlSyncEffect = exports.buildPageUrlRefDeclaration = void 0;
27
+ var types = __importStar(require("@babel/types"));
28
+ var teleport_plugin_common_1 = require("@teleporthq/teleport-plugin-common");
29
+ /**
30
+ * Keeping the current page and the `?page=` query in step.
31
+ *
32
+ * ## Why one effect and not the read-back / write-back PAIR
33
+ *
34
+ * Every other URL-bound control (the category dropdown, the sort select, the
35
+ * search box) uses two independent effects from `URLSearchParamSync`, each
36
+ * bailing when the value it would write is already there. That works because
37
+ * both sides start out agreeing: the state is SEEDED from
38
+ * `window.location.search` in its `useState` initializer, so by the time the
39
+ * effects run there is nothing to reconcile.
40
+ *
41
+ * The page cannot be seeded that way, for a reason that only shows up in a
42
+ * browser: a statically generated page is rendered on the server with page 1,
43
+ * and React does NOT repair mismatched ATTRIBUTES when it hydrates — it keeps
44
+ * the server's DOM and warns. A client that seeded page 3 renders "Previous" as
45
+ * enabled, the server rendered it disabled, and the disabled one is what stays
46
+ * on screen. Worse, it stays for good: React's later re-renders diff against the
47
+ * client's own first render, which already said enabled, so nothing ever
48
+ * repaints it. The rows would be page 3's with no way back to page 2.
49
+ *
50
+ * Adopting the URL in an effect instead makes the page change from 1 to 3 a
51
+ * real state transition, which React renders normally. But a naive PAIR of
52
+ * effects then races: on the render where the router becomes ready, the
53
+ * write-back sees page 1, deletes `?page=3` from the URL, and the read-back it
54
+ * was supposed to cooperate with reads back the page it just erased.
55
+ *
56
+ * So one effect owns both directions and decides which side moved:
57
+ *
58
+ * • the URL moved (a deep link, a `<Link>`, browser back/forward) ⇒ adopt it
59
+ * • the page moved (a click, or the filter reset) ⇒ write it
60
+ *
61
+ * The previously seen URL value is what separates the two, so neither direction
62
+ * has to guess. Page 1 is written as the ABSENCE of the key, so an unpaginated
63
+ * visit keeps a clean URL and a filter reset takes `?page=` back off it.
64
+ *
65
+ * ⚠️ A deep-linked page 2+ therefore costs one extra fetch: the provider mounts
66
+ * on page 1 and refetches when this effect adopts the URL. Correctness over the
67
+ * round trip — the alternative leaves a control the visitor cannot use.
68
+ */
69
+ // Strict JS identifier check, mirroring `URLSearchParamSync`: a key like
70
+ // `foo-bar` has to go through bracket notation or the emitted code is a
71
+ // subtraction.
72
+ var VALID_JS_IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
73
+ var accessKeyOf = function (object, paramKey) {
74
+ return VALID_JS_IDENTIFIER.test(paramKey)
75
+ ? types.memberExpression(object, types.identifier(paramKey))
76
+ : types.memberExpression(object, types.stringLiteral(paramKey), true);
77
+ };
78
+ var routerQueryAccess = function (paramKey) {
79
+ return accessKeyOf(types.memberExpression(types.identifier('router'), types.identifier('query')), paramKey);
80
+ };
81
+ /** `const <refVar> = useRef(null)` — the last `?page=` value this effect saw. */
82
+ var buildPageUrlRefDeclaration = function (refVar) {
83
+ return types.variableDeclaration('const', [
84
+ types.variableDeclarator(types.identifier(refVar), types.callExpression(types.identifier('useRef'), [types.nullLiteral()])),
85
+ ]);
86
+ };
87
+ exports.buildPageUrlRefDeclaration = buildPageUrlRefDeclaration;
88
+ /**
89
+ * Emitted shape (for `?page=`, a combined `{ page, debouncedQuery }` state):
90
+ *
91
+ * useEffect(() => {
92
+ * if (!router.isReady) return
93
+ * const __urlValue = router.query.page
94
+ * const __raw = typeof __urlValue === 'string' ? __urlValue
95
+ * : Array.isArray(__urlValue) ? __urlValue[0] || '' : ''
96
+ * const __urlPage = Math.max(1, parseInt(__raw, 10) || 1)
97
+ * const __statePage = ds_0_state.page
98
+ * const __seenUrlPage = ds_0_pageUrlRef.current
99
+ * if (__tqQuerySyncRef.current.inFlight === 0 &&
100
+ * __seenUrlPage !== __urlPage && __urlPage !== __statePage) {
101
+ * ds_0_pageUrlRef.current = __urlPage
102
+ * setDs_0_state(state => state.page === __urlPage ? state : { ...state, page: __urlPage })
103
+ * return
104
+ * }
105
+ * ds_0_pageUrlRef.current = __urlPage
106
+ * if (__urlPage === __statePage) return
107
+ * __tqWriteQueryParam('page', __statePage <= 1 ? undefined : __statePage)
108
+ * }, [router.query.page, router.isReady, ds_0_state.page])
109
+ *
110
+ * The write goes through `URLQueryWriter` rather than spreading `router.query`
111
+ * here. This effect and a filter's write-back fire in the SAME flush on every
112
+ * filter change (the reset moves the page), and two effects each merging into
113
+ * their own stale snapshot of `router.query` erase each other's keys — see
114
+ * `url-query-writer.ts` for why that then never settles.
115
+ */
116
+ var buildPageUrlSyncEffect = function (options) {
117
+ var refCurrent = function () {
118
+ return types.memberExpression(types.identifier(options.refVar), types.identifier('current'));
119
+ };
120
+ var rememberUrlPage = function () {
121
+ return types.expressionStatement(types.assignmentExpression('=', refCurrent(), types.identifier('__urlPage')));
122
+ };
123
+ var effectBody = types.blockStatement([
124
+ types.ifStatement(types.unaryExpression('!', types.memberExpression(types.identifier('router'), types.identifier('isReady'))), types.returnStatement(null)),
125
+ types.variableDeclaration('const', [
126
+ types.variableDeclarator(types.identifier('__urlValue'), routerQueryAccess(options.paramKey)),
127
+ ]),
128
+ // `router.query[key]` is `string | string[] | undefined` in Next's typings.
129
+ types.variableDeclaration('const', [
130
+ types.variableDeclarator(types.identifier('__raw'), types.conditionalExpression(types.binaryExpression('===', types.unaryExpression('typeof', types.identifier('__urlValue')), types.stringLiteral('string')), types.identifier('__urlValue'), types.conditionalExpression(types.callExpression(types.memberExpression(types.identifier('Array'), types.identifier('isArray')), [types.identifier('__urlValue')]), types.logicalExpression('||', types.memberExpression(types.identifier('__urlValue'), types.numericLiteral(0), true), types.stringLiteral('')), types.stringLiteral('')))),
131
+ ]),
132
+ // A missing, unparseable or out-of-range param all mean page 1 — which is
133
+ // also the value written as no key at all, so the two sides agree.
134
+ types.variableDeclaration('const', [
135
+ types.variableDeclarator(types.identifier('__urlPage'), types.callExpression(types.memberExpression(types.identifier('Math'), types.identifier('max')), [
136
+ types.numericLiteral(1),
137
+ types.logicalExpression('||', types.callExpression(types.identifier('parseInt'), [
138
+ types.identifier('__raw'),
139
+ types.numericLiteral(10),
140
+ ]), types.numericLiteral(1)),
141
+ ])),
142
+ ]),
143
+ types.variableDeclaration('const', [
144
+ types.variableDeclarator(types.identifier('__statePage'), options.currentPageExpr()),
145
+ ]),
146
+ types.variableDeclaration('const', [
147
+ types.variableDeclarator(types.identifier('__seenUrlPage'), refCurrent()),
148
+ ]),
149
+ // The URL is the side that moved: a deep link (nothing seen yet), a
150
+ // same-path navigation, or browser back/forward.
151
+ types.ifStatement(types.logicalExpression('&&',
152
+ // ⛔ Only when nothing this component asked for is still landing.
153
+ // Mid-flight, `router.query` holds a page the visitor is on their way
154
+ // OUT of (the filter reset writes page 1 while `?page=5` is still in the
155
+ // bar), and adopting it would put them straight back on it.
156
+ teleport_plugin_common_1.URLQueryWriter.buildQuerySettledExpr(), types.logicalExpression('&&', types.binaryExpression('!==', types.identifier('__seenUrlPage'), types.identifier('__urlPage')), types.binaryExpression('!==', types.identifier('__urlPage'), types.identifier('__statePage')))), types.blockStatement([
157
+ rememberUrlPage(),
158
+ types.expressionStatement(options.buildSetPageStatement(types.identifier('__urlPage'))),
159
+ types.returnStatement(null),
160
+ ])),
161
+ rememberUrlPage(),
162
+ types.ifStatement(types.binaryExpression('===', types.identifier('__urlPage'), types.identifier('__statePage')), types.returnStatement(null)),
163
+ // The page is the side that moved: a control click, or the filter reset.
164
+ // The write goes through the shared query writer so it merges into the last
165
+ // query this component asked for — the filter's own write-back may still be
166
+ // in flight in this very flush. Page 1 is written as the ABSENCE of the key,
167
+ // which the writer expresses as `undefined`.
168
+ teleport_plugin_common_1.URLQueryWriter.buildQueryWriteCall(options.paramKey, types.conditionalExpression(types.binaryExpression('<=', types.identifier('__statePage'), types.numericLiteral(1)), types.identifier('undefined'), types.identifier('__statePage'))),
169
+ ]);
170
+ return types.expressionStatement(types.callExpression(types.identifier('useEffect'), [
171
+ types.arrowFunctionExpression([], effectBody),
172
+ types.arrayExpression([
173
+ routerQueryAccess(options.paramKey),
174
+ types.memberExpression(types.identifier('router'), types.identifier('isReady')),
175
+ options.currentPageExpr(),
176
+ ]),
177
+ ]));
178
+ };
179
+ exports.buildPageUrlSyncEffect = buildPageUrlSyncEffect;
180
+ //# sourceMappingURL=page-url-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-url-sync.js","sourceRoot":"","sources":["../../src/page-url-sync.ts"],"names":[],"mappings":"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"}