Merge branch 'webpack-assets' into 'develop'
Webpack: move to asset modules, refactor See merge request soapbox-pub/soapbox-fe!738
This commit is contained in:
commit
32dc0d863f
|
@ -2,6 +2,9 @@ import loadPolyfills from './soapbox/load_polyfills';
|
||||||
|
|
||||||
require.context('./images/', true);
|
require.context('./images/', true);
|
||||||
|
|
||||||
|
// Load stylesheet
|
||||||
|
require('./styles/application.scss');
|
||||||
|
|
||||||
loadPolyfills().then(() => {
|
loadPolyfills().then(() => {
|
||||||
require('./soapbox/main').default();
|
require('./soapbox/main').default();
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
|
|
|
@ -20,7 +20,11 @@ exports[`<AutosuggestEmoji /> renders native emoji 1`] = `
|
||||||
<img
|
<img
|
||||||
alt="💙"
|
alt="💙"
|
||||||
className="emojione"
|
className="emojione"
|
||||||
src="/emoji/1f499.svg"
|
src={
|
||||||
|
Object {
|
||||||
|
"process": [Function],
|
||||||
|
}
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
:foobar:
|
:foobar:
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -15,7 +15,7 @@ exports[`<EmojiSelector /> renders correctly 1`] = `
|
||||||
className="emoji-react-selector__emoji"
|
className="emoji-react-selector__emoji"
|
||||||
dangerouslySetInnerHTML={
|
dangerouslySetInnerHTML={
|
||||||
Object {
|
Object {
|
||||||
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"👍\\" title=\\":+1:\\" src=\\"/emoji/1f44d.svg\\" />",
|
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"👍\\" title=\\":+1:\\" src=\\"[object Object]\\" />",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClick={[Function]}
|
onClick={[Function]}
|
||||||
|
@ -26,7 +26,7 @@ exports[`<EmojiSelector /> renders correctly 1`] = `
|
||||||
className="emoji-react-selector__emoji"
|
className="emoji-react-selector__emoji"
|
||||||
dangerouslySetInnerHTML={
|
dangerouslySetInnerHTML={
|
||||||
Object {
|
Object {
|
||||||
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"❤\\" title=\\":heart:\\" src=\\"/emoji/2764.svg\\" />",
|
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"❤\\" title=\\":heart:\\" src=\\"[object Object]\\" />",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClick={[Function]}
|
onClick={[Function]}
|
||||||
|
@ -37,7 +37,7 @@ exports[`<EmojiSelector /> renders correctly 1`] = `
|
||||||
className="emoji-react-selector__emoji"
|
className="emoji-react-selector__emoji"
|
||||||
dangerouslySetInnerHTML={
|
dangerouslySetInnerHTML={
|
||||||
Object {
|
Object {
|
||||||
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😆\\" title=\\":laughing:\\" src=\\"/emoji/1f606.svg\\" />",
|
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😆\\" title=\\":laughing:\\" src=\\"[object Object]\\" />",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClick={[Function]}
|
onClick={[Function]}
|
||||||
|
@ -48,7 +48,7 @@ exports[`<EmojiSelector /> renders correctly 1`] = `
|
||||||
className="emoji-react-selector__emoji"
|
className="emoji-react-selector__emoji"
|
||||||
dangerouslySetInnerHTML={
|
dangerouslySetInnerHTML={
|
||||||
Object {
|
Object {
|
||||||
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😮\\" title=\\":open_mouth:\\" src=\\"/emoji/1f62e.svg\\" />",
|
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😮\\" title=\\":open_mouth:\\" src=\\"[object Object]\\" />",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClick={[Function]}
|
onClick={[Function]}
|
||||||
|
@ -59,7 +59,7 @@ exports[`<EmojiSelector /> renders correctly 1`] = `
|
||||||
className="emoji-react-selector__emoji"
|
className="emoji-react-selector__emoji"
|
||||||
dangerouslySetInnerHTML={
|
dangerouslySetInnerHTML={
|
||||||
Object {
|
Object {
|
||||||
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😢\\" title=\\":cry:\\" src=\\"/emoji/1f622.svg\\" />",
|
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😢\\" title=\\":cry:\\" src=\\"[object Object]\\" />",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClick={[Function]}
|
onClick={[Function]}
|
||||||
|
@ -70,7 +70,7 @@ exports[`<EmojiSelector /> renders correctly 1`] = `
|
||||||
className="emoji-react-selector__emoji"
|
className="emoji-react-selector__emoji"
|
||||||
dangerouslySetInnerHTML={
|
dangerouslySetInnerHTML={
|
||||||
Object {
|
Object {
|
||||||
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😩\\" title=\\":weary:\\" src=\\"/emoji/1f629.svg\\" />",
|
"__html": "<img draggable=\\"false\\" class=\\"emojione\\" alt=\\"😩\\" title=\\":weary:\\" src=\\"[object Object]\\" />",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClick={[Function]}
|
onClick={[Function]}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import unicodeMapping from '../features/emoji/emoji_unicode_mapping_light';
|
import unicodeMapping from '../features/emoji/emoji_unicode_mapping_light';
|
||||||
import { join } from 'path';
|
|
||||||
import { FE_SUBDIRECTORY } from 'soapbox/build_config';
|
|
||||||
|
|
||||||
export default class AutosuggestEmoji extends React.PureComponent {
|
export default class AutosuggestEmoji extends React.PureComponent {
|
||||||
|
|
||||||
|
@ -23,7 +21,7 @@ export default class AutosuggestEmoji extends React.PureComponent {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
url = join(FE_SUBDIRECTORY, 'emoji', `${mapping.filename}.svg`);
|
url = require(`twemoji/assets/svg/${mapping.filename}.svg`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -7,8 +7,6 @@ import classNames from 'classnames';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { supportsPassiveEvents } from 'detect-passive-events';
|
import { supportsPassiveEvents } from 'detect-passive-events';
|
||||||
import { buildCustomEmojis } from '../../emoji/emoji';
|
import { buildCustomEmojis } from '../../emoji/emoji';
|
||||||
import { join } from 'path';
|
|
||||||
import { FE_SUBDIRECTORY } from 'soapbox/build_config';
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },
|
emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },
|
||||||
|
@ -29,7 +27,7 @@ const messages = defineMessages({
|
||||||
|
|
||||||
let EmojiPicker, Emoji; // load asynchronously
|
let EmojiPicker, Emoji; // load asynchronously
|
||||||
|
|
||||||
const backgroundImageFn = () => join(FE_SUBDIRECTORY, 'emoji', 'sheet_13.png');
|
const backgroundImageFn = () => require('emoji-datasource/img/twitter/sheets/32.png');
|
||||||
const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
|
const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
|
||||||
|
|
||||||
const categoriesSort = [
|
const categoriesSort = [
|
||||||
|
@ -358,8 +356,8 @@ class EmojiPickerDropdown extends React.PureComponent {
|
||||||
<div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>
|
<div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>
|
||||||
<img
|
<img
|
||||||
className={classNames('emojione', { 'pulse-loading': active && loading })}
|
className={classNames('emojione', { 'pulse-loading': active && loading })}
|
||||||
alt='🙂'
|
alt='😂'
|
||||||
src={join(FE_SUBDIRECTORY, 'emoji', '1f602.svg')}
|
src={require('twemoji/assets/svg/1f602.svg')}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,4 @@
|
||||||
// Does some trickery to import all the icons into the project
|
|
||||||
// See: https://stackoverflow.com/questions/42118296/dynamically-import-images-from-a-directory-using-webpack
|
|
||||||
|
|
||||||
const icons = {};
|
|
||||||
|
|
||||||
function importAll(r) {
|
|
||||||
const pathRegex = /\.\/(.*)\.svg/i;
|
|
||||||
|
|
||||||
r.keys().forEach((key) => {
|
|
||||||
const ticker = pathRegex.exec(key)[1];
|
|
||||||
return icons[ticker] = r(key).default;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
importAll(require.context('cryptocurrency-icons/svg/color/', true, /\.svg$/));
|
|
||||||
|
|
||||||
export default icons;
|
|
||||||
|
|
||||||
// For getting the icon
|
// For getting the icon
|
||||||
export const getCoinIcon = ticker => icons[ticker] || icons.generic || null;
|
export const getCoinIcon = ticker => {
|
||||||
|
return require(`cryptocurrency-icons/svg/color/${ticker.toLowerCase()}.svg`);
|
||||||
|
};
|
||||||
|
|
|
@ -22,23 +22,23 @@ describe('emoji', () => {
|
||||||
|
|
||||||
it('does unicode', () => {
|
it('does unicode', () => {
|
||||||
expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).toEqual(
|
expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).toEqual(
|
||||||
'<img draggable="false" class="emojione" alt="👩👩👦👦" title=":woman-woman-boy-boy:" src="/emoji/1f469-200d-1f469-200d-1f466-200d-1f466.svg" />');
|
'<img draggable="false" class="emojione" alt="👩👩👦👦" title=":woman-woman-boy-boy:" src="[object Object]" />');
|
||||||
expect(emojify('👨👩👧👧')).toEqual(
|
expect(emojify('👨👩👧👧')).toEqual(
|
||||||
'<img draggable="false" class="emojione" alt="👨👩👧👧" title=":man-woman-girl-girl:" src="/emoji/1f468-200d-1f469-200d-1f467-200d-1f467.svg" />');
|
'<img draggable="false" class="emojione" alt="👨👩👧👧" title=":man-woman-girl-girl:" src="[object Object]" />');
|
||||||
expect(emojify('👩👩👦')).toEqual('<img draggable="false" class="emojione" alt="👩👩👦" title=":woman-woman-boy:" src="/emoji/1f469-200d-1f469-200d-1f466.svg" />');
|
expect(emojify('👩👩👦')).toEqual('<img draggable="false" class="emojione" alt="👩👩👦" title=":woman-woman-boy:" src="[object Object]" />');
|
||||||
expect(emojify('\u2757')).toEqual(
|
expect(emojify('\u2757')).toEqual(
|
||||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg" />');
|
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="[object Object]" />');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does multiple unicode', () => {
|
it('does multiple unicode', () => {
|
||||||
expect(emojify('\u2757 #\uFE0F\u20E3')).toEqual(
|
expect(emojify('\u2757 #\uFE0F\u20E3')).toEqual(
|
||||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg" /> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg" />');
|
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="[object Object]" /> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="[object Object]" />');
|
||||||
expect(emojify('\u2757#\uFE0F\u20E3')).toEqual(
|
expect(emojify('\u2757#\uFE0F\u20E3')).toEqual(
|
||||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg" /><img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg" />');
|
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="[object Object]" /><img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="[object Object]" />');
|
||||||
expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).toEqual(
|
expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).toEqual(
|
||||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg" /> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg" /> <img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg" />');
|
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="[object Object]" /> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="[object Object]" /> <img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="[object Object]" />');
|
||||||
expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).toEqual(
|
expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).toEqual(
|
||||||
'foo <img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg" /> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg" /> bar');
|
'foo <img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="[object Object]" /> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="[object Object]" /> bar');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('ignores unicode inside of tags', () => {
|
it('ignores unicode inside of tags', () => {
|
||||||
|
@ -46,16 +46,16 @@ describe('emoji', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does multiple emoji properly (issue 5188)', () => {
|
it('does multiple emoji properly (issue 5188)', () => {
|
||||||
expect(emojify('👌🌈💕')).toEqual('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg" /><img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg" /><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg" />');
|
expect(emojify('👌🌈💕')).toEqual('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="[object Object]" /><img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="[object Object]" /><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="[object Object]" />');
|
||||||
expect(emojify('👌 🌈 💕')).toEqual('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg" /> <img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg" /> <img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg" />');
|
expect(emojify('👌 🌈 💕')).toEqual('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="[object Object]" /> <img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="[object Object]" /> <img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="[object Object]" />');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does an emoji that has no shortcode', () => {
|
it('does an emoji that has no shortcode', () => {
|
||||||
expect(emojify('👁🗨')).toEqual('<img draggable="false" class="emojione" alt="👁🗨" title="" src="/emoji/1f441-200d-1f5e8.svg" />');
|
expect(emojify('👁🗨')).toEqual('<img draggable="false" class="emojione" alt="👁🗨" title="" src="[object Object]" />');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does an emoji whose filename is irregular', () => {
|
it('does an emoji whose filename is irregular', () => {
|
||||||
expect(emojify('↙️')).toEqual('<img draggable="false" class="emojione" alt="↙️" title=":arrow_lower_left:" src="/emoji/2199.svg" />');
|
expect(emojify('↙️')).toEqual('<img draggable="false" class="emojione" alt="↙️" title=":arrow_lower_left:" src="[object Object]" />');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('avoid emojifying on invisible text', () => {
|
it('avoid emojifying on invisible text', () => {
|
||||||
|
@ -67,16 +67,16 @@ describe('emoji', () => {
|
||||||
|
|
||||||
it('avoid emojifying on invisible text with nested tags', () => {
|
it('avoid emojifying on invisible text with nested tags', () => {
|
||||||
expect(emojify('<span class="invisible">😄<span class="foo">bar</span>😴</span>😇'))
|
expect(emojify('<span class="invisible">😄<span class="foo">bar</span>😴</span>😇'))
|
||||||
.toEqual('<span class="invisible">😄<span class="foo">bar</span>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg" />');
|
.toEqual('<span class="invisible">😄<span class="foo">bar</span>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="[object Object]" />');
|
||||||
expect(emojify('<span class="invisible">😄<span class="invisible">😕</span>😴</span>😇'))
|
expect(emojify('<span class="invisible">😄<span class="invisible">😕</span>😴</span>😇'))
|
||||||
.toEqual('<span class="invisible">😄<span class="invisible">😕</span>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg" />');
|
.toEqual('<span class="invisible">😄<span class="invisible">😕</span>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="[object Object]" />');
|
||||||
expect(emojify('<span class="invisible">😄<br/>😴</span>😇'))
|
expect(emojify('<span class="invisible">😄<br/>😴</span>😇'))
|
||||||
.toEqual('<span class="invisible">😄<br/>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg" />');
|
.toEqual('<span class="invisible">😄<br/>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="[object Object]" />');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('skips the textual presentation VS15 character', () => {
|
it('skips the textual presentation VS15 character', () => {
|
||||||
expect(emojify('✴︎')) // This is U+2734 EIGHT POINTED BLACK STAR then U+FE0E VARIATION SELECTOR-15
|
expect(emojify('✴︎')) // This is U+2734 EIGHT POINTED BLACK STAR then U+FE0E VARIATION SELECTOR-15
|
||||||
.toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="/emoji/2734.svg" />');
|
.toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="[object Object]" />');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
import unicodeMapping from './emoji_unicode_mapping_light';
|
import unicodeMapping from './emoji_unicode_mapping_light';
|
||||||
import Trie from 'substring-trie';
|
import Trie from 'substring-trie';
|
||||||
import { join } from 'path';
|
|
||||||
import { FE_SUBDIRECTORY } from 'soapbox/build_config';
|
|
||||||
|
|
||||||
const trie = new Trie(Object.keys(unicodeMapping));
|
const trie = new Trie(Object.keys(unicodeMapping));
|
||||||
|
|
||||||
|
@ -62,7 +60,8 @@ const emojify = (str, customEmojis = {}, autoplay = false) => {
|
||||||
} else { // matched to unicode emoji
|
} else { // matched to unicode emoji
|
||||||
const { filename, shortCode } = unicodeMapping[match];
|
const { filename, shortCode } = unicodeMapping[match];
|
||||||
const title = shortCode ? `:${shortCode}:` : '';
|
const title = shortCode ? `:${shortCode}:` : '';
|
||||||
replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${join(FE_SUBDIRECTORY, 'emoji', `${filename}.svg`)}" />`;
|
const src = require(`twemoji/assets/svg/${filename}.svg`);
|
||||||
|
replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${src}" />`;
|
||||||
rend = i + match.length;
|
rend = i + match.length;
|
||||||
// If the matched character was followed by VS15 (for selecting text presentation), skip it.
|
// If the matched character was followed by VS15 (for selecting text presentation), skip it.
|
||||||
if (str.codePointAt(rend) === 65038) {
|
if (str.codePointAt(rend) === 65038) {
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import { join } from 'path';
|
|
||||||
import { FE_SUBDIRECTORY } from 'soapbox/build_config';
|
|
||||||
|
|
||||||
const createAudio = sources => {
|
const createAudio = sources => {
|
||||||
const audio = new Audio();
|
const audio = new Audio();
|
||||||
sources.forEach(({ type, src }) => {
|
sources.forEach(({ type, src }) => {
|
||||||
|
@ -31,21 +28,21 @@ export default function soundsMiddleware() {
|
||||||
const soundCache = {
|
const soundCache = {
|
||||||
boop: createAudio([
|
boop: createAudio([
|
||||||
{
|
{
|
||||||
src: join(FE_SUBDIRECTORY, '/sounds/boop.ogg'),
|
src: require('../../sounds/boop.ogg'),
|
||||||
type: 'audio/ogg',
|
type: 'audio/ogg',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: join(FE_SUBDIRECTORY, '/sounds/boop.mp3'),
|
src: require('../../sounds/boop.mp3'),
|
||||||
type: 'audio/mpeg',
|
type: 'audio/mpeg',
|
||||||
},
|
},
|
||||||
]),
|
]),
|
||||||
chat: createAudio([
|
chat: createAudio([
|
||||||
{
|
{
|
||||||
src: join(FE_SUBDIRECTORY, '/sounds/chat.oga'),
|
src: require('../../sounds/chat.oga'),
|
||||||
type: 'audio/ogg',
|
type: 'audio/ogg',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: join(FE_SUBDIRECTORY, '/sounds/chat.mp3'),
|
src: require('../../sounds/chat.mp3'),
|
||||||
type: 'audio/mpeg',
|
type: 'audio/mpeg',
|
||||||
},
|
},
|
||||||
]),
|
]),
|
||||||
|
|
|
@ -31,4 +31,11 @@ module.exports = {
|
||||||
'<rootDir>/app',
|
'<rootDir>/app',
|
||||||
],
|
],
|
||||||
'testEnvironment': 'jsdom',
|
'testEnvironment': 'jsdom',
|
||||||
|
'moduleNameMapper': {
|
||||||
|
'^.+.(css|styl|less|sass|scss|png|jpg|svg|ttf|woff|woff2)$': 'jest-transform-stub',
|
||||||
|
},
|
||||||
|
'transform': {
|
||||||
|
'\\.[jt]sx?$': 'babel-jest',
|
||||||
|
'.+\\.(css|styl|less|sass|scss|png|jpg|svg|ttf|woff|woff2)$': 'jest-transform-stub',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -92,6 +92,7 @@
|
||||||
"intl-messageformat-parser": "^6.0.0",
|
"intl-messageformat-parser": "^6.0.0",
|
||||||
"intl-pluralrules": "^1.3.0",
|
"intl-pluralrules": "^1.3.0",
|
||||||
"is-nan": "^1.2.1",
|
"is-nan": "^1.2.1",
|
||||||
|
"jest-transform-stub": "^2.0.0",
|
||||||
"jsdoc": "~3.6.7",
|
"jsdoc": "~3.6.7",
|
||||||
"lodash": "^4.7.11",
|
"lodash": "^4.7.11",
|
||||||
"mark-loader": "^0.1.6",
|
"mark-loader": "^0.1.6",
|
||||||
|
|
|
@ -12,7 +12,6 @@ const settings = {
|
||||||
test_root_path: `${FE_BUILD_DIR}-test`,
|
test_root_path: `${FE_BUILD_DIR}-test`,
|
||||||
cache_path: 'tmp/cache',
|
cache_path: 'tmp/cache',
|
||||||
resolved_paths: [],
|
resolved_paths: [],
|
||||||
static_assets_extensions: [ '.jpg', '.jpeg', '.png', '.tiff', '.ico', '.svg', '.gif', '.eot', '.otf', '.ttf', '.woff', '.woff2', '.mp3', '.ogg', '.oga' ],
|
|
||||||
extensions: [ '.mjs', '.js', '.sass', '.scss', '.css', '.module.sass', '.module.scss', '.module.css', '.png', '.svg', '.gif', '.jpeg', '.jpg' ],
|
extensions: [ '.mjs', '.js', '.sass', '.scss', '.css', '.module.sass', '.module.scss', '.module.css', '.png', '.svg', '.gif', '.jpeg', '.jpg' ],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -25,37 +25,33 @@ module.exports = merge(sharedConfig, {
|
||||||
new OfflinePlugin({
|
new OfflinePlugin({
|
||||||
caches: {
|
caches: {
|
||||||
main: [':rest:'],
|
main: [':rest:'],
|
||||||
additional: [':externals:'],
|
additional: [
|
||||||
|
'packs/emoji/1f602-*.svg', // used for emoji picker dropdown
|
||||||
|
'packs/images/32-*.png', // used in emoji-mart
|
||||||
|
|
||||||
|
// Default emoji reacts
|
||||||
|
'packs/emoji/1f44d-*.svg', // Thumbs up
|
||||||
|
'packs/emoji/2764-*.svg', // Heart
|
||||||
|
'packs/emoji/1f606-*.svg', // Laughing
|
||||||
|
'packs/emoji/1f62e-*.svg', // Surprised
|
||||||
|
'packs/emoji/1f622-*.svg', // Crying
|
||||||
|
'packs/emoji/1f629-*.svg', // Weary
|
||||||
|
'packs/emoji/1f621-*.svg', // Angry (Spinster)
|
||||||
|
],
|
||||||
optional: [
|
optional: [
|
||||||
'**/locale_*.js', // don't fetch every locale; the user only needs one
|
'**/locale_*.js', // don't fetch every locale; the user only needs one
|
||||||
'**/*_polyfills-*.js', // the user may not need polyfills
|
'**/*_polyfills-*.js', // the user may not need polyfills
|
||||||
'**/*.chunk.js', // only cache chunks when needed
|
'**/*.chunk.js', // only cache chunks when needed
|
||||||
'**/*.woff2', // the user may have system-fonts enabled
|
'**/*.woff2', // the user may have system-fonts enabled
|
||||||
// images/audio can be cached on-demand
|
// images can be cached on-demand
|
||||||
'**/*.png',
|
'**/*.png',
|
||||||
'**/*.jpg',
|
|
||||||
'**/*.jpeg',
|
|
||||||
'**/*.svg',
|
'**/*.svg',
|
||||||
'**/*.mp3',
|
|
||||||
'**/*.ogg',
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
externals: [
|
|
||||||
'/emoji/1f602.svg', // used for emoji picker dropdown
|
|
||||||
'/emoji/sheet_13.png', // used in emoji-mart
|
|
||||||
|
|
||||||
// Default emoji reacts
|
|
||||||
'/emoji/1f44d.svg', // Thumbs up
|
|
||||||
'/emoji/2764.svg', // Heart
|
|
||||||
'/emoji/1f606.svg', // Laughing
|
|
||||||
'/emoji/1f62e.svg', // Surprised
|
|
||||||
'/emoji/1f622.svg', // Crying
|
|
||||||
'/emoji/1f629.svg', // Weary
|
|
||||||
'/emoji/1f621.svg', // Angry (Spinster)
|
|
||||||
],
|
|
||||||
excludes: [
|
excludes: [
|
||||||
'**/*.gz',
|
'**/*.gz',
|
||||||
'**/*.map',
|
'**/*.map',
|
||||||
|
'**/*.LICENSE.txt',
|
||||||
'stats.json',
|
'stats.json',
|
||||||
'report.html',
|
'report.html',
|
||||||
'instance/**/*',
|
'instance/**/*',
|
||||||
|
@ -66,15 +62,20 @@ module.exports = merge(sharedConfig, {
|
||||||
'**/*.woff',
|
'**/*.woff',
|
||||||
// Sounds return a 206 causing sw.js to crash
|
// Sounds return a 206 causing sw.js to crash
|
||||||
// https://stackoverflow.com/a/66335638
|
// https://stackoverflow.com/a/66335638
|
||||||
'sounds/**/*',
|
'**/*.ogg',
|
||||||
// Don't cache index.html
|
'**/*.oga',
|
||||||
|
'**/*.mp3',
|
||||||
|
// Don't serve index.html
|
||||||
|
// https://github.com/bromite/bromite/issues/1294
|
||||||
'index.html',
|
'index.html',
|
||||||
|
'404.html',
|
||||||
],
|
],
|
||||||
// ServiceWorker: {
|
// ServiceWorker: {
|
||||||
// entry: join(__dirname, '../app/soapbox/service_worker/entry.js'),
|
// entry: join(__dirname, '../app/soapbox/service_worker/entry.js'),
|
||||||
// cacheName: 'soapbox',
|
// cacheName: 'soapbox',
|
||||||
// minify: true,
|
// minify: true,
|
||||||
// },
|
// },
|
||||||
|
safeToUseOptionalCaches: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
// Asset modules
|
||||||
|
// https://webpack.js.org/guides/asset-modules/
|
||||||
|
|
||||||
|
const { resolve } = require('path');
|
||||||
|
|
||||||
|
// These are processed in reverse-order
|
||||||
|
// We use the name 'packs' instead of 'assets' for legacy reasons
|
||||||
|
module.exports = [{
|
||||||
|
test: /\.(png|svg)/,
|
||||||
|
type: 'asset/resource',
|
||||||
|
include: [
|
||||||
|
resolve('app', 'images'),
|
||||||
|
resolve('node_modules', 'emoji-datasource'),
|
||||||
|
],
|
||||||
|
generator: {
|
||||||
|
filename: 'packs/images/[name]-[contenthash:8][ext]',
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
test: /\.(ttf|eot|svg|woff|woff2)/,
|
||||||
|
type: 'asset/resource',
|
||||||
|
include: [
|
||||||
|
resolve('app', 'fonts'),
|
||||||
|
resolve('node_modules', 'fork-awesome'),
|
||||||
|
resolve('node_modules', '@fontsource'),
|
||||||
|
],
|
||||||
|
generator: {
|
||||||
|
filename: 'packs/fonts/[name]-[contenthash:8][ext]',
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
test: /\.(ogg|oga|mp3)/,
|
||||||
|
type: 'asset/resource',
|
||||||
|
include: resolve('app', 'sounds'),
|
||||||
|
generator: {
|
||||||
|
filename: 'packs/sounds/[name]-[contenthash:8][ext]',
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
test: /\.svg$/,
|
||||||
|
type: 'asset/resource',
|
||||||
|
include: resolve('node_modules', 'twemoji'),
|
||||||
|
generator: {
|
||||||
|
filename: 'packs/emoji/[name]-[contenthash:8][ext]',
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
test: /\.svg$/,
|
||||||
|
type: 'asset/resource',
|
||||||
|
include: resolve('node_modules', 'cryptocurrency-icons'),
|
||||||
|
generator: {
|
||||||
|
filename: 'packs/images/crypto/[name]-[contenthash:8][ext]',
|
||||||
|
},
|
||||||
|
}];
|
|
@ -1,20 +0,0 @@
|
||||||
const { join } = require('path');
|
|
||||||
const { settings } = require('../configuration');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
test: new RegExp(`(${settings.static_assets_extensions.join('|')})$`, 'i'),
|
|
||||||
use: [
|
|
||||||
{
|
|
||||||
loader: 'file-loader',
|
|
||||||
options: {
|
|
||||||
name(file) {
|
|
||||||
if (file.includes(settings.source_path)) {
|
|
||||||
return 'packs/media/[path][name]-[contenthash].[ext]';
|
|
||||||
}
|
|
||||||
return 'packs/media/[folder]/[name]-[contenthash:8].[ext]';
|
|
||||||
},
|
|
||||||
context: join(settings.source_path),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
|
@ -3,14 +3,14 @@ const git = require('./babel-git');
|
||||||
const gitRefresh = require('./git-refresh');
|
const gitRefresh = require('./git-refresh');
|
||||||
const buildConfig = require('./babel-build-config');
|
const buildConfig = require('./babel-build-config');
|
||||||
const css = require('./css');
|
const css = require('./css');
|
||||||
const file = require('./file');
|
const assets = require('./assets');
|
||||||
const nodeModules = require('./node_modules');
|
const nodeModules = require('./node_modules');
|
||||||
|
|
||||||
// Webpack loaders are processed in reverse order
|
// Webpack loaders are processed in reverse order
|
||||||
// https://webpack.js.org/concepts/loaders/#loader-features
|
// https://webpack.js.org/concepts/loaders/#loader-features
|
||||||
// Lastly, process static files using file loader
|
// Lastly, process static files using file loader
|
||||||
module.exports = [
|
module.exports = [
|
||||||
file,
|
...assets,
|
||||||
css,
|
css,
|
||||||
nodeModules,
|
nodeModules,
|
||||||
babel,
|
babel,
|
||||||
|
|
|
@ -30,10 +30,9 @@ const makeHtmlConfig = (params = {}) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
entry: Object.assign(
|
entry: {
|
||||||
{ application: resolve('app/application.js') },
|
application: resolve('app/application.js'),
|
||||||
{ styles: resolve(join(settings.source_path, 'styles/application.scss')) },
|
},
|
||||||
),
|
|
||||||
|
|
||||||
output: {
|
output: {
|
||||||
filename: 'packs/js/[name]-[chunkhash].js',
|
filename: 'packs/js/[name]-[chunkhash].js',
|
||||||
|
@ -65,7 +64,7 @@ module.exports = {
|
||||||
},
|
},
|
||||||
|
|
||||||
module: {
|
module: {
|
||||||
rules: Object.keys(rules).map(key => rules[key]),
|
rules,
|
||||||
},
|
},
|
||||||
|
|
||||||
plugins: [
|
plugins: [
|
||||||
|
@ -89,15 +88,6 @@ module.exports = {
|
||||||
new HtmlWebpackHarddiskPlugin(),
|
new HtmlWebpackHarddiskPlugin(),
|
||||||
new CopyPlugin({
|
new CopyPlugin({
|
||||||
patterns: [{
|
patterns: [{
|
||||||
from: join(__dirname, '../node_modules/twemoji/assets/svg'),
|
|
||||||
to: join(output.path, 'emoji'),
|
|
||||||
}, {
|
|
||||||
from: join(__dirname, '../node_modules/emoji-datasource/img/twitter/sheets/32.png'),
|
|
||||||
to: join(output.path, 'emoji/sheet_13.png'),
|
|
||||||
}, {
|
|
||||||
from: join(__dirname, '../app/sounds'),
|
|
||||||
to: join(output.path, 'sounds'),
|
|
||||||
}, {
|
|
||||||
from: join(__dirname, '../app/instance'),
|
from: join(__dirname, '../app/instance'),
|
||||||
to: join(output.path, 'instance'),
|
to: join(output.path, 'instance'),
|
||||||
}],
|
}],
|
||||||
|
|
|
@ -7239,6 +7239,11 @@ jest-snapshot@^27.1.0:
|
||||||
pretty-format "^27.1.0"
|
pretty-format "^27.1.0"
|
||||||
semver "^7.3.2"
|
semver "^7.3.2"
|
||||||
|
|
||||||
|
jest-transform-stub@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz#19018b0851f7568972147a5d60074b55f0225a7d"
|
||||||
|
integrity sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==
|
||||||
|
|
||||||
jest-util@^27.0.0:
|
jest-util@^27.0.0:
|
||||||
version "27.0.6"
|
version "27.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.6.tgz#e8e04eec159de2f4d5f57f795df9cdc091e50297"
|
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.6.tgz#e8e04eec159de2f4d5f57f795df9cdc091e50297"
|
||||||
|
|
Loading…
Reference in New Issue