nuxtseo-shared 5.0.2 → 5.1.1

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/dist/const.d.mts CHANGED
@@ -17,7 +17,6 @@ interface NuxtSEOModule {
17
17
  description: string;
18
18
  repo: string;
19
19
  npm: string;
20
- pro?: boolean;
21
20
  playgrounds?: Record<string, string>;
22
21
  }
23
22
  declare const NuxtSEO: NuxtSEOModule;
@@ -31,8 +30,12 @@ declare const SchemaOrgModule: NuxtSEOModule;
31
30
  declare const SkewProtectionModule: NuxtSEOModule;
32
31
  declare const AiReadyModule: NuxtSEOModule;
33
32
  declare const modules: NuxtSEOModule[];
33
+ declare const bundledModules: NuxtSEOModule[];
34
+ declare const standaloneModules: NuxtSEOModule[];
35
+ /** @deprecated Use `bundledModules` */
34
36
  declare const normalModules: NuxtSEOModule[];
37
+ /** @deprecated Use `standaloneModules` */
35
38
  declare const proModules: NuxtSEOModule[];
36
39
 
37
- export { AiReadyModule, LinkCheckerModule, NuxtSEO, OgImageModule, RobotsModule, SchemaOrgModule, SeoUtilsModule, SiteConfigModule, SitemapModule, SkewProtectionModule, modules, normalModules, proModules };
40
+ export { AiReadyModule, LinkCheckerModule, NuxtSEO, OgImageModule, RobotsModule, SchemaOrgModule, SeoUtilsModule, SiteConfigModule, SitemapModule, SkewProtectionModule, bundledModules, modules, normalModules, proModules, standaloneModules };
38
41
  export type { ChecklistItemDefinition, ChecklistItemLevel, NuxtSEOModule };
package/dist/const.d.ts CHANGED
@@ -17,7 +17,6 @@ interface NuxtSEOModule {
17
17
  description: string;
18
18
  repo: string;
19
19
  npm: string;
20
- pro?: boolean;
21
20
  playgrounds?: Record<string, string>;
22
21
  }
23
22
  declare const NuxtSEO: NuxtSEOModule;
@@ -31,8 +30,12 @@ declare const SchemaOrgModule: NuxtSEOModule;
31
30
  declare const SkewProtectionModule: NuxtSEOModule;
32
31
  declare const AiReadyModule: NuxtSEOModule;
33
32
  declare const modules: NuxtSEOModule[];
33
+ declare const bundledModules: NuxtSEOModule[];
34
+ declare const standaloneModules: NuxtSEOModule[];
35
+ /** @deprecated Use `bundledModules` */
34
36
  declare const normalModules: NuxtSEOModule[];
37
+ /** @deprecated Use `standaloneModules` */
35
38
  declare const proModules: NuxtSEOModule[];
36
39
 
37
- export { AiReadyModule, LinkCheckerModule, NuxtSEO, OgImageModule, RobotsModule, SchemaOrgModule, SeoUtilsModule, SiteConfigModule, SitemapModule, SkewProtectionModule, modules, normalModules, proModules };
40
+ export { AiReadyModule, LinkCheckerModule, NuxtSEO, OgImageModule, RobotsModule, SchemaOrgModule, SeoUtilsModule, SiteConfigModule, SitemapModule, SkewProtectionModule, bundledModules, modules, normalModules, proModules, standaloneModules };
38
41
  export type { ChecklistItemDefinition, ChecklistItemLevel, NuxtSEOModule };
package/dist/const.mjs CHANGED
@@ -108,8 +108,7 @@ const SkewProtectionModule = {
108
108
  repo: "nuxt-seo-pro/nuxt-skew-protection",
109
109
  description: "Solve Nuxt version skews with persistent assets and instant updates.",
110
110
  label: "Skew Protection",
111
- icon: "i-carbon-version",
112
- pro: true
111
+ icon: "i-carbon-version"
113
112
  };
