@signalium/query 0.0.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/EntityMap.js +2 -2
  3. package/dist/cjs/EntityMap.js.map +1 -1
  4. package/dist/cjs/NetworkManager.js +105 -0
  5. package/dist/cjs/NetworkManager.js.map +1 -0
  6. package/dist/cjs/QueryClient.js +390 -76
  7. package/dist/cjs/QueryClient.js.map +1 -1
  8. package/dist/cjs/QueryStore.js +295 -3
  9. package/dist/cjs/QueryStore.js.map +1 -1
  10. package/dist/cjs/index.js +16 -1
  11. package/dist/cjs/index.js.map +1 -1
  12. package/dist/cjs/package.json +3 -0
  13. package/dist/cjs/parseEntities.js +3 -0
  14. package/dist/cjs/parseEntities.js.map +1 -1
  15. package/dist/cjs/proxy.js +19 -0
  16. package/dist/cjs/proxy.js.map +1 -1
  17. package/dist/cjs/query.js +40 -2
  18. package/dist/cjs/query.js.map +1 -1
  19. package/dist/cjs/stores/async.js +6 -0
  20. package/dist/cjs/stores/async.js.map +1 -0
  21. package/dist/cjs/stores/sync.js +7 -0
  22. package/dist/cjs/stores/sync.js.map +1 -0
  23. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  24. package/dist/cjs/type-utils.js +3 -0
  25. package/dist/cjs/type-utils.js.map +1 -0
  26. package/dist/cjs/types.js +19 -1
  27. package/dist/cjs/types.js.map +1 -1
  28. package/dist/esm/EntityMap.js +3 -3
  29. package/dist/esm/EntityMap.js.map +1 -1
  30. package/dist/esm/NetworkManager.d.ts +48 -0
  31. package/dist/esm/NetworkManager.d.ts.map +1 -0
  32. package/dist/esm/NetworkManager.js +101 -0
  33. package/dist/esm/NetworkManager.js.map +1 -0
  34. package/dist/esm/QueryClient.d.ts +81 -25
  35. package/dist/esm/QueryClient.d.ts.map +1 -1
  36. package/dist/esm/QueryClient.js +390 -76
  37. package/dist/esm/QueryClient.js.map +1 -1
  38. package/dist/esm/QueryStore.d.ts +64 -2
  39. package/dist/esm/QueryStore.d.ts.map +1 -1
  40. package/dist/esm/QueryStore.js +293 -2
  41. package/dist/esm/QueryStore.js.map +1 -1
  42. package/dist/esm/index.d.ts +5 -3
  43. package/dist/esm/index.d.ts.map +1 -1
  44. package/dist/esm/index.js +3 -1
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/parseEntities.d.ts.map +1 -1
  47. package/dist/esm/parseEntities.js +3 -0
  48. package/dist/esm/parseEntities.js.map +1 -1
  49. package/dist/esm/proxy.d.ts +6 -0
  50. package/dist/esm/proxy.d.ts.map +1 -1
  51. package/dist/esm/proxy.js +18 -0
  52. package/dist/esm/proxy.js.map +1 -1
  53. package/dist/esm/query.d.ts +30 -29
  54. package/dist/esm/query.d.ts.map +1 -1
  55. package/dist/esm/query.js +39 -3
  56. package/dist/esm/query.js.map +1 -1
  57. package/dist/esm/stores/async.d.ts +2 -0
  58. package/dist/esm/stores/async.d.ts.map +1 -0
  59. package/dist/esm/stores/async.js +2 -0
  60. package/dist/esm/stores/async.js.map +1 -0
  61. package/dist/esm/stores/sync.d.ts +2 -0
  62. package/dist/esm/stores/sync.d.ts.map +1 -0
  63. package/dist/esm/stores/sync.js +2 -0
  64. package/dist/esm/stores/sync.js.map +1 -0
  65. package/dist/esm/type-utils.d.ts +12 -0
  66. package/dist/esm/type-utils.d.ts.map +1 -0
  67. package/dist/esm/type-utils.js +2 -0
  68. package/dist/esm/type-utils.js.map +1 -0
  69. package/dist/esm/types.d.ts +62 -5
  70. package/dist/esm/types.d.ts.map +1 -1
  71. package/dist/esm/types.js +18 -0
  72. package/dist/esm/types.js.map +1 -1
  73. package/index.d.ts +1 -0
  74. package/package.json +25 -7
  75. package/stores/async.d.ts +1 -0
  76. package/stores/async.js +15 -0
  77. package/stores/sync.d.ts +1 -0
  78. package/stores/sync.js +15 -0
  79. package/.turbo/turbo-build.log +0 -12
  80. package/ENTITY_STORE_DESIGN.md +0 -386
  81. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  82. package/src/EntityMap.ts +0 -63
  83. package/src/QueryClient.ts +0 -482
  84. package/src/QueryStore.ts +0 -322
  85. package/src/__tests__/caching-persistence.test.ts +0 -983
  86. package/src/__tests__/entity-system.test.ts +0 -556
  87. package/src/__tests__/gc-time.test.ts +0 -327
  88. package/src/__tests__/mock-fetch.test.ts +0 -186
  89. package/src/__tests__/parse-entities.test.ts +0 -425
  90. package/src/__tests__/path-interpolation.test.ts +0 -225
  91. package/src/__tests__/reactivity.test.ts +0 -424
  92. package/src/__tests__/refetch-interval.test.ts +0 -262
  93. package/src/__tests__/rest-query-api.test.ts +0 -568
  94. package/src/__tests__/stale-time.test.ts +0 -357
  95. package/src/__tests__/type-to-string.test.ts +0 -129
  96. package/src/__tests__/utils.ts +0 -258
  97. package/src/__tests__/validation-edge-cases.test.ts +0 -821
  98. package/src/errors.ts +0 -124
  99. package/src/index.ts +0 -7
  100. package/src/parseEntities.ts +0 -213
  101. package/src/pathInterpolator.ts +0 -74
  102. package/src/proxy.ts +0 -257
  103. package/src/query.ts +0 -164
  104. package/src/react/__tests__/basic.test.tsx +0 -926
  105. package/src/react/__tests__/component.test.tsx +0 -984
  106. package/src/react/__tests__/utils.tsx +0 -71
  107. package/src/typeDefs.ts +0 -351
  108. package/src/types.ts +0 -132
  109. package/src/utils.ts +0 -66
  110. package/tsconfig.cjs.json +0 -14
  111. package/tsconfig.esm.json +0 -13
  112. package/tsconfig.json +0 -20
  113. package/vitest.config.ts +0 -65
