@quilted/create 0.1.67 → 0.1.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/cjs/_virtual/estree.cjs +5 -0
  3. package/build/cjs/cli.cjs +2 -2
  4. package/build/cjs/node_modules/.pnpm/prettier@3.0.0/node_modules/prettier/plugins/estree.cjs +70 -0
  5. package/build/cjs/packages/cli-kit/source/prompt.cjs +2 -2
  6. package/build/cjs/packages/events/source/{abort.cjs → abort/AbortError.cjs} +6 -0
  7. package/build/cjs/shared.cjs +4 -8
  8. package/build/esm/_virtual/estree.mjs +3 -0
  9. package/build/esm/cli.mjs +1 -1
  10. package/build/esm/node_modules/.pnpm/prettier@3.0.0/node_modules/prettier/plugins/estree.mjs +65 -0
  11. package/build/esm/packages/cli-kit/source/prompt.mjs +1 -1
  12. package/build/esm/packages/events/source/{abort.mjs → abort/AbortError.mjs} +6 -0
  13. package/build/esm/shared.mjs +4 -8
  14. package/build/esnext/_virtual/estree.esnext +3 -0
  15. package/build/esnext/node_modules/.pnpm/prettier@3.0.0/node_modules/prettier/plugins/estree.esnext +65 -0
  16. package/build/esnext/packages/cli-kit/source/prompt.esnext +1 -1
  17. package/build/esnext/packages/events/source/{abort.esnext → abort/AbortError.esnext} +6 -0
  18. package/build/esnext/shared.esnext +4 -8
  19. package/build/tsconfig.tsbuildinfo +1 -1
  20. package/build/typescript/shared.d.ts.map +1 -1
  21. package/package.json +1 -1
  22. package/source/shared.ts +10 -7
  23. package/templates/app-basic/features/Start/Start.test.tsx +2 -2
  24. package/templates/{app-trpc/tests → app-basic/tests/render}/render.tsx +3 -34
  25. package/templates/app-basic/tests/render/types.ts +29 -0
  26. package/templates/app-basic/tests/render.ts +6 -0
  27. package/templates/app-graphql/features/Start/Start.test.tsx +3 -3
  28. package/templates/app-graphql/tests/render/render.tsx +59 -0
  29. package/templates/app-graphql/tests/render/types.ts +63 -0
  30. package/templates/app-graphql/tests/render.ts +7 -0
  31. package/templates/app-trpc/App.tsx +32 -2
  32. package/templates/{app-basic/tests → app-trpc/tests/render}/render.tsx +12 -37
  33. package/templates/app-trpc/tests/render/types.ts +35 -0
  34. package/templates/app-trpc/tests/render.ts +6 -0
  35. package/templates/app-graphql/tests/render.tsx +0 -126
@@ -1,15 +1,26 @@
1
- import {QuiltApp, useRoutes, type PropsWithChildren} from '@quilted/quilt';
1
+ import {
2
+ QuiltApp,
3
+ useRoutes,
4
+ type PropsWithChildren,
5
+ useInitialUrl,
6
+ } from '@quilted/quilt';
7
+
8
+ import {httpBatchLink} from '@trpc/client';
9
+ import {QueryClient} from '@tanstack/react-query';
10
+ import {ReactQueryContext} from '@quilted/react-query';
2
11
 
3
12
  import {
4
13
  AppContextReact,
5
14
  type AppContext as AppContextType,
6
15
  } from '~/shared/context.ts';
16
+ import {trpc} from '~/shared/trpc.ts';
7
17
 
8
18
  import {Http} from './foundation/Http.tsx';
9
19
  import {Head} from './foundation/Head.tsx';
10
20
  import {Metrics} from './foundation/Metrics.tsx';
11
21
 
12
22
  import {Start} from './features/Start.tsx';
23
+ import {useMemo} from 'react';
13
24
 
14
25
  export interface Props extends AppContextType {}
15
26
 
@@ -38,9 +49,28 @@ function AppContext({
38
49
  children,
39
50
  ...appContext
40
51
  }: PropsWithChildren<AppContextType>) {
52
+ const initialUrl = useInitialUrl();
53
+
54
+ const {queryClient, trpcClient} = useMemo(() => {
55
+ return {
56
+ queryClient: new QueryClient(),
57
+ trpcClient: trpc.createClient({
58
+ links: [
59
+ // We need to use an absolute URL so that queries will
60
+ // work during server-side rendering
61
+ httpBatchLink({url: new URL('/api', initialUrl).href}),
62
+ ],
63
+ }),
64
+ };
65
+ }, [initialUrl]);
66
+
41
67
  return (
42
68
  <AppContextReact.Provider value={appContext}>
43
- <Metrics>{children}</Metrics>
69
+ <Metrics>
70
+ <trpc.Provider client={trpcClient} queryClient={queryClient}>
71
+ <ReactQueryContext client={queryClient}>{children}</ReactQueryContext>
72
+ </trpc.Provider>
73
+ </Metrics>
44
74
  </AppContextReact.Provider>
45
75
  );
46
76
  }
