@tinycld/bootstrap 1.1.1 → 2.0.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 +82 -38
- package/dist/args.js +16 -3
- package/dist/args.js.map +1 -1
- package/dist/{bootstrap-tooling.js → assemble-workspace.js} +10 -10
- package/dist/assemble-workspace.js.map +1 -0
- package/dist/index.js +50 -9
- package/dist/index.js.map +1 -1
- package/dist/link-package.js +4 -4
- package/dist/link-package.js.map +1 -1
- package/package.json +3 -2
- package/templates/shared/.github/workflows/ci.yml +23 -25
- package/templates/shared/README.md +9 -8
- package/dist/bootstrap-tooling.js.map +0 -1
- package/dist/link-core.js +0 -99
- package/dist/link-core.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,23 +1,56 @@
|
|
|
1
1
|
# @tinycld/bootstrap
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`@tinycld/bootstrap` does two jobs:
|
|
4
|
+
|
|
5
|
+
- **`--new <slug>`** — scaffold a new feature package (manifest, CI workflow, sample screens, seed, migrations, optionally a Go server).
|
|
6
|
+
- **`--assemble-only`** — assemble a workspace root in the current directory by cloning the [`app`](https://github.com/tinycld/app) shell, the [`core`](https://github.com/tinycld/core) library, and any features named with `--with <slug>`.
|
|
4
7
|
|
|
5
8
|
Modeled after [`create-vite`](https://github.com/vitejs/vite/tree/main/packages/create-vite): tiny CLI, templates embedded in the published npm package, no runtime network fetch.
|
|
6
9
|
|
|
7
10
|
## Requirements
|
|
8
11
|
|
|
9
|
-
- **[npm](https://docs.npmjs.com/)**
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
+
- **[npm](https://docs.npmjs.com/)** on Node ≥ 24 (the package's `engines.node` is `>=24`; older Node may work but is unsupported).
|
|
13
|
+
- `git` (always) and `gh` (only for the suggested "initial push" next-step) on `$PATH`.
|
|
14
|
+
|
|
15
|
+
The two modes are independent — scaffold mode does not require a pre-existing workspace, and assemble mode does not require a scaffolded package. They compose: a common flow is `--assemble-only` once to set up `~/code/tinycld/`, then `--new <slug>` from inside that workspace to add a feature.
|
|
16
|
+
|
|
17
|
+
## Assemble a workspace (`--assemble-only`)
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
mkdir ~/code/tinycld && cd ~/code/tinycld
|
|
21
|
+
npx @tinycld/bootstrap@latest --assemble-only --with mail --with contacts
|
|
22
|
+
npm install # links members + runs the generator (postinstall)
|
|
23
|
+
cd app && npm run dev
|
|
24
|
+
```
|
|
25
|
+
|
|
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.
|
|
27
|
+
|
|
28
|
+
`--with name@ref` pins a clone to a tag, branch, or commit:
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
npx @tinycld/bootstrap@latest --assemble-only \
|
|
32
|
+
--with app@v1.2.0 --with core@v1.2.0 --with mail@v0.3.1
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Skipped if the target directory already exists, so re-running is safe.
|
|
12
36
|
|
|
13
|
-
|
|
37
|
+
Set `TINYCLD_REPO_BASE` to clone over HTTPS instead of the default SSH (`git@github.com:tinycld`). CI uses this:
|
|
14
38
|
|
|
15
39
|
```sh
|
|
16
|
-
|
|
40
|
+
TINYCLD_REPO_BASE=https://github.com/tinycld \
|
|
41
|
+
npx @tinycld/bootstrap@latest --assemble-only --with mail
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Scaffold a new package (`--new`)
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
npx @tinycld/bootstrap --new my-feature
|
|
17
48
|
```
|
|
18
49
|
|
|
19
50
|
You'll be walked through an interactive prompt. The positional argument (`my-feature`) is the **slug** — kebab-case, 3–40 chars, becomes `@tinycld/my-feature`, the URL segment `/a/<orgSlug>/my-feature/`, and the Go module `tinycld.org/packages/my-feature`. Leave it off to be asked for it.
|
|
20
51
|
|
|
52
|
+
If `--new` runs from inside an existing workspace root (`app/` and `core/` siblings detected), the new package is scaffolded as a sibling and the link step adds it to the workspace `package.json`. Otherwise the CLI creates a wrapper directory `./tinycld-<slug>/` with the package at `./tinycld-<slug>/<slug>/`, assembles a workspace around it (cloning `app` + `core`), and links — leaving you a self-contained, runnable workspace.
|
|
53
|
+
|
|
21
54
|
### Prompts
|
|
22
55
|
|
|
23
56
|
| Prompt | Example | Notes |
|
|
@@ -31,15 +64,18 @@ You'll be walked through an interactive prompt. The positional argument (`my-fea
|
|
|
31
64
|
| **Keyboard shortcut** (full only) | `f` | Single lowercase letter, or blank. |
|
|
32
65
|
| **Include a Go server?** (full only) | `y` / `n` | If no, `server/` and the manifest's `server` field are omitted. |
|
|
33
66
|
| **Target directory** | `./my-feature` | Default creates the new repo as a child of the current directory. Must not exist or must be empty. |
|
|
34
|
-
| **Link into the
|
|
67
|
+
| **Link into the workspace?** | `y` / `n` | After scaffolding, the CLI adds the package to the workspace `package.json`'s `workspaces` array and runs `npm install` at the workspace root. If cwd isn't a workspace root, it assembles one (cloning `app` + `core`) first. Suppress with `--no-link`. |
|
|
35
68
|
|
|
36
69
|
### Flags (non-interactive use)
|
|
37
70
|
|
|
38
71
|
Every prompt has a corresponding flag. Pass `--yes` (or `-y`) to accept all defaults and skip everything that wasn't given a flag — useful for scripted scaffolding.
|
|
39
72
|
|
|
40
|
-
| Flag | Maps to
|
|
73
|
+
| Flag | Maps to | Notes |
|
|
41
74
|
|---|---|---|
|
|
42
|
-
|
|
|
75
|
+
| `--new` | Mode selector | Required for scaffold mode. Mutually exclusive with `--assemble-only`. |
|
|
76
|
+
| `--assemble-only` | Mode selector | Required for workspace-assembly mode. Mutually exclusive with `--new`. |
|
|
77
|
+
| `--with <slug>` | Assemble-only | Repeatable. Each adds one feature sibling. Accepts `--with name@ref` to pin to a tag/branch/commit. |
|
|
78
|
+
| *(positional)* | Package slug (scaffold) | First non-flag argument. Pair with `--new` to set the slug non-interactively. |
|
|
43
79
|
| `--name <s>` | Human-readable name | Defaults to title-cased slug. |
|
|
44
80
|
| `--description <s>` | Description | |
|
|
45
81
|
| `--preset <full\|settings-only>` | Preset | |
|
|
@@ -48,19 +84,19 @@ Every prompt has a corresponding flag. Pass `--yes` (or `-y`) to accept all defa
|
|
|
48
84
|
| `--shortcut <c>` | Keyboard shortcut | Single lowercase letter. |
|
|
49
85
|
| `--server` / `--no-server` | Include a Go server | Full preset only. |
|
|
50
86
|
| `--target <dir>` | Target directory | Default `./<slug>`. |
|
|
51
|
-
| `--link` / `--no-link` | Link into the
|
|
87
|
+
| `--link` / `--no-link` | Link into the workspace | Forces the post-scaffold link step on or off, skipping the prompt. |
|
|
52
88
|
| `--yes`, `-y` | — | Accept all defaults; with `--no-link`, fully non-interactive. |
|
|
53
89
|
|
|
54
90
|
Example, fully non-interactive:
|
|
55
91
|
|
|
56
92
|
```sh
|
|
57
|
-
npx @tinycld/bootstrap my-feature \
|
|
93
|
+
npx @tinycld/bootstrap --new my-feature \
|
|
58
94
|
--yes --no-link \
|
|
59
95
|
--description "Tracks widgets across the org" \
|
|
60
96
|
--preset full --icon box --nav-order 25 --shortcut w
|
|
61
97
|
```
|
|
62
98
|
|
|
63
|
-
`--help` is not wired (yet) — run `npx @tinycld/bootstrap` with no argv to
|
|
99
|
+
`--help` is not wired (yet) — run `npx @tinycld/bootstrap` with no argv to get a usage summary listing both modes.
|
|
64
100
|
|
|
65
101
|
## Presets
|
|
66
102
|
|
|
@@ -75,16 +111,16 @@ Matches the shape of `@tinycld/contacts`, `@tinycld/mail`, `@tinycld/calendar`,
|
|
|
75
111
|
|
|
76
112
|
```
|
|
77
113
|
my-feature/
|
|
78
|
-
├── .github/workflows/ci.yml #
|
|
114
|
+
├── .github/workflows/ci.yml # assembles the workspace via bootstrap --assemble-only, runs tinycld-pkg check + test:e2e
|
|
79
115
|
├── .gitignore # node_modules, *.tsbuildinfo, lockfiles, .DS_Store
|
|
80
116
|
├── README.md # developer-facing onboarding for this package
|
|
81
117
|
├── manifest.ts # name, slug, routes, nav, collections, seed, server, ...
|
|
82
118
|
├── package.json # @tinycld/my-feature, peer deps, scripts, exports map
|
|
83
|
-
├── tsconfig.json # extends ../
|
|
119
|
+
├── tsconfig.json # extends ../app/tsconfig.package-base.json
|
|
84
120
|
├── pb-migrations/
|
|
85
121
|
│ └── 1800000000_create_my-feature.js # creates my_feature_items collection
|
|
86
122
|
├── server/
|
|
87
|
-
│ ├── go.mod # module tinycld.org/packages/my-feature; replaces tinycld.org/core → ../../
|
|
123
|
+
│ ├── go.mod # module tinycld.org/packages/my-feature; replaces tinycld.org/core → ../../core/server
|
|
88
124
|
│ └── register.go # func Register(app) hook for server-side wiring
|
|
89
125
|
├── tests/
|
|
90
126
|
│ └── manifest.test.ts # vitest smoke test of manifest shape
|
|
@@ -131,7 +167,7 @@ my-service/
|
|
|
131
167
|
|
|
132
168
|
## Manifest fields
|
|
133
169
|
|
|
134
|
-
The scaffolded `manifest.ts` is the single source of truth for what a package contributes. Templates only fill in the fields appropriate for the chosen preset; the full reference (every field, when to use it) lives in [
|
|
170
|
+
The scaffolded `manifest.ts` is the single source of truth for what a package contributes. Templates only fill in the fields appropriate for the chosen preset; the full reference (every field, when to use it) lives in the [manifest schema docs](https://tinycld.org/docs/reference/manifest-schema). Quick summary:
|
|
135
171
|
|
|
136
172
|
| Field | Meaning |
|
|
137
173
|
|---|---|
|
|
@@ -150,7 +186,7 @@ All path-shaped fields use **short subpaths** (`'screens'`, `'sidebar'`, `'colle
|
|
|
150
186
|
|
|
151
187
|
## After scaffolding
|
|
152
188
|
|
|
153
|
-
If you accepted the link-into-
|
|
189
|
+
If you accepted the link-into-workspace prompt, the package is already a workspace member and `npm install` has run. Otherwise the CLI prints next-steps you can copy verbatim:
|
|
154
190
|
|
|
155
191
|
```sh
|
|
156
192
|
# 1. Initialize git and push to GitHub
|
|
@@ -160,43 +196,51 @@ git add .
|
|
|
160
196
|
git commit -m 'chore: initial scaffold'
|
|
161
197
|
gh repo create tinycld/my-feature --public --source=. --push
|
|
162
198
|
|
|
163
|
-
# 2. Link into the
|
|
164
|
-
cd
|
|
165
|
-
|
|
199
|
+
# 2. Link into the workspace (add as a member, then install)
|
|
200
|
+
cd ..
|
|
201
|
+
# ensure "my-feature" is listed in the workspace package.json's "workspaces" array, then:
|
|
202
|
+
npm install
|
|
166
203
|
|
|
167
|
-
# 3. Verify (
|
|
168
|
-
|
|
204
|
+
# 3. Verify (scoped to this member)
|
|
205
|
+
cd my-feature
|
|
206
|
+
npx tinycld-pkg check
|
|
169
207
|
```
|
|
170
208
|
|
|
171
|
-
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
|
|
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.
|
|
172
210
|
|
|
173
|
-
> ⚠️ **`
|
|
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 `npm run dev` is already running, restart it (Ctrl-C, then `npm run dev`) so the new member is picked up. CI is fine — it always starts fresh.
|
|
174
212
|
|
|
175
213
|
### Day-to-day development
|
|
176
214
|
|
|
177
|
-
Most work happens **inside
|
|
215
|
+
Most work happens **from inside the package** with the workspace assembled around it:
|
|
216
|
+
|
|
217
|
+
```sh
|
|
218
|
+
cd my-feature
|
|
219
|
+
npx tinycld-pkg check # biome + tsc + vitest, scoped to this member
|
|
220
|
+
npx tinycld-pkg test # vitest only
|
|
221
|
+
npx tinycld-pkg test:e2e # playwright for this member
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
To run the app itself, drop into the app shell:
|
|
178
225
|
|
|
179
226
|
```sh
|
|
180
|
-
cd ../
|
|
181
|
-
npm run
|
|
182
|
-
npm run checks
|
|
183
|
-
npm run test:unit # vitest, includes your tests/ via the packages glob
|
|
227
|
+
cd ../app
|
|
228
|
+
npm run dev # expo + pocketbase, fronted by a single-port dev proxy
|
|
229
|
+
npm run checks # biome + tsc, ecosystem-wide
|
|
184
230
|
```
|
|
185
231
|
|
|
186
|
-
Hot reload picks up changes in your package the same way as core code, since
|
|
232
|
+
Hot reload picks up changes in your package the same way as core code, since members are symlinked.
|
|
187
233
|
|
|
188
234
|
### Running the scaffolded package's own CI locally
|
|
189
235
|
|
|
190
|
-
The package's `.github/workflows/ci.yml`
|
|
236
|
+
The package's `.github/workflows/ci.yml` mirrors what GitHub Actions runs:
|
|
191
237
|
|
|
192
|
-
1.
|
|
193
|
-
2. `npm install`
|
|
194
|
-
3. `
|
|
195
|
-
4.
|
|
196
|
-
5. **Typecheck from inside `tinycld/`** (`npm run typecheck`) — the app shell's tsconfig pulls in `expo`'s base, `uniwind` global type augments (which add `className` to RN components), and the live `~/types/pbSchema` generated from PocketBase. A standalone `tsc` invocation inside the package can't see those.
|
|
197
|
-
6. Run unit tests from the package (vitest discovers them via the `packages/@*/*/tests/**` glob in `tinycld/vitest.config.ts`).
|
|
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. `npm install` at the workspace root (this also runs the package generator via the postinstall hook).
|
|
240
|
+
3. `npx tinycld-pkg check` from inside the package directory — runs biome (scoped), tsc, and vitest.
|
|
241
|
+
4. `npx tinycld-pkg test:e2e` if the package ships Playwright specs under `tests/`.
|
|
198
242
|
|
|
199
|
-
|
|
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.
|
|
200
244
|
|
|
201
245
|
## Import conventions the templates assume
|
|
202
246
|
|
package/dist/args.js
CHANGED
|
@@ -13,8 +13,14 @@ export class ArgParseError extends Error {
|
|
|
13
13
|
}
|
|
14
14
|
const STRING_FLAGS = new Set(['name', 'description', 'preset', 'icon', 'shortcut', 'target']);
|
|
15
15
|
const NUMBER_FLAGS = new Set(['nav-order']);
|
|
16
|
-
const BOOL_FLAGS = new Set(['server', 'link', 'yes', '
|
|
16
|
+
const BOOL_FLAGS = new Set(['server', 'link', 'yes', 'new', 'assemble-only']);
|
|
17
17
|
const BOOL_ALIASES = { y: 'yes' };
|
|
18
|
+
// Removed in v2. Surface a targeted error so users who hit these (from old
|
|
19
|
+
// docs, old CI workflows, or muscle memory) get an actionable message instead
|
|
20
|
+
// of the generic "unknown flag" / "missing value" they'd otherwise see.
|
|
21
|
+
const REMOVED_FLAGS = {
|
|
22
|
+
tooling: '`--tooling` was removed in v2. Use `--assemble-only` instead.',
|
|
23
|
+
};
|
|
18
24
|
export function parseArgs(argv) {
|
|
19
25
|
const out = {};
|
|
20
26
|
const positionals = [];
|
|
@@ -32,6 +38,10 @@ export function parseArgs(argv) {
|
|
|
32
38
|
const isNegated = rawName.startsWith('no-');
|
|
33
39
|
const baseName = isNegated ? rawName.slice(3) : rawName;
|
|
34
40
|
const canonical = BOOL_ALIASES[baseName] ?? baseName;
|
|
41
|
+
if (canonical in REMOVED_FLAGS) {
|
|
42
|
+
issues.push({ flag: canonical, reason: REMOVED_FLAGS[canonical] ?? 'removed' });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
35
45
|
if (BOOL_FLAGS.has(canonical)) {
|
|
36
46
|
if (inlineValue !== undefined) {
|
|
37
47
|
issues.push({ flag: canonical, reason: 'boolean flag takes no value' });
|
|
@@ -122,8 +132,11 @@ function setBool(out, name, value) {
|
|
|
122
132
|
case 'yes':
|
|
123
133
|
out.yes = value;
|
|
124
134
|
break;
|
|
125
|
-
case '
|
|
126
|
-
out.
|
|
135
|
+
case 'new':
|
|
136
|
+
out.new = value;
|
|
137
|
+
break;
|
|
138
|
+
case 'assemble-only':
|
|
139
|
+
out.assembleOnly = value;
|
|
127
140
|
break;
|
|
128
141
|
}
|
|
129
142
|
}
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,13 @@ import { dirname, join, relative } from 'node:path';
|
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
// All feature members that exist in the ecosystem. The workspace manifest lists
|
|
6
6
|
// ALL of them (npm tolerates absent dirs), so a partial checkout still installs.
|
|
7
|
-
// But --
|
|
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
|
-
// app + core are always cloned by
|
|
10
|
-
// the clone set in
|
|
11
|
-
// appRef/coreRef). package-scripts (the tinycld-pkg CLI) now lives INSIDE
|
|
12
|
-
// app member at app/package-scripts, so it arrives with the app clone and
|
|
13
|
-
// never cloned separately.
|
|
9
|
+
// app + core are always cloned by assemble-only mode (the minimum viable
|
|
10
|
+
// workspace); the clone set in assembleWorkspace seeds them directly (pinnable
|
|
11
|
+
// via appRef/coreRef). package-scripts (the tinycld-pkg CLI) now lives INSIDE
|
|
12
|
+
// the app member at app/package-scripts, so it arrives with the app clone and
|
|
13
|
+
// is never cloned separately.
|
|
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];
|
|
@@ -66,8 +66,8 @@ export function writeWorkspaceManifest(dir) {
|
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Resolve the workspace-template dir relative to this module. Published builds
|
|
69
|
-
* have `dist/
|
|
70
|
-
* `src/
|
|
69
|
+
* have `dist/assemble-workspace.js` next to `templates/`; dev has
|
|
70
|
+
* `src/assemble-workspace.ts` under the same parent. Both → `../templates/workspace`.
|
|
71
71
|
*/
|
|
72
72
|
function resolveWorkspaceTemplateDir() {
|
|
73
73
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
@@ -132,7 +132,7 @@ function realClone(url, dest, ref) {
|
|
|
132
132
|
* NOT run npm install (the caller / CI controls that, since it may want a
|
|
133
133
|
* clean `npm ci`).
|
|
134
134
|
*/
|
|
135
|
-
export function
|
|
135
|
+
export function assembleWorkspace(opts) {
|
|
136
136
|
// Each requested member may be `name` or `name@ref`. Validate the NAME part.
|
|
137
137
|
const requested = (opts.members ?? []).map(splitRef);
|
|
138
138
|
const unknown = requested.filter((m) => !ALL_FEATURES.includes(m.name));
|
|
@@ -172,4 +172,4 @@ export function bootstrapTooling(opts) {
|
|
|
172
172
|
}
|
|
173
173
|
return present;
|
|
174
174
|
}
|
|
175
|
-
//# sourceMappingURL=
|
|
175
|
+
//# sourceMappingURL=assemble-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assemble-workspace.js","sourceRoot":"","sources":["../src/assemble-workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,15 +5,15 @@ import { pathToFileURL } from 'node:url';
|
|
|
5
5
|
import { intro, outro } from '@clack/prompts';
|
|
6
6
|
import pc from 'picocolors';
|
|
7
7
|
import { ArgParseError, parseArgs } from "./args.js";
|
|
8
|
-
import {
|
|
8
|
+
import { assembleWorkspace } from "./assemble-workspace.js";
|
|
9
9
|
import { copyTemplate, resolveTemplatesRoot } from "./copy-template.js";
|
|
10
10
|
import { detectLayout } from "./layout.js";
|
|
11
11
|
import { offerLinkPackage } from "./link-package.js";
|
|
12
12
|
import { runPrompts } from "./prompts.js";
|
|
13
|
-
export function
|
|
13
|
+
export function runAssembleOnly(opts) {
|
|
14
14
|
const root = opts.root ?? process.cwd();
|
|
15
15
|
// app + core are always-cloned members, not features, so they can't ride the
|
|
16
|
-
// `members` list through
|
|
16
|
+
// `members` list through assembleWorkspace's feature validation. Accept them
|
|
17
17
|
// in the SAME `--with name@ref` surface for a uniform pinned invocation
|
|
18
18
|
// (`--with app@v1 --with core@v2 --with mail@v3`) by peeling app@ref/core@ref
|
|
19
19
|
// out of `members` into appRef/coreRef. An explicit opts.appRef/coreRef wins.
|
|
@@ -33,8 +33,8 @@ export function runToolingMode(opts) {
|
|
|
33
33
|
}
|
|
34
34
|
// Honor TINYCLD_REPO_BASE (CI sets it to an HTTPS base since runners have no
|
|
35
35
|
// SSH key). Listed first so an explicit opts.repoBase still wins via spread;
|
|
36
|
-
// when neither is set,
|
|
37
|
-
const present =
|
|
36
|
+
// when neither is set, assembleWorkspace falls back to its SSH default.
|
|
37
|
+
const present = assembleWorkspace({
|
|
38
38
|
repoBase: process.env.TINYCLD_REPO_BASE,
|
|
39
39
|
...opts,
|
|
40
40
|
members: features,
|
|
@@ -51,7 +51,9 @@ export function runToolingMode(opts) {
|
|
|
51
51
|
console.log(`Workspace skeleton ready at ${root} (members: ${present.join(', ')})`);
|
|
52
52
|
}
|
|
53
53
|
async function main() {
|
|
54
|
-
|
|
54
|
+
// Parse + mode-resolve BEFORE opening a clack session — anything that exits
|
|
55
|
+
// early (parse error, usage, mutex error) prints plainly and avoids the
|
|
56
|
+
// dangling `┌ @tinycld/bootstrap` banner with no matching footer.
|
|
55
57
|
let args;
|
|
56
58
|
try {
|
|
57
59
|
args = parseArgs(process.argv.slice(2));
|
|
@@ -66,9 +68,15 @@ async function main() {
|
|
|
66
68
|
}
|
|
67
69
|
throw err;
|
|
68
70
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
const mode = resolveMode(args);
|
|
72
|
+
if (mode === 'usage') {
|
|
73
|
+
printUsage();
|
|
74
|
+
process.exit(2);
|
|
75
|
+
}
|
|
76
|
+
intro(pc.bold(pc.cyan('@tinycld/bootstrap')));
|
|
77
|
+
if (mode === 'assemble-only') {
|
|
78
|
+
runAssembleOnly({ root: process.cwd(), members: args.with });
|
|
79
|
+
outro(pc.green(composeAssembleOutro(args.with)));
|
|
72
80
|
return;
|
|
73
81
|
}
|
|
74
82
|
const answers = await runPrompts(args);
|
|
@@ -89,6 +97,39 @@ async function main() {
|
|
|
89
97
|
const layout = detectLayoutFromTarget(answers.targetDir, answers.slug);
|
|
90
98
|
printNextSteps({ slug: answers.slug, relTarget, linked, layout });
|
|
91
99
|
}
|
|
100
|
+
export function composeAssembleOutro(members) {
|
|
101
|
+
const extras = members?.length ? `, ${members.join(', ')}` : '';
|
|
102
|
+
return `Workspace assembled (app + core${extras}). Run \`npm install\` at the root.`;
|
|
103
|
+
}
|
|
104
|
+
export function resolveMode(args) {
|
|
105
|
+
if (args.assembleOnly && args.new) {
|
|
106
|
+
console.error(pc.red('Bad arguments: --assemble-only and --new are mutually exclusive.'));
|
|
107
|
+
return 'usage';
|
|
108
|
+
}
|
|
109
|
+
if (args.assembleOnly)
|
|
110
|
+
return 'assemble-only';
|
|
111
|
+
if (args.new)
|
|
112
|
+
return 'new';
|
|
113
|
+
return 'usage';
|
|
114
|
+
}
|
|
115
|
+
function printUsage() {
|
|
116
|
+
const lines = [
|
|
117
|
+
'',
|
|
118
|
+
`${pc.bold('@tinycld/bootstrap')} — scaffolder + workspace assembler`,
|
|
119
|
+
'',
|
|
120
|
+
pc.bold('Modes (one is required):'),
|
|
121
|
+
` ${pc.cyan('--new <slug>')} Scaffold a new feature package.`,
|
|
122
|
+
` ${pc.cyan('--assemble-only')} Assemble a workspace root (clones app + core + --with features).`,
|
|
123
|
+
'',
|
|
124
|
+
pc.bold('Examples:'),
|
|
125
|
+
' npx @tinycld/bootstrap --new my-feature',
|
|
126
|
+
' npx @tinycld/bootstrap --assemble-only --with mail --with contacts',
|
|
127
|
+
'',
|
|
128
|
+
pc.dim('Full reference: https://tinycld.org/docs/reference/cli'),
|
|
129
|
+
'',
|
|
130
|
+
];
|
|
131
|
+
console.log(lines.join('\n'));
|
|
132
|
+
}
|
|
92
133
|
function detectLayoutFromTarget(targetDir, slug) {
|
|
93
134
|
// If cwd is itself a workspace root and target is a direct child of it,
|
|
94
135
|
// we're in attach mode. Otherwise the scaffolder created a wrapper under
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/link-package.js
CHANGED
|
@@ -3,7 +3,7 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { confirm, isCancel, log, spinner } from '@clack/prompts';
|
|
5
5
|
import pc from 'picocolors';
|
|
6
|
-
import {
|
|
6
|
+
import { assembleWorkspace } from "./assemble-workspace.js";
|
|
7
7
|
import { looksLikeWorkspaceRoot } from "./layout.js";
|
|
8
8
|
/**
|
|
9
9
|
* Add `slug` to `<workspaceDir>/package.json` `workspaces[]` if it isn't already
|
|
@@ -34,7 +34,7 @@ export function ensureMember(workspaceDir, slug) {
|
|
|
34
34
|
* member and install. The existing root package.json is left untouched.
|
|
35
35
|
* - bootstrap: `workspaceDir` is a fresh wrapper that only contains the
|
|
36
36
|
* scaffolded `<slug>/` so far. Assemble the workspace *around* it —
|
|
37
|
-
* `
|
|
37
|
+
* `assembleWorkspace` generates the root scaffolding and clones app + core
|
|
38
38
|
* (no workspace meta-repo) — then ensure the new member and install. The
|
|
39
39
|
* `postinstall` (`cd app && …`) only succeeds once `app/` exists, which is
|
|
40
40
|
* why we assemble before installing.
|
|
@@ -84,11 +84,11 @@ export async function offerLinkPackage({ slug, workspaceDir, mode, assemble = re
|
|
|
84
84
|
/**
|
|
85
85
|
* Assemble the workspace skeleton at `dir`: write the workspace manifest and
|
|
86
86
|
* clone app + core (honoring `TINYCLD_REPO_BASE` for keyless/HTTPS envs).
|
|
87
|
-
* `
|
|
87
|
+
* `assembleWorkspace` is synchronous and throws on failure (unknown member, etc.);
|
|
88
88
|
* `offerLinkPackage` wraps the call so the error surfaces in the spinner.
|
|
89
89
|
*/
|
|
90
90
|
function realAssemble(dir) {
|
|
91
|
-
|
|
91
|
+
assembleWorkspace({ root: dir, repoBase: process.env.TINYCLD_REPO_BASE });
|
|
92
92
|
}
|
|
93
93
|
function realInstall(cwd) {
|
|
94
94
|
const r = spawnSync('npm', ['install'], { cwd, stdio: 'pipe', encoding: 'utf8' });
|
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,
|
|
1
|
+
{"version":3,"file":"link-package.js","sourceRoot":"","sources":["../src/link-package.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tinycld/bootstrap",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Scaffolder for @tinycld feature packages",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
|
-
"
|
|
22
|
+
"clean": "rm -rf dist",
|
|
23
|
+
"build": "npm run clean && tsc",
|
|
23
24
|
"dev": "tsx src/index.ts",
|
|
24
25
|
"lint": "biome check .",
|
|
25
26
|
"lint:fix": "biome check --write .",
|
|
@@ -18,30 +18,29 @@ jobs:
|
|
|
18
18
|
name: Typecheck & Unit
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
20
|
steps:
|
|
21
|
-
# 1.
|
|
22
|
-
- uses: actions/checkout@v5
|
|
23
|
-
with:
|
|
24
|
-
repository: tinycld/workspace
|
|
25
|
-
ref: main
|
|
26
|
-
path: ws
|
|
27
|
-
# 2. This PR's code, checked out into the member slot.
|
|
21
|
+
# 1. This PR's code, checked out into the member slot.
|
|
28
22
|
- uses: actions/checkout@v5
|
|
29
23
|
with:
|
|
30
24
|
path: ws/${{ env.PACKAGE }}
|
|
25
|
+
# 2. Pin a Node that satisfies bootstrap's engines.node (>=24) so the
|
|
26
|
+
# assemble step below doesn't depend on whatever ubuntu-latest ships.
|
|
27
|
+
- uses: actions/setup-node@v5
|
|
28
|
+
with:
|
|
29
|
+
node-version: '24'
|
|
30
|
+
# 3. Assemble the workspace root: writes package.json + tinycld.packages.ts
|
|
31
|
+
# from bootstrap's embedded templates, clones app + core as siblings.
|
|
32
|
+
# The PR's PACKAGE dir is already there and is skipped.
|
|
33
|
+
- name: Assemble workspace (app + core)
|
|
34
|
+
working-directory: ws
|
|
35
|
+
run: TINYCLD_REPO_BASE=https://github.com/tinycld npx @tinycld/bootstrap@latest --assemble-only
|
|
36
|
+
# 4. Now switch to the version the assembled workspace pins (ws/.node-version
|
|
37
|
+
# is written by the assemble step above).
|
|
31
38
|
- uses: actions/setup-node@v5
|
|
32
39
|
with:
|
|
33
40
|
node-version-file: ws/.node-version
|
|
34
|
-
cache: npm
|
|
35
|
-
cache-dependency-path: ws/package-lock.json
|
|
36
41
|
- uses: actions/setup-go@v6
|
|
37
42
|
with:
|
|
38
43
|
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
44
|
- name: Install (workspace root)
|
|
46
45
|
working-directory: ws
|
|
47
46
|
run: npm install
|
|
@@ -53,25 +52,24 @@ jobs:
|
|
|
53
52
|
name: E2E
|
|
54
53
|
runs-on: ubuntu-latest
|
|
55
54
|
steps:
|
|
56
|
-
- uses: actions/checkout@v5
|
|
57
|
-
with:
|
|
58
|
-
repository: tinycld/workspace
|
|
59
|
-
ref: main
|
|
60
|
-
path: ws
|
|
61
55
|
- uses: actions/checkout@v5
|
|
62
56
|
with:
|
|
63
57
|
path: ws/${{ env.PACKAGE }}
|
|
58
|
+
# Pin a Node that satisfies bootstrap's engines.node (>=24) so the
|
|
59
|
+
# assemble step below doesn't depend on whatever ubuntu-latest ships.
|
|
60
|
+
- uses: actions/setup-node@v5
|
|
61
|
+
with:
|
|
62
|
+
node-version: '24'
|
|
63
|
+
- name: Assemble workspace (app + core)
|
|
64
|
+
working-directory: ws
|
|
65
|
+
run: TINYCLD_REPO_BASE=https://github.com/tinycld npx @tinycld/bootstrap@latest --assemble-only
|
|
66
|
+
# Switch to the version the assembled workspace pins.
|
|
64
67
|
- uses: actions/setup-node@v5
|
|
65
68
|
with:
|
|
66
69
|
node-version-file: ws/.node-version
|
|
67
|
-
cache: npm
|
|
68
|
-
cache-dependency-path: ws/package-lock.json
|
|
69
70
|
- uses: actions/setup-go@v6
|
|
70
71
|
with:
|
|
71
72
|
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
73
|
- name: Install (workspace root)
|
|
76
74
|
working-directory: ws
|
|
77
75
|
run: npm install
|
|
@@ -17,9 +17,10 @@ linked by a single `npm install` at the root.
|
|
|
17
17
|
# In a fresh workspace directory, clone this package into a member slot…
|
|
18
18
|
git clone git@github.com:tinycld/{{PKG_SLUG}}.git
|
|
19
19
|
|
|
20
|
-
# …then
|
|
21
|
-
# package.json /
|
|
22
|
-
|
|
20
|
+
# …then assemble the rest of the workspace (app + core + the workspace
|
|
21
|
+
# package.json / tinycld.packages.ts). bootstrap --assemble-only skips
|
|
22
|
+
# dirs that already exist.
|
|
23
|
+
npx @tinycld/bootstrap@latest --assemble-only
|
|
23
24
|
|
|
24
25
|
# Link every member with one install at the WORKSPACE ROOT (never inside a
|
|
25
26
|
# member — siblings have no node_modules of their own; deps hoist to the root).
|
|
@@ -49,11 +50,11 @@ There is no `biome.json` in this repo — biome lives only in the app shell and
|
|
|
49
50
|
## CI
|
|
50
51
|
|
|
51
52
|
`.github/workflows/ci.yml` runs typecheck, unit tests, and e2e on every push to
|
|
52
|
-
`main` and every PR. It checks out
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
`tinycld-pkg check` / `tinycld-pkg test:e2e` —
|
|
56
|
-
locally.
|
|
53
|
+
`main` and every PR. It checks out this PR's code into a member slot, assembles
|
|
54
|
+
the rest of the workspace (`app` + `core` + the workspace `package.json` and
|
|
55
|
+
coordination files) via `npx @tinycld/bootstrap --assemble-only`, installs at
|
|
56
|
+
the workspace root, and runs `tinycld-pkg check` / `tinycld-pkg test:e2e` —
|
|
57
|
+
exactly what a developer runs locally.
|
|
57
58
|
|
|
58
59
|
## Package anatomy
|
|
59
60
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-tooling.js","sourceRoot":"","sources":["../src/bootstrap-tooling.ts"],"names":[],"mappings":"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"}
|
package/dist/link-core.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from 'node:child_process';
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
import { dirname, join, relative } from 'node:path';
|
|
4
|
-
import { confirm, isCancel, log, spinner } from '@clack/prompts';
|
|
5
|
-
import pc from 'picocolors';
|
|
6
|
-
const CORE_REPO_URL = 'git@github.com:tinycld/core.git';
|
|
7
|
-
const APP_REPO_URL = 'git@github.com:tinycld/tinycld.git';
|
|
8
|
-
const CORE_DIR_NAME = 'core';
|
|
9
|
-
const APP_DIR_NAME = 'tinycld';
|
|
10
|
-
/**
|
|
11
|
-
* Returns true if the user chose to link (even if a subprocess failed —
|
|
12
|
-
* the error is already logged, and we don't want to follow up with
|
|
13
|
-
* "here are the manual steps" when the user already expressed intent).
|
|
14
|
-
* Returns false only if linking was declined or skipped.
|
|
15
|
-
*
|
|
16
|
-
* Linking happens against the tinycld **app shell** (sibling repo
|
|
17
|
-
* `tinycld/tinycld`), which owns `packages:link`. The `core` library
|
|
18
|
-
* sibling is also cloned because the app shell installs it via
|
|
19
|
-
* `file:../core` and the package's tsconfig points at `../core/...`.
|
|
20
|
-
*/
|
|
21
|
-
export async function offerLinkCore({ packageName, targetDir, mode }) {
|
|
22
|
-
if (mode === 'skip')
|
|
23
|
-
return false;
|
|
24
|
-
const parentDir = dirname(targetDir);
|
|
25
|
-
const coreDir = join(parentDir, CORE_DIR_NAME);
|
|
26
|
-
const appDir = join(parentDir, APP_DIR_NAME);
|
|
27
|
-
const coreExists = existsSync(coreDir);
|
|
28
|
-
const appExists = existsSync(appDir);
|
|
29
|
-
if (mode === 'prompt') {
|
|
30
|
-
const missing = [];
|
|
31
|
-
if (!coreExists)
|
|
32
|
-
missing.push(CORE_DIR_NAME);
|
|
33
|
-
if (!appExists)
|
|
34
|
-
missing.push(APP_DIR_NAME);
|
|
35
|
-
const prompt = missing.length === 0
|
|
36
|
-
? `Link ${pc.bold(packageName)} into ${pc.bold(APP_DIR_NAME)} now?`
|
|
37
|
-
: `Clone ${pc.bold(missing.join(' + '))} (shallow) and link ${pc.bold(packageName)} into ${pc.bold(APP_DIR_NAME)} now?`;
|
|
38
|
-
const answer = await confirm({ message: prompt, initialValue: true });
|
|
39
|
-
if (isCancel(answer) || answer !== true)
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
if (!coreExists) {
|
|
43
|
-
if (!cloneRepo(CORE_REPO_URL, coreDir))
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
log.info(`Using existing ${CORE_DIR_NAME} at ${coreDir}`);
|
|
48
|
-
}
|
|
49
|
-
if (!appExists) {
|
|
50
|
-
if (!cloneRepo(APP_REPO_URL, appDir))
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
log.info(`Using existing ${APP_DIR_NAME} at ${appDir}`);
|
|
55
|
-
}
|
|
56
|
-
const install = spinner();
|
|
57
|
-
install.start(`Installing ${APP_DIR_NAME} dependencies (bun install)`);
|
|
58
|
-
const inst = spawnSync('bun', ['install'], { cwd: appDir, stdio: 'pipe', encoding: 'utf8' });
|
|
59
|
-
if (inst.status !== 0) {
|
|
60
|
-
install.stop(pc.red('bun install failed'), 1);
|
|
61
|
-
log.error(inst.stderr.trim() || 'bun install exited non-zero');
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
install.stop(`Installed ${APP_DIR_NAME} dependencies`);
|
|
65
|
-
// packages:link in tinycld takes a sibling-directory locator and reads
|
|
66
|
-
// the package name from the sibling's package.json. Pass a path relative
|
|
67
|
-
// to the app shell so the symlink target stays portable.
|
|
68
|
-
const link = spinner();
|
|
69
|
-
link.start(`Linking ${packageName}`);
|
|
70
|
-
const locator = relative(appDir, targetDir) || targetDir;
|
|
71
|
-
const linkResult = spawnSync('bun', ['run', 'packages:link', locator], {
|
|
72
|
-
cwd: appDir,
|
|
73
|
-
stdio: 'pipe',
|
|
74
|
-
encoding: 'utf8',
|
|
75
|
-
});
|
|
76
|
-
if (linkResult.status !== 0) {
|
|
77
|
-
link.stop(pc.red('Link failed'), 1);
|
|
78
|
-
log.error(linkResult.stderr.trim() || 'packages:link exited non-zero');
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
link.stop(`Linked ${packageName} into ${APP_DIR_NAME}`);
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
function cloneRepo(url, dest) {
|
|
85
|
-
const s = spinner();
|
|
86
|
-
s.start(`Cloning ${url} into ${dest}`);
|
|
87
|
-
const result = spawnSync('git', ['clone', '--depth', '1', url, dest], {
|
|
88
|
-
stdio: 'pipe',
|
|
89
|
-
encoding: 'utf8',
|
|
90
|
-
});
|
|
91
|
-
if (result.status !== 0) {
|
|
92
|
-
s.stop(pc.red('Clone failed'), 1);
|
|
93
|
-
log.error(result.stderr.trim() || 'git clone exited non-zero');
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
s.stop(`Cloned ${dest}`);
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=link-core.js.map
|
package/dist/link-core.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link-core.js","sourceRoot":"","sources":["../src/link-core.ts"],"names":[],"mappings":"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"}
|