@ethlete/query 6.0.0-next.6 → 6.0.0-next.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.
- package/CHANGELOG.md +939 -0
- package/fesm2022/ethlete-query-devtools-contract.mjs +1 -0
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs +411 -0
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs.map +1 -0
- package/fesm2022/ethlete-query-testing.mjs +548 -169
- package/fesm2022/ethlete-query-testing.mjs.map +1 -1
- package/fesm2022/ethlete-query.mjs +14680 -7172
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/generators/deprecate-legacy-queries/migration.js +85 -0
- package/generators/deprecate-legacy-queries/schema.json +26 -0
- package/generators/generators.json +30 -0
- package/generators/migrate-from-ngrx-toolkit/args-assignability.js +140 -0
- package/generators/migrate-from-ngrx-toolkit/consumers.js +521 -0
- package/generators/migrate-from-ngrx-toolkit/creators.js +301 -0
- package/generators/migrate-from-ngrx-toolkit/facade.js +295 -0
- package/generators/migrate-from-ngrx-toolkit/feature.js +513 -0
- package/generators/migrate-from-ngrx-toolkit/migration.js +140 -0
- package/generators/migrate-from-ngrx-toolkit/report.js +154 -0
- package/generators/migrate-from-ngrx-toolkit/schema.json +42 -0
- package/generators/migrate-from-ngrx-toolkit/store-removal.js +633 -0
- package/generators/migrate-from-ngrx-toolkit/ts-edits.js +128 -0
- package/generators/migrate-query-client-features/migration.js +144 -0
- package/generators/migrate-query-client-features/report.js +136 -0
- package/generators/migrate-query-client-features/schema.json +26 -0
- package/generators/migrate-query-opt-in-features/migration.js +195 -0
- package/generators/migrate-query-opt-in-features/report.js +143 -0
- package/generators/migrate-query-opt-in-features/schema.json +31 -0
- package/generators/migrate-to-query-v3/auth-provider-scaffold.js +160 -0
- package/generators/migrate-to-query-v3/cleanup-migration.js +247 -125
- package/generators/migrate-to-query-v3/http-client-check.js +93 -0
- package/generators/migrate-to-query-v3/legacy-prepare-migration.js +129 -40
- package/generators/migrate-to-query-v3/legacy-query-creator-migration.js +274 -152
- package/generators/migrate-to-query-v3/migration-scope.js +40 -0
- package/generators/migrate-to-query-v3/migration.js +19 -10
- package/generators/migrate-to-query-v3/module-graph.js +165 -0
- package/generators/migrate-to-query-v3/query-client-migration.js +342 -160
- package/generators/migrate-to-query-v3/rename-symbols.js +233 -0
- package/generators/migrate-to-query-v3/report.js +40 -7
- package/generators/migrate-to-query-v3/schema.json +12 -0
- package/generators/migrate-to-query-v3/shared.js +97 -3
- package/generators/move-devtools-contract-imports/migration.js +155 -0
- package/generators/move-devtools-contract-imports/moved-names.js +153 -0
- package/generators/move-devtools-contract-imports/schema.json +26 -0
- package/generators/prep-for-query-v3/migration.js +465 -65
- package/generators/report-legacy-query-apis/migration.js +256 -0
- package/generators/report-legacy-query-apis/schema.json +25 -0
- package/migrations/query-field-default-types.md +43 -0
- package/migrations/search-query-field-string.md +43 -0
- package/migrations.json +87 -0
- package/package.json +34 -14
- package/types/ethlete-query-devtools-contract.d.ts +2 -0
- package/types/ethlete-query-ngrx-toolkit.d.ts +131 -0
- package/types/ethlete-query-testing.d.ts +295 -160
- package/types/ethlete-query.d.ts +9755 -3682
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { joinPathFragments } from '@nx/devkit';
|
|
2
|
+
import { writeFileSync } from 'fs';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import * as ts from 'typescript';
|
|
5
|
+
import { createMigrationScope } from '../migrate-to-query-v3/migration-scope.js';
|
|
6
|
+
import { QUERY_V3_MIGRATION_REPORT_PATH, QueryV3MigrationReport, } from '../migrate-to-query-v3/report.js';
|
|
7
|
+
import { createSourceFile, getLineNumber, getLineNumberFromPosition } from '../migrate-to-query-v3/shared.js';
|
|
8
|
+
const SOURCE = 'report-legacy-query-apis';
|
|
9
|
+
const SCAN_FILE_ENV = 'ETHLETE_SCAN_FILE';
|
|
10
|
+
const QUERY_PACKAGE = '@ethlete/query';
|
|
11
|
+
const DOCS_URL = 'https://ethlete-sdk-docs.web.app';
|
|
12
|
+
const GROUPS_DOCS = `${DOCS_URL}/query/groups`;
|
|
13
|
+
const COLLECTIONS_GUIDE = `${DOCS_URL}/query/migrating-from-v2#query-collections`;
|
|
14
|
+
const INFINITY_GUIDE = `${DOCS_URL}/query/migrating-from-v2#infinity-queries`;
|
|
15
|
+
const TRIGGER_DOCS = `${DOCS_URL}/components/paged-query-trigger`;
|
|
16
|
+
const ENTITY_GUIDE = `${DOCS_URL}/query/migrating-from-v2#entitystore-becomes-invalidates-and-tags`;
|
|
17
|
+
const CACHING_DOCS = `${DOCS_URL}/query/caching`;
|
|
18
|
+
const TEMPLATES_GUIDE = `${DOCS_URL}/query/migrating-from-v2#templates-read-signals-not-directives`;
|
|
19
|
+
const COLLECTION_FNS = ['createQueryCollection', 'createQueryCollectionSignal', 'createQueryCollectionSubject'];
|
|
20
|
+
const COLLECTION_STATE_FN = 'switchQueryCollectionState';
|
|
21
|
+
const INFINITY_CONFIG_FN = 'createInfinityQueryConfig';
|
|
22
|
+
const ENTITY_STORE_CLASS = 'EntityStore';
|
|
23
|
+
const LEGACY_CREATOR_FN = 'createLegacyQueryCreator';
|
|
24
|
+
const INFINITY_DIRECTIVE = 'InfinityQueryDirective';
|
|
25
|
+
const INFINITY_TRIGGER_DIRECTIVE = 'InfinityQueryTriggerDirective';
|
|
26
|
+
const QUERY_DIRECTIVE = 'QueryDirective';
|
|
27
|
+
const QUERY_DIRECTIVE_PATTERN = /\*etQuery(?![\w-])|\[etQuery\](?=\s*=)/g;
|
|
28
|
+
const INFINITY_DIRECTIVE_PATTERN = /\*etInfinityQuery(?![\w-])/g;
|
|
29
|
+
const INFINITY_TRIGGER_PATTERN = /(?<![\w-])etInfinityQueryTrigger(?![\w-])|<et-infinity-query-trigger(?![\w-])/g;
|
|
30
|
+
const ENTITY_ACTION = `Move every write into the store to \`invalidates\` on the mutation creator (${CACHING_DOCS}#invalidating-from-the-mutation) ` +
|
|
31
|
+
`and \`tags\` on the reads it changes (${CACHING_DOCS}#tags), and add \`withOptimisticUpdate\` where the UI must change ` +
|
|
32
|
+
`before the response (${CACHING_DOCS}#optimistic-updates) - see ${ENTITY_GUIDE}.`;
|
|
33
|
+
const isScannableFile = (filePath) => /\.(ts|mts|cts)$/.test(filePath) && !filePath.endsWith('.d.ts');
|
|
34
|
+
const collectQueryImports = (sourceFile) => {
|
|
35
|
+
const named = new Map();
|
|
36
|
+
const namespaces = new Set();
|
|
37
|
+
for (const statement of sourceFile.statements) {
|
|
38
|
+
if (!ts.isImportDeclaration(statement) ||
|
|
39
|
+
!ts.isStringLiteral(statement.moduleSpecifier) ||
|
|
40
|
+
statement.moduleSpecifier.text !== QUERY_PACKAGE) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const bindings = statement.importClause?.namedBindings;
|
|
44
|
+
if (!bindings)
|
|
45
|
+
continue;
|
|
46
|
+
if (ts.isNamespaceImport(bindings)) {
|
|
47
|
+
namespaces.add(bindings.name.text);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
for (const element of bindings.elements) {
|
|
51
|
+
named.set(element.name.text, (element.propertyName ?? element.name).text);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { named, namespaces };
|
|
55
|
+
};
|
|
56
|
+
const importedNameOf = (expression, imports) => {
|
|
57
|
+
if (ts.isIdentifier(expression))
|
|
58
|
+
return imports.named.get(expression.text);
|
|
59
|
+
if (ts.isPropertyAccessExpression(expression) &&
|
|
60
|
+
ts.isIdentifier(expression.expression) &&
|
|
61
|
+
imports.namespaces.has(expression.expression.text)) {
|
|
62
|
+
return expression.name.text;
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
};
|
|
66
|
+
const hasImported = (imports, exportName) => imports.namespaces.size > 0 || [...imports.named.values()].includes(exportName);
|
|
67
|
+
const declaredNameOf = (node) => {
|
|
68
|
+
const parent = node.parent;
|
|
69
|
+
if ((ts.isVariableDeclaration(parent) || ts.isPropertyDeclaration(parent) || ts.isPropertyAssignment(parent)) &&
|
|
70
|
+
parent.initializer === node &&
|
|
71
|
+
(ts.isIdentifier(parent.name) || ts.isPrivateIdentifier(parent.name))) {
|
|
72
|
+
return parent.name.text;
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
};
|
|
76
|
+
const propertyNamed = (literal, name) => literal.properties.find((property) => (ts.isPropertyAssignment(property) || ts.isShorthandPropertyAssignment(property)) &&
|
|
77
|
+
ts.isIdentifier(property.name) &&
|
|
78
|
+
property.name.text === name);
|
|
79
|
+
const isEntityConfigCall = (call, config, imports) => importedNameOf(call.expression, imports) === LEGACY_CREATOR_FN ||
|
|
80
|
+
(ts.isPropertyAccessExpression(call.expression) && propertyNamed(config, 'route') !== undefined);
|
|
81
|
+
const scanSource = (options) => {
|
|
82
|
+
const { tree, filePath, sourceFile, imports, report } = options;
|
|
83
|
+
const at = (node) => [{ filePath, line: getLineNumber(node, sourceFile) }];
|
|
84
|
+
const keyOf = (kind, node) => `${SOURCE}:${kind}:${filePath}:${node.getStart(sourceFile)}`;
|
|
85
|
+
const visit = (node) => {
|
|
86
|
+
if (ts.isCallExpression(node)) {
|
|
87
|
+
const importedName = importedNameOf(node.expression, imports);
|
|
88
|
+
const name = declaredNameOf(node);
|
|
89
|
+
if (importedName && COLLECTION_FNS.includes(importedName)) {
|
|
90
|
+
report.addFollowUp({
|
|
91
|
+
title: `Replace the query collection ${name ?? importedName}`,
|
|
92
|
+
summary: `${name ? `\`${name}\` is built with` : 'This call is'} \`${importedName}\`, a legacy query collection. v3 has no query collections.`,
|
|
93
|
+
action: `Move an action set where the latest run wins to \`createQueryGroup\` (${GROUPS_DOCS}), a query picked by context to a \`computed\`, and an auth collection to \`createBearerAuthProvider\` - see ${COLLECTIONS_GUIDE}.`,
|
|
94
|
+
locations: at(node),
|
|
95
|
+
source: SOURCE,
|
|
96
|
+
dedupeKey: keyOf('collection', node),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (importedName === COLLECTION_STATE_FN) {
|
|
100
|
+
report.addFollowUp({
|
|
101
|
+
title: `Replace switchQueryCollectionState()`,
|
|
102
|
+
summary: `\`switchQueryCollectionState()\` reads the state of the query collection member that ran last.`,
|
|
103
|
+
action: `Read \`succeeded$\`, \`loading()\` or \`error()\` of the query group that replaces the collection (${GROUPS_DOCS}) - see ${COLLECTIONS_GUIDE}.`,
|
|
104
|
+
locations: at(node),
|
|
105
|
+
source: SOURCE,
|
|
106
|
+
dedupeKey: keyOf('collection-state', node),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (importedName === INFINITY_CONFIG_FN) {
|
|
110
|
+
report.addFollowUp({
|
|
111
|
+
title: `Replace the infinity query ${name ?? importedName}`,
|
|
112
|
+
summary: `${name ? `\`${name}\` is built with` : 'This call is'} \`createInfinityQueryConfig\`, the legacy infinite query.`,
|
|
113
|
+
action: `Move it to \`createPagedQueryStack\` and bind \`[etPagedQueryTrigger]\` to the stack (${TRIGGER_DOCS}) - see ${INFINITY_GUIDE}.`,
|
|
114
|
+
locations: at(node),
|
|
115
|
+
source: SOURCE,
|
|
116
|
+
dedupeKey: keyOf('infinity-config', node),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const [config] = node.arguments;
|
|
120
|
+
if (config && ts.isObjectLiteralExpression(config) && isEntityConfigCall(node, config, imports)) {
|
|
121
|
+
const entity = propertyNamed(config, 'entity');
|
|
122
|
+
if (entity) {
|
|
123
|
+
report.addFollowUp({
|
|
124
|
+
title: `Replace the entity config of ${name ?? 'the query creator'}`,
|
|
125
|
+
summary: `${name ? `\`${name}\` has` : 'This query creator has'} an \`entity\` config that writes its response into a legacy EntityStore. v3 has no entity store.`,
|
|
126
|
+
action: ENTITY_ACTION,
|
|
127
|
+
locations: at(entity),
|
|
128
|
+
source: SOURCE,
|
|
129
|
+
dedupeKey: keyOf('entity-config', entity),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (ts.isNewExpression(node) && importedNameOf(node.expression, imports) === ENTITY_STORE_CLASS) {
|
|
135
|
+
const name = declaredNameOf(node);
|
|
136
|
+
report.addFollowUp({
|
|
137
|
+
title: `Replace the entity store ${name ?? ENTITY_STORE_CLASS}`,
|
|
138
|
+
summary: `${name ? `\`${name}\` is` : 'This is'} a legacy \`EntityStore\`. v3 has no entity store.`,
|
|
139
|
+
action: ENTITY_ACTION,
|
|
140
|
+
locations: at(node),
|
|
141
|
+
source: SOURCE,
|
|
142
|
+
dedupeKey: keyOf('entity-store', node),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
if (ts.isDecorator(node)) {
|
|
146
|
+
scanComponentTemplate({ tree, filePath, sourceFile, decorator: node, imports, report });
|
|
147
|
+
}
|
|
148
|
+
ts.forEachChild(node, visit);
|
|
149
|
+
};
|
|
150
|
+
visit(sourceFile);
|
|
151
|
+
};
|
|
152
|
+
const scanComponentTemplate = (options) => {
|
|
153
|
+
const { tree, filePath, sourceFile, decorator, imports, report } = options;
|
|
154
|
+
const usesDirective = hasImported(imports, INFINITY_DIRECTIVE);
|
|
155
|
+
const usesTrigger = hasImported(imports, INFINITY_TRIGGER_DIRECTIVE);
|
|
156
|
+
const usesQueryDirective = hasImported(imports, QUERY_DIRECTIVE);
|
|
157
|
+
if (!usesDirective && !usesTrigger && !usesQueryDirective)
|
|
158
|
+
return;
|
|
159
|
+
const call = decorator.expression;
|
|
160
|
+
if (!ts.isCallExpression(call) || !ts.isIdentifier(call.expression) || call.expression.text !== 'Component')
|
|
161
|
+
return;
|
|
162
|
+
const [metadata] = call.arguments;
|
|
163
|
+
if (!metadata || !ts.isObjectLiteralExpression(metadata))
|
|
164
|
+
return;
|
|
165
|
+
const template = propertyNamed(metadata, 'template');
|
|
166
|
+
const templateUrl = propertyNamed(metadata, 'templateUrl');
|
|
167
|
+
let scanned;
|
|
168
|
+
if (template &&
|
|
169
|
+
ts.isPropertyAssignment(template) &&
|
|
170
|
+
(ts.isStringLiteral(template.initializer) || ts.isNoSubstitutionTemplateLiteral(template.initializer))) {
|
|
171
|
+
scanned = { text: template.initializer.text, filePath, firstLine: getLineNumber(template.initializer, sourceFile) };
|
|
172
|
+
}
|
|
173
|
+
if (templateUrl &&
|
|
174
|
+
ts.isPropertyAssignment(templateUrl) &&
|
|
175
|
+
(ts.isStringLiteral(templateUrl.initializer) || ts.isNoSubstitutionTemplateLiteral(templateUrl.initializer))) {
|
|
176
|
+
const templatePath = joinPathFragments(dirname(filePath), templateUrl.initializer.text);
|
|
177
|
+
const text = tree.read(templatePath, 'utf-8');
|
|
178
|
+
if (text !== null)
|
|
179
|
+
scanned = { text, filePath: templatePath, firstLine: 1 };
|
|
180
|
+
}
|
|
181
|
+
if (!scanned)
|
|
182
|
+
return;
|
|
183
|
+
const { text, firstLine } = scanned;
|
|
184
|
+
const templatePath = scanned.filePath;
|
|
185
|
+
const matches = (pattern) => Array.from(text.matchAll(pattern), (match) => ({
|
|
186
|
+
line: firstLine + getLineNumberFromPosition(text, match.index) - 1,
|
|
187
|
+
}));
|
|
188
|
+
if (usesDirective) {
|
|
189
|
+
for (const { line } of matches(INFINITY_DIRECTIVE_PATTERN)) {
|
|
190
|
+
report.addFollowUp({
|
|
191
|
+
title: 'Replace *etInfinityQuery',
|
|
192
|
+
summary: 'The template renders a legacy infinite query through `*etInfinityQuery`.',
|
|
193
|
+
action: `Render the items of the paged query stack that replaces the config with \`@for (item of stack.items(); track item.id)\` - see ${INFINITY_GUIDE}.`,
|
|
194
|
+
locations: [{ filePath: templatePath, line }],
|
|
195
|
+
source: SOURCE,
|
|
196
|
+
dedupeKey: `${SOURCE}:infinity-directive:${templatePath}:${line}`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (usesQueryDirective) {
|
|
201
|
+
for (const { line } of matches(QUERY_DIRECTIVE_PATTERN)) {
|
|
202
|
+
report.addFollowUp({
|
|
203
|
+
title: 'Replace *etQuery',
|
|
204
|
+
summary: 'The template renders a query through `*etQuery`, which accepts only legacy queries. Moving its creator off the interop breaks this template.',
|
|
205
|
+
action: `Read the query's \`loading()\`, \`error()\` and \`response()\` signals in \`@if\` / \`@switch\` blocks - see ${TEMPLATES_GUIDE}.`,
|
|
206
|
+
locations: [{ filePath: templatePath, line }],
|
|
207
|
+
source: SOURCE,
|
|
208
|
+
dedupeKey: `${SOURCE}:query-directive:${templatePath}:${line}`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (usesTrigger) {
|
|
213
|
+
for (const { line } of matches(INFINITY_TRIGGER_PATTERN)) {
|
|
214
|
+
report.addFollowUp({
|
|
215
|
+
title: 'Replace etInfinityQueryTrigger with etPagedQueryTrigger',
|
|
216
|
+
summary: '`etInfinityQueryTrigger` loads the next page of a legacy infinite query.',
|
|
217
|
+
action: `Bind \`[etPagedQueryTrigger]\` to the paged query stack and drop the \`@if (canLoadMore && !loading)\` around it; a trigger on a button becomes \`(click)="stack.fetchNextPage()"\` with \`[etQueryButton]\` - see ${TRIGGER_DOCS}.`,
|
|
218
|
+
locations: [{ filePath: templatePath, line }],
|
|
219
|
+
source: SOURCE,
|
|
220
|
+
dedupeKey: `${SOURCE}:infinity-trigger:${templatePath}:${line}`,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
export const reportLegacyQueryApis = (tree, scope) => {
|
|
226
|
+
const report = new QueryV3MigrationReport();
|
|
227
|
+
scope.visit(tree, (filePath) => {
|
|
228
|
+
if (!isScannableFile(filePath))
|
|
229
|
+
return;
|
|
230
|
+
const content = tree.read(filePath, 'utf-8');
|
|
231
|
+
if (!content || (!content.includes(QUERY_PACKAGE) && !content.includes('entity')))
|
|
232
|
+
return;
|
|
233
|
+
const sourceFile = createSourceFile(content, filePath);
|
|
234
|
+
scanSource({ tree, filePath, sourceFile, imports: collectQueryImports(sourceFile), report });
|
|
235
|
+
});
|
|
236
|
+
return report;
|
|
237
|
+
};
|
|
238
|
+
export default async function migrate(tree, schema) {
|
|
239
|
+
console.log('\n🔄 Reporting legacy query collections, infinity queries, *etQuery templates and entity stores...');
|
|
240
|
+
const scope = createMigrationScope(tree, schema);
|
|
241
|
+
console.log(` Scope: ${scope.describe()}`);
|
|
242
|
+
const report = reportLegacyQueryApis(tree, scope);
|
|
243
|
+
const scanFile = process.env[SCAN_FILE_ENV];
|
|
244
|
+
if (scanFile) {
|
|
245
|
+
const files = new Set(report.tasks.flatMap((task) => task.locations.map((location) => location.filePath)));
|
|
246
|
+
writeFileSync(scanFile, JSON.stringify([...files].sort()), 'utf8');
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (report.tasks.length === 0 && !tree.exists(QUERY_V3_MIGRATION_REPORT_PATH)) {
|
|
250
|
+
console.log(' Nothing found.');
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
report.writeToTree(tree, `${SOURCE} in ${scope.describe()}`);
|
|
254
|
+
report.printSummary();
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/schema",
|
|
3
|
+
"$id": "report-legacy-query-apis",
|
|
4
|
+
"title": "Report legacy query collections, infinity queries, *etQuery templates and entity stores",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"projects": {
|
|
8
|
+
"type": "array",
|
|
9
|
+
"items": {
|
|
10
|
+
"type": "string"
|
|
11
|
+
},
|
|
12
|
+
"description": "Nx projects to scan. Defaults to every project in the workspace.",
|
|
13
|
+
"alias": "project"
|
|
14
|
+
},
|
|
15
|
+
"include": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"description": "Path prefixes to scan, relative to the workspace root (e.g. 'libs/queries'). Unioned with `projects`. Defaults to the whole workspace.",
|
|
21
|
+
"alias": "includePath"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"required": []
|
|
25
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# `queryField<T>()` is typed by its default and reads the URL into that type
|
|
2
|
+
|
|
3
|
+
`queryField<T>()` used to be typed `T | null` whatever its default, and guessed the type of a URL
|
|
4
|
+
value: `?id=123` became the number `123` even in a `queryField<string>()`. Now:
|
|
5
|
+
|
|
6
|
+
- A field with a non-null `defaultValue` is typed `T`, and a reset or an unreadable URL value falls
|
|
7
|
+
back to the default.
|
|
8
|
+
- A URL value is read into the type of the default (number, boolean, string, string list). Without a
|
|
9
|
+
default it stays a string.
|
|
10
|
+
- Any other `T` needs a `queryParamToValue`: `queryField<number>()` without a default, a `Date` or an
|
|
11
|
+
object default.
|
|
12
|
+
- `searchQueryField()` and `sortQueryField()` no longer count in `activeFilterCount`, whatever their key.
|
|
13
|
+
|
|
14
|
+
The type check finds every call site that has to change.
|
|
15
|
+
|
|
16
|
+
## Find the call sites
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
grep -rnE '\bqueryField<' apps libs --include='*.ts'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## What to change
|
|
23
|
+
|
|
24
|
+
1. `queryField<number>()` or `queryField<boolean>()` without a default: give it the `defaultValue` it
|
|
25
|
+
effectively had, or add `queryParamToValue: transformToNumber` (`transformToBoolean`, …) and keep
|
|
26
|
+
the `null` start. Both transforms are exported from `@ethlete/query`.
|
|
27
|
+
2. A `Date` or object default without a `queryParamToValue`: add one (`transformToDate` for a date).
|
|
28
|
+
3. A field that must hold `null` beside a non-null default - an explicit "none" - is declared
|
|
29
|
+
`queryField<T | null>({ defaultValue: … })`.
|
|
30
|
+
4. Delete the `?? DEFAULT` on reads of a field that now has a non-null type, and any `!` or cast that
|
|
31
|
+
only existed to strip `null`.
|
|
32
|
+
5. A field bound to a native `<input type="number">` is declared `number | null`: the input writes
|
|
33
|
+
`null` when cleared.
|
|
34
|
+
6. A field that relied on the old guess - a `queryField<string>()` read as a number somewhere - gets
|
|
35
|
+
the type it was really used as.
|
|
36
|
+
7. A UI that counted a search or sort field as a filter: pass `skipInFilterCount: false` to keep it.
|
|
37
|
+
|
|
38
|
+
## When you are done
|
|
39
|
+
|
|
40
|
+
Run the type check, the lint task and the tests of every project you changed, and check in the
|
|
41
|
+
browser that a reload restores each list.
|
|
42
|
+
|
|
43
|
+
The query forms guide is at <https://ethlete-sdk-docs.web.app/query/query-forms>.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# `searchQueryField()` is a `string` that starts at `''`
|
|
2
|
+
|
|
3
|
+
`searchQueryField()` used to be typed `string | null` and start at `null`. It is typed `string` now and
|
|
4
|
+
starts at `''`, so `[formField]` binds it to `<et-input>` under `strictTemplates`. An empty search still
|
|
5
|
+
writes no URL param, so URLs do not change. The type check finds most call sites; a comparison with
|
|
6
|
+
`null` compiles and silently stops matching.
|
|
7
|
+
|
|
8
|
+
## Find the call sites
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
grep -rnE 'searchQueryField\(' apps libs --include='*.ts' -l
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
In each file found, and in each file that reads the form's value, look for the search field's key
|
|
15
|
+
(`search`, `query`, `q`, …) next to `null`:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
grep -rnE '(search|query|q)\b[^;]*(null|\?\?)' apps libs --include='*.ts'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## What to change
|
|
22
|
+
|
|
23
|
+
1. A write of `null` - `setValue({ search: null, … })`, `patchValue({ search: null })`, a seed object,
|
|
24
|
+
a test fixture - writes `''` instead.
|
|
25
|
+
2. A check for an empty search - `search === null`, `search !== null`, `search == null`,
|
|
26
|
+
`search ?? ''` - becomes `search === ''`, `search !== ''`, or just `search`. `?? ''` is dead code
|
|
27
|
+
now; delete it.
|
|
28
|
+
3. A search that goes into a request body or GraphQL variables passes `search || null` where the API
|
|
29
|
+
expects `null` for "no search". Query params need nothing: the client drops an empty string.
|
|
30
|
+
4. A type that restates the value, such as `search: string | null` in an interface built from the
|
|
31
|
+
form, becomes `string`. Prefer deriving it from `ReturnType<typeof qf.value>`.
|
|
32
|
+
5. A test that expects `null` for an empty search expects `''`.
|
|
33
|
+
|
|
34
|
+
## Leave these alone
|
|
35
|
+
|
|
36
|
+
- `queryField<string>()` fields. They still start at `null`.
|
|
37
|
+
- The legacy `SearchQueryField` class. It is unchanged.
|
|
38
|
+
|
|
39
|
+
## When you are done
|
|
40
|
+
|
|
41
|
+
Run the type check, the lint task and the tests of every project you changed.
|
|
42
|
+
|
|
43
|
+
The query forms guide is at <https://ethlete-sdk-docs.web.app/query/query-forms>.
|
package/migrations.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"migrations": [
|
|
3
|
+
{
|
|
4
|
+
"name": "to-query-v3",
|
|
5
|
+
"version": "5.42.0",
|
|
6
|
+
"kind": "auto",
|
|
7
|
+
"level": "optional",
|
|
8
|
+
"description": "Move the legacy query system onto the new one through the interop layer.",
|
|
9
|
+
"generator": "@ethlete/query:migrate-to-query-v3",
|
|
10
|
+
"docs": "/query/migrating-from-v2"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "prep-for-query-v3",
|
|
14
|
+
"version": "6.0.0-beta.8",
|
|
15
|
+
"kind": "auto",
|
|
16
|
+
"level": "required",
|
|
17
|
+
"description": "Prepare the call sites the v3 query system changes, before the move itself.",
|
|
18
|
+
"generator": "@ethlete/query:prep-for-query-v3",
|
|
19
|
+
"docs": "/query/migrating-from-v2"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "query-client-features",
|
|
23
|
+
"version": "6.0.0-next.23",
|
|
24
|
+
"kind": "auto",
|
|
25
|
+
"level": "required",
|
|
26
|
+
"description": "Move the createQueryClient multiTabSync and persistence options onto opt-in features.",
|
|
27
|
+
"generator": "@ethlete/query:migrate-query-client-features",
|
|
28
|
+
"docs": "/query/features"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"name": "query-opt-in-features",
|
|
32
|
+
"version": "6.0.0-next.23",
|
|
33
|
+
"kind": "auto",
|
|
34
|
+
"level": "required",
|
|
35
|
+
"description": "Move query clients onto the opt-in error pipeline, and bearer auth onto the opt-in multi-tab sync feature.",
|
|
36
|
+
"generator": "@ethlete/query:migrate-query-opt-in-features",
|
|
37
|
+
"docs": "/query/features"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "deprecate-legacy-queries",
|
|
41
|
+
"version": "6.0.0-next.24",
|
|
42
|
+
"kind": "auto",
|
|
43
|
+
"level": "recommended",
|
|
44
|
+
"description": "Mark the remaining createLegacyQueryCreator wrappers as deprecated, so their call sites surface as still on v2.",
|
|
45
|
+
"generator": "@ethlete/query:deprecate-legacy-queries",
|
|
46
|
+
"scan": "@ethlete/query:deprecate-legacy-queries",
|
|
47
|
+
"docs": "/query/legacy"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "search-query-field-string",
|
|
51
|
+
"version": "6.0.0-next.52",
|
|
52
|
+
"kind": "assisted",
|
|
53
|
+
"level": "required",
|
|
54
|
+
"description": "searchQueryField() is typed string and starts at '' instead of null; writes and checks of null move to ''.",
|
|
55
|
+
"instructions": "./migrations/search-query-field-string.md",
|
|
56
|
+
"docs": "/query/query-forms"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "query-field-default-types",
|
|
60
|
+
"version": "6.0.0-next.52",
|
|
61
|
+
"kind": "assisted",
|
|
62
|
+
"level": "required",
|
|
63
|
+
"description": "queryField() is typed by its default and reads the URL into that type; fields without a default or with a non-primitive one need a queryParamToValue.",
|
|
64
|
+
"instructions": "./migrations/query-field-default-types.md",
|
|
65
|
+
"docs": "/query/query-forms"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "report-legacy-query-apis",
|
|
69
|
+
"version": "6.0.0-next.55",
|
|
70
|
+
"kind": "auto",
|
|
71
|
+
"level": "optional",
|
|
72
|
+
"description": "List every query collection, infinity query, *etQuery template and entity store that still needs a hand edit in query-v3-migration-tasks.md.",
|
|
73
|
+
"generator": "@ethlete/query:report-legacy-query-apis",
|
|
74
|
+
"scan": "@ethlete/query:report-legacy-query-apis",
|
|
75
|
+
"docs": "/query/migrating-from-v2"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "devtools-contract-entry-point",
|
|
79
|
+
"version": "6.0.0-next.55",
|
|
80
|
+
"kind": "auto",
|
|
81
|
+
"level": "required",
|
|
82
|
+
"description": "Import the devtools contract (the names @ethlete/query-devtools reads) from @ethlete/query/devtools-contract instead of @ethlete/query.",
|
|
83
|
+
"generator": "@ethlete/query:move-devtools-contract-imports",
|
|
84
|
+
"docs": "/query-devtools/#the-devtools-contract"
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|
package/package.json
CHANGED
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ethlete/query",
|
|
3
|
-
"version": "6.0.0-next.
|
|
3
|
+
"version": "6.0.0-next.60",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/ethlete-io/ethdk",
|
|
7
|
+
"directory": "libs/query"
|
|
8
|
+
},
|
|
4
9
|
"license": "MIT",
|
|
5
10
|
"sideEffects": false,
|
|
6
11
|
"peerDependencies": {
|
|
7
|
-
"@
|
|
8
|
-
"@angular/
|
|
9
|
-
"@angular/
|
|
10
|
-
"@angular/
|
|
11
|
-
"@
|
|
12
|
-
"@ethlete/
|
|
13
|
-
"@
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
|
|
12
|
+
"@angular/common": "^22.1.0",
|
|
13
|
+
"@angular/core": "^22.1.0",
|
|
14
|
+
"@angular/forms": "^22.1.0",
|
|
15
|
+
"@angular/router": "^22.1.0",
|
|
16
|
+
"@ethlete/core": "^5.0.0-beta.11",
|
|
17
|
+
"@ethlete/types": "^2.0.0-beta.4",
|
|
18
|
+
"@nx/devkit": "^24.0.0",
|
|
19
|
+
"rxjs": "^7.8.0",
|
|
20
|
+
"typescript": "^6.0.0"
|
|
21
|
+
},
|
|
22
|
+
"peerDependenciesMeta": {
|
|
23
|
+
"@nx/devkit": {
|
|
24
|
+
"optional": true
|
|
25
|
+
},
|
|
26
|
+
"typescript": {
|
|
27
|
+
"optional": true
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"ethlete": {
|
|
31
|
+
"migrations": "./migrations.json"
|
|
20
32
|
},
|
|
21
33
|
"generators": "./generators/generators.json",
|
|
22
34
|
"module": "fesm2022/ethlete-query.mjs",
|
|
@@ -29,6 +41,14 @@
|
|
|
29
41
|
"types": "./types/ethlete-query.d.ts",
|
|
30
42
|
"default": "./fesm2022/ethlete-query.mjs"
|
|
31
43
|
},
|
|
44
|
+
"./devtools-contract": {
|
|
45
|
+
"types": "./types/ethlete-query-devtools-contract.d.ts",
|
|
46
|
+
"default": "./fesm2022/ethlete-query-devtools-contract.mjs"
|
|
47
|
+
},
|
|
48
|
+
"./ngrx-toolkit": {
|
|
49
|
+
"types": "./types/ethlete-query-ngrx-toolkit.d.ts",
|
|
50
|
+
"default": "./fesm2022/ethlete-query-ngrx-toolkit.mjs"
|
|
51
|
+
},
|
|
32
52
|
"./testing": {
|
|
33
53
|
"types": "./types/ethlete-query-testing.d.ts",
|
|
34
54
|
"default": "./fesm2022/ethlete-query-testing.mjs"
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { ɵDescribableFeature as DescribableFeature, ɵEMPTY_QUERY_DEVTOOLS_FAULT as EMPTY_QUERY_DEVTOOLS_FAULT, ɵJsonPath as JsonPath, ɵMAX_QUERY_BATCH_TOMBSTONES as MAX_QUERY_BATCH_TOMBSTONES, ɵMAX_QUERY_BATCH_TOMBSTONE_BUCKETS as MAX_QUERY_BATCH_TOMBSTONE_BUCKETS, ɵMAX_QUERY_DEVTOOLS_TOMBSTONES as MAX_QUERY_DEVTOOLS_TOMBSTONES, ɵOverrideOp as OverrideOp, ɵQUERY_DEVTOOLS_FAULT_STATUSES as QUERY_DEVTOOLS_FAULT_STATUSES, ɵQUERY_DEVTOOLS_TOKEN_TTL_LIMIT as QUERY_DEVTOOLS_TOKEN_TTL_LIMIT, ɵQueryDevtoolsAbout as QueryDevtoolsAbout, ɵQueryDevtoolsAuthAccountView as QueryDevtoolsAuthAccountView, ɵQueryDevtoolsAuthLocalAccount as QueryDevtoolsAuthLocalAccount, ɵQueryDevtoolsAuthProviderHandle as QueryDevtoolsAuthProviderHandle, ɵQueryDevtoolsAuthProviderRegistration as QueryDevtoolsAuthProviderRegistration, ɵQueryDevtoolsAuthQuery as QueryDevtoolsAuthQuery, ɵQueryDevtoolsAuthSeed as QueryDevtoolsAuthSeed, ɵQueryDevtoolsAuthSession as QueryDevtoolsAuthSession, ɵQueryDevtoolsEntry as QueryDevtoolsEntry, ɵQueryDevtoolsEntryKind as QueryDevtoolsEntryKind, ɵQueryDevtoolsEntryMeta as QueryDevtoolsEntryMeta, ɵQueryDevtoolsFault as QueryDevtoolsFault, ɵQueryDevtoolsFaultTarget as QueryDevtoolsFaultTarget, ɵQueryDevtoolsFeature as QueryDevtoolsFeature, ɵQueryDevtoolsFormField as QueryDevtoolsFormField, ɵQueryDevtoolsFormHandle as QueryDevtoolsFormHandle, ɵQueryDevtoolsFormLinksHandle as QueryDevtoolsFormLinksHandle, ɵQueryDevtoolsFormLinksRecorder as QueryDevtoolsFormLinksRecorder, ɵQueryDevtoolsMock as QueryDevtoolsMock, ɵQueryDevtoolsMockTarget as QueryDevtoolsMockTarget, ɵQueryDevtoolsOverrideEntry as QueryDevtoolsOverrideEntry, ɵQueryDevtoolsOverrideTransfer as QueryDevtoolsOverrideTransfer, ɵQueryDevtoolsOverrideTransferParse as QueryDevtoolsOverrideTransferParse, ɵQueryDevtoolsOverridesHandle as QueryDevtoolsOverridesHandle, ɵQueryDevtoolsOverridesRecorder as QueryDevtoolsOverridesRecorder, ɵQueryDevtoolsPayload as QueryDevtoolsPayload, ɵQueryDevtoolsRegistrar as QueryDevtoolsRegistrar, ɵQueryDevtoolsRegistration as QueryDevtoolsRegistration, ɵQueryDevtoolsResolvedFault as QueryDevtoolsResolvedFault, ɵQueryDevtoolsResolvedMock as QueryDevtoolsResolvedMock, ɵQueryDevtoolsRoutePart as QueryDevtoolsRoutePart, ɵQueryDevtoolsRun as QueryDevtoolsRun, ɵQueryDevtoolsRunError as QueryDevtoolsRunError, ɵQueryDevtoolsRunStatus as QueryDevtoolsRunStatus, ɵQueryDevtoolsSchemaComponents as QueryDevtoolsSchemaComponents, ɵQueryDevtoolsSchemaRoute as QueryDevtoolsSchemaRoute, ɵQueryDevtoolsSchemaSeed as QueryDevtoolsSchemaSeed, ɵQueryDevtoolsSchemaState as QueryDevtoolsSchemaState, ɵQueryDevtoolsSeedStyle as QueryDevtoolsSeedStyle, ɵQueryDevtoolsSettings as QueryDevtoolsSettings, ɵQueryDevtoolsStats as QueryDevtoolsStats, ɵQueryDevtoolsStatsHandle as QueryDevtoolsStatsHandle, ɵQueryDevtoolsStatsRecorder as QueryDevtoolsStatsRecorder, ɵQueryDevtoolsStorageScope as QueryDevtoolsStorageScope, ɵRestoredQueryDevtoolsOverrides as RestoredQueryDevtoolsOverrides, ɵaddQueryDevtoolsAuthAccount as addQueryDevtoolsAuthAccount, ɵapplyQueryDevtoolsOverrides as applyQueryDevtoolsOverrides, ɵapplyQueryDevtoolsTokenTtl as applyQueryDevtoolsTokenTtl, ɵarmAllQueryDevtoolsMocks as armAllQueryDevtoolsMocks, ɵarmQueryDevtoolsMock as armQueryDevtoolsMock, ɵarmQueryDevtoolsOverrideTransfer as armQueryDevtoolsOverrideTransfer, ɵcanOverrideQueryDevtoolsTokenTtl as canOverrideQueryDevtoolsTokenTtl, ɵclearQueryDevtoolsArmedMocks as clearQueryDevtoolsArmedMocks, ɵclearQueryDevtoolsAuthCredentials as clearQueryDevtoolsAuthCredentials, ɵclearQueryDevtoolsAuthSessions as clearQueryDevtoolsAuthSessions, ɵclearQueryDevtoolsFaults as clearQueryDevtoolsFaults, ɵclearQueryDevtoolsMockStore as clearQueryDevtoolsMockStore, ɵclearQueryDevtoolsOverrideStore as clearQueryDevtoolsOverrideStore, ɵclearQueryDevtoolsStore as clearQueryDevtoolsStore, ɵclearQueryDevtoolsTombstones as clearQueryDevtoolsTombstones, ɵclearRestoredQueryDevtoolsOverrides as clearRestoredQueryDevtoolsOverrides, ɵcollectLeafPaths as collectLeafPaths, ɵcollectQueryDevtoolsSchemaComponents as collectQueryDevtoolsSchemaComponents, ɵcountUnresolvedQueryDevtoolsOverrides as countUnresolvedQueryDevtoolsOverrides, ɵcreateQueryDevtoolsOverrides as createQueryDevtoolsOverrides, ɵdeleteQueryDevtoolsMock as deleteQueryDevtoolsMock, ɵdetectPaginationShape as detectPaginationShape, ɵforgetQueryDevtoolsAuthSession as forgetQueryDevtoolsAuthSession, ɵforgetQueryDevtoolsAuthSessionsFor as forgetQueryDevtoolsAuthSessionsFor, ɵgenerateQueryDevtoolsNumberPreset as generateQueryDevtoolsNumberPreset, ɵgenerateQueryDevtoolsSampleNumber as generateQueryDevtoolsSampleNumber, ɵgenerateQueryDevtoolsStringPreset as generateQueryDevtoolsStringPreset, ɵhasQueryDevtoolsOverridesAtPath as hasQueryDevtoolsOverridesAtPath, ɵisDateShapedLeaf as isDateShapedLeaf, ɵisQueryDevtoolsEnabled as isQueryDevtoolsEnabled, ɵisQueryDevtoolsFaultArmed as isQueryDevtoolsFaultArmed, ɵisQueryDevtoolsRepositoryLive as isQueryDevtoolsRepositoryLive, ɵloadQueryDevtoolsSchema as loadQueryDevtoolsSchema, ɵloginQueryDevtoolsAuthAccount as loginQueryDevtoolsAuthAccount, ɵlogoutQueryDevtoolsAuthSession as logoutQueryDevtoolsAuthSession, ɵmatchesQueryDevtoolsMockPattern as matchesQueryDevtoolsMockPattern, ɵmatchesQueryDevtoolsMockQuery as matchesQueryDevtoolsMockQuery, ɵmeasureQueryDevtoolsPayload as measureQueryDevtoolsPayload, ɵparseQueryDevtoolsOverrideTransfer as parseQueryDevtoolsOverrideTransfer, ɵqueryDevtoolsAbout as queryDevtoolsAbout, ɵqueryDevtoolsAllowsLocalAuthSessions as queryDevtoolsAllowsLocalAuthSessions, ɵqueryDevtoolsApiEnvIds as queryDevtoolsApiEnvIds, ɵqueryDevtoolsApiEnvIsProduction as queryDevtoolsApiEnvIsProduction, ɵqueryDevtoolsApiEnvScope as queryDevtoolsApiEnvScope, ɵqueryDevtoolsApiEnvValues as queryDevtoolsApiEnvValues, ɵqueryDevtoolsApiEnvs as queryDevtoolsApiEnvs, ɵqueryDevtoolsArmedMocks as queryDevtoolsArmedMocks, ɵqueryDevtoolsArmedMocksRestored as queryDevtoolsArmedMocksRestored, ɵqueryDevtoolsAuthAccountsFor as queryDevtoolsAuthAccountsFor, ɵqueryDevtoolsAuthActive as queryDevtoolsAuthActive, ɵqueryDevtoolsAuthFieldsFor as queryDevtoolsAuthFieldsFor, ɵqueryDevtoolsAuthOtherScopeCount as queryDevtoolsAuthOtherScopeCount, ɵqueryDevtoolsAuthSessions as queryDevtoolsAuthSessions, ɵqueryDevtoolsAuthSessionsFor as queryDevtoolsAuthSessionsFor, ɵqueryDevtoolsAuthTabLocal as queryDevtoolsAuthTabLocal, ɵqueryDevtoolsEntries as queryDevtoolsEntries, ɵqueryDevtoolsFaults as queryDevtoolsFaults, ɵqueryDevtoolsFaultsRestored as queryDevtoolsFaultsRestored, ɵqueryDevtoolsMockId as queryDevtoolsMockId, ɵqueryDevtoolsMocks as queryDevtoolsMocks, ɵqueryDevtoolsOverridePersistence as queryDevtoolsOverridePersistence, ɵqueryDevtoolsRequestPath as queryDevtoolsRequestPath, ɵqueryDevtoolsResponseHistory as queryDevtoolsResponseHistory, ɵqueryDevtoolsRestoredOverridesScope as queryDevtoolsRestoredOverridesScope, ɵqueryDevtoolsSchemaNames as queryDevtoolsSchemaNames, ɵqueryDevtoolsSchemaRoutes as queryDevtoolsSchemaRoutes, ɵqueryDevtoolsSchemaState as queryDevtoolsSchemaState, ɵqueryDevtoolsSettings as queryDevtoolsSettings, ɵqueryDevtoolsStorage as queryDevtoolsStorage, ɵqueryDevtoolsTokenTtls as queryDevtoolsTokenTtls, ɵreadQueryDevtoolsStore as readQueryDevtoolsStore, ɵregisterEthleteVersion as registerEthleteVersion, ɵremoveQueryDevtoolsAuthAccount as removeQueryDevtoolsAuthAccount, ɵrenameQueryDevtoolsAuthSession as renameQueryDevtoolsAuthSession, ɵrestoredQueryDevtoolsOverrides as restoredQueryDevtoolsOverrides, ɵsaveQueryDevtoolsMock as saveQueryDevtoolsMock, ɵseedQueryDevtoolsSchemaBody as seedQueryDevtoolsSchemaBody, ɵseedQueryDevtoolsSchemaRoute as seedQueryDevtoolsSchemaRoute, ɵserializeQueryDevtoolsOverrideTransfer as serializeQueryDevtoolsOverrideTransfer, ɵsetQueryDevtoolsApiEnv as setQueryDevtoolsApiEnv, ɵsetQueryDevtoolsAppInfo as setQueryDevtoolsAppInfo, ɵsetQueryDevtoolsArmedMocksScope as setQueryDevtoolsArmedMocksScope, ɵsetQueryDevtoolsAuthCredentials as setQueryDevtoolsAuthCredentials, ɵsetQueryDevtoolsAuthTabLocal as setQueryDevtoolsAuthTabLocal, ɵsetQueryDevtoolsFault as setQueryDevtoolsFault, ɵsetQueryDevtoolsFaultsScope as setQueryDevtoolsFaultsScope, ɵsetQueryDevtoolsOverridePersistence as setQueryDevtoolsOverridePersistence, ɵsetQueryDevtoolsOverridesScope as setQueryDevtoolsOverridesScope, ɵsetQueryDevtoolsSettings as setQueryDevtoolsSettings, ɵsmartDuplicateArrayItem as smartDuplicateArrayItem, ɵsnapshotQueryDevtoolsHandle as snapshotQueryDevtoolsHandle, ɵstringifyQueryRouteParts as stringifyQueryRouteParts, ɵsumQueryDevtoolsStats as sumQueryDevtoolsStats, ɵswitchQueryDevtoolsAuthSession as switchQueryDevtoolsAuthSession, ɵtombstoneOf as tombstoneOf, ɵwriteQueryDevtoolsStore as writeQueryDevtoolsStore } from "@ethlete/query";
|
|
2
|
+
export { type DescribableFeature, EMPTY_QUERY_DEVTOOLS_FAULT, type JsonPath, MAX_QUERY_BATCH_TOMBSTONES, MAX_QUERY_BATCH_TOMBSTONE_BUCKETS, MAX_QUERY_DEVTOOLS_TOMBSTONES, type OverrideOp, QUERY_DEVTOOLS_FAULT_STATUSES, QUERY_DEVTOOLS_TOKEN_TTL_LIMIT, type QueryDevtoolsAbout, type QueryDevtoolsAuthAccountView, type QueryDevtoolsAuthLocalAccount, type QueryDevtoolsAuthProviderHandle, type QueryDevtoolsAuthProviderRegistration, type QueryDevtoolsAuthQuery, type QueryDevtoolsAuthSeed, type QueryDevtoolsAuthSession, type QueryDevtoolsEntry, type QueryDevtoolsEntryKind, type QueryDevtoolsEntryMeta, type QueryDevtoolsFault, type QueryDevtoolsFaultTarget, type QueryDevtoolsFeature, type QueryDevtoolsFormField, type QueryDevtoolsFormHandle, type QueryDevtoolsFormLinksHandle, type QueryDevtoolsFormLinksRecorder, type QueryDevtoolsMock, type QueryDevtoolsMockTarget, type QueryDevtoolsOverrideEntry, type QueryDevtoolsOverrideTransfer, type QueryDevtoolsOverrideTransferParse, type QueryDevtoolsOverridesHandle, type QueryDevtoolsOverridesRecorder, type QueryDevtoolsPayload, type QueryDevtoolsRegistrar, type QueryDevtoolsRegistration, type QueryDevtoolsResolvedFault, type QueryDevtoolsResolvedMock, type QueryDevtoolsRoutePart, type QueryDevtoolsRun, type QueryDevtoolsRunError, type QueryDevtoolsRunStatus, type QueryDevtoolsSchemaComponents, type QueryDevtoolsSchemaRoute, type QueryDevtoolsSchemaSeed, type QueryDevtoolsSchemaState, type QueryDevtoolsSeedStyle, type QueryDevtoolsSettings, type QueryDevtoolsStats, type QueryDevtoolsStatsHandle, type QueryDevtoolsStatsRecorder, type QueryDevtoolsStorageScope, type RestoredQueryDevtoolsOverrides, addQueryDevtoolsAuthAccount, applyQueryDevtoolsOverrides, applyQueryDevtoolsTokenTtl, armAllQueryDevtoolsMocks, armQueryDevtoolsMock, armQueryDevtoolsOverrideTransfer, canOverrideQueryDevtoolsTokenTtl, clearQueryDevtoolsArmedMocks, clearQueryDevtoolsAuthCredentials, clearQueryDevtoolsAuthSessions, clearQueryDevtoolsFaults, clearQueryDevtoolsMockStore, clearQueryDevtoolsOverrideStore, clearQueryDevtoolsStore, clearQueryDevtoolsTombstones, clearRestoredQueryDevtoolsOverrides, collectLeafPaths, collectQueryDevtoolsSchemaComponents, countUnresolvedQueryDevtoolsOverrides, createQueryDevtoolsOverrides, deleteQueryDevtoolsMock, detectPaginationShape, forgetQueryDevtoolsAuthSession, forgetQueryDevtoolsAuthSessionsFor, generateQueryDevtoolsNumberPreset, generateQueryDevtoolsSampleNumber, generateQueryDevtoolsStringPreset, hasQueryDevtoolsOverridesAtPath, isDateShapedLeaf, isQueryDevtoolsEnabled, isQueryDevtoolsFaultArmed, isQueryDevtoolsRepositoryLive, loadQueryDevtoolsSchema, loginQueryDevtoolsAuthAccount, logoutQueryDevtoolsAuthSession, matchesQueryDevtoolsMockPattern, matchesQueryDevtoolsMockQuery, measureQueryDevtoolsPayload, parseQueryDevtoolsOverrideTransfer, queryDevtoolsAbout, queryDevtoolsAllowsLocalAuthSessions, queryDevtoolsApiEnvIds, queryDevtoolsApiEnvIsProduction, queryDevtoolsApiEnvScope, queryDevtoolsApiEnvValues, queryDevtoolsApiEnvs, queryDevtoolsArmedMocks, queryDevtoolsArmedMocksRestored, queryDevtoolsAuthAccountsFor, queryDevtoolsAuthActive, queryDevtoolsAuthFieldsFor, queryDevtoolsAuthOtherScopeCount, queryDevtoolsAuthSessions, queryDevtoolsAuthSessionsFor, queryDevtoolsAuthTabLocal, queryDevtoolsEntries, queryDevtoolsFaults, queryDevtoolsFaultsRestored, queryDevtoolsMockId, queryDevtoolsMocks, queryDevtoolsOverridePersistence, queryDevtoolsRequestPath, queryDevtoolsResponseHistory, queryDevtoolsRestoredOverridesScope, queryDevtoolsSchemaNames, queryDevtoolsSchemaRoutes, queryDevtoolsSchemaState, queryDevtoolsSettings, queryDevtoolsStorage, queryDevtoolsTokenTtls, readQueryDevtoolsStore, registerEthleteVersion, removeQueryDevtoolsAuthAccount, renameQueryDevtoolsAuthSession, restoredQueryDevtoolsOverrides, saveQueryDevtoolsMock, seedQueryDevtoolsSchemaBody, seedQueryDevtoolsSchemaRoute, serializeQueryDevtoolsOverrideTransfer, setQueryDevtoolsApiEnv, setQueryDevtoolsAppInfo, setQueryDevtoolsArmedMocksScope, setQueryDevtoolsAuthCredentials, setQueryDevtoolsAuthTabLocal, setQueryDevtoolsFault, setQueryDevtoolsFaultsScope, setQueryDevtoolsOverridePersistence, setQueryDevtoolsOverridesScope, setQueryDevtoolsSettings, smartDuplicateArrayItem, snapshotQueryDevtoolsHandle, stringifyQueryRouteParts, sumQueryDevtoolsStats, switchQueryDevtoolsAuthSession, tombstoneOf, writeQueryDevtoolsStore };
|