This repository was archived by the owner on May 29, 2026. It is now read-only.
chore(test): add Vitest infrastructure#43
Merged
Conversation
Contributor
Quality Report — ConductionNL/mydash @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ❌ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 103/103 | |||
| npm | ✅ | ✅ 342/342 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-04-30 11:26 UTC
Download the full PDF report from the workflow artifacts.
This was referenced Apr 30, 2026
rubenvdlinde
added a commit
that referenced
this pull request
Apr 30, 2026
Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.
Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)
Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
PHP-side dedup-by-UUID with priority user > group > default), and
countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
(with admin guard + last-in-group check; default group exempt),
getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
non-admin members and full for admins on group_shared dashboards
(single source of truth — the persisted column is preserved for
forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
in-body admin checks for mutations (passes gate-route-auth and
gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
VARCHAR(64) column + composite index (type, group_id) on
oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
personalDashboards getters, source plumbing for active dashboard,
routing PUT to /api/dashboards/group/{groupId}/{uuid} when
source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
DashboardTest extended for groupId getter/setter, jsonSerialize, and
the new constants.
In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
(resolves pre-existing PHPMD MissingImport).
Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde
added a commit
that referenced
this pull request
Apr 30, 2026
….005 Centralises every Nextcloud IInitialState::provideInitialState call behind a typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException) and mirrors it on the JS side with a typed loadInitialState(page) reader that fills defaults and warns on schema-version mismatch. - lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1). - lib/Exception/MissingInitialStateException.php: thrown by apply() with page + missing-key context. - lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored to construct the builder and call apply() — the only sanctioned call sites. - src/utils/loadInitialState.js: per-page key/default tables mirroring the spec Data Model exactly; emits a console.warn on _schemaVersion mismatch. - src/main.js and src/admin.js: load via the reader and provide() each key by identical name (no renaming at the boundary, no ref/reactive wrapping). - tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every key + schema version, missing required key throws, schema-version always pushed (5 tests / 28 assertions). - tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when any file under lib/ outside InitialStateBuilder.php calls provideInitialState() directly. - tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback when running outside the Nextcloud container so OCP-interface mocks resolve. PR #42 owns the spec text on origin/feature/replica-spec-proposals. The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending PR #43 (chore/add-vitest-setup); a TODO comment in InitialStateContractLintTest references the follow-up.
670a59e to
7068f89
Compare
Contributor
Quality Report — ConductionNL/mydash @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ❌ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 103/103 | |||
| npm | ✅ | ✅ 342/342 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-04-30 12:03 UTC
Download the full PDF report from the workflow artifacts.
rubenvdlinde
added a commit
that referenced
this pull request
Apr 30, 2026
Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.
Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)
Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
PHP-side dedup-by-UUID with priority user > group > default), and
countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
(with admin guard + last-in-group check; default group exempt),
getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
non-admin members and full for admins on group_shared dashboards
(single source of truth — the persisted column is preserved for
forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
in-body admin checks for mutations (passes gate-route-auth and
gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
VARCHAR(64) column + composite index (type, group_id) on
oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
personalDashboards getters, source plumbing for active dashboard,
routing PUT to /api/dashboards/group/{groupId}/{uuid} when
source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
DashboardTest extended for groupId getter/setter, jsonSerialize, and
the new constants.
In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
(resolves pre-existing PHPMD MissingImport).
Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde
added a commit
that referenced
this pull request
Apr 30, 2026
….005 Centralises every Nextcloud IInitialState::provideInitialState call behind a typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException) and mirrors it on the JS side with a typed loadInitialState(page) reader that fills defaults and warns on schema-version mismatch. - lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1). - lib/Exception/MissingInitialStateException.php: thrown by apply() with page + missing-key context. - lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored to construct the builder and call apply() — the only sanctioned call sites. - src/utils/loadInitialState.js: per-page key/default tables mirroring the spec Data Model exactly; emits a console.warn on _schemaVersion mismatch. - src/main.js and src/admin.js: load via the reader and provide() each key by identical name (no renaming at the boundary, no ref/reactive wrapping). - tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every key + schema version, missing required key throws, schema-version always pushed (5 tests / 28 assertions). - tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when any file under lib/ outside InitialStateBuilder.php calls provideInitialState() directly. - tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback when running outside the Nextcloud container so OCP-interface mocks resolve. PR #42 owns the spec text on origin/feature/replica-spec-proposals. The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending PR #43 (chore/add-vitest-setup); a TODO comment in InitialStateContractLintTest references the follow-up.
rubenvdlinde
added a commit
that referenced
this pull request
Apr 30, 2026
….005 (#45) Centralises every Nextcloud IInitialState::provideInitialState call behind a typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException) and mirrors it on the JS side with a typed loadInitialState(page) reader that fills defaults and warns on schema-version mismatch. - lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1). - lib/Exception/MissingInitialStateException.php: thrown by apply() with page + missing-key context. - lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored to construct the builder and call apply() — the only sanctioned call sites. - src/utils/loadInitialState.js: per-page key/default tables mirroring the spec Data Model exactly; emits a console.warn on _schemaVersion mismatch. - src/main.js and src/admin.js: load via the reader and provide() each key by identical name (no renaming at the boundary, no ref/reactive wrapping). - tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every key + schema version, missing required key throws, schema-version always pushed (5 tests / 28 assertions). - tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when any file under lib/ outside InitialStateBuilder.php calls provideInitialState() directly. - tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback when running outside the Nextcloud container so OCP-interface mocks resolve. PR #42 owns the spec text on origin/feature/replica-spec-proposals. The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending PR #43 (chore/add-vitest-setup); a TODO comment in InitialStateContractLintTest references the follow-up.
rubenvdlinde
added a commit
that referenced
this pull request
Apr 30, 2026
Introduces a third dashboard scope (group_shared) alongside the existing
user and admin_template types, plus the visible-to-user resolver, group
sentinel, and admin-only group CRUD.
Implements:
- REQ-DASH-011 (group_shared type + (type, groupId) invariant)
- REQ-DASH-012 (default-group sentinel)
- REQ-DASH-013 (GET /api/dashboards/visible with source tagging)
- REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard)
Changes:
- Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_*
constants, nullable groupId field, jsonSerialize includes groupId.
- DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries +
PHP-side dedup-by-UUID with priority user > group > default), and
countByGroup helper for the delete guard.
- DashboardFactory::create: accepts type / groupId / gridColumns kwargs
and enforces the (type, groupId) invariant via InvalidArgumentException.
- DashboardService: createGroupShared, updateGroupShared, deleteGroupShared
(with admin guard + last-in-group check; default group exempt),
getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin
helper.
- PermissionService: getEffectivePermissionLevel returns view_only for
non-admin members and full for admins on group_shared dashboards
(single source of truth — the persisted column is preserved for
forward-compat).
- DashboardApiController: 6 new endpoints (visible, listGroup, getGroup,
createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] +
in-body admin checks for mutations (passes gate-route-auth and
gate-semantic-auth).
- routes.php: 6 new routes with groupId/uuid path requirements.
- Migration Version001005Date20260430000000: adds nullable group_id
VARCHAR(64) column + composite index (type, group_id) on
oc_mydash_dashboards. Idempotent column / index checks.
- DashboardTableBuilder: same column + index for fresh installs.
- Frontend store: groupSharedDashboards / defaultGroupDashboards /
personalDashboards getters, source plumbing for active dashboard,
routing PUT to /api/dashboards/group/{groupId}/{uuid} when
source=group|default.
- src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers.
- l10n/en + nl: 3 new error message keys.
- Tests: DashboardFactoryGroupSharedTest covers the invariant guard;
DashboardTest extended for groupId getter/setter, jsonSerialize, and
the new constants.
In-passing fixes:
- DashboardService: import WidgetPlacement instead of FQCN reference
(resolves pre-existing PHPMD MissingImport).
Tasks skipped:
- 6.x seed data: _registers.json does not exist in this repo.
- 9.x Playwright e2e: test infra is in PR #43 (out of scope).
- 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde
added a commit
that referenced
this pull request
Apr 30, 2026
…47) Introduces a third dashboard scope (group_shared) alongside the existing user and admin_template types, plus the visible-to-user resolver, group sentinel, and admin-only group CRUD. Implements: - REQ-DASH-011 (group_shared type + (type, groupId) invariant) - REQ-DASH-012 (default-group sentinel) - REQ-DASH-013 (GET /api/dashboards/visible with source tagging) - REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard) Changes: - Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_* constants, nullable groupId field, jsonSerialize includes groupId. - DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries + PHP-side dedup-by-UUID with priority user > group > default), and countByGroup helper for the delete guard. - DashboardFactory::create: accepts type / groupId / gridColumns kwargs and enforces the (type, groupId) invariant via InvalidArgumentException. - DashboardService: createGroupShared, updateGroupShared, deleteGroupShared (with admin guard + last-in-group check; default group exempt), getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin helper. - PermissionService: getEffectivePermissionLevel returns view_only for non-admin members and full for admins on group_shared dashboards (single source of truth — the persisted column is preserved for forward-compat). - DashboardApiController: 6 new endpoints (visible, listGroup, getGroup, createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] + in-body admin checks for mutations (passes gate-route-auth and gate-semantic-auth). - routes.php: 6 new routes with groupId/uuid path requirements. - Migration Version001005Date20260430000000: adds nullable group_id VARCHAR(64) column + composite index (type, group_id) on oc_mydash_dashboards. Idempotent column / index checks. - DashboardTableBuilder: same column + index for fresh installs. - Frontend store: groupSharedDashboards / defaultGroupDashboards / personalDashboards getters, source plumbing for active dashboard, routing PUT to /api/dashboards/group/{groupId}/{uuid} when source=group|default. - src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers. - l10n/en + nl: 3 new error message keys. - Tests: DashboardFactoryGroupSharedTest covers the invariant guard; DashboardTest extended for groupId getter/setter, jsonSerialize, and the new constants. In-passing fixes: - DashboardService: import WidgetPlacement instead of FQCN reference (resolves pre-existing PHPMD MissingImport). Tasks skipped: - 6.x seed data: _registers.json does not exist in this repo. - 9.x Playwright e2e: test infra is in PR #43 (out of scope). - 7.4 admin UI: deferred to follow-up admin-group-management change.
rubenvdlinde
added a commit
that referenced
this pull request
May 3, 2026
* chore(test): add Vitest infra (devDeps, config, smoke test) * chore: update SBOM --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
rubenvdlinde
added a commit
that referenced
this pull request
May 3, 2026
….005 (#45) Centralises every Nextcloud IInitialState::provideInitialState call behind a typed PHP builder (InitialStateBuilder + Page enum + MissingInitialStateException) and mirrors it on the JS side with a typed loadInitialState(page) reader that fills defaults and warns on schema-version mismatch. - lib/Service/InitialStateBuilder.php: typed setters per page key, REQUIRED_KEYS map keyed by Page::WORKSPACE / Page::ADMIN, apply() validates and pushes every key plus _schemaVersion (INITIAL_STATE_SCHEMA_VERSION = 1). - lib/Exception/MissingInitialStateException.php: thrown by apply() with page + missing-key context. - lib/Controller/PageController.php and lib/Settings/MyDashAdmin.php: refactored to construct the builder and call apply() — the only sanctioned call sites. - src/utils/loadInitialState.js: per-page key/default tables mirroring the spec Data Model exactly; emits a console.warn on _schemaVersion mismatch. - src/main.js and src/admin.js: load via the reader and provide() each key by identical name (no renaming at the boundary, no ref/reactive wrapping). - tests/Unit/Service/InitialStateBuilderTest.php: per-page apply pushes every key + schema version, missing required key throws, schema-version always pushed (5 tests / 28 assertions). - tests/Unit/Service/InitialStateContractLintTest.php: PHP grep that fails when any file under lib/ outside InitialStateBuilder.php calls provideInitialState() directly. - tests/bootstrap.php: register vendor/nextcloud/ocp PSR-4 autoload as fallback when running outside the Nextcloud container so OCP-interface mocks resolve. PR #42 owns the spec text on origin/feature/replica-spec-proposals. The matching JS-side Vitest scan (loadState\(['"]mydash) is deferred pending PR #43 (chore/add-vitest-setup); a TODO comment in InitialStateContractLintTest references the follow-up.
rubenvdlinde
added a commit
that referenced
this pull request
May 3, 2026
…47) Introduces a third dashboard scope (group_shared) alongside the existing user and admin_template types, plus the visible-to-user resolver, group sentinel, and admin-only group CRUD. Implements: - REQ-DASH-011 (group_shared type + (type, groupId) invariant) - REQ-DASH-012 (default-group sentinel) - REQ-DASH-013 (GET /api/dashboards/visible with source tagging) - REQ-DASH-014 (group-scoped CRUD endpoints + last-in-group guard) Changes: - Dashboard entity: TYPE_GROUP_SHARED + DEFAULT_GROUP_ID + SOURCE_* constants, nullable groupId field, jsonSerialize includes groupId. - DashboardMapper: findByGroup, findVisibleToUser (3 indexed queries + PHP-side dedup-by-UUID with priority user > group > default), and countByGroup helper for the delete guard. - DashboardFactory::create: accepts type / groupId / gridColumns kwargs and enforces the (type, groupId) invariant via InvalidArgumentException. - DashboardService: createGroupShared, updateGroupShared, deleteGroupShared (with admin guard + last-in-group check; default group exempt), getVisibleToUser wiring IGroupManager::getUserGroupIds, and isAdmin helper. - PermissionService: getEffectivePermissionLevel returns view_only for non-admin members and full for admins on group_shared dashboards (single source of truth — the persisted column is preserved for forward-compat). - DashboardApiController: 6 new endpoints (visible, listGroup, getGroup, createGroup, updateGroup, deleteGroup) with #[NoAdminRequired] + in-body admin checks for mutations (passes gate-route-auth and gate-semantic-auth). - routes.php: 6 new routes with groupId/uuid path requirements. - Migration Version001005Date20260430000000: adds nullable group_id VARCHAR(64) column + composite index (type, group_id) on oc_mydash_dashboards. Idempotent column / index checks. - DashboardTableBuilder: same column + index for fresh installs. - Frontend store: groupSharedDashboards / defaultGroupDashboards / personalDashboards getters, source plumbing for active dashboard, routing PUT to /api/dashboards/group/{groupId}/{uuid} when source=group|default. - src/services/api.js: getVisibleDashboards + 5 group-CRUD helpers. - l10n/en + nl: 3 new error message keys. - Tests: DashboardFactoryGroupSharedTest covers the invariant guard; DashboardTest extended for groupId getter/setter, jsonSerialize, and the new constants. In-passing fixes: - DashboardService: import WidgetPlacement instead of FQCN reference (resolves pre-existing PHPMD MissingImport). Tasks skipped: - 6.x seed data: _registers.json does not exist in this repo. - 9.x Playwright e2e: test infra is in PR #43 (out of scope). - 7.4 admin UI: deferred to follow-up admin-group-management change.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds minimal Vitest test infrastructure so future frontend specs can ship with unit tests.
Added:
vitest@^4.1.5,@vue/test-utils@^1.3.6(Vue 2 compatible),jsdom@^29.1.1,@vitest/ui@^4.1.5vitest.config.jsat repo root withjsdomenv, globals enabled,@/->src/aliastest,test:watch,test:ui,test:coveragesrc/__tests__/smoke.test.jsproving the runner worksWhy: Unblocks frontend implementation agents to add
*.test.jsfiles alongside features.@vitest/coverage-v8is intentionally NOT installed; whoever first wants coverage can add it.Test plan
npm testpasses (1 test, 1 file)npm run lintclean (no new errors/warnings)npm run stylelintclean