@tinycld/bootstrap 2.0.3 → 2.3.2
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/README.md +24 -24
- package/dist/assemble-workspace.js +60 -18
- package/dist/assemble-workspace.js.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/link-package.js +47 -16
- package/dist/link-package.js.map +1 -1
- package/package.json +45 -46
- package/templates/shared/.github/workflows/ci.yml +13 -5
- package/templates/shared/README.md +6 -6
- package/templates/workspace/scripts/link-members.ts +97 -0
package/README.md
CHANGED
|
@@ -19,8 +19,8 @@ The two modes are independent — scaffold mode does not require a pre-existing
|
|
|
19
19
|
```sh
|
|
20
20
|
mkdir ~/code/tinycld && cd ~/code/tinycld
|
|
21
21
|
npx @tinycld/bootstrap@latest --assemble-only --with mail --with contacts
|
|
22
|
-
|
|
23
|
-
cd app &&
|
|
22
|
+
pnpm install # links members + runs the generator (postinstall)
|
|
23
|
+
cd app && pnpm run dev
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
The CLI writes the workspace coordination files (`package.json`, `tinycld.packages.ts`, `vitest.config.ts`, shared test stubs, the `package-scripts/` CLI) from embedded templates, then clones `app` + `core` as siblings. Each `--with <slug>` adds one feature sibling. `app` and `core` are always cloned; everything else is opt-in.
|
|
@@ -64,7 +64,7 @@ If `--new` runs from inside an existing workspace root (`app/` and `core/` sibli
|
|
|
64
64
|
| **Keyboard shortcut** (full only) | `f` | Single lowercase letter, or blank. |
|
|
65
65
|
| **Include a Go server?** (full only) | `y` / `n` | If no, `server/` and the manifest's `server` field are omitted. |
|
|
66
66
|
| **Target directory** | `./my-feature` | Default creates the new repo as a child of the current directory. Must not exist or must be empty. |
|
|
67
|
-
| **Link into the workspace?** | `y` / `n` | After scaffolding, the CLI adds the package to
|
|
67
|
+
| **Link into the workspace?** | `y` / `n` | After scaffolding, the CLI adds the package to `pnpm-workspace.yaml`'s `packages:` list (and the `package.json` `workspaces` hint) and runs `pnpm install` at the workspace root. If cwd isn't a workspace root, it assembles one (cloning `app` + `core`) first. Suppress with `--no-link`. |
|
|
68
68
|
|
|
69
69
|
### Flags (non-interactive use)
|
|
70
70
|
|
|
@@ -186,7 +186,7 @@ All path-shaped fields use **short subpaths** (`'screens'`, `'sidebar'`, `'colle
|
|
|
186
186
|
|
|
187
187
|
## After scaffolding
|
|
188
188
|
|
|
189
|
-
If you accepted the link-into-workspace prompt, the package is already a workspace member and `
|
|
189
|
+
If you accepted the link-into-workspace prompt, the package is already a workspace member and `pnpm install` has run. Otherwise the CLI prints next-steps you can copy verbatim:
|
|
190
190
|
|
|
191
191
|
```sh
|
|
192
192
|
# 1. Initialize git and push to GitHub
|
|
@@ -198,17 +198,17 @@ gh repo create tinycld/my-feature --public --source=. --push
|
|
|
198
198
|
|
|
199
199
|
# 2. Link into the workspace (add as a member, then install)
|
|
200
200
|
cd ..
|
|
201
|
-
# ensure "my-feature" is listed in
|
|
202
|
-
|
|
201
|
+
# ensure "my-feature" is listed in pnpm-workspace.yaml's "packages:" list, then:
|
|
202
|
+
pnpm install
|
|
203
203
|
|
|
204
204
|
# 3. Verify (scoped to this member)
|
|
205
205
|
cd my-feature
|
|
206
|
-
|
|
206
|
+
pnpm exec tinycld-pkg check
|
|
207
207
|
```
|
|
208
208
|
|
|
209
209
|
Once linked, the app shell's generator wires your manifest in automatically: routes appear at `/a/<orgSlug>/my-feature/**`, the sidebar renders, the settings panel shows up, migrations get picked up by PocketBase. No further changes to `app/` or `core/` are needed.
|
|
210
210
|
|
|
211
|
-
> ⚠️ **`app/metro.config.cjs` watches the workspace root**, but Expo's resolver caches package metadata at boot. If you add a new sibling while `
|
|
211
|
+
> ⚠️ **`app/metro.config.cjs` watches the workspace root**, but Expo's resolver caches package metadata at boot. If you add a new sibling while `pnpm run dev` is already running, restart it (Ctrl-C, then `pnpm run dev`) so the new member is picked up. CI is fine — it always starts fresh.
|
|
212
212
|
|
|
213
213
|
### Day-to-day development
|
|
214
214
|
|
|
@@ -216,17 +216,17 @@ Most work happens **from inside the package** with the workspace assembled aroun
|
|
|
216
216
|
|
|
217
217
|
```sh
|
|
218
218
|
cd my-feature
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
219
|
+
pnpm exec tinycld-pkg check # biome + tsc + vitest, scoped to this member
|
|
220
|
+
pnpm exec tinycld-pkg test # vitest only
|
|
221
|
+
pnpm exec tinycld-pkg test:e2e # playwright for this member
|
|
222
222
|
```
|
|
223
223
|
|
|
224
224
|
To run the app itself, drop into the app shell:
|
|
225
225
|
|
|
226
226
|
```sh
|
|
227
227
|
cd ../app
|
|
228
|
-
|
|
229
|
-
|
|
228
|
+
pnpm run dev # expo + pocketbase, fronted by a single-port dev proxy
|
|
229
|
+
pnpm run checks # biome + tsc, ecosystem-wide
|
|
230
230
|
```
|
|
231
231
|
|
|
232
232
|
Hot reload picks up changes in your package the same way as core code, since members are symlinked.
|
|
@@ -236,9 +236,9 @@ Hot reload picks up changes in your package the same way as core code, since mem
|
|
|
236
236
|
The package's `.github/workflows/ci.yml` mirrors what GitHub Actions runs:
|
|
237
237
|
|
|
238
238
|
1. Assemble a workspace via `npx @tinycld/bootstrap --assemble-only`. The job has `--with <this-pkg>@<sha>` so it lands the exact commit under test.
|
|
239
|
-
2. `
|
|
240
|
-
3. `
|
|
241
|
-
4. `
|
|
239
|
+
2. `pnpm install` at the workspace root (this also runs the package generator via the postinstall hook).
|
|
240
|
+
3. `pnpm exec tinycld-pkg check` from inside the package directory — runs biome (scoped), tsc, and vitest.
|
|
241
|
+
4. `pnpm exec tinycld-pkg test:e2e` if the package ships Playwright specs under `tests/`.
|
|
242
242
|
|
|
243
243
|
Biome lives only in `app/biome.json` (one config across every member). There is no `biome.json` in the scaffolded package repo. Typecheck runs against the app shell's tsconfig via `tinycld-pkg`, so the `expo` base, `uniwind` global augments, and the live `pbSchema` types are all in scope.
|
|
244
244
|
|
|
@@ -303,13 +303,13 @@ Adding a new placeholder requires one line in `src/substitute.ts`'s `buildPlaceh
|
|
|
303
303
|
### Local development of the scaffolder itself
|
|
304
304
|
|
|
305
305
|
```sh
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
306
|
+
pnpm install
|
|
307
|
+
pnpm run dev my-feature --target /tmp/scratch # tsx live-runs src/index.ts
|
|
308
|
+
pnpm run lint # biome
|
|
309
|
+
pnpm run typecheck # tsc --noEmit
|
|
310
|
+
pnpm run checks # both of the above
|
|
311
|
+
pnpm run test # vitest: substitute + validate + end-to-end scaffold into tmpdir
|
|
312
|
+
pnpm run build # compile src/ → dist/ (what gets published)
|
|
313
313
|
```
|
|
314
314
|
|
|
315
315
|
The scaffolder tests invoke `copyTemplate` into a tmp directory and assert the expected tree, file contents, and placeholder substitutions for both presets. The end-to-end flow (link into a real `tinycld/` checkout and boot the dev server) is covered manually — see git history for the validation playbook.
|
|
@@ -326,7 +326,7 @@ git push --tags
|
|
|
326
326
|
|
|
327
327
|
Publishing needs an `NPM_TOKEN` repo secret (npm "automation" token scoped to `@tinycld`). Add it once at Settings → Secrets → Actions.
|
|
328
328
|
|
|
329
|
-
`prepublishOnly` runs `
|
|
329
|
+
`prepublishOnly` runs `pnpm run checks && pnpm run test && pnpm run build` before any publish, so a broken tree never reaches npm.
|
|
330
330
|
|
|
331
331
|
## Design notes
|
|
332
332
|
|
|
@@ -14,22 +14,49 @@ const ALL_FEATURES = ['contacts', 'mail', 'calendar', 'drive', 'calc', 'text', '
|
|
|
14
14
|
// Listed in the manifest workspaces array (everything that could exist). The
|
|
15
15
|
// nested member path app/package-scripts is a valid npm workspace entry.
|
|
16
16
|
const ALL_MEMBERS = ['app', 'app/package-scripts', 'core', ...ALL_FEATURES];
|
|
17
|
+
// pnpm version pinned via the package.json "packageManager" field so corepack
|
|
18
|
+
// resolves the same pnpm everywhere (local, CI, EAS). Bump in lockstep with the
|
|
19
|
+
// workspace's committed packageManager.
|
|
20
|
+
const PNPM_VERSION = '11.3.0';
|
|
17
21
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
* pnpm-workspace.yaml contents: member discovery list + the settings the
|
|
23
|
+
* ecosystem depends on. node-linker=hoisted reproduces npm's flat node_modules
|
|
24
|
+
* so feature siblings (peerDeps-only, no node_modules of their own) resolve
|
|
25
|
+
* react/expo/etc. up to the root, and Metro/tsc resolution work unchanged.
|
|
26
|
+
* pnpm 10+ reads these keys from THIS file, not .npmrc.
|
|
27
|
+
*/
|
|
28
|
+
function pnpmWorkspaceYaml() {
|
|
29
|
+
const members = ALL_MEMBERS.map((m) => ` - ${m}`).join('\n');
|
|
30
|
+
return [
|
|
31
|
+
'nodeLinker: hoisted',
|
|
32
|
+
'linkWorkspacePackages: true',
|
|
33
|
+
'strictPeerDependencies: false',
|
|
34
|
+
'enablePrePostScripts: true',
|
|
35
|
+
'',
|
|
36
|
+
'packages:',
|
|
37
|
+
members,
|
|
38
|
+
'',
|
|
39
|
+
'# Build-script approvals (pnpm blocks dependency build scripts by default).',
|
|
40
|
+
'allowBuilds:',
|
|
41
|
+
' esbuild: true',
|
|
42
|
+
" '@sentry/cli': true",
|
|
43
|
+
'',
|
|
44
|
+
].join('\n');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Write (or merge into) the workspace-root coordination files in `dir`:
|
|
48
|
+
* package.json, pnpm-workspace.yaml, and scripts/link-members.ts.
|
|
28
49
|
*
|
|
29
|
-
* The
|
|
30
|
-
*
|
|
50
|
+
* The workspace is a pnpm workspace. Member discovery + pnpm settings live in
|
|
51
|
+
* pnpm-workspace.yaml (always rewritten — bootstrap owns the member list).
|
|
52
|
+
* package.json carries the pinned packageManager, the tsx devDep the postinstall
|
|
53
|
+
* needs, and the postinstall script (link-members + generator). When a
|
|
54
|
+
* package.json already exists (real workspace checkout), its other fields are
|
|
55
|
+
* preserved and only the bootstrap-owned bits are enforced.
|
|
31
56
|
*
|
|
32
|
-
*
|
|
57
|
+
* A legacy npm `workspaces` array is also written as a monorepo-detection HINT
|
|
58
|
+
* for external tooling (EAS/expo archiver keys off it, not pnpm-workspace.yaml).
|
|
59
|
+
* pnpm ignores it when pnpm-workspace.yaml is present.
|
|
33
60
|
*/
|
|
34
61
|
export function writeWorkspaceManifest(dir) {
|
|
35
62
|
const pkgPath = join(dir, 'package.json');
|
|
@@ -45,23 +72,38 @@ export function writeWorkspaceManifest(dir) {
|
|
|
45
72
|
const existingScripts = typeof existing.scripts === 'object' && existing.scripts !== null
|
|
46
73
|
? existing.scripts
|
|
47
74
|
: {};
|
|
75
|
+
const existingDevDeps = typeof existing.devDependencies === 'object' && existing.devDependencies !== null
|
|
76
|
+
? existing.devDependencies
|
|
77
|
+
: {};
|
|
48
78
|
const pkg = {
|
|
49
79
|
name: '@tinycld/workspace',
|
|
50
80
|
version: '0.0.0',
|
|
51
81
|
private: true,
|
|
52
82
|
type: 'module',
|
|
53
83
|
...existing,
|
|
54
|
-
|
|
84
|
+
packageManager: `pnpm@${PNPM_VERSION}`,
|
|
85
|
+
// Monorepo-detection hint for external tooling (see doc comment); pnpm
|
|
86
|
+
// itself reads members from pnpm-workspace.yaml and ignores this.
|
|
55
87
|
workspaces: [...ALL_MEMBERS],
|
|
56
88
|
scripts: {
|
|
57
89
|
...existingScripts,
|
|
58
|
-
postinstall: 'cd app &&
|
|
90
|
+
postinstall: 'tsx scripts/link-members.ts && cd app && pnpm run packages:generate && pnpm run assets:copy-pdfjs',
|
|
91
|
+
},
|
|
92
|
+
devDependencies: {
|
|
93
|
+
...existingDevDeps,
|
|
94
|
+
tsx: '^4.21.0',
|
|
59
95
|
},
|
|
60
96
|
};
|
|
61
97
|
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 4)}\n`);
|
|
98
|
+
// pnpm-workspace.yaml is the source of truth for members + settings — always
|
|
99
|
+
// rewrite it (unlike package.json, no human-owned fields live here).
|
|
100
|
+
writeFileSync(join(dir, 'pnpm-workspace.yaml'), pnpmWorkspaceYaml());
|
|
101
|
+
// Minimal .npmrc: all pnpm settings live in pnpm-workspace.yaml (pnpm 10+
|
|
102
|
+
// reads them there, not from .npmrc). Only written when absent (don't
|
|
103
|
+
// clobber a real checkout's).
|
|
62
104
|
const npmrcPath = join(dir, '.npmrc');
|
|
63
105
|
if (!existsSync(npmrcPath)) {
|
|
64
|
-
writeFileSync(npmrcPath, '
|
|
106
|
+
writeFileSync(npmrcPath, '# pnpm settings live in pnpm-workspace.yaml (pnpm 10+ reads them there).\n');
|
|
65
107
|
}
|
|
66
108
|
}
|
|
67
109
|
/**
|
|
@@ -129,8 +171,8 @@ function realClone(url, dest, ref) {
|
|
|
129
171
|
* already present — e.g. a CI-checked-out member). There is NO workspace
|
|
130
172
|
* meta-repo clone: bootstrap is the source of all root scaffolding.
|
|
131
173
|
* Unknown member names throw. Returns the members that ended up present. Does
|
|
132
|
-
* NOT run
|
|
133
|
-
*
|
|
174
|
+
* NOT run the install (the caller / CI controls that — e.g. `pnpm install` or a
|
|
175
|
+
* frozen-lockfile install for reproducible builds).
|
|
134
176
|
*/
|
|
135
177
|
export function assembleWorkspace(opts) {
|
|
136
178
|
// Each requested member may be `name` or `name@ref`. Validate the NAME part.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assemble-workspace.js","sourceRoot":"","sources":["../src/assemble-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC3G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,CAAU,CAAA;AAEhH,yEAAyE;AACzE,+EAA+E;AAC/E,8EAA8E;AAC9E,8EAA8E;AAC9E,8BAA8B;AAE9B,6EAA6E;AAC7E,yEAAyE;AACzE,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,YAAY,CAAU,CAAA;AAEpF
|
|
1
|
+
{"version":3,"file":"assemble-workspace.js","sourceRoot":"","sources":["../src/assemble-workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -105,7 +105,7 @@ async function main() {
|
|
|
105
105
|
}
|
|
106
106
|
export function composeAssembleOutro(members) {
|
|
107
107
|
const extras = members?.length ? `, ${members.join(', ')}` : '';
|
|
108
|
-
return `Workspace assembled (app + core${extras}). Run \`
|
|
108
|
+
return `Workspace assembled (app + core${extras}). Run \`pnpm install\` at the root.`;
|
|
109
109
|
}
|
|
110
110
|
export function resolveMode(args) {
|
|
111
111
|
if (args.assembleOnly && args.new) {
|
|
@@ -181,24 +181,24 @@ function printNextSteps({ slug, relTarget, linked, layout }) {
|
|
|
181
181
|
lines.push(` gh repo create tinycld/${slug} --public --source=. --push`);
|
|
182
182
|
lines.push('');
|
|
183
183
|
if (!linked) {
|
|
184
|
-
// Linking is now a workspace-root `
|
|
185
|
-
// exists; add it to
|
|
186
|
-
// member yet, then install —
|
|
187
|
-
// the generator.
|
|
184
|
+
// Linking is now a workspace-root `pnpm install`: the package dir already
|
|
185
|
+
// exists; add it to pnpm-workspace.yaml's `packages:` if it isn't a
|
|
186
|
+
// member yet, then install — the postinstall runs link-members (which
|
|
187
|
+
// symlinks it) and the generator.
|
|
188
188
|
lines.push(` ${pc.dim(`# ${step++}. Link into the workspace (add as a member, then install)`)}`);
|
|
189
189
|
if (wsRoot !== '.')
|
|
190
190
|
lines.push(` cd ${wsRoot}`);
|
|
191
|
-
lines.push(` # ensure "${slug}" is in
|
|
192
|
-
lines.push('
|
|
191
|
+
lines.push(` # ensure "${slug}" is in pnpm-workspace.yaml's "packages:" list, then:`);
|
|
192
|
+
lines.push(' pnpm install');
|
|
193
193
|
lines.push('');
|
|
194
194
|
}
|
|
195
195
|
lines.push(` ${pc.dim(`# ${step++}. Verify the package (biome + tsc, scoped to this member)`)}`);
|
|
196
196
|
lines.push(` cd ${join(wsRoot, slug)}`);
|
|
197
|
-
lines.push('
|
|
197
|
+
lines.push(' pnpm exec tinycld-pkg check');
|
|
198
198
|
lines.push('');
|
|
199
199
|
lines.push(` ${pc.dim(`# ${step++}. Run the app (Expo + PocketBase, single-port dev proxy)`)}`);
|
|
200
200
|
lines.push(` cd ${join(wsRoot, 'app')}`);
|
|
201
|
-
lines.push('
|
|
201
|
+
lines.push(' pnpm run dev');
|
|
202
202
|
lines.push('');
|
|
203
203
|
console.log(lines.join('\n'));
|
|
204
204
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/link-package.js
CHANGED
|
@@ -6,27 +6,54 @@ import pc from 'picocolors';
|
|
|
6
6
|
import { assembleWorkspace } from "./assemble-workspace.js";
|
|
7
7
|
import { looksLikeWorkspaceRoot } from "./layout.js";
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Make `slug` a workspace member: add it to pnpm-workspace.yaml's `packages:`
|
|
10
|
+
* list (the source pnpm reads) and to the package.json `workspaces[]` tooling
|
|
11
|
+
* hint. Idempotent; each file is a no-op when absent or already listing the slug.
|
|
11
12
|
*/
|
|
12
13
|
export function ensureMember(workspaceDir, slug) {
|
|
13
14
|
const pkgPath = join(workspaceDir, 'package.json');
|
|
14
|
-
if (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
if (existsSync(pkgPath)) {
|
|
16
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
17
|
+
pkg.workspaces = Array.isArray(pkg.workspaces) ? pkg.workspaces : [];
|
|
18
|
+
if (!pkg.workspaces.includes(slug)) {
|
|
19
|
+
pkg.workspaces.push(slug);
|
|
20
|
+
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 4)}\n`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const wsYamlPath = join(workspaceDir, 'pnpm-workspace.yaml');
|
|
24
|
+
if (existsSync(wsYamlPath)) {
|
|
25
|
+
const yaml = readFileSync(wsYamlPath, 'utf-8');
|
|
26
|
+
// Already a member? (matches ` - <slug>` under packages:)
|
|
27
|
+
const memberLine = new RegExp(`^\\s*-\\s+${slug}\\s*$`, 'm');
|
|
28
|
+
if (!memberLine.test(yaml)) {
|
|
29
|
+
// Append the slug to the packages: block. The block runs from the
|
|
30
|
+
// `packages:` line until the next top-level key or EOF; insert after
|
|
31
|
+
// the last ` - ` entry within it.
|
|
32
|
+
const lines = yaml.split('\n');
|
|
33
|
+
const pkgIdx = lines.findIndex((l) => /^packages:\s*$/.test(l));
|
|
34
|
+
if (pkgIdx !== -1) {
|
|
35
|
+
let lastEntry = pkgIdx;
|
|
36
|
+
for (let i = pkgIdx + 1; i < lines.length; i++) {
|
|
37
|
+
const line = lines[i] ?? '';
|
|
38
|
+
if (/^\s+-\s+/.test(line))
|
|
39
|
+
lastEntry = i;
|
|
40
|
+
else if (/^\S/.test(line) && line.trim() !== '')
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
lines.splice(lastEntry + 1, 0, ` - ${slug}`);
|
|
44
|
+
writeFileSync(wsYamlPath, lines.join('\n'));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
21
47
|
}
|
|
22
48
|
}
|
|
23
49
|
/**
|
|
24
50
|
* Offer to link the freshly-scaffolded package into the TinyCld workspace.
|
|
25
51
|
*
|
|
26
52
|
* "Linking" in the workspace layout means: make the package a workspace member
|
|
27
|
-
* (its dir name appears in
|
|
28
|
-
* `
|
|
29
|
-
*
|
|
53
|
+
* (its dir name appears in pnpm-workspace.yaml — and, as a tooling hint, the
|
|
54
|
+
* root `package.json` `workspaces[]`) and run `pnpm install` at the workspace
|
|
55
|
+
* root. The root `postinstall` runs link-members (which creates the
|
|
56
|
+
* `node_modules/@tinycld/*` symlinks) and the generator.
|
|
30
57
|
*
|
|
31
58
|
* Two shapes, distinguished by whether `workspaceDir` is already a workspace root:
|
|
32
59
|
* - attach: `workspaceDir` is already an assembled workspace root (its
|
|
@@ -77,9 +104,9 @@ export async function offerLinkPackage({ slug, workspaceDir, mode, members, asse
|
|
|
77
104
|
}
|
|
78
105
|
ensureMember(workspaceDir, slug);
|
|
79
106
|
const i = spinner();
|
|
80
|
-
i.start('Installing workspace (
|
|
107
|
+
i.start('Installing workspace (pnpm install)');
|
|
81
108
|
if (!install(workspaceDir)) {
|
|
82
|
-
i.stop(pc.red('
|
|
109
|
+
i.stop(pc.red('pnpm install failed'), 1);
|
|
83
110
|
return true;
|
|
84
111
|
}
|
|
85
112
|
i.stop('Installed workspace');
|
|
@@ -102,9 +129,13 @@ function realAssemble(dir, members) {
|
|
|
102
129
|
});
|
|
103
130
|
}
|
|
104
131
|
function realInstall(cwd) {
|
|
105
|
-
|
|
132
|
+
// corepack enable makes the pnpm version pinned in package.json's
|
|
133
|
+
// packageManager field available, then install via pnpm. The workspace is a
|
|
134
|
+
// pnpm workspace (pnpm-workspace.yaml); npm is no longer used to install.
|
|
135
|
+
spawnSync('corepack', ['enable'], { cwd, stdio: 'pipe', encoding: 'utf8' });
|
|
136
|
+
const r = spawnSync('pnpm', ['install'], { cwd, stdio: 'pipe', encoding: 'utf8' });
|
|
106
137
|
if (r.status !== 0) {
|
|
107
|
-
log.error(r.stderr?.trim() || '
|
|
138
|
+
log.error(r.stderr?.trim() || 'pnpm install exited non-zero');
|
|
108
139
|
return false;
|
|
109
140
|
}
|
|
110
141
|
return true;
|
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,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAyBpD
|
|
1
|
+
{"version":3,"file":"link-package.js","sourceRoot":"","sources":["../src/link-package.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,47 +1,46 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
2
|
+
"name": "@tinycld/bootstrap",
|
|
3
|
+
"version": "2.3.2",
|
|
4
|
+
"description": "Scaffolder for @tinycld feature packages",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/tinycld/bootstrap.git"
|
|
10
|
+
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"bootstrap": "dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"templates"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@clack/prompts": "^0.8.0",
|
|
23
|
+
"picocolors": "^1.1.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@biomejs/biome": "^2.4.12",
|
|
27
|
+
"@types/node": "^22.10.0",
|
|
28
|
+
"tsx": "^4.21.0",
|
|
29
|
+
"typescript": "^5.9.0",
|
|
30
|
+
"vitest": "^3.0.0"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=24"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"clean": "rm -rf dist",
|
|
37
|
+
"build": "pnpm run clean && tsc",
|
|
38
|
+
"dev": "tsx src/index.ts",
|
|
39
|
+
"lint": "biome check .",
|
|
40
|
+
"lint:fix": "biome check --write .",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"checks": "pnpm run lint && pnpm run typecheck",
|
|
43
|
+
"test": "vitest run",
|
|
44
|
+
"release": "pnpm publish"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -41,12 +41,18 @@ jobs:
|
|
|
41
41
|
- uses: actions/setup-go@v6
|
|
42
42
|
with:
|
|
43
43
|
go-version-file: ws/.go-version
|
|
44
|
+
# 5. Enable corepack so the pnpm version pinned in the workspace root's
|
|
45
|
+
# package.json "packageManager" field is used. pnpm discovers members
|
|
46
|
+
# from pnpm-workspace.yaml; node-linker=hoisted (set there) gives an
|
|
47
|
+
# npm-like flat node_modules so member peerDeps resolve.
|
|
48
|
+
- name: Enable corepack (pnpm)
|
|
49
|
+
run: corepack enable
|
|
44
50
|
- name: Install (workspace root)
|
|
45
51
|
working-directory: ws
|
|
46
|
-
run:
|
|
52
|
+
run: pnpm install --no-frozen-lockfile
|
|
47
53
|
- name: Typecheck + unit
|
|
48
54
|
working-directory: ws/${{ env.PACKAGE }}
|
|
49
|
-
run:
|
|
55
|
+
run: pnpm exec tinycld-pkg check
|
|
50
56
|
|
|
51
57
|
e2e:
|
|
52
58
|
name: E2E
|
|
@@ -70,9 +76,11 @@ jobs:
|
|
|
70
76
|
- uses: actions/setup-go@v6
|
|
71
77
|
with:
|
|
72
78
|
go-version-file: ws/.go-version
|
|
79
|
+
- name: Enable corepack (pnpm)
|
|
80
|
+
run: corepack enable
|
|
73
81
|
- name: Install (workspace root)
|
|
74
82
|
working-directory: ws
|
|
75
|
-
run:
|
|
83
|
+
run: pnpm install --no-frozen-lockfile
|
|
76
84
|
# Installs watchman so Metro's file watcher doesn't fall back to
|
|
77
85
|
# polling — see tinycld/app#21 for the trace evidence and the
|
|
78
86
|
# blank-page-after-reload flake it fixed.
|
|
@@ -80,10 +88,10 @@ jobs:
|
|
|
80
88
|
uses: tinycld/app/.github/actions/configure-test-env@main
|
|
81
89
|
- name: Install Playwright browsers
|
|
82
90
|
working-directory: ws/app
|
|
83
|
-
run:
|
|
91
|
+
run: pnpm exec playwright install --with-deps chromium
|
|
84
92
|
- name: E2E
|
|
85
93
|
working-directory: ws/${{ env.PACKAGE }}
|
|
86
|
-
run:
|
|
94
|
+
run: pnpm exec tinycld-pkg test:e2e
|
|
87
95
|
# Capture Playwright's per-failure artifacts (trace, screenshot,
|
|
88
96
|
# video, error-context.md) so a CI failure can be diagnosed
|
|
89
97
|
# without a re-run. `if: failure()` skips the upload on green
|
|
@@ -11,7 +11,7 @@ not bundled), and the other feature packages.
|
|
|
11
11
|
|
|
12
12
|
The package is one member of a tinycld workspace. To work on it you need a
|
|
13
13
|
workspace root containing at least `app`, `core`, and this package as siblings,
|
|
14
|
-
linked by a single `
|
|
14
|
+
linked by a single `pnpm install` at the root.
|
|
15
15
|
|
|
16
16
|
```sh
|
|
17
17
|
# In a fresh workspace directory, clone this package into a member slot…
|
|
@@ -24,11 +24,11 @@ npx @tinycld/bootstrap@latest --assemble-only
|
|
|
24
24
|
|
|
25
25
|
# Link every member with one install at the WORKSPACE ROOT (never inside a
|
|
26
26
|
# member — siblings have no node_modules of their own; deps hoist to the root).
|
|
27
|
-
|
|
27
|
+
pnpm install
|
|
28
28
|
|
|
29
29
|
# Run the full stack (Expo + PocketBase, single-port dev proxy) from the app.
|
|
30
30
|
cd app
|
|
31
|
-
|
|
31
|
+
pnpm run dev
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
## Checks
|
|
@@ -39,9 +39,9 @@ app shell's biome config, tsconfig base, and vitest/playwright configs (so
|
|
|
39
39
|
|
|
40
40
|
```sh
|
|
41
41
|
cd {{PKG_SLUG}}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
pnpm exec tinycld-pkg check # biome + typecheck
|
|
43
|
+
pnpm exec tinycld-pkg test # vitest unit tests
|
|
44
|
+
pnpm exec tinycld-pkg test:e2e # playwright e2e specs (full preset only — packages with screens)
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
There is no `biome.json` in this repo — biome lives only in the app shell and
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
// Link every present workspace member into node_modules/@tinycld/<name> so it
|
|
3
|
+
// resolves by its package name everywhere (Metro bundling, tsc, runtime).
|
|
4
|
+
//
|
|
5
|
+
// Why this exists: npm's workspace install symlinks ALL members into the root
|
|
6
|
+
// node_modules/@tinycld/ regardless of whether anything depends on them. pnpm
|
|
7
|
+
// does not — it only links members that are an actual dependency in the graph.
|
|
8
|
+
// Feature siblings (mail, calc, calendar, …) are depended on by nothing (the
|
|
9
|
+
// app reaches them only through generated route re-exports that import by
|
|
10
|
+
// package name), so pnpm leaves them unlinked and `@tinycld/calc/screens/...`
|
|
11
|
+
// fails to resolve.
|
|
12
|
+
//
|
|
13
|
+
// Rather than hard-code the feature list into app/package.json (which would
|
|
14
|
+
// break the lean-shell / partial-checkout guarantee), we mirror npm's behavior
|
|
15
|
+
// dynamically: scan for present members and symlink each one. This keeps the
|
|
16
|
+
// installed-member set = the set of present sibling dirs, exactly as
|
|
17
|
+
// getPackages() discovers it.
|
|
18
|
+
//
|
|
19
|
+
// Members are linked into BOTH the workspace-root node_modules/@tinycld/ and
|
|
20
|
+
// app/node_modules/@tinycld/. Metro resolves deps from the app shell, so the
|
|
21
|
+
// app-scoped links are the ones that matter for bundling; the root links cover
|
|
22
|
+
// resolution from the workspace root and other members.
|
|
23
|
+
import * as fs from 'node:fs'
|
|
24
|
+
import * as path from 'node:path'
|
|
25
|
+
import { getPackages } from '../tinycld.packages'
|
|
26
|
+
|
|
27
|
+
const WS_ROOT = path.resolve(import.meta.dirname, '..')
|
|
28
|
+
|
|
29
|
+
// Map a member's package name to its on-disk sibling dir by scanning the
|
|
30
|
+
// workspace root (the dir name need not equal the package name — e.g.
|
|
31
|
+
// @tinycld/google-takeout-import lives in google-takeout-import/).
|
|
32
|
+
function memberDirsByName(): Map<string, string> {
|
|
33
|
+
const index = new Map<string, string>()
|
|
34
|
+
for (const entry of fs.readdirSync(WS_ROOT)) {
|
|
35
|
+
const dir = path.join(WS_ROOT, entry)
|
|
36
|
+
const pkgJsonPath = path.join(dir, 'package.json')
|
|
37
|
+
try {
|
|
38
|
+
if (!fs.statSync(dir).isDirectory()) continue
|
|
39
|
+
const name = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8')).name
|
|
40
|
+
if (typeof name === 'string' && name.length > 0 && !index.has(name)) {
|
|
41
|
+
index.set(name, dir)
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
// not a dir, or no/unreadable package.json — skip
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return index
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Create (or refresh) node_modules/@tinycld/<short> -> <memberDir> as a relative
|
|
51
|
+
// symlink inside the given node_modules dir.
|
|
52
|
+
function linkInto(nodeModulesDir: string, scopeName: string, targetDir: string): void {
|
|
53
|
+
const scopeDir = path.join(nodeModulesDir, '@tinycld')
|
|
54
|
+
fs.mkdirSync(scopeDir, { recursive: true })
|
|
55
|
+
const linkPath = path.join(scopeDir, scopeName)
|
|
56
|
+
const relTarget = path.relative(scopeDir, targetDir)
|
|
57
|
+
|
|
58
|
+
// If a correct symlink already exists, leave it. Otherwise replace whatever
|
|
59
|
+
// is there (stale link, or pnpm's own link for a depended-on member).
|
|
60
|
+
try {
|
|
61
|
+
if (fs.lstatSync(linkPath).isSymbolicLink() && fs.readlinkSync(linkPath) === relTarget) {
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
fs.rmSync(linkPath, { recursive: true, force: true })
|
|
65
|
+
} catch {
|
|
66
|
+
// nothing at linkPath yet
|
|
67
|
+
}
|
|
68
|
+
fs.symlinkSync(relTarget, linkPath)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function main(): void {
|
|
72
|
+
const names = getPackages() // ['@tinycld/core', '@tinycld/calc', ...]
|
|
73
|
+
const dirs = memberDirsByName()
|
|
74
|
+
const targets = [
|
|
75
|
+
path.join(WS_ROOT, 'node_modules'),
|
|
76
|
+
path.join(WS_ROOT, 'app', 'node_modules'),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
let linked = 0
|
|
80
|
+
for (const name of names) {
|
|
81
|
+
const short = name.startsWith('@tinycld/') ? name.slice('@tinycld/'.length) : name
|
|
82
|
+
const dir = dirs.get(name)
|
|
83
|
+
if (!dir) {
|
|
84
|
+
console.warn(`[link-members] no sibling dir found for ${name} — skipping`)
|
|
85
|
+
continue
|
|
86
|
+
}
|
|
87
|
+
for (const nm of targets) {
|
|
88
|
+
// Only link where a node_modules already exists (app may be absent
|
|
89
|
+
// in some partial checkouts). The root one always exists post-install.
|
|
90
|
+
if (fs.existsSync(nm)) linkInto(nm, short, dir)
|
|
91
|
+
}
|
|
92
|
+
linked++
|
|
93
|
+
}
|
|
94
|
+
console.log(`[link-members] linked ${linked} workspace member(s) into node_modules/@tinycld/`)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
main()
|