@ahmedrowaihi/pdf-forge-preview 1.0.0-canary.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.
- package/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +7 -0
- package/.next/build/chunks/[root-of-the-server]__12fb5caf._.js +233 -0
- package/.next/build/chunks/[root-of-the-server]__12fb5caf._.js.map +8 -0
- package/.next/build/chunks/[root-of-the-server]__242deb00._.js +500 -0
- package/.next/build/chunks/[root-of-the-server]__242deb00._.js.map +11 -0
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_ad9a1eec._.js +13 -0
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_ad9a1eec._.js.map +5 -0
- package/.next/build/chunks/[turbopack]_runtime.js +795 -0
- package/.next/build/chunks/[turbopack]_runtime.js.map +10 -0
- package/.next/build/chunks/node_modules__pnpm_806d01c0._.js +6758 -0
- package/.next/build/chunks/node_modules__pnpm_806d01c0._.js.map +47 -0
- package/.next/build/package.json +1 -0
- package/.next/build/postcss.js +6 -0
- package/.next/build/postcss.js.map +5 -0
- package/.next/build-manifest.json +20 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/fallback-build-manifest.json +12 -0
- package/.next/images-manifest.json +66 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +65 -0
- package/.next/required-server-files.js +163 -0
- package/.next/required-server-files.json +163 -0
- package/.next/routes-manifest.json +77 -0
- package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_global-error/page/build-manifest.json +17 -0
- package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/.next/server/app/_global-error/page.js +11 -0
- package/.next/server/app/_global-error/page.js.map +5 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +2 -0
- package/.next/server/app/_global-error.html +2 -0
- package/.next/server/app/_global-error.meta +15 -0
- package/.next/server/app/_global-error.rsc +13 -0
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +13 -0
- package/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
- package/.next/server/app/_global-error.segments/_index.segment.rsc +4 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_not-found/page/build-manifest.json +17 -0
- package/.next/server/app/_not-found/page/next-font-manifest.json +16 -0
- package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/_not-found/page/server-reference-manifest.json +20 -0
- package/.next/server/app/_not-found/page.js +14 -0
- package/.next/server/app/_not-found/page.js.map +5 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +2 -0
- package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
- package/.next/server/app/favicon.ico/route/build-manifest.json +11 -0
- package/.next/server/app/favicon.ico/route.js +6 -0
- package/.next/server/app/favicon.ico/route.js.map +5 -0
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/favicon.ico.meta +1 -0
- package/.next/server/app/page/app-paths-manifest.json +3 -0
- package/.next/server/app/page/build-manifest.json +17 -0
- package/.next/server/app/page/next-font-manifest.json +16 -0
- package/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/page/server-reference-manifest.json +20 -0
- package/.next/server/app/page.js +17 -0
- package/.next/server/app/page.js.map +5 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +2 -0
- package/.next/server/app/preview/[...slug]/page/app-paths-manifest.json +3 -0
- package/.next/server/app/preview/[...slug]/page/build-manifest.json +17 -0
- package/.next/server/app/preview/[...slug]/page/next-font-manifest.json +16 -0
- package/.next/server/app/preview/[...slug]/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/preview/[...slug]/page/server-reference-manifest.json +65 -0
- package/.next/server/app/preview/[...slug]/page.js +19 -0
- package/.next/server/app/preview/[...slug]/page.js.map +5 -0
- package/.next/server/app/preview/[...slug]/page.js.nft.json +1 -0
- package/.next/server/app/preview/[...slug]/page_client-reference-manifest.js +2 -0
- package/.next/server/app-paths-manifest.json +7 -0
- package/.next/server/chunks/730ea_preview-server__next-internal_server_app_favicon_ico_route_actions_a71a8ae7.js +3 -0
- package/.next/server/chunks/730ea_preview-server__next-internal_server_app_favicon_ico_route_actions_a71a8ae7.js.map +1 -0
- package/.next/server/chunks/[externals]_next_dist_a6d89067._.js +3 -0
- package/.next/server/chunks/[externals]_next_dist_a6d89067._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__a62cd78d._.js +21 -0
- package/.next/server/chunks/[root-of-the-server]__a62cd78d._.js.map +1 -0
- package/.next/server/chunks/[turbopack]_runtime.js +795 -0
- package/.next/server/chunks/[turbopack]_runtime.js.map +10 -0
- package/.next/server/chunks/ssr/730ea_preview-server__next-internal_server_app__global-error_page_actions_986e2de5.js +3 -0
- package/.next/server/chunks/ssr/730ea_preview-server__next-internal_server_app__global-error_page_actions_986e2de5.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__025eaae9._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__025eaae9._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1536282c._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1536282c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__15cf9d36._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__15cf9d36._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__450f653e._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__450f653e._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4874d0d7._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4874d0d7._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__49771cdc._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__49771cdc._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9ff74047._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9ff74047._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__a9be37b1._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__a9be37b1._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__aeefe74e._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__aeefe74e._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__b13738d2._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__b13738d2._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__bb428c83._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__bb428c83._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c61333e3._.js +10 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c61333e3._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cb0c7b1a._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cb0c7b1a._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__dafcae4c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__dafcae4c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__e47d0c07._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__e47d0c07._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__ecac8617._.js +31 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__ecac8617._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__fd4bda25._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__fd4bda25._.js.map +1 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js +795 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +10 -0
- package/.next/server/chunks/ssr/_19494208._.js +19 -0
- package/.next/server/chunks/ssr/_19494208._.js.map +1 -0
- package/.next/server/chunks/ssr/_810f54e9._.js +4 -0
- package/.next/server/chunks/ssr/_810f54e9._.js.map +1 -0
- package/.next/server/chunks/ssr/_aa01e67e._.js +4 -0
- package/.next/server/chunks/ssr/_aa01e67e._.js.map +1 -0
- package/.next/server/chunks/ssr/_bf10718b._.js +4 -0
- package/.next/server/chunks/ssr/_bf10718b._.js.map +1 -0
- package/.next/server/chunks/ssr/_c57c12df._.js +4 -0
- package/.next/server/chunks/ssr/_c57c12df._.js.map +1 -0
- package/.next/server/chunks/ssr/_d9b57cb8._.js +5 -0
- package/.next/server/chunks/ssr/_d9b57cb8._.js.map +1 -0
- package/.next/server/chunks/ssr/_e2a766a8._.js +3 -0
- package/.next/server/chunks/ssr/_e2a766a8._.js.map +1 -0
- package/.next/server/chunks/ssr/_e2b86512._.js +8 -0
- package/.next/server/chunks/ssr/_e2b86512._.js.map +1 -0
- package/.next/server/chunks/ssr/_ee8ea3aa._.js +19 -0
- package/.next/server/chunks/ssr/_ee8ea3aa._.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_5870db32._.js +3 -0
- package/.next/server/chunks/ssr/e8449_next_dist_5870db32._.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_builtin_forbidden_5542069c.js +3 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_builtin_forbidden_5542069c.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_builtin_global-error_d0870f3a.js +3 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_builtin_global-error_d0870f3a.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_builtin_unauthorized_4c01c8d5.js +3 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_builtin_unauthorized_4c01c8d5.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_d90ace34._.js +3 -0
- package/.next/server/chunks/ssr/e8449_next_dist_client_components_d90ace34._.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_esm_af7aafb8._.js +6 -0
- package/.next/server/chunks/ssr/e8449_next_dist_esm_af7aafb8._.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_esm_build_templates_app-page_f16f0848.js +4 -0
- package/.next/server/chunks/ssr/e8449_next_dist_esm_build_templates_app-page_f16f0848.js.map +1 -0
- package/.next/server/chunks/ssr/e8449_next_dist_f0d8a2cc._.js +4 -0
- package/.next/server/chunks/ssr/e8449_next_dist_f0d8a2cc._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_37510d96._.js +5 -0
- package/.next/server/chunks/ssr/node_modules__pnpm_37510d96._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_preview-server_src_app_897ecf1c._.js +3 -0
- package/.next/server/chunks/ssr/packages_preview-server_src_app_897ecf1c._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_preview-server_src_e17a2a9b._.js +3 -0
- package/.next/server/chunks/ssr/packages_preview-server_src_e17a2a9b._.js.map +1 -0
- package/.next/server/functions-config-manifest.json +4 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +21 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +34 -0
- package/.next/server/pages/500.html +2 -0
- package/.next/server/pages-manifest.json +3 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +80 -0
- package/.next/static/cdYIhKFtJ0GB-yJK5ywz_/_buildManifest.js +11 -0
- package/.next/static/cdYIhKFtJ0GB-yJK5ywz_/_clientMiddlewareManifest.json +1 -0
- package/.next/static/cdYIhKFtJ0GB-yJK5ywz_/_ssgManifest.js +1 -0
- package/.next/static/chunks/0464c7ff175ee6ff.js +1 -0
- package/.next/static/chunks/10468413db24762a.js +14 -0
- package/.next/static/chunks/2de338262e51ef94.js +3 -0
- package/.next/static/chunks/37adc260f85da877.js +1 -0
- package/.next/static/chunks/521eee9903bc4d1f.js +5 -0
- package/.next/static/chunks/6051bd38272cb442.js +14 -0
- package/.next/static/chunks/8d433d4b9d701456.js +1 -0
- package/.next/static/chunks/92ba72595aad9df6.js +1 -0
- package/.next/static/chunks/959ed978a6e89a66.js +1 -0
- package/.next/static/chunks/a6dad97d9634a72d.js +1 -0
- package/.next/static/chunks/a6dad97d9634a72d.js.map +1 -0
- package/.next/static/chunks/a6db6456c5b75734.js +1 -0
- package/.next/static/chunks/c3ece0a7e3e07076.js +1 -0
- package/.next/static/chunks/d1b29a74f6814a03.css +3 -0
- package/.next/static/chunks/f7ec22614fe1c1fe.js +1 -0
- package/.next/static/chunks/turbopack-e062a8e6d6034eb0.js +4 -0
- package/.next/static/media/1bffadaabf893a1e-s.7cd81963.woff2 +0 -0
- package/.next/static/media/2bbe8d2671613f1f-s.76dcb0b2.woff2 +0 -0
- package/.next/static/media/2c55a0e60120577a-s.2a48534a.woff2 +0 -0
- package/.next/static/media/5476f68d60460930-s.c995e352.woff2 +0 -0
- package/.next/static/media/83afe278b6a6bb3c-s.p.3a6ba036.woff2 +0 -0
- package/.next/static/media/9c72aa0f40e4eef8-s.18a48cbc.woff2 +0 -0
- package/.next/static/media/SFMonoBold-s.p.b90ec775.otf +0 -0
- package/.next/static/media/SFMonoHeavy-s.p.545fe93b.otf +0 -0
- package/.next/static/media/SFMonoLight-s.p.7c5363a6.otf +0 -0
- package/.next/static/media/SFMonoMedium-s.p.a4fc9904.otf +0 -0
- package/.next/static/media/SFMonoRegular-s.p.04ea7bf3.otf +0 -0
- package/.next/static/media/SFMonoSemibold-s.p.2d2ddb43.otf +0 -0
- package/.next/static/media/ad66f9afd8947f86-s.7a40eb73.woff2 +0 -0
- package/.next/static/media/favicon.678eb597.ico +0 -0
- package/.next/static/media/logo.22a370b0.png +0 -0
- package/.next/trace +1 -0
- package/.next/trace-build +1 -0
- package/.next/turbopack +0 -0
- package/.next/types/routes.d.ts +58 -0
- package/.next/types/validator.ts +70 -0
- package/CHANGELOG.md +12 -0
- package/LICENSE.md +8 -0
- package/index.mjs +17 -0
- package/jsx-runtime/jsx-dev-runtime.js +26 -0
- package/module-punycode.d.ts +3 -0
- package/next-env.d.ts +6 -0
- package/next.config.mjs +15 -0
- package/package.json +78 -0
- package/postcss.config.js +5 -0
- package/readme.md +33 -0
- package/scripts/build-preview-server.mts +25 -0
- package/scripts/dev.mts +57 -0
- package/scripts/seed.mts +36 -0
- package/src/actions/export-single-template.ts +74 -0
- package/src/actions/get-template-path-from-slug.ts +32 -0
- package/src/actions/get-templates-directory-metadata-action.ts +19 -0
- package/src/actions/render-template-by-path.tsx +313 -0
- package/src/actions/safe-action.ts +15 -0
- package/src/animated-icons-data/help.json +1082 -0
- package/src/animated-icons-data/link.json +1309 -0
- package/src/animated-icons-data/load.json +443 -0
- package/src/animated-icons-data/mail.json +1320 -0
- package/src/app/env.ts +14 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/fonts/SFMono/SFMonoBold.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoBoldItalic.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoHeavy.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoHeavyItalic.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoLight.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoLightItalic.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoMedium.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoMediumItalic.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoRegular.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoRegularItalic.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoSemibold.otf +0 -0
- package/src/app/fonts/SFMono/SFMonoSemiboldItalic.otf +0 -0
- package/src/app/fonts.ts +39 -0
- package/src/app/globals.css +136 -0
- package/src/app/layout.tsx +46 -0
- package/src/app/logo.png +0 -0
- package/src/app/page.tsx +52 -0
- package/src/app/preview/[...slug]/download-button.tsx +138 -0
- package/src/app/preview/[...slug]/error-overlay.tsx +58 -0
- package/src/app/preview/[...slug]/page.tsx +90 -0
- package/src/app/preview/[...slug]/preview.tsx +249 -0
- package/src/app/preview/[...slug]/template-frame.tsx +68 -0
- package/src/components/button.tsx +101 -0
- package/src/components/code-container.tsx +169 -0
- package/src/components/code-snippet.tsx +9 -0
- package/src/components/code.tsx +185 -0
- package/src/components/heading.tsx +113 -0
- package/src/components/icons/icon-arrow-down.tsx +16 -0
- package/src/components/icons/icon-base.tsx +26 -0
- package/src/components/icons/icon-bug.tsx +19 -0
- package/src/components/icons/icon-button.tsx +23 -0
- package/src/components/icons/icon-check.tsx +19 -0
- package/src/components/icons/icon-clipboard.tsx +40 -0
- package/src/components/icons/icon-cloud-alert.tsx +18 -0
- package/src/components/icons/icon-cloud-check.tsx +17 -0
- package/src/components/icons/icon-download.tsx +19 -0
- package/src/components/icons/icon-file.tsx +19 -0
- package/src/components/icons/icon-folder-open.tsx +19 -0
- package/src/components/icons/icon-folder.tsx +18 -0
- package/src/components/icons/icon-hide-sidebar.tsx +23 -0
- package/src/components/icons/icon-image.tsx +19 -0
- package/src/components/icons/icon-info.tsx +18 -0
- package/src/components/icons/icon-link.tsx +14 -0
- package/src/components/icons/icon-loader.tsx +16 -0
- package/src/components/icons/icon-monitor.tsx +19 -0
- package/src/components/icons/icon-moon.tsx +16 -0
- package/src/components/icons/icon-phone.tsx +26 -0
- package/src/components/icons/icon-reload.tsx +18 -0
- package/src/components/icons/icon-source.tsx +19 -0
- package/src/components/icons/icon-stamp.tsx +14 -0
- package/src/components/icons/icon-sun.tsx +74 -0
- package/src/components/icons/icon-warning.tsx +31 -0
- package/src/components/index.ts +7 -0
- package/src/components/logo.tsx +41 -0
- package/src/components/resizable-wrapper.tsx +269 -0
- package/src/components/shell.tsx +95 -0
- package/src/components/sidebar/file-tree-directory-children.tsx +142 -0
- package/src/components/sidebar/file-tree-directory.tsx +92 -0
- package/src/components/sidebar/file-tree.tsx +31 -0
- package/src/components/sidebar/index.ts +1 -0
- package/src/components/sidebar/sidebar.tsx +46 -0
- package/src/components/text.tsx +99 -0
- package/src/components/toolbar/checking-results.tsx +150 -0
- package/src/components/toolbar/code-preview-line-link.tsx +39 -0
- package/src/components/toolbar/results-table.tsx +0 -0
- package/src/components/toolbar/results.tsx +52 -0
- package/src/components/toolbar/toolbar-button.tsx +52 -0
- package/src/components/toolbar/use-cached-state.ts +36 -0
- package/src/components/toolbar.tsx +182 -0
- package/src/components/tooltip-content.tsx +31 -0
- package/src/components/tooltip.tsx +19 -0
- package/src/components/topbar/active-view-toggle-group.tsx +86 -0
- package/src/components/topbar/emulated-dark-mode-toggle.tsx +58 -0
- package/src/components/topbar/view-size-controls.tsx +173 -0
- package/src/components/topbar.tsx +59 -0
- package/src/contexts/preview.tsx +91 -0
- package/src/contexts/templates.tsx +57 -0
- package/src/contexts/toolbar.tsx +22 -0
- package/src/hooks/use-clamped-state.ts +24 -0
- package/src/hooks/use-fragment-identifier.ts +14 -0
- package/src/hooks/use-hot-reload.ts +31 -0
- package/src/hooks/use-rendering-metadata.ts +37 -0
- package/src/hooks/use-template-rendering-result.ts +58 -0
- package/src/utils/cn.ts +6 -0
- package/src/utils/constants.ts +8 -0
- package/src/utils/contains-template.ts +52 -0
- package/src/utils/convert-stack-with-sourcemap.ts +79 -0
- package/src/utils/copy-text-to-clipboard.ts +7 -0
- package/src/utils/create-jsx-runtime.ts +47 -0
- package/src/utils/esbuild/escape-string-for-regex.ts +3 -0
- package/src/utils/esbuild/renderring-utilities-exporter.ts +64 -0
- package/src/utils/get-line-and-column-from-offset.ts +11 -0
- package/src/utils/get-template-component.ts +158 -0
- package/src/utils/get-templates-directory-metadata.ts +195 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/language-map.ts +7 -0
- package/src/utils/load-stream.ts +15 -0
- package/src/utils/register-spinner-autostopping.ts +28 -0
- package/src/utils/result.ts +49 -0
- package/src/utils/run-bundled-code.ts +86 -0
- package/src/utils/sanitize.ts +6 -0
- package/src/utils/sleep.ts +3 -0
- package/src/utils/snake-to-camel.ts +5 -0
- package/src/utils/static-node-modules-for-vm.ts +93 -0
- package/src/utils/style-text.ts +11 -0
- package/src/utils/types/as.ts +26 -0
- package/src/utils/types/error-object.ts +11 -0
- package/src/utils/types/hot-reload-change.ts +13 -0
- package/src/utils/types/template.ts +8 -0
- package/src/utils/unreachable.ts +8 -0
- package/templates/.gitkeep +0 -0
- package/tsconfig.json +47 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { cache } from 'react';
|
|
6
|
+
import { templatesDirectoryAbsolutePath } from '../app/env';
|
|
7
|
+
|
|
8
|
+
export const getTemplatePathFromSlug = cache(async (slug: string) => {
|
|
9
|
+
if (['.tsx', '.jsx', '.ts', '.js'].includes(path.extname(slug)))
|
|
10
|
+
return path.join(templatesDirectoryAbsolutePath, slug);
|
|
11
|
+
|
|
12
|
+
const pathWithoutExtension = path.join(templatesDirectoryAbsolutePath, slug);
|
|
13
|
+
|
|
14
|
+
if (fs.existsSync(`${pathWithoutExtension}.tsx`)) {
|
|
15
|
+
return `${pathWithoutExtension}.tsx`;
|
|
16
|
+
}
|
|
17
|
+
if (fs.existsSync(`${pathWithoutExtension}.jsx`)) {
|
|
18
|
+
return `${pathWithoutExtension}.jsx`;
|
|
19
|
+
}
|
|
20
|
+
if (fs.existsSync(`${pathWithoutExtension}.ts`)) {
|
|
21
|
+
return `${pathWithoutExtension}.ts`;
|
|
22
|
+
}
|
|
23
|
+
if (fs.existsSync(`${pathWithoutExtension}.js`)) {
|
|
24
|
+
return `${pathWithoutExtension}.js`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
throw new Error(
|
|
28
|
+
`Could not find your template file based on the slug (${slug}) by guessing the file extension. Tried .tsx, .jsx, .ts and .js.
|
|
29
|
+
|
|
30
|
+
This is most likely not an issue with the preview server. It most likely is that the template doesn't exist.`,
|
|
31
|
+
);
|
|
32
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import type { TemplatesDirectory } from '../utils/get-templates-directory-metadata';
|
|
4
|
+
import { getTemplatesDirectoryMetadata } from '../utils/get-templates-directory-metadata';
|
|
5
|
+
|
|
6
|
+
export const getTemplatesDirectoryMetadataAction = async (
|
|
7
|
+
absolutePathToTemplatesDirectory: string,
|
|
8
|
+
keepFileExtensions = false,
|
|
9
|
+
isSubDirectory = false,
|
|
10
|
+
|
|
11
|
+
baseDirectoryPath = absolutePathToTemplatesDirectory,
|
|
12
|
+
): Promise<TemplatesDirectory | undefined> => {
|
|
13
|
+
return getTemplatesDirectoryMetadata(
|
|
14
|
+
absolutePathToTemplatesDirectory,
|
|
15
|
+
keepFileExtensions,
|
|
16
|
+
isSubDirectory,
|
|
17
|
+
baseDirectoryPath,
|
|
18
|
+
);
|
|
19
|
+
};
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import logSymbols from 'log-symbols';
|
|
6
|
+
import ora, { type Ora } from 'ora';
|
|
7
|
+
import type React from 'react';
|
|
8
|
+
import {
|
|
9
|
+
isBuilding,
|
|
10
|
+
isPreviewDevelopment,
|
|
11
|
+
previewServerLocation,
|
|
12
|
+
userProjectLocation,
|
|
13
|
+
} from '../app/env';
|
|
14
|
+
import { convertStackWithSourceMap } from '../utils/convert-stack-with-sourcemap';
|
|
15
|
+
import { createJsxRuntime } from '../utils/create-jsx-runtime';
|
|
16
|
+
import { getTemplateComponent } from '../utils/get-template-component';
|
|
17
|
+
import { registerSpinnerAutostopping } from '../utils/register-spinner-autostopping';
|
|
18
|
+
import { styleText } from '../utils/style-text';
|
|
19
|
+
import type { ErrorObject } from '../utils/types/error-object';
|
|
20
|
+
|
|
21
|
+
export interface RenderedTemplateMetadata {
|
|
22
|
+
prettyMarkup: string;
|
|
23
|
+
markup: string;
|
|
24
|
+
/**
|
|
25
|
+
* HTML markup with `data-source-file` and `data-source-line` attributes pointing to the original
|
|
26
|
+
* .jsx/.tsx files corresponding to the rendered tag
|
|
27
|
+
*/
|
|
28
|
+
markupWithReferences?: string;
|
|
29
|
+
plainText: string;
|
|
30
|
+
reactMarkup: string;
|
|
31
|
+
|
|
32
|
+
basename: string;
|
|
33
|
+
extname: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type TemplateRenderingResult =
|
|
37
|
+
| RenderedTemplateMetadata
|
|
38
|
+
| {
|
|
39
|
+
error: ErrorObject;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const cache = new Map<string, TemplateRenderingResult>();
|
|
43
|
+
|
|
44
|
+
const createLogBufferer = (
|
|
45
|
+
originalLogger: (...args: any[]) => void,
|
|
46
|
+
overwriteLogger: (logger: (...args: any[]) => void) => void,
|
|
47
|
+
) => {
|
|
48
|
+
let logs: Array<any[]> = [];
|
|
49
|
+
|
|
50
|
+
let timesCorked = 0;
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
buffer: () => {
|
|
54
|
+
timesCorked += 1;
|
|
55
|
+
overwriteLogger((...args: any[]) => logs.push(args));
|
|
56
|
+
},
|
|
57
|
+
flush: () => {
|
|
58
|
+
timesCorked = Math.max(timesCorked - 1, 0);
|
|
59
|
+
// This ensures that, only once flushing has been called as many times as
|
|
60
|
+
// buffering, that the logs are actually flushed.
|
|
61
|
+
if (timesCorked === 0) {
|
|
62
|
+
for (const logArgs of logs) {
|
|
63
|
+
originalLogger(...logArgs);
|
|
64
|
+
}
|
|
65
|
+
logs = [];
|
|
66
|
+
overwriteLogger(originalLogger);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const logBufferer = createLogBufferer(
|
|
73
|
+
console.log,
|
|
74
|
+
(logger) => (console.log = logger),
|
|
75
|
+
);
|
|
76
|
+
const errorBufferer = createLogBufferer(
|
|
77
|
+
console.error,
|
|
78
|
+
(logger) => (console.error = logger),
|
|
79
|
+
);
|
|
80
|
+
const infoBufferer = createLogBufferer(
|
|
81
|
+
console.info,
|
|
82
|
+
(logger) => (console.info = logger),
|
|
83
|
+
);
|
|
84
|
+
const warnBufferer = createLogBufferer(
|
|
85
|
+
console.warn,
|
|
86
|
+
(logger) => (console.warn = logger),
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
export const renderTemplateByPath = async (
|
|
90
|
+
templatePath: string,
|
|
91
|
+
invalidatingCache = false,
|
|
92
|
+
): Promise<TemplateRenderingResult> => {
|
|
93
|
+
if (invalidatingCache) {
|
|
94
|
+
cache.delete(templatePath);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (cache.has(templatePath)) {
|
|
98
|
+
return cache.get(templatePath)!;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
logBufferer.buffer();
|
|
102
|
+
errorBufferer.buffer();
|
|
103
|
+
infoBufferer.buffer();
|
|
104
|
+
warnBufferer.buffer();
|
|
105
|
+
|
|
106
|
+
const templateFilename = path.basename(templatePath);
|
|
107
|
+
let spinner: Ora | undefined;
|
|
108
|
+
if (!isBuilding && !isPreviewDevelopment) {
|
|
109
|
+
spinner = ora({
|
|
110
|
+
text: `Rendering PDF template ${templateFilename}\n`,
|
|
111
|
+
prefixText: ' ',
|
|
112
|
+
stream: process.stderr,
|
|
113
|
+
}).start();
|
|
114
|
+
registerSpinnerAutostopping(spinner);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const timeBeforeTemplateBundled = performance.now();
|
|
118
|
+
const originalJsxRuntimePath = path.resolve(
|
|
119
|
+
previewServerLocation,
|
|
120
|
+
'jsx-runtime',
|
|
121
|
+
);
|
|
122
|
+
const jsxRuntimePath = await createJsxRuntime(
|
|
123
|
+
userProjectLocation,
|
|
124
|
+
originalJsxRuntimePath,
|
|
125
|
+
);
|
|
126
|
+
const componentResult = await getTemplateComponent(
|
|
127
|
+
templatePath,
|
|
128
|
+
jsxRuntimePath,
|
|
129
|
+
);
|
|
130
|
+
const millisecondsToBundled = performance.now() - timeBeforeTemplateBundled;
|
|
131
|
+
|
|
132
|
+
if ('error' in componentResult) {
|
|
133
|
+
spinner?.stopAndPersist({
|
|
134
|
+
symbol: logSymbols.error,
|
|
135
|
+
text: `Failed while rendering ${templateFilename}`,
|
|
136
|
+
});
|
|
137
|
+
logBufferer.flush();
|
|
138
|
+
errorBufferer.flush();
|
|
139
|
+
infoBufferer.flush();
|
|
140
|
+
warnBufferer.flush();
|
|
141
|
+
return { error: componentResult.error };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const {
|
|
145
|
+
templateComponent: Template,
|
|
146
|
+
createElement,
|
|
147
|
+
render,
|
|
148
|
+
renderWithReferences,
|
|
149
|
+
sourceMapToOriginalFile,
|
|
150
|
+
} = componentResult;
|
|
151
|
+
|
|
152
|
+
const previewProps = Template.PreviewProps || {};
|
|
153
|
+
const TemplateComponent = Template as React.FunctionComponent;
|
|
154
|
+
try {
|
|
155
|
+
const timeBeforeTemplateRendered = performance.now();
|
|
156
|
+
const element = createElement(TemplateComponent, previewProps);
|
|
157
|
+
const markupWithReferences = await renderWithReferences(element, {
|
|
158
|
+
pretty: true,
|
|
159
|
+
});
|
|
160
|
+
const prettyMarkup = await render(element, {
|
|
161
|
+
pretty: true,
|
|
162
|
+
});
|
|
163
|
+
const markup = await render(element, {
|
|
164
|
+
pretty: false,
|
|
165
|
+
});
|
|
166
|
+
const plainText = await render(element, {
|
|
167
|
+
plainText: true,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const reactMarkup = await fs.promises.readFile(templatePath, 'utf-8');
|
|
171
|
+
|
|
172
|
+
const millisecondsToRendered =
|
|
173
|
+
performance.now() - timeBeforeTemplateRendered;
|
|
174
|
+
let timeForConsole = `${millisecondsToRendered.toFixed(0)}ms`;
|
|
175
|
+
if (millisecondsToRendered <= 450) {
|
|
176
|
+
timeForConsole = styleText('green', timeForConsole);
|
|
177
|
+
} else if (millisecondsToRendered <= 1000) {
|
|
178
|
+
timeForConsole = styleText('yellow', timeForConsole);
|
|
179
|
+
} else {
|
|
180
|
+
timeForConsole = styleText('red', timeForConsole);
|
|
181
|
+
}
|
|
182
|
+
spinner?.stopAndPersist({
|
|
183
|
+
symbol: logSymbols.success,
|
|
184
|
+
text: `Successfully rendered ${templateFilename} in ${timeForConsole} (bundled in ${millisecondsToBundled.toFixed(0)}ms)`,
|
|
185
|
+
});
|
|
186
|
+
logBufferer.flush();
|
|
187
|
+
errorBufferer.flush();
|
|
188
|
+
infoBufferer.flush();
|
|
189
|
+
warnBufferer.flush();
|
|
190
|
+
|
|
191
|
+
const renderingResult: RenderedTemplateMetadata = {
|
|
192
|
+
prettyMarkup,
|
|
193
|
+
// This ensures that no null byte character ends up in the rendered
|
|
194
|
+
// markup making users suspect of any issues. These null byte characters
|
|
195
|
+
// only seem to happen with React 18, as it has no similar incident with React 19.
|
|
196
|
+
markup: markup.replaceAll('\0', ''),
|
|
197
|
+
markupWithReferences: markupWithReferences.replaceAll('\0', ''),
|
|
198
|
+
plainText,
|
|
199
|
+
reactMarkup,
|
|
200
|
+
|
|
201
|
+
basename: path.basename(templatePath, path.extname(templatePath)),
|
|
202
|
+
extname: path.extname(templatePath).slice(1),
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
cache.set(templatePath, renderingResult);
|
|
206
|
+
|
|
207
|
+
return renderingResult;
|
|
208
|
+
} catch (exception) {
|
|
209
|
+
const error = exception as Error;
|
|
210
|
+
|
|
211
|
+
spinner?.stopAndPersist({
|
|
212
|
+
symbol: logSymbols.error,
|
|
213
|
+
text: `Failed while rendering ${templateFilename}`,
|
|
214
|
+
});
|
|
215
|
+
logBufferer.flush();
|
|
216
|
+
errorBufferer.flush();
|
|
217
|
+
infoBufferer.flush();
|
|
218
|
+
warnBufferer.flush();
|
|
219
|
+
|
|
220
|
+
if (exception instanceof SyntaxError) {
|
|
221
|
+
interface SpanPosition {
|
|
222
|
+
file: {
|
|
223
|
+
content: string;
|
|
224
|
+
};
|
|
225
|
+
offset: number;
|
|
226
|
+
line: number;
|
|
227
|
+
col: number;
|
|
228
|
+
}
|
|
229
|
+
// means the template's HTML was invalid and prettier threw this error
|
|
230
|
+
// TODO: always throw when the HTML is invalid during `render`
|
|
231
|
+
const cause = exception.cause as {
|
|
232
|
+
msg: string;
|
|
233
|
+
span: {
|
|
234
|
+
start: SpanPosition;
|
|
235
|
+
end: SpanPosition;
|
|
236
|
+
};
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
const sourceFileAttributeMatches = cause.span.start.file.content.matchAll(
|
|
240
|
+
/data-source-file="(?<file>[^"]*)"/g,
|
|
241
|
+
);
|
|
242
|
+
let closestSourceFileAttribute: RegExpExecArray | undefined;
|
|
243
|
+
for (const sourceFileAttributeMatch of sourceFileAttributeMatches) {
|
|
244
|
+
if (closestSourceFileAttribute === undefined) {
|
|
245
|
+
closestSourceFileAttribute = sourceFileAttributeMatch;
|
|
246
|
+
}
|
|
247
|
+
if (
|
|
248
|
+
Math.abs(sourceFileAttributeMatch.index - cause.span.start.offset) <
|
|
249
|
+
Math.abs(closestSourceFileAttribute.index - cause.span.start.offset)
|
|
250
|
+
) {
|
|
251
|
+
closestSourceFileAttribute = sourceFileAttributeMatch;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const findClosestAttributeValue = (
|
|
256
|
+
attributeName: string,
|
|
257
|
+
): string | undefined => {
|
|
258
|
+
const attributeMatches = cause.span.start.file.content.matchAll(
|
|
259
|
+
new RegExp(`${attributeName}="(?<value>[^"]*)"`, 'g'),
|
|
260
|
+
);
|
|
261
|
+
let closestAttribute: RegExpExecArray | undefined;
|
|
262
|
+
for (const attributeMatch of attributeMatches) {
|
|
263
|
+
if (closestAttribute === undefined) {
|
|
264
|
+
closestAttribute = attributeMatch;
|
|
265
|
+
}
|
|
266
|
+
if (
|
|
267
|
+
Math.abs(attributeMatch.index - cause.span.start.offset) <
|
|
268
|
+
Math.abs(closestAttribute.index - cause.span.start.offset)
|
|
269
|
+
) {
|
|
270
|
+
closestAttribute = attributeMatch;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return closestAttribute?.groups?.value;
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
let stack = convertStackWithSourceMap(
|
|
277
|
+
error.stack,
|
|
278
|
+
templatePath,
|
|
279
|
+
sourceMapToOriginalFile,
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
const sourceFile = findClosestAttributeValue('data-source-file');
|
|
283
|
+
const sourceLine = findClosestAttributeValue('data-source-line');
|
|
284
|
+
if (sourceFile && sourceLine) {
|
|
285
|
+
stack = ` at ${sourceFile}:${sourceLine}\n${stack}`;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return {
|
|
289
|
+
error: {
|
|
290
|
+
name: exception.name,
|
|
291
|
+
message: cause.msg,
|
|
292
|
+
stack,
|
|
293
|
+
cause: error.cause ? JSON.parse(JSON.stringify(cause)) : undefined,
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return {
|
|
299
|
+
error: {
|
|
300
|
+
name: error.name,
|
|
301
|
+
message: error.message,
|
|
302
|
+
stack: convertStackWithSourceMap(
|
|
303
|
+
error.stack,
|
|
304
|
+
templatePath,
|
|
305
|
+
sourceMapToOriginalFile,
|
|
306
|
+
),
|
|
307
|
+
cause: error.cause
|
|
308
|
+
? JSON.parse(JSON.stringify(error.cause))
|
|
309
|
+
: undefined,
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSafeActionClient,
|
|
3
|
+
DEFAULT_SERVER_ERROR_MESSAGE,
|
|
4
|
+
} from 'next-safe-action';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
|
|
7
|
+
export const baseActionClient = createSafeActionClient({
|
|
8
|
+
defineMetadataSchema() {
|
|
9
|
+
return z.object({ actionName: z.string() });
|
|
10
|
+
},
|
|
11
|
+
handleServerError(error, options) {
|
|
12
|
+
console.error(`Action error: ${options.metadata.actionName}`, error);
|
|
13
|
+
return DEFAULT_SERVER_ERROR_MESSAGE;
|
|
14
|
+
},
|
|
15
|
+
});
|