@webbycrown/strapi-advanced-sitemap 1.0.3
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/LICENSE +23 -0
- package/README.md +194 -0
- package/dist/_chunks/Settings-CDmtmOAh.js +26522 -0
- package/dist/_chunks/Settings-O4TWg_hE.mjs +26503 -0
- package/dist/_chunks/en-B2cxOPRT.mjs +104 -0
- package/dist/_chunks/en-DXDFX_Yk.js +104 -0
- package/dist/_chunks/index-D0n235aN.js +83 -0
- package/dist/_chunks/index-lDBXYK9v.mjs +84 -0
- package/dist/admin/index.js +5 -0
- package/dist/admin/index.mjs +6 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.mjs +6 -0
- package/dist/server/src/bootstrap.js +130 -0
- package/dist/server/src/config/index.js +8 -0
- package/dist/server/src/content-types/content-type/schema.json +28 -0
- package/dist/server/src/content-types/index.js +9 -0
- package/dist/server/src/content-types/option/schema.json +22 -0
- package/dist/server/src/content-types/single-url/schema.json +23 -0
- package/dist/server/src/controllers/controller.js +209 -0
- package/dist/server/src/controllers/index.js +7 -0
- package/dist/server/src/destroy.js +7 -0
- package/dist/server/src/index.js +27 -0
- package/dist/server/src/middlewares/index.js +7 -0
- package/dist/server/src/middlewares/permission-check.js +20 -0
- package/dist/server/src/policies/index.js +5 -0
- package/dist/server/src/register.js +8 -0
- package/dist/server/src/routes/index.js +74 -0
- package/dist/server/src/services/index.js +7 -0
- package/dist/server/src/services/service.js +371 -0
- package/dist/server/src/utils/check-sitemap-permission.js +139 -0
- package/package.json +82 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
const en = {
|
|
2
|
+
"strapi-advanced-sitemap.plugin.name": "Strapi Advanced Sitemap",
|
|
3
|
+
"strapi-advanced-sitemap.plugin.description": "Generate XML sitemaps for your collection types and custom URLs",
|
|
4
|
+
"strapi-advanced-sitemap.settings.title": "Configure",
|
|
5
|
+
"strapi-advanced-sitemap.settings.pageTitle": "Configure Sitemap",
|
|
6
|
+
"strapi-advanced-sitemap.settings.subtitle": "Configure your sitemap settings",
|
|
7
|
+
"strapi-advanced-sitemap.settings.welcome": "Welcome to Strapi Advanced Sitemap Configuration",
|
|
8
|
+
"strapi-advanced-sitemap.settings.description": "Configure your sitemap settings here. More features coming soon...",
|
|
9
|
+
"strapi-advanced-sitemap.manualSitemaps.title": "Manual sitemap files",
|
|
10
|
+
"strapi-advanced-sitemap.manualSitemaps.subtitle": "Define custom sitemap XML files composed from manually curated URLs.",
|
|
11
|
+
"strapi-advanced-sitemap.manualSitemaps.add": "Add sitemap",
|
|
12
|
+
"strapi-advanced-sitemap.manualSitemaps.save": "Save changes",
|
|
13
|
+
"strapi-advanced-sitemap.manualSitemaps.empty": "No manual sitemaps yet. Add one to get started.",
|
|
14
|
+
"strapi-advanced-sitemap.manualSitemaps.cardTitle": "Sitemap #{index}",
|
|
15
|
+
"strapi-advanced-sitemap.manualSitemaps.remove": "Remove sitemap",
|
|
16
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath": "Base Path (optional)",
|
|
17
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath.placeholder": "e.g. /sitemap",
|
|
18
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath.help": "Combine with the site URL automatically. Leave empty to use the root.",
|
|
19
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath.hint": "Resolved path: {path}. Preview: {url}",
|
|
20
|
+
"strapi-advanced-sitemap.manualSitemaps.filename": "Filename",
|
|
21
|
+
"strapi-advanced-sitemap.manualSitemaps.type.label": "Sitemap type",
|
|
22
|
+
"strapi-advanced-sitemap.manualSitemaps.type.hint": "Choose whether this file lists URLs or links out to other sitemap files.",
|
|
23
|
+
"strapi-advanced-sitemap.manualSitemaps.type.single": "Single sitemap (URL set)",
|
|
24
|
+
"strapi-advanced-sitemap.manualSitemaps.type.index": "Sitemap index (list of sitemaps)",
|
|
25
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsTitle": "URLs",
|
|
26
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsDescription": "Add the URLs that should appear inside this sitemap file. Reorder to adjust priority.",
|
|
27
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsDescription.index": "Add links to the sitemap files included in this index.",
|
|
28
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsEmpty": "No URLs yet. Add one below.",
|
|
29
|
+
"strapi-advanced-sitemap.manualSitemaps.urlLabel": "Entry #{index}",
|
|
30
|
+
"strapi-advanced-sitemap.manualSitemaps.moveUp": "Move up",
|
|
31
|
+
"strapi-advanced-sitemap.manualSitemaps.moveDown": "Move down",
|
|
32
|
+
"strapi-advanced-sitemap.manualSitemaps.delete": "Delete URL",
|
|
33
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField": "Location",
|
|
34
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField.hint": "Enter only the path or file name. The site URL and base path are added automatically.",
|
|
35
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField.hintPreview": "Enter only the path or file name. Preview: {url}",
|
|
36
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField.preview": "Preview URL: {url}",
|
|
37
|
+
"strapi-advanced-sitemap.manualSitemaps.priorityField": "Priority",
|
|
38
|
+
"strapi-advanced-sitemap.manualSitemaps.addUrl": "Add URL",
|
|
39
|
+
"strapi-advanced-sitemap.manualSitemaps.open": "Show sitemap",
|
|
40
|
+
"strapi-advanced-sitemap.manualSitemaps.publicUrl": "Public URL: {url}",
|
|
41
|
+
"strapi-advanced-sitemap.manualSitemaps.loadFailed": "Failed to load manual sitemaps.",
|
|
42
|
+
"strapi-advanced-sitemap.manualSitemaps.saveFailed": "Failed to save manual sitemaps.",
|
|
43
|
+
"strapi-advanced-sitemap.manualSitemaps.saveSuccess": "Manual sitemaps saved.",
|
|
44
|
+
"strapi-advanced-sitemap.manualSitemaps.loading": "Loading manual sitemap data...",
|
|
45
|
+
"strapi-advanced-sitemap.collectionSitemaps.title": "Collection sitemaps",
|
|
46
|
+
"strapi-advanced-sitemap.collectionSitemaps.subtitle": "Generate sitemap entries from Strapi collection types using dynamic URL patterns.",
|
|
47
|
+
"strapi-advanced-sitemap.collectionSitemaps.add": "Add collection sitemap",
|
|
48
|
+
"strapi-advanced-sitemap.collectionSitemaps.loadFailed": "Failed to load collection sitemap configurations.",
|
|
49
|
+
"strapi-advanced-sitemap.collectionSitemaps.saveSuccess": "Collection sitemap saved.",
|
|
50
|
+
"strapi-advanced-sitemap.collectionSitemaps.deleteSuccess": "Collection sitemap removed.",
|
|
51
|
+
"strapi-advanced-sitemap.collectionSitemaps.deleteFailed": "Failed to delete collection sitemap.",
|
|
52
|
+
"strapi-advanced-sitemap.collectionSitemaps.loading": "Loading collection sitemap data...",
|
|
53
|
+
"strapi-advanced-sitemap.collectionSitemaps.contentTypesFailed": "Failed to load collection types.",
|
|
54
|
+
"strapi-advanced-sitemap.collectionSitemaps.empty": "No collection sitemaps yet. Add one to start generating dynamic entries.",
|
|
55
|
+
"strapi-advanced-sitemap.collectionSitemaps.unknownCollection": "Unknown collection",
|
|
56
|
+
"strapi-advanced-sitemap.collectionSitemaps.cardTitle": "Sitemap #{index}",
|
|
57
|
+
"strapi-advanced-sitemap.collectionSitemaps.edit": "Edit",
|
|
58
|
+
"strapi-advanced-sitemap.collectionSitemaps.remove": "Remove",
|
|
59
|
+
"strapi-advanced-sitemap.collectionSitemaps.pattern": "Pattern",
|
|
60
|
+
"strapi-advanced-sitemap.collectionSitemaps.frequency": "Change frequency",
|
|
61
|
+
"strapi-advanced-sitemap.collectionSitemaps.priority": "Priority",
|
|
62
|
+
"strapi-advanced-sitemap.collectionSitemaps.subPath": "Entry prefix",
|
|
63
|
+
"strapi-advanced-sitemap.collectionSitemaps.fileBasePath": "Route",
|
|
64
|
+
"strapi-advanced-sitemap.collectionSitemaps.filename": "Filename",
|
|
65
|
+
"strapi-advanced-sitemap.collectionSitemaps.lastModified": "Include last modified",
|
|
66
|
+
"strapi-advanced-sitemap.collectionSitemaps.lastModified.yes": "Yes",
|
|
67
|
+
"strapi-advanced-sitemap.collectionSitemaps.lastModified.no": "No",
|
|
68
|
+
"strapi-advanced-sitemap.collectionSitemaps.open": "Show sitemap",
|
|
69
|
+
"strapi-advanced-sitemap.collectionSitemaps.apiFallback": "API URL: {url}",
|
|
70
|
+
"strapi-advanced-sitemap.settings.frontendUrl.title": "Frontend website URL",
|
|
71
|
+
"strapi-advanced-sitemap.settings.frontendUrl.description": "Used to prefix relative sitemap entries and to power link previews.",
|
|
72
|
+
"strapi-advanced-sitemap.settings.frontendUrl.label": "Website URL",
|
|
73
|
+
"strapi-advanced-sitemap.settings.frontendUrl.placeholder": "https://www.example.com",
|
|
74
|
+
"strapi-advanced-sitemap.settings.frontendUrl.hint": "Leave blank to fall back to this Strapi host.",
|
|
75
|
+
"strapi-advanced-sitemap.settings.frontendUrl.loadFailed": "Failed to load the frontend website URL.",
|
|
76
|
+
"strapi-advanced-sitemap.settings.frontendUrl.save": "Save URL",
|
|
77
|
+
"strapi-advanced-sitemap.settings.frontendUrl.saveSuccess": "Frontend website URL saved.",
|
|
78
|
+
"strapi-advanced-sitemap.settings.frontendUrl.saveFailed": "Failed to save the frontend website URL.",
|
|
79
|
+
"strapi-advanced-sitemap.modal.collectionType.close": "Close modal",
|
|
80
|
+
"strapi-advanced-sitemap.modal.collectionType.title": "Collection sitemap",
|
|
81
|
+
"strapi-advanced-sitemap.modal.collectionType.collection": "Collection type",
|
|
82
|
+
"strapi-advanced-sitemap.modal.collectionType.collection.placeholder": "Select a collection type",
|
|
83
|
+
"strapi-advanced-sitemap.modal.collectionType.basePath": "Route (optional)",
|
|
84
|
+
"strapi-advanced-sitemap.modal.collectionType.basePath.hint": "Sets where the sitemap file lives, e.g. /sitemap.",
|
|
85
|
+
"strapi-advanced-sitemap.modal.collectionType.filename": "Filename",
|
|
86
|
+
"strapi-advanced-sitemap.modal.collectionType.filename.hint": "Required to expose the sitemap at the sub URL.",
|
|
87
|
+
"strapi-advanced-sitemap.modal.collectionType.subPath": "Entry prefix (optional)",
|
|
88
|
+
"strapi-advanced-sitemap.modal.collectionType.subPath.hint": "Static path segment added before the pattern.",
|
|
89
|
+
"strapi-advanced-sitemap.modal.collectionType.pattern": "Pattern",
|
|
90
|
+
"strapi-advanced-sitemap.modal.collectionType.pattern.hint": "Use tokens like [slug] to reference entry fields.",
|
|
91
|
+
"strapi-advanced-sitemap.modal.collectionType.priority": "Priority",
|
|
92
|
+
"strapi-advanced-sitemap.modal.collectionType.frequency": "Change frequency",
|
|
93
|
+
"strapi-advanced-sitemap.modal.collectionType.lastModified": "Include last modified",
|
|
94
|
+
"strapi-advanced-sitemap.modal.collectionType.lastModified.yes": "Yes",
|
|
95
|
+
"strapi-advanced-sitemap.modal.collectionType.lastModified.no": "No",
|
|
96
|
+
"strapi-advanced-sitemap.modal.collectionType.error.type": "Select a collection type.",
|
|
97
|
+
"strapi-advanced-sitemap.modal.collectionType.error.pattern": "Provide a pattern for the sitemap entries.",
|
|
98
|
+
"strapi-advanced-sitemap.modal.collectionType.error.request": "Failed to save the collection sitemap.",
|
|
99
|
+
"strapi-advanced-sitemap.modal.action.cancel": "Cancel",
|
|
100
|
+
"strapi-advanced-sitemap.modal.action.save": "Save"
|
|
101
|
+
};
|
|
102
|
+
export {
|
|
103
|
+
en as default
|
|
104
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const en = {
|
|
4
|
+
"strapi-advanced-sitemap.plugin.name": "Strapi Advanced Sitemap",
|
|
5
|
+
"strapi-advanced-sitemap.plugin.description": "Generate XML sitemaps for your collection types and custom URLs",
|
|
6
|
+
"strapi-advanced-sitemap.settings.title": "Configure",
|
|
7
|
+
"strapi-advanced-sitemap.settings.pageTitle": "Configure Sitemap",
|
|
8
|
+
"strapi-advanced-sitemap.settings.subtitle": "Configure your sitemap settings",
|
|
9
|
+
"strapi-advanced-sitemap.settings.welcome": "Welcome to Strapi Advanced Sitemap Configuration",
|
|
10
|
+
"strapi-advanced-sitemap.settings.description": "Configure your sitemap settings here. More features coming soon...",
|
|
11
|
+
"strapi-advanced-sitemap.manualSitemaps.title": "Manual sitemap files",
|
|
12
|
+
"strapi-advanced-sitemap.manualSitemaps.subtitle": "Define custom sitemap XML files composed from manually curated URLs.",
|
|
13
|
+
"strapi-advanced-sitemap.manualSitemaps.add": "Add sitemap",
|
|
14
|
+
"strapi-advanced-sitemap.manualSitemaps.save": "Save changes",
|
|
15
|
+
"strapi-advanced-sitemap.manualSitemaps.empty": "No manual sitemaps yet. Add one to get started.",
|
|
16
|
+
"strapi-advanced-sitemap.manualSitemaps.cardTitle": "Sitemap #{index}",
|
|
17
|
+
"strapi-advanced-sitemap.manualSitemaps.remove": "Remove sitemap",
|
|
18
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath": "Base Path (optional)",
|
|
19
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath.placeholder": "e.g. /sitemap",
|
|
20
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath.help": "Combine with the site URL automatically. Leave empty to use the root.",
|
|
21
|
+
"strapi-advanced-sitemap.manualSitemaps.basePath.hint": "Resolved path: {path}. Preview: {url}",
|
|
22
|
+
"strapi-advanced-sitemap.manualSitemaps.filename": "Filename",
|
|
23
|
+
"strapi-advanced-sitemap.manualSitemaps.type.label": "Sitemap type",
|
|
24
|
+
"strapi-advanced-sitemap.manualSitemaps.type.hint": "Choose whether this file lists URLs or links out to other sitemap files.",
|
|
25
|
+
"strapi-advanced-sitemap.manualSitemaps.type.single": "Single sitemap (URL set)",
|
|
26
|
+
"strapi-advanced-sitemap.manualSitemaps.type.index": "Sitemap index (list of sitemaps)",
|
|
27
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsTitle": "URLs",
|
|
28
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsDescription": "Add the URLs that should appear inside this sitemap file. Reorder to adjust priority.",
|
|
29
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsDescription.index": "Add links to the sitemap files included in this index.",
|
|
30
|
+
"strapi-advanced-sitemap.manualSitemaps.urlsEmpty": "No URLs yet. Add one below.",
|
|
31
|
+
"strapi-advanced-sitemap.manualSitemaps.urlLabel": "Entry #{index}",
|
|
32
|
+
"strapi-advanced-sitemap.manualSitemaps.moveUp": "Move up",
|
|
33
|
+
"strapi-advanced-sitemap.manualSitemaps.moveDown": "Move down",
|
|
34
|
+
"strapi-advanced-sitemap.manualSitemaps.delete": "Delete URL",
|
|
35
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField": "Location",
|
|
36
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField.hint": "Enter only the path or file name. The site URL and base path are added automatically.",
|
|
37
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField.hintPreview": "Enter only the path or file name. Preview: {url}",
|
|
38
|
+
"strapi-advanced-sitemap.manualSitemaps.urlField.preview": "Preview URL: {url}",
|
|
39
|
+
"strapi-advanced-sitemap.manualSitemaps.priorityField": "Priority",
|
|
40
|
+
"strapi-advanced-sitemap.manualSitemaps.addUrl": "Add URL",
|
|
41
|
+
"strapi-advanced-sitemap.manualSitemaps.open": "Show sitemap",
|
|
42
|
+
"strapi-advanced-sitemap.manualSitemaps.publicUrl": "Public URL: {url}",
|
|
43
|
+
"strapi-advanced-sitemap.manualSitemaps.loadFailed": "Failed to load manual sitemaps.",
|
|
44
|
+
"strapi-advanced-sitemap.manualSitemaps.saveFailed": "Failed to save manual sitemaps.",
|
|
45
|
+
"strapi-advanced-sitemap.manualSitemaps.saveSuccess": "Manual sitemaps saved.",
|
|
46
|
+
"strapi-advanced-sitemap.manualSitemaps.loading": "Loading manual sitemap data...",
|
|
47
|
+
"strapi-advanced-sitemap.collectionSitemaps.title": "Collection sitemaps",
|
|
48
|
+
"strapi-advanced-sitemap.collectionSitemaps.subtitle": "Generate sitemap entries from Strapi collection types using dynamic URL patterns.",
|
|
49
|
+
"strapi-advanced-sitemap.collectionSitemaps.add": "Add collection sitemap",
|
|
50
|
+
"strapi-advanced-sitemap.collectionSitemaps.loadFailed": "Failed to load collection sitemap configurations.",
|
|
51
|
+
"strapi-advanced-sitemap.collectionSitemaps.saveSuccess": "Collection sitemap saved.",
|
|
52
|
+
"strapi-advanced-sitemap.collectionSitemaps.deleteSuccess": "Collection sitemap removed.",
|
|
53
|
+
"strapi-advanced-sitemap.collectionSitemaps.deleteFailed": "Failed to delete collection sitemap.",
|
|
54
|
+
"strapi-advanced-sitemap.collectionSitemaps.loading": "Loading collection sitemap data...",
|
|
55
|
+
"strapi-advanced-sitemap.collectionSitemaps.contentTypesFailed": "Failed to load collection types.",
|
|
56
|
+
"strapi-advanced-sitemap.collectionSitemaps.empty": "No collection sitemaps yet. Add one to start generating dynamic entries.",
|
|
57
|
+
"strapi-advanced-sitemap.collectionSitemaps.unknownCollection": "Unknown collection",
|
|
58
|
+
"strapi-advanced-sitemap.collectionSitemaps.cardTitle": "Sitemap #{index}",
|
|
59
|
+
"strapi-advanced-sitemap.collectionSitemaps.edit": "Edit",
|
|
60
|
+
"strapi-advanced-sitemap.collectionSitemaps.remove": "Remove",
|
|
61
|
+
"strapi-advanced-sitemap.collectionSitemaps.pattern": "Pattern",
|
|
62
|
+
"strapi-advanced-sitemap.collectionSitemaps.frequency": "Change frequency",
|
|
63
|
+
"strapi-advanced-sitemap.collectionSitemaps.priority": "Priority",
|
|
64
|
+
"strapi-advanced-sitemap.collectionSitemaps.subPath": "Entry prefix",
|
|
65
|
+
"strapi-advanced-sitemap.collectionSitemaps.fileBasePath": "Route",
|
|
66
|
+
"strapi-advanced-sitemap.collectionSitemaps.filename": "Filename",
|
|
67
|
+
"strapi-advanced-sitemap.collectionSitemaps.lastModified": "Include last modified",
|
|
68
|
+
"strapi-advanced-sitemap.collectionSitemaps.lastModified.yes": "Yes",
|
|
69
|
+
"strapi-advanced-sitemap.collectionSitemaps.lastModified.no": "No",
|
|
70
|
+
"strapi-advanced-sitemap.collectionSitemaps.open": "Show sitemap",
|
|
71
|
+
"strapi-advanced-sitemap.collectionSitemaps.apiFallback": "API URL: {url}",
|
|
72
|
+
"strapi-advanced-sitemap.settings.frontendUrl.title": "Frontend website URL",
|
|
73
|
+
"strapi-advanced-sitemap.settings.frontendUrl.description": "Used to prefix relative sitemap entries and to power link previews.",
|
|
74
|
+
"strapi-advanced-sitemap.settings.frontendUrl.label": "Website URL",
|
|
75
|
+
"strapi-advanced-sitemap.settings.frontendUrl.placeholder": "https://www.example.com",
|
|
76
|
+
"strapi-advanced-sitemap.settings.frontendUrl.hint": "Leave blank to fall back to this Strapi host.",
|
|
77
|
+
"strapi-advanced-sitemap.settings.frontendUrl.loadFailed": "Failed to load the frontend website URL.",
|
|
78
|
+
"strapi-advanced-sitemap.settings.frontendUrl.save": "Save URL",
|
|
79
|
+
"strapi-advanced-sitemap.settings.frontendUrl.saveSuccess": "Frontend website URL saved.",
|
|
80
|
+
"strapi-advanced-sitemap.settings.frontendUrl.saveFailed": "Failed to save the frontend website URL.",
|
|
81
|
+
"strapi-advanced-sitemap.modal.collectionType.close": "Close modal",
|
|
82
|
+
"strapi-advanced-sitemap.modal.collectionType.title": "Collection sitemap",
|
|
83
|
+
"strapi-advanced-sitemap.modal.collectionType.collection": "Collection type",
|
|
84
|
+
"strapi-advanced-sitemap.modal.collectionType.collection.placeholder": "Select a collection type",
|
|
85
|
+
"strapi-advanced-sitemap.modal.collectionType.basePath": "Route (optional)",
|
|
86
|
+
"strapi-advanced-sitemap.modal.collectionType.basePath.hint": "Sets where the sitemap file lives, e.g. /sitemap.",
|
|
87
|
+
"strapi-advanced-sitemap.modal.collectionType.filename": "Filename",
|
|
88
|
+
"strapi-advanced-sitemap.modal.collectionType.filename.hint": "Required to expose the sitemap at the sub URL.",
|
|
89
|
+
"strapi-advanced-sitemap.modal.collectionType.subPath": "Entry prefix (optional)",
|
|
90
|
+
"strapi-advanced-sitemap.modal.collectionType.subPath.hint": "Static path segment added before the pattern.",
|
|
91
|
+
"strapi-advanced-sitemap.modal.collectionType.pattern": "Pattern",
|
|
92
|
+
"strapi-advanced-sitemap.modal.collectionType.pattern.hint": "Use tokens like [slug] to reference entry fields.",
|
|
93
|
+
"strapi-advanced-sitemap.modal.collectionType.priority": "Priority",
|
|
94
|
+
"strapi-advanced-sitemap.modal.collectionType.frequency": "Change frequency",
|
|
95
|
+
"strapi-advanced-sitemap.modal.collectionType.lastModified": "Include last modified",
|
|
96
|
+
"strapi-advanced-sitemap.modal.collectionType.lastModified.yes": "Yes",
|
|
97
|
+
"strapi-advanced-sitemap.modal.collectionType.lastModified.no": "No",
|
|
98
|
+
"strapi-advanced-sitemap.modal.collectionType.error.type": "Select a collection type.",
|
|
99
|
+
"strapi-advanced-sitemap.modal.collectionType.error.pattern": "Provide a pattern for the sitemap entries.",
|
|
100
|
+
"strapi-advanced-sitemap.modal.collectionType.error.request": "Failed to save the collection sitemap.",
|
|
101
|
+
"strapi-advanced-sitemap.modal.action.cancel": "Cancel",
|
|
102
|
+
"strapi-advanced-sitemap.modal.action.save": "Save"
|
|
103
|
+
};
|
|
104
|
+
exports.default = en;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const React = require("react");
|
|
3
|
+
require("react/jsx-runtime");
|
|
4
|
+
require("@strapi/design-system");
|
|
5
|
+
const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
|
|
6
|
+
const v = glob[path];
|
|
7
|
+
if (v) {
|
|
8
|
+
return typeof v === "function" ? v() : Promise.resolve(v);
|
|
9
|
+
}
|
|
10
|
+
return new Promise((_, reject) => {
|
|
11
|
+
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
|
|
12
|
+
reject.bind(
|
|
13
|
+
null,
|
|
14
|
+
new Error(
|
|
15
|
+
"Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
|
|
16
|
+
)
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
const PLUGIN_ID = "strapi-advanced-sitemap";
|
|
22
|
+
const Initializer = ({ setPlugin }) => {
|
|
23
|
+
const ref = React.useRef(false);
|
|
24
|
+
React.useEffect(() => {
|
|
25
|
+
if (!ref.current) {
|
|
26
|
+
setPlugin(PLUGIN_ID);
|
|
27
|
+
ref.current = true;
|
|
28
|
+
}
|
|
29
|
+
}, [setPlugin]);
|
|
30
|
+
return null;
|
|
31
|
+
};
|
|
32
|
+
const index = {
|
|
33
|
+
register(app) {
|
|
34
|
+
app.registerPlugin({
|
|
35
|
+
id: PLUGIN_ID,
|
|
36
|
+
initializer: Initializer,
|
|
37
|
+
isReady: true,
|
|
38
|
+
name: "Strapi Advanced Sitemap"
|
|
39
|
+
});
|
|
40
|
+
app.addSettingsLink(
|
|
41
|
+
{
|
|
42
|
+
id: "sitemap",
|
|
43
|
+
intlLabel: {
|
|
44
|
+
id: `${PLUGIN_ID}.settings.section`,
|
|
45
|
+
defaultMessage: "Advanced Sitemap"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: `${PLUGIN_ID}.settings`,
|
|
50
|
+
intlLabel: {
|
|
51
|
+
id: `${PLUGIN_ID}.settings.title`,
|
|
52
|
+
defaultMessage: "Configuration"
|
|
53
|
+
},
|
|
54
|
+
to: `${PLUGIN_ID}`,
|
|
55
|
+
Component: () => Promise.resolve().then(() => require("./Settings-CDmtmOAh.js"))
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
},
|
|
59
|
+
bootstrap(app) {
|
|
60
|
+
},
|
|
61
|
+
async registerTrads({ locales }) {
|
|
62
|
+
return Promise.all(
|
|
63
|
+
locales.map(async (locale) => {
|
|
64
|
+
if (locale === "en") {
|
|
65
|
+
try {
|
|
66
|
+
const { default: data } = await Promise.resolve().then(() => require("./en-DXDFX_Yk.js"));
|
|
67
|
+
return { data, locale };
|
|
68
|
+
} catch {
|
|
69
|
+
return { data: {}, locale };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-DXDFX_Yk.js")) }), `./translations/${locale}.json`, 3);
|
|
74
|
+
return { data, locale };
|
|
75
|
+
} catch {
|
|
76
|
+
return { data: {}, locale };
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
exports.PLUGIN_ID = PLUGIN_ID;
|
|
83
|
+
exports.index = index;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { useRef, useEffect } from "react";
|
|
2
|
+
import "react/jsx-runtime";
|
|
3
|
+
import "@strapi/design-system";
|
|
4
|
+
const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
|
|
5
|
+
const v = glob[path];
|
|
6
|
+
if (v) {
|
|
7
|
+
return typeof v === "function" ? v() : Promise.resolve(v);
|
|
8
|
+
}
|
|
9
|
+
return new Promise((_, reject) => {
|
|
10
|
+
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
|
|
11
|
+
reject.bind(
|
|
12
|
+
null,
|
|
13
|
+
new Error(
|
|
14
|
+
"Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
);
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
const PLUGIN_ID = "strapi-advanced-sitemap";
|
|
21
|
+
const Initializer = ({ setPlugin }) => {
|
|
22
|
+
const ref = useRef(false);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!ref.current) {
|
|
25
|
+
setPlugin(PLUGIN_ID);
|
|
26
|
+
ref.current = true;
|
|
27
|
+
}
|
|
28
|
+
}, [setPlugin]);
|
|
29
|
+
return null;
|
|
30
|
+
};
|
|
31
|
+
const index = {
|
|
32
|
+
register(app) {
|
|
33
|
+
app.registerPlugin({
|
|
34
|
+
id: PLUGIN_ID,
|
|
35
|
+
initializer: Initializer,
|
|
36
|
+
isReady: true,
|
|
37
|
+
name: "Strapi Advanced Sitemap"
|
|
38
|
+
});
|
|
39
|
+
app.addSettingsLink(
|
|
40
|
+
{
|
|
41
|
+
id: "sitemap",
|
|
42
|
+
intlLabel: {
|
|
43
|
+
id: `${PLUGIN_ID}.settings.section`,
|
|
44
|
+
defaultMessage: "Advanced Sitemap"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: `${PLUGIN_ID}.settings`,
|
|
49
|
+
intlLabel: {
|
|
50
|
+
id: `${PLUGIN_ID}.settings.title`,
|
|
51
|
+
defaultMessage: "Configuration"
|
|
52
|
+
},
|
|
53
|
+
to: `${PLUGIN_ID}`,
|
|
54
|
+
Component: () => import("./Settings-O4TWg_hE.mjs")
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
},
|
|
58
|
+
bootstrap(app) {
|
|
59
|
+
},
|
|
60
|
+
async registerTrads({ locales }) {
|
|
61
|
+
return Promise.all(
|
|
62
|
+
locales.map(async (locale) => {
|
|
63
|
+
if (locale === "en") {
|
|
64
|
+
try {
|
|
65
|
+
const { default: data } = await import("./en-B2cxOPRT.mjs");
|
|
66
|
+
return { data, locale };
|
|
67
|
+
} catch {
|
|
68
|
+
return { data: {}, locale };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-B2cxOPRT.mjs") }), `./translations/${locale}.json`, 3);
|
|
73
|
+
return { data, locale };
|
|
74
|
+
} catch {
|
|
75
|
+
return { data: {}, locale };
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
export {
|
|
82
|
+
PLUGIN_ID as P,
|
|
83
|
+
index as i
|
|
84
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const PLUGIN_ID = 'strapi-advanced-sitemap';
|
|
4
|
+
|
|
5
|
+
const trimSlashes = (value = '') => value.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
6
|
+
const { ensureSitemapPermission, ACTIONS, registerSitemapActions } = require('./utils/check-sitemap-permission');
|
|
7
|
+
|
|
8
|
+
const getRequestOrigin = (ctx) => {
|
|
9
|
+
if (ctx.origin) {
|
|
10
|
+
return ctx.origin;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const protocol = ctx.request?.protocol || ctx.protocol || 'http';
|
|
14
|
+
const host =
|
|
15
|
+
ctx.request?.header?.['x-forwarded-host'] ||
|
|
16
|
+
ctx.request?.header?.host ||
|
|
17
|
+
ctx.request?.hostname ||
|
|
18
|
+
ctx.hostname;
|
|
19
|
+
|
|
20
|
+
return `${protocol}://${host}`;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
module.exports = async ({ strapi }) => {
|
|
24
|
+
await registerSitemapActions();
|
|
25
|
+
|
|
26
|
+
strapi.server.use(async (ctx, next) => {
|
|
27
|
+
try {
|
|
28
|
+
if (ctx.method !== 'GET') {
|
|
29
|
+
return next();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const normalizedPath = trimSlashes(ctx.path || '');
|
|
33
|
+
|
|
34
|
+
if (!normalizedPath || normalizedPath.startsWith('admin') || normalizedPath.startsWith('api/')) {
|
|
35
|
+
return next();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const sitemapService = strapi.plugin(PLUGIN_ID).service('service');
|
|
39
|
+
|
|
40
|
+
if (normalizedPath === 'sitemap.xml') {
|
|
41
|
+
const allowed = await ensureSitemapPermission(ctx, ACTIONS.root);
|
|
42
|
+
if (!allowed) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const [manualSitemaps, collectionConfigs, configuredBaseUrl] = await Promise.all([
|
|
47
|
+
sitemapService.getManualSitemaps(),
|
|
48
|
+
sitemapService.getCollectionConfigs(),
|
|
49
|
+
sitemapService.getConfiguredBaseUrl(),
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
const origin = getRequestOrigin(ctx);
|
|
53
|
+
const apiBaseUrl = `${origin}/api/${PLUGIN_ID}`;
|
|
54
|
+
const publicBaseUrl = sitemapService.resolveBaseUrl(configuredBaseUrl, origin);
|
|
55
|
+
const xml = sitemapService.buildRootSitemap(manualSitemaps, collectionConfigs, {
|
|
56
|
+
apiBaseUrl,
|
|
57
|
+
publicBaseUrl,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
ctx.set('Content-Type', 'application/xml; charset=utf-8');
|
|
61
|
+
ctx.set('Cache-Control', 'no-store');
|
|
62
|
+
ctx.body = xml;
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!normalizedPath.endsWith('.xml')) {
|
|
67
|
+
return next();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const segments = normalizedPath.split('/');
|
|
71
|
+
const filename = segments.pop();
|
|
72
|
+
if (!filename) {
|
|
73
|
+
return next();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const basePath = segments.join('/');
|
|
77
|
+
const manualSitemaps = await sitemapService.getManualSitemaps();
|
|
78
|
+
const target = manualSitemaps.find((item) => {
|
|
79
|
+
const storedBase = trimSlashes(item.basePath || '');
|
|
80
|
+
const storedFilename = trimSlashes(item.filename || '');
|
|
81
|
+
return storedFilename === trimSlashes(filename) && storedBase === basePath;
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const configuredBaseUrl = await sitemapService.getConfiguredBaseUrl();
|
|
85
|
+
const origin = getRequestOrigin(ctx);
|
|
86
|
+
const publicBaseUrl = sitemapService.resolveBaseUrl(configuredBaseUrl, origin);
|
|
87
|
+
|
|
88
|
+
if (target) {
|
|
89
|
+
const allowed = await ensureSitemapPermission(ctx, ACTIONS.manualFile);
|
|
90
|
+
if (!allowed) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const xml = sitemapService.buildManualSitemapFile(target, publicBaseUrl);
|
|
95
|
+
ctx.set('Content-Type', 'application/xml; charset=utf-8');
|
|
96
|
+
ctx.set('Cache-Control', 'no-store');
|
|
97
|
+
ctx.body = xml;
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const collectionConfigs = await sitemapService.getCollectionConfigs();
|
|
102
|
+
const collectionTarget = collectionConfigs.find((config) => {
|
|
103
|
+
const storedBase = trimSlashes(config.basePath || '');
|
|
104
|
+
const storedFilename = trimSlashes(config.filename || '');
|
|
105
|
+
return storedFilename === trimSlashes(filename) && storedBase === basePath;
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
if (!collectionTarget) {
|
|
109
|
+
return next();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const allowed = await ensureSitemapPermission(ctx, ACTIONS.collectionFile);
|
|
113
|
+
if (!allowed) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const xml = await sitemapService.buildCollectionSitemapFile(collectionTarget, publicBaseUrl);
|
|
118
|
+
|
|
119
|
+
ctx.set('Content-Type', 'application/xml; charset=utf-8');
|
|
120
|
+
ctx.set('Cache-Control', 'no-store');
|
|
121
|
+
ctx.body = xml;
|
|
122
|
+
return undefined;
|
|
123
|
+
} catch (error) {
|
|
124
|
+
strapi.log.error(`[${PLUGIN_ID}] Failed to serve sitemap: ${error?.message || error}`);
|
|
125
|
+
return next();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": {
|
|
3
|
+
"collectionName": "strapi_sitemap_content_types",
|
|
4
|
+
"info": {
|
|
5
|
+
"singularName": "strapi-advanced-sitemap-content-type",
|
|
6
|
+
"pluralName": "strapi-advanced-sitemap-content-types",
|
|
7
|
+
"displayName": "strapi-advanced-sitemap-content-type"
|
|
8
|
+
},
|
|
9
|
+
"options": {
|
|
10
|
+
"draftAndPublish": false,
|
|
11
|
+
"comment": ""
|
|
12
|
+
},
|
|
13
|
+
"pluginOptions": {
|
|
14
|
+
"content-manager": { "visible": false },
|
|
15
|
+
"content-type-builder": { "visible": false }
|
|
16
|
+
},
|
|
17
|
+
"attributes": {
|
|
18
|
+
"type": { "type": "string" },
|
|
19
|
+
"subPath": { "type": "string" },
|
|
20
|
+
"pattern": { "type": "string" },
|
|
21
|
+
"priority": { "type": "float" },
|
|
22
|
+
"frequency": { "type": "string" },
|
|
23
|
+
"lastModified": { "type": "string" },
|
|
24
|
+
"basePath": { "type": "string" },
|
|
25
|
+
"filename": { "type": "string" }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
'strapi-advanced-sitemap-option': require('./option/schema.json'),
|
|
5
|
+
'strapi-advanced-sitemap-content-type': require('./content-type/schema.json'),
|
|
6
|
+
'strapi-advanced-sitemap-single-url': require('./single-url/schema.json'),
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": {
|
|
3
|
+
"collectionName": "strapi_sitemap_options",
|
|
4
|
+
"info": {
|
|
5
|
+
"singularName": "strapi-advanced-sitemap-option",
|
|
6
|
+
"pluralName": "strapi-advanced-sitemap-options",
|
|
7
|
+
"displayName": "strapi-advanced-sitemap-option"
|
|
8
|
+
},
|
|
9
|
+
"options": {
|
|
10
|
+
"draftAndPublish": false,
|
|
11
|
+
"comment": ""
|
|
12
|
+
},
|
|
13
|
+
"pluginOptions": {
|
|
14
|
+
"content-manager": { "visible": false },
|
|
15
|
+
"content-type-builder": { "visible": false }
|
|
16
|
+
},
|
|
17
|
+
"kind": "singleType",
|
|
18
|
+
"attributes": {
|
|
19
|
+
"baseUrl": { "type": "string" }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": {
|
|
3
|
+
"collectionName": "strapi_sitemap_single_urls",
|
|
4
|
+
"info": {
|
|
5
|
+
"singularName": "strapi-advanced-sitemap-single-url",
|
|
6
|
+
"pluralName": "strapi-advanced-sitemap-single-urls",
|
|
7
|
+
"displayName": "strapi-advanced-sitemap-single-url"
|
|
8
|
+
},
|
|
9
|
+
"options": {
|
|
10
|
+
"draftAndPublish": false,
|
|
11
|
+
"comment": ""
|
|
12
|
+
},
|
|
13
|
+
"pluginOptions": {
|
|
14
|
+
"content-manager": { "visible": false },
|
|
15
|
+
"content-type-builder": { "visible": false }
|
|
16
|
+
},
|
|
17
|
+
"attributes": {
|
|
18
|
+
"slug": { "type": "string" },
|
|
19
|
+
"priority": { "type": "float" },
|
|
20
|
+
"frequency": { "type": "string" }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|