Use double quotes for JS files to avoid confused Go developers
This commit is contained in:
parent
c5e2783b8d
commit
8d4291de38
|
@ -14,7 +14,7 @@ module.exports = {
|
||||||
'comma-dangle': ['error', 'always-multiline'],
|
'comma-dangle': ['error', 'always-multiline'],
|
||||||
indent: ['error', 4],
|
indent: ['error', 4],
|
||||||
'linebreak-style': ['error', 'unix'],
|
'linebreak-style': ['error', 'unix'],
|
||||||
quotes: ['error', 'single'],
|
quotes: ['error', 'double'], // Easier for Go developers!
|
||||||
semi: ['error', 'always'],
|
semi: ['error', 'always'],
|
||||||
'no-unused-vars': ['warn'],
|
'no-unused-vars': ['warn'],
|
||||||
'no-console': 0,
|
'no-console': 0,
|
||||||
|
|
|
@ -1,64 +1,64 @@
|
||||||
const path = require('path');
|
const path = require("path");
|
||||||
const findChrome = require('chrome-finder');
|
const findChrome = require("chrome-finder");
|
||||||
|
|
||||||
process.env.CHROME_BIN = findChrome();
|
process.env.CHROME_BIN = findChrome();
|
||||||
|
|
||||||
module.exports = (config) => {
|
module.exports = (config) => {
|
||||||
config.set({
|
config.set({
|
||||||
frameworks: ['mocha'],
|
frameworks: ["mocha"],
|
||||||
|
|
||||||
browsers: ['LocalChrome'],
|
browsers: ["LocalChrome"],
|
||||||
|
|
||||||
customLaunchers: {
|
customLaunchers: {
|
||||||
LocalChrome: {
|
LocalChrome: {
|
||||||
base: 'ChromeHeadless',
|
base: "ChromeHeadless",
|
||||||
flags: ['--disable-translate', '--disable-extensions', '--no-sandbox', '--disable-web-security'],
|
flags: ["--disable-translate", "--disable-extensions", "--no-sandbox", "--disable-web-security"],
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
files: [
|
files: [
|
||||||
{pattern: 'tests/**/*_test.js', watched: false}
|
{pattern: "tests/**/*_test.js", watched: false},
|
||||||
],
|
],
|
||||||
|
|
||||||
// Preprocess through webpack
|
// Preprocess through webpack
|
||||||
preprocessors: {
|
preprocessors: {
|
||||||
'tests/**/*_test.js': ['webpack']
|
"tests/**/*_test.js": ["webpack"],
|
||||||
},
|
},
|
||||||
|
|
||||||
reporters: ['progress', 'html'],
|
reporters: ["progress", "html"],
|
||||||
|
|
||||||
htmlReporter: {
|
htmlReporter: {
|
||||||
outputFile: 'tests/result.html'
|
outputFile: "tests/result.html",
|
||||||
},
|
},
|
||||||
|
|
||||||
webpack: {
|
webpack: {
|
||||||
mode: 'development',
|
mode: "development",
|
||||||
|
|
||||||
resolve: {
|
resolve: {
|
||||||
modules: [
|
modules: [
|
||||||
path.join(__dirname, 'src'),
|
path.join(__dirname, "src"),
|
||||||
path.join(__dirname, 'node_modules'),
|
path.join(__dirname, "node_modules"),
|
||||||
path.join(__dirname, 'tests'),
|
path.join(__dirname, "tests"),
|
||||||
],
|
],
|
||||||
alias: {
|
alias: {
|
||||||
vue: 'vue/dist/vue.js'
|
vue: "vue/dist/vue.js",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
test: /\.js$/,
|
test: /\.js$/,
|
||||||
loader: 'babel-loader',
|
loader: "babel-loader",
|
||||||
exclude: file => (
|
exclude: file => (
|
||||||
/node_modules/.test(file)
|
/node_modules/.test(file)
|
||||||
),
|
),
|
||||||
query: {
|
query: {
|
||||||
presets: ['@babel/preset-env'],
|
presets: ["@babel/preset-env"],
|
||||||
compact: false
|
compact: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
]
|
],
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
singleRun: true,
|
singleRun: true,
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "webpack --watch",
|
"dev": "webpack --watch",
|
||||||
"build": "webpack --optimize-minimize",
|
"build": "webpack --optimize-minimize",
|
||||||
"lint": "eslint --cache src/ webpack.*.js",
|
"lint": "eslint --cache src/ *.js",
|
||||||
"fmt": "eslint --cache --fix src/ webpack.*.js",
|
"fmt": "eslint --cache --fix src/ *.js",
|
||||||
"test": "karma start"
|
"test": "karma start"
|
||||||
},
|
},
|
||||||
"babel": {
|
"babel": {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
module.exports = ({ file, options, env }) => ({
|
module.exports = {
|
||||||
plugins: {
|
plugins: {
|
||||||
"postcss-import": {},
|
"postcss-import": {},
|
||||||
"postcss-preset-env": true,
|
"postcss-preset-env": {},
|
||||||
"cssnano": env === "production",
|
"cssnano": {},
|
||||||
}
|
},
|
||||||
});
|
};
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
import Vue from 'vue';
|
import Vue from "vue";
|
||||||
import Vuetify from 'vuetify';
|
import Vuetify from "vuetify";
|
||||||
import Router from 'vue-router';
|
import Router from "vue-router";
|
||||||
import '../css/app.css';
|
import "../css/app.css";
|
||||||
import App from 'app/main.vue';
|
import App from "app/main.vue";
|
||||||
import routes from 'app/routes';
|
import routes from "app/routes";
|
||||||
import Api from 'common/api';
|
import Api from "common/api";
|
||||||
import Config from 'common/config';
|
import Config from "common/config";
|
||||||
import Components from 'component/init';
|
import Components from "component/init";
|
||||||
import Maps from 'maps/init';
|
import Maps from "maps/init";
|
||||||
import Alert from 'common/alert';
|
import Alert from "common/alert";
|
||||||
import Gallery from 'common/gallery';
|
import Gallery from "common/gallery";
|
||||||
import Session from 'common/session';
|
import Session from "common/session";
|
||||||
import Event from 'pubsub-js';
|
import Event from "pubsub-js";
|
||||||
import Moment from 'vue-moment';
|
import Moment from "vue-moment";
|
||||||
import InfiniteScroll from 'vue-infinite-scroll';
|
import InfiniteScroll from "vue-infinite-scroll";
|
||||||
import VueTruncate from 'vue-truncate-filter';
|
import VueTruncate from "vue-truncate-filter";
|
||||||
import VueFullscreen from 'vue-fullscreen';
|
import VueFullscreen from "vue-fullscreen";
|
||||||
|
|
||||||
// Initialize client-side session
|
// Initialize client-side session
|
||||||
const session = new Session(window.localStorage);
|
const session = new Session(window.localStorage);
|
||||||
|
@ -32,15 +32,15 @@ Vue.prototype.$config = config;
|
||||||
// Register Vuetify
|
// Register Vuetify
|
||||||
Vue.use(Vuetify, {
|
Vue.use(Vuetify, {
|
||||||
theme: {
|
theme: {
|
||||||
primary: '#FFD600',
|
primary: "#FFD600",
|
||||||
secondary: '#b0bec5',
|
secondary: "#b0bec5",
|
||||||
accent: '#00B8D4',
|
accent: "#00B8D4",
|
||||||
error: '#E57373',
|
error: "#E57373",
|
||||||
info: '#00B8D4',
|
info: "#00B8D4",
|
||||||
success: '#00BFA5',
|
success: "#00BFA5",
|
||||||
warning: '#FFD600',
|
warning: "#FFD600",
|
||||||
delete: '#E57373',
|
delete: "#E57373",
|
||||||
love: '#EF5350',
|
love: "#EF5350",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -56,14 +56,14 @@ Vue.use(Router);
|
||||||
// Configure client-side routing
|
// Configure client-side routing
|
||||||
const router = new Router({
|
const router = new Router({
|
||||||
routes,
|
routes,
|
||||||
mode: 'history',
|
mode: "history",
|
||||||
saveScrollPosition: true,
|
saveScrollPosition: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Run app
|
// Run app
|
||||||
/* eslint-disable no-unused-vars */
|
/* eslint-disable no-unused-vars */
|
||||||
const app = new Vue({
|
const app = new Vue({
|
||||||
el: '#app',
|
el: "#app",
|
||||||
router,
|
router,
|
||||||
render: h => h(App),
|
render: h => h(App),
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,33 +1,33 @@
|
||||||
import Photos from 'app/pages/photos.vue';
|
import Photos from "app/pages/photos.vue";
|
||||||
import PhotosEdit from 'app/pages/photosEdit.vue';
|
import PhotosEdit from "app/pages/photosEdit.vue";
|
||||||
import Albums from 'app/pages/albums.vue';
|
import Albums from "app/pages/albums.vue";
|
||||||
import Albums2 from 'app/pages/albums2.vue';
|
import Albums2 from "app/pages/albums2.vue";
|
||||||
import Import2 from 'app/pages/import2.vue';
|
import Import2 from "app/pages/import2.vue";
|
||||||
import Import3 from 'app/pages/import3.vue';
|
import Import3 from "app/pages/import3.vue";
|
||||||
import Import from 'app/pages/import.vue';
|
import Import from "app/pages/import.vue";
|
||||||
import Export from 'app/pages/export.vue';
|
import Export from "app/pages/export.vue";
|
||||||
import Settings from 'app/pages/settings.vue';
|
import Settings from "app/pages/settings.vue";
|
||||||
import Tags from 'app/pages/tags.vue';
|
import Tags from "app/pages/tags.vue";
|
||||||
import Todo from 'app/pages/todo.vue';
|
import Todo from "app/pages/todo.vue";
|
||||||
import Places from 'app/pages/places.vue';
|
import Places from "app/pages/places.vue";
|
||||||
import Calendar from 'app/pages/calendar.vue';
|
import Calendar from "app/pages/calendar.vue";
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
{ name: 'Home', path: '/', redirect: '/photos' },
|
{ name: "Home", path: "/", redirect: "/photos" },
|
||||||
{ name: 'Photos', path: '/photos', component: Photos },
|
{ name: "Photos", path: "/photos", component: Photos },
|
||||||
{ name: 'PhotosEdit', path: '/photosEdit', component: PhotosEdit },
|
{ name: "PhotosEdit", path: "/photosEdit", component: PhotosEdit },
|
||||||
{ name: 'Filters', path: '/filters', component: Todo },
|
{ name: "Filters", path: "/filters", component: Todo },
|
||||||
{ name: 'Calendar', path: '/calendar', component: Calendar },
|
{ name: "Calendar", path: "/calendar", component: Calendar },
|
||||||
{ name: 'Tags', path: '/tags', component: Tags },
|
{ name: "Tags", path: "/tags", component: Tags },
|
||||||
{ name: 'Bookmarks', path: '/bookmarks', component: Todo },
|
{ name: "Bookmarks", path: "/bookmarks", component: Todo },
|
||||||
{ name: 'Favorites', path: '/favorites', component: Todo },
|
{ name: "Favorites", path: "/favorites", component: Todo },
|
||||||
{ name: 'Places', path: '/places', component: Places },
|
{ name: "Places", path: "/places", component: Places },
|
||||||
{ name: 'Albums', path: '/albums', component: Albums },
|
{ name: "Albums", path: "/albums", component: Albums },
|
||||||
{ name: 'Albums2', path: '/albums2', component: Albums2 },
|
{ name: "Albums2", path: "/albums2", component: Albums2 },
|
||||||
{ name: 'Import', path: '/import', component: Import },
|
{ name: "Import", path: "/import", component: Import },
|
||||||
{ name: 'Import2', path: '/import2', component: Import2 },
|
{ name: "Import2", path: "/import2", component: Import2 },
|
||||||
{ name: 'Import3', path: '/import3', component: Import3 },
|
{ name: "Import3", path: "/import3", component: Import3 },
|
||||||
{ name: 'Export', path: '/export', component: Export },
|
{ name: "Export", path: "/export", component: Export },
|
||||||
{ name: 'Settings', path: '/settings', component: Settings },
|
{ name: "Settings", path: "/settings", component: Settings },
|
||||||
{ path: '*', redirect: '/photos' },
|
{ path: "*", redirect: "/photos" },
|
||||||
];
|
];
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import Event from 'pubsub-js';
|
import Event from "pubsub-js";
|
||||||
|
|
||||||
const Alert = {
|
const Alert = {
|
||||||
info: function (message) {
|
info: function (message) {
|
||||||
Event.publish('alert.info', message);
|
Event.publish("alert.info", message);
|
||||||
},
|
},
|
||||||
warning: function (message) {
|
warning: function (message) {
|
||||||
Event.publish('alert.warning', message);
|
Event.publish("alert.warning", message);
|
||||||
},
|
},
|
||||||
error: function (message) {
|
error: function (message) {
|
||||||
Event.publish('alert.error', message);
|
Event.publish("alert.error", message);
|
||||||
},
|
},
|
||||||
success: function (message) {
|
success: function (message) {
|
||||||
Event.publish('alert.success', message);
|
Event.publish("alert.success", message);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import axios from 'axios';
|
import axios from "axios";
|
||||||
import Event from 'pubsub-js';
|
import Event from "pubsub-js";
|
||||||
import '@babel/polyfill';
|
import "@babel/polyfill";
|
||||||
|
|
||||||
const Api = axios.create({
|
const Api = axios.create({
|
||||||
baseURL: '/api/v1',
|
baseURL: "/api/v1",
|
||||||
headers: {common: {
|
headers: {common: {
|
||||||
'X-Session-Token': window.localStorage.getItem('session_token'),
|
"X-Session-Token": window.localStorage.getItem("session_token"),
|
||||||
}},
|
}},
|
||||||
});
|
});
|
||||||
|
|
||||||
Api.interceptors.request.use(function (config) {
|
Api.interceptors.request.use(function (config) {
|
||||||
// Do something before request is sent
|
// Do something before request is sent
|
||||||
Event.publish('ajax.start', config);
|
Event.publish("ajax.start", config);
|
||||||
return config;
|
return config;
|
||||||
}, function (error) {
|
}, function (error) {
|
||||||
// Do something with request error
|
// Do something with request error
|
||||||
|
@ -19,7 +19,7 @@ Api.interceptors.request.use(function (config) {
|
||||||
});
|
});
|
||||||
|
|
||||||
Api.interceptors.response.use(function (response) {
|
Api.interceptors.response.use(function (response) {
|
||||||
Event.publish('ajax.end', response);
|
Event.publish("ajax.end", response);
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}, function (error) {
|
}, function (error) {
|
||||||
|
@ -27,7 +27,7 @@ Api.interceptors.response.use(function (response) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
let errorMessage = 'An error occurred - are you offline?';
|
let errorMessage = "An error occurred - are you offline?";
|
||||||
let code = error.code;
|
let code = error.code;
|
||||||
|
|
||||||
if(error.response && error.response.data) {
|
if(error.response && error.response.data) {
|
||||||
|
@ -36,11 +36,11 @@ Api.interceptors.response.use(function (response) {
|
||||||
errorMessage = data.message ? data.message : data.error;
|
errorMessage = data.message ? data.message : data.error;
|
||||||
}
|
}
|
||||||
|
|
||||||
Event.publish('ajax.end');
|
Event.publish("ajax.end");
|
||||||
Event.publish('alert.error', errorMessage);
|
Event.publish("alert.error", errorMessage);
|
||||||
|
|
||||||
if(code === 401) {
|
if(code === 401) {
|
||||||
window.location = '/';
|
window.location = "/";
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import Api from 'common/api';
|
import Api from "common/api";
|
||||||
|
|
||||||
class Config {
|
class Config {
|
||||||
/**
|
/**
|
||||||
|
@ -7,7 +7,7 @@ class Config {
|
||||||
*/
|
*/
|
||||||
constructor(storage, values) {
|
constructor(storage, values) {
|
||||||
this.storage = storage;
|
this.storage = storage;
|
||||||
this.storage_key = 'config';
|
this.storage_key = "config";
|
||||||
|
|
||||||
this.values = values;
|
this.values = values;
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ class Config {
|
||||||
}
|
}
|
||||||
|
|
||||||
pullFromServer() {
|
pullFromServer() {
|
||||||
return Api.get('config').then(
|
return Api.get("config").then(
|
||||||
(result) => {
|
(result) => {
|
||||||
this.setValues(result.data);
|
this.setValues(result.data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
export const FormPropertyType = Object.freeze({
|
export const FormPropertyType = Object.freeze({
|
||||||
String: 'string',
|
String: "string",
|
||||||
Number: 'number',
|
Number: "number",
|
||||||
Object: 'object',
|
Object: "object",
|
||||||
});
|
});
|
||||||
|
|
||||||
export default class Form {
|
export default class Form {
|
||||||
|
@ -68,11 +68,11 @@ export default class Form {
|
||||||
if (
|
if (
|
||||||
this.definition &&
|
this.definition &&
|
||||||
this.definition.hasOwnProperty(fieldName) &&
|
this.definition.hasOwnProperty(fieldName) &&
|
||||||
this.definition[fieldName].hasOwnProperty('options')
|
this.definition[fieldName].hasOwnProperty("options")
|
||||||
) {
|
) {
|
||||||
return this.definition[fieldName].options;
|
return this.definition[fieldName].options;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [{ option: '', label: '' }];
|
return [{ option: "", label: "" }];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import PhotoSwipe from 'photoswipe';
|
import PhotoSwipe from "photoswipe";
|
||||||
import PhotoSwipeUI_Default from 'photoswipe/dist/photoswipe-ui-default.js';
|
import PhotoSwipeUI_Default from "photoswipe/dist/photoswipe-ui-default.js";
|
||||||
|
|
||||||
class Gallery {
|
class Gallery {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -13,7 +13,7 @@ class Gallery {
|
||||||
|
|
||||||
createPhotoSizes(photo) {
|
createPhotoSizes(photo) {
|
||||||
const createPhotoSize = height => ({
|
const createPhotoSize = height => ({
|
||||||
src: photo.getThumbnailUrl('fit', height),
|
src: photo.getThumbnailUrl("fit", height),
|
||||||
w: photo.calculateWidth(height),
|
w: photo.calculateWidth(height),
|
||||||
h: height,
|
h: height,
|
||||||
title: photo.PhotoTitle,
|
title: photo.PhotoTitle,
|
||||||
|
@ -32,10 +32,10 @@ class Gallery {
|
||||||
|
|
||||||
getEl() {
|
getEl() {
|
||||||
if(!this.el) {
|
if(!this.el) {
|
||||||
const elements = document.querySelectorAll('.pswp');
|
const elements = document.querySelectorAll(".pswp");
|
||||||
|
|
||||||
if(elements.length !== 1) {
|
if(elements.length !== 1) {
|
||||||
let err = 'There should be only one PhotoSwipe element';
|
let err = "There should be only one PhotoSwipe element";
|
||||||
console.log(err, elements);
|
console.log(err, elements);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ class Gallery {
|
||||||
|
|
||||||
show(photos, index = 0) {
|
show(photos, index = 0) {
|
||||||
if (!Array.isArray(photos) || photos.length === 0 || index >= photos.length) {
|
if (!Array.isArray(photos) || photos.length === 0 || index >= photos.length) {
|
||||||
console.log('Array passed to gallery was empty:', photos);
|
console.log("Array passed to gallery was empty:", photos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,12 +79,12 @@ class Gallery {
|
||||||
let firstResize = true;
|
let firstResize = true;
|
||||||
let photoSrcWillChange;
|
let photoSrcWillChange;
|
||||||
|
|
||||||
gallery.listen('beforeResize', () => {
|
gallery.listen("beforeResize", () => {
|
||||||
realViewportWidth = gallery.viewportSize.x * window.devicePixelRatio;
|
realViewportWidth = gallery.viewportSize.x * window.devicePixelRatio;
|
||||||
realViewportHeight = gallery.viewportSize.y * window.devicePixelRatio;
|
realViewportHeight = gallery.viewportSize.y * window.devicePixelRatio;
|
||||||
|
|
||||||
if (!previousSize) {
|
if (!previousSize) {
|
||||||
previousSize = 'm';
|
previousSize = "m";
|
||||||
}
|
}
|
||||||
|
|
||||||
nextSize = this.constructor.mapViewportToImageSize(realViewportWidth, realViewportHeight, photosWithSizes[index]);
|
nextSize = this.constructor.mapViewportToImageSize(realViewportWidth, realViewportHeight, photosWithSizes[index]);
|
||||||
|
@ -104,7 +104,7 @@ class Gallery {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
gallery.listen('gettingData', function (index, item) {
|
gallery.listen("gettingData", function (index, item) {
|
||||||
item.src = item[nextSize].src;
|
item.src = item[nextSize].src;
|
||||||
item.w = item[nextSize].w;
|
item.w = item[nextSize].w;
|
||||||
item.h = item[nextSize].h;
|
item.h = item[nextSize].h;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import Api from 'common/api';
|
import Api from "common/api";
|
||||||
import User from 'model/user';
|
import User from "model/user";
|
||||||
|
|
||||||
class Session {
|
class Session {
|
||||||
/**
|
/**
|
||||||
|
@ -7,17 +7,17 @@ class Session {
|
||||||
*/
|
*/
|
||||||
constructor(storage) {
|
constructor(storage) {
|
||||||
this.storage = storage;
|
this.storage = storage;
|
||||||
this.session_token = this.storage.getItem('session_token');
|
this.session_token = this.storage.getItem("session_token");
|
||||||
|
|
||||||
const userJson = this.storage.getItem('user');
|
const userJson = this.storage.getItem("user");
|
||||||
|
|
||||||
this.user = userJson !== 'undefined' ? new User(JSON.parse(userJson)) : null;
|
this.user = userJson !== "undefined" ? new User(JSON.parse(userJson)) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
setToken(token) {
|
setToken(token) {
|
||||||
this.session_token = token;
|
this.session_token = token;
|
||||||
this.storage.setItem('session_token', token);
|
this.storage.setItem("session_token", token);
|
||||||
Api.defaults.headers.common['X-Session-Token'] = token;
|
Api.defaults.headers.common["X-Session-Token"] = token;
|
||||||
}
|
}
|
||||||
|
|
||||||
getToken() {
|
getToken() {
|
||||||
|
@ -26,14 +26,14 @@ class Session {
|
||||||
|
|
||||||
deleteToken() {
|
deleteToken() {
|
||||||
this.session_token = null;
|
this.session_token = null;
|
||||||
this.storage.removeItem('session_token');
|
this.storage.removeItem("session_token");
|
||||||
Api.defaults.headers.common['X-Session-Token'] = '';
|
Api.defaults.headers.common["X-Session-Token"] = "";
|
||||||
this.deleteUser();
|
this.deleteUser();
|
||||||
}
|
}
|
||||||
|
|
||||||
setUser(user) {
|
setUser(user) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
this.storage.setItem('user', JSON.stringify(user.getValues()));
|
this.storage.setItem("user", JSON.stringify(user.getValues()));
|
||||||
}
|
}
|
||||||
|
|
||||||
getUser() {
|
getUser() {
|
||||||
|
@ -45,15 +45,15 @@ class Session {
|
||||||
return this.user.userEmail;
|
return this.user.userEmail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
getFullName() {
|
getFullName() {
|
||||||
if (this.isUser()) {
|
if (this.isUser()) {
|
||||||
return this.user.userFirstName + ' ' + this.user.userLastName;
|
return this.user.userFirstName + " " + this.user.userLastName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
getFirstName() {
|
getFirstName() {
|
||||||
|
@ -61,7 +61,7 @@ class Session {
|
||||||
return this.user.userFirstName;
|
return this.user.userFirstName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
isUser() {
|
isUser() {
|
||||||
|
@ -69,7 +69,7 @@ class Session {
|
||||||
}
|
}
|
||||||
|
|
||||||
isAdmin() {
|
isAdmin() {
|
||||||
return this.user.hasId() && this.user.userRole === 'admin';
|
return this.user.hasId() && this.user.userRole === "admin";
|
||||||
}
|
}
|
||||||
|
|
||||||
isAnonymous() {
|
isAnonymous() {
|
||||||
|
@ -78,13 +78,13 @@ class Session {
|
||||||
|
|
||||||
deleteUser() {
|
deleteUser() {
|
||||||
this.user = null;
|
this.user = null;
|
||||||
this.storage.removeItem('user');
|
this.storage.removeItem("user");
|
||||||
}
|
}
|
||||||
|
|
||||||
login(email, password) {
|
login(email, password) {
|
||||||
this.deleteToken();
|
this.deleteToken();
|
||||||
|
|
||||||
return Api.post('session', { email: email, password: password }).then(
|
return Api.post("session", { email: email, password: password }).then(
|
||||||
(result) => {
|
(result) => {
|
||||||
this.setToken(result.data.token);
|
this.setToken(result.data.token);
|
||||||
this.setUser(new User(result.data.user));
|
this.setUser(new User(result.data.user));
|
||||||
|
@ -97,9 +97,9 @@ class Session {
|
||||||
|
|
||||||
this.deleteToken();
|
this.deleteToken();
|
||||||
|
|
||||||
Api.delete('session/' + token).then(
|
Api.delete("session/" + token).then(
|
||||||
() => {
|
() => {
|
||||||
window.location = '/';
|
window.location = "/";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import AppAlert from './app-alert.vue';
|
import AppAlert from "./app-alert.vue";
|
||||||
import AppNavigation from './app-navigation.vue';
|
import AppNavigation from "./app-navigation.vue";
|
||||||
import AppLoadingBar from './app-loading-bar.vue';
|
import AppLoadingBar from "./app-loading-bar.vue";
|
||||||
import AppGallery from './app-gallery.vue';
|
import AppGallery from "./app-gallery.vue";
|
||||||
|
|
||||||
const components = {};
|
const components = {};
|
||||||
|
|
||||||
components.install = (Vue) => {
|
components.install = (Vue) => {
|
||||||
Vue.component('app-alert', AppAlert);
|
Vue.component("app-alert", AppAlert);
|
||||||
Vue.component('app-gallery', AppGallery);
|
Vue.component("app-gallery", AppGallery);
|
||||||
Vue.component('app-navigation', AppNavigation);
|
Vue.component("app-navigation", AppNavigation);
|
||||||
Vue.component('app-loading-bar', AppLoadingBar);
|
Vue.component("app-loading-bar", AppLoadingBar);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default components;
|
export default components;
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
import {LMap, LTileLayer, LMarker, LControl} from 'vue2-leaflet';
|
import {LMap, LTileLayer, LMarker, LControl} from "vue2-leaflet";
|
||||||
import {Icon} from 'leaflet';
|
import {Icon} from "leaflet";
|
||||||
|
|
||||||
const components = {};
|
const components = {};
|
||||||
|
|
||||||
components.install = (Vue) => {
|
components.install = (Vue) => {
|
||||||
Vue.component('l-map', LMap);
|
Vue.component("l-map", LMap);
|
||||||
Vue.component('l-tile-layer', LTileLayer);
|
Vue.component("l-tile-layer", LTileLayer);
|
||||||
Vue.component('l-marker', LMarker);
|
Vue.component("l-marker", LMarker);
|
||||||
Vue.component('l-control', LControl);
|
Vue.component("l-control", LControl);
|
||||||
|
|
||||||
delete Icon.Default.prototype._getIconUrl;
|
delete Icon.Default.prototype._getIconUrl;
|
||||||
|
|
||||||
Icon.Default.mergeOptions({
|
Icon.Default.mergeOptions({
|
||||||
iconRetinaUrl: require('./marker/marker-icon-2x-red.png'),
|
iconRetinaUrl: require("./marker/marker-icon-2x-red.png"),
|
||||||
iconUrl: require('./marker/marker-icon-red.png'),
|
iconUrl: require("./marker/marker-icon-red.png"),
|
||||||
shadowUrl: require('./marker/marker-shadow.png'),
|
shadowUrl: require("./marker/marker-shadow.png"),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import Api from 'common/api';
|
import Api from "common/api";
|
||||||
import Form from 'common/form';
|
import Form from "common/form";
|
||||||
|
|
||||||
class Abstract {
|
class Abstract {
|
||||||
constructor(values) {
|
constructor(values) {
|
||||||
|
@ -14,7 +14,7 @@ class Abstract {
|
||||||
if(!values) return;
|
if(!values) return;
|
||||||
|
|
||||||
for(let key in values) {
|
for(let key in values) {
|
||||||
if(values.hasOwnProperty(key) && key !== '__originalValues') {
|
if(values.hasOwnProperty(key) && key !== "__originalValues") {
|
||||||
this[key] = values[key];
|
this[key] = values[key];
|
||||||
this.__originalValues[key] = values[key];
|
this.__originalValues[key] = values[key];
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ class Abstract {
|
||||||
const result = {};
|
const result = {};
|
||||||
|
|
||||||
for(let key in this.__originalValues) {
|
for(let key in this.__originalValues) {
|
||||||
if(this.__originalValues.hasOwnProperty(key) && key !== '__originalValues') {
|
if(this.__originalValues.hasOwnProperty(key) && key !== "__originalValues") {
|
||||||
result[key] = this[key];
|
result[key] = this[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,19 +72,19 @@ class Abstract {
|
||||||
id = this.getId();
|
id = this.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.constructor.getCollectionResource() + '/' + id;
|
return this.constructor.getCollectionResource() + "/" + id;
|
||||||
}
|
}
|
||||||
|
|
||||||
getEntityName() {
|
getEntityName() {
|
||||||
return this.constructor.getModelName() + ' ' + this.getId();
|
return this.constructor.getModelName() + " " + this.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCollectionResource() {
|
static getCollectionResource() {
|
||||||
throw new Error('getCollectionResource() needs to be implemented');
|
throw new Error("getCollectionResource() needs to be implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCreateResource() {
|
static getCreateResource() {
|
||||||
return this.getCollectionResource() + '/new';
|
return this.getCollectionResource() + "/new";
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCreateForm() {
|
static getCreateForm() {
|
||||||
|
@ -92,7 +92,7 @@ class Abstract {
|
||||||
}
|
}
|
||||||
|
|
||||||
static getModelName() {
|
static getModelName() {
|
||||||
return 'Item';
|
return "Item";
|
||||||
}
|
}
|
||||||
|
|
||||||
static getSearchForm() {
|
static getSearchForm() {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import Abstract from 'model/abstract';
|
import Abstract from "model/abstract";
|
||||||
import Api from 'common/api';
|
import Api from "common/api";
|
||||||
|
|
||||||
class Photo extends Abstract {
|
class Photo extends Abstract {
|
||||||
getEntityName() {
|
getEntityName() {
|
||||||
|
@ -16,13 +16,13 @@ class Photo extends Abstract {
|
||||||
|
|
||||||
getColor() {
|
getColor() {
|
||||||
switch (this.PhotoColor) {
|
switch (this.PhotoColor) {
|
||||||
case 'brown':
|
case "brown":
|
||||||
case 'black':
|
case "black":
|
||||||
case 'white':
|
case "white":
|
||||||
case 'grey':
|
case "grey":
|
||||||
return 'grey lighten-2';
|
return "grey lighten-2";
|
||||||
default:
|
default:
|
||||||
return this.PhotoColor + ' lighten-4';
|
return this.PhotoColor + " lighten-4";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,25 +31,25 @@ class Photo extends Abstract {
|
||||||
}
|
}
|
||||||
|
|
||||||
getGoogleMapsLink() {
|
getGoogleMapsLink() {
|
||||||
return 'https://www.google.com/maps/place/' + this.PhotoLat + ',' + this.PhotoLong;
|
return "https://www.google.com/maps/place/" + this.PhotoLat + "," + this.PhotoLong;
|
||||||
}
|
}
|
||||||
|
|
||||||
getThumbnailUrl(type, size) {
|
getThumbnailUrl(type, size) {
|
||||||
return '/api/v1/thumbnails/' + type + '/' + size + '/' + this.FileHash;
|
return "/api/v1/thumbnails/" + type + "/" + size + "/" + this.FileHash;
|
||||||
}
|
}
|
||||||
|
|
||||||
getThumbnailSrcset() {
|
getThumbnailSrcset() {
|
||||||
const result = [];
|
const result = [];
|
||||||
|
|
||||||
result.push(this.getThumbnailUrl('fit', 320) + ' 320w');
|
result.push(this.getThumbnailUrl("fit", 320) + " 320w");
|
||||||
result.push(this.getThumbnailUrl('fit', 500) + ' 500w');
|
result.push(this.getThumbnailUrl("fit", 500) + " 500w");
|
||||||
result.push(this.getThumbnailUrl('fit', 720) + ' 720w');
|
result.push(this.getThumbnailUrl("fit", 720) + " 720w");
|
||||||
result.push(this.getThumbnailUrl('fit', 1280) + ' 1280w');
|
result.push(this.getThumbnailUrl("fit", 1280) + " 1280w");
|
||||||
result.push(this.getThumbnailUrl('fit', 1920) + ' 1920w');
|
result.push(this.getThumbnailUrl("fit", 1920) + " 1920w");
|
||||||
result.push(this.getThumbnailUrl('fit', 2560) + ' 2560w');
|
result.push(this.getThumbnailUrl("fit", 2560) + " 2560w");
|
||||||
result.push(this.getThumbnailUrl('fit', 3840) + ' 3840w');
|
result.push(this.getThumbnailUrl("fit", 3840) + " 3840w");
|
||||||
|
|
||||||
return result.join(', ');
|
return result.join(", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
calculateWidth(height) {
|
calculateWidth(height) {
|
||||||
|
@ -59,15 +59,15 @@ class Photo extends Abstract {
|
||||||
getThumbnailSizes() {
|
getThumbnailSizes() {
|
||||||
const result = [];
|
const result = [];
|
||||||
|
|
||||||
result.push('(min-width: 2560px) 3840px');
|
result.push("(min-width: 2560px) 3840px");
|
||||||
result.push('(min-width: 1920px) 2560px');
|
result.push("(min-width: 1920px) 2560px");
|
||||||
result.push('(min-width: 1280px) 1920px');
|
result.push("(min-width: 1280px) 1920px");
|
||||||
result.push('(min-width: 720px) 1280px');
|
result.push("(min-width: 720px) 1280px");
|
||||||
result.push('(min-width: 500px) 720px');
|
result.push("(min-width: 500px) 720px");
|
||||||
result.push('(min-width: 320px) 500px');
|
result.push("(min-width: 320px) 500px");
|
||||||
result.push('320px');
|
result.push("320px");
|
||||||
|
|
||||||
return result.join(', ');
|
return result.join(", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
hasLocation() {
|
hasLocation() {
|
||||||
|
@ -96,10 +96,10 @@ class Photo extends Abstract {
|
||||||
} else if (this.CountryName) {
|
} else if (this.CountryName) {
|
||||||
location.push(this.CountryName);
|
location.push(this.CountryName);
|
||||||
} else {
|
} else {
|
||||||
location.push('Unknown');
|
location.push("Unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
return location.join(', ');
|
return location.join(", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
getFullLocation() {
|
getFullLocation() {
|
||||||
|
@ -132,10 +132,10 @@ class Photo extends Abstract {
|
||||||
} else if (this.CountryName) {
|
} else if (this.CountryName) {
|
||||||
location.push(this.CountryName);
|
location.push(this.CountryName);
|
||||||
} else {
|
} else {
|
||||||
location.push('Unknown');
|
location.push("Unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
return location.join(', ');
|
return location.join(", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
getCamera() {
|
getCamera() {
|
||||||
|
@ -143,23 +143,23 @@ class Photo extends Abstract {
|
||||||
return this.CameraModel;
|
return this.CameraModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'Unknown';
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
like(liked) {
|
like(liked) {
|
||||||
if (liked === true) {
|
if (liked === true) {
|
||||||
return Api.post(this.getEntityResource() + '/like');
|
return Api.post(this.getEntityResource() + "/like");
|
||||||
} else {
|
} else {
|
||||||
return Api.delete(this.getEntityResource() + '/like');
|
return Api.delete(this.getEntityResource() + "/like");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCollectionResource() {
|
static getCollectionResource() {
|
||||||
return 'photos';
|
return "photos";
|
||||||
}
|
}
|
||||||
|
|
||||||
static getModelName() {
|
static getModelName() {
|
||||||
return 'Photo';
|
return "Photo";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import Abstract from 'model/abstract';
|
import Abstract from "model/abstract";
|
||||||
import Form from 'common/form';
|
import Form from "common/form";
|
||||||
import Api from 'common/api';
|
import Api from "common/api";
|
||||||
|
|
||||||
class User extends Abstract {
|
class User extends Abstract {
|
||||||
getEntityName() {
|
getEntityName() {
|
||||||
return this.userFirstName + ' ' + this.userLastName;
|
return this.userFirstName + " " + this.userLastName;
|
||||||
}
|
}
|
||||||
|
|
||||||
getId() {
|
getId() {
|
||||||
|
@ -12,30 +12,30 @@ class User extends Abstract {
|
||||||
}
|
}
|
||||||
|
|
||||||
getRegisterForm() {
|
getRegisterForm() {
|
||||||
return Api.options(this.getEntityResource() + '/register').then(response => Promise.resolve(new Form(response.data)));
|
return Api.options(this.getEntityResource() + "/register").then(response => Promise.resolve(new Form(response.data)));
|
||||||
}
|
}
|
||||||
|
|
||||||
getProfileForm() {
|
getProfileForm() {
|
||||||
return Api.options(this.getEntityResource() + '/profile').then(response => Promise.resolve(new Form(response.data)));
|
return Api.options(this.getEntityResource() + "/profile").then(response => Promise.resolve(new Form(response.data)));
|
||||||
}
|
}
|
||||||
|
|
||||||
changePassword(oldPassword, newPassword) {
|
changePassword(oldPassword, newPassword) {
|
||||||
return Api.put(this.getEntityResource() + '/password', {
|
return Api.put(this.getEntityResource() + "/password", {
|
||||||
password: oldPassword,
|
password: oldPassword,
|
||||||
new_password: newPassword,
|
new_password: newPassword,
|
||||||
}).then((response) => Promise.resolve(response.data));
|
}).then((response) => Promise.resolve(response.data));
|
||||||
}
|
}
|
||||||
|
|
||||||
saveProfile() {
|
saveProfile() {
|
||||||
return Api.post(this.getEntityResource() + '/profile', this.getValues()).then((response) => Promise.resolve(this.setValues(response.data)));
|
return Api.post(this.getEntityResource() + "/profile", this.getValues()).then((response) => Promise.resolve(this.setValues(response.data)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCollectionResource() {
|
static getCollectionResource() {
|
||||||
return 'users';
|
return "users";
|
||||||
}
|
}
|
||||||
|
|
||||||
static getModelName() {
|
static getModelName() {
|
||||||
return 'User';
|
return "User";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,46 +1,46 @@
|
||||||
const path = require('path');
|
const path = require("path");
|
||||||
|
|
||||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||||
|
|
||||||
const webpack = require('webpack');
|
const webpack = require("webpack");
|
||||||
|
|
||||||
const PATHS = {
|
const PATHS = {
|
||||||
app: path.join(__dirname, 'src/app.js'),
|
app: path.join(__dirname, "src/app.js"),
|
||||||
css: path.join(__dirname, 'css'),
|
css: path.join(__dirname, "css"),
|
||||||
build: path.join(__dirname, '../assets/server/public/build'),
|
build: path.join(__dirname, "../assets/server/public/build"),
|
||||||
};
|
};
|
||||||
|
|
||||||
const isDev = process.env.NODE_ENV !== 'production';
|
const isDev = process.env.NODE_ENV !== "production";
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
mode: 'production',
|
mode: "production",
|
||||||
devtool: isDev ? 'inline-source-map' : false,
|
devtool: isDev ? "inline-source-map" : false,
|
||||||
entry: {
|
entry: {
|
||||||
app: PATHS.app,
|
app: PATHS.app,
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
path: PATHS.build,
|
path: PATHS.build,
|
||||||
filename: '[name].js',
|
filename: "[name].js",
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
modules: [
|
modules: [
|
||||||
path.join(__dirname, 'src'),
|
path.join(__dirname, "src"),
|
||||||
path.join(__dirname, 'node_modules'),
|
path.join(__dirname, "node_modules"),
|
||||||
],
|
],
|
||||||
alias: {
|
alias: {
|
||||||
vue: 'vue/dist/vue.js',
|
vue: "vue/dist/vue.js",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new MiniCssExtractPlugin({
|
new MiniCssExtractPlugin({
|
||||||
filename: '[name].css',
|
filename: "[name].css",
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
node: {
|
node: {
|
||||||
fs: 'empty',
|
fs: "empty",
|
||||||
},
|
},
|
||||||
performance: {
|
performance: {
|
||||||
hints: 'warning',
|
hints: "warning",
|
||||||
maxEntrypointSize: 1512000,
|
maxEntrypointSize: 1512000,
|
||||||
maxAssetSize: 1512000,
|
maxAssetSize: 1512000,
|
||||||
},
|
},
|
||||||
|
@ -50,30 +50,30 @@ const config = {
|
||||||
test: /\.js$/,
|
test: /\.js$/,
|
||||||
include: PATHS.app,
|
include: PATHS.app,
|
||||||
exclude: /node_modules/,
|
exclude: /node_modules/,
|
||||||
enforce: 'pre',
|
enforce: "pre",
|
||||||
loader: 'eslint-loader',
|
loader: "eslint-loader",
|
||||||
options: {
|
options: {
|
||||||
formatter: require('eslint-formatter-pretty'),
|
formatter: require("eslint-formatter-pretty"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.vue$/,
|
test: /\.vue$/,
|
||||||
loader: 'vue-loader',
|
loader: "vue-loader",
|
||||||
options: {
|
options: {
|
||||||
loaders: {
|
loaders: {
|
||||||
js: 'babel-loader',
|
js: "babel-loader",
|
||||||
css: 'css-loader',
|
css: "css-loader",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.js$/,
|
test: /\.js$/,
|
||||||
loader: 'babel-loader',
|
loader: "babel-loader",
|
||||||
exclude: file => (
|
exclude: file => (
|
||||||
/node_modules/.test(file)
|
/node_modules/.test(file)
|
||||||
),
|
),
|
||||||
query: {
|
query: {
|
||||||
presets: ['@babel/preset-env'],
|
presets: ["@babel/preset-env"],
|
||||||
compact: false,
|
compact: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -86,101 +86,101 @@ const config = {
|
||||||
loader: MiniCssExtractPlugin.loader,
|
loader: MiniCssExtractPlugin.loader,
|
||||||
options: {
|
options: {
|
||||||
hmr: false,
|
hmr: false,
|
||||||
fallback: 'vue-style-loader',
|
fallback: "vue-style-loader",
|
||||||
use: [
|
use: [
|
||||||
// "vue-style-loader",
|
// "vue-style-loader",
|
||||||
'style-loader',
|
"style-loader",
|
||||||
{
|
{
|
||||||
loader: 'css-loader',
|
loader: "css-loader",
|
||||||
options: {
|
options: {
|
||||||
importLoaders: 1,
|
importLoaders: 1,
|
||||||
sourceMap: isDev,
|
sourceMap: isDev,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
loader: 'postcss-loader',
|
loader: "postcss-loader",
|
||||||
options: {
|
options: {
|
||||||
sourceMap: isDev,
|
sourceMap: isDev,
|
||||||
config: {
|
config: {
|
||||||
path: path.resolve(__dirname, './postcss.config.js'),
|
path: path.resolve(__dirname, "./postcss.config.js"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'resolve-url-loader',
|
"resolve-url-loader",
|
||||||
],
|
],
|
||||||
publicPath: PATHS.build,
|
publicPath: PATHS.build,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'css-loader',
|
"css-loader",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.css$/,
|
test: /\.css$/,
|
||||||
include: /node_modules/,
|
include: /node_modules/,
|
||||||
loaders: [
|
loaders: [
|
||||||
'vue-style-loader',
|
"vue-style-loader",
|
||||||
'style-loader',
|
"style-loader",
|
||||||
{
|
{
|
||||||
loader: 'css-loader',
|
loader: "css-loader",
|
||||||
options: { importLoaders: 1, sourceMap: isDev },
|
options: { importLoaders: 1, sourceMap: isDev },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
loader: 'postcss-loader',
|
loader: "postcss-loader",
|
||||||
options: {
|
options: {
|
||||||
sourceMap: isDev,
|
sourceMap: isDev,
|
||||||
config: {
|
config: {
|
||||||
path: path.resolve(__dirname, './postcss.config.js'),
|
path: path.resolve(__dirname, "./postcss.config.js"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'resolve-url-loader',
|
"resolve-url-loader",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.s[c|a]ss$/,
|
test: /\.s[c|a]ss$/,
|
||||||
use: [
|
use: [
|
||||||
'vue-style-loader',
|
"vue-style-loader",
|
||||||
'style-loader',
|
"style-loader",
|
||||||
{
|
{
|
||||||
loader: 'css-loader',
|
loader: "css-loader",
|
||||||
options: { importLoaders: 2, sourceMap: isDev },
|
options: { importLoaders: 2, sourceMap: isDev },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
loader: 'postcss-loader',
|
loader: "postcss-loader",
|
||||||
options: {
|
options: {
|
||||||
sourceMap: isDev,
|
sourceMap: isDev,
|
||||||
config: {
|
config: {
|
||||||
path: path.resolve(__dirname, './postcss.config.js'),
|
path: path.resolve(__dirname, "./postcss.config.js"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'resolve-url-loader',
|
"resolve-url-loader",
|
||||||
'sass-loader',
|
"sass-loader",
|
||||||
],
|
],
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.(png|jpg|jpeg|gif)$/,
|
test: /\.(png|jpg|jpeg|gif)$/,
|
||||||
loader: 'file-loader',
|
loader: "file-loader",
|
||||||
options: {
|
options: {
|
||||||
name: '[hash].[ext]',
|
name: "[hash].[ext]",
|
||||||
publicPath: '/assets/build/img',
|
publicPath: "/assets/build/img",
|
||||||
outputPath: 'img',
|
outputPath: "img",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
|
test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
|
||||||
loader: 'file-loader',
|
loader: "file-loader",
|
||||||
options: {
|
options: {
|
||||||
name: '[hash].[ext]',
|
name: "[hash].[ext]",
|
||||||
publicPath: '/assets/build/fonts',
|
publicPath: "/assets/build/fonts",
|
||||||
outputPath: 'fonts',
|
outputPath: "fonts",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.svg/,
|
test: /\.svg/,
|
||||||
use: {
|
use: {
|
||||||
loader: 'svg-url-loader',
|
loader: "svg-url-loader",
|
||||||
options: {},
|
options: {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -191,7 +191,7 @@ const config = {
|
||||||
// No sourcemap for production
|
// No sourcemap for production
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
const devToolPlugin = new webpack.SourceMapDevToolPlugin({
|
const devToolPlugin = new webpack.SourceMapDevToolPlugin({
|
||||||
filename: '[name].map',
|
filename: "[name].map",
|
||||||
});
|
});
|
||||||
|
|
||||||
config.plugins.push(devToolPlugin);
|
config.plugins.push(devToolPlugin);
|
||||||
|
|
Loading…
Reference in a new issue