diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 19b11139..3b6e750e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,20 +36,20 @@ jobs: runs-on: ubuntu-latest needs: [build-staging-image] steps: - - uses: passeidireto/trigger-external-workflow-action@main - env: - PAYLOAD_SERVICE: "webcomponents" - with: - repository: docaxess/pdfa11y-k8s-webservices - event: deploy_staging - github_pat: ${{ secrets.K8S_WEBSERVICES_PAT }} + - uses: passeidireto/trigger-external-workflow-action@main + env: + PAYLOAD_SERVICE: "webcomponents" + with: + repository: docaxess/pdfa11y-k8s-webservices + event: deploy_staging + github_pat: ${{ secrets.K8S_WEBSERVICES_PAT }} - - uses: slackapi/slack-github-action@v1.26.0 - with: - channel-id: 'C0779L6QQT1' #'saas-deployment' - payload: | - { - "text": ":rocket: webcomponents.ipedis.com has been released on staging ! :tada: ( ${{ github.ref_name }} )" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.DEPLOYMENT_SLACK_BOT }} \ No newline at end of file + - uses: slackapi/slack-github-action@v2.1.1 + with: + webhook-type: webhook-trigger + #'saas-deployment' + webhook: ${{ secrets.DEPLOYMENT_SLACK_BOT }} + payload: | + { + "text": ":rocket: webcomponents.ipedis.com has been released on staging ! :tada: ( ${{ github.ref_name }} )" + } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c5cc4c8e..3380b5c0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,30 +5,43 @@ on: pull_request: jobs: - build-and-test: + setup: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [22.x] steps: - - uses: actions/checkout@v4 - - name: Use Node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - name: Setup Node.js + uses: actions/setup-node@v5 with: - node-version: ${{ matrix.node-version }} + node-version: '22.x' cache: 'npm' - name: Install dependencies - run: npm install - - - name: Lint all packages - run: npm run lint + run: npm ci - name: Build all packages run: npm run build + - name: Lint all packages + run: npx nx run-many --target=lint --all --parallel + - name: Test all packages - run: npm run test + run: npx nx run-many --target=test --all --parallel + + - name: Install Playwright browsers + run: npx playwright install --with-deps - - name: e2e all packages - run: npm run e2e + - name: Demo e2e tests + run: npx nx run-many --target=e2e --all --parallel --exclude=demo + + - name: Demo Axe tests + run: npm run build:cleanup && npx playwright test apps/demo/e2e/accessibility.spec.ts --config apps/demo/playwright.config.ts + env: + AXE_DEVELOPER_HUB_API_KEY: ${{ secrets.AXE_DEVELOPER_HUB_API_KEY }} + axe-linter: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dequelabs/axe-linter-action@v1 + with: + api_key: ${{ secrets.AXE_LINTER_API_KEY }} + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index f770acfe..41da22d8 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,9 @@ Thumbs.db .nx/workspace-data packages/*/.stencil +packages/*/package.e2e.json .angular +.env + +playwright-report +test-results diff --git a/apps/demo/docker/Dockerfile b/apps/demo/docker/Dockerfile index 8f218291..626c0e6f 100644 --- a/apps/demo/docker/Dockerfile +++ b/apps/demo/docker/Dockerfile @@ -3,7 +3,7 @@ WORKDIR /app/src RUN apk add --no-cache --virtual .build-deps alpine-sdk python3 COPY package*.json ./ -RUN npm install +RUN npm ci COPY . ./ RUN npm run build diff --git a/apps/demo/e2e/README.md b/apps/demo/e2e/README.md new file mode 100644 index 00000000..415e73b3 --- /dev/null +++ b/apps/demo/e2e/README.md @@ -0,0 +1,55 @@ +# Demo App E2E Tests - Minimal Setup + +Simple, reliable e2e tests for the demo application. + +## Test Files + +- `home.spec.ts` - Basic home page tests +- `demo-basic.spec.ts` - Navigation tests for main component pages + +## Running Tests + +### Local Development +```bash +# Run demo e2e tests +npm run e2e:demo + +# Manual run (if server already running) +npm run demo:e2e:manual + +# Build and test (full local CI simulation) +npm run ci:demo +``` + +### CI Pipeline +```bash +# Basic CI (no e2e) +npm run ci:basic + +# Full CI with e2e +npm run build && npm run e2e:demo +``` + +## Configuration + +- **Browser**: Chromium only (for speed and reliability) +- **Auto-server**: Starts demo app automatically on port 4201 +- **Timeout**: 5s per test +- **Parallelization**: All tests run in parallel + +## Test Strategy + +**Minimal and Focused:** +- ✅ Page loads successfully +- ✅ Basic navigation works +- ✅ Components render on their pages +- ✅ No complex interactions (to avoid flakiness) + +**What's NOT tested:** +- ❌ Complex component interactions +- ❌ Form submissions +- ❌ Animation states +- ❌ Mobile menu toggles +- ❌ Tooltips/dropdowns + +This keeps tests fast, reliable, and focused on critical functionality. \ No newline at end of file diff --git a/apps/demo/e2e/accessibility.spec.ts b/apps/demo/e2e/accessibility.spec.ts new file mode 100644 index 00000000..dd6a2718 --- /dev/null +++ b/apps/demo/e2e/accessibility.spec.ts @@ -0,0 +1,106 @@ +import { BrowserContext, chromium, test } from '@playwright/test'; +import { + wrapPlaywrightPage, + playwrightConfig, + PlaywrightController +} from '@axe-core/watcher'; +import * as dotenv from 'dotenv'; + +// Load environment variables +dotenv.config(); + +const API_KEY = process.env['AXE_DEVELOPER_HUB_API_KEY']; + +if (!API_KEY) { + console.warn('AXE_DEVELOPER_HUB_API_KEY not found in environment variables'); +} + +test.describe('Accessibility Tests', () => { + let controller: PlaywrightController; + + test.beforeEach(async ({ page, browser }) => { + const browserContext: BrowserContext = await chromium.launchPersistentContext( + '', + playwrightConfig({ + axe: { + apiKey: API_KEY || '', + timeout: { + flush: 10000 + } + }, + channel: 'chromium', + args: ['--headless=new'] + })); + const p = await browserContext.newPage(); + controller = new PlaywrightController(p); + + // Wrap the page for axe monitoring + wrapPlaywrightPage(p, controller); + }); + + test.afterEach(async () => { + // Flush test results to axe Developer Hub + if (controller) { + try { + await controller.flush(); + } catch (error) { + console.warn('Failed to flush accessibility results:', error); + } + } + }); + + test('should pass accessibility audit on home page', async ({ page }) => { + await page.goto('/'); + await page.waitForLoadState('networkidle'); + + // The axe-watcher automatically scans the page for accessibility issues + // We just need to interact with the page normally + + // Wait a bit to ensure all content is loaded + await page.waitForTimeout(2000); + }); + + test('should pass accessibility audit on accordion page', async ({ page }) => { + await page.goto('/accordion'); + await page.waitForLoadState('networkidle'); + + // Check that the page has loaded + await page.locator('h2:has-text("Accordion")').first().waitFor(); + + // Wait for component to be fully rendered + await page.waitForTimeout(2000); + }); + + test('should pass accessibility audit on alert page', async ({ page }) => { + await page.goto('/alert'); + await page.waitForLoadState('networkidle'); + + // Check that the page has loaded + await page.locator('h2:has-text("Alert")').first().waitFor(); + + // Wait for component to be fully rendered + await page.waitForTimeout(2000); + }); + + test('should pass accessibility audit on table page', async ({ page }) => { + await page.goto('/table'); + await page.waitForLoadState('networkidle'); + + // Check that the page has loaded + await page.locator('h2:has-text("Table")').first().waitFor(); + + // Wait for component to be fully rendered + await page.waitForTimeout(2000); + }); + + test('should pass accessibility audit on form components', async ({ page }) => { + await page.goto('/checkbox'); + await page.waitForLoadState('networkidle'); + + // Check that the page has loaded + await page.locator('h1, h2').first().waitFor(); + + // Wait for component to be fully rendered + await page.waitForTimeout(2000); + }); +}); diff --git a/apps/demo/e2e/axe.md b/apps/demo/e2e/axe.md new file mode 100644 index 00000000..4421aba6 --- /dev/null +++ b/apps/demo/e2e/axe.md @@ -0,0 +1,71 @@ +In the root level of your testing folder, install the @axe-core/watcher package and all of its dependencies using npm or your preferred package manager (for example, yarn or pnpm). +``` +npm install --save-dev @axe-core/watcher +``` +In your test file or files, import the playwrightConfig() function, the wrapPlaywright() function, and the PlaywrightController class from @axe-core/watcher: + +``` +import { + wrapPlaywrightPage, + playwrightConfig, + PlaywrightController +} from '@axe-core/watcher'; +``` +In your test setup code (typically in a before or beforeAll block), wrap any existing code for creating a browserContext instance with a call to playwrightConfig() while providing your API key: + +``` +import { chromium, BrowserContext } from 'playwright'; +import { playwrightConfig } from '@axe-core/watcher'; + +const API_KEY = process.env.AXE_DEVELOPER_HUB + +const browserContext: BrowserContext = await chromium.launchPersistentContext( + /** + * We set userDataDir to an empty string which saves + * browser data to a temporary directory + * @see https://playwright.dev/docs/api/class-browsertype#browser-type-launch-persistent-context + */ + '', + playwrightConfig({ + axe: { + apiKey: API_KEY + }, + /** + * We support both headless and headed mode with Chrome. + * + * For headless mode: + * - Use '--headless=chrome' for browsers v94-108. + * - Use '--headless=new' for browsers v109+. + * + * For headed mode: + * - Remove the '--headless' flag. + * + * @see https://playwright.dev/docs/chrome-extensions#headless-mode + */ + headless: false, + args: ['--headless=new'] + }) +); +``` + + +Once you have a page instance, create an instance of the PlaywrightController class and wrap your browserContext: + +``` +// Create a page instance, using your browser context. +let page = await browserContext.newPage(); + +// Initialize the PlaywrightController by passing in the Playwright page. +const controller = new PlaywrightController(page); + +// Use the new wrapped Playwright page instance. +page = wrapPlaywrightPage(page, controller); +``` + +Finally, ensure all test results from axe Watcher are flushed out. To do this, add the following block of code to your test teardown code (typically in an afterEach block): + +``` +afterEach(async () => { +await controller.flush() +}) +``` diff --git a/apps/demo/e2e/demo-basic.spec.ts b/apps/demo/e2e/demo-basic.spec.ts new file mode 100644 index 00000000..a18fcf43 --- /dev/null +++ b/apps/demo/e2e/demo-basic.spec.ts @@ -0,0 +1,61 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Demo App - Basic Tests', () => { + test('should load the home page', async ({ page }) => { + await page.goto('/'); + + // Wait for page to load + await page.waitForLoadState('networkidle'); + + // Check that the page has loaded (any heading) + await expect(page.locator('h1, h2').first()).toBeVisible(); + }); + + test('should navigate to accordion page', async ({ page }) => { + await page.goto('/accordion'); + + // Wait for page to load + await page.waitForLoadState('networkidle'); + + // Check that we're on accordion page + await expect(page.locator('h2:has-text("Accordion")').first()).toBeVisible(); + + // Check that accordion component exists + const accordion = page.locator('ip-accordion').first(); + if (await accordion.count() > 0) { + await expect(accordion).toBeVisible(); + } + }); + + test('should navigate to alert page', async ({ page }) => { + await page.goto('/alert'); + + // Wait for page to load + await page.waitForLoadState('networkidle'); + + // Check that we're on alert page + await expect(page.locator('h2:has-text("Alert")').first()).toBeVisible(); + + // Check that alert component exists + const alert = page.locator('ip-alert').first(); + if (await alert.count() > 0) { + await expect(alert).toBeVisible(); + } + }); + + test('should navigate to table page', async ({ page }) => { + await page.goto('/table'); + + // Wait for page to load + await page.waitForLoadState('networkidle'); + + // Check that we're on table page + await expect(page.locator('h2:has-text("Table")').first()).toBeVisible(); + + // Check that table component exists + const table = page.locator('ip-table').first(); + if (await table.count() > 0) { + await expect(table).toBeVisible(); + } + }); +}); \ No newline at end of file diff --git a/apps/demo/e2e/home.spec.ts b/apps/demo/e2e/home.spec.ts new file mode 100644 index 00000000..623cca35 --- /dev/null +++ b/apps/demo/e2e/home.spec.ts @@ -0,0 +1,28 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Home Page', () => { + test('should load the home page', async ({ page }) => { + await page.goto('/'); + + // Wait for page to load + await page.waitForLoadState('networkidle'); + + // Check that the page title is correct (it's "Accueil" in French) + await expect(page).toHaveTitle(/Accueil|Home|Ipedis/); + + // Check that any heading is visible + await expect(page.locator('h1, h2').first()).toBeVisible(); + }); + + test('should have navigation links', async ({ page }) => { + await page.goto('/'); + + // Wait for page to load + await page.waitForLoadState('networkidle'); + + // Check that there are some navigation links + const links = page.locator('a[href]'); + const linkCount = await links.count(); + expect(linkCount).toBeGreaterThan(0); + }); +}); \ No newline at end of file diff --git a/apps/demo/jest.config.ts b/apps/demo/jest.config.ts index e67a3957..a96cf143 100644 --- a/apps/demo/jest.config.ts +++ b/apps/demo/jest.config.ts @@ -4,6 +4,7 @@ export default { preset: '../../jest.preset.js', setupFilesAfterEnv: ['/src/test-setup.ts'], coverageDirectory: '../coverage/demo', + testPathIgnorePatterns: ['/e2e/'], transform: { '^.+\\.(ts|mjs|js|html)$': [ 'jest-preset-angular', diff --git a/apps/demo/playwright.config.manual.ts b/apps/demo/playwright.config.manual.ts new file mode 100644 index 00000000..9568923d --- /dev/null +++ b/apps/demo/playwright.config.manual.ts @@ -0,0 +1,25 @@ +import { defineConfig, devices } from '@playwright/test'; + +// Alternative config without automatic server startup +// Use this if you want to manually start the server first +export default defineConfig({ + testDir: './e2e', + fullyParallel: true, + forbidOnly: !!process.env['CI'], + retries: process.env['CI'] ? 2 : 0, + workers: process.env['CI'] ? 1 : undefined, + reporter: 'html', + use: { + baseURL: 'http://localhost:4200', + trace: 'on-first-retry', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'], channel: 'chromium' }, + }, + ], + + // No webServer - expects you to start the server manually +}); diff --git a/apps/demo/playwright.config.ts b/apps/demo/playwright.config.ts new file mode 100644 index 00000000..c7088f04 --- /dev/null +++ b/apps/demo/playwright.config.ts @@ -0,0 +1,31 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: './e2e', + fullyParallel: true, + forbidOnly: !!process.env['CI'], + retries: process.env['CI'] ? 2 : 0, + workers: process.env['CI'] ? 1 : undefined, + reporter: 'html', + use: { + baseURL: 'http://localhost:4201', + trace: 'on-first-retry', + }, + timeout: 45000, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'], channel: 'chromium' }, + } + ], + + webServer: { + command: 'npx nx serve demo --port 4201 --host localhost', + url: 'http://localhost:4201', + reuseExistingServer: !process.env['CI'], + timeout: 120 * 1000, + stdout: 'pipe', + stderr: 'pipe', + }, +}); diff --git a/apps/demo/project.json b/apps/demo/project.json index e17782b6..8c23411d 100644 --- a/apps/demo/project.json +++ b/apps/demo/project.json @@ -89,6 +89,13 @@ "options": { "jestConfig": "apps/demo/jest.config.ts" } + }, + "e2e": { + "executor": "@nx/playwright:playwright", + "outputs": ["{workspaceRoot}/dist/.playwright"], + "options": { + "config": "apps/demo/playwright.config.ts" + } } } } diff --git a/apps/demo/src/app/features/code-snippet/code-snippet.component.html b/apps/demo/src/app/features/code-snippet/code-snippet.component.html index 7b468937..2e7b2294 100644 --- a/apps/demo/src/app/features/code-snippet/code-snippet.component.html +++ b/apps/demo/src/app/features/code-snippet/code-snippet.component.html @@ -66,7 +66,7 @@
@@ -74,7 +74,7 @@
diff --git a/package-lock.json b/package-lock.json index 478554cc..b950f0eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,7 @@ "@angular/cli": "^18.1.3", "@angular/compiler-cli": "18.1.1", "@angular/language-service": "18.1.1", + "@axe-core/watcher": "^3.23.0", "@nrwl/angular": "^19.5.6", "@nrwl/workspace": "^19.5.6", "@nx/angular": "19.5.2", @@ -68,6 +69,7 @@ "@typescript-eslint/eslint-plugin": "7.17.0", "@typescript-eslint/parser": "7.17.0", "@typescript-eslint/utils": "7.17.0", + "dotenv": "^17.2.2", "eslint": "~8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.6.0", @@ -84,6 +86,9 @@ "ts-node": "10.9.1", "typescript": "5.5.4" }, + "engines": { + "node": "^22.0.0" + }, "optionalDependencies": { "@nx/nx-darwin-arm64": "19.4.2", "@nx/nx-darwin-x64": "19.4.2", @@ -1706,6 +1711,41 @@ "@angular/core": "^18.0.0" } }, + "node_modules/@axe-core/watcher": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@axe-core/watcher/-/watcher-3.23.0.tgz", + "integrity": "sha512-DyCsqwbB/YuzEkYKYwSvCGeFKghjBDWM0LJ8R0QDsrtJU9OKTRvzIcl2og9fMPafPxMysSMOyYXTqhVSOpep9A==", + "dev": true, + "license": "UNLICENSED", + "dependencies": { + "debug": "^4.3.5", + "eventemitter3": "^5.0.1", + "node-fetch": "^2.6.7", + "sync-request": "^6.1.0", + "uuid": "^11.0.3" + } + }, + "node_modules/@axe-core/watcher/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@axe-core/watcher/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -5082,6 +5122,10 @@ "resolved": "packages/login", "link": true }, + "node_modules/@ipedis/menu": { + "resolved": "packages/menu", + "link": true + }, "node_modules/@ipedis/modal": { "resolved": "packages/modal", "link": true @@ -5098,6 +5142,14 @@ "resolved": "packages/show-more", "link": true }, + "node_modules/@ipedis/slider": { + "resolved": "packages/slider", + "link": true + }, + "node_modules/@ipedis/stepper": { + "resolved": "packages/stepper", + "link": true + }, "node_modules/@ipedis/tab-panel": { "resolved": "packages/tab-panel", "link": true @@ -7627,6 +7679,19 @@ "node": ">=8" } }, + "node_modules/@nrwl/angular/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@nrwl/angular/node_modules/express": { "version": "4.19.2", "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", @@ -8669,6 +8734,19 @@ "node": ">=8" } }, + "node_modules/@nrwl/workspace/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@nrwl/workspace/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11742,6 +11820,16 @@ "@types/node": "*" } }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -11818,6 +11906,16 @@ "@types/send": "*" } }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -12875,6 +12973,13 @@ "node": ">=8" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -13830,6 +13935,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -13884,6 +14002,13 @@ ], "license": "CC-BY-4.0" }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -14382,6 +14507,55 @@ "dev": true, "license": "MIT" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -15533,9 +15707,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", + "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -15561,6 +15735,33 @@ "url": "https://dotenvx.com" } }, + "node_modules/dotenv-expand/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -15766,13 +15967,10 @@ "license": "MIT" }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -15793,6 +15991,34 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", @@ -17356,16 +17582,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -17384,6 +17615,29 @@ "node": ">=8.0.0" } }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -17563,12 +17817,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17624,22 +17878,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -17880,6 +18122,22 @@ "node": ">= 0.6" } }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -17978,6 +18236,23 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "license": "MIT" + }, "node_modules/http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", @@ -21946,6 +22221,15 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -23129,6 +23413,19 @@ "node": ">=8" } }, + "node_modules/nx/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/nx/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -23672,6 +23969,12 @@ "node": ">=6" } }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -24766,6 +25069,16 @@ "node": ">=0.4.0" } }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -26678,6 +26991,31 @@ "dev": true, "license": "MIT" }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-port": "^3.1.0" + } + }, "node_modules/synckit": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", @@ -27031,6 +27369,54 @@ "dev": true, "license": "MIT" }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -27579,6 +27965,13 @@ "dev": true, "license": "MIT" }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, "node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", @@ -29290,6 +29683,10 @@ "name": "@ipedis/login", "version": "0.0.1" }, + "packages/menu": { + "name": "@ipedis/menu", + "version": "0.0.1" + }, "packages/modal": { "name": "@ipedis/modal", "version": "0.0.1" @@ -29310,6 +29707,14 @@ "name": "@ipedis/show-more", "version": "0.0.1" }, + "packages/slider": { + "name": "@ipedis/slider", + "version": "0.0.1" + }, + "packages/stepper": { + "name": "@ipedis/stepper", + "version": "0.0.1" + }, "packages/tab-panel": { "name": "@ipedis/tab-panel", "version": "0.0.1" diff --git a/package.json b/package.json index 994807f1..714a2848 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,29 @@ "scripts": { "nx": "nx", "lint:update": "prettier *.json --write && nx run-many --target=lint --all --fix --parallel", - "build": "nx run-many --target=build --all --projects=tag:type:webcomponent --parallel && nx run demo:build:production", + "build:packages": "nx run-many --target=build --all --projects=tag:type:webcomponent --parallel", + "build:cleanup": "find dist/packages -name '*.entry.js.map' -delete 2>/dev/null || true", + "build": "npm run build:packages && npm run build:cleanup && nx run demo:build:production", "lint": "nx run-many --target=lint --all --parallel", - "e2e": "nx run-many --target=e2e --all --parallel", + "e2e": "nx run-many --target=e2e --all --parallel --exclude=demo", "test": "nx run-many --target=test --all --parallel", "demo:ssr": "nx run demo:build:production && node dist/demo/server/server.mjs", "migrate": "nx migrate latest && nx migrate --run-migrations --if-exists", "run:ci": "npm run lint && npm run test && npm run e2e && npm run build", - "serve": "nx serve demo" + "serve": "npm run build:packages && npm run build:cleanup && nx serve demo", + "demo:e2e": "nx run demo:e2e", + "demo:e2e:manual": "playwright test --config apps/demo/playwright.config.manual.ts", + "e2e:demo": "nx run demo:e2e", + "e2e:axe": "playwright test apps/demo/e2e/accessibility.spec.ts --config apps/demo/playwright.config.ts", + "ci:demo": "npm run build && npm run e2e:demo", + "ci:axe": "npm run build && npm run e2e:axe", + "ci:basic": "npm run lint && npm run test && npm run build" + }, + "engines": { + "node": "^22.0.0" + }, + "volta": { + "node": "22.20.0" }, "private": false, "devDependencies": { @@ -30,6 +45,7 @@ "@angular/cli": "^18.1.3", "@angular/compiler-cli": "18.1.1", "@angular/language-service": "18.1.1", + "@axe-core/watcher": "^3.23.0", "@nrwl/angular": "^19.5.6", "@nrwl/workspace": "^19.5.6", "@nx/angular": "19.5.2", @@ -55,6 +71,7 @@ "@typescript-eslint/eslint-plugin": "7.17.0", "@typescript-eslint/parser": "7.17.0", "@typescript-eslint/utils": "7.17.0", + "dotenv": "^17.2.2", "eslint": "~8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^28.6.0", diff --git a/packages/accordion/stencil.config.ts b/packages/accordion/stencil.config.ts index 70f58394..326b7bfc 100644 --- a/packages/accordion/stencil.config.ts +++ b/packages/accordion/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/alert/stencil.config.ts b/packages/alert/stencil.config.ts index 92ff760c..ac92e553 100644 --- a/packages/alert/stencil.config.ts +++ b/packages/alert/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/breadcrumb/stencil.config.ts b/packages/breadcrumb/stencil.config.ts index 43e9e40d..0aba1f58 100644 --- a/packages/breadcrumb/stencil.config.ts +++ b/packages/breadcrumb/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/checkbox/stencil.config.ts b/packages/checkbox/stencil.config.ts index c93e1256..c8ad18e2 100644 --- a/packages/checkbox/stencil.config.ts +++ b/packages/checkbox/stencil.config.ts @@ -16,6 +16,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ angularOutputTarget({ componentCorePackage: 'checkbox', diff --git a/packages/dropdown/stencil.config.ts b/packages/dropdown/stencil.config.ts index 93398c7c..9a2c30f3 100644 --- a/packages/dropdown/stencil.config.ts +++ b/packages/dropdown/stencil.config.ts @@ -16,6 +16,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ angularOutputTarget({ componentCorePackage: 'dropdown', diff --git a/packages/footnote/stencil.config.ts b/packages/footnote/stencil.config.ts index 53c0e19f..fbdba9bc 100644 --- a/packages/footnote/stencil.config.ts +++ b/packages/footnote/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/login/stencil.config.ts b/packages/login/stencil.config.ts index e103c274..9f0c3ad8 100644 --- a/packages/login/stencil.config.ts +++ b/packages/login/stencil.config.ts @@ -15,6 +15,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ angularOutputTarget({ componentCorePackage: 'login', diff --git a/packages/menu/stencil.config.ts b/packages/menu/stencil.config.ts index 67fb53fe..331173f0 100644 --- a/packages/menu/stencil.config.ts +++ b/packages/menu/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/modal/stencil.config.ts b/packages/modal/stencil.config.ts index 2a623db0..10c2bdae 100644 --- a/packages/modal/stencil.config.ts +++ b/packages/modal/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/pagination/stencil.config.ts b/packages/pagination/stencil.config.ts index d157716f..0feaf583 100644 --- a/packages/pagination/stencil.config.ts +++ b/packages/pagination/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/radio/stencil.config.ts b/packages/radio/stencil.config.ts index 39a12f22..8b45459f 100644 --- a/packages/radio/stencil.config.ts +++ b/packages/radio/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/search-bar/stencil.config.ts b/packages/search-bar/stencil.config.ts index 5d7d4a91..c7e71b72 100644 --- a/packages/search-bar/stencil.config.ts +++ b/packages/search-bar/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/show-more/stencil.config.ts b/packages/show-more/stencil.config.ts index f32f58a5..1c6608d6 100644 --- a/packages/show-more/stencil.config.ts +++ b/packages/show-more/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/slider/stencil.config.ts b/packages/slider/stencil.config.ts index 254facd6..7d84447e 100644 --- a/packages/slider/stencil.config.ts +++ b/packages/slider/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/stepper/stencil.config.ts b/packages/stepper/stencil.config.ts index 2a5d0324..11f75918 100644 --- a/packages/stepper/stencil.config.ts +++ b/packages/stepper/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/tab-panel/stencil.config.ts b/packages/tab-panel/stencil.config.ts index cfc999ab..e8710b61 100644 --- a/packages/tab-panel/stencil.config.ts +++ b/packages/tab-panel/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/table/stencil.config.ts b/packages/table/stencil.config.ts index 0bd24cc2..263de264 100644 --- a/packages/table/stencil.config.ts +++ b/packages/table/stencil.config.ts @@ -14,6 +14,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ { type: 'dist', diff --git a/packages/toggle/stencil.config.ts b/packages/toggle/stencil.config.ts index 3f66ac03..19255433 100644 --- a/packages/toggle/stencil.config.ts +++ b/packages/toggle/stencil.config.ts @@ -16,6 +16,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ angularOutputTarget({ componentCorePackage: 'toggle', diff --git a/packages/tooltip/stencil.config.ts b/packages/tooltip/stencil.config.ts index 45f18c56..4e4c3bf9 100644 --- a/packages/tooltip/stencil.config.ts +++ b/packages/tooltip/stencil.config.ts @@ -16,6 +16,10 @@ export const config: Config = { plugins: [sass()], + testing: { + browserArgs: ['--no-sandbox', '--disable-setuid-sandbox'], + }, + outputTargets: [ angularOutputTarget({ componentCorePackage: 'tooltip',