114
113
  const AiReadyModule = {
115
114
  slug: "ai-ready",
@@ -117,8 +116,7 @@ const AiReadyModule = {
117
116
  repo: "nuxt-seo-pro/nuxt-ai-ready",
118
117
  description: "Best practice AI & LLM discoverability for Nuxt sites.",
119
118
  label: "AI Ready",
120
- icon: "i-carbon-ai-label",
121
- pro: true
119
+ icon: "i-carbon-ai-label"
122
120
  };
123
121
  const modules = [
124
122
  NuxtSEO,
@@ -132,7 +130,7 @@ const modules = [
132
130
  SkewProtectionModule,
133
131
  AiReadyModule
134
132
  ];
135
- const normalModules = [
133
+ const bundledModules = [
136
134
  RobotsModule,
137
135
  SitemapModule,
138
136
  OgImageModule,
@@ -140,9 +138,11 @@ const normalModules = [
140
138
  LinkCheckerModule,
141
139
  SeoUtilsModule
142
140
  ];
143
- const proModules = [
141
+ const standaloneModules = [
144
142
  SkewProtectionModule,
145
143
  AiReadyModule
146
144
  ];
145
+ const normalModules = bundledModules;
146
+ const proModules = standaloneModules;
147
147
 
148
- export { AiReadyModule, LinkCheckerModule, NuxtSEO, OgImageModule, RobotsModule, SchemaOrgModule, SeoUtilsModule, SiteConfigModule, SitemapModule, SkewProtectionModule, modules, normalModules, proModules };
148
+ export { AiReadyModule, LinkCheckerModule, NuxtSEO, OgImageModule, RobotsModule, SchemaOrgModule, SeoUtilsModule, SiteConfigModule, SitemapModule, SkewProtectionModule, bundledModules, modules, normalModules, proModules, standaloneModules };
package/dist/content.mjs CHANGED
@@ -8,21 +8,26 @@ function withEditorHidden(schema) {
8
8
  }
9
9
  function createContentSchemaFactory(config, defaultZ) {
10
10
  const { fieldName, buildSchema, label, docsUrl, onDefineSchema } = config;
11
- const defaultSchema = buildSchema(defaultZ);
12
- const schemaObject = defaultZ.object({ [fieldName]: defaultSchema });
11
+ const schemaObject = defaultZ.object({ [fieldName]: buildSchema(defaultZ) });
13
12
  function defineSchema(options) {
14
13
  if (options && onDefineSchema)
15
14
  onDefineSchema(options);
16
15
  const _z = options?.z ?? defaultZ;
17
- if (_z === defaultZ)
18
- return defaultSchema;
19
16
  return buildSchema(_z);
20
17
  }
21
18
  function asCollection(collection) {
22
19
  const migrationHint = docsUrl ? ` See ${docsUrl}` : "";
23
20
  console.warn(`[${label}] \`as${capitalize(label)}Collection()\` is deprecated. Use \`define${capitalize(label)}Schema()\` in your collection schema instead.${migrationHint}`);
24
21
  if (collection.type === "page") {
25
- collection.schema = collection.schema ? schemaObject.extend(collection.schema.shape) : schemaObject;
22
+ try {
23
+ collection.schema = collection.schema ? schemaObject.extend(collection.schema.shape) : schemaObject;
24
+ } catch (e) {
25
+ console.warn(
26
+ `[${label}] Failed to apply ${label} schema to collection. This is likely a Zod version mismatch.`,
27
+ `Pass your Zod instance explicitly: \`define${capitalize(label)}Schema({ z })\`.${migrationHint}`,
28
+ `Error: ${e.message}`
29
+ );
30
+ }
26
31
  }
27
32
  return collection;
28
33
  }
@@ -30,7 +35,7 @@ function createContentSchemaFactory(config, defaultZ) {
30
35
  defineSchema,
31
36
  asCollection,
32
37
  schema: schemaObject,
33
- fieldSchema: defaultSchema
38
+ fieldSchema: buildSchema(defaultZ)
34
39
  };
35
40
  }
36
41
  function capitalize(s) {
package/dist/kit.d.mts CHANGED
@@ -14,10 +14,6 @@ interface NuxtSeoModuleDetection {
14
14
  * No self-registration needed; modules are discovered automatically.
15
15
  */
16
16
  declare function detectNuxtSeoModules(nuxt?: Nuxt): NuxtSeoModuleDetection[];
17
- /**
18
- * Detect installed Nuxt SEO Pro modules.
19
- */
20
- declare function detectNuxtSeoProModules(nuxt?: Nuxt): NuxtSeoModuleDetection[];
21
17
  declare function detectTarget(options?: {
22
18
  static?: boolean;
23
19
  }): string | undefined;
@@ -53,5 +49,5 @@ interface NuxtContentVersion {
53
49
  */
54
50
  declare function resolveNuxtContentVersion(): Promise<false | NuxtContentVersion>;
55
51
 
56
- export { createNitroPromise, createPagesPromise, detectNuxtSeoModules, detectNuxtSeoProModules, detectTarget, extendTypes, getNuxtModuleOptions, isNuxtGenerate, resolveNitroPreset, resolveNuxtContentVersion };
52
+ export { createNitroPromise, createPagesPromise, detectNuxtSeoModules, detectTarget, extendTypes, getNuxtModuleOptions, isNuxtGenerate, resolveNitroPreset, resolveNuxtContentVersion };
57
53
  export type { NuxtContentVersion, NuxtSeoModuleDetection };
package/dist/kit.d.ts CHANGED
@@ -14,10 +14,6 @@ interface NuxtSeoModuleDetection {
14
14
  * No self-registration needed; modules are discovered automatically.
15
15
  */
16
16
  declare function detectNuxtSeoModules(nuxt?: Nuxt): NuxtSeoModuleDetection[];
17
- /**
18
- * Detect installed Nuxt SEO Pro modules.
19
- */
20
- declare function detectNuxtSeoProModules(nuxt?: Nuxt): NuxtSeoModuleDetection[];
21
17
  declare function detectTarget(options?: {
22
18
  static?: boolean;
23
19
  }): string | undefined;
@@ -53,5 +49,5 @@ interface NuxtContentVersion {
53
49
  */
54
50
  declare function resolveNuxtContentVersion(): Promise<false | NuxtContentVersion>;
55
51
 
56
- export { createNitroPromise, createPagesPromise, detectNuxtSeoModules, detectNuxtSeoProModules, detectTarget, extendTypes, getNuxtModuleOptions, isNuxtGenerate, resolveNitroPreset, resolveNuxtContentVersion };
52
+ export { createNitroPromise, createPagesPromise, detectNuxtSeoModules, detectTarget, extendTypes, getNuxtModuleOptions, isNuxtGenerate, resolveNitroPreset, resolveNuxtContentVersion };
57
53
  export type { NuxtContentVersion, NuxtSeoModuleDetection };
package/dist/kit.mjs CHANGED
@@ -13,10 +13,6 @@ const NUXT_SEO_MODULES = /* @__PURE__ */ new Set([
13
13
  "nuxt-skew-protection",
14
14
  "nuxt-ai-ready"
15
15
  ]);
16
- const PRO_MODULES = /* @__PURE__ */ new Set([
17
- "nuxt-skew-protection",
18
- "nuxt-ai-ready"
19
- ]);
20
16
  function detectNuxtSeoModules(nuxt = useNuxt()) {
21
17
  return nuxt.options._installedModules.filter((m) => m.meta?.name && NUXT_SEO_MODULES.has(m.meta.name)).map((m) => ({
22
18
  name: m.meta.name,
@@ -24,9 +20,6 @@ function detectNuxtSeoModules(nuxt = useNuxt()) {
24
20
  entryPath: m.entryPath
25
21
  }));
26
22
  }
27
- function detectNuxtSeoProModules(nuxt = useNuxt()) {
28
- return detectNuxtSeoModules(nuxt).filter((m) => PRO_MODULES.has(m.name));
29
- }
30
23
  const autodetectableProviders = {
31
24
  azure_static: "azure",
32
25
  cloudflare_pages: "cloudflare-pages",
@@ -123,4 +116,4 @@ async function resolveNuxtContentVersion() {
123
116
  return false;
124
117
  }
125
118
 
126
- export { createNitroPromise, createPagesPromise, detectNuxtSeoModules, detectNuxtSeoProModules, detectTarget, extendTypes, getNuxtModuleOptions, isNuxtGenerate, resolveNitroPreset, resolveNuxtContentVersion };
119
+ export { createNitroPromise, createPagesPromise, detectNuxtSeoModules, detectTarget, extendTypes, getNuxtModuleOptions, isNuxtGenerate, resolveNitroPreset, resolveNuxtContentVersion };
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.16.0"
6
6
  },
7
- "version": "5.0.2",
7
+ "version": "5.1.1",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
package/dist/module.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import { defineNuxtModule } from '@nuxt/kit';
2
- import { hookNuxtSeoProLicense } from './pro.mjs';
3
- import '@clack/prompts';
2
+ import { hookNuxtSeoProDataUpload } from './pro.mjs';
4
3
  import 'nuxt-site-config/kit';
5
4
  import 'ofetch';
6
5
  import 'std-env';
@@ -16,7 +15,7 @@ const module$1 = defineNuxtModule({
16
15
  }
17
16
  },
18
17
  setup() {
19
- hookNuxtSeoProLicense();
18
+ hookNuxtSeoProDataUpload();
20
19
  }
21
20
  });
22
21
 
package/dist/pro.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- declare function hookNuxtSeoProLicense(): void;
1
+ declare function hookNuxtSeoProDataUpload(): void;
2
2
 
3
- export { hookNuxtSeoProLicense };
3
+ export { hookNuxtSeoProDataUpload };
package/dist/pro.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- declare function hookNuxtSeoProLicense(): void;
1
+ declare function hookNuxtSeoProDataUpload(): void;
2
2
 
3
- export { hookNuxtSeoProLicense };
3
+ export { hookNuxtSeoProDataUpload };
package/dist/pro.mjs CHANGED
@@ -1,69 +1,39 @@
1
- import * as p from '@clack/prompts';
2
1
  import { useNuxt, useLogger } from '@nuxt/kit';
3
2
  import { useSiteConfig } from 'nuxt-site-config/kit';
4
3
  import { $fetch } from 'ofetch';
5
- import { isTest, isCI } from 'std-env';
6
- import { detectNuxtSeoProModules } from './kit.mjs';
4
+ import { isTest } from 'std-env';
5
+ import { detectNuxtSeoModules } from './kit.mjs';
7
6
  import 'pathe';
8
7
 
9
- function hookNuxtSeoProLicense() {
8
+ function hookNuxtSeoProDataUpload() {
10
9
  const nuxt = useNuxt();
11
10
  const logger = useLogger("nuxt-seo-pro");
12
11
  const isBuild = !nuxt.options.dev && !nuxt.options._prepare;
13
- if (isBuild && !nuxt._isNuxtSeoProVerifying) {
12
+ if (isBuild && !nuxt._isNuxtSeoProUploading) {
14
13
  const license = nuxt.options.runtimeConfig.seoProKey || process.env.NUXT_SEO_PRO_KEY;
15
- if (isTest || process.env.VITEST) {
14
+ if (isTest || process.env.VITEST || !license) {
16
15
  return;
17
16
  }
18
- if (!isCI && !license) {
19
- p.log.warn("\u26A0\uFE0F Building without license in non-CI environment. A license is required for production builds.");
20
- return;
21
- }
22
- if (!license) {
23
- p.log.error("\u{1F510} Nuxt SEO Pro license required");
24
- p.note("Set NUXT_SEO_PRO_KEY or configure via module options.\n\nhttps://nuxtseo.com/pro/dashboard", "Get your license");
25
- throw new Error("Missing Nuxt SEO Pro license key.");
26
- }
27
- nuxt._isNuxtSeoProVerifying = true;
17
+ nuxt._isNuxtSeoProUploading = true;
28
18
  nuxt.hooks.hook("build:before", async () => {
29
- p.intro("Nuxt SEO Pro: License Verification");
30
19
  const siteConfig = useSiteConfig();
31
- const spinner = p.spinner();
32
- spinner.start("Verifying Nuxt SEO Pro license...");
33
20
  const siteUrl = siteConfig.url?.startsWith("http") ? siteConfig.url : void 0;
34
21
  const siteName = siteConfig.name || void 0;
35
- const proModules = detectNuxtSeoProModules(nuxt);
36
- await nuxt.hooks.callHook("nuxt-seo-pro:modules", proModules);
37
- const modules = proModules.length > 0 ? proModules : void 0;
38
- const res = await $fetch("https://nuxtseo.com/api/pro/verify", {
22
+ const modules = detectNuxtSeoModules(nuxt);
23
+ await nuxt.hooks.callHook("nuxt-seo-pro:modules", modules);
24
+ await $fetch("https://nuxtseo.com/api/pro/verify", {
39
25
  method: "POST",
40
26
  body: {
41
27
  apiKey: license,
42
28
  siteUrl,
43
29
  siteName,
44
- modules
30
+ modules: modules.length > 0 ? modules : void 0
45
31
  }
46
32
  }).catch((err) => {
47
- if (err?.response?.status === 401) {
48
- spinner.error("Invalid API key");
49
- p.note("Your API key is invalid.\n\nhttps://nuxtseo.com/pro/dashboard", "License Issue");
50
- throw new Error("Invalid Nuxt SEO Pro API key.");
51
- }
52
- if (err?.response?.status === 403) {
53
- spinner.error("No active subscription");
54
- p.note("Your subscription has expired or is inactive.\n\nhttps://nuxtseo.com/pro/dashboard", "License Issue");
55
- throw new Error("No active Nuxt SEO Pro subscription.");
56
- }
57
- logger.error(err);
58
- return null;
33
+ logger.debug("Pro data upload failed", err);
59
34
  });
60
- if (!res) {
61
- spinner.cancel("License verification skipped (network issue)");
62
- return;
63
- }
64
- spinner.stop("License verified");
65
35
  });
66
36
  }
67
37
  }
68
38
 
69
- export { hookNuxtSeoProLicense };
39
+ export { hookNuxtSeoProDataUpload };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxtseo-shared",
3
3
  "type": "module",
4
- "version": "5.0.2",
4
+ "version": "5.1.1",
5
5
  "description": "Shared utilities for Nuxt SEO modules.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -22,35 +22,35 @@
22
22
  "exports": {
23
23
  ".": {
24
24
  "types": "./dist/types.d.mts",
25
- "import": "./dist/module.mjs"
25
+ "default": "./dist/module.mjs"
26
26
  },
27
27
  "./content": {
28
28
  "types": "./dist/content.d.mts",
29
- "import": "./dist/content.mjs"
29
+ "default": "./dist/content.mjs"
30
30
  },
31
31
  "./kit": {
32
32
  "types": "./dist/kit.d.mts",
33
- "import": "./dist/kit.mjs"
33
+ "default": "./dist/kit.mjs"
34
34
  },
35
35
  "./devtools": {
36
36
  "types": "./dist/devtools.d.mts",
37
- "import": "./dist/devtools.mjs"
37
+ "default": "./dist/devtools.mjs"
38
38
  },
39
39
  "./i18n": {
40
40
  "types": "./dist/i18n.d.mts",
41
- "import": "./dist/i18n.mjs"
41
+ "default": "./dist/i18n.mjs"
42
42
  },
43
43
  "./pro": {
44
44
  "types": "./dist/pro.d.mts",
45
- "import": "./dist/pro.mjs"
45
+ "default": "./dist/pro.mjs"
46
46
  },
47
47
  "./utils": {
48
48
  "types": "./dist/utils.d.mts",
49
- "import": "./dist/utils.mjs"
49
+ "default": "./dist/utils.mjs"
50
50
  },
51
51
  "./const": {
52
52
  "types": "./dist/const.d.mts",
53
- "import": "./dist/const.mjs"
53
+ "default": "./dist/const.mjs"
54
54
  },
55
55
  "./package.json": "./package.json"
56
56
  },
@@ -75,12 +75,12 @@
75
75
  }
76
76
  },
77
77
  "dependencies": {
78
- "@clack/prompts": "^1.1.0",
78
+ "@clack/prompts": "^1.2.0",
79
79
  "@nuxt/devtools-kit": "4.0.0-alpha.3",
80
80
  "@nuxt/kit": "^4.4.2",
81
81
  "birpc": "^4.0.0",
82
82
  "consola": "^3.4.2",
83
- "defu": "^6.1.4",
83
+ "defu": "^6.1.7",
84
84
  "ofetch": "^1.5.1",
85
85
  "pathe": "^2.0.3",
86
86
  "pkg-types": "^2.3.0",
@@ -90,13 +90,14 @@
90
90
  "ufo": "^1.6.3"
91
91
  },
92
92
  "devDependencies": {
93
+ "@arethetypeswrong/cli": "^0.18.2",
93
94
  "@nuxt/module-builder": "^1.0.2",
94
95
  "@nuxt/schema": "^4.4.2",
95
96
  "@nuxtjs/i18n": "^10.2.4",
96
97
  "nuxt-site-config": "^4.0.7",
97
98
  "typescript": "^6.0.2",
98
- "vitest": "^4.1.2",
99
- "vue": "^3.5.31",
99
+ "vitest": "^4.1.3",
100
+ "vue": "^3.5.32",
100
101
  "vue-tsc": "^3.2.6"
101
102
  },
102
103
  "scripts": {
@@ -105,6 +106,7 @@
105
106
  "stub": "nuxt-module-build build --stub",
106
107
  "test": "vitest",
107
108
  "test:run": "vitest run",
109
+ "test:attw": "attw --pack --profile esm-only",
108
110
  "typecheck": "vue-tsc --noEmit"
109
111
  }
110
112
  }