sfc-utils 1.4.59 → 1.4.61
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/components/geocoder.mjs +1 -1
- package/index.js +244 -210
- package/package.json +1 -1
package/components/geocoder.mjs
CHANGED
package/index.js
CHANGED
|
@@ -1,243 +1,277 @@
|
|
|
1
|
-
const { appCheck } = require(
|
|
1
|
+
const { appCheck } = require("./appcheck.js");
|
|
2
2
|
|
|
3
3
|
// Blend the HDN var with whatever is already present on the page
|
|
4
4
|
// Returns a string for injection into the head of the page
|
|
5
|
-
let blendHDN = function(meta){
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
meta.URL_ADD = url_add
|
|
12
|
-
}
|
|
13
|
-
let sailthru = ""
|
|
14
|
-
if (meta.SAIL_CUST){
|
|
15
|
-
sailthru = meta.SAIL_CUST
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Set vars with the new object
|
|
19
|
-
let {
|
|
20
|
-
PAYWALL_SETTING,
|
|
21
|
-
URL_ADD,
|
|
22
|
-
MAIN_DOMAIN,
|
|
23
|
-
PROJECT: {
|
|
24
|
-
AUTHORS,
|
|
25
|
-
ANALYTICS_CREDIT,
|
|
26
|
-
TITLE,
|
|
27
|
-
HEARST_CATEGORY,
|
|
28
|
-
KEY_SUBJECTS,
|
|
29
|
-
SUBFOLDER,
|
|
30
|
-
OPT_SLASH,
|
|
31
|
-
SLUG,
|
|
32
|
-
MARKET_KEY,
|
|
33
|
-
ISO_PUBDATE,
|
|
34
|
-
ISO_MODDATE,
|
|
35
|
-
CANONICAL_URL
|
|
36
|
-
},
|
|
37
|
-
} = meta
|
|
38
|
-
BASE_DOMAIN = MAIN_DOMAIN
|
|
39
|
-
if (MARKET_KEY === "CT"){
|
|
40
|
-
BASE_DOMAIN = "ctinsider.com"
|
|
5
|
+
let blendHDN = function (meta) {
|
|
6
|
+
if (!meta.PROJECT) {
|
|
7
|
+
// If we don't have a properly formatted meta var coming in, this is a legacy template and needs settings pulled
|
|
8
|
+
let url_add = meta.url_add || "";
|
|
9
|
+
meta = getSettings();
|
|
10
|
+
meta.URL_ADD = url_add;
|
|
41
11
|
}
|
|
42
|
-
let
|
|
43
|
-
if(
|
|
44
|
-
|
|
12
|
+
let sailthru = "";
|
|
13
|
+
if (meta.SAIL_CUST) {
|
|
14
|
+
sailthru = meta.SAIL_CUST;
|
|
45
15
|
}
|
|
46
|
-
|
|
47
|
-
|
|
16
|
+
|
|
17
|
+
// Set vars with the new object
|
|
18
|
+
let {
|
|
19
|
+
PAYWALL_SETTING,
|
|
20
|
+
URL_ADD,
|
|
21
|
+
MAIN_DOMAIN,
|
|
22
|
+
PROJECT: {
|
|
23
|
+
AUTHORS,
|
|
24
|
+
ANALYTICS_CREDIT,
|
|
25
|
+
TITLE,
|
|
26
|
+
HEARST_CATEGORY,
|
|
27
|
+
KEY_SUBJECTS,
|
|
28
|
+
SUBFOLDER,
|
|
29
|
+
OPT_SLASH,
|
|
30
|
+
SLUG,
|
|
31
|
+
MARKET_KEY,
|
|
32
|
+
ISO_PUBDATE,
|
|
33
|
+
ISO_MODDATE,
|
|
34
|
+
CANONICAL_URL,
|
|
35
|
+
},
|
|
36
|
+
} = meta;
|
|
37
|
+
BASE_DOMAIN = MAIN_DOMAIN;
|
|
38
|
+
if (MARKET_KEY === "CT") {
|
|
39
|
+
BASE_DOMAIN = "ctinsider.com";
|
|
40
|
+
}
|
|
41
|
+
let siteDomain;
|
|
42
|
+
if (CANONICAL_URL) {
|
|
43
|
+
siteDomain = CANONICAL_URL.match("^(.+?).com")[0];
|
|
44
|
+
} else {
|
|
45
|
+
siteDomain = MAIN_DOMAIN;
|
|
48
46
|
}
|
|
49
47
|
// Check if we need a slash
|
|
50
|
-
let slash = OPT_SLASH
|
|
48
|
+
let slash = OPT_SLASH;
|
|
51
49
|
|
|
52
50
|
// Add the canonical here unless it's sent in
|
|
53
|
-
if (!CANONICAL_URL){
|
|
54
|
-
|
|
51
|
+
if (!CANONICAL_URL) {
|
|
52
|
+
CANONICAL_URL = `${BASE_DOMAIN}/${SUBFOLDER}${slash}${SLUG}`;
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
// If canonical has a slash at the end, remove it
|
|
58
|
-
if (CANONICAL_URL.slice(-1) === "/"){
|
|
59
|
-
|
|
56
|
+
if (CANONICAL_URL.slice(-1) === "/") {
|
|
57
|
+
CANONICAL_URL = CANONICAL_URL.slice(0, -1);
|
|
60
58
|
}
|
|
61
59
|
|
|
62
60
|
// Add the url add here unless it's sent in
|
|
63
|
-
if (!URL_ADD){
|
|
64
|
-
|
|
61
|
+
if (!URL_ADD) {
|
|
62
|
+
URL_ADD = "";
|
|
65
63
|
}
|
|
66
64
|
|
|
67
65
|
// If url add does not end with a /, add it
|
|
68
|
-
if (URL_ADD && URL_ADD.slice(-1) !== "/"){
|
|
69
|
-
|
|
66
|
+
if (URL_ADD && URL_ADD.slice(-1) !== "/") {
|
|
67
|
+
URL_ADD += "/";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Get dates from env
|
|
71
|
+
let pubdate = "";
|
|
72
|
+
let pubTime = "";
|
|
73
|
+
if (ISO_PUBDATE) {
|
|
74
|
+
pubdate = ISO_PUBDATE.toString().split("T")[0]; // + " 00:00:00";
|
|
75
|
+
const pubdateTime = pubdate + "T" + "00:00:00";
|
|
76
|
+
pubTime = new Date(pubdateTime).getTime();
|
|
77
|
+
}
|
|
78
|
+
let moddate = "";
|
|
79
|
+
let modTime = "";
|
|
80
|
+
if (ISO_MODDATE) {
|
|
81
|
+
moddate = ISO_MODDATE.toString().split("T")[0]; // + " 00:00:00";
|
|
82
|
+
const moddateTime = moddate + "T" + "00:00:00";
|
|
83
|
+
modTime = new Date(moddateTime).getTime();
|
|
70
84
|
}
|
|
71
85
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
HDN.dataLayer.source.originalSourceSite = 'TU';
|
|
150
|
-
break;
|
|
151
|
-
case "CT":
|
|
152
|
-
HDN.dataLayer.source.authorTitle = 'Connecticut Digital Staff';
|
|
153
|
-
HDN.dataLayer.source.originalSourceSite = 'CT';
|
|
154
|
-
break;
|
|
86
|
+
// Setting up vars
|
|
87
|
+
let HDN = {};
|
|
88
|
+
HDN.dataLayer = {};
|
|
89
|
+
HDN.dataLayer.content = {};
|
|
90
|
+
HDN.dataLayer.href = {};
|
|
91
|
+
HDN.dataLayer.source = {};
|
|
92
|
+
HDN.dataLayer.sharing = {};
|
|
93
|
+
HDN.dataLayer.presentation = {};
|
|
94
|
+
HDN.dataLayer.paywall = {};
|
|
95
|
+
|
|
96
|
+
// HDN.dataLayer object for content and href data
|
|
97
|
+
HDN.dataLayer.content.title = TITLE;
|
|
98
|
+
HDN.dataLayer.content.subtitle = "";
|
|
99
|
+
HDN.dataLayer.content.objectId = `${SUBFOLDER}${slash}${SLUG}/${URL_ADD}`;
|
|
100
|
+
HDN.dataLayer.content.objectType = "project";
|
|
101
|
+
|
|
102
|
+
// Check if we have more than one HEARST_CATEGORY, split on commas
|
|
103
|
+
var categories = HEARST_CATEGORY.split(",").map((item) => item.trim());
|
|
104
|
+
HDN.dataLayer.content.sectionPath = categories;
|
|
105
|
+
|
|
106
|
+
var key_subjects = KEY_SUBJECTS
|
|
107
|
+
? KEY_SUBJECTS.split(",").map((item) => item.trim())
|
|
108
|
+
: [];
|
|
109
|
+
HDN.dataLayer.content.keySubjects = key_subjects;
|
|
110
|
+
HDN.dataLayer.content.pubDate = pubdate;
|
|
111
|
+
HDN.dataLayer.content.pubDateTimestamp = pubTime;
|
|
112
|
+
HDN.dataLayer.content.lastModifiedDate = moddate;
|
|
113
|
+
HDN.dataLayer.content.lastModifiedDateTimestamp = modTime;
|
|
114
|
+
HDN.dataLayer.content.wordCount = "";
|
|
115
|
+
HDN.dataLayer.content.keywords = [];
|
|
116
|
+
HDN.dataLayer.content.keyPersons = [];
|
|
117
|
+
HDN.dataLayer.content.keyOrganizations = [];
|
|
118
|
+
HDN.dataLayer.content.keyConcepts = [];
|
|
119
|
+
HDN.dataLayer.content.keyCategories = [];
|
|
120
|
+
HDN.dataLayer.content.keyPlaces = [];
|
|
121
|
+
HDN.dataLayer.content.keyNlpPerson = [];
|
|
122
|
+
HDN.dataLayer.content.keyNlpLocation = [];
|
|
123
|
+
HDN.dataLayer.content.keyNlpOrganization = [];
|
|
124
|
+
HDN.dataLayer.content.keyNlpEvent = [];
|
|
125
|
+
HDN.dataLayer.content.keyNlpWorkOfArt = [];
|
|
126
|
+
HDN.dataLayer.content.keyNlpConsumerGood = [];
|
|
127
|
+
HDN.dataLayer.content.keyNlpOther = [];
|
|
128
|
+
HDN.dataLayer.content.keyNlpUnknown = [];
|
|
129
|
+
HDN.dataLayer.content.designTemplate = "devhub-sandbox";
|
|
130
|
+
|
|
131
|
+
// Signal to Blueconic that we are ready for gift button
|
|
132
|
+
HDN.dataLayer.content.giftEnabled = meta.GIFT_ENABLED;
|
|
133
|
+
|
|
134
|
+
// HDN.dataLayer object for source information
|
|
135
|
+
HDN.dataLayer.source.authorName = ""; // Set below
|
|
136
|
+
HDN.dataLayer.source.authorTitle = "";
|
|
137
|
+
HDN.dataLayer.source.originalSourceSite = "";
|
|
138
|
+
HDN.dataLayer.source.publishingSite = "";
|
|
139
|
+
HDN.dataLayer.source.sourceSite = "";
|
|
140
|
+
switch (MARKET_KEY) {
|
|
141
|
+
case "SFC":
|
|
142
|
+
HDN.dataLayer.source.authorTitle = "San Francisco Chronicle Staff";
|
|
143
|
+
HDN.dataLayer.source.originalSourceSite = "SF";
|
|
144
|
+
HDN.dataLayer.source.publishingSite = "premiumsfgate";
|
|
145
|
+
HDN.dataLayer.source.sourceSite = "sfgate";
|
|
146
|
+
break;
|
|
147
|
+
case "Houston":
|
|
148
|
+
HDN.dataLayer.source.authorTitle = "Houston Chronicle Staff";
|
|
149
|
+
HDN.dataLayer.source.originalSourceSite = "HC";
|
|
150
|
+
break;
|
|
151
|
+
case "SanAntonio":
|
|
152
|
+
HDN.dataLayer.source.authorTitle = "Express News Staff";
|
|
153
|
+
HDN.dataLayer.source.originalSourceSite = "EN";
|
|
154
|
+
break;
|
|
155
|
+
case "Albany":
|
|
156
|
+
HDN.dataLayer.source.authorTitle = "Times Union Staff";
|
|
157
|
+
HDN.dataLayer.source.originalSourceSite = "TU";
|
|
158
|
+
break;
|
|
159
|
+
case "CT":
|
|
160
|
+
HDN.dataLayer.source.authorTitle = "Connecticut Digital Staff";
|
|
161
|
+
HDN.dataLayer.source.originalSourceSite = "CT";
|
|
162
|
+
break;
|
|
155
163
|
}
|
|
156
164
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
165
|
+
// HDN.dataLayer object for sharing information
|
|
166
|
+
HDN.dataLayer.sharing.openGraphUrl = `${siteDomain}/${SUBFOLDER}${slash}${SLUG}/${URL_ADD}`;
|
|
167
|
+
HDN.dataLayer.sharing.openGraphType = "article";
|
|
168
|
+
|
|
169
|
+
// More page settings
|
|
170
|
+
HDN.dataLayer.href.pageUrl = `${siteDomain}/${SUBFOLDER}${slash}${SLUG}/${URL_ADD}`;
|
|
171
|
+
HDN.dataLayer.href.canonicalUrl = `${CANONICAL_URL}/${URL_ADD}`;
|
|
172
|
+
|
|
173
|
+
// HDN.dataLayer object for presentation information
|
|
174
|
+
HDN.dataLayer.presentation.hasSlideshow = "";
|
|
175
|
+
HDN.dataLayer.presentation.hasSlideshowListView = "";
|
|
176
|
+
HDN.dataLayer.presentation.hasVideo = "";
|
|
177
|
+
HDN.dataLayer.presentation.hasInteractive = "";
|
|
178
|
+
|
|
179
|
+
// HDN.dataLayer object for paywall information
|
|
180
|
+
HDN.dataLayer.paywall.premiumStatus = "isPremium";
|
|
181
|
+
HDN.dataLayer.paywall.premiumEndDate = "";
|
|
182
|
+
HDN.dataLayer.paywall.policy = PAYWALL_SETTING;
|
|
183
|
+
|
|
184
|
+
// Special site var
|
|
185
|
+
HDN.dataLayer.site = {
|
|
186
|
+
domain: siteDomain.replace("https://www.", ""),
|
|
187
|
+
domainRoot: siteDomain.replace("https://www.", "").replace(".com", ""),
|
|
188
|
+
subDomain: "www",
|
|
189
|
+
name: HDN.dataLayer.source.publishingSite,
|
|
190
|
+
property: HDN.dataLayer.source.originalSourceSite,
|
|
191
|
+
siteId: "35",
|
|
192
|
+
siteUrl: siteDomain,
|
|
193
|
+
timeZone: "Pacific",
|
|
194
|
+
sailthruId: sailthru,
|
|
195
|
+
platform: "devhub",
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// Create author for analytics here
|
|
199
|
+
let authorString = "";
|
|
200
|
+
if (ANALYTICS_CREDIT !== "") {
|
|
201
|
+
authorString = ANALYTICS_CREDIT;
|
|
202
|
+
} else if (AUTHORS) {
|
|
203
|
+
// If one wasn't specified, use the one in the config
|
|
204
|
+
AUTHORS.forEach((author, index) => {
|
|
205
|
+
// Add author to string
|
|
206
|
+
authorString += author.AUTHOR_NAME;
|
|
198
207
|
// Add comma if we're not done
|
|
199
|
-
if (index <
|
|
200
|
-
authorString += ", "
|
|
208
|
+
if (index < AUTHORS.length - 1) {
|
|
209
|
+
authorString += ", ";
|
|
201
210
|
}
|
|
202
|
-
|
|
211
|
+
});
|
|
203
212
|
}
|
|
204
213
|
// If we didn't get any author, sub in default
|
|
205
|
-
if (authorString === ""){
|
|
206
|
-
authorString = HDN.dataLayer.source.authorTitle
|
|
214
|
+
if (authorString === "") {
|
|
215
|
+
authorString = HDN.dataLayer.source.authorTitle;
|
|
207
216
|
}
|
|
208
|
-
|
|
217
|
+
HDN.dataLayer.source.authorName = authorString;
|
|
209
218
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
219
|
+
let appVer = appCheck();
|
|
220
|
+
if (appVer) {
|
|
221
|
+
HDN.dataLayer.paywall.mode = "edbDisabled";
|
|
222
|
+
}
|
|
214
223
|
|
|
215
|
-
|
|
224
|
+
let stringHDN = `
|
|
216
225
|
var HDN = HDN || {};
|
|
217
226
|
HDN.dataLayer = HDN.dataLayer || {};
|
|
218
|
-
HDN.dataLayer.content = Object.assign(HDN.dataLayer.content || {}, ${JSON.stringify(
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
HDN.dataLayer.
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
}
|
|
227
|
+
HDN.dataLayer.content = Object.assign(HDN.dataLayer.content || {}, ${JSON.stringify(
|
|
228
|
+
HDN.dataLayer.content
|
|
229
|
+
)});
|
|
230
|
+
HDN.dataLayer.source = Object.assign(HDN.dataLayer.source || {}, ${JSON.stringify(
|
|
231
|
+
HDN.dataLayer.source
|
|
232
|
+
)});
|
|
233
|
+
HDN.dataLayer.sharing = Object.assign(HDN.dataLayer.sharing || {}, ${JSON.stringify(
|
|
234
|
+
HDN.dataLayer.sharing
|
|
235
|
+
)});
|
|
236
|
+
HDN.dataLayer.href = Object.assign(HDN.dataLayer.href || {}, ${JSON.stringify(
|
|
237
|
+
HDN.dataLayer.href
|
|
238
|
+
)});
|
|
239
|
+
HDN.dataLayer.paywall = Object.assign(HDN.dataLayer.paywall || {}, ${JSON.stringify(
|
|
240
|
+
HDN.dataLayer.paywall
|
|
241
|
+
)});
|
|
242
|
+
HDN.dataLayer.site = Object.assign(HDN.dataLayer.site || {}, ${JSON.stringify(
|
|
243
|
+
HDN.dataLayer.site
|
|
244
|
+
)});
|
|
245
|
+
`;
|
|
246
|
+
|
|
247
|
+
return {
|
|
248
|
+
stringHDN: stringHDN,
|
|
249
|
+
};
|
|
250
|
+
};
|
|
230
251
|
|
|
231
252
|
// Grab neighbor files
|
|
232
|
-
let { getBrands } = require(
|
|
233
|
-
let { getBrands2 } = require(
|
|
234
|
-
let { getSettings } = require(
|
|
235
|
-
let { getNav } = require(
|
|
236
|
-
let { getNav2 } = require(
|
|
237
|
-
let { getSpecialNav } = require(
|
|
238
|
-
let { getFooter } = require(
|
|
239
|
-
let { getTopper } = require(
|
|
240
|
-
let { getBlueconic } = require(
|
|
241
|
-
let { pollForAccount } = require(
|
|
242
|
-
|
|
243
|
-
module.exports = {
|
|
253
|
+
let { getBrands } = require("./brands");
|
|
254
|
+
let { getBrands2 } = require("./brands2");
|
|
255
|
+
let { getSettings } = require("./settings");
|
|
256
|
+
let { getNav } = require("./nav");
|
|
257
|
+
let { getNav2 } = require("./nav2");
|
|
258
|
+
let { getSpecialNav } = require("./specialnav");
|
|
259
|
+
let { getFooter } = require("./footer");
|
|
260
|
+
let { getTopper } = require("./topper");
|
|
261
|
+
let { getBlueconic } = require("./blueconic");
|
|
262
|
+
let { pollForAccount } = require("./accountswap");
|
|
263
|
+
|
|
264
|
+
module.exports = {
|
|
265
|
+
appCheck,
|
|
266
|
+
blendHDN,
|
|
267
|
+
getSettings,
|
|
268
|
+
getBrands,
|
|
269
|
+
getBrands2,
|
|
270
|
+
getNav,
|
|
271
|
+
getNav2,
|
|
272
|
+
getSpecialNav,
|
|
273
|
+
getFooter,
|
|
274
|
+
getTopper,
|
|
275
|
+
getBlueconic,
|
|
276
|
+
pollForAccount,
|
|
277
|
+
};
|