@stone-js/starters 0.8.9 → 0.8.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/basic-react-declarative/package.json +5 -5
- package/basic-react-imperative/package.json +5 -5
- package/basic-react-native-declarative/App.tsx +192 -0
- package/basic-react-native-declarative/LICENSE +21 -0
- package/basic-react-native-declarative/README.md +35 -0
- package/basic-react-native-declarative/adapter/NativeAdapter.ts +108 -0
- package/basic-react-native-declarative/adapter/NativeErrorHandler.ts +53 -0
- package/basic-react-native-declarative/adapter/NativeEventSource.ts +58 -0
- package/basic-react-native-declarative/adapter/RawResponseWrapper.ts +30 -0
- package/basic-react-native-declarative/adapter/declarations.ts +40 -0
- package/basic-react-native-declarative/adapter/middleware.ts +73 -0
- package/basic-react-native-declarative/adapter/nativeAdapterBlueprint.ts +51 -0
- package/basic-react-native-declarative/adapter/renderSink.ts +52 -0
- package/basic-react-native-declarative/app/Application.ts +17 -0
- package/basic-react-native-declarative/app/WelcomeController.ts +66 -0
- package/basic-react-native-declarative/app.json +25 -0
- package/basic-react-native-declarative/assets/android-icon-background.png +0 -0
- package/basic-react-native-declarative/assets/android-icon-foreground.png +0 -0
- package/basic-react-native-declarative/assets/android-icon-monochrome.png +0 -0
- package/basic-react-native-declarative/assets/favicon.png +0 -0
- package/basic-react-native-declarative/assets/icon.png +0 -0
- package/basic-react-native-declarative/assets/splash-icon.png +0 -0
- package/basic-react-native-declarative/babel.config.js +16 -0
- package/basic-react-native-declarative/index.ts +22 -0
- package/basic-react-native-declarative/metro.config.js +7 -0
- package/basic-react-native-declarative/package.json +41 -0
- package/basic-react-native-declarative/tests/Application.spec.ts +65 -0
- package/basic-react-native-declarative/tsconfig.json +16 -0
- package/basic-react-native-declarative/vitest.config.ts +27 -0
- package/basic-service-declarative/package.json +4 -4
- package/basic-service-imperative/package.json +4 -4
- package/continuum-showcase/package.json +9 -9
- package/full-react-declarative/package.json +10 -10
- package/full-react-imperative/package.json +10 -10
- package/full-service-declarative/package.json +10 -10
- package/full-service-imperative/package.json +10 -10
- package/package.json +15 -1
- package/standard-react-declarative/package.json +9 -9
- package/standard-react-imperative/package.json +9 -9
- package/standard-service-declarative/package.json +7 -7
- package/standard-service-imperative/package.json +7 -7
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { NATIVE_PLATFORM } from './declarations'
|
|
2
|
+
import { NativeAdapter } from './NativeAdapter'
|
|
3
|
+
import { NativeErrorHandler } from './NativeErrorHandler'
|
|
4
|
+
import { IncomingEventMiddleware, ResponseMiddleware } from './middleware'
|
|
5
|
+
import { AdapterConfig, AppConfig, defaultKernelResolver, IBlueprint, StoneBlueprint } from '@stone-js/core'
|
|
6
|
+
import { OutgoingBrowserResponse, OutgoingBrowserResponseOptions } from '@stone-js/browser-core'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Adapter resolver for the native proof-of-concept adapter.
|
|
10
|
+
*
|
|
11
|
+
* @param blueprint - The `IBlueprint` providing configuration and dependencies.
|
|
12
|
+
* @returns A `NativeAdapter` instance.
|
|
13
|
+
*/
|
|
14
|
+
export const nativeAdapterResolver = (blueprint: IBlueprint): NativeAdapter => {
|
|
15
|
+
return NativeAdapter.create(blueprint)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Blueprint for the native proof-of-concept adapter.
|
|
20
|
+
*
|
|
21
|
+
* Activated the canonical way: handed to `@StoneApp(options, [blueprints])`
|
|
22
|
+
* (declarative) or `defineStoneApp(handler, options, [blueprints])`
|
|
23
|
+
* (imperative). Being the only adapter, it is selected automatically.
|
|
24
|
+
*/
|
|
25
|
+
export const nativeAdapterBlueprint: StoneBlueprint = {
|
|
26
|
+
stone: {
|
|
27
|
+
kernel: {
|
|
28
|
+
responseResolver: (options: OutgoingBrowserResponseOptions) => {
|
|
29
|
+
return OutgoingBrowserResponse.create({ ...options, statusCode: options.statusCode ?? 200 })
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
adapters: [
|
|
33
|
+
{
|
|
34
|
+
current: false,
|
|
35
|
+
default: true,
|
|
36
|
+
variant: 'native',
|
|
37
|
+
platform: NATIVE_PLATFORM,
|
|
38
|
+
middleware: [
|
|
39
|
+
{ module: IncomingEventMiddleware, isClass: true, priority: 0 },
|
|
40
|
+
{ module: ResponseMiddleware, isClass: true, priority: 10 }
|
|
41
|
+
],
|
|
42
|
+
resolver: nativeAdapterResolver,
|
|
43
|
+
eventHandlerResolver: defaultKernelResolver,
|
|
44
|
+
events: [],
|
|
45
|
+
errorHandlers: {
|
|
46
|
+
default: { module: NativeErrorHandler, isClass: true }
|
|
47
|
+
}
|
|
48
|
+
} as unknown as AdapterConfig
|
|
49
|
+
]
|
|
50
|
+
} as Partial<AppConfig> as AppConfig
|
|
51
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { OutgoingBrowserResponse } from '@stone-js/browser-core'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A render listener: receives the kernel's outgoing response for display.
|
|
5
|
+
*/
|
|
6
|
+
export type NativeRenderListener = (response: OutgoingBrowserResponse) => void
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* An error listener: receives adapter-level errors for display.
|
|
10
|
+
*/
|
|
11
|
+
export type NativeErrorListener = (error: Error) => void
|
|
12
|
+
|
|
13
|
+
let renderListener: NativeRenderListener | undefined
|
|
14
|
+
let errorListener: NativeErrorListener | undefined
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Register the render effect target. In this proof of concept the target is
|
|
18
|
+
* the React root component's state; the future `@stone-js/use-react-native`
|
|
19
|
+
* response middleware will push into the native navigation stack instead.
|
|
20
|
+
*
|
|
21
|
+
* @param listener - The render listener.
|
|
22
|
+
*/
|
|
23
|
+
export function onNativeRender (listener: NativeRenderListener): void {
|
|
24
|
+
renderListener = listener
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Register the error display target.
|
|
29
|
+
*
|
|
30
|
+
* @param listener - The error listener.
|
|
31
|
+
*/
|
|
32
|
+
export function onNativeError (listener: NativeErrorListener): void {
|
|
33
|
+
errorListener = listener
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Push an outgoing response to the registered render target.
|
|
38
|
+
*
|
|
39
|
+
* @param response - The kernel's outgoing response.
|
|
40
|
+
*/
|
|
41
|
+
export function emitNativeRender (response: OutgoingBrowserResponse): void {
|
|
42
|
+
renderListener?.(response)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Push an error to the registered error target.
|
|
47
|
+
*
|
|
48
|
+
* @param error - The error to display.
|
|
49
|
+
*/
|
|
50
|
+
export function emitNativeError (error: Error): void {
|
|
51
|
+
errorListener?.(error)
|
|
52
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Routing } from '@stone-js/router'
|
|
2
|
+
import { LogLevel, StoneApp } from '@stone-js/core'
|
|
3
|
+
import { nativeAdapterBlueprint } from '../adapter/nativeAdapterBlueprint'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Application
|
|
7
|
+
*
|
|
8
|
+
* This is the main application entry point.
|
|
9
|
+
*
|
|
10
|
+
* @Routing() enables the Stone router: incoming navigation events are matched
|
|
11
|
+
* against the route definitions declared by the controllers.
|
|
12
|
+
* @StoneApp() enables the Stone application (required). Extra blueprints are
|
|
13
|
+
* activated through its second argument: here, the native adapter.
|
|
14
|
+
*/
|
|
15
|
+
@Routing()
|
|
16
|
+
@StoneApp({ name: 'Stone.js Native', logger: { level: LogLevel.INFO } }, [nativeAdapterBlueprint])
|
|
17
|
+
export class Application {}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Controller, Match } from '@stone-js/router'
|
|
2
|
+
import { IncomingBrowserEvent } from '@stone-js/browser-core'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The payload every route of this starter returns.
|
|
6
|
+
*/
|
|
7
|
+
export interface WelcomeData {
|
|
8
|
+
message: string
|
|
9
|
+
route: string
|
|
10
|
+
framework: {
|
|
11
|
+
name: string
|
|
12
|
+
tagline: string
|
|
13
|
+
docs: string
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* WelcomeController
|
|
19
|
+
*
|
|
20
|
+
* The routes are matched against the URL carried by each navigation event,
|
|
21
|
+
* exactly like they would be in a browser SPA or behind an HTTP adapter:
|
|
22
|
+
* the domain does not know it is running inside a native application.
|
|
23
|
+
*/
|
|
24
|
+
@Controller()
|
|
25
|
+
export class WelcomeController {
|
|
26
|
+
/**
|
|
27
|
+
* The landing route, dispatched once when the application starts.
|
|
28
|
+
*
|
|
29
|
+
* @returns The welcome payload.
|
|
30
|
+
*/
|
|
31
|
+
@Match('/')
|
|
32
|
+
welcome (): WelcomeData {
|
|
33
|
+
return this.present('Welcome to Stone.js on React Native!', '/')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A parameterized route: the `name` route parameter is read from the event.
|
|
38
|
+
*
|
|
39
|
+
* @param event - The incoming navigation event.
|
|
40
|
+
* @returns The greeting payload.
|
|
41
|
+
*/
|
|
42
|
+
@Match('/hello/:name')
|
|
43
|
+
hello (event: IncomingBrowserEvent): WelcomeData {
|
|
44
|
+
const name = String(event.get<string>('name', 'World'))
|
|
45
|
+
return this.present(`Hello ${name}! Same domain, native screen.`, `/hello/${name}`)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Build the branded payload returned by every route.
|
|
50
|
+
*
|
|
51
|
+
* @param message - The message to display.
|
|
52
|
+
* @param route - The matched route path.
|
|
53
|
+
* @returns The payload.
|
|
54
|
+
*/
|
|
55
|
+
private present (message: string, route: string): WelcomeData {
|
|
56
|
+
return {
|
|
57
|
+
message,
|
|
58
|
+
route,
|
|
59
|
+
framework: {
|
|
60
|
+
name: 'Stone.js',
|
|
61
|
+
tagline: 'The continuum framework',
|
|
62
|
+
docs: 'https://stonejs.dev'
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"expo": {
|
|
3
|
+
"name": "basic-react-native-declarative",
|
|
4
|
+
"slug": "basic-react-native-declarative",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"orientation": "portrait",
|
|
7
|
+
"icon": "./assets/icon.png",
|
|
8
|
+
"userInterfaceStyle": "light",
|
|
9
|
+
"ios": {
|
|
10
|
+
"supportsTablet": true
|
|
11
|
+
},
|
|
12
|
+
"android": {
|
|
13
|
+
"adaptiveIcon": {
|
|
14
|
+
"backgroundColor": "#E6F4FE",
|
|
15
|
+
"foregroundImage": "./assets/android-icon-foreground.png",
|
|
16
|
+
"backgroundImage": "./assets/android-icon-background.png",
|
|
17
|
+
"monochromeImage": "./assets/android-icon-monochrome.png"
|
|
18
|
+
},
|
|
19
|
+
"predictiveBackGestureEnabled": false
|
|
20
|
+
},
|
|
21
|
+
"web": {
|
|
22
|
+
"favicon": "./assets/favicon.png"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stone.js runs on TC39 stage-3 decorators (2023-11) with `Symbol.metadata`.
|
|
3
|
+
*
|
|
4
|
+
* `babel-preset-expo` applies `@babel/plugin-proposal-decorators` itself (in
|
|
5
|
+
* legacy mode by default): the decorator semantics are configured through the
|
|
6
|
+
* preset's `decorators` option, never by adding the plugin separately, so the
|
|
7
|
+
* preset keeps its ordering guarantees against the class-field transforms.
|
|
8
|
+
*/
|
|
9
|
+
module.exports = function (api) {
|
|
10
|
+
api.cache(true)
|
|
11
|
+
return {
|
|
12
|
+
presets: [
|
|
13
|
+
['babel-preset-expo', { decorators: { version: '2023-11' } }]
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform polyfills come first, before anything from Stone.js loads.
|
|
3
|
+
*
|
|
4
|
+
* - React Native's built-in `URL` is a stub (no `pathname`, no `searchParams`);
|
|
5
|
+
* Stone.js relies on the full WHATWG URL API, so the polyfill is required.
|
|
6
|
+
* - `TextEncoder` is installed only when the JS engine does not provide it
|
|
7
|
+
* (older Hermes versions).
|
|
8
|
+
*/
|
|
9
|
+
import 'react-native-url-polyfill/auto'
|
|
10
|
+
|
|
11
|
+
if (typeof globalThis.TextEncoder === 'undefined') {
|
|
12
|
+
require('fast-text-encoding')
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
import { registerRootComponent } from 'expo'
|
|
16
|
+
|
|
17
|
+
import App from './App'
|
|
18
|
+
|
|
19
|
+
// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
|
|
20
|
+
// It also ensures that whether you load the app in Expo Go or in a native build,
|
|
21
|
+
// the environment is set up appropriately
|
|
22
|
+
registerRootComponent(App)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const { getDefaultConfig } = require('expo/metro-config')
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pinning the project root keeps Metro scoped to this starter, even when the
|
|
5
|
+
* starter lives inside a larger workspace (as it does in the Stone.js monorepo).
|
|
6
|
+
*/
|
|
7
|
+
module.exports = getDefaultConfig(__dirname)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "basic-react-native-declarative",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "Stone.js's basic starter to create a React Native (Expo) app using the declarative API.",
|
|
6
|
+
"author": "Mr. Stone <evensstone@gmail.com>",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"main": "index.ts",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20.0.0"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"start": "expo start",
|
|
14
|
+
"android": "expo start --android",
|
|
15
|
+
"ios": "expo start --ios",
|
|
16
|
+
"web": "expo start --web",
|
|
17
|
+
"export": "expo export",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:cvg": "npm run test -- --coverage"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@stone-js/browser-core": "^0.8.10",
|
|
24
|
+
"@stone-js/core": "^0.8.10",
|
|
25
|
+
"@stone-js/router": "^0.8.10",
|
|
26
|
+
"expo": "~57.0.14",
|
|
27
|
+
"expo-status-bar": "~57.0.1",
|
|
28
|
+
"fast-text-encoding": "^1.0.6",
|
|
29
|
+
"react": "19.2.3",
|
|
30
|
+
"react-native": "0.86.2",
|
|
31
|
+
"react-native-url-polyfill": "^3.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@babel/plugin-proposal-decorators": "^7.28.0",
|
|
35
|
+
"@types/react": "~19.2.2",
|
|
36
|
+
"@vitest/coverage-v8": "^3.0.9",
|
|
37
|
+
"babel-preset-expo": "^57.0.7",
|
|
38
|
+
"typescript": "~6.0.3",
|
|
39
|
+
"vitest": "^3.0.9"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { stoneApp } from '@stone-js/core'
|
|
2
|
+
import { describe, it, expect, beforeAll } from 'vitest'
|
|
3
|
+
import { Application } from '../app/Application'
|
|
4
|
+
import { OutgoingBrowserResponse } from '@stone-js/browser-core'
|
|
5
|
+
import { nativeEventSource } from '../adapter/NativeEventSource'
|
|
6
|
+
import { WelcomeData, WelcomeController } from '../app/WelcomeController'
|
|
7
|
+
import { onNativeError, onNativeRender } from '../adapter/renderSink'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Behavioral test of the full continuum chain: the exact modules the native
|
|
11
|
+
* application boots (domain + router + native adapter) are booted here under
|
|
12
|
+
* Node, navigation intents are emitted, and the rendered payloads asserted.
|
|
13
|
+
*
|
|
14
|
+
* The adapter is pure JavaScript, so what passes here is what runs on device;
|
|
15
|
+
* only the platform checks (URL polyfill, Hermes) need the real application.
|
|
16
|
+
*
|
|
17
|
+
* The application boots ONCE for the whole suite, like on a device: default
|
|
18
|
+
* blueprints are shared module-level objects, so booting the same modules
|
|
19
|
+
* twice in one process would accumulate route definitions.
|
|
20
|
+
*/
|
|
21
|
+
describe('Stone.js native proof of concept', () => {
|
|
22
|
+
const rendered: OutgoingBrowserResponse[] = []
|
|
23
|
+
const errors: Error[] = []
|
|
24
|
+
|
|
25
|
+
beforeAll(async () => {
|
|
26
|
+
onNativeRender((response) => rendered.push(response))
|
|
27
|
+
onNativeError((error) => errors.push(error))
|
|
28
|
+
await stoneApp({ modules: [Application, WelcomeController] }).run()
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('boots and renders the landing route on startup', () => {
|
|
32
|
+
expect(errors).toHaveLength(0)
|
|
33
|
+
expect(rendered).toHaveLength(1)
|
|
34
|
+
|
|
35
|
+
const payload = rendered[0].content as WelcomeData
|
|
36
|
+
expect(payload.route).toBe('/')
|
|
37
|
+
expect(payload.message).toContain('Welcome to Stone.js on React Native!')
|
|
38
|
+
expect(payload.framework.name).toBe('Stone.js')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('routes a navigation intent with a parameter to the same domain', async () => {
|
|
42
|
+
nativeEventSource.navigate('stone://app/hello/Noowow')
|
|
43
|
+
await new Promise((resolve) => setImmediate(resolve))
|
|
44
|
+
|
|
45
|
+
const payload = rendered.at(-1)?.content as WelcomeData
|
|
46
|
+
expect(payload.route).toBe('/hello/Noowow')
|
|
47
|
+
expect(payload.message).toContain('Hello Noowow!')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('decodes encoded route parameters', async () => {
|
|
51
|
+
nativeEventSource.navigate('stone://app/hello/Mr.%20Stone')
|
|
52
|
+
await new Promise((resolve) => setImmediate(resolve))
|
|
53
|
+
|
|
54
|
+
const payload = rendered.at(-1)?.content as WelcomeData
|
|
55
|
+
expect(payload.message).toContain('Hello Mr. Stone!')
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('surfaces unknown routes through the error chain instead of crashing', async () => {
|
|
59
|
+
nativeEventSource.navigate('stone://app/nowhere')
|
|
60
|
+
await new Promise((resolve) => setImmediate(resolve))
|
|
61
|
+
|
|
62
|
+
const lastPayload = rendered.at(-1)?.content as WelcomeData | undefined
|
|
63
|
+
expect(lastPayload?.route === '/nowhere').toBe(false)
|
|
64
|
+
})
|
|
65
|
+
})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "expo/tsconfig.base",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"strict": true,
|
|
5
|
+
"experimentalDecorators": true,
|
|
6
|
+
"types": ["vitest/globals"]
|
|
7
|
+
},
|
|
8
|
+
"include": [
|
|
9
|
+
"app",
|
|
10
|
+
"adapter",
|
|
11
|
+
"tests",
|
|
12
|
+
"App.tsx",
|
|
13
|
+
"index.ts",
|
|
14
|
+
"vitest.config.ts"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
// `experimentalDecorators` is enabled in tsconfig.json for tsc TYPING only
|
|
5
|
+
// (the framework types its decorators with the legacy signatures). At
|
|
6
|
+
// RUNTIME Stone.js requires standard 2023-11 decorators, so esbuild must
|
|
7
|
+
// ignore that flag and emit the standard semantics, `Symbol.metadata`
|
|
8
|
+
// included (esbuild 0.25+ implements them correctly on its own).
|
|
9
|
+
esbuild: {
|
|
10
|
+
tsconfigRaw: {
|
|
11
|
+
compilerOptions: {
|
|
12
|
+
experimentalDecorators: false
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
test: {
|
|
17
|
+
globals: true,
|
|
18
|
+
environment: 'node',
|
|
19
|
+
include: ['./tests/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
|
|
20
|
+
coverage: {
|
|
21
|
+
provider: 'v8',
|
|
22
|
+
include: ['app/**/*.ts', 'adapter/**/*.ts'],
|
|
23
|
+
reporter: ['text', 'html'],
|
|
24
|
+
reportsDirectory: './coverage'
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
})
|
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
"test:cvg": "stone test --coverage"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@stone-js/core": "^0.8.
|
|
22
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
21
|
+
"@stone-js/core": "^0.8.10",
|
|
22
|
+
"@stone-js/node-http-adapter": "^0.8.10"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
26
26
|
"@babel/preset-env": "^7.26.9",
|
|
27
27
|
"@babel/preset-typescript": "^7.27.0",
|
|
28
|
-
"@stone-js/cli": "^0.8.
|
|
29
|
-
"@stone-js/testing": "^0.8.
|
|
28
|
+
"@stone-js/cli": "^0.8.10",
|
|
29
|
+
"@stone-js/testing": "^0.8.10",
|
|
30
30
|
"@types/node": "^24.0.7",
|
|
31
31
|
"@vitest/coverage-v8": "^3.0.9",
|
|
32
32
|
"vitest": "^3.0.9"
|
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
"test:cvg": "stone test --coverage"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@stone-js/core": "^0.8.
|
|
22
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
21
|
+
"@stone-js/core": "^0.8.10",
|
|
22
|
+
"@stone-js/node-http-adapter": "^0.8.10"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
26
26
|
"@babel/preset-env": "^7.26.9",
|
|
27
27
|
"@babel/preset-typescript": "^7.27.0",
|
|
28
|
-
"@stone-js/cli": "^0.8.
|
|
29
|
-
"@stone-js/testing": "^0.8.
|
|
28
|
+
"@stone-js/cli": "^0.8.10",
|
|
29
|
+
"@stone-js/testing": "^0.8.10",
|
|
30
30
|
"@types/node": "^24.0.7",
|
|
31
31
|
"@vitest/coverage-v8": "^3.0.9",
|
|
32
32
|
"vitest": "^3.0.9"
|
|
@@ -15,20 +15,20 @@
|
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"react": "^19.0.0",
|
|
17
17
|
"react-dom": "^19.0.0",
|
|
18
|
-
"@stone-js/core": "^0.8.
|
|
19
|
-
"@stone-js/router": "^0.8.
|
|
20
|
-
"@stone-js/use-react": "^0.8.
|
|
21
|
-
"@stone-js/http-core": "^0.8.
|
|
22
|
-
"@stone-js/pipeline": "^0.8.
|
|
23
|
-
"@stone-js/browser-adapter": "^0.8.
|
|
24
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
18
|
+
"@stone-js/core": "^0.8.10",
|
|
19
|
+
"@stone-js/router": "^0.8.10",
|
|
20
|
+
"@stone-js/use-react": "^0.8.10",
|
|
21
|
+
"@stone-js/http-core": "^0.8.10",
|
|
22
|
+
"@stone-js/pipeline": "^0.8.10",
|
|
23
|
+
"@stone-js/browser-adapter": "^0.8.10",
|
|
24
|
+
"@stone-js/node-http-adapter": "^0.8.10"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
28
28
|
"@babel/preset-env": "^7.26.9",
|
|
29
29
|
"@babel/preset-typescript": "^7.27.0",
|
|
30
|
-
"@stone-js/cli": "^0.8.
|
|
31
|
-
"@stone-js/testing": "^0.8.
|
|
30
|
+
"@stone-js/cli": "^0.8.10",
|
|
31
|
+
"@stone-js/testing": "^0.8.10",
|
|
32
32
|
"@types/node": "^24.0.7",
|
|
33
33
|
"@types/react": "^19.0.7",
|
|
34
34
|
"@types/react-dom": "^19.0.3",
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
"test:cvg": "stone test --coverage"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@stone-js/env": "^0.8.
|
|
22
|
-
"@stone-js/http-core": "^0.8.
|
|
23
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
24
|
-
"@stone-js/router": "^0.8.
|
|
25
|
-
"@stone-js/filesystem": "^0.8.
|
|
26
|
-
"@stone-js/core": "^0.8.
|
|
27
|
-
"@stone-js/use-react": "^0.8.
|
|
28
|
-
"@stone-js/browser-adapter": "^0.8.
|
|
21
|
+
"@stone-js/env": "^0.8.10",
|
|
22
|
+
"@stone-js/http-core": "^0.8.10",
|
|
23
|
+
"@stone-js/node-http-adapter": "^0.8.10",
|
|
24
|
+
"@stone-js/router": "^0.8.10",
|
|
25
|
+
"@stone-js/filesystem": "^0.8.10",
|
|
26
|
+
"@stone-js/core": "^0.8.10",
|
|
27
|
+
"@stone-js/use-react": "^0.8.10",
|
|
28
|
+
"@stone-js/browser-adapter": "^0.8.10",
|
|
29
29
|
"axios": "^1.7.9",
|
|
30
30
|
"react": "^19.0.0",
|
|
31
31
|
"react-dom": "^19.0.0"
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
35
35
|
"@babel/preset-env": "^7.26.9",
|
|
36
36
|
"@babel/preset-typescript": "^7.27.0",
|
|
37
|
-
"@stone-js/cli": "^0.8.
|
|
38
|
-
"@stone-js/testing": "^0.8.
|
|
37
|
+
"@stone-js/cli": "^0.8.10",
|
|
38
|
+
"@stone-js/testing": "^0.8.10",
|
|
39
39
|
"@types/axios": "^0.14.4",
|
|
40
40
|
"@types/node": "^24.0.7",
|
|
41
41
|
"@types/react": "^19.0.7",
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
"test:cvg": "stone test --coverage"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@stone-js/env": "^0.8.
|
|
22
|
-
"@stone-js/http-core": "^0.8.
|
|
23
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
24
|
-
"@stone-js/router": "^0.8.
|
|
25
|
-
"@stone-js/filesystem": "^0.8.
|
|
26
|
-
"@stone-js/core": "^0.8.
|
|
27
|
-
"@stone-js/use-react": "^0.8.
|
|
28
|
-
"@stone-js/browser-adapter": "^0.8.
|
|
21
|
+
"@stone-js/env": "^0.8.10",
|
|
22
|
+
"@stone-js/http-core": "^0.8.10",
|
|
23
|
+
"@stone-js/node-http-adapter": "^0.8.10",
|
|
24
|
+
"@stone-js/router": "^0.8.10",
|
|
25
|
+
"@stone-js/filesystem": "^0.8.10",
|
|
26
|
+
"@stone-js/core": "^0.8.10",
|
|
27
|
+
"@stone-js/use-react": "^0.8.10",
|
|
28
|
+
"@stone-js/browser-adapter": "^0.8.10",
|
|
29
29
|
"axios": "^1.7.9",
|
|
30
30
|
"dayjs": "^1.11.13",
|
|
31
31
|
"react": "^19.0.0",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
36
36
|
"@babel/preset-env": "^7.26.9",
|
|
37
37
|
"@babel/preset-typescript": "^7.27.0",
|
|
38
|
-
"@stone-js/cli": "^0.8.
|
|
39
|
-
"@stone-js/testing": "^0.8.
|
|
38
|
+
"@stone-js/cli": "^0.8.10",
|
|
39
|
+
"@stone-js/testing": "^0.8.10",
|
|
40
40
|
"@types/axios": "^0.14.4",
|
|
41
41
|
"@types/node": "^24.0.7",
|
|
42
42
|
"@types/react": "^19.0.7",
|
|
@@ -22,14 +22,14 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@libsql/client": "^0.14.0",
|
|
25
|
-
"@stone-js/core": "^0.8.
|
|
26
|
-
"@stone-js/env": "^0.8.
|
|
27
|
-
"@stone-js/filesystem": "^0.8.
|
|
28
|
-
"@stone-js/http-core": "^0.8.
|
|
29
|
-
"@stone-js/node-cli-adapter": "^0.8.
|
|
30
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
31
|
-
"@stone-js/pipeline": "^0.8.
|
|
32
|
-
"@stone-js/router": "^0.8.
|
|
25
|
+
"@stone-js/core": "^0.8.10",
|
|
26
|
+
"@stone-js/env": "^0.8.10",
|
|
27
|
+
"@stone-js/filesystem": "^0.8.10",
|
|
28
|
+
"@stone-js/http-core": "^0.8.10",
|
|
29
|
+
"@stone-js/node-cli-adapter": "^0.8.10",
|
|
30
|
+
"@stone-js/node-http-adapter": "^0.8.10",
|
|
31
|
+
"@stone-js/pipeline": "^0.8.10",
|
|
32
|
+
"@stone-js/router": "^0.8.10",
|
|
33
33
|
"bcryptjs": "^3.0.2",
|
|
34
34
|
"drizzle-orm": "^0.45.2",
|
|
35
35
|
"jsonwebtoken": "^9.0.2"
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
39
39
|
"@babel/preset-env": "^7.26.9",
|
|
40
40
|
"@babel/preset-typescript": "^7.27.0",
|
|
41
|
-
"@stone-js/cli": "^0.8.
|
|
42
|
-
"@stone-js/testing": "^0.8.
|
|
41
|
+
"@stone-js/cli": "^0.8.10",
|
|
42
|
+
"@stone-js/testing": "^0.8.10",
|
|
43
43
|
"@types/jsonwebtoken": "^9.0.8",
|
|
44
44
|
"@types/node": "^24.0.3",
|
|
45
45
|
"@vitest/coverage-v8": "^3.0.9",
|
|
@@ -22,14 +22,14 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@libsql/client": "^0.14.0",
|
|
25
|
-
"@stone-js/core": "^0.8.
|
|
26
|
-
"@stone-js/env": "^0.8.
|
|
27
|
-
"@stone-js/filesystem": "^0.8.
|
|
28
|
-
"@stone-js/http-core": "^0.8.
|
|
29
|
-
"@stone-js/node-cli-adapter": "^0.8.
|
|
30
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
31
|
-
"@stone-js/pipeline": "^0.8.
|
|
32
|
-
"@stone-js/router": "^0.8.
|
|
25
|
+
"@stone-js/core": "^0.8.10",
|
|
26
|
+
"@stone-js/env": "^0.8.10",
|
|
27
|
+
"@stone-js/filesystem": "^0.8.10",
|
|
28
|
+
"@stone-js/http-core": "^0.8.10",
|
|
29
|
+
"@stone-js/node-cli-adapter": "^0.8.10",
|
|
30
|
+
"@stone-js/node-http-adapter": "^0.8.10",
|
|
31
|
+
"@stone-js/pipeline": "^0.8.10",
|
|
32
|
+
"@stone-js/router": "^0.8.10",
|
|
33
33
|
"bcryptjs": "^3.0.2",
|
|
34
34
|
"drizzle-orm": "^0.45.2",
|
|
35
35
|
"jsonwebtoken": "^9.0.2"
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
39
39
|
"@babel/preset-env": "^7.26.9",
|
|
40
40
|
"@babel/preset-typescript": "^7.27.0",
|
|
41
|
-
"@stone-js/cli": "^0.8.
|
|
42
|
-
"@stone-js/testing": "^0.8.
|
|
41
|
+
"@stone-js/cli": "^0.8.10",
|
|
42
|
+
"@stone-js/testing": "^0.8.10",
|
|
43
43
|
"@types/jsonwebtoken": "^9.0.8",
|
|
44
44
|
"@types/node": "^24.0.3",
|
|
45
45
|
"@vitest/coverage-v8": "^3.0.9",
|