@tinycld/bootstrap 2.3.2 → 2.4.0
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 +1 -1
- package/dist/assemble-workspace.js +72 -19
- package/dist/assemble-workspace.js.map +1 -1
- package/dist/index.js +16 -22
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/templates/shared/tsconfig.json +3 -5
- package/templates/workspace/scripts/link-members.ts +34 -4
- package/templates/workspace/tinycld.packages.ts +13 -0
package/README.md
CHANGED
|
@@ -116,7 +116,7 @@ my-feature/
|
|
|
116
116
|
├── README.md # developer-facing onboarding for this package
|
|
117
117
|
├── manifest.ts # name, slug, routes, nav, collections, seed, server, ...
|
|
118
118
|
├── package.json # @tinycld/my-feature, peer deps, scripts, exports map
|
|
119
|
-
├── tsconfig.json # extends
|
|
119
|
+
├── tsconfig.json # extends @tinycld/core/tsconfig.package-base.json (by name)
|
|
120
120
|
├── pb-migrations/
|
|
121
121
|
│ └── 1800000000_create_my-feature.js # creates my_feature_items collection
|
|
122
122
|
├── server/
|
|
@@ -6,27 +6,68 @@ import { fileURLToPath } from 'node:url';
|
|
|
6
6
|
// ALL of them (npm tolerates absent dirs), so a partial checkout still installs.
|
|
7
7
|
// But --assemble-only CLONES only app+core+requested — we do NOT force-clone all.
|
|
8
8
|
const ALL_FEATURES = ['contacts', 'mail', 'calendar', 'drive', 'calc', 'text', 'google-takeout-import'];
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// the
|
|
13
|
-
//
|
|
9
|
+
// The `tinycld` member is the one always-cloned repo (tinycld/tinycld): it is
|
|
10
|
+
// the merged app shell + core. assembleWorkspace seeds it directly, pinnable via
|
|
11
|
+
// tinycldRef. Both @tinycld/core (at tinycld/core) and @tinycld/package-scripts
|
|
12
|
+
// (the tinycld-pkg CLI, at tinycld/package-scripts) live NESTED inside it, so
|
|
13
|
+
// they arrive with the single clone and are never cloned separately.
|
|
14
14
|
// Listed in the manifest workspaces array (everything that could exist). The
|
|
15
|
-
// nested member
|
|
16
|
-
|
|
15
|
+
// nested member paths tinycld/core and tinycld/package-scripts are valid npm
|
|
16
|
+
// workspace entries that resolve inside the one cloned `tinycld` repo.
|
|
17
|
+
const ALL_MEMBERS = ['tinycld', 'tinycld/core', 'tinycld/package-scripts', ...ALL_FEATURES];
|
|
17
18
|
// pnpm version pinned via the package.json "packageManager" field so corepack
|
|
18
19
|
// resolves the same pnpm everywhere (local, CI, EAS). Bump in lockstep with the
|
|
19
20
|
// workspace's committed packageManager.
|
|
20
21
|
const PNPM_VERSION = '11.3.0';
|
|
22
|
+
/**
|
|
23
|
+
* Direct child dirs of `root` that look like a feature member already on disk:
|
|
24
|
+
* a package.json plus a manifest.ts/js. This mirrors the app generator's own
|
|
25
|
+
* discovery (it scans the workspace root for manifest-bearing members), so the
|
|
26
|
+
* member list bootstrap writes stays in sync with what the generator will load.
|
|
27
|
+
*
|
|
28
|
+
* The motivating case is CI / a custom package: a member checked out into its
|
|
29
|
+
* slot but absent from ALL_MEMBERS is discovered by the generator yet never
|
|
30
|
+
* linked by pnpm (→ "No manifest found"). Self-registering it here closes that
|
|
31
|
+
* gap without requiring every package to be hardcoded in ALL_FEATURES.
|
|
32
|
+
*/
|
|
33
|
+
function discoverPresentMembers(root) {
|
|
34
|
+
let entries;
|
|
35
|
+
try {
|
|
36
|
+
entries = readdirSync(root);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
return entries.filter((name) => {
|
|
42
|
+
if (name === 'node_modules' || name.startsWith('.'))
|
|
43
|
+
return false;
|
|
44
|
+
const dir = join(root, name);
|
|
45
|
+
try {
|
|
46
|
+
if (!statSync(dir).isDirectory())
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const hasManifest = existsSync(join(dir, 'manifest.ts')) || existsSync(join(dir, 'manifest.js'));
|
|
53
|
+
return existsSync(join(dir, 'package.json')) && hasManifest;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
21
56
|
/**
|
|
22
57
|
* pnpm-workspace.yaml contents: member discovery list + the settings the
|
|
23
58
|
* ecosystem depends on. node-linker=hoisted reproduces npm's flat node_modules
|
|
24
59
|
* so feature siblings (peerDeps-only, no node_modules of their own) resolve
|
|
25
60
|
* react/expo/etc. up to the root, and Metro/tsc resolution work unchanged.
|
|
26
61
|
* pnpm 10+ reads these keys from THIS file, not .npmrc.
|
|
62
|
+
*
|
|
63
|
+
* `dir` is the workspace root: any manifest-bearing member already on disk but
|
|
64
|
+
* not in ALL_MEMBERS (a CI- or custom-package checkout) is unioned into the
|
|
65
|
+
* `packages:` list so pnpm links what the generator discovers. This list is the
|
|
66
|
+
* source of truth pnpm reads — unlike the package.json `workspaces` hint.
|
|
27
67
|
*/
|
|
28
|
-
function pnpmWorkspaceYaml() {
|
|
29
|
-
const
|
|
68
|
+
function pnpmWorkspaceYaml(dir) {
|
|
69
|
+
const allMembers = [...new Set([...ALL_MEMBERS, ...discoverPresentMembers(dir)])];
|
|
70
|
+
const members = allMembers.map((m) => ` - ${m}`).join('\n');
|
|
30
71
|
return [
|
|
31
72
|
'nodeLinker: hoisted',
|
|
32
73
|
'linkWorkspacePackages: true',
|
|
@@ -83,11 +124,22 @@ export function writeWorkspaceManifest(dir) {
|
|
|
83
124
|
...existing,
|
|
84
125
|
packageManager: `pnpm@${PNPM_VERSION}`,
|
|
85
126
|
// Monorepo-detection hint for external tooling (see doc comment); pnpm
|
|
86
|
-
// itself reads members from pnpm-workspace.yaml and ignores this.
|
|
87
|
-
|
|
127
|
+
// itself reads members from pnpm-workspace.yaml and ignores this. Union
|
|
128
|
+
// in any manifest-bearing member already on disk so the hint matches the
|
|
129
|
+
// authoritative pnpm-workspace.yaml member list.
|
|
130
|
+
workspaces: [...new Set([...ALL_MEMBERS, ...discoverPresentMembers(dir)])],
|
|
88
131
|
scripts: {
|
|
89
132
|
...existingScripts,
|
|
90
|
-
|
|
133
|
+
// link-members runs FIRST so the @tinycld/<member> symlinks (notably
|
|
134
|
+
// @tinycld/core) exist before the generator's package-build step
|
|
135
|
+
// (text's webview-editor build.ts does a bare `import '@tinycld/core/...'`
|
|
136
|
+
// resolved by package name, which fails on a CLEAN install if the
|
|
137
|
+
// symlink isn't there yet). It then runs AGAIN after generate to add
|
|
138
|
+
// the @tinycld/app-generated link (whose target, tinycld/lib/generated,
|
|
139
|
+
// only exists once generate has run); link-members is idempotent and
|
|
140
|
+
// skips app-generated when absent, so the first pass is harmless and
|
|
141
|
+
// the second completes the graph. All app scripts run from tinycld/.
|
|
142
|
+
postinstall: 'tsx scripts/link-members.ts && cd tinycld && pnpm run packages:generate && cd .. && tsx scripts/link-members.ts && cd tinycld && pnpm run assets:copy-pdfjs',
|
|
91
143
|
},
|
|
92
144
|
devDependencies: {
|
|
93
145
|
...existingDevDeps,
|
|
@@ -97,7 +149,7 @@ export function writeWorkspaceManifest(dir) {
|
|
|
97
149
|
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 4)}\n`);
|
|
98
150
|
// pnpm-workspace.yaml is the source of truth for members + settings — always
|
|
99
151
|
// rewrite it (unlike package.json, no human-owned fields live here).
|
|
100
|
-
writeFileSync(join(dir, 'pnpm-workspace.yaml'), pnpmWorkspaceYaml());
|
|
152
|
+
writeFileSync(join(dir, 'pnpm-workspace.yaml'), pnpmWorkspaceYaml(dir));
|
|
101
153
|
// Minimal .npmrc: all pnpm settings live in pnpm-workspace.yaml (pnpm 10+
|
|
102
154
|
// reads them there, not from .npmrc). Only written when absent (don't
|
|
103
155
|
// clobber a real checkout's).
|
|
@@ -167,8 +219,9 @@ function realClone(url, dest, ref) {
|
|
|
167
219
|
* Assemble a workspace skeleton at opts.root: write the canonical root manifest
|
|
168
220
|
* (writeWorkspaceManifest) + lay down the root scaffolding (copyWorkspaceTemplate:
|
|
169
221
|
* tinycld.packages.ts, vitest.config.ts, tests/ stubs, version files), then clone
|
|
170
|
-
* ONLY app + core + the explicitly-requested
|
|
171
|
-
* already present — e.g. a CI-checked-out member
|
|
222
|
+
* ONLY the tinycld member (merged app shell + core) + the explicitly-requested
|
|
223
|
+
* feature members (skipping any already present — e.g. a CI-checked-out member,
|
|
224
|
+
* where the merged repo is checked out into the tinycld/ slot). There is NO workspace
|
|
172
225
|
* meta-repo clone: bootstrap is the source of all root scaffolding.
|
|
173
226
|
* Unknown member names throw. Returns the members that ended up present. Does
|
|
174
227
|
* NOT run the install (the caller / CI controls that — e.g. `pnpm install` or a
|
|
@@ -192,11 +245,11 @@ export function assembleWorkspace(opts) {
|
|
|
192
245
|
writeWorkspaceManifest(opts.root);
|
|
193
246
|
copyWorkspaceTemplate(opts.root);
|
|
194
247
|
// Build the clone set keyed by member NAME so a member passed both bare and
|
|
195
|
-
// with an @ref dedupes to one clone (the ref-bearing entry wins).
|
|
196
|
-
//
|
|
248
|
+
// with an @ref dedupes to one clone (the ref-bearing entry wins). The
|
|
249
|
+
// `tinycld` repo (merged app shell + core, with core + package-scripts
|
|
250
|
+
// nested) is always cloned and pinnable via tinycldRef.
|
|
197
251
|
const refByName = new Map();
|
|
198
|
-
refByName.set('
|
|
199
|
-
refByName.set('core', opts.coreRef);
|
|
252
|
+
refByName.set('tinycld', opts.tinycldRef);
|
|
200
253
|
for (const { name, ref } of requested) {
|
|
201
254
|
// A later ref overrides an earlier bare entry; a bare entry never clears
|
|
202
255
|
// an existing ref.
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"assemble-workspace.js","sourceRoot":"","sources":["../src/assemble-workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -12,22 +12,19 @@ import { offerLinkPackage } from "./link-package.js";
|
|
|
12
12
|
import { runPrompts } from "./prompts.js";
|
|
13
13
|
export function runAssembleOnly(opts) {
|
|
14
14
|
const root = opts.root ?? process.cwd();
|
|
15
|
-
// app + core
|
|
16
|
-
// `members` list through assembleWorkspace's
|
|
17
|
-
// in the SAME `--with name@ref` surface for a
|
|
18
|
-
// (`--with
|
|
19
|
-
// out of `members` into
|
|
20
|
-
let
|
|
21
|
-
let coreRef = opts.coreRef;
|
|
15
|
+
// `tinycld` (the merged app shell + core) is the always-cloned member, not a
|
|
16
|
+
// feature, so it can't ride the `members` list through assembleWorkspace's
|
|
17
|
+
// feature validation. Accept it in the SAME `--with name@ref` surface for a
|
|
18
|
+
// uniform pinned invocation (`--with tinycld@v1 --with mail@v3`) by peeling
|
|
19
|
+
// tinycld@ref out of `members` into tinycldRef. An explicit opts.tinycldRef wins.
|
|
20
|
+
let tinycldRef = opts.tinycldRef;
|
|
22
21
|
const features = [];
|
|
23
22
|
for (const spec of opts.members ?? []) {
|
|
24
23
|
const at = spec.indexOf('@');
|
|
25
24
|
const name = at === -1 ? spec : spec.slice(0, at);
|
|
26
25
|
const ref = at === -1 ? undefined : spec.slice(at + 1) || undefined;
|
|
27
|
-
if (name === '
|
|
28
|
-
|
|
29
|
-
else if (name === 'core')
|
|
30
|
-
coreRef = coreRef ?? ref;
|
|
26
|
+
if (name === 'tinycld')
|
|
27
|
+
tinycldRef = tinycldRef ?? ref;
|
|
31
28
|
else
|
|
32
29
|
features.push(spec);
|
|
33
30
|
}
|
|
@@ -38,15 +35,12 @@ export function runAssembleOnly(opts) {
|
|
|
38
35
|
repoBase: process.env.TINYCLD_REPO_BASE,
|
|
39
36
|
...opts,
|
|
40
37
|
members: features,
|
|
41
|
-
|
|
42
|
-
coreRef,
|
|
38
|
+
tinycldRef,
|
|
43
39
|
root,
|
|
44
40
|
});
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
throw new Error(`Failed to clone required member '${required}'. Check network/auth and retry.`);
|
|
49
|
-
}
|
|
41
|
+
// The mandatory member must clone — a missing tinycld means a broken workspace.
|
|
42
|
+
if (!present.includes('tinycld')) {
|
|
43
|
+
throw new Error("Failed to clone required member 'tinycld'. Check network/auth and retry.");
|
|
50
44
|
}
|
|
51
45
|
console.log(`Workspace skeleton ready at ${root} (members: ${present.join(', ')})`);
|
|
52
46
|
}
|
|
@@ -105,7 +99,7 @@ async function main() {
|
|
|
105
99
|
}
|
|
106
100
|
export function composeAssembleOutro(members) {
|
|
107
101
|
const extras = members?.length ? `, ${members.join(', ')}` : '';
|
|
108
|
-
return `Workspace assembled (
|
|
102
|
+
return `Workspace assembled (tinycld${extras}). Run \`pnpm install\` at the root.`;
|
|
109
103
|
}
|
|
110
104
|
export function resolveMode(args) {
|
|
111
105
|
if (args.assembleOnly && args.new) {
|
|
@@ -125,7 +119,7 @@ function printUsage() {
|
|
|
125
119
|
'',
|
|
126
120
|
pc.bold('Modes (one is required):'),
|
|
127
121
|
` ${pc.cyan('--new <slug>')} Scaffold a new feature package.`,
|
|
128
|
-
` ${pc.cyan('--assemble-only')} Assemble a workspace root (clones
|
|
122
|
+
` ${pc.cyan('--assemble-only')} Assemble a workspace root (clones tinycld + --with features).`,
|
|
129
123
|
'',
|
|
130
124
|
pc.bold('Examples:'),
|
|
131
125
|
' npx @tinycld/bootstrap --new my-feature',
|
|
@@ -171,7 +165,7 @@ function printNextSteps({ slug, relTarget, linked, layout }) {
|
|
|
171
165
|
// The meta-repo was cloned into the wrapper, so the wrapper itself is the
|
|
172
166
|
// workspace root and the new package is a member directory inside it.
|
|
173
167
|
// New users may not realize they just got a self-contained workspace.
|
|
174
|
-
lines.push(pc.dim(` Scaffolded a self-contained tinycld workspace.\n The workspace root is ./${wsRoot}/ and your package is ./${relTarget}/.\n The app member (Expo + PocketBase) is ./${wsRoot}/
|
|
168
|
+
lines.push(pc.dim(` Scaffolded a self-contained tinycld workspace.\n The workspace root is ./${wsRoot}/ and your package is ./${relTarget}/.\n The app member (Expo + PocketBase) is ./${wsRoot}/tinycld/.\n`));
|
|
175
169
|
}
|
|
176
170
|
lines.push(` ${pc.dim(`# ${step++}. Initialize git and push to GitHub`)}`);
|
|
177
171
|
lines.push(` cd ${relTarget}`);
|
|
@@ -197,7 +191,7 @@ function printNextSteps({ slug, relTarget, linked, layout }) {
|
|
|
197
191
|
lines.push(' pnpm exec tinycld-pkg check');
|
|
198
192
|
lines.push('');
|
|
199
193
|
lines.push(` ${pc.dim(`# ${step++}. Run the app (Expo + PocketBase, single-port dev proxy)`)}`);
|
|
200
|
-
lines.push(` cd ${join(wsRoot, '
|
|
194
|
+
lines.push(` cd ${join(wsRoot, 'tinycld')}`);
|
|
201
195
|
lines.push(' pnpm run dev');
|
|
202
196
|
lines.push('');
|
|
203
197
|
console.log(lines.join('\n'));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,EAAiC,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,UAAU,eAAe,CAAC,IAA8B;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACvC,6EAA6E;IAC7E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tinycld/bootstrap",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Scaffolder for @tinycld feature packages",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"lint:fix": "biome check --write .",
|
|
41
41
|
"typecheck": "tsc --noEmit",
|
|
42
42
|
"checks": "pnpm run lint && pnpm run typecheck",
|
|
43
|
-
"test": "vitest run",
|
|
43
|
+
"test": "vitest run --exclude '**/tests/integration/**'",
|
|
44
|
+
"test:integration": "vitest run tests/integration",
|
|
44
45
|
"release": "pnpm publish"
|
|
45
46
|
}
|
|
46
47
|
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"extends": "
|
|
2
|
+
"extends": "@tinycld/core/tsconfig.package-base.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"baseUrl": ".",
|
|
5
5
|
"paths": {
|
|
6
|
-
"~/tinycld/{{PKG_SLUG}}/*": ["./tinycld/{{PKG_SLUG}}/*"]
|
|
7
|
-
"@tinycld/core/*": ["../core/*"],
|
|
8
|
-
"@tinycld/app-generated/*": ["../app/lib/generated/*"]
|
|
6
|
+
"~/tinycld/{{PKG_SLUG}}/*": ["./tinycld/{{PKG_SLUG}}/*"]
|
|
9
7
|
}
|
|
10
8
|
},
|
|
11
|
-
"include": ["tinycld/**/*.ts", "tinycld/**/*.tsx"
|
|
9
|
+
"include": ["tinycld/**/*.ts", "tinycld/**/*.tsx"],
|
|
12
10
|
"exclude": ["node_modules", "server", "pb-migrations", "tests/**/*.spec.ts"]
|
|
13
11
|
}
|
|
@@ -17,9 +17,10 @@
|
|
|
17
17
|
// getPackages() discovers it.
|
|
18
18
|
//
|
|
19
19
|
// Members are linked into BOTH the workspace-root node_modules/@tinycld/ and
|
|
20
|
-
//
|
|
21
|
-
// app-scoped links are the ones that matter for
|
|
22
|
-
// resolution from the workspace root and other
|
|
20
|
+
// tinycld/node_modules/@tinycld/. Metro resolves deps from the tinycld member
|
|
21
|
+
// (the app shell), so the tinycld-scoped links are the ones that matter for
|
|
22
|
+
// bundling; the root links cover resolution from the workspace root and other
|
|
23
|
+
// members.
|
|
23
24
|
import * as fs from 'node:fs'
|
|
24
25
|
import * as path from 'node:path'
|
|
25
26
|
import { getPackages } from '../tinycld.packages'
|
|
@@ -44,6 +45,20 @@ function memberDirsByName(): Map<string, string> {
|
|
|
44
45
|
// not a dir, or no/unreadable package.json — skip
|
|
45
46
|
}
|
|
46
47
|
}
|
|
48
|
+
// @tinycld/core lives nested in the tinycld member (<WS_ROOT>/tinycld/core/);
|
|
49
|
+
// the top-level scan won't find it. Register it explicitly so the
|
|
50
|
+
// node_modules/@tinycld/core symlink is still created.
|
|
51
|
+
if (!index.has('@tinycld/core')) {
|
|
52
|
+
const nestedCore = path.join(WS_ROOT, 'tinycld', 'core')
|
|
53
|
+
try {
|
|
54
|
+
const name = JSON.parse(
|
|
55
|
+
fs.readFileSync(path.join(nestedCore, 'package.json'), 'utf8')
|
|
56
|
+
).name
|
|
57
|
+
if (name === '@tinycld/core') index.set('@tinycld/core', nestedCore)
|
|
58
|
+
} catch {
|
|
59
|
+
// no nested core — skip
|
|
60
|
+
}
|
|
61
|
+
}
|
|
47
62
|
return index
|
|
48
63
|
}
|
|
49
64
|
|
|
@@ -73,7 +88,7 @@ function main(): void {
|
|
|
73
88
|
const dirs = memberDirsByName()
|
|
74
89
|
const targets = [
|
|
75
90
|
path.join(WS_ROOT, 'node_modules'),
|
|
76
|
-
path.join(WS_ROOT, '
|
|
91
|
+
path.join(WS_ROOT, 'tinycld', 'node_modules'),
|
|
77
92
|
]
|
|
78
93
|
|
|
79
94
|
let linked = 0
|
|
@@ -91,6 +106,21 @@ function main(): void {
|
|
|
91
106
|
}
|
|
92
107
|
linked++
|
|
93
108
|
}
|
|
109
|
+
|
|
110
|
+
// @tinycld/app-generated is NOT a workspace member (it's the generator's
|
|
111
|
+
// output dir, tinycld/lib/generated/). Link it explicitly so core's
|
|
112
|
+
// `@tinycld/app-generated/*` imports resolve by name from any consumer that
|
|
113
|
+
// pulls core in via its exports map. Skip if the generated dir doesn't exist
|
|
114
|
+
// yet (generator runs in the same postinstall, but ordering/partial runs vary).
|
|
115
|
+
const appGeneratedDir = path.join(WS_ROOT, 'tinycld', 'lib', 'generated')
|
|
116
|
+
if (fs.existsSync(appGeneratedDir)) {
|
|
117
|
+
for (const nm of targets) {
|
|
118
|
+
if (fs.existsSync(nm)) linkInto(nm, 'app-generated', appGeneratedDir)
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
console.warn('[link-members] tinycld/lib/generated not present — skipping @tinycld/app-generated link')
|
|
122
|
+
}
|
|
123
|
+
|
|
94
124
|
console.log(`[link-members] linked ${linked} workspace member(s) into node_modules/@tinycld/`)
|
|
95
125
|
}
|
|
96
126
|
|
|
@@ -48,6 +48,19 @@ export function getPackages(): string[] {
|
|
|
48
48
|
}
|
|
49
49
|
if (hasManifest(dir)) features.push(name)
|
|
50
50
|
}
|
|
51
|
+
|
|
52
|
+
// @tinycld/core moved INSIDE the tinycld member (at <wsRoot>/tinycld/core/);
|
|
53
|
+
// the top-level scan above won't see it. Look for it explicitly so it is
|
|
54
|
+
// still listed first.
|
|
55
|
+
if (!core) {
|
|
56
|
+
const nestedCorePkg = path.join(wsRoot, 'tinycld', 'core', 'package.json')
|
|
57
|
+
try {
|
|
58
|
+
const name = JSON.parse(fs.readFileSync(nestedCorePkg, 'utf8')).name
|
|
59
|
+
if (name === CORE_NAME) core = name
|
|
60
|
+
} catch {
|
|
61
|
+
// no nested core present — fine for feature-only test trees
|
|
62
|
+
}
|
|
63
|
+
}
|
|
51
64
|
}
|
|
52
65
|
|
|
53
66
|
features.sort()
|