diff --git a/packages/content-fetch/.dockerignore b/packages/content-fetch/.dockerignore new file mode 100644 index 000000000..77c017249 --- /dev/null +++ b/packages/content-fetch/.dockerignore @@ -0,0 +1,5 @@ +node_modules +.env* +Dockerfile +.dockerignore +*.yaml diff --git a/packages/content-fetch/Dockerfile b/packages/content-fetch/Dockerfile index b05320b08..1201c497d 100644 --- a/packages/content-fetch/Dockerfile +++ b/packages/content-fetch/Dockerfile @@ -23,12 +23,26 @@ WORKDIR /app ENV CHROMIUM_PATH /usr/bin/chromium-browser ENV LAUNCH_HEADLESS=true -COPY . /app/ -WORKDIR app +COPY package.json . +COPY yarn.lock . +COPY tsconfig.json . +COPY .prettierrc . +COPY .eslintrc . + +COPY /packages/content-handler/package.json ./packages/content-handler/package.json RUN yarn install --pure-lockfile +ADD /packages/content-fetch ./packages/content-fetch +ADD /packages/content-handler ./packages/content-handler +RUN yarn workspace @omnivore/content-handler build + +# After building, fetch the production dependencies +RUN rm -rf /app/packages/content-fetch/node_modules +RUN rm -rf /app/node_modules +RUN yarn install --pure-lockfile --production + EXPOSE 8080 -ENTRYPOINT ["yarn", "start"] +CMD ["yarn", "workspace", "@omnivore/content-fetch", "start"] diff --git a/packages/content-fetch/Dockerfile-local b/packages/content-fetch/Dockerfile-local index 383011f10..694ef1a08 100644 --- a/packages/content-fetch/Dockerfile-local +++ b/packages/content-fetch/Dockerfile-local @@ -33,10 +33,19 @@ COPY tsconfig.json . COPY .prettierrc . COPY .eslintrc . -COPY /packages/content-fetch ./packages/content-fetch +COPY /packages/content-handler/package.json ./packages/content-handler/package.json RUN yarn install --pure-lockfile +ADD /packages/content-fetch ./packages/content-fetch +ADD /packages/content-handler ./packages/content-handler +RUN yarn workspace @omnivore/content-handler build + +# After building, fetch the production dependencies +RUN rm -rf /app/packages/content-fetch/node_modules +RUN rm -rf /app/node_modules +RUN yarn install --pure-lockfile --production + EXPOSE 8080 CMD ["yarn", "workspace", "@omnivore/content-fetch", "start"] diff --git a/packages/content-fetch/fetch-content.js b/packages/content-fetch/fetch-content.js index 0c3118544..869de8aa2 100644 --- a/packages/content-fetch/fetch-content.js +++ b/packages/content-fetch/fetch-content.js @@ -100,7 +100,7 @@ const getBrowserPromise = (async () => { '--window-size=1920,1080', ].filter((item) => !!item), defaultViewport: { height: 1080, width: 1920 }, - executablePath: process.env.CHROMIUM_PATH , + executablePath: process.env.CHROMIUM_PATH, headless: !!process.env.LAUNCH_HEADLESS, timeout: 120000, // 2 minutes }); diff --git a/packages/content-fetch/package.json b/packages/content-fetch/package.json index 3df85a237..405f1a27c 100644 --- a/packages/content-fetch/package.json +++ b/packages/content-fetch/package.json @@ -4,6 +4,7 @@ "description": "Service that fetches page content from a URL", "main": "index.js", "dependencies": { + "@omnivore/content-handler": "1.0.0", "axios": "^0.27.2", "dotenv": "^8.2.0", "express": "^4.17.1", @@ -11,8 +12,7 @@ "linkedom": "^0.14.9", "luxon": "^2.3.1", "puppeteer-core": "^16.1.0", - "underscore": "^1.13.4", - "@omnivore/content-handler": "1.0.0" + "underscore": "^1.13.4" }, "scripts": { "start": "node app.js", diff --git a/packages/content-handler/package.json b/packages/content-handler/package.json index e4021b3e4..dc4edb4b1 100644 --- a/packages/content-handler/package.json +++ b/packages/content-handler/package.json @@ -15,6 +15,11 @@ "build": "tsc" }, "devDependencies": { + "@types/addressparser": "^1.0.1", + "@types/luxon": "^3.0.1", + "@types/rfc2047": "^2.0.1", + "@types/underscore": "^1.11.4", + "@types/uuid": "^8.3.4", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "chai-string": "^1.5.0", diff --git a/packages/content-handler/src/newsletters/substack-handler.ts b/packages/content-handler/src/newsletters/substack-handler.ts index 164068623..f66a85a52 100644 --- a/packages/content-handler/src/newsletters/substack-handler.ts +++ b/packages/content-handler/src/newsletters/substack-handler.ts @@ -40,7 +40,7 @@ export class SubstackHandler extends ContentHandler { findNewsletterHeaderHref(dom: Document): string | undefined { // Substack header links - const postLink = dom.querySelector('h1 a ') + const postLink = dom.querySelector('h1 a') if (postLink) { return postLink.getAttribute('href') || undefined } diff --git a/packages/content-handler/test/newsletter.test.ts b/packages/content-handler/test/newsletter.test.ts index dd3b7941c..90197b00d 100644 --- a/packages/content-handler/test/newsletter.test.ts +++ b/packages/content-handler/test/newsletter.test.ts @@ -21,6 +21,29 @@ const load = (path: string): string => { } describe('Newsletter email test', () => { + before(() => { + nock('https://email.mg2.substack.com') + .head( + '/c/eJxNkk2TojAQhn-N3KTyQfg4cGDGchdnYcsZx9K5UCE0EMVAkTiKv36iHnarupNUd7rfVJ4W3EDTj1M89No496Uw0wCxgovuwBgYnbOGsZBVjDHzKPWYU8VehUMWOlIX9Qhw4rKLzXgGZziXnRTcyF7dK0iIGMVOG_OS1aTmKPRDilgVhTQUPCQIcE0x-MFTmJ8rCUpA3KtuenR2urg1ZtAzmszI0tq_Z7m66y-ilQo0uAqMTQ7WRX8auJKg56blZg7WB-iHDuYEBzO6NP0R1IwuYFphQbbTjnTH9NBfs80nym4Zyj8uUvyKbtUyGr5eUz9fNDQ7JCxfJDo9dW1lY9lmj_JNivPbGmf2Pt_lN9tDit9b-WeTetni85Z9pDpVOd7L1E_Vy7egayNO23ZP34eSeLJeux1b0rer_xaZ7ykS78nuSjMY-nL98rparNZNcv07JCjN06_EkTFBxBqOUMACErnELUNMSxTUjLDQZwzcqa4bRjCfeejUEFefS224OLr2S5wxPtij7lVrs80d2CNseRV2P52VNFMBipcdVE-U5jkRD7hFAwpGOylVwU2Mfc9qBh7DoR89yVnWXhgQFHnIsbpVb6tU_B-hH_2yzWY' + ) + .reply(302, undefined, { + Location: + 'https://newsletter.slowchinese.net/p/companies-that-eat-people-217', + }) + .get('/p/companies-that-eat-people-217') + .reply(200, '') + + nock('https://u23463625.ct.sendgrid.net') + .head( + '/ss/c/AX1lEgEQaxtvFxLaVo0GBo_geajNrlI1TGeIcmMViR3pL3fEDZnbbkoeKcaY62QZk0KPFudUiUXc_uMLerV4nA/3k5/3TFZmreTR0qKSCgowABnVg/h30/zzLik7UXd1H_n4oyd5W8Xu639AYQQB2UXz-CsssSnno' + ) + .reply(302, undefined, { + Location: 'https://www.milkroad.com/p/talked-guy-spent-30m-beeple', + }) + .get('/p/talked-guy-spent-30m-beeple') + .reply(200, '') + }) + describe('#getNewsletterUrl()', () => { it('returns url when email is from SubStack', async () => { const rawUrl = '' @@ -140,16 +163,6 @@ describe('Newsletter email test', () => { describe('findNewsletterUrl', async () => { it('gets the URL from the header if it is a substack newsletter', async () => { - nock('https://email.mg2.substack.com') - .head( - '/c/eJxNkk2TojAQhn-N3KTyQfg4cGDGchdnYcsZx9K5UCE0EMVAkTiKv36iHnarupNUd7rfVJ4W3EDTj1M89No496Uw0wCxgovuwBgYnbOGsZBVjDHzKPWYU8VehUMWOlIX9Qhw4rKLzXgGZziXnRTcyF7dK0iIGMVOG_OS1aTmKPRDilgVhTQUPCQIcE0x-MFTmJ8rCUpA3KtuenR2urg1ZtAzmszI0tq_Z7m66y-ilQo0uAqMTQ7WRX8auJKg56blZg7WB-iHDuYEBzO6NP0R1IwuYFphQbbTjnTH9NBfs80nym4Zyj8uUvyKbtUyGr5eUz9fNDQ7JCxfJDo9dW1lY9lmj_JNivPbGmf2Pt_lN9tDit9b-WeTetni85Z9pDpVOd7L1E_Vy7egayNO23ZP34eSeLJeux1b0rer_xaZ7ykS78nuSjMY-nL98rparNZNcv07JCjN06_EkTFBxBqOUMACErnELUNMSxTUjLDQZwzcqa4bRjCfeejUEFefS224OLr2S5wxPtij7lVrs80d2CNseRV2P52VNFMBipcdVE-U5jkRD7hFAwpGOylVwU2Mfc9qBh7DoR89yVnWXhgQFHnIsbpVb6tU_B-hH_2yzWY' - ) - .reply(302, undefined, { - Location: - 'https://newsletter.slowchinese.net/p/companies-that-eat-people-217', - }) - .get('/p/companies-that-eat-people-217') - .reply(200, '') const html = load('./test/data/substack-forwarded-newsletter.html') const url = await new SubstackHandler().findNewsletterUrl(html) // Not sure if the redirects from substack expire, this test could eventually fail @@ -158,21 +171,12 @@ describe('Newsletter email test', () => { ) }).timeout(10000) it('gets the URL from the header if it is a beehiiv newsletter', async () => { - nock('https://u23463625.ct.sendgrid.net') - .head( - '/ss/c/AX1lEgEQaxtvFxLaVo0GBo_geajNrlI1TGeIcmMViR3pL3fEDZnbbkoeKcaY62QZk0KPFudUiUXc_uMLerV4nA/3k5/3TFZmreTR0qKSCgowABnVg/h30/zzLik7UXd1H_n4oyd5W8Xu639AYQQB2UXz-CsssSnno' - ) - .reply(302, undefined, { - Location: 'https://www.milkroad.com/p/talked-guy-spent-30m-beeple', - }) - .get('/p/talked-guy-spent-30m-beeple') - .reply(200, '') const html = load('./test/data/beehiiv-newsletter.html') const url = await new BeehiivHandler().findNewsletterUrl(html) expect(url).to.startWith( 'https://www.milkroad.com/p/talked-guy-spent-30m-beeple' ) - }) + }).timeout(10000) it('returns undefined if it is not a newsletter', async () => { const html = load('./test/data/substack-forwarded-welcome-email.html') const url = await new SubstackHandler().findNewsletterUrl(html) diff --git a/packages/inbound-email-handler/.dockerignore b/packages/inbound-email-handler/.dockerignore new file mode 100644 index 000000000..d8aea4ee6 --- /dev/null +++ b/packages/inbound-email-handler/.dockerignore @@ -0,0 +1,5 @@ +node_modules +build +.env* +Dockerfile +.dockerignore diff --git a/packages/inbound-email-handler/Dockerfile b/packages/inbound-email-handler/Dockerfile new file mode 100644 index 000000000..364c786bc --- /dev/null +++ b/packages/inbound-email-handler/Dockerfile @@ -0,0 +1,30 @@ +FROM node:14.18-alpine + +# Run everything after as non-privileged user. +WORKDIR /app + +COPY package.json . +COPY yarn.lock . +COPY tsconfig.json . +COPY .prettierrc . +COPY .eslintrc . + +COPY /packages/inbound-email-handler/package.json ./packages/inbound-email-handler/package.json +COPY /packages/content-handler/package.json ./packages/content-handler/package.json + +RUN yarn install --pure-lockfile + +ADD /packages/inbound-email-handler ./packages/inbound-email-handler +ADD /packages/content-handler ./packages/content-handler +RUN yarn workspace @omnivore/content-handler build +RUN yarn workspace @omnivore/inbound-email-handler build + +# After building, fetch the production dependencies +RUN rm -rf /app/packages/inbound-email-handler/node_modules +RUN rm -rf /app/node_modules +RUN yarn install --pure-lockfile --production + +EXPOSE 8080 + +CMD ["yarn", "workspace", "@omnivore/inbound-email-handler", "start"] + diff --git a/packages/inbound-email-handler/package.json b/packages/inbound-email-handler/package.json index ed22a170c..9f0ab5f32 100644 --- a/packages/inbound-email-handler/package.json +++ b/packages/inbound-email-handler/package.json @@ -24,14 +24,16 @@ "@types/json-bigint": "^1.0.1", "@types/node": "^14.11.2", "@types/rfc2047": "^2.0.1", - "eslint-plugin-prettier": "^4.0.0" + "chai": "^4.3.6", + "eslint-plugin-prettier": "^4.0.0", + "mocha": "^10.0.0" }, "dependencies": { "@google-cloud/functions-framework": "3.1.2", "@google-cloud/pubsub": "^2.18.4", + "@omnivore/content-handler": "1.0.0", "@sendgrid/client": "^7.6.0", "@sentry/serverless": "^6.16.1", - "@omnivore/content-handler": "1.0.0", "addressparser": "^1.0.1", "axios": "^0.27.2", "jsonwebtoken": "^8.5.1", diff --git a/packages/inbound-email-handler/test/newsletter.test.ts b/packages/inbound-email-handler/test/newsletter.test.ts index 253c294ab..369cf9ab5 100644 --- a/packages/inbound-email-handler/test/newsletter.test.ts +++ b/packages/inbound-email-handler/test/newsletter.test.ts @@ -1,3 +1,4 @@ +import 'mocha' import { expect } from 'chai' import { getConfirmationCode, diff --git a/packages/inbound-email-handler/test/stub.test.ts b/packages/inbound-email-handler/test/stub.test.ts deleted file mode 100644 index 173ca4917..000000000 --- a/packages/inbound-email-handler/test/stub.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import 'mocha' -import * as chai from 'chai' -import { expect } from 'chai' -import 'chai/register-should' -import chaiString from 'chai-string' - -chai.use(chaiString) - -describe('Stub test', () => { - it('should pass', () => { - expect(true).to.be.true - }) -}) diff --git a/packages/inbound-email-handler/tsconfig.json b/packages/inbound-email-handler/tsconfig.json index f450acf38..5220d6b3f 100644 --- a/packages/inbound-email-handler/tsconfig.json +++ b/packages/inbound-email-handler/tsconfig.json @@ -5,5 +5,5 @@ "rootDir": ".", "lib": ["dom"] }, - "include": ["src", "test"] + "include": ["src"] } diff --git a/packages/pdf-handler/.dockerignore b/packages/pdf-handler/.dockerignore new file mode 100644 index 000000000..d8aea4ee6 --- /dev/null +++ b/packages/pdf-handler/.dockerignore @@ -0,0 +1,5 @@ +node_modules +build +.env* +Dockerfile +.dockerignore diff --git a/packages/pdf-handler/Dockerfile b/packages/pdf-handler/Dockerfile new file mode 100644 index 000000000..0666d57e5 --- /dev/null +++ b/packages/pdf-handler/Dockerfile @@ -0,0 +1,27 @@ +FROM node:14.18-alpine + +# Run everything after as non-privileged user. +WORKDIR /app + +COPY package.json . +COPY yarn.lock . +COPY tsconfig.json . +COPY .prettierrc . +COPY .eslintrc . + +COPY /packages/pdf-handler/package.json ./packages/pdf-handler/package.json + +RUN yarn install --pure-lockfile + +ADD /packages/pdf-handler ./packages/pdf-handler +RUN yarn workspace @omnivore/pdf-handler build + +# After building, fetch the production dependencies +RUN rm -rf /app/packages/pdf-handler/node_modules +RUN rm -rf /app/node_modules +RUN yarn install --pure-lockfile --production + +EXPOSE 8080 + +CMD ["yarn", "workspace", "@omnivore/pdf-handler", "start"] + diff --git a/packages/pdf-handler/package.json b/packages/pdf-handler/package.json index 4b91e76a1..0de3e5f9a 100644 --- a/packages/pdf-handler/package.json +++ b/packages/pdf-handler/package.json @@ -20,7 +20,10 @@ "deploy": "yarn build && yarn gcloud-deploy" }, "devDependencies": { - "@types/node": "^14.11.2" + "@types/node": "^14.11.2", + "chai": "^4.3.6", + "chai-string": "^1.5.0", + "mocha": "^10.0.0" }, "dependencies": { "@google-cloud/functions-framework": "3.1.2", diff --git a/packages/pdf-handler/test/pdf/pdf.test.ts b/packages/pdf-handler/test/pdf/pdf.test.ts index 259fd7650..001958422 100644 --- a/packages/pdf-handler/test/pdf/pdf.test.ts +++ b/packages/pdf-handler/test/pdf/pdf.test.ts @@ -1,7 +1,6 @@ import 'mocha' import * as chai from 'chai' import { expect } from 'chai' -import 'chai/register-should' import chaiString from 'chai-string' import { getDocument, diff --git a/packages/pdf-handler/tsconfig.json b/packages/pdf-handler/tsconfig.json index f450acf38..5220d6b3f 100644 --- a/packages/pdf-handler/tsconfig.json +++ b/packages/pdf-handler/tsconfig.json @@ -5,5 +5,5 @@ "rootDir": ".", "lib": ["dom"] }, - "include": ["src", "test"] + "include": ["src"] } diff --git a/packages/puppeteer-parse/.dockerignore b/packages/puppeteer-parse/.dockerignore new file mode 100644 index 000000000..2310bc768 --- /dev/null +++ b/packages/puppeteer-parse/.dockerignore @@ -0,0 +1,4 @@ +node_modules +.env* +Dockerfile +.dockerignore diff --git a/packages/puppeteer-parse/Dockerfile b/packages/puppeteer-parse/Dockerfile index d3ce96e20..a52f55122 100644 --- a/packages/puppeteer-parse/Dockerfile +++ b/packages/puppeteer-parse/Dockerfile @@ -85,6 +85,7 @@ WORKDIR /app ENV CHROMIUM_PATH /usr/bin/chromium-browser ENV LAUNCH_HEADLESS=true +ENV PORT 9090 COPY package.json . COPY yarn.lock . @@ -93,12 +94,20 @@ COPY .prettierrc . COPY .eslintrc . COPY /packages/puppeteer-parse/package.json ./packages/puppeteer-parse/package.json +COPY /packages/content-handler/package.json ./packages/content-handler/package.json RUN yarn install --pure-lockfile ADD /packages/puppeteer-parse ./packages/puppeteer-parse +ADD /packages/content-handler ./packages/content-handler +RUN yarn workspace @omnivore/content-handler build -EXPOSE 8080 +# After building, fetch the production dependencies +RUN rm -rf /app/packages/puppeteer-parse/node_modules +RUN rm -rf /app/node_modules +RUN yarn install --pure-lockfile --production + +EXPOSE 9090 # USER pptruser ENTRYPOINT ["yarn", "workspace", "@omnivore/puppeteer-parse", "start"] diff --git a/packages/puppeteer-parse/index.js b/packages/puppeteer-parse/index.js index e158f06d7..d3fadf998 100644 --- a/packages/puppeteer-parse/index.js +++ b/packages/puppeteer-parse/index.js @@ -118,43 +118,43 @@ const userAgentForUrl = (url) => { // launch Puppeteer const getBrowserPromise = (async () => { - return puppeteer.launch({ - args: chromium.args, - defaultViewport: chromium.defaultViewport, - executablePath: await chromium.executablePath, - headless: chromium.headless, - ignoreHTTPSErrors: true, - }); // return puppeteer.launch({ - // args: [ - // '--allow-running-insecure-content', - // '--autoplay-policy=user-gesture-required', - // '--disable-component-update', - // '--disable-domain-reliability', - // '--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process', - // '--disable-print-preview', - // '--disable-setuid-sandbox', - // '--disable-site-isolation-trials', - // '--disable-speech-api', - // '--disable-web-security', - // '--disk-cache-size=33554432', - // '--enable-features=SharedArrayBuffer', - // '--hide-scrollbars', - // '--ignore-gpu-blocklist', - // '--in-process-gpu', - // '--mute-audio', - // '--no-default-browser-check', - // '--no-pings', - // '--no-sandbox', - // '--no-zygote', - // '--use-gl=swiftshader', - // '--window-size=1920,1080', - // ].filter((item) => !!item), - // defaultViewport: { height: 1080, width: 1920 }, + // args: chromium.args, + // defaultViewport: chromium.defaultViewport, // executablePath: process.env.CHROMIUM_PATH, - // headless: !!process.env.LAUNCH_HEADLESS, - // timeout: 0, + // headless: chromium.headless, + // ignoreHTTPSErrors: true, // }); + return puppeteer.launch({ + args: [ + '--allow-running-insecure-content', + '--autoplay-policy=user-gesture-required', + '--disable-component-update', + '--disable-domain-reliability', + '--disable-features=AudioServiceOutOfProcess,IsolateOrigins,site-per-process', + '--disable-print-preview', + '--disable-setuid-sandbox', + '--disable-site-isolation-trials', + '--disable-speech-api', + '--disable-web-security', + '--disk-cache-size=33554432', + '--enable-features=SharedArrayBuffer', + '--hide-scrollbars', + '--ignore-gpu-blocklist', + '--in-process-gpu', + '--mute-audio', + '--no-default-browser-check', + '--no-pings', + '--no-sandbox', + '--no-zygote', + '--use-gl=swiftshader', + '--window-size=1920,1080', + ].filter((item) => !!item), + defaultViewport: { height: 1080, width: 1920 }, + executablePath: process.env.CHROMIUM_PATH, + headless: !!process.env.LAUNCH_HEADLESS, + timeout: 120000, // 2 minutes + }); })(); let logRecord, functionStartTime; diff --git a/packages/puppeteer-parse/package.json b/packages/puppeteer-parse/package.json index 11e60b00d..4ef6bb4d9 100644 --- a/packages/puppeteer-parse/package.json +++ b/packages/puppeteer-parse/package.json @@ -4,8 +4,10 @@ "description": "Google Cloud Function that accepts URL of the article and parses its content", "main": "index.js", "dependencies": { + "@google-cloud/functions-framework": "^3.1.2", "@google-cloud/logging-winston": "^5.1.1", "@google-cloud/storage": "^5.18.1", + "@omnivore/content-handler": "1.0.0", "@sentry/serverless": "^6.13.3", "axios": "^0.27.2", "chrome-aws-lambda": "^10.1.0", @@ -17,9 +19,6 @@ "underscore": "^1.13.4", "winston": "^3.3.3" }, - "devDependencies": { - "@google-cloud/functions-framework": "^3.0.0" - }, "scripts": { "start": "npx functions-framework --port=9090 --target=puppeteer", "start_preview": "npx functions-framework --target=preview", diff --git a/packages/text-to-speech/.dockerignore b/packages/text-to-speech/.dockerignore new file mode 100644 index 000000000..d8aea4ee6 --- /dev/null +++ b/packages/text-to-speech/.dockerignore @@ -0,0 +1,5 @@ +node_modules +build +.env* +Dockerfile +.dockerignore diff --git a/packages/text-to-speech/Dockerfile b/packages/text-to-speech/Dockerfile new file mode 100644 index 000000000..7e4fb5fea --- /dev/null +++ b/packages/text-to-speech/Dockerfile @@ -0,0 +1,27 @@ +FROM node:14.18-alpine + +# Run everything after as non-privileged user. +WORKDIR /app + +COPY package.json . +COPY yarn.lock . +COPY tsconfig.json . +COPY .prettierrc . +COPY .eslintrc . + +COPY /packages/text-to-speech/package.json ./packages/text-to-speech/package.json + +RUN yarn install --pure-lockfile + +ADD /packages/text-to-speech ./packages/text-to-speech +RUN yarn workspace @omnivore/text-to-speech-handler build + +# After building, fetch the production dependencies +RUN rm -rf /app/packages/text-to-speech/node_modules +RUN rm -rf /app/node_modules +RUN yarn install --pure-lockfile --production + +EXPOSE 8080 + +CMD ["yarn", "workspace", "@omnivore/text-to-speech-handler", "start"] + diff --git a/packages/text-to-speech/package.json b/packages/text-to-speech/package.json index e326eb8f9..e63b348b2 100644 --- a/packages/text-to-speech/package.json +++ b/packages/text-to-speech/package.json @@ -25,7 +25,9 @@ "@types/natural": "^5.1.1", "@types/node": "^14.11.2", "@types/underscore": "^1.11.4", - "eslint-plugin-prettier": "^4.0.0" + "chai": "^4.3.6", + "eslint-plugin-prettier": "^4.0.0", + "mocha": "^10.0.0" }, "dependencies": { "@google-cloud/functions-framework": "3.1.2", diff --git a/packages/text-to-speech/test/stub.test.ts b/packages/text-to-speech/test/stub.test.ts deleted file mode 100644 index 173ca4917..000000000 --- a/packages/text-to-speech/test/stub.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import 'mocha' -import * as chai from 'chai' -import { expect } from 'chai' -import 'chai/register-should' -import chaiString from 'chai-string' - -chai.use(chaiString) - -describe('Stub test', () => { - it('should pass', () => { - expect(true).to.be.true - }) -}) diff --git a/yarn.lock b/yarn.lock index 36102cecd..ebf984f5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2390,7 +2390,7 @@ google-gax "^2.24.1" protobufjs "^6.8.6" -"@google-cloud/functions-framework@3.1.2", "@google-cloud/functions-framework@^3.0.0": +"@google-cloud/functions-framework@3.1.2", "@google-cloud/functions-framework@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@google-cloud/functions-framework/-/functions-framework-3.1.2.tgz#2cd92ce4307bf7f32555d028dca22e398473b410" integrity sha512-pYvEH65/Rqh1JNPdcBmorcV7Xoom2/iOSmbtYza8msro7Inl+qOYxbyMiQfySD2gwAyn38WyWPRqsDRcf/BFLg== @@ -7885,6 +7885,11 @@ resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-1.27.1.tgz#aceeb2d5be8fccf541237e184e37ecff5faa9096" integrity sha512-cPiXpOvPFDr2edMnOXlz3UBDApwUfR+cpizvxCy0n3vp9bz/qe8BWzHPIEFcy+ogUOyjKuCISgyq77ELZPmkkg== +"@types/luxon@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.0.1.tgz#2b1657096473e24b049bdedf3710f99645f3a17f" + integrity sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ== + "@types/mdast@^3.0.0": version "3.0.10" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" @@ -8249,7 +8254,7 @@ dependencies: "@types/node" "*" -"@types/uuid@^8.3.0", "@types/uuid@^8.3.1": +"@types/uuid@^8.3.0", "@types/uuid@^8.3.1", "@types/uuid@^8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==