@newskit-render/feed 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +119 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +14 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/sitemap/__tests__/mocks.d.ts +9 -0
  6. package/dist/sitemap/__tests__/mocks.js +73 -0
  7. package/dist/sitemap/__tests__/mocks.js.map +1 -0
  8. package/dist/sitemap/generic-sitemap-resolver.d.ts +5 -0
  9. package/dist/sitemap/generic-sitemap-resolver.js +108 -0
  10. package/dist/sitemap/generic-sitemap-resolver.js.map +1 -0
  11. package/dist/sitemap/helpers/create-sitemap.d.ts +7 -0
  12. package/dist/sitemap/helpers/create-sitemap.js +79 -0
  13. package/dist/sitemap/helpers/create-sitemap.js.map +1 -0
  14. package/dist/sitemap/helpers/publisherGroupInfo.d.ts +8 -0
  15. package/dist/sitemap/helpers/publisherGroupInfo.js +11 -0
  16. package/dist/sitemap/helpers/publisherGroupInfo.js.map +1 -0
  17. package/dist/sitemap/helpers/queryArticleList.d.ts +6 -0
  18. package/dist/sitemap/helpers/queryArticleList.js +90 -0
  19. package/dist/sitemap/helpers/queryArticleList.js.map +1 -0
  20. package/dist/sitemap/helpers/queryPage.d.ts +4 -0
  21. package/dist/sitemap/helpers/queryPage.js +89 -0
  22. package/dist/sitemap/helpers/queryPage.js.map +1 -0
  23. package/dist/sitemap/helpers/types.d.ts +68 -0
  24. package/dist/sitemap/helpers/types.js +9 -0
  25. package/dist/sitemap/helpers/types.js.map +1 -0
  26. package/dist/sitemap/helpers/utils.d.ts +9 -0
  27. package/dist/sitemap/helpers/utils.js +40 -0
  28. package/dist/sitemap/helpers/utils.js.map +1 -0
  29. package/dist/sitemap/index.d.ts +5 -0
  30. package/dist/sitemap/index.js +13 -0
  31. package/dist/sitemap/index.js.map +1 -0
  32. package/dist/sitemap/news-sitemap-resolver.d.ts +5 -0
  33. package/dist/sitemap/news-sitemap-resolver.js +66 -0
  34. package/dist/sitemap/news-sitemap-resolver.js.map +1 -0
  35. package/dist/sitemap/queries/getArticleList.d.ts +1 -0
  36. package/dist/sitemap/queries/getArticleList.js +11 -0
  37. package/dist/sitemap/queries/getArticleList.js.map +1 -0
  38. package/dist/sitemap/queries/getChannelsList.d.ts +1 -0
  39. package/dist/sitemap/queries/getChannelsList.js +11 -0
  40. package/dist/sitemap/queries/getChannelsList.js.map +1 -0
  41. package/dist/sitemap/queries/getPage.d.ts +1 -0
  42. package/dist/sitemap/queries/getPage.js +11 -0
  43. package/dist/sitemap/queries/getPage.js.map +1 -0
  44. package/dist/sitemap/queries/index.d.ts +1 -0
  45. package/dist/sitemap/queries/index.js +14 -0
  46. package/dist/sitemap/queries/index.js.map +1 -0
  47. package/package.json +47 -0
