diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f7adecc..e05a264 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,17 +8,18 @@ on: jobs: push_image: runs-on: ubuntu-latest + permissions: + id-token: write + contents: read steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v7 + - uses: actions/setup-node@v6 with: - node-version: '14' + node-version: '20' - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v5 with: - # Created the Secrets Under the Repo only with These Variables - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + role-to-assume: arn:aws:iam::480535519801:role/github-actions-dev-story-scraper aws-region: ${{ secrets.AWS_REGION }} - name: install run: | diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index a8ff180..31ae254 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -8,11 +8,11 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v7 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v6 with: - node-version: '14' + node-version: '20' - name: install run: yarn install diff --git a/jest.config.ts b/jest.config.ts index e73e314..a4d09b5 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -4,6 +4,7 @@ import type {Config} from '@jest/types'; const config: Config.InitialOptions = { preset: 'ts-jest', testEnvironment: 'node', + setupFilesAfterEnv: ['/src/tests/setupTests.ts'], }; export default config; diff --git a/src/devStoryScraper.ts b/src/devStoryScraper.ts index e143bdc..50d4a6f 100644 --- a/src/devStoryScraper.ts +++ b/src/devStoryScraper.ts @@ -1,4 +1,4 @@ -import cheerio from 'cheerio'; +import * as cheerio from 'cheerio'; import cleanDeep from 'clean-deep'; import {DevStoryDownloader} from './downloader/devStoryDownloader'; diff --git a/src/parsers/companyUrlParser.ts b/src/parsers/companyUrlParser.ts index f5f01f3..79f2952 100644 --- a/src/parsers/companyUrlParser.ts +++ b/src/parsers/companyUrlParser.ts @@ -1,5 +1,5 @@ import {HttpClient} from '../clients/httpClient'; -import cheerio from 'cheerio'; +import * as cheerio from 'cheerio'; export class CompanyUrlParser { constructor(private readonly httpClient: HttpClient) {} diff --git a/src/parsers/devStory/devStoryArtifactParser.ts b/src/parsers/devStory/devStoryArtifactParser.ts index dfae024..238017f 100644 --- a/src/parsers/devStory/devStoryArtifactParser.ts +++ b/src/parsers/devStory/devStoryArtifactParser.ts @@ -1,4 +1,5 @@ -import cheerio, {CheerioAPI} from 'cheerio'; +import * as cheerio from 'cheerio'; +import {CheerioAPI} from 'cheerio'; import {DevStoryArtifact, DevStoryArtifactType} from '../../models/devStory/devStoryArtifact'; import {stripString} from '../../utils/utils'; diff --git a/src/parsers/devStory/devStoryBookmarkParse.ts b/src/parsers/devStory/devStoryBookmarkParse.ts index 40e38e7..7cf6441 100644 --- a/src/parsers/devStory/devStoryBookmarkParse.ts +++ b/src/parsers/devStory/devStoryBookmarkParse.ts @@ -1,5 +1,5 @@ import * as _ from 'lodash'; -import cheerio from 'cheerio'; +import * as cheerio from 'cheerio'; import {Author, Bookmark} from '../../models/bookmark'; import {asNameAndSurnames, stripString} from '../../utils/utils'; import {Markdown} from '../../utils/markdown'; diff --git a/src/parsers/devStory/devStoryPositionParser.ts b/src/parsers/devStory/devStoryPositionParser.ts index c8f9f0c..77c59b6 100644 --- a/src/parsers/devStory/devStoryPositionParser.ts +++ b/src/parsers/devStory/devStoryPositionParser.ts @@ -1,4 +1,5 @@ -import cheerio, {CheerioAPI} from 'cheerio'; +import * as cheerio from 'cheerio'; +import {CheerioAPI} from 'cheerio'; import {DevStoryPosition} from '../../models/devStory/devStoryPosition'; import {stripString} from '../../utils/utils'; diff --git a/src/parsers/devStory/devStoryTopsParser.ts b/src/parsers/devStory/devStoryTopsParser.ts index 9201685..84d408f 100644 --- a/src/parsers/devStory/devStoryTopsParser.ts +++ b/src/parsers/devStory/devStoryTopsParser.ts @@ -1,4 +1,5 @@ -import cheerio, {CheerioAPI} from 'cheerio'; +import * as cheerio from 'cheerio'; +import {CheerioAPI} from 'cheerio'; import {PublicArtifact} from '../../models/publicArtifact'; import {stripString} from '../../utils/utils'; diff --git a/src/tests/setupTests.ts b/src/tests/setupTests.ts new file mode 100644 index 0000000..6f5a405 --- /dev/null +++ b/src/tests/setupTests.ts @@ -0,0 +1,55 @@ +// 1. Requerir módulos nativos de forma imperativa sin colisionar con tipos globales de TS +const streamWeb = require('node:stream/web'); +const bufferModule = require('node:buffer'); +const workerThreads = require('node:worker_threads'); + +// 2. Definir de forma prioritaria las clases de WebIDL en el global de Jest +if (typeof global.ReadableStream === 'undefined') { + global.ReadableStream = streamWeb.ReadableStream; +} +if (typeof global.WritableStream === 'undefined') { + global.WritableStream = streamWeb.WritableStream; +} +if (typeof global.TransformStream === 'undefined') { + global.TransformStream = streamWeb.TransformStream; +} +if (typeof global.Blob === 'undefined') { + global.Blob = bufferModule.Blob; +} +if (typeof global.File === 'undefined') { + global.File = bufferModule.File; +} +if (typeof global.MessagePort === 'undefined') { + global.MessagePort = workerThreads.MessagePort; +} +if (typeof global.MessageChannel === 'undefined') { + global.MessageChannel = workerThreads.MessageChannel; +} + +if (typeof global.DOMException === 'undefined') { + global.DOMException = class DOMException extends Error { + constructor(message?: any, name?: any) { + super(message); + this.name = name || 'DOMException'; + } + } as any; +} + +// 3. Requerir undici de forma segura (una vez que todas las globales ya están inyectadas) +const undici = require('undici'); + +if (typeof global.fetch === 'undefined') { + global.fetch = undici.fetch; +} +if (typeof global.Headers === 'undefined') { + global.Headers = undici.Headers; +} +if (typeof global.Request === 'undefined') { + global.Request = undici.Request; +} +if (typeof global.Response === 'undefined') { + global.Response = undici.Response; +} +if (typeof global.FormData === 'undefined') { + global.FormData = undici.FormData; +}