@koine/next 1.0.4 → 1.0.9

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 (209) hide show
  1. package/Analytics/AnalyticsGoogle.d.ts +5 -6
  2. package/Analytics/AnalyticsGoogle.js +37 -0
  3. package/Analytics/index.d.ts +1 -1
  4. package/Analytics/index.js +1 -0
  5. package/Analytics/package.json +6 -0
  6. package/Auth/helpers.d.ts +17 -17
  7. package/Auth/helpers.js +21 -0
  8. package/Auth/index.d.ts +4 -4
  9. package/Auth/index.js +4 -0
  10. package/Auth/package.json +6 -0
  11. package/Auth/useLogin.d.ts +7 -7
  12. package/Auth/useLogin.js +50 -0
  13. package/Auth/useLoginUrl.d.ts +1 -1
  14. package/Auth/useLoginUrl.js +11 -0
  15. package/Auth/useLogout.d.ts +6 -6
  16. package/Auth/useLogout.js +52 -0
  17. package/Favicon/Favicon.d.ts +3 -4
  18. package/Favicon/Favicon.js +4 -0
  19. package/Favicon/index.d.ts +1 -1
  20. package/Favicon/index.js +1 -0
  21. package/Favicon/package.json +6 -0
  22. package/Forms/index.d.ts +2 -2
  23. package/Forms/index.js +2 -0
  24. package/Forms/package.json +6 -0
  25. package/Forms/useForm.d.ts +32 -32
  26. package/Forms/useForm.js +37 -0
  27. package/Forms/useSubmit.d.ts +24 -24
  28. package/Forms/useSubmit.js +23 -0
  29. package/Head/Head.d.ts +1 -1
  30. package/Head/Head.js +1 -0
  31. package/Head/index.d.ts +1 -1
  32. package/Head/index.js +1 -0
  33. package/Head/package.json +6 -0
  34. package/I18n/I18n.d.ts +44 -48
  35. package/I18n/I18n.js +74 -0
  36. package/I18n/index.d.ts +1 -1
  37. package/I18n/index.js +1 -0
  38. package/I18n/package.json +6 -0
  39. package/Img/Img.d.ts +21 -21
  40. package/Img/Img.js +28 -0
  41. package/Img/index.d.ts +1 -1
  42. package/Img/index.js +1 -0
  43. package/Img/package.json +6 -0
  44. package/Link/Link.d.ts +9 -8
  45. package/Link/Link.js +9 -0
  46. package/Link/index.d.ts +1 -1
  47. package/Link/index.js +1 -0
  48. package/Link/package.json +6 -0
  49. package/NextProgress/NextProgress.d.ts +24 -14
  50. package/NextProgress/NextProgress.js +37 -0
  51. package/NextProgress/index.d.ts +2 -1
  52. package/NextProgress/index.js +1 -0
  53. package/NextProgress/package.json +6 -0
  54. package/README.md +0 -0
  55. package/Seo/Seo.d.ts +3 -3
  56. package/Seo/Seo.js +8 -0
  57. package/Seo/SeoDefaults.d.ts +3 -3
  58. package/Seo/SeoDefaults.js +12 -0
  59. package/Seo/helpers.d.ts +48 -48
  60. package/Seo/helpers.js +111 -0
  61. package/Seo/index.d.ts +12 -12
  62. package/Seo/index.js +12 -0
  63. package/Seo/package.json +6 -0
  64. package/Theme/Theme.d.ts +46 -46
  65. package/Theme/Theme.js +235 -0
  66. package/Theme/index.d.ts +1 -1
  67. package/Theme/index.js +1 -0
  68. package/Theme/package.json +6 -0
  69. package/app/AppHead.d.ts +2 -3
  70. package/app/AppHead.js +5 -0
  71. package/app/AppMain.d.ts +35 -34
  72. package/app/AppMain.js +1 -0
  73. package/app/css/AppMain.d.ts +8 -0
  74. package/app/css/AppMain.js +11 -0
  75. package/app/css/AppTheme.d.ts +10 -0
  76. package/app/css/AppTheme.js +12 -0
  77. package/app/css/auth/index.d.ts +9 -0
  78. package/app/css/auth/index.js +13 -0
  79. package/app/css/auth/package.json +6 -0
  80. package/app/css/index.d.ts +54 -0
  81. package/app/css/index.js +57 -0
  82. package/app/css/package.json +6 -0
  83. package/app/em/AppMain.d.ts +10 -0
  84. package/app/em/AppMain.js +22 -0
  85. package/app/{AppTheme--emotion.d.ts → em/AppTheme.d.ts} +15 -15
  86. package/app/em/AppTheme.js +17 -0
  87. package/app/em/auth/index.d.ts +9 -0
  88. package/app/em/auth/index.js +13 -0
  89. package/app/em/auth/package.json +6 -0
  90. package/app/em/index.d.ts +9 -0
  91. package/app/em/index.js +12 -0
  92. package/app/em/package.json +6 -0
  93. package/app/index.d.ts +2 -11
  94. package/app/index.js +2 -0
  95. package/app/package.json +6 -0
  96. package/app/sc/AppMain.d.ts +10 -0
  97. package/app/sc/AppMain.js +22 -0
  98. package/app/sc/AppTheme.d.ts +13 -0
  99. package/app/sc/AppTheme.js +9 -0
  100. package/app/sc/auth/index.d.ts +9 -0
  101. package/app/sc/auth/index.js +13 -0
  102. package/app/sc/auth/package.json +6 -0
  103. package/app/sc/index.d.ts +56 -0
  104. package/app/sc/index.js +59 -0
  105. package/app/sc/package.json +6 -0
  106. package/config/index.d.ts +71 -58
  107. package/config/index.js +174 -0
  108. package/config/package.json +6 -0
  109. package/document/Document.d.ts +15 -10
  110. package/document/Document.js +19 -0
  111. package/document/css/index.d.ts +22 -0
  112. package/document/css/index.js +30 -0
  113. package/document/css/package.json +6 -0
  114. package/document/em/index.d.ts +16 -0
  115. package/document/em/index.js +68 -0
  116. package/document/em/package.json +6 -0
  117. package/document/index.d.ts +2 -4
  118. package/document/index.js +2 -0
  119. package/document/package.json +6 -0
  120. package/document/{Document--sc.d.ts → sc/index.d.ts} +20 -11
  121. package/document/sc/index.js +44 -0
  122. package/document/sc/package.json +6 -0
  123. package/index.d.ts +12 -12
  124. package/index.js +12 -743
  125. package/node/Analytics/AnalyticsGoogle.js +42 -0
  126. package/node/Analytics/index.js +4 -0
  127. package/node/Auth/helpers.js +26 -0
  128. package/node/Auth/index.js +7 -0
  129. package/node/Auth/useLogin.js +54 -0
  130. package/node/Auth/useLoginUrl.js +15 -0
  131. package/node/Auth/useLogout.js +56 -0
  132. package/node/Favicon/Favicon.js +9 -0
  133. package/node/Favicon/index.js +4 -0
  134. package/node/Forms/index.js +5 -0
  135. package/node/Forms/useForm.js +41 -0
  136. package/node/Forms/useSubmit.js +27 -0
  137. package/node/Head/Head.js +8 -0
  138. package/node/Head/index.js +4 -0
  139. package/node/I18n/I18n.js +82 -0
  140. package/node/I18n/index.js +4 -0
  141. package/node/Img/Img.js +34 -0
  142. package/node/Img/index.js +4 -0
  143. package/node/Link/Link.js +13 -0
  144. package/node/Link/index.js +4 -0
  145. package/node/NextProgress/NextProgress.js +41 -0
  146. package/node/NextProgress/index.js +5 -0
  147. package/node/Seo/Seo.js +12 -0
  148. package/node/Seo/SeoDefaults.js +16 -0
  149. package/node/Seo/helpers.js +115 -0
  150. package/node/Seo/index.js +15 -0
  151. package/node/Theme/Theme.js +241 -0
  152. package/node/Theme/index.js +4 -0
  153. package/node/app/AppHead.js +10 -0
  154. package/node/app/AppMain.js +2 -0
  155. package/node/app/css/AppMain.js +16 -0
  156. package/node/app/css/AppTheme.js +16 -0
  157. package/node/app/css/auth/index.js +18 -0
  158. package/node/app/css/index.js +62 -0
  159. package/node/app/em/AppMain.js +26 -0
  160. package/node/app/em/AppTheme.js +22 -0
  161. package/node/app/em/auth/index.js +18 -0
  162. package/node/app/em/index.js +17 -0
  163. package/node/app/index.js +5 -0
  164. package/node/app/sc/AppMain.js +26 -0
  165. package/node/app/sc/AppTheme.js +13 -0
  166. package/node/app/sc/auth/index.js +18 -0
  167. package/node/app/sc/index.js +64 -0
  168. package/node/config/index.js +184 -0
  169. package/node/document/Document.js +24 -0
  170. package/node/document/css/index.js +35 -0
  171. package/node/document/em/index.js +73 -0
  172. package/node/document/index.js +7 -0
  173. package/node/document/sc/index.js +49 -0
  174. package/node/index.js +15 -0
  175. package/node/utils/api.js +38 -0
  176. package/node/utils/emotion-cache.js +13 -0
  177. package/node/utils/index.js +32 -0
  178. package/package.json +3 -30
  179. package/{types.d.ts → typings.d.ts} +10 -7
  180. package/utils/api.d.ts +55 -55
  181. package/utils/api.js +35 -0
  182. package/{document/emotion.d.ts → utils/emotion-cache.d.ts} +5 -5
  183. package/utils/emotion-cache.js +8 -0
  184. package/utils/index.d.ts +19 -19
  185. package/utils/index.js +26 -0
  186. package/utils/package.json +6 -0
  187. package/Theme.js +0 -1905
  188. package/_tslib.js +0 -41
  189. package/app/App--emotion.d.ts +0 -10
  190. package/app/App--sc.d.ts +0 -10
  191. package/app/App--vanilla.d.ts +0 -10
  192. package/app/AppAuth--emotion.d.ts +0 -10
  193. package/app/AppAuth--sc.d.ts +0 -10
  194. package/app/AppMain--vanilla.d.ts +0 -27
  195. package/app/AppTheme--sc.d.ts +0 -13
  196. package/app/AppTheme--vanilla.d.ts +0 -10
  197. package/app/motion-features.d.ts +0 -2
  198. package/app.js +0 -250
  199. package/config.js +0 -183
  200. package/document/Document--emotion.d.ts +0 -5
  201. package/document/Document--vanilla.d.ts +0 -11
  202. package/document.js +0 -207
  203. package/emotion.js +0 -1329
  204. package/es.object.assign.js +0 -1074
  205. package/es.string.replace.js +0 -785
  206. package/es.string.split.js +0 -201
  207. package/index.esm.js +0 -4600
  208. package/index.umd.js +0 -4638
  209. package/motion-features.js +0 -10
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Normalise pathname
3
+ *
4
+ * From a path like `/some//malformed/path///` it returns `some/malformed/path`
5
+ *
6
+ * - Removes subsequent slashes
7
+ * - Removing initial and ending slashes
8
+ */
9
+ export function normaliseUrlPathname(pathname) {
10
+ return pathname.replace(/\/+\//g, "/").replace(/^\/+(.*?)\/+$/, "$1");
11
+ }
12
+ /**
13
+ * Clean a pathname and encode each part
14
+ *
15
+ * @see {@link normaliseUrlPathname}
16
+ */
17
+ export function encodePathname(pathname) {
18
+ const parts = normaliseUrlPathname(pathname).split("/");
19
+ return parts
20
+ .filter((part) => !!part)
21
+ .map((part) => encodeURIComponent(part))
22
+ .join("/");
23
+ }
24
+ /**
25
+ */
26
+ export function getPathRedirect(locale, localisedPathname, templateName, dynamic, permanent) {
27
+ const suffix = dynamic ? `/:slug*` : "";
28
+ return {
29
+ source: `/${locale}/${encodePathname(localisedPathname)}${suffix}`,
30
+ destination: `/${encodePathname(templateName)}${suffix}`,
31
+ permanent: Boolean(permanent),
32
+ locale: false,
33
+ };
34
+ }
35
+ /**
36
+ */
37
+ export function getPathRewrite(source, destination, dynamic) {
38
+ const suffix = dynamic ? `/:path*` : "";
39
+ return {
40
+ source: `/${encodePathname(source)}${suffix}`,
41
+ destination: `/${encodePathname(destination)}${suffix}`,
42
+ };
43
+ }
44
+ /**
45
+ */
46
+ export async function getRedirects({ defaultLocale, routes, dynamicRoutes, permanent, }) {
47
+ const redirects = [];
48
+ Object.keys(routes).forEach((page) => {
49
+ const dynamic = dynamicRoutes[page];
50
+ if (routes[page] !== page) {
51
+ if (dynamic) {
52
+ redirects.push(getPathRedirect(defaultLocale, page, routes[page], true, permanent));
53
+ }
54
+ else {
55
+ redirects.push(getPathRedirect(defaultLocale, page, routes[page], false, permanent));
56
+ }
57
+ }
58
+ });
59
+ // console.log("redirects", redirects);
60
+ return redirects;
61
+ }
62
+ /**
63
+ */
64
+ export async function getRewrites({ routes, dynamicRoutes, }) {
65
+ const rewrites = [];
66
+ Object.keys(routes).forEach((page) => {
67
+ const dynamic = dynamicRoutes[page];
68
+ if (routes[page] !== page) {
69
+ if (dynamic) {
70
+ rewrites.push(getPathRewrite(routes[page], page, true));
71
+ }
72
+ else {
73
+ rewrites.push(getPathRewrite(routes[page], page));
74
+ }
75
+ }
76
+ });
77
+ // console.log("rewrites", rewrites);
78
+ return rewrites;
79
+ }
80
+ /**
81
+ * Get Next.js config with some basic opinionated defaults
82
+ *
83
+ * @param {object} options
84
+ * @property {boolean} [options.nx=false] Nx monorepo setup
85
+ * @property {boolean} [options.svg=false] Svg to react components
86
+ * @property {boolean} [options.sc=false] Styled components enabled
87
+ * @property {boolean} [options.page=false] When `true` uses `*.page.ts` or `*.page.tsx`
88
+ * extension for next.js config option [`pageExtensions`](https://nextjs.org/docs/api-reference/next.config.js/custom-page-extensions#including-non-page-files-in-the-pages-directory)
89
+ * and it enables the same for `next-translate`.
90
+ */
91
+ export function withKoine({ nx = true, svg = true, sc = true, page, ...nextConfig } = {}) {
92
+ nextConfig = {
93
+ // @see https://nextjs.org/docs/api-reference/next.config.js/custom-page-extensions#including-non-page-files-in-the-pages-directory
94
+ pageExtensions: page ? ["page.tsx", "page.ts"] : undefined,
95
+ eslint: {
96
+ ignoreDuringBuilds: true, // we have this strict check on each commit
97
+ },
98
+ typescript: {
99
+ ignoreBuildErrors: true, // we have this strict check on each commit
100
+ },
101
+ poweredByHeader: false,
102
+ swcMinify: true,
103
+ experimental: {
104
+ // @see https://github.com/vercel/vercel/discussions/5973#discussioncomment-472618
105
+ // @see critters error https://github.com/vercel/next.js/issues/20742
106
+ // optimizeCss: true,
107
+ // @see https://github.com/vercel/next.js/discussions/30174#discussion-3643870
108
+ scrollRestoration: true,
109
+ // concurrentFeatures: true,
110
+ // serverComponents: true,
111
+ // reactRoot: true,
112
+ ...(nextConfig.experimental || {}),
113
+ // @see https://nextjs.org/docs/advanced-features/compiler#modularize-imports
114
+ modularizeImports: {
115
+ ...(nextConfig?.experimental?.modularizeImports || {}),
116
+ // FIXME: make these work with the right file/folder structure?
117
+ // "@koine/next/?(((\\w*)?/?)*)": {
118
+ // transform: "@koine/next/{{ matches.[1] }}/{{member}}",
119
+ // },
120
+ // "@koine/react/?(((\\w*)?/?)*)": {
121
+ // transform: "@koine/react/{{ matches.[1] }}/{{member}}",
122
+ // },
123
+ // "@koine/utils/?(((\\w*)?/?)*)": {
124
+ // transform: "@koine/utils/{{ matches.[1] }}/{{member}}",
125
+ // },
126
+ },
127
+ },
128
+ // @see https://github.com/vercel/next.js/issues/7322#issuecomment-887330111
129
+ // reactStrictMode: false,
130
+ ...nextConfig,
131
+ };
132
+ if (svg) {
133
+ if (nx) {
134
+ // @see https://github.com/gregberge/svgr
135
+ nextConfig["nx"] = {
136
+ svgr: true,
137
+ };
138
+ }
139
+ else {
140
+ nextConfig.webpack = (_config, options) => {
141
+ const webpackConfig = typeof nextConfig.webpack === "function"
142
+ ? nextConfig.webpack(_config, options)
143
+ : _config;
144
+ // @see https://dev.to/dolearning/importing-svgs-to-next-js-nna#svgr
145
+ webpackConfig.module.rules.push({
146
+ test: /\.svg$/,
147
+ use: [
148
+ {
149
+ loader: "@svgr/webpack",
150
+ options: {
151
+ svgoConfig: {
152
+ plugins: [
153
+ {
154
+ name: "removeViewBox",
155
+ active: false,
156
+ },
157
+ ],
158
+ },
159
+ },
160
+ },
161
+ ],
162
+ });
163
+ return webpackConfig;
164
+ };
165
+ }
166
+ }
167
+ if (sc) {
168
+ nextConfig.compiler = {
169
+ styledComponents: true,
170
+ };
171
+ }
172
+ return nextConfig;
173
+ }
174
+ export default withKoine;
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/config/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -1,10 +1,15 @@
1
- /// <reference types="react" />
2
- import NextDocument from "next/document";
3
- /**
4
- * For typescript safety of this component
5
- *
6
- * @see https://bit.ly/3ceuF8m
7
- */
8
- export declare class Document extends NextDocument {
9
- render(): JSX.Element;
10
- }
1
+ /// <reference types="react" />
2
+ import NextDocument from "next/document";
3
+ /**
4
+ * Next Document wrapper for bare projects
5
+ *
6
+ * @example
7
+ *
8
+ * in your `myapp/pages/_document.tsx`:
9
+ * ```tsx
10
+ * export { Document as default } from "@koine/next/document";
11
+ * ```
12
+ */
13
+ export declare class Document extends NextDocument {
14
+ render(): JSX.Element;
15
+ }
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import NextDocument, { Html, Head, Main, NextScript } from "next/document";
3
+ import { Meta, NoJs } from "@koine/react";
4
+ /**
5
+ * Next Document wrapper for bare projects
6
+ *
7
+ * @example
8
+ *
9
+ * in your `myapp/pages/_document.tsx`:
10
+ * ```tsx
11
+ * export { Document as default } from "@koine/next/document";
12
+ * ```
13
+ */
14
+ export class Document extends NextDocument {
15
+ render() {
16
+ const { locale, defaultLocale } = this.props.__NEXT_DATA__;
17
+ return (_jsxs(Html, { lang: locale || defaultLocale, className: "no-js", children: [_jsxs(Head, { children: [_jsx(Meta, {}), _jsx(NoJs, {})] }), _jsxs("body", { children: [_jsx(Main, {}), _jsx(NextScript, {})] })] }));
18
+ }
19
+ }
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ import NextDocument, { DocumentContext, DocumentInitialProps } from "next/document";
3
+ import { ThemeVanillaValue } from "@koine/react/sc";
4
+ /**
5
+ * Next Document wrapper for `css/tailwind` based projects
6
+ *
7
+ * Uses cookie to manage the current theme
8
+ *
9
+ * @example
10
+ *
11
+ * in your `myapp/pages/_document.tsx`:
12
+ * ```tsx
13
+ * export { Document as default } from "@koine/next/document/css";
14
+ * ```
15
+ */
16
+ export declare class Document extends NextDocument {
17
+ static getInitialProps(ctx: DocumentContext): Promise<DocumentInitialProps & {
18
+ theme: ThemeVanillaValue;
19
+ }>;
20
+ render(): JSX.Element;
21
+ }
22
+ export default Document;
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import NextDocument, { Html, Head, Main, NextScript, } from "next/document";
3
+ import { Meta, NoJs } from "@koine/react";
4
+ import { getInitialThemeFromRequest } from "@koine/react/sc"; // FIXME: this should be imported from another entrypoint
5
+ /**
6
+ * Next Document wrapper for `css/tailwind` based projects
7
+ *
8
+ * Uses cookie to manage the current theme
9
+ *
10
+ * @example
11
+ *
12
+ * in your `myapp/pages/_document.tsx`:
13
+ * ```tsx
14
+ * export { Document as default } from "@koine/next/document/css";
15
+ * ```
16
+ */
17
+ export class Document extends NextDocument {
18
+ static async getInitialProps(ctx) {
19
+ const initialProps = await NextDocument.getInitialProps(ctx);
20
+ return {
21
+ ...initialProps,
22
+ theme: getInitialThemeFromRequest(ctx.req?.headers.cookie /* || document?.cookie */ || ""),
23
+ };
24
+ }
25
+ render() {
26
+ const { locale, defaultLocale } = this.props.__NEXT_DATA__;
27
+ return (_jsxs(Html, { lang: locale || defaultLocale, className: "no-js", children: [_jsxs(Head, { children: [_jsx(Meta, {}), _jsx(NoJs, {})] }), _jsxs("body", { children: [_jsx(Main, {}), _jsx(NextScript, {})] })] }));
28
+ }
29
+ }
30
+ export default Document;
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../../node/document/css/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ import NextDocument from "next/document";
3
+ /**
4
+ * Next Document wrapper for `emotion` based projects
5
+ *
6
+ * @example
7
+ *
8
+ * in your `myapp/pages/_document.tsx`:
9
+ * ```tsx
10
+ * export { Document as default } from "@koine/next/document/em";
11
+ * ```
12
+ */
13
+ export declare class Document extends NextDocument {
14
+ render(): JSX.Element;
15
+ }
16
+ export default Document;
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import NextDocument, { Html, Head, Main, NextScript } from "next/document";
3
+ import { Meta, NoJs } from "@koine/react";
4
+ import createEmotionServer from "@emotion/server/create-instance";
5
+ import { createEmotionCache } from "../../utils/emotion-cache";
6
+ /**
7
+ * Next Document wrapper for `emotion` based projects
8
+ *
9
+ * @example
10
+ *
11
+ * in your `myapp/pages/_document.tsx`:
12
+ * ```tsx
13
+ * export { Document as default } from "@koine/next/document/em";
14
+ * ```
15
+ */
16
+ export class Document extends NextDocument {
17
+ render() {
18
+ const { locale, defaultLocale } = this.props.__NEXT_DATA__;
19
+ return (_jsxs(Html, { lang: locale || defaultLocale, className: "no-js", children: [_jsxs(Head, { children: [_jsx(Meta, {}), _jsx(NoJs, {}), this.props.emotionStyleTags] }), _jsxs("body", { children: [_jsx(Main, {}), _jsx(NextScript, {})] })] }));
20
+ }
21
+ }
22
+ // `getInitialProps` belongs to `_document` (instead of `_app`),
23
+ // it's compatible with static-site generation (SSG).
24
+ Document.getInitialProps = async (ctx) => {
25
+ // Resolution order
26
+ //
27
+ // On the server:
28
+ // 1. app.getInitialProps
29
+ // 2. page.getInitialProps
30
+ // 3. document.getInitialProps
31
+ // 4. app.render
32
+ // 5. page.render
33
+ // 6. document.render
34
+ //
35
+ // On the server with error:
36
+ // 1. document.getInitialProps
37
+ // 2. app.render
38
+ // 3. page.render
39
+ // 4. document.render
40
+ //
41
+ // On the client
42
+ // 1. app.getInitialProps
43
+ // 2. page.getInitialProps
44
+ // 3. app.render
45
+ // 4. page.render
46
+ const originalRenderPage = ctx.renderPage;
47
+ // You can consider sharing the same emotion cache between all the SSR requests to speed up performance.
48
+ // However, be aware that it can have global side effects.
49
+ const cache = createEmotionCache();
50
+ const { extractCriticalToChunks } = createEmotionServer(cache);
51
+ ctx.renderPage = () => originalRenderPage({
52
+ enhanceApp: (App) => function EnhanceApp(props) {
53
+ return _jsx(App, { emotionCache: cache, ...props });
54
+ },
55
+ });
56
+ const initialProps = await Document.getInitialProps(ctx);
57
+ // This is important. It prevents emotion to render invalid HTML.
58
+ // See https://github.com/mui-org/material-ui/issues/26561#issuecomment-855286153
59
+ const emotionStyles = extractCriticalToChunks(initialProps.html);
60
+ const emotionStyleTags = emotionStyles.styles.map((style) => (_jsx("style", { "data-emotion": `${style.key} ${style.ids.join(" ")}`,
61
+ // eslint-disable-next-line react/no-danger
62
+ dangerouslySetInnerHTML: { __html: style.css } }, style.key)));
63
+ return {
64
+ ...initialProps,
65
+ emotionStyleTags,
66
+ };
67
+ };
68
+ export default Document;
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../../node/document/em/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -1,4 +1,2 @@
1
- export * from "./Document";
2
- export * from "./Document--emotion";
3
- export * from "./Document--sc";
4
- export * from "./Document--vanilla";
1
+ export { Document } from "./Document";
2
+ export { Document as default } from "./Document";
@@ -0,0 +1,2 @@
1
+ export { Document } from "./Document";
2
+ export { Document as default } from "./Document";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/document/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -1,11 +1,20 @@
1
- /// <reference types="react" />
2
- import NextDocument, { DocumentContext, DocumentInitialProps } from "next/document";
3
- /**
4
- * For typescript safety of this component
5
- *
6
- * @see https://bit.ly/3ceuF8m
7
- */
8
- export declare class DocumentSc extends NextDocument {
9
- static getInitialProps(ctx: DocumentContext): Promise<DocumentInitialProps>;
10
- render(): JSX.Element;
11
- }
1
+ /// <reference types="react" />
2
+ import NextDocument, { DocumentContext, DocumentInitialProps } from "next/document";
3
+ /**
4
+ * Next Document wrapper for `styled-components` based projects
5
+ *
6
+ * For typescript safety of this component
7
+ * @see https://bit.ly/3ceuF8m
8
+ *
9
+ * @example
10
+ *
11
+ * in your `myapp/pages/_document.tsx`:
12
+ * ```tsx
13
+ * export { Document as default } from "@koine/next/document/sc";
14
+ * ```
15
+ */
16
+ export declare class Document extends NextDocument {
17
+ static getInitialProps(ctx: DocumentContext): Promise<DocumentInitialProps>;
18
+ render(): JSX.Element;
19
+ }
20
+ export default Document;
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ /* ? eslint-disable @next/next/no-document-import-in-page */
4
+ import NextDocument, { Html, Head, Main, NextScript, } from "next/document";
5
+ import { Meta, NoJs } from "@koine/react";
6
+ import { ServerStyleSheet } from "styled-components";
7
+ /**
8
+ * Next Document wrapper for `styled-components` based projects
9
+ *
10
+ * For typescript safety of this component
11
+ * @see https://bit.ly/3ceuF8m
12
+ *
13
+ * @example
14
+ *
15
+ * in your `myapp/pages/_document.tsx`:
16
+ * ```tsx
17
+ * export { Document as default } from "@koine/next/document/sc";
18
+ * ```
19
+ */
20
+ export class Document extends NextDocument {
21
+ static async getInitialProps(ctx) {
22
+ const sheet = new ServerStyleSheet();
23
+ const originalRenderPage = ctx.renderPage;
24
+ try {
25
+ ctx.renderPage = () => originalRenderPage({
26
+ enhanceApp: (App) => (props) => sheet.collectStyles(_jsx(App, { ...props })),
27
+ });
28
+ const initialProps = await NextDocument.getInitialProps(ctx);
29
+ return {
30
+ ...initialProps,
31
+ // @ts-expect-error FIXME: have they changed type?
32
+ styles: (_jsxs(React.Fragment, { children: [initialProps.styles, sheet.getStyleElement()] })),
33
+ };
34
+ }
35
+ finally {
36
+ sheet.seal();
37
+ }
38
+ }
39
+ render() {
40
+ const { locale, defaultLocale } = this.props.__NEXT_DATA__;
41
+ return (_jsxs(Html, { lang: locale || defaultLocale, className: "no-js", children: [_jsxs(Head, { children: [_jsx(Meta, {}), _jsx(NoJs, {})] }), _jsxs("body", { children: [_jsx(Main, {}), _jsx(NextScript, {})] })] }));
42
+ }
43
+ }
44
+ export default Document;
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../../node/document/sc/index.js",
5
+ "types": "./index.d.ts"
6
+ }
package/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- export * from "./Analytics";
2
- export * from "./Auth";
3
- export * from "./Favicon";
4
- export * from "./Forms";
5
- export * from "./Head";
6
- export * from "./I18n";
7
- export * from "./Img";
8
- export * from "./Link";
9
- export * from "./NextProgress";
10
- export * from "./Seo";
11
- export * from "./Theme";
12
- export * from "./utils";
1
+ export * from "./Analytics";
2
+ export * from "./Auth";
3
+ export * from "./Favicon";
4
+ export * from "./Forms";
5
+ export * from "./Head";
6
+ export * from "./I18n";
7
+ export * from "./Img";
8
+ export * from "./Link";
9
+ export * from "./NextProgress";
10
+ export * from "./Seo";
11
+ export * from "./Theme";
12
+ export * from "./utils";