@nuxtjs/prismic 3.0.0-alpha.1 → 3.0.0-alpha.10

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/README.md CHANGED
@@ -32,7 +32,7 @@ npm install --save-dev @nuxtjs/prismic@alpha # or yarn add --dev @nuxtjs/prismic
32
32
  Then, add `@nuxtjs/prismic` to the `modules` section of your Nuxt config and configure your Prismic API endpoint:
33
33
 
34
34
  ```javascript
35
- import { defineNuxtConfig } from 'nuxt3'
35
+ import { defineNuxtConfig } from 'nuxt'
36
36
 
37
37
  export default defineNuxtConfig({
38
38
  modules: ['@nuxtjs/prismic'],
package/dist/module.d.ts CHANGED
@@ -1,10 +1,14 @@
1
1
  import * as _nuxt_schema from '@nuxt/schema';
2
2
  import { PrismicPluginOptions } from '@prismicio/vue';
3
3
 
4
- declare type PrismicModuleOptions = PrismicPluginOptions & {
4
+ declare type PrismicModuleOptions = Omit<PrismicPluginOptions, 'endpoint' | 'client' | 'linkResolver' | 'htmlSerializer'> & {
5
+ endpoint: string;
6
+ client?: string;
7
+ linkResolver?: string;
8
+ htmlSerializer?: string;
5
9
  preview?: string | false;
6
10
  };
7
11
 
8
12
  declare const _default: _nuxt_schema.NuxtModule<PrismicModuleOptions>;
9
13
 
10
- export { _default as default };
14
+ export { PrismicModuleOptions as ModuleOptions, PrismicModuleOptions, _default as default };
package/dist/module.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuxtjs/prismic",
3
- "version": "3.0.0-alpha.1",
3
+ "version": "3.0.0-alpha.10",
4
4
  "configKey": "prismic",
5
5
  "compatibility": {
6
6
  "nuxt": "^3.0.0"
package/dist/module.mjs CHANGED
@@ -1,11 +1,23 @@
1
1
  import { join } from 'path';
2
- import { existsSync } from 'fs';
3
- import { defineNuxtModule, createResolver, addPlugin, addComponent, addAutoImport, extendPages } from '@nuxt/kit';
2
+ import { defineNuxtModule, createResolver, addPlugin, addComponent, addAutoImport, extendPages, addTemplate } from '@nuxt/kit';
3
+ import { cleanDoubleSlashes } from 'ufo';
4
+ import { isRepositoryEndpoint, getRepositoryName } from '@prismicio/client';
4
5
  import * as prismicVue from '@prismicio/vue';
6
+ import { existsSync } from 'fs';
5
7
  import consola from 'consola';
6
8
 
7
9
  const name = "@nuxtjs/prismic";
8
- const version = "3.0.0-alpha.1";
10
+ const version = "3.0.0-alpha.10";
11
+
12
+ const fileExists = (path, extensions = ["js", "ts"]) => {
13
+ if (!path) {
14
+ return null;
15
+ } else if (existsSync(path)) {
16
+ return path;
17
+ }
18
+ const extension = extensions.find((extension2) => existsSync(`${path}.${extension2}`));
19
+ return extension ? `${path}.${extension}` : null;
20
+ };
9
21
 
10
22
  const logger = consola.withScope("nuxt:prismic");
11
23
 
@@ -16,29 +28,49 @@ const module = defineNuxtModule({
16
28
  configKey: "prismic",
17
29
  compatibility: { nuxt: "^3.0.0" }
18
30
  },
19
- defaults: {
31
+ defaults: (nuxt) => ({
20
32
  endpoint: "",
21
33
  clientConfig: {},
22
- linkResolver: void 0,
23
- htmlSerializer: void 0,
34
+ client: cleanDoubleSlashes(`~/${nuxt.options.dir.app}/prismic/client`),
35
+ linkResolver: cleanDoubleSlashes(`~/${nuxt.options.dir.app}/prismic/linkResolver`),
36
+ htmlSerializer: cleanDoubleSlashes(`~/${nuxt.options.dir.app}/prismic/htmlSerializer`),
24
37
  injectComponents: true,
25
- components: {
26
- linkInternalComponent: "nuxt-link"
27
- },
38
+ components: {},
28
39
  preview: "/preview"
29
- },
40
+ }),
30
41
  hooks: {},
31
42
  setup(mergedOptions, nuxt) {
32
43
  var _a, _b, _c;
33
- if (!mergedOptions.client && !mergedOptions.endpoint) {
34
- logger.warn("Options `endpoint` or `client` are required, disabling module...");
44
+ if (!mergedOptions.endpoint) {
45
+ logger.warn("Options `endpoint` is required, disabling module...");
35
46
  return;
36
47
  }
37
48
  const resolver = createResolver(import.meta.url);
38
- nuxt.options.build.transpile.push(resolver.resolve("runtime"));
39
- (_a = nuxt.options).publicRuntimeConfig || (_a.publicRuntimeConfig = {});
40
- nuxt.options.publicRuntimeConfig[name] = mergedOptions;
49
+ nuxt.options.build.transpile.push(resolver.resolve("runtime"), "@nuxtjs/prismic", "@prismicio/vue");
50
+ const proxyUserFileWithUndefinedFallback = (filename, path, extensions = ["js", "mjs", "ts"]) => {
51
+ const resolvedFilename = `prismic/proxy/${filename}.ts`;
52
+ const resolvedPath = path ? path.replace(/^(~~|@@)/, nuxt.options.rootDir).replace(/^(~|@)/, nuxt.options.srcDir) : void 0;
53
+ const maybeUserFile = fileExists(resolvedPath, extensions);
54
+ if (maybeUserFile) {
55
+ logger.info(`Using user-defined \`${filename}\` at \`${maybeUserFile.replace(nuxt.options.srcDir, "~").replace(nuxt.options.rootDir, "~~").replace(/\\/g, "/")}\``);
56
+ addTemplate({
57
+ filename: resolvedFilename,
58
+ getContents: () => `export { default } from '${path}'`
59
+ });
60
+ } else {
61
+ addTemplate({
62
+ filename: resolvedFilename,
63
+ getContents: () => "export default undefined"
64
+ });
65
+ }
66
+ };
67
+ proxyUserFileWithUndefinedFallback("client", mergedOptions.client);
68
+ proxyUserFileWithUndefinedFallback("linkResolver", mergedOptions.linkResolver);
69
+ proxyUserFileWithUndefinedFallback("htmlSerializer", mergedOptions.htmlSerializer);
70
+ (_a = nuxt.options.runtimeConfig).public || (_a.public = {});
71
+ nuxt.options.runtimeConfig.public[name] = mergedOptions;
41
72
  addPlugin(resolver.resolve("runtime/plugin"));