@@ -1,49 +1,20 @@
1
- import '@quilted/quilt/matchers';
2
-
3
1
  import {
4
2
  createRender,
5
3
  QuiltAppTesting,
6
4
  createTestRouter,
7
5
  } from '@quilted/quilt/testing';
6
+ import {QueryClient, QueryClientProvider} from '@tanstack/react-query';
8
7
 
9
- import {
10
- AppContextReact,
11
- type AppContext as AppContextType,
12
- } from '~/shared/context.ts';
13
-
14
- type Router = ReturnType<typeof createTestRouter>;
15
-
16
- export {createTestRouter};
17
-
18
- export interface RenderOptions {
19
- /**
20
- * A custom router to use for this component test. You can use a
21
- * custom router to simulate a particular URL, and you can spy on
22
- * its navigation method to check that components navigate as
23
- * you expect.
24
- */
25
- router?: Router;
26
-
27
- /**
28
- * A custom locale to use for this component test.
29
- */
30
- locale?: string;
31
- }
32
-
33
- export interface RenderContext extends AppContextType {
34
- /**
35
- * The router used for this component test.
36
- */
37
- router: Router;
38
- }
8
+ import {trpc} from '~/shared/trpc.ts';
9
+ import {AppContextReact} from '~/shared/context.ts';
39
10
 
40
- export interface RenderActions extends Record<string, never> {}
11
+ import {RenderOptions, RenderContext, RenderActions} from './types.ts';
41
12
 
42
13
  /**
43
14
  * Renders a component with test-friendly versions of all global
44
15
  * context available to the application.
45
16
  */
46
- export const renderWithAppContext = createRender<
17
+ export const renderApp = createRender<
47
18
  RenderOptions,
48
19
  RenderContext,
49
20
  RenderActions,
@@ -53,16 +24,20 @@ export const renderWithAppContext = createRender<
53
24
  // authors on the `root.context` property. Context is used to share data between your
54
25
  // React tree and your test code, and is ideal for mocking out global context providers.
55
26
  context({router = createTestRouter()}) {
56
- return {router};
27
+ return {router, trpc: trpc.createClient(), queryClient: new QueryClient()};
57
28
  },
58
29
  // Render all of our app-wide context providers around each component under test.