package/src/query.ts DELETED
@@ -1,164 +0,0 @@
1
- import { getContext, reactive } from 'signalium';
2
- import {
3
- APITypes,
4
- ArrayDef,
5
- DiscriminatedQueryResult,
6
- EntityDef,
7
- Mask,
8
- ObjectDef,
9
- RecordDef,
10
- ObjectFieldTypeDef,
11
- UnionDef,
12
- } from './types.js';
13
- import { QueryCacheOptions, QueryClientContext, QueryContext, QueryDefinition } from './QueryClient.js';
14
- import { entity, t, ValidatorDef } from './typeDefs.js';
15
- import { createPathInterpolator } from './pathInterpolator.js';
16
-
17
- type ExtractPrimitiveTypeFromMask<T extends number> = T extends Mask.UNDEFINED
18
- ? undefined
19
- : T extends Mask.NULL
20
- ? null
21
- : T extends Mask.NUMBER
22
- ? number
23
- : T extends Mask.STRING
24
- ? string
25
- : T extends Mask.BOOLEAN
26
- ? boolean
27
- : T extends Mask.ID
28
- ? string
29
- : never;
30
-
31
- export type ExtractType<T extends ObjectFieldTypeDef | string> = T extends number
32
- ? ExtractPrimitiveTypeFromMask<T>
33
- : T extends string
34
- ? T
35
- : T extends Set<infer TSet>
36
- ? TSet
37
- : T extends ObjectDef<infer S>
38
- ? Prettify<ExtractTypesFromShape<S>>
39
- : T extends EntityDef<infer S>
40
- ? Prettify<ExtractTypesFromShape<S>>
41
- : T extends ArrayDef<infer S>
42
- ? ExtractType<S>[]
43
- : T extends RecordDef<infer S>
44
- ? Record<string, ExtractType<S>>
45
- : T extends UnionDef<infer VS>
46
- ? ExtractType<VS[number]>
47
- : never;
48
-
49
- type ExtractTypesFromShape<S extends Record<string, ObjectFieldTypeDef | string>> = {
50
- [K in keyof S]: ExtractType<S[K]>;
51
- };
52
-
53
- type IsParameter<Part> = Part extends `[${infer ParamName}]` ? ParamName : never;
54
- type FilteredParts<Path> = Path extends `${infer PartA}/${infer PartB}`
55
- ? IsParameter<PartA> | FilteredParts<PartB>
56
- : IsParameter<Path>;
57
- type ParamValue<Key> = Key extends `...${infer Anything}` ? (string | number)[] : string | number;
58
- type RemovePrefixDots<Key> = Key extends `...${infer Name}` ? Name : Key;
59
- type PathParams<Path> = {
60
- [Key in FilteredParts<Path> as RemovePrefixDots<Key>]: ParamValue<Key>;
61
- };
62
-
63
- interface RESTQueryDefinition {
64
- path: string;
65
- method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
66
- searchParams?: Record<string, ObjectFieldTypeDef>;
67
- response: Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef;
68
-
69
- cache?: QueryCacheOptions;
70
- refetchInterval?: number;
71
- }
72
-
73
- type ExtractTypesFromObjectOrTypeDef<S extends Record<string, ObjectFieldTypeDef> | ObjectFieldTypeDef | undefined> =
74
- S extends Record<string, ObjectFieldTypeDef>
75
- ? {
76
- [K in keyof S]: ExtractType<S[K]>;
77
- }
78
- : S extends ObjectFieldTypeDef
79
- ? ExtractType<S>
80
- : // eslint-disable-next-line @typescript-eslint/no-empty-object-type
81
- {};
82
-
83
- type QueryParams<QDef extends RESTQueryDefinition> = PathParams<QDef['path']> &
84
- ExtractTypesFromObjectOrTypeDef<QDef['searchParams']>;
85
-
86
- type QueryParamsOrUndefined<QDef extends RESTQueryDefinition> =
87
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
88
- {} extends QueryParams<QDef> ? undefined : QueryParams<QDef>;
89
-
90
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
91
- type HasRequiredKeys<T> = {} extends T ? false : { [K in keyof T]: undefined } extends T ? false : true;
92
-
93
- type Optionalize<T> = T extends object
94
- ? {
95
- -readonly [K in keyof T as undefined extends T[K] ? never : K]: T[K];
96
- } & {
97
- -readonly [K in keyof T as undefined extends T[K] ? K : never]?: T[K];
98
- }
99
- : T;
100
-
101
- type Prettify<T> = T extends object
102
- ? {
103
- -readonly [K in keyof T]: T[K];
104
- } & {}
105
- : T;
106
-
107
- export function query<const QDef extends RESTQueryDefinition>(
108
- queryDefinitionBuilder: (t: APITypes) => QDef,
109
- ): (
110
- ...args: HasRequiredKeys<QueryParams<QDef>> extends true
111
- ? [params: Prettify<Optionalize<QueryParams<QDef>>>]
112
- : [params?: Prettify<Optionalize<QueryParamsOrUndefined<QDef>>>]
113
- ) => DiscriminatedQueryResult<Readonly<Prettify<ExtractTypesFromObjectOrTypeDef<QDef['response']>>>> {
114
- let queryDefinition:
115
- | QueryDefinition<Record<string, unknown>, ExtractTypesFromObjectOrTypeDef<QDef['response']>>
116
- | undefined;
117
-
118
- return reactive(
119
- (params: Record<string, unknown>): DiscriminatedQueryResult<ExtractTypesFromObjectOrTypeDef<QDef['response']>> => {
120
- const queryClient = getContext(QueryClientContext);
121
-
122
- if (queryClient === undefined) {
123
- throw new Error('QueryClient not found');
124
- }
125
-
126
- if (queryDefinition === undefined) {
127
- const { path, method = 'GET', response, cache, refetchInterval } = queryDefinitionBuilder(t);
128
-
129
- const id = `${method}:${path}`;
130
-
131
- const shape: ObjectFieldTypeDef =
132
- typeof response === 'object' && !(response instanceof ValidatorDef)
133
- ? t.object(response as Record<string, ObjectFieldTypeDef>)
134
- : (response as ObjectFieldTypeDef);
135
-
136
- // Create optimized path interpolator (parses template once)
137
- const interpolatePath = createPathInterpolator(path);
138
-
139
- const fetchFn = async (context: QueryContext, params: Record<string, unknown>) => {
140
- // Interpolate path params and append search params automatically
141
- const url = interpolatePath(params);
142
-
143
- const response = await context.fetch(url, {
144
- method,
145
- });
146
-
147
- return response.json();
148
- };
149
-
150
- queryDefinition = {
151
- id,
152
- shape,
153
- fetchFn,
154
- cache,
155
- };
156
- }
157
-
158
- return queryClient.getQuery(queryDefinition, params);
159
- },
160
- // TODO: Getting a lot of type errors due to infinite recursion here.
161
- // For now, we return as any to coerce to the external type signature,
162
- // and internally we manage the difference.
163
- ) as any;
164
- }