@stone-js/starters 0.8.14 → 0.8.16
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 +6 -6
- package/basic-react-imperative/package.json +6 -6
- package/basic-react-native-declarative/package.json +7 -7
- package/basic-react-native-imperative/package.json +7 -7
- package/basic-service-declarative/package.json +5 -5
- package/basic-service-imperative/package.json +5 -5
- 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/monorepo-declarative/apps/mobile/tests/TaskListScreen.spec.ts +21 -39
- package/monorepo-declarative/apps/mobile/tests/navigation.spec.ts +62 -0
- package/monorepo-declarative/apps/mobile/vitest.config.ts +6 -0
- package/monorepo-declarative/apps/web/package.json +1 -0
- package/monorepo-declarative/apps/web/tests/TaskListPage.spec.ts +2 -1
- package/package.json +1 -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
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"react": "^19.0.0",
|
|
22
22
|
"react-dom": "^19.0.0",
|
|
23
|
-
"@stone-js/core": "^0.8.
|
|
24
|
-
"@stone-js/use-react": "^0.8.
|
|
25
|
-
"@stone-js/browser-adapter": "^0.8.
|
|
23
|
+
"@stone-js/core": "^0.8.16",
|
|
24
|
+
"@stone-js/use-react": "^0.8.16",
|
|
25
|
+
"@stone-js/browser-adapter": "^0.8.16"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
29
29
|
"@babel/preset-env": "^7.26.9",
|
|
30
30
|
"@babel/preset-typescript": "^7.27.0",
|
|
31
|
-
"@stone-js/browser-core": "^0.8.
|
|
32
|
-
"@stone-js/cli": "^0.8.
|
|
33
|
-
"@stone-js/testing": "^0.8.
|
|
31
|
+
"@stone-js/browser-core": "^0.8.16",
|
|
32
|
+
"@stone-js/cli": "^0.8.16",
|
|
33
|
+
"@stone-js/testing": "^0.8.16",
|
|
34
34
|
"@types/node": "^24.0.7",
|
|
35
35
|
"@types/react": "^19.0.7",
|
|
36
36
|
"@types/react-dom": "^19.0.3",
|
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"react": "^19.0.0",
|
|
22
22
|
"react-dom": "^19.0.0",
|
|
23
|
-
"@stone-js/core": "^0.8.
|
|
24
|
-
"@stone-js/use-react": "^0.8.
|
|
25
|
-
"@stone-js/browser-adapter": "^0.8.
|
|
23
|
+
"@stone-js/core": "^0.8.16",
|
|
24
|
+
"@stone-js/use-react": "^0.8.16",
|
|
25
|
+
"@stone-js/browser-adapter": "^0.8.16"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
29
29
|
"@babel/preset-env": "^7.26.9",
|
|
30
30
|
"@babel/preset-typescript": "^7.27.0",
|
|
31
|
-
"@stone-js/browser-core": "^0.8.
|
|
32
|
-
"@stone-js/cli": "^0.8.
|
|
33
|
-
"@stone-js/testing": "^0.8.
|
|
31
|
+
"@stone-js/browser-core": "^0.8.16",
|
|
32
|
+
"@stone-js/cli": "^0.8.16",
|
|
33
|
+
"@stone-js/testing": "^0.8.16",
|
|
34
34
|
"@types/node": "^24.0.7",
|
|
35
35
|
"@types/react": "^19.0.7",
|
|
36
36
|
"@types/react-dom": "^19.0.3",
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"test:cvg": "npm run test -- --coverage"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@stone-js/browser-core": "^0.8.
|
|
25
|
-
"@stone-js/core": "^0.8.
|
|
26
|
-
"@stone-js/react-native-adapter": "^0.8.
|
|
27
|
-
"@stone-js/router": "^0.8.
|
|
28
|
-
"@stone-js/use-react-native": "^0.8.
|
|
24
|
+
"@stone-js/browser-core": "^0.8.16",
|
|
25
|
+
"@stone-js/core": "^0.8.16",
|
|
26
|
+
"@stone-js/react-native-adapter": "^0.8.16",
|
|
27
|
+
"@stone-js/router": "^0.8.16",
|
|
28
|
+
"@stone-js/use-react-native": "^0.8.16",
|
|
29
29
|
"expo": "~57.0.14",
|
|
30
30
|
"expo-status-bar": "~57.0.1",
|
|
31
31
|
"fast-text-encoding": "^1.0.6",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@babel/plugin-proposal-decorators": "^7.28.0",
|
|
38
|
-
"@stone-js/cli": "^0.8.
|
|
39
|
-
"@stone-js/testing": "^0.8.
|
|
38
|
+
"@stone-js/cli": "^0.8.16",
|
|
39
|
+
"@stone-js/testing": "^0.8.16",
|
|
40
40
|
"@types/react": "~19.2.2",
|
|
41
41
|
"@vitest/coverage-v8": "^3.0.9",
|
|
42
42
|
"babel-preset-expo": "^57.0.7",
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"test:cvg": "npm run test -- --coverage"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@stone-js/browser-core": "^0.8.
|
|
25
|
-
"@stone-js/core": "^0.8.
|
|
26
|
-
"@stone-js/react-native-adapter": "^0.8.
|
|
27
|
-
"@stone-js/router": "^0.8.
|
|
28
|
-
"@stone-js/use-react-native": "^0.8.
|
|
24
|
+
"@stone-js/browser-core": "^0.8.16",
|
|
25
|
+
"@stone-js/core": "^0.8.16",
|
|
26
|
+
"@stone-js/react-native-adapter": "^0.8.16",
|
|
27
|
+
"@stone-js/router": "^0.8.16",
|
|
28
|
+
"@stone-js/use-react-native": "^0.8.16",
|
|
29
29
|
"expo": "~57.0.14",
|
|
30
30
|
"expo-status-bar": "~57.0.1",
|
|
31
31
|
"fast-text-encoding": "^1.0.6",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@babel/plugin-proposal-decorators": "^7.28.0",
|
|
38
|
-
"@stone-js/cli": "^0.8.
|
|
39
|
-
"@stone-js/testing": "^0.8.
|
|
38
|
+
"@stone-js/cli": "^0.8.16",
|
|
39
|
+
"@stone-js/testing": "^0.8.16",
|
|
40
40
|
"@types/react": "~19.2.2",
|
|
41
41
|
"@vitest/coverage-v8": "^3.0.9",
|
|
42
42
|
"babel-preset-expo": "^57.0.7",
|
|
@@ -18,16 +18,16 @@
|
|
|
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.16",
|
|
22
|
+
"@stone-js/node-http-adapter": "^0.8.16"
|
|
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/http-core": "^0.8.
|
|
30
|
-
"@stone-js/testing": "^0.8.
|
|
28
|
+
"@stone-js/cli": "^0.8.16",
|
|
29
|
+
"@stone-js/http-core": "^0.8.16",
|
|
30
|
+
"@stone-js/testing": "^0.8.16",
|
|
31
31
|
"@types/node": "^24.0.7",
|
|
32
32
|
"@vitest/coverage-v8": "^3.0.9",
|
|
33
33
|
"vitest": "^3.0.9"
|
|
@@ -18,16 +18,16 @@
|
|
|
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.16",
|
|
22
|
+
"@stone-js/node-http-adapter": "^0.8.16"
|
|
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/http-core": "^0.8.
|
|
30
|
-
"@stone-js/testing": "^0.8.
|
|
28
|
+
"@stone-js/cli": "^0.8.16",
|
|
29
|
+
"@stone-js/http-core": "^0.8.16",
|
|
30
|
+
"@stone-js/testing": "^0.8.16",
|
|
31
31
|
"@types/node": "^24.0.7",
|
|
32
32
|
"@vitest/coverage-v8": "^3.0.9",
|
|
33
33
|
"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.16",
|
|
19
|
+
"@stone-js/router": "^0.8.16",
|
|
20
|
+
"@stone-js/use-react": "^0.8.16",
|
|
21
|
+
"@stone-js/http-core": "^0.8.16",
|
|
22
|
+
"@stone-js/pipeline": "^0.8.16",
|
|
23
|
+
"@stone-js/browser-adapter": "^0.8.16",
|
|
24
|
+
"@stone-js/node-http-adapter": "^0.8.16"
|
|
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.16",
|
|
31
|
+
"@stone-js/testing": "^0.8.16",
|
|
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.16",
|
|
22
|
+
"@stone-js/http-core": "^0.8.16",
|
|
23
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
24
|
+
"@stone-js/router": "^0.8.16",
|
|
25
|
+
"@stone-js/filesystem": "^0.8.16",
|
|
26
|
+
"@stone-js/core": "^0.8.16",
|
|
27
|
+
"@stone-js/use-react": "^0.8.16",
|
|
28
|
+
"@stone-js/browser-adapter": "^0.8.16",
|
|
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.16",
|
|
38
|
+
"@stone-js/testing": "^0.8.16",
|
|
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.16",
|
|
22
|
+
"@stone-js/http-core": "^0.8.16",
|
|
23
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
24
|
+
"@stone-js/router": "^0.8.16",
|
|
25
|
+
"@stone-js/filesystem": "^0.8.16",
|
|
26
|
+
"@stone-js/core": "^0.8.16",
|
|
27
|
+
"@stone-js/use-react": "^0.8.16",
|
|
28
|
+
"@stone-js/browser-adapter": "^0.8.16",
|
|
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.16",
|
|
39
|
+
"@stone-js/testing": "^0.8.16",
|
|
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.16",
|
|
26
|
+
"@stone-js/env": "^0.8.16",
|
|
27
|
+
"@stone-js/filesystem": "^0.8.16",
|
|
28
|
+
"@stone-js/http-core": "^0.8.16",
|
|
29
|
+
"@stone-js/node-cli-adapter": "^0.8.16",
|
|
30
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
31
|
+
"@stone-js/pipeline": "^0.8.16",
|
|
32
|
+
"@stone-js/router": "^0.8.16",
|
|
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.16",
|
|
42
|
+
"@stone-js/testing": "^0.8.16",
|
|
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.16",
|
|
26
|
+
"@stone-js/env": "^0.8.16",
|
|
27
|
+
"@stone-js/filesystem": "^0.8.16",
|
|
28
|
+
"@stone-js/http-core": "^0.8.16",
|
|
29
|
+
"@stone-js/node-cli-adapter": "^0.8.16",
|
|
30
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
31
|
+
"@stone-js/pipeline": "^0.8.16",
|
|
32
|
+
"@stone-js/router": "^0.8.16",
|
|
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.16",
|
|
42
|
+
"@stone-js/testing": "^0.8.16",
|
|
43
43
|
"@types/jsonwebtoken": "^9.0.8",
|
|
44
44
|
"@types/node": "^24.0.3",
|
|
45
45
|
"@vitest/coverage-v8": "^3.0.9",
|
|
@@ -1,54 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { TaskListScreen } from '../app/TaskListScreen'
|
|
5
|
-
import { NavigationSource } from '@stone-js/react-native-adapter'
|
|
1
|
+
import { createTestApp } from '@stone-js/testing'
|
|
2
|
+
import { makeIncomingBrowserEvent } from '@stone-js/testing/browser'
|
|
3
|
+
import { REACT_NATIVE_PLATFORM } from '@stone-js/react-native-adapter'
|
|
6
4
|
|
|
7
5
|
/**
|
|
8
|
-
* The mobile application, booted
|
|
6
|
+
* The mobile application, booted in memory and asked the same questions the web one is asked.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* Read it next to `apps/web/tests/TaskListPage.spec.ts`. Same domain, same assertions, same counts,
|
|
9
|
+
* through two different contexts. That is the claim this repository exists to demonstrate, and it is
|
|
10
|
+
* visible in the tests rather than only in the source.
|
|
13
11
|
*
|
|
14
|
-
*
|
|
12
|
+
* `createTestApp()` discovers `app/**` and substitutes the adapter, which is the architecture rather
|
|
13
|
+
* than a concession to testing: the domain is written once and the context is chosen at run time, so
|
|
14
|
+
* under Node the context is a test adapter instead of React Native. What a native application does
|
|
15
|
+
* differently, its navigation stack, is `tests/navigation.spec.ts`.
|
|
15
16
|
*/
|
|
16
17
|
describe('TaskListScreen', () => {
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
it('resolves the task list from the shared domain', async () => {
|
|
19
|
+
const app = await createTestApp({ platform: REACT_NATIVE_PLATFORM })
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
// objects, so booting the same modules twice in one process would accumulate route definitions.
|
|
22
|
-
beforeAll(async () => {
|
|
23
|
-
await stoneApp({
|
|
24
|
-
modules: [
|
|
25
|
-
Application,
|
|
26
|
-
TaskListScreen,
|
|
27
|
-
{ stone: { reactNative: { navigationSource: navigation }, useReactNative: { screenStack: screens } } }
|
|
28
|
-
]
|
|
29
|
-
}).run()
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
const settle = async (): Promise<void> => { await new Promise((resolve) => setImmediate(resolve)) }
|
|
21
|
+
const response = await app.send(makeIncomingBrowserEvent({ url: 'acme://app/' }))
|
|
33
22
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
expect(
|
|
37
|
-
expect(screens.top()?.title).toBe('1 left · Acme tasks')
|
|
23
|
+
expect(response.statusCode).toBe(200)
|
|
24
|
+
// The head is what a navigator shows in its header, and it carries the count the domain computed.
|
|
25
|
+
expect((response.content as any).head.title).toBe('1 left · Acme tasks')
|
|
38
26
|
})
|
|
39
27
|
|
|
40
28
|
it('toggles a task through the same domain the web app uses', async () => {
|
|
41
|
-
|
|
42
|
-
await settle()
|
|
43
|
-
|
|
44
|
-
expect(screens.top()?.title).toBe('0 left · Acme tasks')
|
|
45
|
-
})
|
|
29
|
+
const app = await createTestApp({ platform: REACT_NATIVE_PLATFORM })
|
|
46
30
|
|
|
47
|
-
|
|
48
|
-
navigation.navigate('acme://app/nowhere')
|
|
49
|
-
await settle()
|
|
31
|
+
const response = await app.send(makeIncomingBrowserEvent({ url: 'acme://app/?toggle=3' }))
|
|
50
32
|
|
|
51
|
-
|
|
52
|
-
expect(
|
|
33
|
+
expect(response.statusCode).toBe(200)
|
|
34
|
+
expect((response.content as any).head.title).toBe('0 left · Acme tasks')
|
|
53
35
|
})
|
|
54
36
|
})
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { stoneApp } from '@stone-js/core'
|
|
2
|
+
import { Application } from '../app/Application'
|
|
3
|
+
import { ScreenStack } from '@stone-js/use-react-native'
|
|
4
|
+
import { TaskListScreen } from '../app/TaskListScreen'
|
|
5
|
+
import { NavigationSource } from '@stone-js/react-native-adapter'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Navigation, with the real adapter this time.
|
|
9
|
+
*
|
|
10
|
+
* `TaskListScreen.spec.ts` asks what a route resolves to, which every platform answers the same way.
|
|
11
|
+
* This asks the native question: what lands on the navigation stack, and in what order. So nothing is
|
|
12
|
+
* substituted. The kernel, the router, the React Native adapter and the renderer are the ones a phone
|
|
13
|
+
* runs; what a device adds is a screen to draw on.
|
|
14
|
+
*
|
|
15
|
+
* Two things are supplied rather than discovered, both through documented configuration: the
|
|
16
|
+
* navigation source, so the test can send a deep link, and the screen stack, so it can read what
|
|
17
|
+
* landed on it.
|
|
18
|
+
*/
|
|
19
|
+
describe('Navigation', () => {
|
|
20
|
+
const screens = ScreenStack.create()
|
|
21
|
+
const navigation = NavigationSource.create({ baseUrl: 'acme://app' })
|
|
22
|
+
|
|
23
|
+
// Booted once for the whole suite, as on a device: the default blueprints are shared module
|
|
24
|
+
// objects, so booting the same modules twice in one process would accumulate route definitions.
|
|
25
|
+
beforeAll(async () => {
|
|
26
|
+
await stoneApp({
|
|
27
|
+
modules: [
|
|
28
|
+
Application,
|
|
29
|
+
TaskListScreen,
|
|
30
|
+
{ stone: { reactNative: { navigationSource: navigation }, useReactNative: { screenStack: screens } } }
|
|
31
|
+
]
|
|
32
|
+
}).run()
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
const settle = async (): Promise<void> => { await new Promise((resolve) => setImmediate(resolve)) }
|
|
36
|
+
|
|
37
|
+
it('puts the task list on the stack at launch, counted by the shared domain', () => {
|
|
38
|
+
expect(screens.size()).toBe(1)
|
|
39
|
+
expect(screens.top()?.path).toBe('/')
|
|
40
|
+
expect(screens.top()?.title).toBe('1 left · Acme tasks')
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('routes a deep link through the same domain the web app uses', async () => {
|
|
44
|
+
navigation.navigate('acme://app/?toggle=3')
|
|
45
|
+
await settle()
|
|
46
|
+
|
|
47
|
+
expect(screens.top()?.title).toBe('0 left · Acme tasks')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('re-resolving the current route replaces it instead of stacking a duplicate', () => {
|
|
51
|
+
// A user walking back must not find two identical screens, so the stack swaps the top.
|
|
52
|
+
expect(screens.size()).toBe(1)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('surfaces an unknown route instead of crashing', async () => {
|
|
56
|
+
navigation.navigate('acme://app/nowhere')
|
|
57
|
+
await settle()
|
|
58
|
+
|
|
59
|
+
// An error page is still a screen: the application stays up and shows something.
|
|
60
|
+
expect(screens.top()?.path).not.toBe('/')
|
|
61
|
+
})
|
|
62
|
+
})
|
|
@@ -22,6 +22,12 @@ export default defineConfig({
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
test: {
|
|
25
|
+
// `createTestApp()` discovers the application's modules by importing them at run time. Vitest
|
|
26
|
+
// externalises dependencies from `node_modules`, and an externalised module's `import()` is
|
|
27
|
+
// Node's, which cannot load a `.ts` file. Inlining the package puts those imports back through
|
|
28
|
+
// Vite's transform. `stone test` does this for you; a project running Vitest directly, as an
|
|
29
|
+
// Expo project does, states it here.
|
|
30
|
+
server: { deps: { inline: ['@stone-js/testing'] } },
|
|
25
31
|
globals: true,
|
|
26
32
|
environment: 'node',
|
|
27
33
|
include: ['./tests/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
|
package/package.json
CHANGED
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"react": "^19.0.0",
|
|
22
22
|
"react-dom": "^19.0.0",
|
|
23
|
-
"@stone-js/use-react": "^0.8.
|
|
24
|
-
"@stone-js/browser-adapter": "^0.8.
|
|
25
|
-
"@stone-js/pipeline": "^0.8.
|
|
26
|
-
"@stone-js/http-core": "^0.8.
|
|
27
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
28
|
-
"@stone-js/router": "^0.8.
|
|
29
|
-
"@stone-js/core": "^0.8.
|
|
23
|
+
"@stone-js/use-react": "^0.8.16",
|
|
24
|
+
"@stone-js/browser-adapter": "^0.8.16",
|
|
25
|
+
"@stone-js/pipeline": "^0.8.16",
|
|
26
|
+
"@stone-js/http-core": "^0.8.16",
|
|
27
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
28
|
+
"@stone-js/router": "^0.8.16",
|
|
29
|
+
"@stone-js/core": "^0.8.16"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
33
33
|
"@babel/preset-env": "^7.26.9",
|
|
34
34
|
"@babel/preset-typescript": "^7.27.0",
|
|
35
|
-
"@stone-js/cli": "^0.8.
|
|
36
|
-
"@stone-js/testing": "^0.8.
|
|
35
|
+
"@stone-js/cli": "^0.8.16",
|
|
36
|
+
"@stone-js/testing": "^0.8.16",
|
|
37
37
|
"@types/node": "^24.0.7",
|
|
38
38
|
"@types/react": "^19.0.7",
|
|
39
39
|
"@types/react-dom": "^19.0.3",
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"react": "^19.0.0",
|
|
22
22
|
"react-dom": "^19.0.0",
|
|
23
|
-
"@stone-js/use-react": "^0.8.
|
|
24
|
-
"@stone-js/browser-adapter": "^0.8.
|
|
25
|
-
"@stone-js/pipeline": "^0.8.
|
|
26
|
-
"@stone-js/http-core": "^0.8.
|
|
27
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
28
|
-
"@stone-js/router": "^0.8.
|
|
29
|
-
"@stone-js/core": "^0.8.
|
|
23
|
+
"@stone-js/use-react": "^0.8.16",
|
|
24
|
+
"@stone-js/browser-adapter": "^0.8.16",
|
|
25
|
+
"@stone-js/pipeline": "^0.8.16",
|
|
26
|
+
"@stone-js/http-core": "^0.8.16",
|
|
27
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
28
|
+
"@stone-js/router": "^0.8.16",
|
|
29
|
+
"@stone-js/core": "^0.8.16"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
33
33
|
"@babel/preset-env": "^7.26.9",
|
|
34
34
|
"@babel/preset-typescript": "^7.27.0",
|
|
35
|
-
"@stone-js/cli": "^0.8.
|
|
36
|
-
"@stone-js/testing": "^0.8.
|
|
35
|
+
"@stone-js/cli": "^0.8.16",
|
|
36
|
+
"@stone-js/testing": "^0.8.16",
|
|
37
37
|
"@types/node": "^24.0.7",
|
|
38
38
|
"@types/react": "^19.0.7",
|
|
39
39
|
"@types/react-dom": "^19.0.3",
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"test:cvg": "stone test --coverage"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@stone-js/pipeline": "^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/core": "^0.8.
|
|
21
|
+
"@stone-js/pipeline": "^0.8.16",
|
|
22
|
+
"@stone-js/http-core": "^0.8.16",
|
|
23
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
24
|
+
"@stone-js/router": "^0.8.16",
|
|
25
|
+
"@stone-js/core": "^0.8.16"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@babel/plugin-proposal-decorators": "^7.25.9",
|
|
29
29
|
"@babel/preset-env": "^7.26.9",
|
|
30
30
|
"@babel/preset-typescript": "^7.27.0",
|
|
31
|
-
"@stone-js/cli": "^0.8.
|
|
32
|
-
"@stone-js/testing": "^0.8.
|
|
31
|
+
"@stone-js/cli": "^0.8.16",
|
|
32
|
+
"@stone-js/testing": "^0.8.16",
|
|
33
33
|
"@types/node": "^24.0.7",
|
|
34
34
|
"@vitest/coverage-v8": "^3.0.9",
|
|
35
35
|
"vitest": "^3.0.9"
|
|
@@ -17,18 +17,18 @@
|
|
|
17
17
|
"test:cvg": "stone test --coverage"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@stone-js/pipeline": "^0.8.
|
|
21
|
-
"@stone-js/http-core": "^0.8.
|
|
22
|
-
"@stone-js/node-http-adapter": "^0.8.
|
|
23
|
-
"@stone-js/router": "^0.8.
|
|
24
|
-
"@stone-js/core": "^0.8.
|
|
20
|
+
"@stone-js/pipeline": "^0.8.16",
|
|
21
|
+
"@stone-js/http-core": "^0.8.16",
|
|
22
|
+
"@stone-js/node-http-adapter": "^0.8.16",
|
|
23
|
+
"@stone-js/router": "^0.8.16",
|
|
24
|
+
"@stone-js/core": "^0.8.16"
|
|
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.16",
|
|
31
|
+
"@stone-js/testing": "^0.8.16",
|
|
32
32
|
"@types/node": "^24.0.7",
|
|
33
33
|
"@vitest/coverage-v8": "^3.0.9",
|
|
34
34
|
"vitest": "^3.0.9"
|