diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..6ed63d5 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,22 @@ +FROM denoland/deno:2.2.12 + +# Install tools +RUN apt-get update && \ + apt-get install -y git && \ + rm -rf /var/lib/apt/lists/* + +# Creates a non-root user for the devcontainer +ARG USERNAME=developer +ARG USER_UID=1000 +ARG USER_GID=$USER_UID +RUN groupadd --gid "$USER_GID" "$USERNAME" \ + && useradd -s /bin/bash --uid "$USER_UID" --gid "$USER_GID" -m "$USERNAME" \ + && mkdir -p /home/"$USERNAME"/.deno \ + && chown -R "$USERNAME":"$USERNAME" /home/"$USERNAME" \ + && chown -R "$USERNAME":"$USERNAME" /deno-dir + +# Switch to the non-root user +USER $USERNAME + +# Set the working directory +WORKDIR /home/$USERNAME/workspace \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..5edcea1 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,16 @@ +{ + "name": "Switcher Management Feature Dev Container", + "dockerComposeFile": [ + "docker-compose.yml" + ], + "service": "switcher-management-feature", + "workspaceFolder": "/workspace", + "customizations":{ + "vscode": { + "extensions": ["denoland.vscode-deno"], + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + } + } + } +} \ No newline at end of file diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..83dd491 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,11 @@ +version: '3.9' + +services: + + switcher-management-feature: + build: + context: . + dockerfile: Dockerfile + volumes: + - ..:/workspace:cached + command: sleep infinity \ No newline at end of file diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 1add999..9f387cf 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -18,10 +18,10 @@ jobs: with: fetch-depth: 0 - - name: Setup Deno v2.2.8 + - name: Setup Deno v2.2.12 uses: denoland/setup-deno@v1 with: - deno-version: v2.2.8 + deno-version: v2.2.12 - name: Setup LCOV run: sudo apt install -y lcov diff --git a/.github/workflows/re-release.yml b/.github/workflows/re-release.yml index 7ef3c73..e4d91d1 100644 --- a/.github/workflows/re-release.yml +++ b/.github/workflows/re-release.yml @@ -21,10 +21,10 @@ jobs: fetch-depth: 0 ref: ${{ github.event.inputs.tag }} - - name: Setup Deno v2.2.8 + - name: Setup Deno v2.2.12 uses: denoland/setup-deno@v1 with: - deno-version: v2.2.8 + deno-version: v2.2.12 - name: Verify formatting run: deno task fmt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e69354..a2a643f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,10 +16,10 @@ jobs: with: fetch-depth: 0 - - name: Setup Deno v2.2.8 + - name: Setup Deno v2.2.12 uses: denoland/setup-deno@v1 with: - deno-version: v2.2.8 + deno-version: v2.2.12 - name: Verify formatting run: deno task fmt diff --git a/Dockerfile b/Dockerfile index 9a14ae9..1642bee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM denoland/deno:alpine-2.2.8 +FROM denoland/deno:alpine-2.2.12 ENV APP_HOME=/home/app WORKDIR $APP_HOME diff --git a/deno.lock b/deno.lock index 4905292..a724547 100644 --- a/deno.lock +++ b/deno.lock @@ -11,9 +11,10 @@ "jsr:@std/assert@0.223": "0.223.0", "jsr:@std/assert@0.224": "0.224.0", "jsr:@std/assert@0.226": "0.226.0", - "jsr:@std/assert@1": "1.0.11", + "jsr:@std/assert@1": "1.0.13", "jsr:@std/assert@1.0.11": "1.0.11", "jsr:@std/assert@1.0.12": "1.0.12", + "jsr:@std/assert@1.0.13": "1.0.13", "jsr:@std/assert@1.0.3": "1.0.3", "jsr:@std/assert@1.0.5": "1.0.5", "jsr:@std/assert@1.0.9": "1.0.9", @@ -29,8 +30,9 @@ "jsr:@std/dotenv@0.225.2": "0.225.2", "jsr:@std/dotenv@0.225.3": "0.225.3", "jsr:@std/encoding@0.223": "0.223.0", - "jsr:@std/encoding@1": "1.0.7", + "jsr:@std/encoding@1": "1.0.10", "jsr:@std/encoding@1.0.0-rc.2": "1.0.0-rc.2", + "jsr:@std/encoding@^1.0.10": "1.0.10", "jsr:@std/encoding@^1.0.5": "1.0.5", "jsr:@std/encoding@^1.0.7": "1.0.7", "jsr:@std/fmt@1.0.1": "1.0.1", @@ -38,11 +40,12 @@ "jsr:@std/fmt@1.0.3": "1.0.3", "jsr:@std/fmt@1.0.5": "1.0.5", "jsr:@std/fmt@1.0.6": "1.0.6", + "jsr:@std/fmt@1.0.7": "1.0.7", "jsr:@std/fs@0.229.1": "0.229.1", "jsr:@std/fs@1.0.6": "1.0.6", "jsr:@std/http@0.223": "0.223.0", "jsr:@std/http@0.224": "0.224.5", - "jsr:@std/http@1": "1.0.13", + "jsr:@std/http@1": "1.0.15", "jsr:@std/internal@^1.0.2": "1.0.2", "jsr:@std/internal@^1.0.3": "1.0.3", "jsr:@std/internal@^1.0.5": "1.0.5", @@ -53,8 +56,8 @@ "jsr:@std/media-types@0.224": "0.224.1", "jsr:@std/media-types@1": "1.1.0", "jsr:@std/path@0.223": "0.223.0", - "jsr:@std/path@1": "1.0.8", - "jsr:@std/path@^1.0.8": "1.0.8", + "jsr:@std/path@1": "1.0.9", + "jsr:@std/path@^1.0.8": "1.0.9", "jsr:@std/path@~0.225.1": "0.225.2", "jsr:@switcherapi/switcher-client-deno@2.0.2": "2.0.2", "jsr:@switcherapi/switcher-client-deno@2.1.0": "2.1.0", @@ -196,6 +199,12 @@ "jsr:@std/internal@^1.0.6" ] }, + "@std/assert@1.0.13": { + "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29", + "dependencies": [ + "jsr:@std/internal@^1.0.6" + ] + }, "@std/bytes@0.223.0": { "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" }, @@ -251,6 +260,9 @@ "@std/encoding@1.0.7": { "integrity": "f631247c1698fef289f2de9e2a33d571e46133b38d042905e3eac3715030a82d" }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, "@std/fmt@1.0.1": { "integrity": "ef76c37faa7720faa8c20fd8cc74583f9b1e356dfd630c8714baa716a45856ab" }, @@ -266,6 +278,9 @@ "@std/fmt@1.0.6": { "integrity": "a2c56a69a2369876ddb3ad6a500bb6501b5bad47bb3ea16bfb0c18974d2661fc" }, + "@std/fmt@1.0.7": { + "integrity": "2a727c043d8df62cd0b819b3fb709b64dd622e42c3b1bb817ea7e6cc606360fb" + }, "@std/fs@0.229.1": { "integrity": "38d3fb31f0ca0a8c1118e039939188f32e291a3f7f17dc0868fec22024bdfadd", "dependencies": [ @@ -310,6 +325,12 @@ "jsr:@std/encoding@^1.0.7" ] }, + "@std/http@1.0.15": { + "integrity": "435a4934b4e196e82a8233f724da525f7b7112f3566502f28815e94764c19159", + "dependencies": [ + "jsr:@std/encoding@^1.0.10" + ] + }, "@std/internal@1.0.2": { "integrity": "f4cabe2021352e8bfc24e6569700df87bf070914fc38d4b23eddd20108ac4495" }, @@ -370,6 +391,9 @@ "@std/path@1.0.8": { "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" }, + "@std/path@1.0.9": { + "integrity": "260a49f11edd3db93dd38350bf9cd1b4d1366afa98e81b86167b4e3dd750129e" + }, "@switcherapi/switcher-client-deno@2.0.2": { "integrity": "a665ee63b889e843e861f51c893e7f2013ea983615aba094d160076120344157", "dependencies": [ diff --git a/src/api-docs/paths/common.ts b/src/api-docs/paths/common.ts index 4a11da6..e889d52 100644 --- a/src/api-docs/paths/common.ts +++ b/src/api-docs/paths/common.ts @@ -5,24 +5,3 @@ export const commonSchemaContent = (ref: string) => ({ }, }, }); - -export const commonArraySchemaContent = (ref: string) => ({ - 'application/json': { - schema: { - type: 'array', - items: { - $ref: `#/components/schemas/${ref}`, - }, - }, - }, -}); - -export const commonOneOfSchemaContent = (refs: string[]) => ({ - 'application/json': { - schema: { - oneOf: refs.map((ref) => ({ - $ref: `#/components/schemas/${ref}`, - })), - }, - }, -}); diff --git a/src/deps.ts b/src/deps.ts index a18a93f..177a4c8 100644 --- a/src/deps.ts +++ b/src/deps.ts @@ -2,4 +2,4 @@ export { Application, Context, type Middleware, type Next, Router } from 'jsr:@o export { Client } from 'jsr:@switcherapi/switcher-client-deno@2.1.0'; export { ValidatorFn, ValidatorMiddleware } from 'jsr:@trackerforce/validator4oak@1.2.0'; export { load } from 'jsr:@std/dotenv@0.225.3'; -export { bold, cyan, green } from 'jsr:@std/fmt@1.0.6/colors'; +export { bold, cyan, green } from 'jsr:@std/fmt@1.0.7/colors'; diff --git a/tests/deps.ts b/tests/deps.ts index a3304c5..4df13a7 100644 --- a/tests/deps.ts +++ b/tests/deps.ts @@ -1,7 +1,7 @@ export { type Middleware, testing } from 'jsr:@oak/oak@17.1.4'; export { Client, StrategiesType } from 'jsr:@switcherapi/switcher-client-deno@2.1.0'; export { superoak } from 'https://deno.land/x/superoak@4.8.1/mod.ts'; -export { assert, assertEquals, assertFalse, assertObjectMatch } from 'jsr:@std/assert@1.0.12'; +export { assert, assertEquals, assertFalse, assertObjectMatch } from 'jsr:@std/assert@1.0.13'; // Fixes superdeno@4.9.0 issue // deno-lint-ignore no-explicit-any diff --git a/tests/routes/api-docs.test.ts b/tests/routes/api-docs.test.ts new file mode 100644 index 0000000..eaab8b0 --- /dev/null +++ b/tests/routes/api-docs.test.ts @@ -0,0 +1,13 @@ +import app from '../../src/app.ts'; +import { assertObjectMatch, superoak } from '../deps.ts'; +import apiDocs from '../../src/api-docs/swagger-document.ts'; + +Deno.test({ + name: 'API-Docs route - it should return ok', + async fn() { + const request = await superoak(app); + const response = await request.get('/swagger.json').expect(200); + + assertObjectMatch(response.body, apiDocs); + }, +});