@tinycld/bootstrap 1.0.1 → 1.1.1
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/dist/bootstrap-tooling.js +139 -30
- package/dist/bootstrap-tooling.js.map +1 -1
- package/dist/index.js +55 -21
- package/dist/index.js.map +1 -1
- package/dist/layout.js +7 -20
- package/dist/layout.js.map +1 -1
- package/dist/link-package.js +78 -62
- package/dist/link-package.js.map +1 -1
- package/dist/prompts.js +3 -3
- package/dist/prompts.js.map +1 -1
- package/package.json +1 -1
- package/templates/full/package.json +7 -1
- package/templates/full/playwright.config.ts +20 -0
- package/templates/full/server/go.mod +2 -2
- package/templates/settings-only/package.json +6 -1
- package/templates/shared/.github/workflows/ci.yml +62 -38
- package/templates/shared/README.md +40 -29
- package/templates/shared/tsconfig.json +5 -14
- package/templates/shared/vitest.config.ts +16 -0
- package/templates/workspace/.go-version +1 -0
- package/templates/workspace/.node-version +1 -0
- package/templates/workspace/tests/expo-clipboard-stub.ts +20 -0
- package/templates/workspace/tests/expo-router-stub.ts +48 -0
- package/templates/workspace/tests/lucide-react-native-stub.cjs +73 -0
- package/templates/workspace/tests/tinycld.packages.test.ts +54 -0
- package/templates/workspace/tests/unit-setup.ts +55 -0
- package/templates/workspace/tinycld.packages.ts +75 -0
- package/templates/workspace/vitest.config.ts +104 -0
package/dist/link-package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-package.js","sourceRoot":"","sources":["../src/link-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"link-package.js","sourceRoot":"","sources":["../src/link-package.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.js
CHANGED
|
@@ -165,9 +165,9 @@ async function resolveTarget(fromArgv, slug, skipPrompts) {
|
|
|
165
165
|
return abs;
|
|
166
166
|
}
|
|
167
167
|
// No --target: pick a sensible default based on the cwd's existing layout.
|
|
168
|
-
// If cwd
|
|
169
|
-
//
|
|
170
|
-
//
|
|
168
|
+
// If cwd is itself a workspace root, attach the new package as a direct
|
|
169
|
+
// child `<cwd>/<slug>`. Otherwise bootstrap a wrapper workspace under
|
|
170
|
+
// `<cwd>/tinycld-<slug>/` and place the package inside it.
|
|
171
171
|
const layout = detectLayout(slug);
|
|
172
172
|
const defaultAbs = layout.targetDir;
|
|
173
173
|
const defaultDisplay = `./${relative(process.cwd(), defaultAbs) || slug}`;
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -17,7 +17,13 @@
|
|
|
17
17
|
"./components/*": "./tinycld/{{PKG_SLUG}}/components/*.tsx"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"typecheck": "
|
|
20
|
+
"typecheck": "tinycld-pkg typecheck",
|
|
21
|
+
"test": "tinycld-pkg test",
|
|
22
|
+
"test:e2e": "tinycld-pkg test:e2e",
|
|
23
|
+
"check": "tinycld-pkg check"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@tinycld/package-scripts": "*"
|
|
21
27
|
},
|
|
22
28
|
"peerDependencies": {
|
|
23
29
|
"react": ">=19",
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { defineConfig } from '@playwright/test'
|
|
3
|
+
import appConfig from '../app/playwright.config'
|
|
4
|
+
|
|
5
|
+
// Package-scoped Playwright: inherit the app shell's webServer + browser config,
|
|
6
|
+
// then point testDir at THIS package's tests/e2e through the app shell's
|
|
7
|
+
// node_modules symlink. Routing via node_modules (not this repo's real path)
|
|
8
|
+
// keeps node resolution walking up into the app shell's install, so
|
|
9
|
+
// @playwright/test and other deps resolve there — not from a (nonexistent)
|
|
10
|
+
// local node_modules.
|
|
11
|
+
// The @tinycld/{{PKG_SLUG}} symlink lives in the workspace-root node_modules (deps
|
|
12
|
+
// hoist there in this layout). Routing testDir through it keeps node resolution
|
|
13
|
+
// walking up into the install where @playwright/test lives.
|
|
14
|
+
const WS_ROOT = path.resolve(import.meta.dirname, '..')
|
|
15
|
+
const TEST_DIR = path.join(WS_ROOT, 'node_modules', '@tinycld', '{{PKG_SLUG}}', 'tests', 'e2e')
|
|
16
|
+
|
|
17
|
+
export default defineConfig({
|
|
18
|
+
...appConfig,
|
|
19
|
+
testDir: TEST_DIR,
|
|
20
|
+
})
|
|
@@ -3,8 +3,8 @@ module {{GO_MODULE}}
|
|
|
3
3
|
go 1.25.0
|
|
4
4
|
|
|
5
5
|
require (
|
|
6
|
-
github.com/pocketbase/pocketbase v0.
|
|
6
|
+
github.com/pocketbase/pocketbase v0.37.5
|
|
7
7
|
tinycld.org/core v0.0.0
|
|
8
8
|
)
|
|
9
9
|
|
|
10
|
-
replace tinycld.org/core => ../../
|
|
10
|
+
replace tinycld.org/core => ../../core/server
|
|
@@ -13,7 +13,12 @@
|
|
|
13
13
|
"./hooks/*": "./tinycld/{{PKG_SLUG}}/hooks/*.ts"
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
|
-
"typecheck": "
|
|
16
|
+
"typecheck": "tinycld-pkg typecheck",
|
|
17
|
+
"test": "tinycld-pkg test",
|
|
18
|
+
"check": "tinycld-pkg check"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@tinycld/package-scripts": "*"
|
|
17
22
|
},
|
|
18
23
|
"peerDependencies": {
|
|
19
24
|
"react": ">=19",
|
|
@@ -7,53 +7,77 @@ on:
|
|
|
7
7
|
branches: [main]
|
|
8
8
|
|
|
9
9
|
env:
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
PACKAGE: {{PKG_SLUG}}
|
|
11
|
+
TEST_USER_LOGIN: user@tinycld.org
|
|
12
|
+
TEST_USER_PW: TestUser1234!
|
|
13
|
+
ADMIN_USER_LOGIN: admin@tinycld.org
|
|
14
|
+
ADMIN_USER_PW: AdminPass1234!
|
|
12
15
|
|
|
13
16
|
jobs:
|
|
14
|
-
|
|
15
|
-
name:
|
|
17
|
+
check:
|
|
18
|
+
name: Typecheck & Unit
|
|
16
19
|
runs-on: ubuntu-latest
|
|
17
20
|
steps:
|
|
21
|
+
# 1. The workspace meta-repo becomes the job root.
|
|
18
22
|
- uses: actions/checkout@v5
|
|
19
23
|
with:
|
|
20
|
-
|
|
24
|
+
repository: tinycld/workspace
|
|
25
|
+
ref: main
|
|
26
|
+
path: ws
|
|
27
|
+
# 2. This PR's code, checked out into the member slot.
|
|
21
28
|
- uses: actions/checkout@v5
|
|
22
29
|
with:
|
|
23
|
-
|
|
24
|
-
ref: ${{ env.APP_REF }}
|
|
25
|
-
path: tinycld
|
|
30
|
+
path: ws/${{ env.PACKAGE }}
|
|
26
31
|
- uses: actions/setup-node@v5
|
|
27
32
|
with:
|
|
28
|
-
node-version-file:
|
|
33
|
+
node-version-file: ws/.node-version
|
|
29
34
|
cache: npm
|
|
30
|
-
cache-dependency-path:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- name:
|
|
41
|
-
working-directory:
|
|
42
|
-
run: npm
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
run: npm run lint
|
|
47
|
-
|
|
48
|
-
# Typecheck runs from inside tinycld so module resolution sees the
|
|
49
|
-
# full app-shell tree (uniwind augments, expo types, etc) — running
|
|
50
|
-
# tsc standalone in the package directory misses those.
|
|
51
|
-
- name: Typecheck (full app shell, package included via link)
|
|
52
|
-
working-directory: tinycld
|
|
53
|
-
env:
|
|
54
|
-
NODE_OPTIONS: --preserve-symlinks
|
|
55
|
-
run: npm run typecheck
|
|
35
|
+
cache-dependency-path: ws/package-lock.json
|
|
36
|
+
- uses: actions/setup-go@v6
|
|
37
|
+
with:
|
|
38
|
+
go-version-file: ws/.go-version
|
|
39
|
+
# 3. Clone app + core (the PR's PACKAGE is already checked out into its
|
|
40
|
+
# slot; bootstrap --tooling skips dirs that already exist). A sibling
|
|
41
|
+
# only needs app + core + itself to typecheck + unit-test.
|
|
42
|
+
- name: Assemble workspace (app + core)
|
|
43
|
+
working-directory: ws
|
|
44
|
+
run: TINYCLD_REPO_BASE=https://github.com/tinycld npx @tinycld/bootstrap@latest --tooling
|
|
45
|
+
- name: Install (workspace root)
|
|
46
|
+
working-directory: ws
|
|
47
|
+
run: npm install
|
|
48
|
+
- name: Typecheck + unit
|
|
49
|
+
working-directory: ws/${{ env.PACKAGE }}
|
|
50
|
+
run: npx tinycld-pkg check
|
|
56
51
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
e2e:
|
|
53
|
+
name: E2E
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v5
|
|
57
|
+
with:
|
|
58
|
+
repository: tinycld/workspace
|
|
59
|
+
ref: main
|
|
60
|
+
path: ws
|
|
61
|
+
- uses: actions/checkout@v5
|
|
62
|
+
with:
|
|
63
|
+
path: ws/${{ env.PACKAGE }}
|
|
64
|
+
- uses: actions/setup-node@v5
|
|
65
|
+
with:
|
|
66
|
+
node-version-file: ws/.node-version
|
|
67
|
+
cache: npm
|
|
68
|
+
cache-dependency-path: ws/package-lock.json
|
|
69
|
+
- uses: actions/setup-go@v6
|
|
70
|
+
with:
|
|
71
|
+
go-version-file: ws/.go-version
|
|
72
|
+
- name: Assemble workspace (app + core)
|
|
73
|
+
working-directory: ws
|
|
74
|
+
run: TINYCLD_REPO_BASE=https://github.com/tinycld npx @tinycld/bootstrap@latest --tooling
|
|
75
|
+
- name: Install (workspace root)
|
|
76
|
+
working-directory: ws
|
|
77
|
+
run: npm install
|
|
78
|
+
- name: Install Playwright browsers
|
|
79
|
+
working-directory: ws/app
|
|
80
|
+
run: npx playwright install --with-deps chromium
|
|
81
|
+
- name: E2E
|
|
82
|
+
working-directory: ws/${{ env.PACKAGE }}
|
|
83
|
+
run: npx tinycld-pkg test:e2e
|
|
@@ -2,53 +2,64 @@
|
|
|
2
2
|
|
|
3
3
|
{{PKG_DESCRIPTION}}
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A feature package for the [tinycld](https://tinycld.org/) ecosystem. It lives in
|
|
6
|
+
its own git repo and is developed as a **workspace member** alongside the app
|
|
7
|
+
shell (`app`), `@tinycld/core` (its own standalone repo, cloned as a sibling —
|
|
8
|
+
not bundled), and the other feature packages.
|
|
6
9
|
|
|
7
10
|
## Development
|
|
8
11
|
|
|
12
|
+
The package is one member of a tinycld workspace. To work on it you need a
|
|
13
|
+
workspace root containing at least `app`, `core`, and this package as siblings,
|
|
14
|
+
linked by a single `npm install` at the root.
|
|
15
|
+
|
|
9
16
|
```sh
|
|
10
|
-
#
|
|
11
|
-
cd ~/code/tinycld
|
|
12
|
-
git clone git@github.com:tinycld/tinycld.git
|
|
17
|
+
# In a fresh workspace directory, clone this package into a member slot…
|
|
13
18
|
git clone git@github.com:tinycld/{{PKG_SLUG}}.git
|
|
14
19
|
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
# …then pull in the rest of the workspace tooling (app + core + the root
|
|
21
|
+
# package.json / lockfile). bootstrap --tooling skips dirs that already exist.
|
|
22
|
+
npx @tinycld/bootstrap@latest --tooling
|
|
18
23
|
|
|
19
|
-
# Link
|
|
20
|
-
|
|
24
|
+
# Link every member with one install at the WORKSPACE ROOT (never inside a
|
|
25
|
+
# member — siblings have no node_modules of their own; deps hoist to the root).
|
|
26
|
+
npm install
|
|
21
27
|
|
|
22
|
-
# Run the full stack
|
|
23
|
-
|
|
28
|
+
# Run the full stack (Expo + PocketBase, single-port dev proxy) from the app.
|
|
29
|
+
cd app
|
|
30
|
+
npm run dev
|
|
24
31
|
```
|
|
25
32
|
|
|
26
|
-
##
|
|
33
|
+
## Checks
|
|
27
34
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
none of which a standalone invocation in this package can see. Biome's
|
|
32
|
-
config lives in `tinycld/biome.json` and applies to every linked package
|
|
33
|
-
(there is no `biome.json` in this repo).
|
|
35
|
+
All checks run **scoped to this member** through `tinycld-pkg`, which reuses the
|
|
36
|
+
app shell's biome config, tsconfig base, and vitest/playwright configs (so
|
|
37
|
+
`@tinycld/core/*`, uniwind augments, and PocketBase types all resolve):
|
|
34
38
|
|
|
35
39
|
```sh
|
|
36
|
-
cd
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
cd {{PKG_SLUG}}
|
|
41
|
+
npx tinycld-pkg check # biome + typecheck
|
|
42
|
+
npx tinycld-pkg test # vitest unit tests
|
|
43
|
+
npx tinycld-pkg test:e2e # playwright e2e specs (full preset only — packages with screens)
|
|
40
44
|
```
|
|
41
45
|
|
|
46
|
+
There is no `biome.json` in this repo — biome lives only in the app shell and
|
|
47
|
+
`tinycld-pkg` points it at this member's source.
|
|
48
|
+
|
|
42
49
|
## CI
|
|
43
50
|
|
|
44
|
-
`.github/workflows/ci.yml` runs
|
|
45
|
-
`main` and every PR. It
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
`.github/workflows/ci.yml` runs typecheck, unit tests, and e2e on every push to
|
|
52
|
+
`main` and every PR. It checks out `tinycld/workspace` as the job root, drops
|
|
53
|
+
this PR's code into its member slot, assembles `app` + `core` via
|
|
54
|
+
`@tinycld/bootstrap --tooling`, installs at the workspace root, and runs
|
|
55
|
+
`tinycld-pkg check` / `tinycld-pkg test:e2e` — exactly what a developer runs
|
|
56
|
+
locally.
|
|
48
57
|
|
|
49
58
|
## Package anatomy
|
|
50
59
|
|
|
51
60
|
- `manifest.ts` — the single source of truth for this package's capabilities
|
|
52
|
-
- `package.json` — name, exports map, peer deps
|
|
53
|
-
- `tsconfig.json` —
|
|
54
|
-
- `
|
|
61
|
+
- `package.json` — name, exports map, `tinycld-pkg` scripts, peer deps
|
|
62
|
+
- `tsconfig.json` — extends the app shell's package tsconfig base
|
|
63
|
+
- `vitest.config.ts` (and `playwright.config.ts` — full preset only) — thin configs spreading the app's
|
|
64
|
+
- `tinycld/{{PKG_SLUG}}/` — the package's TypeScript surface (screens, collections, …)
|
|
65
|
+
- `tests/` — vitest unit tests (and Playwright e2e specs — full preset only)
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"extends": "../
|
|
2
|
+
"extends": "../app/tsconfig.package-base.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"baseUrl": ".",
|
|
5
|
-
"rootDir": "..",
|
|
6
5
|
"paths": {
|
|
7
6
|
"~/tinycld/{{PKG_SLUG}}/*": ["./tinycld/{{PKG_SLUG}}/*"],
|
|
8
|
-
"@tinycld/
|
|
9
|
-
"@tinycld/
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
"noEmit": true,
|
|
13
|
-
"preserveSymlinks": false
|
|
7
|
+
"@tinycld/core/*": ["../core/*"],
|
|
8
|
+
"@tinycld/app-generated/*": ["../app/lib/generated/*"]
|
|
9
|
+
}
|
|
14
10
|
},
|
|
15
|
-
"include": [
|
|
16
|
-
"**/*.ts",
|
|
17
|
-
"**/*.tsx",
|
|
18
|
-
"../tinycld/uniwind-types.d.ts",
|
|
19
|
-
"../tinycld/expo-env.d.ts"
|
|
20
|
-
],
|
|
11
|
+
"include": ["tinycld/**/*.ts", "tinycld/**/*.tsx", "../app/uniwind-types.d.ts"],
|
|
21
12
|
"exclude": ["node_modules", "server", "pb-migrations", "tests/**/*.spec.ts"]
|
|
22
13
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { mergeConfig } from 'vitest/config'
|
|
3
|
+
import appConfig from '../app/vitest.config'
|
|
4
|
+
|
|
5
|
+
// Package-scoped vitest: inherit the app shell's canonical aliases (so
|
|
6
|
+
// @tinycld/core/* etc. resolve identically), then add this package's own
|
|
7
|
+
// `~/*` source alias and scope the run to this package's tests/.
|
|
8
|
+
export default mergeConfig(appConfig, {
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: [{ find: /^~\/(.+)$/, replacement: path.resolve(__dirname, '$1') }],
|
|
11
|
+
},
|
|
12
|
+
test: {
|
|
13
|
+
root: __dirname,
|
|
14
|
+
include: ['tests/**/*.test.{ts,tsx}'],
|
|
15
|
+
},
|
|
16
|
+
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.25.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
25
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Test-only stub for expo-clipboard. The real package transitively
|
|
2
|
+
// imports expo-modules-core, which has too many side effects to load
|
|
3
|
+
// under a Node test environment (it touches several globals expected
|
|
4
|
+
// to be set up by Metro/RN). Tests get a minimal in-memory shim that
|
|
5
|
+
// records the last-written text and returns it on read.
|
|
6
|
+
|
|
7
|
+
let text = ''
|
|
8
|
+
|
|
9
|
+
export async function setStringAsync(s: string): Promise<void> {
|
|
10
|
+
text = s
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function getStringAsync(): Promise<string> {
|
|
14
|
+
return text
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Test-only escape hatch: reset the in-memory clipboard between tests.
|
|
18
|
+
export function __resetClipboardTextForTest(): void {
|
|
19
|
+
text = ''
|
|
20
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Test-only stub for expo-router. The real package's CJS entry
|
|
2
|
+
// (build/index.js) does `require("./global")` at module top, which
|
|
3
|
+
// Node's CJS resolver can't satisfy when the calling file is reached
|
|
4
|
+
// through a sibling-symlink path (Vite SSR's preserveSymlinks=false
|
|
5
|
+
// means imports under packages/@tinycld/<sibling>/... resolve via the
|
|
6
|
+
// sibling's real filesystem location, where node_modules don't reach
|
|
7
|
+
// expo-router).
|
|
8
|
+
//
|
|
9
|
+
// Tests that need to load a real screen, hook, or side-effect module
|
|
10
|
+
// from a sibling package import this stub instead. It surfaces the
|
|
11
|
+
// minimal API actually used at module-top by sibling source — the
|
|
12
|
+
// `router` object plus a few component shells. Tests that care about
|
|
13
|
+
// hook behavior should still mock those hooks individually with
|
|
14
|
+
// vi.mock; this stub only exists so the module graph can finish
|
|
15
|
+
// loading.
|
|
16
|
+
|
|
17
|
+
import { vi } from 'vitest'
|
|
18
|
+
|
|
19
|
+
const noop = () => {}
|
|
20
|
+
const ComponentStub = () => null
|
|
21
|
+
|
|
22
|
+
export const router = {
|
|
23
|
+
push: vi.fn(noop),
|
|
24
|
+
replace: vi.fn(noop),
|
|
25
|
+
back: vi.fn(noop),
|
|
26
|
+
canGoBack: vi.fn(() => true),
|
|
27
|
+
setParams: vi.fn(noop),
|
|
28
|
+
navigate: vi.fn(noop),
|
|
29
|
+
dismissAll: vi.fn(noop),
|
|
30
|
+
dismiss: vi.fn(noop),
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const Link = ComponentStub
|
|
34
|
+
export const Stack = Object.assign(ComponentStub, { Screen: ComponentStub })
|
|
35
|
+
export const Tabs = Object.assign(ComponentStub, { Screen: ComponentStub })
|
|
36
|
+
export const Slot = ComponentStub
|
|
37
|
+
export const Redirect = ComponentStub
|
|
38
|
+
export const Drawer = Object.assign(ComponentStub, { Screen: ComponentStub })
|
|
39
|
+
|
|
40
|
+
export const useRouter = () => router
|
|
41
|
+
export const usePathname = () => '/'
|
|
42
|
+
export const useSegments = () => []
|
|
43
|
+
export const useLocalSearchParams = () => ({})
|
|
44
|
+
export const useGlobalSearchParams = () => ({})
|
|
45
|
+
export const useFocusEffect = (_cb: () => void) => {}
|
|
46
|
+
export const useNavigation = () => ({})
|
|
47
|
+
export const useRootNavigationState = () => ({ key: 'test' })
|
|
48
|
+
export const Href = undefined
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Test-only stub for `lucide-react-native`. The real bundle pulls
|
|
2
|
+
// in `react-native-svg`, whose source uses TypeScript syntax that
|
|
3
|
+
// Vitest's transformer doesn't apply to node_modules. We don't
|
|
4
|
+
// render icons in unit tests anyway — assertions about icon
|
|
5
|
+
// rendering belong in Playwright.
|
|
6
|
+
//
|
|
7
|
+
// Implemented as CJS (.cjs) so we can use a Proxy on module.exports.
|
|
8
|
+
// Any named-icon import (ExternalLink, AlertTriangle, …) yields the
|
|
9
|
+
// same harmless component stub. Tests that genuinely need a real
|
|
10
|
+
// icon should reach for vi.mock locally; this stub only exists so
|
|
11
|
+
// the module graph can finish loading from sibling source under
|
|
12
|
+
// packages/@tinycld/<sibling>/... where the real bundle would crash.
|
|
13
|
+
//
|
|
14
|
+
// Vitest's ES↔CJS interop reads named exports from Object.keys() on
|
|
15
|
+
// the CJS module.exports, so the Proxy's `get` trap alone isn't
|
|
16
|
+
// enough — ESM `import { Heading1 } from '...'` requires Heading1 to
|
|
17
|
+
// appear as an own property. We pre-populate the dictionary with
|
|
18
|
+
// every Lucide identifier referenced from the codebase so static
|
|
19
|
+
// imports resolve to the Stub function; the Proxy handles any
|
|
20
|
+
// additional dynamic lookups (a defensive fallback).
|
|
21
|
+
|
|
22
|
+
const Stub = () => null
|
|
23
|
+
|
|
24
|
+
// Lucide icon names referenced by import statements anywhere in the
|
|
25
|
+
// codebase. Add new names here when a new icon is imported. The list
|
|
26
|
+
// is overinclusive on purpose: a missing entry would surface as an
|
|
27
|
+
// `undefined` named import in tests that try to render the icon,
|
|
28
|
+
// which is harder to diagnose than an unused name.
|
|
29
|
+
const NAMES = [
|
|
30
|
+
'AlertCircle', 'AlertTriangle', 'AlignCenter', 'AlignJustify', 'AlignLeft', 'AlignRight',
|
|
31
|
+
'Archive', 'ArrowDown', 'ArrowDownToLine', 'ArrowLeft', 'ArrowRight', 'ArrowUp',
|
|
32
|
+
'AtSign', 'Bell', 'BellOff', 'Bold', 'Book', 'BookOpen', 'Bot', 'Box', 'Calendar',
|
|
33
|
+
'Camera', 'Check', 'CheckCircle', 'CheckSquare', 'ChevronDown', 'ChevronLeft',
|
|
34
|
+
'ChevronRight', 'ChevronUp', 'Circle', 'Clipboard', 'Clock', 'Cloud', 'CloudOff',
|
|
35
|
+
'Code', 'Code2', 'Columns', 'Copy', 'CornerDownLeft', 'Cpu', 'CreditCard', 'Crop',
|
|
36
|
+
'Database', 'Download', 'Edit', 'Edit2', 'Edit3', 'ExternalLink', 'Eye', 'EyeOff',
|
|
37
|
+
'File', 'FileText', 'Files', 'Filter', 'Flag', 'Folder', 'FolderOpen', 'Forward',
|
|
38
|
+
'Globe', 'GraduationCap', 'Grid', 'HardDrive', 'Hash', 'Headphones', 'Heading1',
|
|
39
|
+
'Heading2', 'Heading3', 'Heading4', 'Heading5', 'Heading6', 'HelpCircle', 'Highlighter',
|
|
40
|
+
'Home', 'Image', 'Inbox', 'Info', 'Italic', 'Key', 'Keyboard', 'Languages', 'Layout',
|
|
41
|
+
'Link', 'Link2', 'List', 'ListChecks', 'ListOrdered', 'Loader', 'Lock', 'LogIn',
|
|
42
|
+
'LogOut', 'Mail', 'MailOpen', 'Map', 'Maximize', 'Maximize2', 'MenuIcon', 'Menu',
|
|
43
|
+
'MessageCircle', 'MessageSquare', 'Mic', 'MicOff', 'Minimize', 'Minimize2', 'Minus',
|
|
44
|
+
'MonitorSmartphone', 'MoreHorizontal', 'MoreVertical', 'Move', 'Music', 'Package',
|
|
45
|
+
'Palette', 'Paperclip', 'Pause', 'Pencil', 'Phone', 'PieChart', 'Pin', 'PinOff',
|
|
46
|
+
'Play', 'Plus', 'PlusCircle', 'Pointer', 'Power', 'Printer', 'Quote', 'RefreshCcw',
|
|
47
|
+
'RefreshCw', 'Replace', 'ReplaceAll', 'Reply', 'ReplyAll', 'RotateCcw', 'Save', 'Search', 'Send', 'Server',
|
|
48
|
+
'Settings', 'Settings2', 'Share', 'Share2', 'Shield', 'ShieldCheck', 'Shuffle',
|
|
49
|
+
'Sidebar', 'Slack', 'SlidersHorizontal', 'Smartphone', 'Smile', 'Sparkles',
|
|
50
|
+
'Speaker', 'Square', 'Star', 'Strikethrough', 'Subscript', 'Sun', 'Superscript',
|
|
51
|
+
'Table', 'Tag', 'Terminal', 'TestTube', 'Trash', 'Trash2', 'TrendingDown',
|
|
52
|
+
'TrendingUp', 'Triangle', 'Type', 'Underline', 'Undo', 'Unlock', 'Upload',
|
|
53
|
+
'User', 'UserCheck', 'UserPlus', 'Users', 'Video', 'VideoOff', 'Volume', 'Volume2',
|
|
54
|
+
'VolumeX', 'Wifi', 'WifiOff', 'WrapText', 'X', 'XCircle', 'XSquare', 'Zap',
|
|
55
|
+
'ZoomIn', 'ZoomOut',
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
const exports = { default: Stub }
|
|
59
|
+
for (const name of NAMES) {
|
|
60
|
+
exports[name] = Stub
|
|
61
|
+
}
|
|
62
|
+
exports.__esModule = true
|
|
63
|
+
|
|
64
|
+
module.exports = new Proxy(exports, {
|
|
65
|
+
get(target, prop) {
|
|
66
|
+
if (typeof prop === 'symbol') return Reflect.get(target, prop)
|
|
67
|
+
if (prop in target) return target[prop]
|
|
68
|
+
// Unknown icon name: return the Stub anyway so dynamic
|
|
69
|
+
// lookups don't crash. Static `import { Foo }` will already
|
|
70
|
+
// have been resolved against `target` above.
|
|
71
|
+
return Stub
|
|
72
|
+
},
|
|
73
|
+
})
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import * as os from 'node:os'
|
|
3
|
+
import * as path from 'node:path'
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
|
|
5
|
+
import { getPackages, resetPackagesCache } from '../tinycld.packages'
|
|
6
|
+
|
|
7
|
+
// Build a fake workspace tree and point getPackages at it via TINYCLD_WS_ROOT.
|
|
8
|
+
function makeWorkspace(): string {
|
|
9
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'tcld-ws-'))
|
|
10
|
+
// core member: package.json name @tinycld/core, NO manifest.ts
|
|
11
|
+
fs.mkdirSync(path.join(root, 'core'), { recursive: true })
|
|
12
|
+
fs.writeFileSync(
|
|
13
|
+
path.join(root, 'core', 'package.json'),
|
|
14
|
+
JSON.stringify({ name: '@tinycld/core' })
|
|
15
|
+
)
|
|
16
|
+
// feature member: contacts with manifest.ts + named package.json
|
|
17
|
+
fs.mkdirSync(path.join(root, 'contacts'), { recursive: true })
|
|
18
|
+
fs.writeFileSync(path.join(root, 'contacts', 'manifest.ts'), 'export default {}')
|
|
19
|
+
fs.writeFileSync(
|
|
20
|
+
path.join(root, 'contacts', 'package.json'),
|
|
21
|
+
JSON.stringify({ name: '@tinycld/contacts' })
|
|
22
|
+
)
|
|
23
|
+
// app shell: package.json name "app", NO manifest.ts
|
|
24
|
+
fs.mkdirSync(path.join(root, 'app'), { recursive: true })
|
|
25
|
+
fs.writeFileSync(path.join(root, 'app', 'package.json'), JSON.stringify({ name: 'app' }))
|
|
26
|
+
return root
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe('getPackages (new layout)', () => {
|
|
30
|
+
let root: string
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
root = makeWorkspace()
|
|
33
|
+
process.env.TINYCLD_WS_ROOT = root
|
|
34
|
+
resetPackagesCache()
|
|
35
|
+
})
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
delete process.env.TINYCLD_WS_ROOT
|
|
38
|
+
fs.rmSync(root, { recursive: true, force: true })
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('includes core (member named @tinycld/core, no manifest) plus feature members with a manifest.ts', () => {
|
|
42
|
+
const pkgs = getPackages()
|
|
43
|
+
expect(pkgs).toContain('@tinycld/core')
|
|
44
|
+
expect(pkgs).toContain('@tinycld/contacts')
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('excludes the app shell (named "app", no manifest.ts)', () => {
|
|
48
|
+
expect(getPackages()).not.toContain('app')
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('lists core first (stable order: core, then features sorted)', () => {
|
|
52
|
+
expect(getPackages()[0]).toBe('@tinycld/core')
|
|
53
|
+
})
|
|
54
|
+
})
|