59
30
  render(element, context, {locale}) {
60
- const {router} = context;
31
+ const {router, trpc: trpcClient, queryClient} = context;
61
32
 
62
33
  return (
63
34
  <QuiltAppTesting routing={router} localization={locale}>
64
35
  <AppContextReact.Provider value={context}>
65
- {element}
36
+ <trpc.Provider client={trpcClient} queryClient={queryClient}>
37
+ <QueryClientProvider client={queryClient}>
38
+ {element}
39
+ </QueryClientProvider>
40
+ </trpc.Provider>
66
41
  </AppContextReact.Provider>
67
42
  </QuiltAppTesting>
68
43
  );
@@ -0,0 +1,35 @@
1
+ import type {createTestRouter} from '@quilted/quilt/testing';
2
+ import type {QueryClient} from '@tanstack/react-query';
3
+
4
+ import type {AppContext} from '~/shared/context.ts';
5
+
6
+ type Router = ReturnType<typeof createTestRouter>;
7
+
8
+ export interface RenderOptions {
9
+ /**
10
+ * A custom router to use for this component test. You can use a
11
+ * custom router to simulate a particular URL, and you can spy on
12
+ * its navigation method to check that components navigate as
13
+ * you expect.
14
+ */
15
+ readonly router?: Router;
16
+
17
+ /**
18
+ * A custom locale to use for this component test.
19
+ */
20
+ readonly locale?: string;
21
+ }
22
+
23
+ export interface RenderContext extends AppContext {
24
+ /**
25
+ * The router used for this component test.
26
+ */
27
+ readonly router: Router;
28
+
29
+ /**
30
+ * The react-query client used for this component test.
31
+ */
32
+ readonly queryClient: QueryClient;
33
+ }
34
+
35
+ export interface RenderActions extends Record<string, never> {}
@@ -0,0 +1,6 @@
1
+ import '@quilted/quilt/matchers';
2
+
3
+ export {createTestRouter} from '@quilted/quilt/testing';
4
+
5
+ export * from './render/types.ts';
6
+ export {renderApp} from './render/render.tsx';
@@ -1,126 +0,0 @@
1
- import '@quilted/quilt/matchers';
2
-
3
- import {
4
- createRender,
5
- QuiltAppTesting,
6
- createTestRouter,
7
- } from '@quilted/quilt/testing';
8
- import {QueryClient, QueryClientProvider} from '@tanstack/react-query';
9
-
10
- import {
11
- AppContextReact,
12
- type AppContext as AppContextType,
13
- } from '~/shared/context.ts';
14
-
15
- import {
16
- TestGraphQL,
17
- fillGraphQL,
18
- createGraphQLController,
19
- type GraphQLController,
20
- } from './graphql.ts';
21
-
22
- type Router = ReturnType<typeof createTestRouter>;
23
-
24
- export {createTestRouter, fillGraphQL, createGraphQLController};
25
-
26
- export interface RenderOptions {
27
- /**
28
- * A custom router to use for this component test. You can use a
29
- * custom router to simulate a particular URL, and you can spy on
30
- * its navigation method to check that components navigate as
31
- * you expect.
32
- */
33
- router?: Router;
34
-
35
- /**
36
- * An object that controls the responses to GraphQL queries and mutations
37
- * for the component under test. You can customize the responses using
38
- * the `fillGraphQL` and `createGraphQLController` utilities provided
39
- * by this module.
40
- *
41
- * ```tsx
42
- * import {renderWithAppContext, fillGraphQL, createGraphQLController} from '~/tests/render.tsx';
43
- *
44
- * import {MyComponent} from './MyComponent.tsx';
45
- * import myComponentQuery from './MyComponentQuery.graphql';
46
- *
47
- * const myComponent = await renderWithAppContext(<MyComponent />, {
48
- * graphql: createGraphQLController(
49
- * fillGraphQL(myComponentQuery, {user: {name: 'Winston'}}),
50
- * ),
51
- * });
52
- * ```
53
- */
54
- graphql?: GraphQLController;
55
-
56
- /**
57
- * A custom locale to use for this component test.
58
- */
59
- locale?: string;
60
- }
61
-
62
- export interface RenderContext extends AppContextType {
63
- /**
64
- * The router used for this component test.
65
- */
66
- readonly router: Router;
67
-
68
- /**
69
- * The GraphQL controller used for this component test.
70
- */
71
- readonly graphql: GraphQLController;
72
-
73
- /**
74
- * The react-query client used for this component test.
75
- */
76
- readonly queryClient: QueryClient;
77
- }
78
-
79
- export interface RenderActions extends Record<string, never> {}
80
-
81
- /**
82
- * Renders a component with test-friendly versions of all global
83
- * context available to the application.
84
- */
85
- export const renderWithAppContext = createRender<
86
- RenderOptions,
87
- RenderContext,
88
- RenderActions,
89
- true
90
- >({
91
- // Create context that can be used by the `render` function, and referenced by test
92
- // authors on the `root.context` property. Context is used to share data between your
93
- // React tree and your test code, and is ideal for mocking out global context providers.
94
- context({router = createTestRouter(), graphql = createGraphQLController()}) {
95
- return {router, graphql, queryClient: new QueryClient()};
96
- },
97
- // Render all of our app-wide context providers around each component under test.
98
- render(element, context, {locale}) {
99
- const {router, graphql, queryClient} = context;
100
-
101
- return (
102
- <QuiltAppTesting routing={router} localization={locale}>
103
- <AppContextReact.Provider value={context}>
104
- <TestGraphQL controller={graphql}>
105
- <QueryClientProvider client={queryClient}>
106
- {element}
107
- </QueryClientProvider>
108
- </TestGraphQL>
109
- </AppContextReact.Provider>
110
- </QuiltAppTesting>
111
- );
112
- },
113
- async afterRender(wrapper) {
114
- // If your components need to resolve data before they can render, you can
115
- // use this hook to wait for that data to be ready. This will cause the
116
- // `render` function to return a promise, so that the component is only usable
117
- // once the data is ready.
118
-
119
- await wrapper.act(async () => {
120
- await wrapper.context.graphql.resolveAll();
121
-
122
- // react-query needs an extra tick to set state in response to GraphQL queries.
123
- await new Promise((resolve) => setTimeout(resolve, 0));
124
- });
125
- },
126
- });