package/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # @newskit-render/feed
2
+
3
+ A package used for the generation of different types of sitemaps. You can see an example here: [@newskit-render/core](https://www.npmjs.com/package/@newskit-render/core)
4
+
5
+ ## Getting started
6
+
7
+ ### Add it as a dependency:
8
+
9
+ ```
10
+ npm install @newskit-render/sitemap
11
+ ```
12
+
13
+ or
14
+
15
+ ```
16
+ yarn add @newskit-render/sitemap
17
+ ```
18
+
19
+ ### Create sitemap pages
20
+
21
+ Under your `/pages/api` folder create `sitemap.ts` and `news-sitemap.ts` files.
22
+
23
+ ### Implementation
24
+
25
+ #### genericSitemap
26
+
27
+ `sitemapXml` - generic function which is needed by Next.js to resolve page route
28
+
29
+ `genericSitemap` - this function will handle the logic for `sitemap.xml` and `sitemap.xml?query=1` routes. It will receive the following parameters:
30
+
31
+ `context` (required) - Next.js context object (only needs `res` and `query` from context but its easier to destructor as below)
32
+
33
+ `publisher, domain, firstArticleDate, publicationName` (required): Required properties for correctly building the sitemap.xml.
34
+ The _domain_ is the domain of your website. The _firstArticleDate_ is the date of the first article you have published, this will set from when the generic sitemap will produce query sitemaps. _publisher_ is the name of the publisher in the NewsKit API, this string will be used for fetching the articles for the correct publication. _publicationName_ is the name of the publication, used inside the sitemap `<news:name>${publicationName}</news:name>` tag.
35
+
36
+ `CustomStaticPageCollection` (optional): Provides the possibility to manually add a list of static pages, that do not exist in an API. The format of the static page is in the example.
37
+ Below an example.
38
+
39
+ ```
40
+ import { NextApiRequest, NextApiResponse } from 'next'
41
+ import { genericSitemap, PublisherGroup, CustomStaticPage } from '@newskit-render/sitemap'
42
+
43
+ const defaultCustomStaticPagesCollection: CustomStaticPage[] = [
44
+ {
45
+ channel: 'test-custom-page',
46
+ },
47
+ ]
48
+
49
+ const handler = async (req: NextApiRequest, res: NextApiResponse) =>
50
+ genericSitemap({
51
+ res,
52
+ query: req.query,
53
+ publisher: process.env.PUBLISHER as PublisherGroup,
54
+ domain: new URL(process.env.SITE_HOST).host,
55
+ firstArticleDate: process.env.SITEMAP_FIRST_PUBLICATION_DATE,
56
+ publicationName: process.env.SITEMAP_PUBLICATION_NAME,
57
+ customStaticPageCollection: defaultCustomStaticPagesCollection,
58
+ })
59
+
60
+ export default handler
61
+
62
+ ```
63
+
64
+ You will find the env vars in `/helm/value-{env}.yaml`
65
+
66
+ example values are:
67
+
68
+ ```
69
+ publisher: 'VIRGIN',
70
+ domain: 'virginradio.co.uk',
71
+ firstArticleDate: '2016-3-1',
72
+ publicationName: 'Virgin Radio',
73
+ ```
74
+
75
+ #### newsSitemap
76
+
77
+ `newsSitemap` - this function will handle the logic for `news-sitemap.xml.ts` route. It will receive the following parameters:
78
+
79
+ `context` (required) - Next.js context object (only needs `res` from context but its easier to destructor as below)
80
+
81
+ `publisher, domain, publicationName` (required): Required properties for correctly building the sitemap.xml.
82
+ The _domain_ is the domain of your website. _publisher_ is the name of the publisher in the NewsKit API, this string will be used for fetching the articles for the correct publication. _publicationName_ is the name of the publication, used inside the sitemap `<news:name>${publicationName}</news:name>` tag.
83
+
84
+ Below an example.
85
+
86
+ ```
87
+ import { NextApiRequest, NextApiResponse } from 'next'
88
+ import { newsSitemap, PublisherGroup } from '@newskit-render/sitemap'
89
+
90
+ const handler = async (req: NextApiRequest, res: NextApiResponse) =>
91
+ newsSitemap({
92
+ res,
93
+ publisher: process.env.PUBLISHER as PublisherGroup,
94
+ domain: new URL(process.env.SITE_HOST).host,
95
+ publicationName: process.env.SITEMAP_PUBLICATION_NAME,
96
+ })
97
+
98
+ export default handler
99
+
100
+ ```
101
+
102
+ You will also need to add this to the `next.config.js` file:
103
+
104
+ ```
105
+ module.exports = {
106
+ async rewrites() {
107
+ return [
108
+ {
109
+ source: '/sitemap.xml',
110
+ destination: '/api/sitemap'
111
+ },
112
+ {
113
+ source: '/news-sitemap.xml',
114
+ destination: '/api/news-sitemap'
115
+ }
116
+ ];
117
+ }
118
+ }
119
+ ```
@@ -0,0 +1 @@
1
+ export * from './sitemap';
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./sitemap"), exports);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAyB"}
@@ -0,0 +1,9 @@
1
+ import { Article, StaticPage } from '../helpers/types';
2
+ export declare const sitemapXmlMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex \n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" \n>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?channel=page-slug</loc>\n </sitemap>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?yyyy=2016&amp;mm=04&amp;dd=02</loc>\n </sitemap>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?yyyy=2016&amp;mm=04&amp;dd=01</loc>\n </sitemap>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?yyyy=2016&amp;mm=03&amp;dd=31</loc>\n </sitemap>\n</sitemapindex>\n";
3
+ export declare const apolloClientResponseMock: Article[];
4
+ export declare const apolloClientPageResponseMock: Omit<StaticPage, 'url'>;
5
+ export declare const generalSitemapXmlMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\n>\n <url>\n <loc>https://virginradio.co.uk/test-category/1/news-title-1</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-30T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insert caption here*</image:caption>\n <image:credit>I don&#39;t know what this is</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n\n <url>\n <loc>https://virginradio.co.uk/test-category/2/news-title-2</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n</urlset>\n";
6
+ export declare const newsSitemapXmlMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:news=\"http://www.google.com/schemas/sitemap-news/0.9\"\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\n>\n<url>\n <loc>https://virginradio.co.uk/test-category/1/news-title-1</loc>\n <news:news>\n <news:publication>\n <news:name>Virgin Radio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-30T08:18:39.000Z</news:publication_date>\n <news:title>News Title 1</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-30T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insert caption here*</image:caption>\n <image:credit>I don&#39;t know what this is</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n</url>\n<url>\n <loc>https://virginradio.co.uk/test-category/2/news-title-2</loc>\n <news:news>\n <news:publication>\n <news:name>Virgin Radio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-31T08:18:39.000Z</news:publication_date>\n <news:title>News Title 2</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n<url>\n <loc>https://virginradio.co.uk/test-category/1/news-title-1</loc>\n <news:news>\n <news:publication>\n <news:name>VirginRadio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-30T08:18:39.000Z</news:publication_date>\n <news:title>NewsTitle1</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-30T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insertcaptionhere*</image:caption>\n <image:credit>Idon&#39;tknowwhatthisis</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n</url>\n <url>\n <loc>https://virginradio.co.uk/test-category/2/news-title-2</loc>\n <news:news>\n <news:publication>\n <news:name>VirginRadio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-31T08:18:39.000Z</news:publication_date>\n <news:title>NewsTitle2</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n</urlset>";
7
+ export declare const pageSitemapResponseMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\n>\n <url>\n <loc>https://virginradio.co.uk/page-slug</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insert caption here*</image:caption>\n <image:credit>I don&#39;t know what this is</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n</urlset>\n";
8
+ export declare const customStaticPageResponseMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n <url>\n <loc>https://virginradio.co.uk/test-custom-page</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T00:00:00.000Z</lastmod>\n </url>\n</urlset>\n";
9
+ export declare const customStaticPageResponseMockWithUrl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n <url>\n <loc>https://localhost:3000/test-custom-page</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T00:00:00.000Z</lastmod>\n </url>\n</urlset>\n";
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.customStaticPageResponseMockWithUrl = exports.customStaticPageResponseMock = exports.pageSitemapResponseMock = exports.newsSitemapXmlMock = exports.generalSitemapXmlMock = exports.apolloClientPageResponseMock = exports.apolloClientResponseMock = exports.sitemapXmlMock = void 0;
4
+ exports.sitemapXmlMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex \n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" \n>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?channel=page-slug</loc>\n </sitemap>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?yyyy=2016&amp;mm=04&amp;dd=02</loc>\n </sitemap>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?yyyy=2016&amp;mm=04&amp;dd=01</loc>\n </sitemap>\n <sitemap>\n <loc>https://virginradio.co.uk/sitemap.xml?yyyy=2016&amp;mm=03&amp;dd=31</loc>\n </sitemap>\n</sitemapindex>\n";
5
+ exports.apolloClientResponseMock = [
6
+ {
7
+ id: 1,
8
+ publisher: 'VIRGIN',
9
+ headline: 'News Title 1',
10
+ publishedDateTime: '2021-05-30T08:18:39.000Z',
11
+ body: [
12
+ {
13
+ url: 'some-image-url',
14
+ caption: '*insert caption here*',
15
+ credit: "I don't know what this is",
16
+ alt: 'text instead of image',
17
+ },
18
+ {
19
+ url: 'another-image-url',
20
+ },
21
+ ],
22
+ categories: [
23
+ {
24
+ id: '2',
25
+ parentId: '1',
26
+ slug: 'test-category',
27
+ title: 'Test Category',
28
+ type: 'category',
29
+ },
30
+ ],
31
+ },
32
+ {
33
+ id: 2,
34
+ publisher: 'VIRGIN',
35
+ headline: 'News Title 2',
36
+ publishedDateTime: '2021-05-31T08:18:39.000Z',
37
+ body: [
38
+ {
39
+ url: 'another-image-url',
40
+ },
41
+ ],
42
+ categories: [
43
+ {
44
+ id: '2',
45
+ parentId: '1',
46
+ slug: 'test-category',
47
+ title: 'Test Category',
48
+ type: 'category',
49
+ },
50
+ ],
51
+ },
52
+ ];
53
+ exports.apolloClientPageResponseMock = {
54
+ slug: 'page-slug',
55
+ datePublished: '2021-05-31T08:18:39.000Z',
56
+ body: [
57
+ {
58
+ url: 'some-image-url',
59
+ caption: '*insert caption here*',
60
+ credit: "I don't know what this is",
61
+ alt: 'text instead of image',
62
+ },
63
+ {
64
+ url: 'another-image-url',
65
+ },
66
+ ],
67
+ };
68
+ exports.generalSitemapXmlMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\n>\n <url>\n <loc>https://virginradio.co.uk/test-category/1/news-title-1</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-30T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insert caption here*</image:caption>\n <image:credit>I don&#39;t know what this is</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n\n <url>\n <loc>https://virginradio.co.uk/test-category/2/news-title-2</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n</urlset>\n";
69
+ exports.newsSitemapXmlMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:news=\"http://www.google.com/schemas/sitemap-news/0.9\"\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\n>\n<url>\n <loc>https://virginradio.co.uk/test-category/1/news-title-1</loc>\n <news:news>\n <news:publication>\n <news:name>Virgin Radio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-30T08:18:39.000Z</news:publication_date>\n <news:title>News Title 1</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-30T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insert caption here*</image:caption>\n <image:credit>I don&#39;t know what this is</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n</url>\n<url>\n <loc>https://virginradio.co.uk/test-category/2/news-title-2</loc>\n <news:news>\n <news:publication>\n <news:name>Virgin Radio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-31T08:18:39.000Z</news:publication_date>\n <news:title>News Title 2</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n<url>\n <loc>https://virginradio.co.uk/test-category/1/news-title-1</loc>\n <news:news>\n <news:publication>\n <news:name>VirginRadio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-30T08:18:39.000Z</news:publication_date>\n <news:title>NewsTitle1</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-30T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insertcaptionhere*</image:caption>\n <image:credit>Idon&#39;tknowwhatthisis</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n</url>\n <url>\n <loc>https://virginradio.co.uk/test-category/2/news-title-2</loc>\n <news:news>\n <news:publication>\n <news:name>VirginRadio</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>2021-05-31T08:18:39.000Z</news:publication_date>\n <news:title>NewsTitle2</news:title>\n </news:news>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n</urlset>";
70
+ exports.pageSitemapResponseMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\n>\n <url>\n <loc>https://virginradio.co.uk/page-slug</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T08:18:39.000Z</lastmod>\n <image:image>\n <image:loc>some-image-url</image:loc>\n <image:caption>*insert caption here*</image:caption>\n <image:credit>I don&#39;t know what this is</image:credit>\n </image:image>\n <image:image>\n <image:loc>another-image-url</image:loc>\n </image:image>\n </url>\n</urlset>\n";
71
+ exports.customStaticPageResponseMock = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n <url>\n <loc>https://virginradio.co.uk/test-custom-page</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T00:00:00.000Z</lastmod>\n </url>\n</urlset>\n";
72
+ exports.customStaticPageResponseMockWithUrl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n <url>\n <loc>https://localhost:3000/test-custom-page</loc>\n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>2021-05-31T00:00:00.000Z</lastmod>\n </url>\n</urlset>\n";
73
+ //# sourceMappingURL=mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../../src/sitemap/__tests__/mocks.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAG,4jBAiB7B,CAAA;AAEY,QAAA,wBAAwB,GAAc;IACjD;QACE,EAAE,EAAE,CAAC;QACL,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,cAAc;QACxB,iBAAiB,EAAE,0BAA0B;QAC7C,IAAI,EAAE;YACJ;gBACE,GAAG,EAAE,gBAAgB;gBACrB,OAAO,EAAE,uBAAuB;gBAChC,MAAM,EAAE,2BAA2B;gBACnC,GAAG,EAAE,uBAAuB;aAC7B;YACD;gBACE,GAAG,EAAE,mBAAmB;aACzB;SACF;QACD,UAAU,EAAE;YACV;gBACE,EAAE,EAAE,GAAG;gBACP,QAAQ,EAAE,GAAG;gBACb,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,UAAU;aACjB;SACF;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,cAAc;QACxB,iBAAiB,EAAE,0BAA0B;QAC7C,IAAI,EAAE;YACJ;gBACE,GAAG,EAAE,mBAAmB;aACzB;SACF;QACD,UAAU,EAAE;YACV;gBACE,EAAE,EAAE,GAAG;gBACP,QAAQ,EAAE,GAAG;gBACb,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,UAAU;aACjB;SACF;KACF;CACF,CAAA;AAEY,QAAA,4BAA4B,GAA4B;IACnE,IAAI,EAAE,WAAW;IACjB,aAAa,EAAE,0BAA0B;IACzC,IAAI,EAAE;QACJ;YACE,GAAG,EAAE,gBAAgB;YACrB,OAAO,EAAE,uBAAuB;YAChC,MAAM,EAAE,2BAA2B;YACnC,GAAG,EAAE,uBAAuB;SAC7B;QACD;YACE,GAAG,EAAE,mBAAmB;SACzB;KACF;CACF,CAAA;AAEY,QAAA,qBAAqB,GAAG,6jCA8BpC,CAAA;AAEY,QAAA,kBAAkB,GAAG,q4FAoFxB,CAAA;AAEG,QAAA,uBAAuB,GAAG,8tBAoBtC,CAAA;AACY,QAAA,4BAA4B,GAAG,gVAS3C,CAAA;AACY,QAAA,mCAAmC,GAAG,6UASlD,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { GenericSitemapConfig } from './helpers/types';
2
+ declare const genericSitemap: ({ res, query, publisher, domain, publicationName, firstArticleDate, customStaticPageCollection, }: GenericSitemapConfig) => Promise<{
3
+ props: Record<string, never>;
4
+ }>;
5
+ export default genericSitemap;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ var create_sitemap_1 = require("./helpers/create-sitemap");
51
+ var utils_1 = require("./helpers/utils");
52
+ var queryArticleList_1 = require("./helpers/queryArticleList");
53
+ var queryPage_1 = require("./helpers/queryPage");
54
+ var api_1 = require("@newskit-render/api");
55
+ var genericSitemap = function (_a) {
56
+ var res = _a.res, query = _a.query, publisher = _a.publisher, domain = _a.domain, publicationName = _a.publicationName, firstArticleDate = _a.firstArticleDate, customStaticPageCollection = _a.customStaticPageCollection;
57
+ return __awaiter(void 0, void 0, void 0, function () {
58
+ var apolloClient, customStaticPage, page, _b, _c, result_1, startDay, endDay, dates, articleListCollection, result_2, startDate, todayDate, dateCollection, channelsCollection, result;
59
+ return __generator(this, function (_d) {
60
+ switch (_d.label) {
61
+ case 0: return [4 /*yield*/, (0, api_1.createApolloClient)(api_1.ClientTypes.nkapi)];
62
+ case 1:
63
+ apolloClient = _d.sent();
64
+ if (!query.channel) return [3 /*break*/, 5];
65
+ customStaticPage = customStaticPageCollection === null || customStaticPageCollection === void 0 ? void 0 : customStaticPageCollection.find(function (page) { return page.channel === query.channel; });
66
+ if (!customStaticPage) return [3 /*break*/, 2];
67
+ _b = {
68
+ slug: customStaticPage.channel,
69
+ datePublished: new Date().toISOString(),
70
+ body: [],
71
+ url: customStaticPage.url || domain,
72
+ };
73
+ return [3 /*break*/, 4];
74
+ case 2:
75
+ _c = [{}];
76
+ return [4 /*yield*/, (0, queryPage_1.queryPage)(publisher, query.channel, apolloClient)];
77
+ case 3:
78
+ _b = __assign.apply(void 0, [__assign.apply(void 0, _c.concat([(_d.sent())])), { url: domain }]);
79
+ _d.label = 4;
80
+ case 4:
81
+ page = _b;
82
+ result_1 = (0, create_sitemap_1.buildStaticPageSitemap)(page);
83
+ return [2 /*return*/, (0, utils_1.setResponse)(res, result_1)];
84
+ case 5:
85
+ if (!(query.yyyy && query.mm && query.dd)) return [3 /*break*/, 7];
86
+ startDay = query.yyyy + "-" + query.mm + "-" + query.dd + " 00:01:00";
87
+ endDay = query.yyyy + "-" + query.mm + "-" + query.dd + " 23:59:59:00";
88
+ dates = { from: startDay, to: endDay };
89
+ return [4 /*yield*/, (0, queryArticleList_1.queryArticleList)(publisher, dates, apolloClient)];
90
+ case 6:
91
+ articleListCollection = _d.sent();
92
+ result_2 = (0, create_sitemap_1.createArticleSitemap)(articleListCollection, domain, publicationName, false);
93
+ return [2 /*return*/, (0, utils_1.setResponse)(res, result_2)];
94
+ case 7:
95
+ startDate = new Date(firstArticleDate);
96
+ todayDate = new Date();
97
+ dateCollection = (0, utils_1.getDateList)(startDate, todayDate);
98
+ return [4 /*yield*/, (0, queryPage_1.queryChannelsList)(publisher, apolloClient)];
99
+ case 8:
100
+ channelsCollection = _d.sent();
101
+ result = (0, create_sitemap_1.createSitemap)(domain, dateCollection, channelsCollection, customStaticPageCollection);
102
+ return [2 /*return*/, (0, utils_1.setResponse)(res, result)];
103
+ }
104
+ });
105
+ });
106
+ };
107
+ exports.default = genericSitemap;
108
+ //# sourceMappingURL=generic-sitemap-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-sitemap-resolver.js","sourceRoot":"","sources":["../../src/sitemap/generic-sitemap-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAIiC;AACjC,yCAA0D;AAC1D,+DAA6D;AAC7D,iDAAkE;AAElE,2CAAqE;AAErE,IAAM,cAAc,GAAG,UAAO,EAQP;QAPrB,GAAG,SAAA,EACH,KAAK,WAAA,EACL,SAAS,eAAA,EACT,MAAM,YAAA,EACN,eAAe,qBAAA,EACf,gBAAgB,sBAAA,EAChB,0BAA0B,gCAAA;;;;;wBAEL,qBAAM,IAAA,wBAAkB,EAAC,iBAAW,CAAC,KAAK,CAAC,EAAA;;oBAA1D,YAAY,GAAG,SAA2C;yBAE5D,KAAK,CAAC,OAAO,EAAb,wBAAa;oBACT,gBAAgB,GAAG,0BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAE,IAAI,CACvD,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAA9B,CAA8B,CACzC,CAAA;yBACwB,gBAAgB,EAAhB,wBAAgB;oBACrC,KAAA;wBACE,IAAI,EAAE,gBAAgB,CAAC,OAAO;wBAC9B,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACvC,IAAI,EAAE,EAAE;wBACR,GAAG,EAAE,gBAAgB,CAAC,GAAG,IAAI,MAAM;qBACpC,CAAA;;;;oBAEK,qBAAM,IAAA,qBAAS,EACjB,SAAS,EACT,KAAK,CAAC,OAAiB,EACvB,YAAY,CACb,EAAA;;mFAJE,CAAC,SAIH,CAAC,OACF,GAAG,EAAE,MAAM;;;oBAbX,IAAI,KAcL;oBACC,WAAS,IAAA,uCAAsB,EAAC,IAAI,CAAC,CAAA;oBAC3C,sBAAO,IAAA,mBAAW,EAAC,GAAG,EAAE,QAAM,CAAC,EAAA;;yBAE7B,CAAA,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAA,EAAlC,wBAAkC;oBAC9B,QAAQ,GAAM,KAAK,CAAC,IAAI,SAAI,KAAK,CAAC,EAAE,SAAI,KAAK,CAAC,EAAE,cAAW,CAAA;oBAC3D,MAAM,GAAM,KAAK,CAAC,IAAI,SAAI,KAAK,CAAC,EAAE,SAAI,KAAK,CAAC,EAAE,iBAAc,CAAA;oBAC5D,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;oBAEd,qBAAM,IAAA,mCAAgB,EAClD,SAAS,EACT,KAAK,EACL,YAAY,CACb,EAAA;;oBAJK,qBAAqB,GAAG,SAI7B;oBACK,WAAS,IAAA,qCAAoB,EACjC,qBAAqB,EACrB,MAAM,EACN,eAAe,EACf,KAAK,CACN,CAAA;oBAED,sBAAO,IAAA,mBAAW,EAAC,GAAG,EAAE,QAAM,CAAC,EAAA;;oBAE3B,SAAS,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAA;oBACtC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;oBACtB,cAAc,GAAG,IAAA,mBAAW,EAAC,SAAS,EAAE,SAAS,CAAC,CAAA;oBAE7B,qBAAM,IAAA,6BAAiB,EAAC,SAAS,EAAE,YAAY,CAAC,EAAA;;oBAArE,kBAAkB,GAAG,SAAgD;oBACrE,MAAM,GAAG,IAAA,8BAAa,EAC1B,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,0BAA0B,CAC3B,CAAA;oBAED,sBAAO,IAAA,mBAAW,EAAC,GAAG,EAAE,MAAM,CAAC,EAAA;;;;CAChC,CAAA;AAED,kBAAe,cAAc,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { ArticleBody, ArticleList, StaticPage, Category, CustomStaticPage, Channel } from './types';
2
+ export declare const createSitemap: (domain: string, dateCollection: Array<string>, channelsCollection: Channel[], customStaticPageCollection?: CustomStaticPage[] | undefined) => string;
3
+ export declare const createArticleSitemap: (articlesList: ArticleList, domain: string, publicationName: string, isNewsSitemap: boolean) => string;
4
+ export declare const buildSiteMapImages: (body: ArticleBody[]) => string;
5
+ export declare const getCategorySlug: (categories: Category[]) => string;
6
+ export declare const generateArticleSlug: (title: string) => string;
7
+ export declare const buildStaticPageSitemap: ({ url, body, slug, datePublished, }: StaticPage) => string;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildStaticPageSitemap = exports.generateArticleSlug = exports.getCategorySlug = exports.buildSiteMapImages = exports.createArticleSitemap = exports.createSitemap = void 0;
7
+ var lodash_escape_1 = __importDefault(require("lodash.escape"));
8
+ var createSitemap = function (domain, dateCollection, channelsCollection, customStaticPageCollection) { return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <sitemapindex \n xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n >\n " + ((customStaticPageCollection === null || customStaticPageCollection === void 0 ? void 0 : customStaticPageCollection.length)
9
+ ? customStaticPageCollection
10
+ .map(function (item) { return "\n <sitemap>\n <loc>https://" + (item.url || domain) + "/sitemap.xml?channel=" + item.channel + "</loc>\n </sitemap>\n "; })
11
+ .join('')
12
+ : '') + "\n " + channelsCollection
13
+ .map(function (channel) {
14
+ return "\n <sitemap>\n <loc>https://" + domain + "/sitemap.xml?channel=" + channel.slug + "</loc>\n </sitemap>\n ";
15
+ })
16
+ .join('') + "\n " + dateCollection
17
+ .map(function (date) {
18
+ var year = date.split('-')[0];
19
+ var month = date.split('-')[1];
20
+ var day = date.split('-')[2];
21
+ return "\n <sitemap>\n <loc>https://" + domain + "/sitemap.xml?yyyy=" + year + "&amp;mm=" + month + "&amp;dd=" + day + "</loc>\n </sitemap>\n ";
22
+ })
23
+ .join('') + "\n </sitemapindex>\n"; };
24
+ exports.createSitemap = createSitemap;
25
+ var createArticleSitemap = function (articlesList, domain, publicationName, isNewsSitemap) {
26
+ var urlsetHeaders = getSitemapHeaders(isNewsSitemap);
27
+ return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <urlset \n " + urlsetHeaders + " \n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\n >\n " + articlesList
28
+ .map(function (_a) {
29
+ var id = _a.id, publishedDateTime = _a.publishedDateTime, headline = _a.headline, body = _a.body, categories = _a.categories;
30
+ var imagesSitemap = (0, exports.buildSiteMapImages)(body);
31
+ var articleCategory = (0, exports.getCategorySlug)(categories);
32
+ var articleSlug = (0, exports.generateArticleSlug)(headline);
33
+ return "\n <url>\n <loc>https://" + domain + "/" + articleCategory + "/" + id + "/" + articleSlug + "</loc> \n " + (isNewsSitemap
34
+ ? "<news:news>\n <news:publication>\n <news:name>" + (0, lodash_escape_1.default)(publicationName) + "</news:name>\n <news:language>en</news:language>\n </news:publication>\n <news:publication_date>" + publishedDateTime + "</news:publication_date>\n <news:title>" + (0, lodash_escape_1.default)(headline) + "</news:title>\n </news:news>"
35
+ : '') + " \n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>" + publishedDateTime + "</lastmod>\n " + imagesSitemap + "\n </url>\n ";
36
+ })
37
+ .join('') + "\n </urlset>\n";
38
+ };
39
+ exports.createArticleSitemap = createArticleSitemap;
40
+ var getSitemapHeaders = function (isNewsSitemap) {
41
+ return isNewsSitemap
42
+ ? "xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" \n xmlns:news=\"http://www.google.com/schemas/sitemap-news/0.9\""
43
+ : "xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"";
44
+ };
45
+ var buildSiteMapImages = function (body) {
46
+ var images = body.filter(function (block) { return block.url; });
47
+ return images
48
+ .map(function (_a) {
49
+ var url = _a.url, caption = _a.caption, credit = _a.credit;
50
+ return "\n<image:image>\n <image:loc>" + url + "</image:loc>\n " + (caption ? "<image:caption>" + (0, lodash_escape_1.default)(caption) + "</image:caption>" : "") + "\n " + (credit ? "<image:credit>" + (0, lodash_escape_1.default)(credit) + "</image:credit>" : "") + "\n</image:image>\n";
51
+ })
52
+ .join('');
53
+ };
54
+ exports.buildSiteMapImages = buildSiteMapImages;
55
+ var getCategorySlug = function (categories) {
56
+ if (!Array.isArray(categories) || categories.length === 0)
57
+ return 'uncategorized';
58
+ return categories[0].slug || 'uncategorized';
59
+ };
60
+ exports.getCategorySlug = getCategorySlug;
61
+ var generateArticleSlug = function (title) {
62
+ return title
63
+ .replace(/[^a-zA-Z0-9 ]/g, '')
64
+ .replace(/\s\s+/g, ' ')
65
+ .toLowerCase()
66
+ .replace(/ /g, '-')
67
+ .trim();
68
+ };
69
+ exports.generateArticleSlug = generateArticleSlug;
70
+ var buildStaticPageSitemap = function (_a) {
71
+ var url = _a.url, body = _a.body, slug = _a.slug, datePublished = _a.datePublished;
72
+ var urlsetHeaders = getSitemapHeaders(false);
73
+ var imagesSitemap = (0, exports.buildSiteMapImages)(body);
74
+ return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <urlset \n " + urlsetHeaders + " \n " + (imagesSitemap.length
75
+ ? "xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\""
76
+ : '') + " \n >\n <url>\n <loc>https://" + url + "/" + slug + "</loc> \n <changefreq>monthly</changefreq>\n <priority>0.7</priority>\n <lastmod>" + datePublished + "</lastmod>\n " + imagesSitemap + "\n </url>\n </urlset>\n";
77
+ };
78
+ exports.buildStaticPageSitemap = buildStaticPageSitemap;
79
+ //# sourceMappingURL=create-sitemap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-sitemap.js","sourceRoot":"","sources":["../../../src/sitemap/helpers/create-sitemap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ declare const publisherGroupInfo: {
2
+ VIRGIN: {
3
+ domain: string;
4
+ firstArticleDate: string;
5
+ publicationName: string;
6
+ };
7
+ };
8
+ export default publisherGroupInfo;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var publisherGroupInfo = {
4
+ VIRGIN: {
5
+ domain: 'virginradio.co.uk',
6
+ firstArticleDate: '2016-3-1',
7
+ publicationName: 'Virgin Radio',
8
+ },
9
+ };
10
+ exports.default = publisherGroupInfo;
11
+ //# sourceMappingURL=publisherGroupInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisherGroupInfo.js","sourceRoot":"","sources":["../../../src/sitemap/helpers/publisherGroupInfo.ts"],"names":[],"mappings":";;AAAA,IAAM,kBAAkB,GAAG;IACzB,MAAM,EAAE;QACN,MAAM,EAAE,mBAAmB;QAC3B,gBAAgB,EAAE,UAAU;QAC5B,eAAe,EAAE,cAAc;KAChC;CACF,CAAA;AAED,kBAAe,kBAAkB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { ArticleList, PublisherGroup } from './types';
2
+ import { ApolloHttpClient } from '@newskit-render/api';
3
+ export declare const queryArticleList: (publisher: PublisherGroup, dates: {
4
+ from: string;
5
+ to?: string | undefined;
6
+ }, apolloClient: ApolloHttpClient) => Promise<ArticleList>;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.queryArticleList = void 0;
40
+ var getArticleList_1 = require("../queries/getArticleList");
41
+ var queryArticleList = function (publisher, dates, apolloClient) { return __awaiter(void 0, void 0, void 0, function () {
42
+ var cursor, countTotal, articleListData, from, to, data, data_1;
43
+ return __generator(this, function (_a) {
44
+ switch (_a.label) {
45
+ case 0:
46
+ cursor = '';
47
+ articleListData = [];
48
+ from = dates.from, to = dates.to;
49
+ return [4 /*yield*/, apolloClient.query({
50
+ query: getArticleList_1.GET_ARTICLE_LIST,
51
+ variables: {
52
+ cursor: cursor,
53
+ publisher: publisher,
54
+ from: from,
55
+ to: to,
56
+ },
57
+ })
58
+ // Saving the cursor for the next query, if needed.
59
+ ];
60
+ case 1:
61
+ data = (_a.sent()).data;
62
+ // Saving the cursor for the next query, if needed.
63
+ cursor = data.articleList.pageCursors.next;
64
+ // Saving the number defining how many articles we expect to save in our collection
65
+ countTotal ? countTotal : (countTotal = data.articleList.meta.countTotal);
66
+ // Adding first bunch of article in the collection
67
+ articleListData = articleListData.concat(data.articleList.data);
68
+ _a.label = 2;
69
+ case 2:
70
+ if (!(articleListData.length < countTotal)) return [3 /*break*/, 4];
71
+ return [4 /*yield*/, apolloClient.query({
72
+ query: getArticleList_1.GET_ARTICLE_LIST,
73
+ variables: {
74
+ cursor: cursor,
75
+ publisher: publisher,
76
+ from: from,
77
+ to: to,
78
+ },
79
+ })];
80
+ case 3:
81
+ data_1 = (_a.sent()).data;
82
+ cursor = data_1.articleList.pageCursors.next;
83
+ articleListData = articleListData.concat(data_1.articleList.data);
84
+ return [3 /*break*/, 2];
85
+ case 4: return [2 /*return*/, articleListData];
86
+ }
87
+ });
88
+ }); };
89
+ exports.queryArticleList = queryArticleList;
90
+ //# sourceMappingURL=queryArticleList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryArticleList.js","sourceRoot":"","sources":["../../../src/sitemap/helpers/queryArticleList.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4DAA4D;AAGrD,IAAM,gBAAgB,GAAG,UAC9B,SAAyB,EACzB,KAAoC,EACpC,YAA8B;;;;;gBAE1B,MAAM,GAAG,EAAE,CAAA;gBAEX,eAAe,GAAgB,EAAE,CAAA;gBAC7B,IAAI,GAAS,KAAK,KAAd,EAAE,EAAE,GAAK,KAAK,GAAV,CAAU;gBAGT,qBAAM,YAAY,CAAC,KAAK,CAAC;wBACxC,KAAK,EAAE,iCAAgB;wBACvB,SAAS,EAAE;4BACT,MAAM,EAAE,MAAM;4BACd,SAAS,EAAE,SAAS;4BACpB,IAAI,MAAA;4BACJ,EAAE,IAAA;yBACH;qBACF,CAAC;oBAEF,mDAAmD;kBAFjD;;gBARM,IAAI,GAAK,CAAA,SAQf,CAAA,KARU;gBAUZ,mDAAmD;gBACnD,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAA;gBAC1C,mFAAmF;gBACnF,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACzE,kDAAkD;gBAClD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;;;qBAGxD,CAAA,eAAe,CAAC,MAAM,GAAG,UAAU,CAAA;gBACvB,qBAAM,YAAY,CAAC,KAAK,CAAC;wBACxC,KAAK,EAAE,iCAAgB;wBACvB,SAAS,EAAE;4BACT,MAAM,EAAE,MAAM;4BACd,SAAS,EAAE,SAAS;4BACpB,IAAI,MAAA;4BACJ,EAAE,IAAA;yBACH;qBACF,CAAC,EAAA;;gBARM,SAAS,CAAA,SAQf,CAAA,KARU;gBAUZ,MAAM,GAAG,MAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAA;gBAC1C,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,MAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;;oBAGjE,sBAAO,eAAe,EAAA;;;KACvB,CAAA;AA7CY,QAAA,gBAAgB,oBA6C5B"}
@@ -0,0 +1,4 @@
1
+ import { Channel, PublisherGroup, StaticPage } from './types';
2
+ import { ApolloHttpClient } from '@newskit-render/api';
3
+ export declare const queryPage: (publisher: PublisherGroup, channel: string, apolloClient: ApolloHttpClient) => Promise<Omit<StaticPage, 'url'>>;
4
+ export declare const queryChannelsList: (publisher: PublisherGroup, apolloClient: ApolloHttpClient) => Promise<Channel[]>;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.queryChannelsList = exports.queryPage = void 0;
40
+ var getChannelsList_1 = require("../queries/getChannelsList");
41
+ var getPage_1 = require("../queries/getPage");
42
+ var queryPage = function (publisher, channel, apolloClient) { return __awaiter(void 0, void 0, void 0, function () {
43
+ var data;
44
+ return __generator(this, function (_a) {
45
+ switch (_a.label) {
46
+ case 0: return [4 /*yield*/, apolloClient.query({
47
+ query: getPage_1.GET_PAGE,
48
+ variables: {
49
+ publisher: publisher,
50
+ channel: channel,
51
+ },
52
+ errorPolicy: 'all',
53
+ })];
54
+ case 1:
55
+ data = (_a.sent()).data;
56
+ return [2 /*return*/, data.page];
57
+ }
58
+ });
59
+ }); };
60
+ exports.queryPage = queryPage;
61
+ var queryChannelsList = function (publisher, apolloClient) { return __awaiter(void 0, void 0, void 0, function () {
62
+ var channels, cursor, data;
63
+ return __generator(this, function (_a) {
64
+ switch (_a.label) {
65
+ case 0:
66
+ channels = [];
67
+ cursor = '';
68
+ _a.label = 1;
69
+ case 1: return [4 /*yield*/, apolloClient.query({
70
+ query: getChannelsList_1.GET_CHANNELS_LIST,
71
+ variables: {
72
+ cursor: cursor,
73
+ publisher: publisher,
74
+ },
75
+ })];
76
+ case 2:
77
+ data = (_a.sent()).data;
78
+ cursor = data.pages.pageCursors.next;
79
+ channels = channels.concat(data.pages.data);
80
+ _a.label = 3;
81
+ case 3:
82
+ if (cursor !== '') return [3 /*break*/, 1];
83
+ _a.label = 4;
84
+ case 4: return [2 /*return*/, channels];
85
+ }
86
+ });
87
+ }); };
88
+ exports.queryChannelsList = queryChannelsList;
89
+ //# sourceMappingURL=queryPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryPage.js","sourceRoot":"","sources":["../../../src/sitemap/helpers/queryPage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAA8D;AAC9D,8CAA6C;AAStC,IAAM,SAAS,GAAG,UACvB,SAAyB,EACzB,OAAe,EACf,YAA8B;;;;oBAEY,qBAAM,YAAY,CAAC,KAAK,CAAC;oBACjE,KAAK,EAAE,kBAAQ;oBACf,SAAS,EAAE;wBACT,SAAS,EAAE,SAAS;wBACpB,OAAO,SAAA;qBACR;oBACD,WAAW,EAAE,KAAK;iBACnB,CAAC,EAAA;;gBAPM,IAAI,GAA8B,CAAA,SAOxC,CAAA,KAPU;gBAQZ,sBAAO,IAAI,CAAC,IAAI,EAAA;;;KACjB,CAAA;AAdY,QAAA,SAAS,aAcrB;AAEM,IAAM,iBAAiB,GAAG,UAC/B,SAAyB,EACzB,YAA8B;;;;;gBAE1B,QAAQ,GAAG,EAAE,CAAA;gBACb,MAAM,GAAG,EAAE,CAAA;;oBAEI,qBAAM,YAAY,CAAC,KAAK,CAAC;oBACxC,KAAK,EAAE,mCAAiB;oBACxB,SAAS,EAAE;wBACT,MAAM,QAAA;wBACN,SAAS,WAAA;qBACV;iBACF,CAAC,EAAA;;gBANM,IAAI,GAAK,CAAA,SAMf,CAAA,KANU;gBAOZ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAA;gBAEpC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;;;oBACpC,MAAM,KAAK,EAAE;;oBACtB,sBAAO,QAAQ,EAAA;;;KAChB,CAAA;AAnBY,QAAA,iBAAiB,qBAmB7B"}
@@ -0,0 +1,68 @@
1
+ /// <reference types="node" />
2
+ import { NextApiResponse } from 'next';
3
+ import { ParsedUrlQuery } from 'querystring';
4
+ export declare type PublisherGroup = 'SUN_UK' | 'SUN_US' | 'SUN_IE' | 'SUN_SCT' | 'TIMES' | 'VIRGIN' | 'TALK_SPORT' | 'DEMO';
5
+ export declare type ImageBlock = {
6
+ url: string;
7
+ caption?: string;
8
+ credit?: string;
9
+ alt?: string;
10
+ };
11
+ export declare type ArticleBody = ImageBlock;
12
+ export declare enum BlockTypes {
13
+ ImageBlock = "ImageBlock",
14
+ VideoBrightcoveBlock = "VideoBrightcoveBlock"
15
+ }
16
+ export declare type Category = {
17
+ id: string;
18
+ parentId?: string;
19
+ slug: string;
20
+ title: string;
21
+ type: string;
22
+ };
23
+ export declare type Article = {
24
+ id: number;
25
+ headline: string;
26
+ publishedDateTime: string;
27
+ publisher: PublisherGroup;
28
+ body: ArticleBody[];
29
+ categories: Category[];
30
+ };
31
+ export interface CustomStaticPage {
32
+ channel: string;
33
+ url?: string;
34
+ }
35
+ export interface Channel {
36
+ id: string;
37
+ slug: string;
38
+ }
39
+ export interface StaticPageQueryResponse {
40
+ data: {
41
+ page: {
42
+ id: string;
43
+ title: string;
44
+ datePublished: string;
45
+ dateUpdated: string;
46
+ slug: string;
47
+ body: ImageBlock[];
48
+ };
49
+ };
50
+ }
51
+ export declare type SitemapConfig = {
52
+ res: NextApiResponse;
53
+ publisher: PublisherGroup;
54
+ domain: string;
55
+ publicationName: string;
56
+ customStaticPageCollection?: CustomStaticPage[];
57
+ };
58
+ export declare type GenericSitemapConfig = SitemapConfig & {
59
+ firstArticleDate: string;
60
+ query: ParsedUrlQuery;
61
+ };
62
+ export declare type ArticleList = Article[];
63
+ export declare type StaticPage = {
64
+ slug: string;
65
+ datePublished: string;
66
+ body: ArticleBody[];
67
+ url: string;
68
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlockTypes = void 0;
4
+ var BlockTypes;
5
+ (function (BlockTypes) {
6
+ BlockTypes["ImageBlock"] = "ImageBlock";
7
+ BlockTypes["VideoBrightcoveBlock"] = "VideoBrightcoveBlock";
8
+ })(BlockTypes = exports.BlockTypes || (exports.BlockTypes = {}));
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/sitemap/helpers/types.ts"],"names":[],"mappings":";;;AAuBA,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,uCAAyB,CAAA;IACzB,2DAA6C,CAAA;AAC/C,CAAC,EAHW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAGrB"}
@@ -0,0 +1,9 @@
1
+ import { ServerResponse } from 'http';
2
+ export declare const sitemapXml: () => null;
3
+ export declare const setResponse: (res: ServerResponse, html: string) => {
4
+ props: Record<string, never>;
5
+ };
6
+ export declare const getTodayDate: () => string;
7
+ export declare const getTwoDaysAgoDate: () => string;
8
+ export declare const getDateList: (startDate: Date, endDate: Date) => Array<string>;
9
+ export declare const htmlToString: (html: string) => string;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.htmlToString = exports.getDateList = exports.getTwoDaysAgoDate = exports.getTodayDate = exports.setResponse = exports.sitemapXml = void 0;
4
+ var sitemapXml = function () {
5
+ return null;
6
+ };
7
+ exports.sitemapXml = sitemapXml;
8
+ var setResponse = function (res, html) {
9
+ res.setHeader('Content-Type', 'text/xml');
10
+ res.write(html);
11
+ res.end();
12
+ return { props: {} };
13
+ };
14
+ exports.setResponse = setResponse;
15
+ var getTodayDate = function () {
16
+ return new Date().toISOString().slice(0, 10);
17
+ };
18
+ exports.getTodayDate = getTodayDate;
19
+ var getTwoDaysAgoDate = function () {
20
+ return new Date(Date.now() - 48 * 3600 * 1000).toISOString().slice(0, 10);
21
+ };
22
+ exports.getTwoDaysAgoDate = getTwoDaysAgoDate;
23
+ var getDateList = function (startDate, endDate) {
24
+ var dayList = [startDate.toISOString().slice(0, 10)];
25
+ // To calculate the no. of days between two dates
26
+ var daysCount = Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 3600 * 24));
27
+ for (var i = 0; i < daysCount; i++) {
28
+ var date = new Date(startDate.setDate(startDate.getDate() + 1))
29
+ .toISOString()
30
+ .slice(0, 10);
31
+ dayList.push(date);
32
+ }
33
+ return dayList.reverse();
34
+ };
35
+ exports.getDateList = getDateList;
36
+ var htmlToString = function (html) {
37
+ return html.replace(/>\s+</g, '><').trim();
38
+ };
39
+ exports.htmlToString = htmlToString;
40
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/sitemap/helpers/utils.ts"],"names":[],"mappings":";;;AACO,IAAM,UAAU,GAAG;IACxB,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAFY,QAAA,UAAU,cAEtB;AAEM,IAAM,WAAW,GAAG,UACzB,GAAmB,EACnB,IAAY;IAEZ,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;IACzC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACf,GAAG,CAAC,GAAG,EAAE,CAAA;IAET,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACtB,CAAC,CAAA;AATY,QAAA,WAAW,eASvB;AAEM,IAAM,YAAY,GAAG;IAC1B,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC9C,CAAC,CAAA;AAFY,QAAA,YAAY,gBAExB;AAEM,IAAM,iBAAiB,GAAG;IAC/B,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC3E,CAAC,CAAA;AAFY,QAAA,iBAAiB,qBAE7B;AAEM,IAAM,WAAW,GAAG,UAAC,SAAe,EAAE,OAAa;IACxD,IAAM,OAAO,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IACtD,iDAAiD;IACjD,IAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,CAC/D,CAAA;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;QAClC,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;aAC9D,WAAW,EAAE;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;KACnB;IACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;AAC1B,CAAC,CAAA;AAdY,QAAA,WAAW,eAcvB;AAEM,IAAM,YAAY,GAAG,UAAC,IAAY;IACvC,OAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE;AAAnC,CAAmC,CAAA;AADxB,QAAA,YAAY,gBACY"}
@@ -0,0 +1,5 @@
1
+ import { sitemapXml } from './helpers/utils';
2
+ import genericSitemap from './generic-sitemap-resolver';
3
+ import newsSitemap from './news-sitemap-resolver';
4
+ import { PublisherGroup, CustomStaticPage } from './helpers/types';
5
+ export { sitemapXml, genericSitemap, newsSitemap, PublisherGroup, CustomStaticPage, };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.newsSitemap = exports.genericSitemap = exports.sitemapXml = void 0;
7
+ var utils_1 = require("./helpers/utils");
8
+ Object.defineProperty(exports, "sitemapXml", { enumerable: true, get: function () { return utils_1.sitemapXml; } });
9
+ var generic_sitemap_resolver_1 = __importDefault(require("./generic-sitemap-resolver"));
10
+ exports.genericSitemap = generic_sitemap_resolver_1.default;
11
+ var news_sitemap_resolver_1 = __importDefault(require("./news-sitemap-resolver"));
12
+ exports.newsSitemap = news_sitemap_resolver_1.default;
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sitemap/index.ts"],"names":[],"mappings":";;;;;;AAAA,yCAA4C;AAM1C,2FANO,kBAAU,OAMP;AALZ,wFAAuD;AAMrD,yBANK,kCAAc,CAML;AALhB,kFAAiD;AAM/C,sBANK,+BAAW,CAML"}
@@ -0,0 +1,5 @@
1
+ import { SitemapConfig } from './helpers/types';
2
+ declare const newsSitemap: ({ res, publisher, domain, publicationName, }: SitemapConfig) => Promise<{
3
+ props: Record<string, never>;
4
+ }>;
5
+ export default newsSitemap;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var create_sitemap_1 = require("./helpers/create-sitemap");
40
+ var utils_1 = require("./helpers/utils");
41
+ var queryArticleList_1 = require("./helpers/queryArticleList");
42
+ var api_1 = require("@newskit-render/api");
43
+ var newsSitemap = function (_a) {
44
+ var res = _a.res, publisher = _a.publisher, domain = _a.domain, publicationName = _a.publicationName;
45
+ return __awaiter(void 0, void 0, void 0, function () {
46
+ var dates, apolloClient, articleListData, html;
47
+ return __generator(this, function (_b) {
48
+ switch (_b.label) {
49
+ case 0:
50
+ dates = {
51
+ from: (0, utils_1.getTwoDaysAgoDate)(),
52
+ };
53
+ return [4 /*yield*/, (0, api_1.createApolloClient)(api_1.ClientTypes.nkapi)];
54
+ case 1:
55
+ apolloClient = _b.sent();
56
+ return [4 /*yield*/, (0, queryArticleList_1.queryArticleList)(publisher, dates, apolloClient)];
57
+ case 2:
58
+ articleListData = _b.sent();
59
+ html = (0, create_sitemap_1.createArticleSitemap)(articleListData, domain, publicationName, true);
60
+ return [2 /*return*/, (0, utils_1.setResponse)(res, html)];
61
+ }
62
+ });
63
+ });
64
+ };
65
+ exports.default = newsSitemap;
66
+ //# sourceMappingURL=news-sitemap-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news-sitemap-resolver.js","sourceRoot":"","sources":["../../src/sitemap/news-sitemap-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAA+D;AAC/D,yCAAgE;AAChE,+DAA6D;AAE7D,2CAAqE;AAErE,IAAM,WAAW,GAAG,UAAO,EAKX;QAJd,GAAG,SAAA,EACH,SAAS,eAAA,EACT,MAAM,YAAA,EACN,eAAe,qBAAA;;;;;;oBAET,KAAK,GAAG;wBACZ,IAAI,EAAE,IAAA,yBAAiB,GAAE;qBAC1B,CAAA;oBAEoB,qBAAM,IAAA,wBAAkB,EAAC,iBAAW,CAAC,KAAK,CAAC,EAAA;;oBAA1D,YAAY,GAAG,SAA2C;oBACxC,qBAAM,IAAA,mCAAgB,EAAC,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,EAAA;;oBAAxE,eAAe,GAAG,SAAsD;oBAExE,IAAI,GAAG,IAAA,qCAAoB,EAC/B,eAAe,EACf,MAAM,EACN,eAAe,EACf,IAAI,CACL,CAAA;oBACD,sBAAO,IAAA,mBAAW,EAAC,GAAG,EAAE,IAAI,CAAC,EAAA;;;;CAC9B,CAAA;AAED,kBAAe,WAAW,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const GET_ARTICLE_LIST: import("@apollo/client").DocumentNode;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.GET_ARTICLE_LIST = void 0;
8
+ var client_1 = require("@apollo/client");
9
+ exports.GET_ARTICLE_LIST = (0, client_1.gql)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n query getArticleList(\n $publisher: Publisher!\n $from: Date\n $to: Date\n $cursor: String\n ) {\n articleList(\n publisher: $publisher\n from: $from\n to: $to\n cursor: $cursor\n limit: 20\n ) {\n pageCursors {\n next\n }\n data {\n categories {\n slug\n }\n publisher\n publishedDateTime\n headline\n label\n id\n slug\n body {\n ... on ImageBlock {\n alt\n caption\n credit\n url\n }\n }\n }\n meta {\n countTotal\n }\n }\n }\n"], ["\n query getArticleList(\n $publisher: Publisher!\n $from: Date\n $to: Date\n $cursor: String\n ) {\n articleList(\n publisher: $publisher\n from: $from\n to: $to\n cursor: $cursor\n limit: 20\n ) {\n pageCursors {\n next\n }\n data {\n categories {\n slug\n }\n publisher\n publishedDateTime\n headline\n label\n id\n slug\n body {\n ... on ImageBlock {\n alt\n caption\n credit\n url\n }\n }\n }\n meta {\n countTotal\n }\n }\n }\n"])));
10
+ var templateObject_1;
11
+ //# sourceMappingURL=getArticleList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getArticleList.js","sourceRoot":"","sources":["../../../src/sitemap/queries/getArticleList.ts"],"names":[],"mappings":";;;;;;;AAAA,yCAAoC;AAEvB,QAAA,gBAAgB,OAAG,YAAG,iuBAAA,6pBAyClC,KAAA"}
@@ -0,0 +1 @@
1
+ export declare const GET_CHANNELS_LIST: import("@apollo/client").DocumentNode;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.GET_CHANNELS_LIST = void 0;
8
+ var client_1 = require("@apollo/client");
9
+ exports.GET_CHANNELS_LIST = (0, client_1.gql)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n query getChannelsList($publisher: Publisher!, $cursor: String) {\n pages(publisher: $publisher, cursor: $cursor) {\n pageCursors {\n next\n }\n data {\n id\n slug\n }\n meta {\n countTotal\n }\n }\n }\n"], ["\n query getChannelsList($publisher: Publisher!, $cursor: String) {\n pages(publisher: $publisher, cursor: $cursor) {\n pageCursors {\n next\n }\n data {\n id\n slug\n }\n meta {\n countTotal\n }\n }\n }\n"])));
10
+ var templateObject_1;
11
+ //# sourceMappingURL=getChannelsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getChannelsList.js","sourceRoot":"","sources":["../../../src/sitemap/queries/getChannelsList.ts"],"names":[],"mappings":";;;;;;;AAAA,yCAAoC;AAEvB,QAAA,iBAAiB,OAAG,YAAG,qVAAA,iRAenC,KAAA"}
@@ -0,0 +1 @@
1
+ export declare const GET_PAGE: import("@apollo/client").DocumentNode;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.GET_PAGE = void 0;
8
+ var client_1 = require("@apollo/client");
9
+ exports.GET_PAGE = (0, client_1.gql)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n query getStaticPage($publisher: Publisher!, $channel: String!) {\n page(publisher: $publisher, channel: $channel) {\n id\n title\n datePublished\n dateUpdated\n slug\n title\n body {\n ... on ImageBlock {\n alt\n caption\n credit\n type\n url\n }\n }\n }\n }\n"], ["\n query getStaticPage($publisher: Publisher!, $channel: String!) {\n page(publisher: $publisher, channel: $channel) {\n id\n title\n datePublished\n dateUpdated\n slug\n title\n body {\n ... on ImageBlock {\n alt\n caption\n credit\n type\n url\n }\n }\n }\n }\n"])));
10
+ var templateObject_1;
11
+ //# sourceMappingURL=getPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPage.js","sourceRoot":"","sources":["../../../src/sitemap/queries/getPage.ts"],"names":[],"mappings":";;;;;;;AAAA,yCAAoC;AAEvB,QAAA,QAAQ,OAAG,YAAG,wbAAA,oXAoB1B,KAAA"}
@@ -0,0 +1 @@
1
+ export * from './getArticleList';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./getArticleList"), exports);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sitemap/queries/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAgC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@newskit-render/feed",
3
+ "version": "0.2.0",
4
+ "description": "Newskit Render - Feed package",
5
+ "author": "",
6
+ "main": "dist/index.js",
7
+ "license": "UNLICENSED",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "engines": {
12
+ "node": ">=16.13"
13
+ },
14
+ "scripts": {
15
+ "build": "rm -rf dist && tsc -b tsconfig.build.json",
16
+ "build:watch": "tsc -b tsconfig.build.json -w",
17
+ "test:unit": "jest --coverage",
18
+ "test:unit:watch": "jest --watch",
19
+ "lint": "eslint --ext .js,.jsx,.ts,.tsx src --color",
20
+ "lint:fix": "eslint --ext .js,.ts src --color --fix && prettier --write 'src/**/*.{js,ts,json}'",
21
+ "clean": "rm -rf node_modules & rm -f package-lock.json & rm -f yarn.lock"
22
+ },
23
+ "dependencies": {
24
+ "@apollo/client": "3.3.7",
25
+ "@newskit-render/api": "^0.15.0",
26
+ "cross-fetch": "3.1.4",
27
+ "graphql": "15.6.0",
28
+ "lodash.escape": "4.0.1",
29
+ "react": "17.0.2"
30
+ },
31
+ "devDependencies": {
32
+ "@types/jest": "27.0.2",
33
+ "@typescript-eslint/eslint-plugin": "4.13.0",
34
+ "@typescript-eslint/parser": "4.13.0",
35
+ "eslint": "7.18.0",
36
+ "eslint-config-prettier": "7.1.0",
37
+ "eslint-plugin-prettier": "3.3.1",
38
+ "jest": "27.4.7",
39
+ "next": "12.0.10",
40
+ "prettier": "2.2.1",
41
+ "ts-jest": "27.1.3",
42
+ "typescript": "4.4.3"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ }
47
+ }