Reaches Meteor 2.3 building + running against Mongo 3.2, REST smoke test
byte-identical to the 1.6.1.1 baseline (all 12 Flutter endpoints green).
Dead/abandoned Atmosphere packages removed or replaced (the upgrade blockers):
- arkham:comments-ui (no Meteor 2.x build; pinned accounts-password@1.x):
reimplemented the fire-page comments as a React feature:
imports/api/Comments/ (collection, server methods, publication, media
analyzers, new-fire-comment email) + imports/ui/components/Comments/CommentsBox.
Comment text now rendered as safe plain text + image/youtube embed (was
markdown-to-HTML). Wired into Fires.js; sitemaps.js + migration v11 updated
to the new collection. Old Blaze/startup comments files deleted.
- nimble:restivus (REST API; pinned accounts-password@1.3.3, CoffeeScript source
that crashes this build host): vendored as a local package
packages/nimble-restivus with the .coffee precompiled to plain JS and the
accounts-password constraint loosened to 2.x. REST behavior unchanged
(verified by smoke test). This also dropped the entire iron:router stack.
- maximum:server-transform (+ peerlibrary:*, meteorhacks:zones/inject-initial):
unused; removal broke Meteor.publishTransformed in FalsePositives publications
-> replaced with plain Meteor.publish (no transform was configured).
- less, markdown (no source files), and the dead test stack
(meteortesting:mocha, practicalmeteor:chai, xolvio:cleaner) which transitively
pulled coffeescript@1.0.17 — the build plugin that crashed meteor-tool
(node_contextify assertion) on this machine. Removing it unblocked the build.
- fourseven:scss 4.5.4 -> 4.14.1 (node-sass 4.5.3 doesn't build on node 12).
npm-mongo driver at 2.3 is 3.9.x — still compatible with the production Mongo
3.2 replica set.
44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
/*
|
|
* Media analyzers ported from the old arkham:comments-ui package
|
|
* (lib/services/media-analyzers). Given a comment's text, detect an embeddable
|
|
* image or YouTube URL and return { type, content }. First match wins.
|
|
*/
|
|
|
|
const imageAnalyzer = {
|
|
name: 'image',
|
|
getMediaFromContent(content) {
|
|
if (content) {
|
|
const urls = content.match(/(\S+\.[^/\s]+(\/\S+|\/|))(.jpg|.png|.gif)/g);
|
|
if (urls && urls[0]) return urls[0];
|
|
}
|
|
return '';
|
|
}
|
|
};
|
|
|
|
const youtubeAnalyzer = {
|
|
name: 'youtube',
|
|
getMediaFromContent(content) {
|
|
const parts = (content || '').match(/(?:https?:\/\/)?(?:www\.youtube\.com|youtu\.?be)\/([\w=?]+)/);
|
|
let mediaContent = '';
|
|
if (parts && parts[1]) {
|
|
let id = parts[1];
|
|
if (id.indexOf('v=') > -1) {
|
|
const subParts = id.match(/v=([\w]+)/);
|
|
if (subParts && subParts[1]) id = subParts[1];
|
|
}
|
|
mediaContent = `https://www.youtube.com/embed/${id}`;
|
|
}
|
|
return mediaContent;
|
|
}
|
|
};
|
|
|
|
const analyzers = [imageAnalyzer, youtubeAnalyzer];
|
|
|
|
// Returns { type, content } or {}.
|
|
export default function getMediaFromContent(content) {
|
|
for (let i = 0; i < analyzers.length; i += 1) {
|
|
const mediaContent = analyzers[i].getMediaFromContent(content);
|
|
if (mediaContent) return { type: analyzers[i].name, content: mediaContent };
|
|
}
|
|
return {};
|
|
}
|