Yuki Takei 7 лет назад
Родитель
Сommit
16347d4b7e
2 измененных файлов с 86 добавлено и 0 удалено
  1. 48 0
      resource/cdn-resources.js
  2. 38 0
      src/lib/service/cdn-resources-resolver.js

+ 48 - 0
resource/cdn-resources.js

@@ -0,0 +1,48 @@
+module.exports = {
+  js: [
+    {
+      name: 'basis',
+      url: 'https://cdn.jsdelivr.net/combine/npm/emojione@3.1.2,npm/jquery@3.3.1,npm/bootstrap@3.3.7/dist/js/bootstrap.min.js',
+      args: {
+        integrity: '',
+      }
+    },
+    {
+      name: 'highlight',
+      url: 'https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.12.0/build/highlight.min.js',
+      args: {
+        integrity: '',
+      }
+    },
+    {
+      name: 'highlight-addons',
+      url: 'https://cdn.jsdelivr.net/combine/' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/dockerfile.min.js,' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/go.min.js,' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/gradle.min.js,' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/json.min.js,' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/less.min.js,' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/scss.min.js,' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/typescript.min.js,' +
+'gh/highlightjs/cdn-release@9.12.0/build/languages/yaml.min.js',
+      args: {
+        defer: true,
+        integrity: '',
+      }
+    },
+    {
+      name: 'mathjax',
+      url: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js',
+      args: {
+        async: true,
+        integrity: '',
+      }
+    }
+  ],
+  style: [
+    {
+      name: 'font-awesome',
+      url: 'https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css',
+    },
+  ]
+};

+ 38 - 0
src/lib/service/cdn-resources-resolver.js

@@ -0,0 +1,38 @@
+const axios = require('axios');
+const fs = require('graceful-fs');
+
+const helpers = require('@commons/util/helpers');
+const cdnLocalScriptRoot = 'public/js/cdn';
+const cdnLocalStyleRoot = 'public/styles/cdn';
+
+class CdnResourcesResolver {
+  constructor() {
+    this.logger = require('@alias/logger')('growi:service:CdnResourcesResolver');
+    this.loadMetaData();
+  }
+
+  loadMetaData() {
+    this.cdnResources = require('@root/resource/cdn-resources');
+    this.logger.info('meta data loaded : ', this.cdnResources);
+  }
+
+  async downloadAndWrite(url, file) {
+    // get
+    const response = await axios.get(url, { responseType: 'stream' });
+    // write
+    await response.data.pipe(fs.createWriteStream(file));
+  }
+
+  async downloadAndWriteAll() {
+    const promisesForScript = this.cdnResources.js.map(resource => {
+      return this.downloadAndWrite(resource.url, helpers.root(cdnLocalScriptRoot, `${resource.name}.js`));
+    });
+    const promisesForStyle = this.cdnResources.style.map(resource => {
+      return this.downloadAndWrite(resource.url, helpers.root(cdnLocalStyleRoot, `${resource.name}.css`));
+    });
+
+    return Promise.all([promisesForScript, promisesForStyle]);
+  }
+}
+
+module.exports = CdnResourcesResolver;