openvibers/openvibe.coupons Commits
Companion page: review sites' ratings (Companion 0.5.0 brings what Glassdoor, Yelp, the BBB and others show to OpenVibe.Reviews), and what it reads for that (#75)
Changes
@@@ -163,6 +163,7 @@ function createPublicRoutes(ctx) {{ icon: 'ov:check', title: 'Try these codes on this page', text: 'At checkout, one button types the codes into the shop\'s own coupon box, presses Apply and reads the total before and after. Codes reported not working are skipped; at most ten are tried.' },{ icon: 'ov:food', title: 'Compare delivery apps', text: 'On DoorDash, Uber Eats, Grubhub, Seamless, Caviar or Instacart it opens the same restaurant on every app through OpenVibe.Food.', href: 'https://openvibe.food/delivery' },{ icon: 'ov:rent', title: 'Rentals: keep them, check the rent', text: 'On Craigslist, Zillow and other listing sites, one click keeps the listing on your OpenVibe.Rent board, and another checks its rent against what the city usually costs.', href: 'https://openvibe.rent/in' },++ { icon: 'ov:reviews', title: 'Review sites: bring the rating', text: 'On Glassdoor, Indeed, Yelp, the BBB, Trustpilot, Google Maps or Tripadvisor, one click reads the rating the page shows and opens OpenVibe.Reviews to check and save it, beside that site\'s link.', href: 'https://openvibe.reviews' },{ icon: 'ov:watch', title: 'Watch a page', text: 'Opens a watch on OpenVibe.Watch for the page, so you hear when a price, a stock line or a listing changes.', href: 'https://openvibe.watch' },{ icon: 'ov:shield', title: 'No referral games', text: 'It never replaces affiliate tags, never adds its own, never opens tabs behind your back and never earns from your shopping.' },],@@@ -171,7 +172,7 @@ function createPublicRoutes(ctx) {router.get('/companion', (req, res) => {send(req, res, 200, {title: 'The OpenVibe Companion browser extension', decision: pageDecision('/companion'), canonical: `${config.baseUrl}/companion`,-- description: 'A free, open-source extension for Chrome, Edge, Brave and Firefox: coupon codes for the shop you are on, tried when you ask, delivery apps compared and rentals kept on your board. It never rewrites referral links.',++ description: 'A free, open-source extension for Chrome, Edge, Brave and Firefox: coupon codes for the shop you are on, tried when you ask, delivery apps compared, rentals kept on your board and review sites’ ratings brought to OpenVibe.Reviews. It never rewrites referral links.',styles: [showcase.STYLESHEET],body: companionShowcase() + pages.companion(),}, { cacheable: true });@@@ -270,7 +270,7 @@ function companion() {<ul><li><strong>Permissions:</strong> the active tab (only after you click it), running its own code there when you press a button, and its own storage. It has no access to other tabs, your history or cookies, and no background process.</li><li><strong>Sent to OpenVibe.Coupons:</strong> the tab's hostname when you open it (for example <code>shop.example</code>), and a worked or did not work report when you have connected it and say so.</li>--<li><strong>Read from the page:</strong> the tab's address and title when you open it; the checkout page's coupon box, Apply button and total only when you press “Try these codes on this page”. Nothing read from the page leaves your browser.</li>++<li><strong>Read from the page:</strong> the tab's address and title when you open it; the checkout page's coupon box, Apply button and total only when you press “Try these codes on this page”; a review site's rating only when you press “Save its rating to OpenVibe Reviews”, which opens openvibe.reviews with it in a tab you see. Nothing else read from the page leaves your browser.</li><li><strong>Stored:</strong> only the optional connection token, on that device.</li></ul><h2 id="install">Install it</h2>@@@ -165,7 +165,7 @@ const { boot, check, done } = require('./helpers/boot');assert.ok(cp.text.includes('class="sc-hero') && /<h1[^>]*>The OpenVibe[\s\S]{0,80}Companion/.test(cp.text), 'the page opens with its showcase');assert.strictEqual((cp.text.match(/<h1[\s>]/g) || []).length, 1, 'one h1');assert.ok(cp.text.includes('https://github.com/OpenVibers/OpenVibe.Extensions/releases/latest') && cp.text.includes('chrome://extensions') && cp.text.includes('about:debugging'), 'how to install it');-- assert.ok(cp.text.includes('https://openvibe.rent/in') && cp.text.includes('checks its rent') && cp.text.includes('https://openvibe.food/delivery'), 'what it does across sites');++ assert.ok(cp.text.includes('https://openvibe.rent/in') && cp.text.includes('checks its rent') && cp.text.includes('https://openvibe.food/delivery') && cp.text.includes('https://openvibe.reviews') && cp.text.includes('Review sites: bring the rating'), 'what it does across sites');assert.match(cp.text, /<link rel="canonical" href="[^"]*\/companion">/);assert.doesNotMatch(cp.text, /noindex/, 'indexable');});
@@ -163,6 +163,7 @@ function createPublicRoutes(ctx) {
@@ -163,6 +163,7 @@ function createPublicRoutes(ctx) {
{ icon: 'ov:check', title: 'Try these codes on this page', text: 'At checkout, one button types the codes into the shop\'s own coupon box, presses Apply and reads the total before and after. Codes reported not working are skipped; at most ten are tried.' },
{ icon: 'ov:check', title: 'Try these codes on this page', text: 'At checkout, one button types the codes into the shop\'s own coupon box, presses Apply and reads the total before and after. Codes reported not working are skipped; at most ten are tried.' },
{ icon: 'ov:food', title: 'Compare delivery apps', text: 'On DoorDash, Uber Eats, Grubhub, Seamless, Caviar or Instacart it opens the same restaurant on every app through OpenVibe.Food.', href: 'https://openvibe.food/delivery' },
{ icon: 'ov:food', title: 'Compare delivery apps', text: 'On DoorDash, Uber Eats, Grubhub, Seamless, Caviar or Instacart it opens the same restaurant on every app through OpenVibe.Food.', href: 'https://openvibe.food/delivery' },
{ icon: 'ov:rent', title: 'Rentals: keep them, check the rent', text: 'On Craigslist, Zillow and other listing sites, one click keeps the listing on your OpenVibe.Rent board, and another checks its rent against what the city usually costs.', href: 'https://openvibe.rent/in' },
{ icon: 'ov:rent', title: 'Rentals: keep them, check the rent', text: 'On Craigslist, Zillow and other listing sites, one click keeps the listing on your OpenVibe.Rent board, and another checks its rent against what the city usually costs.', href: 'https://openvibe.rent/in' },
+ { icon: 'ov:reviews', title: 'Review sites: bring the rating', text: 'On Glassdoor, Indeed, Yelp, the BBB, Trustpilot, Google Maps or Tripadvisor, one click reads the rating the page shows and opens OpenVibe.Reviews to check and save it, beside that site\'s link.', href: 'https://openvibe.reviews' },
{ icon: 'ov:watch', title: 'Watch a page', text: 'Opens a watch on OpenVibe.Watch for the page, so you hear when a price, a stock line or a listing changes.', href: 'https://openvibe.watch' },
{ icon: 'ov:watch', title: 'Watch a page', text: 'Opens a watch on OpenVibe.Watch for the page, so you hear when a price, a stock line or a listing changes.', href: 'https://openvibe.watch' },
{ icon: 'ov:shield', title: 'No referral games', text: 'It never replaces affiliate tags, never adds its own, never opens tabs behind your back and never earns from your shopping.' },
{ icon: 'ov:shield', title: 'No referral games', text: 'It never replaces affiliate tags, never adds its own, never opens tabs behind your back and never earns from your shopping.' },
],
],
@@ -171,7 +172,7 @@ function createPublicRoutes(ctx) {
@@ -171,7 +172,7 @@ function createPublicRoutes(ctx) {
router.get('/companion', (req, res) => {
router.get('/companion', (req, res) => {
send(req, res, 200, {
send(req, res, 200, {
title: 'The OpenVibe Companion browser extension', decision: pageDecision('/companion'), canonical: `${config.baseUrl}/companion`,
title: 'The OpenVibe Companion browser extension', decision: pageDecision('/companion'), canonical: `${config.baseUrl}/companion`,
- description: 'A free, open-source extension for Chrome, Edge, Brave and Firefox: coupon codes for the shop you are on, tried when you ask, delivery apps compared and rentals kept on your board. It never rewrites referral links.',
+ description: 'A free, open-source extension for Chrome, Edge, Brave and Firefox: coupon codes for the shop you are on, tried when you ask, delivery apps compared, rentals kept on your board and review sites’ ratings brought to OpenVibe.Reviews. It never rewrites referral links.',
styles: [showcase.STYLESHEET],
styles: [showcase.STYLESHEET],
body: companionShowcase() + pages.companion(),
body: companionShowcase() + pages.companion(),
}, { cacheable: true });
}, { cacheable: true });
@@ -270,7 +270,7 @@ function companion() {
@@ -270,7 +270,7 @@ function companion() {
<ul>
<ul>
<li><strong>Permissions:</strong> the active tab (only after you click it), running its own code there when you press a button, and its own storage. It has no access to other tabs, your history or cookies, and no background process.</li>
<li><strong>Permissions:</strong> the active tab (only after you click it), running its own code there when you press a button, and its own storage. It has no access to other tabs, your history or cookies, and no background process.</li>
<li><strong>Sent to OpenVibe.Coupons:</strong> the tab's hostname when you open it (for example <code>shop.example</code>), and a worked or did not work report when you have connected it and say so.</li>
<li><strong>Sent to OpenVibe.Coupons:</strong> the tab's hostname when you open it (for example <code>shop.example</code>), and a worked or did not work report when you have connected it and say so.</li>
-<li><strong>Read from the page:</strong> the tab's address and title when you open it; the checkout page's coupon box, Apply button and total only when you press “Try these codes on this page”. Nothing read from the page leaves your browser.</li>
+<li><strong>Read from the page:</strong> the tab's address and title when you open it; the checkout page's coupon box, Apply button and total only when you press “Try these codes on this page”; a review site's rating only when you press “Save its rating to OpenVibe Reviews”, which opens openvibe.reviews with it in a tab you see. Nothing else read from the page leaves your browser.</li>
<li><strong>Stored:</strong> only the optional connection token, on that device.</li>
<li><strong>Stored:</strong> only the optional connection token, on that device.</li>
</ul>
</ul>
<h2 id="install">Install it</h2>
<h2 id="install">Install it</h2>
@@ -165,7 +165,7 @@ const { boot, check, done } = require('./helpers/boot');
@@ -165,7 +165,7 @@ const { boot, check, done } = require('./helpers/boot');
assert.ok(cp.text.includes('class="sc-hero') && /<h1[^>]*>The OpenVibe[\s\S]{0,80}Companion/.test(cp.text), 'the page opens with its showcase');
assert.ok(cp.text.includes('class="sc-hero') && /<h1[^>]*>The OpenVibe[\s\S]{0,80}Companion/.test(cp.text), 'the page opens with its showcase');
assert.strictEqual((cp.text.match(/<h1[\s>]/g) || []).length, 1, 'one h1');
assert.strictEqual((cp.text.match(/<h1[\s>]/g) || []).length, 1, 'one h1');
assert.ok(cp.text.includes('https://github.com/OpenVibers/OpenVibe.Extensions/releases/latest') && cp.text.includes('chrome://extensions') && cp.text.includes('about:debugging'), 'how to install it');
assert.ok(cp.text.includes('https://github.com/OpenVibers/OpenVibe.Extensions/releases/latest') && cp.text.includes('chrome://extensions') && cp.text.includes('about:debugging'), 'how to install it');
- assert.ok(cp.text.includes('https://openvibe.rent/in') && cp.text.includes('checks its rent') && cp.text.includes('https://openvibe.food/delivery'), 'what it does across sites');
+ assert.ok(cp.text.includes('https://openvibe.rent/in') && cp.text.includes('checks its rent') && cp.text.includes('https://openvibe.food/delivery') && cp.text.includes('https://openvibe.reviews') && cp.text.includes('Review sites: bring the rating'), 'what it does across sites');
assert.match(cp.text, /<link rel="canonical" href="[^"]*\/companion">/);
assert.match(cp.text, /<link rel="canonical" href="[^"]*\/companion">/);
assert.doesNotMatch(cp.text, /noindex/, 'indexable');
assert.doesNotMatch(cp.text, /noindex/, 'indexable');
});
});