73
+ addPlugin(resolver.resolve("runtime/plugin.client"));
42
74
  if (mergedOptions.injectComponents) {
43
75
  [
44
76
  "PrismicEmbed",
@@ -63,10 +95,15 @@ const module = defineNuxtModule({
63
95
  };
64
96
  });
65
97
  addAutoImport(composableAutoImports);
98
+ addAutoImport({
99
+ name: "usePrismicPreview",
100
+ as: "usePrismicPreview",
101
+ from: resolver.resolve("runtime/usePrismicPreview")
102
+ });
66
103
  if (mergedOptions.preview) {
67
- const userPreviewPagePath = join(nuxt.options.srcDir, nuxt.options.dir.pages, `${mergedOptions.preview}.vue`);
68
- if (existsSync(userPreviewPagePath)) {
69
- logger.info(`Using user-defined preview page at \`${userPreviewPagePath.replace(join(nuxt.options.rootDir), "~~").replace(/\\/g, "/")}\`, available at \`${mergedOptions.preview}\``);
104
+ const maybeUserPreviewPage = fileExists(join(nuxt.options.srcDir, nuxt.options.dir.pages, mergedOptions.preview), ["js", "ts", "vue"]);
105
+ if (maybeUserPreviewPage) {
106
+ logger.info(`Using user-defined preview page at \`${maybeUserPreviewPage.replace(join(nuxt.options.srcDir), "~").replace(nuxt.options.rootDir, "~~").replace(/\\/g, "/")}\`, available at \`${mergedOptions.preview}\``);
70
107
  } else {
71
108
  logger.info(`Using default preview page, available at \`${mergedOptions.preview}\``);
72
109
  extendPages((pages) => {
@@ -77,19 +114,10 @@ const module = defineNuxtModule({
77
114
  });
78
115
  });
79
116
  }
80
- let repositoryName = "";
81
- if (mergedOptions.client) {
82
- repositoryName = new URL(mergedOptions.client.endpoint).host.split(".")[0];
83
- } else {
84
- try {
85
- repositoryName = new URL(mergedOptions.endpoint).host.split(".")[0];
86
- } catch (error) {
87
- repositoryName = mergedOptions.endpoint;
88
- }
89
- }
90
- (_b = nuxt.options).meta || (_b.meta = {});
91
- (_c = nuxt.options.meta).script || (_c.script = []);
92
- nuxt.options.meta.script.push({
117
+ const repositoryName = isRepositoryEndpoint(mergedOptions.endpoint) ? getRepositoryName(mergedOptions.endpoint) : mergedOptions.endpoint;
118
+ (_b = nuxt.options.app).head || (_b.head = {});
119
+ (_c = nuxt.options.app.head).script || (_c.script = []);
120
+ nuxt.options.app.head.script.push({
93
121
  src: `https://static.cdn.prismic.io/prismic.min.js?repo=${repositoryName}&new=true`
94
122
  });
95
123
  }
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,11 @@
1
+ import { defineNuxtPlugin, refreshNuxtData } from "#app";
2
+ const pkgName = "@nuxtjs/prismic";
3
+ export default defineNuxtPlugin((nuxtApp) => {
4
+ const mergedOptions = nuxtApp.payload.config[pkgName] ?? nuxtApp.payload.config.public[pkgName] ?? {};
5
+ if (mergedOptions.preview) {
6
+ window.addEventListener("prismicPreviewUpdate", (event) => {
7
+ event.preventDefault();
8
+ refreshNuxtData();
9
+ });
10
+ }
11
+ });
@@ -1,10 +1,38 @@
1
- import { defineNuxtPlugin } from "#app";
1
+ import { defineNuxtPlugin, useCookie, useRequestEvent, refreshNuxtData } from "#app";
2
+ import NuxtLink from "#app/components/nuxt-link";
2
3
  import { createPrismic } from "@prismicio/vue";
3
- import { name as pkgName } from "../../package.json";
4
+ import client from "#build/prismic/proxy/client";
5
+ import linkResolver from "#build/prismic/proxy/linkResolver";
6
+ import htmlSerializer from "#build/prismic/proxy/htmlSerializer";
7
+ const pkgName = "@nuxtjs/prismic";
4
8
  export default defineNuxtPlugin((nuxtApp) => {
5
- const mergedOptions = nuxtApp.payload.config[pkgName];
6
- nuxtApp.vueApp.use(createPrismic({
9
+ const mergedOptions = nuxtApp.payload.config[pkgName] ?? nuxtApp.payload.config.public[pkgName] ?? {};
10
+ const prismicPlugin = createPrismic({
7
11
  ...mergedOptions,
8
- injectComponents: false
9
- }));
12
+ client,
13
+ linkResolver,
14
+ htmlSerializer,
15
+ injectComponents: false,
16
+ components: {
17
+ linkInternalComponent: NuxtLink,
18
+ linkExternalComponent: NuxtLink,
19
+ ...mergedOptions.components
20
+ }
21
+ });
22
+ nuxtApp.vueApp.use(prismicPlugin);
23
+ if (mergedOptions.preview) {
24
+ const previewCookie = useCookie("io.prismic.preview").value;
25
+ if (process.server) {
26
+ prismicPlugin.client.enableAutoPreviewsFromReq(useRequestEvent()?.req);
27
+ }
28
+ if (previewCookie) {
29
+ try {
30
+ const session = typeof previewCookie === "string" ? JSON.parse(decodeURIComponent(previewCookie)) : previewCookie;
31
+ if (Object.keys(session).some((key) => key in session && typeof session[key] === "object" && session[key] !== null && "preview" in session[key] && session[key].preview)) {
32
+ refreshNuxtData();
33
+ }
34
+ } catch (error) {
35
+ }
36
+ }
37
+ }
10
38
  });
@@ -3,31 +3,22 @@
3
3
  <figure>
4
4
  <img
5
5
  src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDAiIGhlaWdodD0iMzYiPgogIDxwYXRoIGZpbGw9IiMyMTI3MzUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTM1LjUzOCAxOC43NGwtMi42NTUtMi42NmExLjEyNiAxLjEyNiAwIDAgMS0uMzI5LS43OTZ2LTMuMjU2YzAtMy4wMDktLjMxMy00LjEtLjktNS4yYTYuMTI3IDYuMTI3IDAgMCAwLTIuNTQ2LTIuNTUxYy0xLjA5Ny0uNTg5LTIuMTg2LS45MDItNS4xODgtLjkwMmgtNC4yOTVhLjIyNS4yMjUgMCAwIDEtLjE1OC0uMzg0TDIyLjEyMi4zM2MuMjEtLjIxMS40OTYtLjMzLjc5NC0uMzNoMS40OTNjNC4wMDMgMCA1LjQ1NS40MTggNi45MTkgMS4yMDJhOC4xNjkgOC4xNjkgMCAwIDEgMy4zOTQgMy40MDJjLjc4MyAxLjQ2NyAxLjIgMi45MjIgMS4yIDYuOTMzdjcuMDQ1YS4yMjUuMjI1IDAgMCAxLS4zODQuMTU5ek0xNy4yMjIgMzUuNjE3bDIuNjU1LTIuNjYxYy4yMS0uMjExLjQ5Ni0uMzMuNzk0LS4zM2gzLjI0OWMzLjAwMiAwIDQuMDktLjMxMyA1LjE4OC0uOTAyYTYuMTI3IDYuMTI3IDAgMCAwIDIuNTQ2LTIuNTUxYy41ODctMS4xLjktMi4xOTEuOS01LjJ2LTQuMzA0YS4yMjUuMjI1IDAgMCAxIC4zODMtLjE1OWwyLjY1NiAyLjY2MWMuMjEuMjExLjMyOS40OTguMzI5Ljc5NnYxLjQ5N2MwIDQuMDExLS40MTcgNS40NjYtMS4yIDYuOTMzYTguMTY5IDguMTY5IDAgMCAxLTMuMzk0IDMuNDAyQzI5Ljg2NCAzNS41ODIgMjguNDEyIDM2IDI0LjQwOSAzNkgxNy4zOGEuMjI1LjIyNSAwIDAgMS0uMTU4LS4zODR6TS4zODMgMTcuMjU5TDMuMDQgMTkuOTJjLjIxLjIxMS4zMjkuNDk4LjMyOS43OTZ2My4yNTZjMCAzLjAwOS4zMTIgNC4xLjkgNS4yYTYuMTI3IDYuMTI3IDAgMCAwIDIuNTQ1IDIuNTUxYzEuMDk4LjU4OSAyLjE4Ny45MDIgNS4xODkuOTAyaDQuMjk0YS4yMjUuMjI1IDAgMCAxIC4xNi4zODRsLTIuNjU3IDIuNjYxYy0uMjEuMjExLS40OTYuMzMtLjc5My4zM2gtMS40OTRjLTQuMDAzIDAtNS40NTQtLjQxOC02LjkxOC0xLjIwMkE4LjE2OSA4LjE2OSAwIDAgMSAxLjIgMzEuMzk2Qy40MTcgMjkuOTI5IDAgMjguNDc0IDAgMjQuNDYzdi03LjA0NWEuMjI1LjIyNSAwIDAgMSAuMzgzLS4xNTl6TTE2LjA0NSAzLjA0NWMtLjIxMS4yMTEtLjQ5Ni4zMy0uNzk0LjMzaC0zLjI0OWMtMy4wMDIgMC00LjA5MS4zMTMtNS4xODkuOTAyYTYuMTI3IDYuMTI3IDAgMCAwLTIuNTQ2IDIuNTUxYy0uNTg3IDEuMS0uOSAyLjE5MS0uOSA1LjJ2NC4zMDRhLjIyNS4yMjUgMCAwIDEtLjM4My4xNTlMLjMzIDEzLjgzQTEuMTI2IDEuMTI2IDAgMCAxIDAgMTMuMDM0di0xLjQ5N2MwLTQuMDExLjQxNy01LjQ2NiAxLjItNi45MzNhOC4xNjkgOC4xNjkgMCAwIDEgMy4zOTQtMy40MDJDNi4wNTguNDE4IDcuNTEgMCAxMS41MTIgMGg3LjAzYS4yMjUuMjI1IDAgMCAxIC4xNTguMzg0bC0yLjY1NSAyLjY2MXptMTMuODg0IDEwLjA5MWwtMy42Mi0zLjQ2OGMtLjI0LS4yNC0uNTItLjQxNC0uODE5LS41MjNBMi4yMzYgMi4yMzYgMCAwIDAgMjQuNjk2IDlIMTQuMDFhLjIyNS4yMjUgMCAwIDEtLjE1OS0uMzg0bDIuNjU5LTIuNjYyYy4yMS0uMjEuNDk1LS4zMjkuNzkzLS4zMjloOC41MTZjMi40OCAwIDQuNDkgMi4wMTUgNC40OSA0LjV2Mi44NDlhLjIyNS4yMjUgMCAwIDEtLjM4LjE2MnptLTcuMTE1IDE2Ljg2MWwzLjQ2LTMuNjI5Yy4yNC0uMjQuNDE0LS41Mi41MjMtLjgyYTIuMjUgMi4yNSAwIDAgMCAuMTQ0LS43OTV2LTEwLjcxYS4yMjUuMjI1IDAgMCAxIC4zODQtLjE1OWwyLjY1NiAyLjY2NGMuMjEuMjExLjMyOC40OTcuMzI4Ljc5NnY4LjUzNGMwIDIuNDg1LTIuMDEgNC41LTQuNDkgNC41aC0yLjg0M2EuMjI1LjIyNSAwIDAgMS0uMTYyLS4zOHpNNS45OTIgMjIuODY0bDMuNjIyIDMuNDY4Yy4yMzkuMjQuNTIuNDE0LjgxOC41MjMuMjQ2LjA5NC41MTQuMTQ1Ljc5NC4xNDVoMTAuNjg2YS4yMjUuMjI1IDAgMCAxIC4xNTguMzg0bC0yLjY1OCAyLjY2MmMtLjIxLjIxLS40OTYuMzI5LS43OTMuMzI5aC04LjUxNmE0LjQ5NSA0LjQ5NSAwIDAgMS00LjQ5LTQuNXYtMi44NDlhLjIyNS4yMjUgMCAwIDEgLjM4LS4xNjJ6bTcuMTE2LTE2Ljg1OWwtMy40NjEgMy42M2MtLjI0LjI0LS40MTMuNTItLjUyMi44MmEyLjI1IDIuMjUgMCAwIDAtLjE0NS43OTV2MTAuNzFhLjIyNS4yMjUgMCAwIDEtLjM4My4xNThsLTIuNjU2LTIuNjY0YTEuMTI2IDEuMTI2IDAgMCAxLS4zMjgtLjc5NXYtOC41MzRjMC0yLjQ4NSAyLjAxLTQuNSA0LjQ5LTQuNWgyLjg0M2EuMjI1LjIyNSAwIDAgMSAuMTYyLjM4em0zMy4xMDUgNC4zNzloLjg2OGMuNTkzIDAgMS4wNzQuNDggMS4wNzQgMS4wNzR2MS4wMTZjMCAuMDMyLjAyNi4wNTcuMDU3LjA1Ny40OTUtLjg3NSAxLjE2LTEuNTEgMS45OTgtMS45MDlhNi4yMzYgNi4yMzYgMCAwIDEgMi43MS0uNTk2YzEuMDQ3IDAgMS45ODkuMTk0IDIuODI2LjU4Mi44MzcuMzg3IDEuNTUuOTIgMi4xNCAxLjU5NWE2Ljg5NiA2Ljg5NiAwIDAgMSAxLjM0IDIuMzg2Yy4zMDUuOTE1LjQ1NyAxLjkuNDU3IDIuOTUzYTguNzk1IDguNzk1IDAgMCAxLS40ODUgMi45NTMgNy40MTggNy40MTggMCAwIDEtMS4zNTUgMi4zODYgNi4yNjkgNi4yNjkgMCAwIDEtMi4wOTcgMS41OTUgNi4xODIgNi4xODIgMCAwIDEtMi42ODMuNTgyYy0uNjQ3IDAtMS4yMTctLjA3LTEuNzEyLS4yMDlhNS43NTEgNS43NTEgMCAwIDEtMS4zMTItLjUzNyA1LjI1MiA1LjI1MiAwIDAgMS0uOTctLjcgNS4wMTIgNS4wMTIgMCAwIDEtLjY1Ny0uNzMxLjA4Ni4wODYgMCAwIDAtLjA4Ni4wODV2Ny4yMjRhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwM2ExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0xMC4wNDYgNy4xNThjMC0uNTU3LS4wOS0xLjA5NC0uMjctMS42MWE0LjA3OCA0LjA3OCAwIDAgMC0uOC0xLjM3MyAzLjk5IDMuOTkgMCAwIDAtMS4yNy0uOTU0Yy0uNDk0LS4yMzktMS4wNTUtLjM1OC0xLjY4My0uMzU4LS42MjggMC0xLjE5LjEyLTEuNjg0LjM1OGEzLjk5IDMuOTkgMCAwIDAtMS4yNy45NTQgNC4wNzggNC4wNzggMCAwIDAtLjc5OSAxLjM3MiA0Ljg0NSA0Ljg0NSAwIDAgMC0uMjcgMS42MWMwIC41NTguMDkgMS4wOTQuMjcgMS42MTEuMTgxLjUxNy40NDcuOTc1LjggMS4zNzJhMy45OSAzLjk5IDAgMCAwIDEuMjcuOTU1Yy40OTQuMjM4IDEuMDU1LjM1OCAxLjY4My4zNTguNjI4IDAgMS4xODktLjEyIDEuNjgzLS4zNThhMy45OSAzLjk5IDAgMCAwIDEuMjctLjk1NWMuMzUyLS4zOTcuNjE4LS44NTUuOC0xLjM3Mi4xOC0uNTE3LjI3LTEuMDUzLjI3LTEuNjF6bTguMzU5LTcuMTU4aC45OGMuNjI2IDAgMS4xMzQuNTA3IDEuMTM0IDEuMTMzdjEuMDc3YzAgLjAzMS4wMjUuMDU3LjA1Ny4wNTcuMzgtLjgzNi45MjItMS40ODIgMS42MjYtMS45MzkuNzA0LS40NTcgMS41MTMtLjY4NiAyLjQyNi0uNjg2LjIwOSAwIC40MTQuMDIuNjEzLjA2YS43NjIuNzYyIDAgMCAxIC42MTQuNzQ3djEuOTY0YS43MTUuNzE1IDAgMCAxLS44NDIuNzA0IDQuNTggNC41OCAwIDAgMC0uODEzLS4wNzVjLS44IDAtMS40NDEuMTU0LTEuOTI2LjQ2Mi0uNDg1LjMwOS0uODU2LjY2MS0xLjExMyAxLjA2YTMuNiAzLjYgMCAwIDAtLjUxNCAxLjE5MmMtLjA4Ni4zOTgtLjEyOC42OTYtLjEyOC44OTV2Ni4zNTVhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwNGExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0xMS41ODUgMGguODA0Yy43MjMgMCAxLjMxLjU4NyAxLjMxIDEuMzFWMjMuMzlhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwNGExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0tMS43OTUtNC44NjJjMC0uNTc2LjIwNC0xLjA3OC42MTMtMS41MDYuNDEtLjQyNy45MjgtLjY0MSAxLjU1NS0uNjQxLjYyOCAwIDEuMTU2LjIwNCAxLjU4NC42MTEuNDI4LjQwOC42NDIuOTIuNjQyIDEuNTM2IDAgLjYxNy0uMjE0IDEuMTI5LS42NDIgMS41MzYtLjQyOC40MDgtLjk1Ni42MTItMS41ODQuNjEyLS42MjcgMC0xLjE0Ni0uMjE0LTEuNTU1LS42NDFhMi4xMDggMi4xMDggMCAwIDEtLjYxMy0xLjUwN3ptMTQuNzUzIDguMTMzYy0uNjk1LS41MS0xLjMxNC0uNzY2LTEuODU1LS43NjYtLjQ1NyAwLS45MDQuMTItMS4zNDIuMzU4LS40MzcuMjM5LS42NTYuNjI2LS42NTYgMS4xNjMgMCAuNDM4LjE4Ljc1Ni41NDIuOTU1LjM2Mi4xOTguODE4LjM2OCAxLjM3LjUwNy41NTIuMTM5IDEuMTQ2LjI4MyAxLjc4My40MzIuNjM4LjE1IDEuMjMyLjM3OCAxLjc4NC42ODYuNTUyLjMwOCAxLjAwOC43MyAxLjM3IDEuMjY4LjM2MS41MzcuNTQyIDEuMjcyLjU0MiAyLjIwNyAwIC44NTUtLjE3NiAxLjU3NS0uNTI4IDIuMTYyYTQuMjQxIDQuMjQxIDAgMCAxLTEuMzcgMS40MTcgNS45MjcgNS45MjcgMCAwIDEtMS44OTcuNzc1IDkuNTUzIDkuNTUzIDAgMCAxLTIuMTEyLjIzOWMtMS4wNjUgMC0yLjA0NS0uMTYtMi45NC0uNDc3LS4zNS0uMTI1LS43Ny0uMzc1LTEuMjYtLjc1MWExLjMxIDEuMzEgMCAwIDEtLjExOS0xLjk3NmwuMzU1LS4zNDhhMS4zMSAxLjMxIDAgMCAxIDEuNzgzLS4wNDhjLjIwOC4xODMuMzg4LjMyNC41NC40MjMuNTA0LjMyOSAxLjExOC40OTMgMS44NC40OTMuMjQ4IDAgLjUwNS0uMDMuNzcxLS4wOS4yNjctLjA2LjUxNC0uMTU5Ljc0Mi0uMjk4LjIyOC0uMTQuNDE0LS4zMTMuNTU3LS41MjIuMTQyLS4yMDkuMjE0LS40NTIuMjE0LS43MyAwLS40OTgtLjE4MS0uODY2LS41NDMtMS4xMDQtLjM2MS0uMjM5LS44MTgtLjQzMy0xLjM3LS41ODJhMjguNzQ2IDI4Ljc0NiAwIDAgMC0xLjc4My0uNDE3IDYuNzA3IDYuNzA3IDAgMCAxLTEuNzgzLS42MjcgMy43OTUgMy43OTUgMCAwIDEtMS4zNy0xLjIwOGMtLjM2MS0uNTE3LS41NDItMS4yMzMtLjU0Mi0yLjE0NyAwLS43OTUuMTU3LTEuNDg2LjQ3LTIuMDczYTQuMjY1IDQuMjY1IDAgMCAxIDEuMjQyLTEuNDQ2IDUuMjU2IDUuMjU2IDAgMCAxIDEuNzctLjgzNiA3Ljc3MyA3Ljc3MyAwIDAgMSAyLjAyNS0uMjY4Yy45MTMgMCAxLjgxNy4xNjQgMi43MTEuNDkyLjMyNC4xMTkuNjg1LjMzOSAxLjA4NC42NmExLjMxIDEuMzEgMCAwIDEgLjA3NSAxLjk3NWwtLjQyNi40MDFhMS4zMSAxLjMxIDAgMCAxLTEuNjc0LjEwMXptNy43ODctMy4yNzFoLjYzM2MuNzIzIDAgMS4zMS41ODcgMS4zMSAxLjMxdi45MjdhNS42MDIgNS42MDIgMCAwIDEgMS41MjctMS44MDVjLjY3NS0uNTI3IDEuNTgzLS43OSAyLjcyNS0uNzkgMi4xNSAwIDMuNTc2Ljg4NSA0LjI4IDIuNjU0LjQ5NS0uOTE0IDEuMTEzLTEuNTg1IDEuODU1LTIuMDEzLjc0Mi0uNDI3IDEuNjI2LS42NDEgMi42NTQtLjY0MS45MTMgMCAxLjY4My4xNTkgMi4zMTEuNDc3YTQuMDg0IDQuMDg0IDAgMCAxIDEuNTI3IDEuMzEyYy4zOS41NTcuNjcgMS4yMDguODQxIDEuOTU0LjE3Mi43NDYuMjU3IDEuNTQ2LjI1NyAyLjR2Ny4yMmExLjMxIDEuMzEgMCAwIDEtMS4zMSAxLjMxaC0uODA0YTEuMzEgMS4zMSAwIDAgMS0xLjMxLTEuMzF2LTYuODAyYzAtLjQzNy0uMDM4LS44Ni0uMTE0LTEuMjY3YTMuMTExIDMuMTExIDAgMCAwLS40LTEuMDc0IDIuMDYyIDIuMDYyIDAgMCAwLS43Ny0uNzNjLS4zMjQtLjE4LS43NDItLjI2OS0xLjI1Ni0uMjY5LS41MzIgMC0uOTg0LjEwNC0xLjM1NS4zMTNhMi42ODYgMi42ODYgMCAwIDAtLjkxMy44MzUgMy41MDggMy41MDggMCAwIDAtLjUxNCAxLjE5MyA1Ljk0IDUuOTQgMCAwIDAtLjE1NyAxLjM1N3Y2LjQ0NWExLjMxIDEuMzEgMCAwIDEtMS4zMSAxLjMxaC0uODA0YTEuMzEgMS4zMSAwIDAgMS0xLjMxLTEuMzF2LTcuMjJjMC0uODk1LS4xOC0xLjYwNi0uNTQyLTIuMTMzLS4zNjItLjUyNi0uOTYtLjc5LTEuNzk4LS43OS0uNTcgMC0xLjA1MS4xLTEuNDQxLjI5OC0uMzkuMi0uNzEzLjQ2OC0uOTcuODA2YTMuMjYgMy4yNiAwIDAgMC0uNTU3IDEuMTYzIDUuNDEzIDUuNDEzIDAgMCAwLS4xNyAxLjM3MnY2LjUwNGExLjMxIDEuMzEgMCAwIDEtMS4zMTEgMS4zMWgtLjgwNGExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg3LTEuMzEgMS4zMS0xLjMxem0yNS40NTQgMGguODAzYy43MjQgMCAxLjMxLjU4NyAxLjMxIDEuMzFWMjMuMzlhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwM2ExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0tMS43OTYtNC44NjJjMC0uNTc2LjIwNS0xLjA3OC42MTQtMS41MDYuNDA5LS40MjcuOTI3LS42NDEgMS41NTUtLjY0MS42MjggMCAxLjE1Ni4yMDQgMS41ODQuNjExLjQyOC40MDguNjQyLjkyLjY0MiAxLjUzNiAwIC42MTctLjIxNCAxLjEyOS0uNjQyIDEuNTM2LS40MjguNDA4LS45NTYuNjEyLTEuNTg0LjYxMi0uNjI4IDAtMS4xNDYtLjIxNC0xLjU1NS0uNjQxYTIuMTA4IDIuMTA4IDAgMCAxLS42MTQtMS41MDd6bTE2Ljc1MSA4LjM3M2EzLjU2NCAzLjU2NCAwIDAgMC0uMzcxLS4yNiAyLjYwNyAyLjYwNyAwIDAgMC0xLjM0Mi0uMzg4Yy0uNjI3IDAtMS4xODkuMTItMS42ODMuMzU4YTMuOTkgMy45OSAwIDAgMC0xLjI3Ljk1NCA0LjA3OCA0LjA3OCAwIDAgMC0uNzk5IDEuMzcyIDQuODQ1IDQuODQ1IDAgMCAwLS4yNzEgMS42MWMwIC41NTguMDkgMS4wOTQuMjcxIDEuNjExLjE4LjUxNy40NDcuOTc1LjggMS4zNzJhMy45OSAzLjk5IDAgMCAwIDEuMjY5Ljk1NWMuNDk0LjIzOCAxLjA1Ni4zNTggMS42ODMuMzU4LjUzMyAwIDEuMDI4LS4xMTUgMS40ODQtLjM0My4wOTMtLjA0Ny4xOTMtLjExLjMtLjE4OWExLjMxIDEuMzEgMCAwIDEgMS43NTYuMTg1bC41Mi41ODRhMS4yNDggMS4yNDggMCAwIDEtLjMwNyAxLjkxIDcuOTggNy45OCAwIDAgMS0yLjY2OC45N2MtLjQxOS4wNjktLjc4LjEwNC0xLjA4NS4xMDRhNy45MDQgNy45MDQgMCAwIDEtMi45MS0uNTM3QTYuOTM4IDYuOTM4IDAgMCAxIDEzMC4zNjUgMjNhNy4yMyA3LjIzIDAgMCAxLTEuNTgzLTIuMzcxYy0uMzktLjkyNS0uNTg1LTEuOTU0LS41ODUtMy4wODcgMC0xLjEzMy4xOTUtMi4xNjIuNTg1LTMuMDg3YTcuMjMgNy4yMyAwIDAgMSAxLjU4My0yLjM3MSA2LjkzOCA2LjkzOCAwIDAgMSAyLjM2OS0xLjUyMSA3LjkwNCA3LjkwNCAwIDAgMSAyLjkxLS41MzdjLjg3NiAwIDEuNzU1LjE3NCAyLjY0LjUyMi4zMzcuMTMzLjczNS4zNyAxLjE5My43MTFhMS4zMSAxLjMxIDAgMCAxIC4xNjQgMS45NTdsLS41My41NTNhMS4zMSAxLjMxIDAgMCAxLTEuNzU0LjEyNnoiLz4KPC9zdmc+"
6
- alt="Prismic"
7
- >
8
- <figcaption>Loading preview...</figcaption>
6
+ alt="Prismic">
7
+ <figcaption>
8
+ Loading preview...
9
+ </figcaption>
9
10
  </figure>
10
11
  </section>
11
12
  </template>
12
13
 
13
14
  <script setup>
14
- import { onMounted } from 'vue'
15
+ import { useHead, usePrismicPreview } from '#imports'
15
16
 
16
- useMeta({
17
+ useHead({
17
18
  title: 'Prismic Preview - Loading'
18
19
  })
19
20
 
20
- // TODO: refactor into simple hook
21
- const { client, options: { linkResolver } } = usePrismic()
22
- const { push } = useRouter()
23
- onMounted(async () => {
24
- const redirectURL = await client.resolvePreviewURL({
25
- linkResolver,
26
- defaultURL: '/'
27
- })
28
-
29
- push(redirectURL ?? '/')
30
- })
21
+ usePrismicPreview()
31
22
  </script>
32
23
 
33
24
  <style scoped>
@@ -37,14 +28,15 @@ onMounted(async () => {
37
28
  position: fixed;
38
29
  top: 0;
39
30
  left: 0;
40
- display: flex;
31
+ display: flex;
41
32
  justify-content: center;
42
33
  align-items: center;
43
34
  background: #ffffff;
44
- color: #666666;
45
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
46
- font-size: 1rem;
47
- text-align: center;
35
+ color: #666666;
36
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
37
+ Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
38
+ font-size: 1rem;
39
+ text-align: center;
48
40
  }
49
41
 
50
42
  img {
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resolves Prismic previews on the preview entry page (`/preview`)
3
+ *
4
+ * @param defaultURL - The default URL to redirect to if the previewed document doesn't map to one.
5
+ */
6
+ export declare const usePrismicPreview: (defaultURL?: string) => void;
@@ -0,0 +1,13 @@
1
+ import { onMounted } from "vue";
2
+ import { useRouter, usePrismic } from "#imports";
3
+ export const usePrismicPreview = (defaultURL = "/") => {
4
+ const { client, options: { linkResolver } } = usePrismic();
5
+ const { push } = useRouter();
6
+ onMounted(async () => {
7
+ const redirectURL = await client.resolvePreviewURL({
8
+ linkResolver,
9
+ defaultURL
10
+ });
11
+ push(redirectURL);
12
+ });
13
+ };
package/dist/types.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
 
2
- import { } from './module'
2
+ import { ModuleOptions } from './module'
3
3
 
4
+ declare module '@nuxt/schema' {
5
+ interface NuxtConfig { ['prismic']?: Partial<ModuleOptions> }
6
+ interface NuxtOptions { ['prismic']?: ModuleOptions }
7
+ }
4
8
 
5
9
 
6
10
  export { default } from './module'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuxtjs/prismic",
3
- "version": "3.0.0-alpha.1",
3
+ "version": "3.0.0-alpha.10",
4
4
  "description": "Easily connect your Nuxt 3 application to your content hosted on Prismic",
5
5
  "keywords": [
6
6
  "nuxt",
@@ -22,6 +22,7 @@
22
22
  "require": "./dist/module.cjs",
23
23
  "import": "./dist/module.mjs"
24
24
  },
25
+ "./runtime/*": "./dist/runtime/*",
25
26
  "./package.json": "./package.json"
26
27
  },
27
28
  "main": "dist/module.cjs",
@@ -36,34 +37,31 @@
36
37
  "dev": "nuxi dev playground",
37
38
  "dev:build": "nuxi build playground",
38
39
  "lint": "eslint --ext .js,.ts .",
39
- "playground:build": "nuxi build playground",
40
- "playground:dev": "nuxi dev playground",
41
40
  "prepare": "nuxi prepare playground && npm run build",
42
41
  "release": "npm run build && npm run test && standard-version && git push --follow-tags && npm run build && npm publish",
43
42
  "release:alpha": "npm run build && npm run test && standard-version --release-as major --prerelease alpha && git push --follow-tags && npm run build && npm publish --tag alpha",
44
43
  "release:alpha:dry": "standard-version --release-as major --prerelease alpha --dry-run",
45
44
  "release:dry": "standard-version --dry-run",
46
45
  "test": "npm run lint && npm run unit",
47
- "unit": "nyc --reporter=lcovonly --reporter=text --exclude-after-remap=false ava"
46
+ "unit": "echo \"TODO: vitest & nuxt-test-utils\""
48
47
  },
49
48
  "dependencies": {
50
- "@nuxt/kit": "npm:@nuxt/kit-edge@latest",
49
+ "@nuxt/kit": "^3.0.0-rc",
50
+ "@prismicio/client": "^6.6.1",
51
51
  "@prismicio/vue": "^3.0.0-beta",
52
- "consola": "^2.15.3"
52
+ "consola": "^2.15.3",
53
+ "ufo": "^0.8.4"
53
54
  },
54
55
  "devDependencies": {
55
56
  "@nuxt/module-builder": "latest",
56
57
  "@nuxtjs/eslint-config-typescript": "latest",
57
- "ava": "^3.15.0",
58
- "eslint": "^8.9.0",
59
- "nuxt3": "latest",
60
- "nyc": "^15.1.0",
61
- "standard-version": "^9.3.2",
62
- "ts-eager": "^2.0.2",
63
- "typescript": "^4.5.5"
58
+ "eslint": "^8.18.0",
59
+ "nuxt": "^3.0.0-rc",
60
+ "standard-version": "^9.5.0",
61
+ "typescript": "^4.7.4"
64
62
  },
65
63
  "engines": {
66
- "node": ">=12.7.0"
64
+ "node": ">=14.15.0"
67
65
  },
68
66
  "publishConfig": {
69
67
  "access": "public"
package/src/module.ts CHANGED
@@ -1,13 +1,29 @@
1
1
  import { join } from 'path'
2
- import { existsSync } from 'fs'
3
- import { defineNuxtModule, createResolver, addPlugin, addAutoImport, addComponent, extendPages } from '@nuxt/kit'
4
2
 
3
+ import {
4
+ defineNuxtModule,
5
+ createResolver,
6
+ addTemplate,
7
+ addPlugin,
8
+ addAutoImport,
9
+ addComponent,
10
+ extendPages
11
+ } from '@nuxt/kit'
12
+ import { cleanDoubleSlashes } from 'ufo'
13
+
14
+ import { isRepositoryEndpoint, getRepositoryName } from '@prismicio/client'
5
15
  import * as prismicVue from '@prismicio/vue'
6
16
 
7
17
  import { name as pkgName, version as pkgVersion } from '../package.json'
8
- import { PrismicModuleOptions } from './types'
18
+ import type { PrismicModuleOptions } from './types'
19
+ import { fileExists } from './utils'
9
20
  import { logger } from './logger'
10
21
 
22
+ // Options export
23
+ export type { PrismicModuleOptions } from './types'
24
+ export type { PrismicModuleOptions as ModuleOptions } from './types'
25
+
26
+ // Module export
11
27
  export default defineNuxtModule<PrismicModuleOptions>({
12
28
  meta: {
13
29
  name: pkgName,
@@ -15,34 +31,62 @@ export default defineNuxtModule<PrismicModuleOptions>({
15
31
  configKey: 'prismic',
16
32
  compatibility: { nuxt: '^3.0.0' }
17
33
  },
18
- defaults: {
34
+ defaults: nuxt => ({
19
35
  endpoint: '',
20
36
  clientConfig: {},
21
- linkResolver: undefined,
22
- htmlSerializer: undefined,
37
+ client: cleanDoubleSlashes(`~/${nuxt.options.dir.app}/prismic/client`),
38
+ linkResolver: cleanDoubleSlashes(`~/${nuxt.options.dir.app}/prismic/linkResolver`),
39
+ htmlSerializer: cleanDoubleSlashes(`~/${nuxt.options.dir.app}/prismic/htmlSerializer`),
23
40
  injectComponents: true,
24
- components: {
25
- linkInternalComponent: 'nuxt-link'
26
- },
41
+ components: {},
27
42
  preview: '/preview'
28
- },
43
+ }),
29
44
  hooks: {},
30
45
  setup (mergedOptions, nuxt) {
31
- if (!mergedOptions.client && !mergedOptions.endpoint) {
32
- logger.warn('Options `endpoint` or `client` are required, disabling module...')
46
+ if (!mergedOptions.endpoint) {
47
+ logger.warn('Options `endpoint` is required, disabling module...')
33
48
  return
34
49
  }
35
50
 
36
51
  // Runtime dir boilerplate
37
52
  const resolver = createResolver(import.meta.url)
38
- nuxt.options.build.transpile.push(resolver.resolve('runtime'))
53
+ nuxt.options.build.transpile.push(resolver.resolve('runtime'), '@nuxtjs/prismic', '@prismicio/vue')
54
+
55
+ // Add runtime user code
56
+ const proxyUserFileWithUndefinedFallback = (filename: string, path?: string, extensions = ['js', 'mjs', 'ts']) => {
57
+ const resolvedFilename = `prismic/proxy/${filename}.ts`
58
+ const resolvedPath = path
59
+ ? path.replace(/^(~~|@@)/, nuxt.options.rootDir).replace(/^(~|@)/, nuxt.options.srcDir)
60
+ : undefined
61
+ const maybeUserFile = fileExists(resolvedPath, extensions)
62
+
63
+ if (maybeUserFile) {
64
+ // If user file exists, proxy it with vfs
65
+ logger.info(`Using user-defined \`${filename}\` at \`${maybeUserFile.replace(nuxt.options.srcDir, '~').replace(nuxt.options.rootDir, '~~').replace(/\\/g, '/')}\``)
66
+
67
+ addTemplate({
68
+ filename: resolvedFilename,
69
+ getContents: () => `export { default } from '${path}'`
70
+ })
71
+ } else {
72
+ // Else provide `undefined` fallback
73
+ addTemplate({
74
+ filename: resolvedFilename,
75
+ getContents: () => 'export default undefined'
76
+ })
77
+ }
78
+ }
79
+ proxyUserFileWithUndefinedFallback('client', mergedOptions.client)
80
+ proxyUserFileWithUndefinedFallback('linkResolver', mergedOptions.linkResolver)
81
+ proxyUserFileWithUndefinedFallback('htmlSerializer', mergedOptions.htmlSerializer)
39
82
 
40
83
  // Expose options through public runtime config
41
- nuxt.options.publicRuntimeConfig ||= {}
42
- nuxt.options.publicRuntimeConfig[pkgName] = mergedOptions
84
+ nuxt.options.runtimeConfig.public ||= {} as typeof nuxt.options.runtimeConfig.public
85
+ nuxt.options.runtimeConfig.public[pkgName] = mergedOptions
43
86
 
44
87
  // Add plugin
45
88
  addPlugin(resolver.resolve('runtime/plugin'))
89
+ addPlugin(resolver.resolve('runtime/plugin.client'))
46
90
 
47
91
  // Add components auto import
48
92
  if (mergedOptions.injectComponents) {
@@ -74,14 +118,18 @@ export default defineNuxtModule<PrismicModuleOptions>({
74
118
  }
75
119
  })
76
120
  addAutoImport(composableAutoImports)
121
+ addAutoImport({
122
+ name: 'usePrismicPreview',
123
+ as: 'usePrismicPreview',
124
+ from: resolver.resolve('runtime/usePrismicPreview')
125
+ })
77
126
 
78
127
  // Add preview route
79
128
  if (mergedOptions.preview) {
80
- const userPreviewPagePath = join(nuxt.options.srcDir, nuxt.options.dir.pages, `${mergedOptions.preview}.vue`)
129
+ const maybeUserPreviewPage = fileExists(join(nuxt.options.srcDir, nuxt.options.dir.pages, mergedOptions.preview), ['js', 'ts', 'vue'])
81
130
 
82
- if (existsSync(userPreviewPagePath)) {
83
- logger.info(`Using user-defined preview page at \`${
84
- userPreviewPagePath.replace(join(nuxt.options.rootDir), '~~').replace(/\\/g, '/')
131
+ if (maybeUserPreviewPage) {
132
+ logger.info(`Using user-defined preview page at \`${maybeUserPreviewPage.replace(join(nuxt.options.srcDir), '~').replace(nuxt.options.rootDir, '~~').replace(/\\/g, '/')
85
133
  }\`, available at \`${mergedOptions.preview}\``)
86
134
  } else {
87
135
  logger.info(`Using default preview page, available at \`${mergedOptions.preview}\``)
@@ -95,22 +143,13 @@ export default defineNuxtModule<PrismicModuleOptions>({
95
143
  })
96
144
  }
97
145
 
98
- // TODO: Refactor with new client helpers
99
- let repositoryName = ''
100
- if (mergedOptions.client) {
101
- repositoryName = new URL(mergedOptions.client.endpoint).host.split('.')[0]
102
- } else {
103
- try {
104
- repositoryName = new URL(mergedOptions.endpoint).host.split('.')[0]
105
- } catch (error) {
106
- repositoryName = mergedOptions.endpoint
107
- }
108
- }
109
-
110
146
  // Add toolbar
111
- nuxt.options.meta ||= {}
112
- nuxt.options.meta.script ||= []
113
- nuxt.options.meta.script.push({
147
+ const repositoryName = isRepositoryEndpoint(mergedOptions.endpoint)
148
+ ? getRepositoryName(mergedOptions.endpoint)
149
+ : mergedOptions.endpoint
150
+ nuxt.options.app.head ||= {}
151
+ nuxt.options.app.head.script ||= []
152
+ nuxt.options.app.head.script.push({
114
153
  src: `https://static.cdn.prismic.io/prismic.min.js?repo=${repositoryName}&new=true`
115
154
  })
116
155
  }
@@ -0,0 +1,22 @@
1
+ import { defineNuxtPlugin, refreshNuxtData } from '#app'
2
+
3
+ // import { name as pkgName } from '../../package.json'
4
+ import { PrismicModuleOptions } from '../types'
5
+
6
+ // TODO: Revert when fixed
7
+ const pkgName = '@nuxtjs/prismic'
8
+
9
+ export default defineNuxtPlugin((nuxtApp) => {
10
+ const mergedOptions: PrismicModuleOptions =
11
+ nuxtApp.payload.config[pkgName] ??
12
+ nuxtApp.payload.config.public[pkgName] ??
13
+ {}
14
+
15
+ // Hot reload preview updates
16
+ if (mergedOptions.preview) {
17
+ window.addEventListener('prismicPreviewUpdate', (event) => {
18
+ event.preventDefault()
19
+ refreshNuxtData()
20
+ })
21
+ }
22
+ })
@@ -1,14 +1,66 @@
1
- import { defineNuxtPlugin } from '#app'
1
+ import { defineNuxtPlugin, useCookie, useRequestEvent, refreshNuxtData } from '#app'
2
+ import NuxtLink from '#app/components/nuxt-link'
3
+
2
4
  import { createPrismic } from '@prismicio/vue'
3
5
 
4
- import { name as pkgName } from '../../package.json'
6
+ // import { name as pkgName } from '../../package.json'
5
7
  import { PrismicModuleOptions } from '../types'
6
8
 
9
+ // @ts-expect-error vfs cannot be resolved here
10
+ import client from '#build/prismic/proxy/client'
11
+ // @ts-expect-error vfs cannot be resolved here
12
+ import linkResolver from '#build/prismic/proxy/linkResolver'
13
+ // @ts-expect-error vfs cannot be resolved here
14
+ import htmlSerializer from '#build/prismic/proxy/htmlSerializer'
15
+
16
+ // TODO: Revert when fixed
17
+ const pkgName = '@nuxtjs/prismic'
18
+
7
19
  export default defineNuxtPlugin((nuxtApp) => {
8
- const mergedOptions: PrismicModuleOptions = nuxtApp.payload.config[pkgName]
20
+ const mergedOptions: PrismicModuleOptions =
21
+ nuxtApp.payload.config[pkgName] ??
22
+ nuxtApp.payload.config.public[pkgName] ??
23
+ {}
9
24
 
10
- nuxtApp.vueApp.use(createPrismic({
25
+ const prismicPlugin = createPrismic({
11
26
  ...mergedOptions,
12
- injectComponents: false // Handled at module level
13
- }))
27
+ client,
28
+ linkResolver,
29
+ htmlSerializer,
30
+ injectComponents: false, // Handled at module level
31
+ components: {
32
+ linkInternalComponent: NuxtLink,
33
+ linkExternalComponent: NuxtLink,
34
+ ...mergedOptions.components
35
+ }
36
+ })
37
+
38
+ nuxtApp.vueApp.use(prismicPlugin)
39
+
40
+ if (mergedOptions.preview) {
41
+ const previewCookie = useCookie('io.prismic.preview').value
42
+
43
+ // Update client with req when running server side
44
+ if (process.server) {
45
+ prismicPlugin.client.enableAutoPreviewsFromReq(useRequestEvent()?.req)
46
+ }
47
+
48
+ if (previewCookie) {
49
+ try {
50
+ const session = typeof previewCookie === 'string' ? JSON.parse(decodeURIComponent(previewCookie)) : previewCookie
51
+
52
+ if (Object.keys(session).some(key =>
53
+ key in session &&
54
+ typeof session[key] === 'object' &&
55
+ session[key] !== null &&
56
+ 'preview' in session[key] &&
57
+ session[key].preview)
58
+ ) {
59
+ refreshNuxtData()
60
+ }
61
+ } catch (error) {
62
+ // noop
63
+ }
64
+ }
65
+ }
14
66
  })
@@ -3,31 +3,22 @@
3
3
  <figure>
4
4
  <img
5
5
  src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDAiIGhlaWdodD0iMzYiPgogIDxwYXRoIGZpbGw9IiMyMTI3MzUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTM1LjUzOCAxOC43NGwtMi42NTUtMi42NmExLjEyNiAxLjEyNiAwIDAgMS0uMzI5LS43OTZ2LTMuMjU2YzAtMy4wMDktLjMxMy00LjEtLjktNS4yYTYuMTI3IDYuMTI3IDAgMCAwLTIuNTQ2LTIuNTUxYy0xLjA5Ny0uNTg5LTIuMTg2LS45MDItNS4xODgtLjkwMmgtNC4yOTVhLjIyNS4yMjUgMCAwIDEtLjE1OC0uMzg0TDIyLjEyMi4zM2MuMjEtLjIxMS40OTYtLjMzLjc5NC0uMzNoMS40OTNjNC4wMDMgMCA1LjQ1NS40MTggNi45MTkgMS4yMDJhOC4xNjkgOC4xNjkgMCAwIDEgMy4zOTQgMy40MDJjLjc4MyAxLjQ2NyAxLjIgMi45MjIgMS4yIDYuOTMzdjcuMDQ1YS4yMjUuMjI1IDAgMCAxLS4zODQuMTU5ek0xNy4yMjIgMzUuNjE3bDIuNjU1LTIuNjYxYy4yMS0uMjExLjQ5Ni0uMzMuNzk0LS4zM2gzLjI0OWMzLjAwMiAwIDQuMDktLjMxMyA1LjE4OC0uOTAyYTYuMTI3IDYuMTI3IDAgMCAwIDIuNTQ2LTIuNTUxYy41ODctMS4xLjktMi4xOTEuOS01LjJ2LTQuMzA0YS4yMjUuMjI1IDAgMCAxIC4zODMtLjE1OWwyLjY1NiAyLjY2MWMuMjEuMjExLjMyOS40OTguMzI5Ljc5NnYxLjQ5N2MwIDQuMDExLS40MTcgNS40NjYtMS4yIDYuOTMzYTguMTY5IDguMTY5IDAgMCAxLTMuMzk0IDMuNDAyQzI5Ljg2NCAzNS41ODIgMjguNDEyIDM2IDI0LjQwOSAzNkgxNy4zOGEuMjI1LjIyNSAwIDAgMS0uMTU4LS4zODR6TS4zODMgMTcuMjU5TDMuMDQgMTkuOTJjLjIxLjIxMS4zMjkuNDk4LjMyOS43OTZ2My4yNTZjMCAzLjAwOS4zMTIgNC4xLjkgNS4yYTYuMTI3IDYuMTI3IDAgMCAwIDIuNTQ1IDIuNTUxYzEuMDk4LjU4OSAyLjE4Ny45MDIgNS4xODkuOTAyaDQuMjk0YS4yMjUuMjI1IDAgMCAxIC4xNi4zODRsLTIuNjU3IDIuNjYxYy0uMjEuMjExLS40OTYuMzMtLjc5My4zM2gtMS40OTRjLTQuMDAzIDAtNS40NTQtLjQxOC02LjkxOC0xLjIwMkE4LjE2OSA4LjE2OSAwIDAgMSAxLjIgMzEuMzk2Qy40MTcgMjkuOTI5IDAgMjguNDc0IDAgMjQuNDYzdi03LjA0NWEuMjI1LjIyNSAwIDAgMSAuMzgzLS4xNTl6TTE2LjA0NSAzLjA0NWMtLjIxMS4yMTEtLjQ5Ni4zMy0uNzk0LjMzaC0zLjI0OWMtMy4wMDIgMC00LjA5MS4zMTMtNS4xODkuOTAyYTYuMTI3IDYuMTI3IDAgMCAwLTIuNTQ2IDIuNTUxYy0uNTg3IDEuMS0uOSAyLjE5MS0uOSA1LjJ2NC4zMDRhLjIyNS4yMjUgMCAwIDEtLjM4My4xNTlMLjMzIDEzLjgzQTEuMTI2IDEuMTI2IDAgMCAxIDAgMTMuMDM0di0xLjQ5N2MwLTQuMDExLjQxNy01LjQ2NiAxLjItNi45MzNhOC4xNjkgOC4xNjkgMCAwIDEgMy4zOTQtMy40MDJDNi4wNTguNDE4IDcuNTEgMCAxMS41MTIgMGg3LjAzYS4yMjUuMjI1IDAgMCAxIC4xNTguMzg0bC0yLjY1NSAyLjY2MXptMTMuODg0IDEwLjA5MWwtMy42Mi0zLjQ2OGMtLjI0LS4yNC0uNTItLjQxNC0uODE5LS41MjNBMi4yMzYgMi4yMzYgMCAwIDAgMjQuNjk2IDlIMTQuMDFhLjIyNS4yMjUgMCAwIDEtLjE1OS0uMzg0bDIuNjU5LTIuNjYyYy4yMS0uMjEuNDk1LS4zMjkuNzkzLS4zMjloOC41MTZjMi40OCAwIDQuNDkgMi4wMTUgNC40OSA0LjV2Mi44NDlhLjIyNS4yMjUgMCAwIDEtLjM4LjE2MnptLTcuMTE1IDE2Ljg2MWwzLjQ2LTMuNjI5Yy4yNC0uMjQuNDE0LS41Mi41MjMtLjgyYTIuMjUgMi4yNSAwIDAgMCAuMTQ0LS43OTV2LTEwLjcxYS4yMjUuMjI1IDAgMCAxIC4zODQtLjE1OWwyLjY1NiAyLjY2NGMuMjEuMjExLjMyOC40OTcuMzI4Ljc5NnY4LjUzNGMwIDIuNDg1LTIuMDEgNC41LTQuNDkgNC41aC0yLjg0M2EuMjI1LjIyNSAwIDAgMS0uMTYyLS4zOHpNNS45OTIgMjIuODY0bDMuNjIyIDMuNDY4Yy4yMzkuMjQuNTIuNDE0LjgxOC41MjMuMjQ2LjA5NC41MTQuMTQ1Ljc5NC4xNDVoMTAuNjg2YS4yMjUuMjI1IDAgMCAxIC4xNTguMzg0bC0yLjY1OCAyLjY2MmMtLjIxLjIxLS40OTYuMzI5LS43OTMuMzI5aC04LjUxNmE0LjQ5NSA0LjQ5NSAwIDAgMS00LjQ5LTQuNXYtMi44NDlhLjIyNS4yMjUgMCAwIDEgLjM4LS4xNjJ6bTcuMTE2LTE2Ljg1OWwtMy40NjEgMy42M2MtLjI0LjI0LS40MTMuNTItLjUyMi44MmEyLjI1IDIuMjUgMCAwIDAtLjE0NS43OTV2MTAuNzFhLjIyNS4yMjUgMCAwIDEtLjM4My4xNThsLTIuNjU2LTIuNjY0YTEuMTI2IDEuMTI2IDAgMCAxLS4zMjgtLjc5NXYtOC41MzRjMC0yLjQ4NSAyLjAxLTQuNSA0LjQ5LTQuNWgyLjg0M2EuMjI1LjIyNSAwIDAgMSAuMTYyLjM4em0zMy4xMDUgNC4zNzloLjg2OGMuNTkzIDAgMS4wNzQuNDggMS4wNzQgMS4wNzR2MS4wMTZjMCAuMDMyLjAyNi4wNTcuMDU3LjA1Ny40OTUtLjg3NSAxLjE2LTEuNTEgMS45OTgtMS45MDlhNi4yMzYgNi4yMzYgMCAwIDEgMi43MS0uNTk2YzEuMDQ3IDAgMS45ODkuMTk0IDIuODI2LjU4Mi44MzcuMzg3IDEuNTUuOTIgMi4xNCAxLjU5NWE2Ljg5NiA2Ljg5NiAwIDAgMSAxLjM0IDIuMzg2Yy4zMDUuOTE1LjQ1NyAxLjkuNDU3IDIuOTUzYTguNzk1IDguNzk1IDAgMCAxLS40ODUgMi45NTMgNy40MTggNy40MTggMCAwIDEtMS4zNTUgMi4zODYgNi4yNjkgNi4yNjkgMCAwIDEtMi4wOTcgMS41OTUgNi4xODIgNi4xODIgMCAwIDEtMi42ODMuNTgyYy0uNjQ3IDAtMS4yMTctLjA3LTEuNzEyLS4yMDlhNS43NTEgNS43NTEgMCAwIDEtMS4zMTItLjUzNyA1LjI1MiA1LjI1MiAwIDAgMS0uOTctLjcgNS4wMTIgNS4wMTIgMCAwIDEtLjY1Ny0uNzMxLjA4Ni4wODYgMCAwIDAtLjA4Ni4wODV2Ny4yMjRhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwM2ExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0xMC4wNDYgNy4xNThjMC0uNTU3LS4wOS0xLjA5NC0uMjctMS42MWE0LjA3OCA0LjA3OCAwIDAgMC0uOC0xLjM3MyAzLjk5IDMuOTkgMCAwIDAtMS4yNy0uOTU0Yy0uNDk0LS4yMzktMS4wNTUtLjM1OC0xLjY4My0uMzU4LS42MjggMC0xLjE5LjEyLTEuNjg0LjM1OGEzLjk5IDMuOTkgMCAwIDAtMS4yNy45NTQgNC4wNzggNC4wNzggMCAwIDAtLjc5OSAxLjM3MiA0Ljg0NSA0Ljg0NSAwIDAgMC0uMjcgMS42MWMwIC41NTguMDkgMS4wOTQuMjcgMS42MTEuMTgxLjUxNy40NDcuOTc1LjggMS4zNzJhMy45OSAzLjk5IDAgMCAwIDEuMjcuOTU1Yy40OTQuMjM4IDEuMDU1LjM1OCAxLjY4My4zNTguNjI4IDAgMS4xODktLjEyIDEuNjgzLS4zNThhMy45OSAzLjk5IDAgMCAwIDEuMjctLjk1NWMuMzUyLS4zOTcuNjE4LS44NTUuOC0xLjM3Mi4xOC0uNTE3LjI3LTEuMDUzLjI3LTEuNjF6bTguMzU5LTcuMTU4aC45OGMuNjI2IDAgMS4xMzQuNTA3IDEuMTM0IDEuMTMzdjEuMDc3YzAgLjAzMS4wMjUuMDU3LjA1Ny4wNTcuMzgtLjgzNi45MjItMS40ODIgMS42MjYtMS45MzkuNzA0LS40NTcgMS41MTMtLjY4NiAyLjQyNi0uNjg2LjIwOSAwIC40MTQuMDIuNjEzLjA2YS43NjIuNzYyIDAgMCAxIC42MTQuNzQ3djEuOTY0YS43MTUuNzE1IDAgMCAxLS44NDIuNzA0IDQuNTggNC41OCAwIDAgMC0uODEzLS4wNzVjLS44IDAtMS40NDEuMTU0LTEuOTI2LjQ2Mi0uNDg1LjMwOS0uODU2LjY2MS0xLjExMyAxLjA2YTMuNiAzLjYgMCAwIDAtLjUxNCAxLjE5MmMtLjA4Ni4zOTgtLjEyOC42OTYtLjEyOC44OTV2Ni4zNTVhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwNGExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0xMS41ODUgMGguODA0Yy43MjMgMCAxLjMxLjU4NyAxLjMxIDEuMzFWMjMuMzlhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwNGExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0tMS43OTUtNC44NjJjMC0uNTc2LjIwNC0xLjA3OC42MTMtMS41MDYuNDEtLjQyNy45MjgtLjY0MSAxLjU1NS0uNjQxLjYyOCAwIDEuMTU2LjIwNCAxLjU4NC42MTEuNDI4LjQwOC42NDIuOTIuNjQyIDEuNTM2IDAgLjYxNy0uMjE0IDEuMTI5LS42NDIgMS41MzYtLjQyOC40MDgtLjk1Ni42MTItMS41ODQuNjEyLS42MjcgMC0xLjE0Ni0uMjE0LTEuNTU1LS42NDFhMi4xMDggMi4xMDggMCAwIDEtLjYxMy0xLjUwN3ptMTQuNzUzIDguMTMzYy0uNjk1LS41MS0xLjMxNC0uNzY2LTEuODU1LS43NjYtLjQ1NyAwLS45MDQuMTItMS4zNDIuMzU4LS40MzcuMjM5LS42NTYuNjI2LS42NTYgMS4xNjMgMCAuNDM4LjE4Ljc1Ni41NDIuOTU1LjM2Mi4xOTguODE4LjM2OCAxLjM3LjUwNy41NTIuMTM5IDEuMTQ2LjI4MyAxLjc4My40MzIuNjM4LjE1IDEuMjMyLjM3OCAxLjc4NC42ODYuNTUyLjMwOCAxLjAwOC43MyAxLjM3IDEuMjY4LjM2MS41MzcuNTQyIDEuMjcyLjU0MiAyLjIwNyAwIC44NTUtLjE3NiAxLjU3NS0uNTI4IDIuMTYyYTQuMjQxIDQuMjQxIDAgMCAxLTEuMzcgMS40MTcgNS45MjcgNS45MjcgMCAwIDEtMS44OTcuNzc1IDkuNTUzIDkuNTUzIDAgMCAxLTIuMTEyLjIzOWMtMS4wNjUgMC0yLjA0NS0uMTYtMi45NC0uNDc3LS4zNS0uMTI1LS43Ny0uMzc1LTEuMjYtLjc1MWExLjMxIDEuMzEgMCAwIDEtLjExOS0xLjk3NmwuMzU1LS4zNDhhMS4zMSAxLjMxIDAgMCAxIDEuNzgzLS4wNDhjLjIwOC4xODMuMzg4LjMyNC41NC40MjMuNTA0LjMyOSAxLjExOC40OTMgMS44NC40OTMuMjQ4IDAgLjUwNS0uMDMuNzcxLS4wOS4yNjctLjA2LjUxNC0uMTU5Ljc0Mi0uMjk4LjIyOC0uMTQuNDE0LS4zMTMuNTU3LS41MjIuMTQyLS4yMDkuMjE0LS40NTIuMjE0LS43MyAwLS40OTgtLjE4MS0uODY2LS41NDMtMS4xMDQtLjM2MS0uMjM5LS44MTgtLjQzMy0xLjM3LS41ODJhMjguNzQ2IDI4Ljc0NiAwIDAgMC0xLjc4My0uNDE3IDYuNzA3IDYuNzA3IDAgMCAxLTEuNzgzLS42MjcgMy43OTUgMy43OTUgMCAwIDEtMS4zNy0xLjIwOGMtLjM2MS0uNTE3LS41NDItMS4yMzMtLjU0Mi0yLjE0NyAwLS43OTUuMTU3LTEuNDg2LjQ3LTIuMDczYTQuMjY1IDQuMjY1IDAgMCAxIDEuMjQyLTEuNDQ2IDUuMjU2IDUuMjU2IDAgMCAxIDEuNzctLjgzNiA3Ljc3MyA3Ljc3MyAwIDAgMSAyLjAyNS0uMjY4Yy45MTMgMCAxLjgxNy4xNjQgMi43MTEuNDkyLjMyNC4xMTkuNjg1LjMzOSAxLjA4NC42NmExLjMxIDEuMzEgMCAwIDEgLjA3NSAxLjk3NWwtLjQyNi40MDFhMS4zMSAxLjMxIDAgMCAxLTEuNjc0LjEwMXptNy43ODctMy4yNzFoLjYzM2MuNzIzIDAgMS4zMS41ODcgMS4zMSAxLjMxdi45MjdhNS42MDIgNS42MDIgMCAwIDEgMS41MjctMS44MDVjLjY3NS0uNTI3IDEuNTgzLS43OSAyLjcyNS0uNzkgMi4xNSAwIDMuNTc2Ljg4NSA0LjI4IDIuNjU0LjQ5NS0uOTE0IDEuMTEzLTEuNTg1IDEuODU1LTIuMDEzLjc0Mi0uNDI3IDEuNjI2LS42NDEgMi42NTQtLjY0MS45MTMgMCAxLjY4My4xNTkgMi4zMTEuNDc3YTQuMDg0IDQuMDg0IDAgMCAxIDEuNTI3IDEuMzEyYy4zOS41NTcuNjcgMS4yMDguODQxIDEuOTU0LjE3Mi43NDYuMjU3IDEuNTQ2LjI1NyAyLjR2Ny4yMmExLjMxIDEuMzEgMCAwIDEtMS4zMSAxLjMxaC0uODA0YTEuMzEgMS4zMSAwIDAgMS0xLjMxLTEuMzF2LTYuODAyYzAtLjQzNy0uMDM4LS44Ni0uMTE0LTEuMjY3YTMuMTExIDMuMTExIDAgMCAwLS40LTEuMDc0IDIuMDYyIDIuMDYyIDAgMCAwLS43Ny0uNzNjLS4zMjQtLjE4LS43NDItLjI2OS0xLjI1Ni0uMjY5LS41MzIgMC0uOTg0LjEwNC0xLjM1NS4zMTNhMi42ODYgMi42ODYgMCAwIDAtLjkxMy44MzUgMy41MDggMy41MDggMCAwIDAtLjUxNCAxLjE5MyA1Ljk0IDUuOTQgMCAwIDAtLjE1NyAxLjM1N3Y2LjQ0NWExLjMxIDEuMzEgMCAwIDEtMS4zMSAxLjMxaC0uODA0YTEuMzEgMS4zMSAwIDAgMS0xLjMxLTEuMzF2LTcuMjJjMC0uODk1LS4xOC0xLjYwNi0uNTQyLTIuMTMzLS4zNjItLjUyNi0uOTYtLjc5LTEuNzk4LS43OS0uNTcgMC0xLjA1MS4xLTEuNDQxLjI5OC0uMzkuMi0uNzEzLjQ2OC0uOTcuODA2YTMuMjYgMy4yNiAwIDAgMC0uNTU3IDEuMTYzIDUuNDEzIDUuNDEzIDAgMCAwLS4xNyAxLjM3MnY2LjUwNGExLjMxIDEuMzEgMCAwIDEtMS4zMTEgMS4zMWgtLjgwNGExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg3LTEuMzEgMS4zMS0xLjMxem0yNS40NTQgMGguODAzYy43MjQgMCAxLjMxLjU4NyAxLjMxIDEuMzFWMjMuMzlhMS4zMSAxLjMxIDAgMCAxLTEuMzEgMS4zMWgtLjgwM2ExLjMxIDEuMzEgMCAwIDEtMS4zMS0xLjMxVjExLjY5NGMwLS43MjMuNTg2LTEuMzEgMS4zMS0xLjMxem0tMS43OTYtNC44NjJjMC0uNTc2LjIwNS0xLjA3OC42MTQtMS41MDYuNDA5LS40MjcuOTI3LS42NDEgMS41NTUtLjY0MS42MjggMCAxLjE1Ni4yMDQgMS41ODQuNjExLjQyOC40MDguNjQyLjkyLjY0MiAxLjUzNiAwIC42MTctLjIxNCAxLjEyOS0uNjQyIDEuNTM2LS40MjguNDA4LS45NTYuNjEyLTEuNTg0LjYxMi0uNjI4IDAtMS4xNDYtLjIxNC0xLjU1NS0uNjQxYTIuMTA4IDIuMTA4IDAgMCAxLS42MTQtMS41MDd6bTE2Ljc1MSA4LjM3M2EzLjU2NCAzLjU2NCAwIDAgMC0uMzcxLS4yNiAyLjYwNyAyLjYwNyAwIDAgMC0xLjM0Mi0uMzg4Yy0uNjI3IDAtMS4xODkuMTItMS42ODMuMzU4YTMuOTkgMy45OSAwIDAgMC0xLjI3Ljk1NCA0LjA3OCA0LjA3OCAwIDAgMC0uNzk5IDEuMzcyIDQuODQ1IDQuODQ1IDAgMCAwLS4yNzEgMS42MWMwIC41NTguMDkgMS4wOTQuMjcxIDEuNjExLjE4LjUxNy40NDcuOTc1LjggMS4zNzJhMy45OSAzLjk5IDAgMCAwIDEuMjY5Ljk1NWMuNDk0LjIzOCAxLjA1Ni4zNTggMS42ODMuMzU4LjUzMyAwIDEuMDI4LS4xMTUgMS40ODQtLjM0My4wOTMtLjA0Ny4xOTMtLjExLjMtLjE4OWExLjMxIDEuMzEgMCAwIDEgMS43NTYuMTg1bC41Mi41ODRhMS4yNDggMS4yNDggMCAwIDEtLjMwNyAxLjkxIDcuOTggNy45OCAwIDAgMS0yLjY2OC45N2MtLjQxOS4wNjktLjc4LjEwNC0xLjA4NS4xMDRhNy45MDQgNy45MDQgMCAwIDEtMi45MS0uNTM3QTYuOTM4IDYuOTM4IDAgMCAxIDEzMC4zNjUgMjNhNy4yMyA3LjIzIDAgMCAxLTEuNTgzLTIuMzcxYy0uMzktLjkyNS0uNTg1LTEuOTU0LS41ODUtMy4wODcgMC0xLjEzMy4xOTUtMi4xNjIuNTg1LTMuMDg3YTcuMjMgNy4yMyAwIDAgMSAxLjU4My0yLjM3MSA2LjkzOCA2LjkzOCAwIDAgMSAyLjM2OS0xLjUyMSA3LjkwNCA3LjkwNCAwIDAgMSAyLjkxLS41MzdjLjg3NiAwIDEuNzU1LjE3NCAyLjY0LjUyMi4zMzcuMTMzLjczNS4zNyAxLjE5My43MTFhMS4zMSAxLjMxIDAgMCAxIC4xNjQgMS45NTdsLS41My41NTNhMS4zMSAxLjMxIDAgMCAxLTEuNzU0LjEyNnoiLz4KPC9zdmc+"
6
- alt="Prismic"
7
- >
8
- <figcaption>Loading preview...</figcaption>
6
+ alt="Prismic">
7
+ <figcaption>
8
+ Loading preview...
9
+ </figcaption>
9
10
  </figure>
10
11
  </section>
11
12
  </template>
12
13
 
13
14
  <script setup>
14
- import { onMounted } from 'vue'
15
+ import { useHead, usePrismicPreview } from '#imports'
15
16
 
16
- useMeta({
17
+ useHead({
17
18
  title: 'Prismic Preview - Loading'
18
19
  })
19
20
 
20
- // TODO: refactor into simple hook
21
- const { client, options: { linkResolver } } = usePrismic()
22
- const { push } = useRouter()
23
- onMounted(async () => {
24
- const redirectURL = await client.resolvePreviewURL({
25
- linkResolver,
26
- defaultURL: '/'
27
- })
28
-
29
- push(redirectURL ?? '/')
30
- })
21
+ usePrismicPreview()
31
22
  </script>
32
23
 
33
24
  <style scoped>
@@ -37,14 +28,15 @@ onMounted(async () => {
37
28
  position: fixed;
38
29
  top: 0;
39
30
  left: 0;
40
- display: flex;
31
+ display: flex;
41
32
  justify-content: center;
42
33
  align-items: center;
43
34
  background: #ffffff;
44
- color: #666666;
45
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
46
- font-size: 1rem;
47
- text-align: center;
35
+ color: #666666;
36
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
37
+ Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
38
+ font-size: 1rem;
39
+ text-align: center;
48
40
  }
49
41
 
50
42
  img {
@@ -0,0 +1,21 @@
1
+ import { onMounted } from 'vue'
2
+
3
+ import { useRouter, usePrismic } from '#imports'
4
+
5
+ /**
6
+ * Resolves Prismic previews on the preview entry page (`/preview`)
7
+ *
8
+ * @param defaultURL - The default URL to redirect to if the previewed document doesn't map to one.
9
+ */
10
+ export const usePrismicPreview = (defaultURL = '/'): void => {
11
+ const { client, options: { linkResolver } } = usePrismic()
12
+ const { push } = useRouter()
13
+ onMounted(async () => {
14
+ const redirectURL = await client.resolvePreviewURL({
15
+ linkResolver,
16
+ defaultURL
17
+ })
18
+
19
+ push(redirectURL)
20
+ })
21
+ }
package/src/types.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  import { PrismicPluginOptions } from '@prismicio/vue'
2
2
 
3
- export type PrismicModuleOptions = PrismicPluginOptions & {
4
- preview?: string | false
3
+ export type PrismicModuleOptions = Omit<PrismicPluginOptions, 'endpoint' | 'client' | 'linkResolver' | 'htmlSerializer'> & {
4
+ endpoint: string;
5
+ client?: string;
6
+ linkResolver?: string;
7
+ htmlSerializer?: string;
8
+ preview?: string | false;
5
9
  };
package/src/utils.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { existsSync } from 'fs'
2
+
3
+ export const fileExists = (path?: string, extensions = ['js', 'ts']): string | null => {
4
+ if (!path) {
5
+ return null
6
+ } else if (existsSync(path)) {
7
+ // If path already contains/forces the extension
8
+ return path
9
+ }
10
+
11
+ const extension = extensions.find(extension => existsSync(`${path}.${extension}`))
12
+
13
+ return extension ? `${path}.${extension}` : null
14
+ }