Guest User

Untitled

a guest
May 21st, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.25 KB | None | 0 0
  1. require('dotenv').config({ silent: true });
  2. const htmlStandards = require('reshape-standard');
  3. const cssStandards = require('spike-css-standards');
  4. const jsStandards = require('spike-js-standards');
  5. const Contentful = require('spike-contentful');
  6. const marked = require('marked');
  7. const globImporter = require('node-sass-glob-importer');
  8. const moment = require('moment');
  9.  
  10. // These variables, set in dotenv, pull access tokens from an external source.
  11. const env = process.env.SPIKE_ENV;
  12. const previewToken = process.env.PREVIEW_TOKEN;
  13. const deliveryToken = process.env.ACCESS_TOKEN;
  14. const space = process.env.SPACE_ID;
  15.  
  16. // The variables above implement dotenv and pull access tokens from an external source.
  17. const locals = {};
  18. // Add markdown to local variables so they can be used in templates
  19. marked.setOptions({
  20. gfm: true,
  21. tables: true
  22. });
  23. locals.md = marked;
  24. // Add current year to local variables
  25. locals.year = new Date().getFullYear();
  26. // Make ENV available for templating
  27. locals.env = env;
  28. // Sitename to be used in templates
  29. locals.sitename = 'Site Name';
  30.  
  31. module.exports = {
  32. devtool: 'source-map',
  33. matchers: { html: '*(**/)*.html', css: '*(**/)*.scss' },
  34. ignore: [
  35. '**/index.html',
  36. 'src/components/**/*.scss',
  37. 'src/components/**/*.html',
  38. '**/.*',
  39. 'readme.md',
  40. 'yarn.lock'
  41. ],
  42. module: {
  43. rules: [
  44. {
  45. test: /\.scss/,
  46. use: [
  47. {
  48. loader: 'sass-loader',
  49. options: {
  50. importer: globImporter()
  51. }
  52. }
  53. ]
  54. },
  55. {
  56. test: /\.js/,
  57. use: [
  58. {
  59. loader: 'import-glob'
  60. }
  61. ]
  62. }
  63. ]
  64. },
  65. dumpDirs: ['src'],
  66. postcss: cssStandards({
  67. minify: env === 'production',
  68. warnForDuplicates: env !== 'production',
  69. autoprefixer: { browsers: ['last 4 versions', '> 1%', 'ie >= 9'] }
  70. }),
  71. babel: jsStandards(),
  72. plugins: [
  73. new Contentful({
  74. addDataTo: locals,
  75. spaceId: space || 'yourspace',
  76. accessToken: env !== 'production' ? previewToken : deliveryToken,
  77. preview: env !== 'production',
  78. // By default, this plugin will only fetch data once when you start your watcher, for development speed purposes. This means that if you change your data, you will have to restart the watcher to pick up the changes. If you are in a phase where you are making frequent data changes and would like a more aggressive updating strategy, you can set the aggressiveRefresh option to true, and your dreams will come true. However, note that this will slow down your local development, as it will fetch and link all entires every time you save a file, so it's only recommended for temporary use.
  79. // aggressiveRefresh: true,
  80. contentTypes: [
  81. {
  82. name: 'pages',
  83. id: 'page',
  84. transform: page => {
  85. const transformedPage = page;
  86. const { metaTitle } = transformedPage.fields;
  87. if (metaTitle && metaTitle.includes(' | Site Name')) {
  88. transformedPage.fields.metaTitle = metaTitle.slice(0, -12);
  89. }
  90. if (transformedPage.fields.collection) {
  91. const components = transformedPage.fields.collection;
  92. components.forEach(section => {
  93. if (
  94. section.sys.contentType.sys.id === 'hero' &&
  95. section.fields.video
  96. ) {
  97. const { video } = section.fields;
  98. const videoTerms = video.split('/');
  99. const embedCode = videoTerms[videoTerms.length - 1].split(
  100. '?'
  101. );
  102. /* eslint-disable */
  103. section.fields.video = embedCode[0];
  104. /* eslint-enable */
  105. }
  106. });
  107. }
  108. return transformedPage;
  109. },
  110. template: {
  111. path: 'src/layout/page.html',
  112. output: page => {
  113. if (page.fields.slug === 'home') {
  114. return `index.html`;
  115. }
  116. return `${page.fields.slug}.html`;
  117. }
  118. }
  119. },
  120. {
  121. name: 'resources',
  122. id: 'resource',
  123. transform: resource => {
  124. const transformedResource = resource;
  125. const summary = transformedResource.fields.text
  126. ? transformedResource.fields.text.substring(0, 150)
  127. : '';
  128. transformedResource.fields.summary = summary;
  129. transformedResource.fields.summary += '...';
  130. const { metaTitle } = transformedResource.fields;
  131. if (metaTitle && metaTitle.includes(' | Site Name')) {
  132. transformedResource.fields.metaTitle = metaTitle.slice(0, -12);
  133. }
  134. transformedResource.thankyou = `/resources/${
  135. resource.fields.slug
  136. }/thankyou`;
  137. return transformedResource;
  138. },
  139. template: {
  140. path: 'src/layout/resource.html',
  141. output: resource => `resources/${resource.fields.slug}/index.html`
  142. }
  143. },
  144. {
  145. name: 'resourceThankYous',
  146. id: 'resource',
  147. transform: resource => {
  148. const transformedResource = resource;
  149. const summary = transformedResource.fields.text
  150. ? transformedResource.fields.text.substring(0, 150)
  151. : '';
  152. transformedResource.fields.summary = summary;
  153. transformedResource.fields.summary += '...';
  154. const { title, thankyou } = transformedResource.fields;
  155. transformedResource.fields.metaTitle = `Thank you for downloading '${title}'`;
  156. transformedResource.fields.title = `Thank you for downloading<br />&ldquo;${title}&rdquo;`;
  157. transformedResource.thankyou = thankyou
  158. ? marked(thankyou)
  159. : `<p>Check your inbox for your download link.</p><p>Want to learn more about Site Name and how we can help you manage employee relations to achieve greater business results? Choose a time and date below to schedule a 15-minute call.</p>`;
  160. return transformedResource;
  161. },
  162. template: {
  163. path: 'src/layout/thankyou.html',
  164. output: resource =>
  165. `resources/${`${resource.fields.slug}/thankyou`}.html`
  166. }
  167. },
  168. {
  169. name: 'autoLandingPages',
  170. id: 'resource',
  171. transform: resource => {
  172. const transformedResource = resource;
  173. const summary = transformedResource.fields.text
  174. ? transformedResource.fields.text.substring(0, 150)
  175. : '';
  176. transformedResource.fields.summary = summary;
  177. transformedResource.fields.summary += '...';
  178. const { metaTitle } = transformedResource.fields;
  179. if (metaTitle && metaTitle.includes(' | Site Name')) {
  180. transformedResource.fields.metaTitle = metaTitle.slice(0, -12);
  181. }
  182. transformedResource.thankyou = `/${resource.fields.slug}/thankyou`;
  183. return transformedResource;
  184. },
  185. template: {
  186. path: 'src/layout/landing-page.html',
  187. output: resource => `${resource.fields.slug}/index.html`
  188. }
  189. },
  190. {
  191. name: 'autoLandingThankYous',
  192. id: 'resource',
  193. transform: resource => {
  194. const transformedResource = resource;
  195. const summary = transformedResource.fields.text
  196. ? transformedResource.fields.text.substring(0, 150)
  197. : '';
  198. transformedResource.fields.summary = summary;
  199. transformedResource.fields.summary += '...';
  200. const { title, thankyou } = transformedResource.fields;
  201. transformedResource.fields.metaTitle = `Thank you for downloading '${title}'`;
  202. transformedResource.fields.title = `Thank you for downloading<br />&ldquo;${title}&rdquo;`;
  203. transformedResource.thankyou = thankyou
  204. ? marked(thankyou)
  205. : `<p>Check your inbox for your download link.</p><p>Want to learn more about Site Name and how we can help you manage employee relations to achieve greater business results? Choose a time and date below to schedule a 15-minute call.</p>`;
  206. return transformedResource;
  207. },
  208. template: {
  209. path: 'src/layout/thankyou.html',
  210. output: resource => `${`${resource.fields.slug}/thankyou`}.html`
  211. }
  212. },
  213. {
  214. name: 'landingPages',
  215. id: 'landingPage',
  216. transform: resource => {
  217. const transformedResource = resource;
  218. const summary = transformedResource.fields.text
  219. ? transformedResource.fields.text.substring(0, 150)
  220. : '';
  221. transformedResource.fields.summary = summary;
  222. transformedResource.fields.summary += '...';
  223. const { metaTitle } = transformedResource.fields;
  224. if (metaTitle && metaTitle.includes(' | Site Name')) {
  225. transformedResource.fields.metaTitle = metaTitle.slice(0, -12);
  226. }
  227. transformedResource.thankyou = `/${resource.fields.slug}/thankyou`;
  228. return transformedResource;
  229. },
  230. template: {
  231. path: 'src/layout/landing-page.html',
  232. output: resource => `${resource.fields.slug}/index.html`
  233. }
  234. },
  235. {
  236. name: 'landingThankYous',
  237. id: 'landingPage',
  238. transform: resource => {
  239. const transformedResource = resource;
  240. const summary = transformedResource.fields.text
  241. ? transformedResource.fields.text.substring(0, 150)
  242. : '';
  243. transformedResource.fields.summary = summary;
  244. transformedResource.fields.summary += '...';
  245. const { title, thankyou } = transformedResource.fields;
  246. transformedResource.fields.metaTitle = `Thank you for downloading '${title}'`;
  247. transformedResource.fields.title = `Thank you for downloading<br />&ldquo;${title}&rdquo;`;
  248. transformedResource.thankyou = thankyou
  249. ? marked(thankyou)
  250. : `<p>Check your inbox for your download link.</p><p>Want to learn more about Site Name and how we can help you manage employee relations to achieve greater business results? Choose a time and date below to schedule a 15-minute call.</p>`;
  251. return transformedResource;
  252. },
  253. template: {
  254. path: 'src/layout/thankyou.html',
  255. output: resource => `${`${resource.fields.slug}/thankyou`}.html`
  256. }
  257. },
  258. {
  259. name: 'blogs',
  260. id: 'blogPost',
  261. filters: {
  262. order: '-fields.date',
  263. limit: 1000
  264. },
  265. transform: blog => {
  266. const transformedBlog = blog;
  267. const date = transformedBlog.fields.date
  268. ? moment(transformedBlog.fields.date).format('MMM Do, YYYY')
  269. : '';
  270. const summary = transformedBlog.fields.text
  271. ? transformedBlog.fields.text.substring(0, 150)
  272. : '';
  273. transformedBlog.fields.date = date;
  274. transformedBlog.fields.summary = summary;
  275. transformedBlog.fields.summary += '...';
  276. const { metaTitle } = transformedBlog.fields;
  277. if (metaTitle && metaTitle.includes(' | Site Name')) {
  278. transformedBlog.fields.metaTitle = metaTitle.slice(0, -12);
  279. }
  280. return transformedBlog;
  281. },
  282. template: {
  283. path: 'src/layout/blog.html',
  284. output: blog => `blog/${blog.fields.slug}.html`
  285. }
  286. },
  287. {
  288. name: 'news',
  289. id: 'news',
  290. filters: {
  291. order: '-fields.date'
  292. },
  293. transform: news => {
  294. const transformedNews = news;
  295. transformedNews.fields.date = moment(
  296. transformedNews.fields.date
  297. ).format('MMM Do, YYYY');
  298. return transformedNews;
  299. },
  300. template: {
  301. path: 'src/layout/news.html',
  302. output: news =>
  303. // BUG: this no worky
  304. // if (!news.fields.externalSourceUrl) {
  305. // return `about/news/${news.fields.slug}.html`;
  306. // }
  307. `about-us/news/${news.fields.slug}.html`
  308. }
  309. },
  310. {
  311. name: 'menus',
  312. id: 'menu'
  313. },
  314. {
  315. name: 'menuLinks',
  316. id: 'menuLink'
  317. },
  318. {
  319. name: 'ctas',
  320. id: 'cta'
  321. },
  322. {
  323. name: 'authors',
  324. id: 'author'
  325. },
  326. {
  327. name: 'customers',
  328. id: 'customer'
  329. },
  330. {
  331. name: 'testimonials',
  332. id: 'testimonial'
  333. },
  334. {
  335. name: 'teamMembers',
  336. id: 'teamMember',
  337. filters: {
  338. order: '-sys.updatedAt'
  339. }
  340. },
  341. {
  342. name: 'grids',
  343. id: 'grid'
  344. },
  345. {
  346. name: 'notifications',
  347. id: 'notification'
  348. },
  349. {
  350. name: 'redirects',
  351. id: 'redirect'
  352. }
  353. ],
  354. json: 'data.json'
  355. })
  356. ],
  357. reshape: htmlStandards({
  358. locals: () => locals,
  359. minify: env === 'production',
  360. retext: []
  361. }),
  362. entry: { 'assets/main': ['./src/assets/main.js'] }
  363. };
Add Comment
Please, Sign In to add comment