diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index f3efb53..ee43ab6 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - node-version: [20.x, 21.x] + node-version: [22.x, 24.x] steps: - uses: actions/checkout@v4 @@ -29,8 +29,11 @@ jobs: - name: Recreate JSON Schemas run: yarn create-schemas && yarn build # an incremental rebuild is neccessary to use the updated schema - name: Test - run: yarn test:unit - - uses: codecov/codecov-action@v2 + run: yarn test:unit --reporter=junit --outputFile=test-report.junit.xml + + - name: Upload test results to Codecov + if: ${{ !cancelled() }} + uses: codecov/test-results-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} env: diff --git a/.github/workflows/check-version-bump.yml b/.github/workflows/check-version-bump.yml index 381634f..898fdf4 100644 --- a/.github/workflows/check-version-bump.yml +++ b/.github/workflows/check-version-bump.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [20.x] + node-version: [22.x] steps: - name: Checkout diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 0d7319a..aea1e41 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - node-version: [20.x, 22.x] + node-version: [22.x, 24.x] steps: - uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index 367e89f..b084437 100644 --- a/.gitignore +++ b/.gitignore @@ -73,4 +73,6 @@ testresults !.yarn/plugins !.yarn/releases !.yarn/sdks -!.yarn/versions \ No newline at end of file +!.yarn/versions + +test-results \ No newline at end of file diff --git a/.yarn/versions/2d4efe43.yml b/.yarn/versions/2d4efe43.yml deleted file mode 100644 index 6e6773b..0000000 --- a/.yarn/versions/2d4efe43.yml +++ /dev/null @@ -1,5 +0,0 @@ -releases: - common: patch - frontend: patch - furystack-boilerplate-app: patch - service: patch diff --git a/.yarn/versions/544e081e.yml b/.yarn/versions/544e081e.yml deleted file mode 100644 index 6e6773b..0000000 --- a/.yarn/versions/544e081e.yml +++ /dev/null @@ -1,5 +0,0 @@ -releases: - common: patch - frontend: patch - furystack-boilerplate-app: patch - service: patch diff --git a/.yarn/versions/bf3e3cf4.yml b/.yarn/versions/bf3e3cf4.yml deleted file mode 100644 index 6e6773b..0000000 --- a/.yarn/versions/bf3e3cf4.yml +++ /dev/null @@ -1,5 +0,0 @@ -releases: - common: patch - frontend: patch - furystack-boilerplate-app: patch - service: patch diff --git a/.yarn/versions/cee96777.yml b/.yarn/versions/cee96777.yml deleted file mode 100644 index 6e6773b..0000000 --- a/.yarn/versions/cee96777.yml +++ /dev/null @@ -1,5 +0,0 @@ -releases: - common: patch - frontend: patch - furystack-boilerplate-app: patch - service: patch diff --git a/.yarn/versions/e54633dc.yml b/.yarn/versions/e54633dc.yml deleted file mode 100644 index 6e6773b..0000000 --- a/.yarn/versions/e54633dc.yml +++ /dev/null @@ -1,5 +0,0 @@ -releases: - common: patch - frontend: patch - furystack-boilerplate-app: patch - service: patch diff --git a/README.md b/README.md index 68490d1..080e410 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# boilerplate +# obsidian-core -Boilerplate app with common type api definitions, a furystack-based backend service and a Shades-based single page application. +Obsidian Core is an advanced smart home management system built with Furystack. It provides a robust backend service and a user-friendly frontend interface to control and monitor your smart home devices. # Usage diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ce92671..30953d3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -17,7 +17,7 @@ pool: steps: - task: NodeTool@0 inputs: - versionSpec: '20.x' + versionSpec: '22.x' displayName: 'Install Node.js' - script: yarn install displayName: 'Yarn install' diff --git a/common/schemas/authentication-api.json b/common/schemas/authentication-api.json new file mode 100644 index 0000000..1d1ddec --- /dev/null +++ b/common/schemas/authentication-api.json @@ -0,0 +1,206 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AuthenticationApi", + "definitions": { + "AuthenticationApi": { + "type": "object", + "properties": { + "GET": { + "type": "object", + "properties": { + "/isAuthenticated": { + "type": "object", + "properties": { + "result": { + "type": "object", + "properties": { + "isAuthenticated": { + "type": "boolean" + } + }, + "required": ["isAuthenticated"], + "additionalProperties": false + } + }, + "required": ["result"], + "additionalProperties": false + }, + "/currentUser": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/User" + } + }, + "required": ["result"], + "additionalProperties": false + } + }, + "required": ["/isAuthenticated", "/currentUser"], + "additionalProperties": false + }, + "POST": { + "type": "object", + "properties": { + "/login": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/User" + }, + "body": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": ["username", "password"], + "additionalProperties": false + } + }, + "required": ["result", "body"], + "additionalProperties": false + }, + "/logout": { + "type": "object", + "properties": { + "result": {} + }, + "required": ["result"], + "additionalProperties": false + } + }, + "required": ["/login", "/logout"], + "additionalProperties": false + }, + "PATCH": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "result": {}, + "url": {}, + "query": {}, + "body": {}, + "headers": {} + }, + "required": ["result"], + "additionalProperties": false + } + }, + "PUT": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "result": {}, + "url": {}, + "query": {}, + "body": {}, + "headers": {} + }, + "required": ["result"], + "additionalProperties": false + } + }, + "DELETE": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "result": {}, + "url": {}, + "query": {}, + "body": {}, + "headers": {} + }, + "required": ["result"], + "additionalProperties": false + } + }, + "HEAD": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "result": {}, + "url": {}, + "query": {}, + "body": {}, + "headers": {} + }, + "required": ["result"], + "additionalProperties": false + } + }, + "CONNECT": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "result": {}, + "url": {}, + "query": {}, + "body": {}, + "headers": {} + }, + "required": ["result"], + "additionalProperties": false + } + }, + "TRACE": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "result": {}, + "url": {}, + "query": {}, + "body": {}, + "headers": {} + }, + "required": ["result"], + "additionalProperties": false + } + }, + "OPTIONS": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "result": {}, + "url": {}, + "query": {}, + "body": {}, + "headers": {} + }, + "required": ["result"], + "additionalProperties": false + } + } + }, + "required": ["GET", "POST"], + "additionalProperties": false + }, + "User": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["username", "roles"], + "additionalProperties": false + } + } +} diff --git a/common/schemas/boilerplate-api.json b/common/schemas/boilerplate-api.json deleted file mode 100644 index 9e239dc..0000000 --- a/common/schemas/boilerplate-api.json +++ /dev/null @@ -1,436 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "TestQueryEndpoint": { - "type": "object", - "properties": { - "query": { - "type": "object", - "properties": { - "param1": { - "type": "string" - } - }, - "required": ["param1"], - "additionalProperties": false - }, - "result": { - "type": "object", - "properties": { - "param1Value": { - "type": "string" - } - }, - "required": ["param1Value"], - "additionalProperties": false - } - }, - "required": ["query", "result"], - "additionalProperties": false - }, - "TestUrlParamsEndpoint": { - "type": "object", - "properties": { - "url": { - "type": "object", - "properties": { - "urlParam": { - "type": "string" - } - }, - "required": ["urlParam"], - "additionalProperties": false - }, - "result": { - "type": "object", - "properties": { - "urlParamValue": { - "type": "string" - } - }, - "required": ["urlParamValue"], - "additionalProperties": false - } - }, - "required": ["url", "result"], - "additionalProperties": false - }, - "TestPostBodyEndpoint": { - "type": "object", - "properties": { - "body": { - "type": "object", - "properties": { - "value": { - "type": "string" - } - }, - "required": ["value"], - "additionalProperties": false - }, - "result": { - "type": "object", - "properties": { - "bodyValue": { - "type": "string" - } - }, - "required": ["bodyValue"], - "additionalProperties": false - } - }, - "required": ["body", "result"], - "additionalProperties": false - }, - "BoilerplateApi": { - "type": "object", - "properties": { - "GET": { - "type": "object", - "properties": { - "/isAuthenticated": { - "type": "object", - "properties": { - "result": { - "type": "object", - "properties": { - "isAuthenticated": { - "type": "boolean" - } - }, - "required": ["isAuthenticated"], - "additionalProperties": false - } - }, - "required": ["result"], - "additionalProperties": false - }, - "/currentUser": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/User" - } - }, - "required": ["result"], - "additionalProperties": false - }, - "/testQuery": { - "$ref": "#/definitions/TestQueryEndpoint" - }, - "/testUrlParams/:urlParam": { - "$ref": "#/definitions/TestUrlParamsEndpoint" - } - }, - "required": ["/isAuthenticated", "/currentUser", "/testQuery", "/testUrlParams/:urlParam"], - "additionalProperties": false - }, - "POST": { - "type": "object", - "properties": { - "/login": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/User" - }, - "body": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - } - }, - "required": ["username", "password"], - "additionalProperties": false - } - }, - "required": ["result", "body"], - "additionalProperties": false - }, - "/logout": { - "type": "object", - "properties": { - "result": {} - }, - "required": ["result"], - "additionalProperties": false - }, - "/testPostBody": { - "$ref": "#/definitions/TestPostBodyEndpoint" - } - }, - "required": ["/login", "/logout", "/testPostBody"], - "additionalProperties": false - }, - "PATCH": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "PUT": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "DELETE": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "HEAD": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "CONNECT": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "TRACE": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "OPTIONS": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - } - }, - "required": ["GET", "POST"], - "additionalProperties": false - }, - "RestApi": { - "type": "object", - "properties": { - "GET": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "POST": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "PATCH": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "PUT": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "DELETE": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "HEAD": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "CONNECT": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "TRACE": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - }, - "OPTIONS": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "result": {}, - "url": {}, - "query": {}, - "body": {}, - "headers": {} - }, - "required": ["result"], - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "User": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "roles": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["username", "roles"], - "additionalProperties": false - } - } -} diff --git a/common/src/authentication-api.ts b/common/src/authentication-api.ts new file mode 100644 index 0000000..11f8293 --- /dev/null +++ b/common/src/authentication-api.ts @@ -0,0 +1,13 @@ +import type { RestApi } from '@furystack/rest' +import type { User } from './models/index.js' + +export interface AuthenticationApi extends RestApi { + GET: { + '/isAuthenticated': { result: { isAuthenticated: boolean } } + '/currentUser': { result: User } + } + POST: { + '/login': { result: User; body: { username: string; password: string } } + '/logout': { result: unknown } + } +} diff --git a/common/src/bin/create-schemas.ts b/common/src/bin/create-schemas.ts index 19556ad..aa465e3 100644 --- a/common/src/bin/create-schemas.ts +++ b/common/src/bin/create-schemas.ts @@ -21,8 +21,8 @@ export const entityValues: SchemaGenerationSetting[] = [ export const apiValues: SchemaGenerationSetting[] = [ { - inputFile: './src/boilerplate-api.ts', - outputFile: './schemas/boilerplate-api.json', + inputFile: './src/authentication-api.ts', + outputFile: './schemas/authentication-api.json', type: '*', }, ] diff --git a/common/src/boilerplate-api.ts b/common/src/boilerplate-api.ts deleted file mode 100644 index ff2299b..0000000 --- a/common/src/boilerplate-api.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { RestApi } from '@furystack/rest' -import type { User } from './models/index.js' - -export type TestQueryEndpoint = { query: { param1: string }; result: { param1Value: string } } -export type TestUrlParamsEndpoint = { url: { urlParam: string }; result: { urlParamValue: string } } -export type TestPostBodyEndpoint = { body: { value: string }; result: { bodyValue: string } } - -export interface BoilerplateApi extends RestApi { - GET: { - '/isAuthenticated': { result: { isAuthenticated: boolean } } - '/currentUser': { result: User } - '/testQuery': TestQueryEndpoint - '/testUrlParams/:urlParam': TestUrlParamsEndpoint - } - POST: { - '/login': { result: User; body: { username: string; password: string } } - '/logout': { result: unknown } - '/testPostBody': TestPostBodyEndpoint - } -} diff --git a/common/src/index.ts b/common/src/index.ts index c6bf005..b4d6ed2 100644 --- a/common/src/index.ts +++ b/common/src/index.ts @@ -1,2 +1,2 @@ +export * from './authentication-api.js' export * from './models/index.js' -export * from './boilerplate-api.js' diff --git a/frontend/index.html b/frontend/index.html index 1a0137a..4894646 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,7 +2,7 @@ - FuryStack Boilerplate App + The Obsidian Core diff --git a/frontend/src/components/layout.tsx b/frontend/src/components/layout.tsx index bd5fce1..f33ffbb 100644 --- a/frontend/src/components/layout.tsx +++ b/frontend/src/components/layout.tsx @@ -24,7 +24,7 @@ export const Layout = Shade({ backgroundColor: injector.getInstance(ThemeProviderService).theme.background.default, }} > -
+
) diff --git a/frontend/src/environment-options.ts b/frontend/src/environment-options.ts index 609206b..82a8470 100644 --- a/frontend/src/environment-options.ts +++ b/frontend/src/environment-options.ts @@ -4,6 +4,6 @@ export const environmentOptions = { // appVersion: process.env.APP_VERSION as string, // buildDate: new Date(process.env.BUILD_DATE as string), // serviceUrl: process.env.SERVICE_URL as string, - repository: 'http://github.com/furystack/boilerplate', + repository: 'http://github.com/furystack/obsidian-core', serviceUrl: 'http://localhost:9090/api', //process.env.REPOSITORY as string, } diff --git a/frontend/src/services/boilerplate-api-client.ts b/frontend/src/services/authentication-api-client.ts similarity index 71% rename from frontend/src/services/boilerplate-api-client.ts rename to frontend/src/services/authentication-api-client.ts index 48cf811..7d292f7 100644 --- a/frontend/src/services/boilerplate-api-client.ts +++ b/frontend/src/services/authentication-api-client.ts @@ -1,11 +1,11 @@ -import { createClient } from '@furystack/rest-client-fetch' -import type { BoilerplateApi } from 'common' import { Injectable } from '@furystack/inject' +import { createClient } from '@furystack/rest-client-fetch' +import type { AuthenticationApi } from 'common' import { environmentOptions } from '../environment-options.js' @Injectable({ lifetime: 'singleton' }) -export class BoilerplateApiClient { - public call = createClient({ +export class AuthenticationApiClient { + public call = createClient({ endpointUrl: environmentOptions.serviceUrl, requestInit: { credentials: 'include', diff --git a/frontend/src/services/session.ts b/frontend/src/services/session.ts index 7b894b4..ef583ef 100644 --- a/frontend/src/services/session.ts +++ b/frontend/src/services/session.ts @@ -3,7 +3,7 @@ import { Injectable, Injected } from '@furystack/inject' import { NotyService } from '@furystack/shades-common-components' import { ObservableValue, usingAsync } from '@furystack/utils' import type { User } from 'common' -import { BoilerplateApiClient } from './boilerplate-api-client.js' +import { AuthenticationApiClient } from './authentication-api-client.js' export type SessionState = 'initializing' | 'offline' | 'unauthenticated' | 'authenticated' @@ -101,8 +101,8 @@ export class SessionService implements IdentityContext { return currentUser as unknown as TUser } - @Injected(BoilerplateApiClient) - declare private api: BoilerplateApiClient + @Injected(AuthenticationApiClient) + declare private api: AuthenticationApiClient @Injected(NotyService) declare private readonly notys: NotyService diff --git a/package.json b/package.json index bec3bc9..a802759 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "name": "furystack-boilerplate-app", - "version": "1.0.2", - "description": "example web app based on furystack", + "name": "obsidian-core", + "version": "0.0.1", + "description": "", "main": "service/src/index.ts", - "repository": "https://github.com/furystack/boilerplate.git", + "repository": "https://github.com/furystack/obsidian-cpre.git", "author": "Gallay Lajos ", "license": "GPL-2.0-only", "private": true, diff --git a/service/src/service.ts b/service/src/service.ts index 0f0aed5..e005aac 100644 --- a/service/src/service.ts +++ b/service/src/service.ts @@ -1,14 +1,11 @@ -import type { BoilerplateApi } from 'common' -import BoilerplateApiSchemas from 'common/schemas/boilerplate-api.json' with { type: 'json' } +import type { AuthenticationApi } from 'common' import { DefaultSession, GetCurrentUser, IsAuthenticated, - JsonResult, LoginAction, LogoutAction, - Validate, useHttpAuthentication, useRestService, useStaticFiles, @@ -23,13 +20,13 @@ useHttpAuthentication(injector, { getUserStore: (sm) => sm.getStoreFor(User, 'username'), getSessionStore: (sm) => sm.getStoreFor(DefaultSession, 'sessionId'), }) -useRestService({ +useRestService({ injector, root: 'api', port, - name: 'Boilerplate Service', + name: 'Authentication Service', version: '1.0.0', - description: 'API for Furystack Boilerplate Application containing simple authentication and example endpoints', + description: 'API for Furystack Authentication Service containing authentication related endpoints', cors: { credentials: true, origins: ['http://localhost:8080'], @@ -39,22 +36,10 @@ useRestService({ GET: { '/currentUser': GetCurrentUser, '/isAuthenticated': IsAuthenticated, - '/testQuery': Validate({ schema: BoilerplateApiSchemas, schemaName: 'TestQueryEndpoint' })(async (options) => - JsonResult({ param1Value: options.getQuery().param1 }), - ), - '/testUrlParams/:urlParam': Validate({ schema: BoilerplateApiSchemas, schemaName: 'TestUrlParamsEndpoint' })( - async (options) => JsonResult({ urlParamValue: options.getUrlParams().urlParam }), - ), }, POST: { '/login': LoginAction, '/logout': LogoutAction, - '/testPostBody': Validate({ schema: BoilerplateApiSchemas, schemaName: 'TestPostBodyEndpoint' })( - async (options) => { - const body = await options.getBody() - return JsonResult({ bodyValue: body.value }) - }, - ), }, }, }).catch((err) => { diff --git a/yarn.lock b/yarn.lock index 798b3a1..f621941 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2691,31 +2691,6 @@ __metadata: languageName: node linkType: hard -"furystack-boilerplate-app@workspace:.": - version: 0.0.0-use.local - resolution: "furystack-boilerplate-app@workspace:." - dependencies: - "@eslint/js": "npm:^9.37.0" - "@playwright/test": "npm:^1.56.0" - "@types/node": "npm:^24.7.2" - "@vitest/coverage-v8": "npm:^3.2.4" - eslint: "npm:^9.37.0" - eslint-config-prettier: "npm:^10.1.8" - eslint-plugin-import: "npm:2.32.0" - eslint-plugin-jsdoc: "npm:^61.1.4" - eslint-plugin-playwright: "npm:^2.2.2" - eslint-plugin-prettier: "npm:^5.5.4" - husky: "npm:^9.1.7" - lint-staged: "npm:^16.2.4" - prettier: "npm:^3.6.2" - rimraf: "npm:^6.0.1" - typescript: "npm:^5.9.3" - typescript-eslint: "npm:^8.46.1" - vite: "npm:^7.1.10" - vitest: "npm:^3.2.4" - languageName: unknown - linkType: soft - "generator-function@npm:^2.0.0": version: 2.0.1 resolution: "generator-function@npm:2.0.1" @@ -3874,6 +3849,31 @@ __metadata: languageName: node linkType: hard +"obsidian-core@workspace:.": + version: 0.0.0-use.local + resolution: "obsidian-core@workspace:." + dependencies: + "@eslint/js": "npm:^9.37.0" + "@playwright/test": "npm:^1.56.0" + "@types/node": "npm:^24.7.2" + "@vitest/coverage-v8": "npm:^3.2.4" + eslint: "npm:^9.37.0" + eslint-config-prettier: "npm:^10.1.8" + eslint-plugin-import: "npm:2.32.0" + eslint-plugin-jsdoc: "npm:^61.1.4" + eslint-plugin-playwright: "npm:^2.2.2" + eslint-plugin-prettier: "npm:^5.5.4" + husky: "npm:^9.1.7" + lint-staged: "npm:^16.2.4" + prettier: "npm:^3.6.2" + rimraf: "npm:^6.0.1" + typescript: "npm:^5.9.3" + typescript-eslint: "npm:^8.46.1" + vite: "npm:^7.1.10" + vitest: "npm:^3.2.4" + languageName: unknown + linkType: soft + "once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0"