@tscircuit/cli 0.0.394 → 0.1.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.
Files changed (246) hide show
  1. package/.github/workflows/bun-formatcheck.yml +26 -0
  2. package/.github/workflows/bun-pver-release.yml +25 -0
  3. package/.github/workflows/{typecheck.yml → bun-typecheck.yml} +0 -3
  4. package/LICENSE +21 -0
  5. package/README.md +33 -36
  6. package/biome.json +9 -9
  7. package/bun.lockb +0 -0
  8. package/cli/CliContext.ts +8 -0
  9. package/cli/auth/login/register.ts +73 -0
  10. package/cli/auth/logout/register.ts +11 -0
  11. package/cli/auth/register.ts +5 -0
  12. package/cli/clone/register.ts +99 -0
  13. package/cli/config/print/register.ts +12 -0
  14. package/cli/config/register.ts +5 -0
  15. package/cli/dev/register.ts +111 -0
  16. package/cli/main.ts +33 -0
  17. package/dist/main.js +537 -0
  18. package/docs/file-server-api-usage.md +57 -0
  19. package/docs/run-frame-usage.md +14 -0
  20. package/example-dir/manual-edits.json +1 -0
  21. package/example-dir/snippet.d.ts +13 -0
  22. package/example-dir/snippet.tsx +20 -0
  23. package/example-dir/types.d.ts +11 -0
  24. package/lib/cli-config/TypedConfigStore.ts +50 -0
  25. package/lib/cli-config/index.ts +16 -0
  26. package/lib/dependency-analysis/DependencyAnalyzer.ts +129 -0
  27. package/lib/dependency-analysis/getLocalFileDependencies.ts +101 -0
  28. package/lib/dependency-analysis/installNodeModuleTypes.ts +74 -0
  29. package/lib/index.ts +2 -0
  30. package/lib/project-config/index.ts +5 -0
  31. package/lib/registry-api/endpoint-types.ts +20 -0
  32. package/lib/registry-api/get-ky.ts +30 -0
  33. package/lib/server/EventsWatcher.ts +75 -0
  34. package/lib/server/createServer.ts +62 -0
  35. package/lib/site/getIndex.ts +18 -0
  36. package/package.json +27 -144
  37. package/tsconfig.json +25 -22
  38. package/.github/workflows/formatbot.yml +0 -63
  39. package/.github/workflows/release.yml +0 -40
  40. package/.github/workflows/test.yml +0 -32
  41. package/.github/workflows/windows-tests.yml +0 -32
  42. package/.prettierrc +0 -1
  43. package/DEVELOPMENT.md +0 -7
  44. package/api/README.md +0 -3
  45. package/api/db/generic-json-level.ts +0 -123
  46. package/api/db/get-db.ts +0 -26
  47. package/api/db/schema.ts +0 -65
  48. package/api/db/zod-level-db.ts +0 -148
  49. package/api/index.ts +0 -4
  50. package/api/lib/middlewares/with-db.ts +0 -18
  51. package/api/lib/middlewares/with-debug-request-logging.ts +0 -13
  52. package/api/lib/middlewares/with-error-response.ts +0 -37
  53. package/api/lib/with-winter-spec.ts +0 -9
  54. package/api/lib/zod/export_parameters.ts +0 -25
  55. package/api/routes/api/db/download.ts +0 -25
  56. package/api/routes/api/dev_package_examples/create.ts +0 -43
  57. package/api/routes/api/dev_package_examples/get.ts +0 -46
  58. package/api/routes/api/dev_package_examples/list.ts +0 -36
  59. package/api/routes/api/dev_package_examples/update.ts +0 -59
  60. package/api/routes/api/dev_server/reset.ts +0 -13
  61. package/api/routes/api/export_files/create.ts +0 -27
  62. package/api/routes/api/export_files/download.ts +0 -25
  63. package/api/routes/api/export_requests/create.ts +0 -30
  64. package/api/routes/api/export_requests/get.ts +0 -43
  65. package/api/routes/api/export_requests/list.ts +0 -26
  66. package/api/routes/api/export_requests/update.ts +0 -34
  67. package/api/routes/api/health.ts +0 -11
  68. package/api/routes/api/package_info/create.ts +0 -26
  69. package/api/routes/api/package_info/get.ts +0 -16
  70. package/api/routes/health.ts +0 -11
  71. package/api/routes/index.ts +0 -16
  72. package/api/server.ts +0 -20
  73. package/api/static-routes.ts +0 -24
  74. package/api/tests/fixtures/get-test-server.ts +0 -31
  75. package/api/tests/fixtures/start-server.ts +0 -41
  76. package/api/tests/routes/dev_package_examples/create.test.ts +0 -19
  77. package/api/tests/routes/dev_package_examples/get.test.ts +0 -25
  78. package/api/tests/routes/dev_package_examples/list.test.ts +0 -32
  79. package/api/tests/routes/dev_package_examples/update.test.ts +0 -38
  80. package/api/tests/routes/export_files/create.test.ts +0 -18
  81. package/api/tests/routes/export_files/download.test.ts +0 -29
  82. package/api/tests/routes/export_requests/create.test.ts +0 -24
  83. package/api/tests/routes/export_requests/get.test.ts +0 -41
  84. package/api/tests/routes/export_requests/list.test.ts +0 -35
  85. package/api/tests/routes/export_requests/update.test.ts +0 -50
  86. package/api/tests/routes/health.test.ts +0 -10
  87. package/bunfig.toml +0 -2
  88. package/cli/cli.ts +0 -13
  89. package/cli/lib/cmd-fns/add.ts +0 -34
  90. package/cli/lib/cmd-fns/auth-login.ts +0 -59
  91. package/cli/lib/cmd-fns/auth-logout.ts +0 -7
  92. package/cli/lib/cmd-fns/auth-sessions-create.ts +0 -3
  93. package/cli/lib/cmd-fns/auth-sessions-get.ts +0 -3
  94. package/cli/lib/cmd-fns/auth-sessions-list.ts +0 -5
  95. package/cli/lib/cmd-fns/config-clear.ts +0 -5
  96. package/cli/lib/cmd-fns/config-print-config.ts +0 -6
  97. package/cli/lib/cmd-fns/config-reveal-location.ts +0 -5
  98. package/cli/lib/cmd-fns/config-set-log-requests.ts +0 -7
  99. package/cli/lib/cmd-fns/config-set-registry.ts +0 -9
  100. package/cli/lib/cmd-fns/config-set-runtime.ts +0 -7
  101. package/cli/lib/cmd-fns/config-set-session.ts +0 -7
  102. package/cli/lib/cmd-fns/dev/check-if-initialized.ts +0 -22
  103. package/cli/lib/cmd-fns/dev/derive-selector-from-pcb-component-id.ts +0 -23
  104. package/cli/lib/cmd-fns/dev/dev-server-request-handler.ts +0 -61
  105. package/cli/lib/cmd-fns/dev/find-available-port.ts +0 -32
  106. package/cli/lib/cmd-fns/dev/fulfill-export-requests.ts +0 -162
  107. package/cli/lib/cmd-fns/dev/get-dev-server-axios.ts +0 -29
  108. package/cli/lib/cmd-fns/dev/index.ts +0 -168
  109. package/cli/lib/cmd-fns/dev/infer-export-name-from-source.ts +0 -17
  110. package/cli/lib/cmd-fns/dev/mark-all-examples-loading.ts +0 -18
  111. package/cli/lib/cmd-fns/dev/soupify-and-upload-example-file.ts +0 -62
  112. package/cli/lib/cmd-fns/dev/start-dev-server.ts +0 -34
  113. package/cli/lib/cmd-fns/dev/start-edit-event-watcher.ts +0 -347
  114. package/cli/lib/cmd-fns/dev/start-export-request-watcher.ts +0 -33
  115. package/cli/lib/cmd-fns/dev/start-fs-watcher.ts +0 -54
  116. package/cli/lib/cmd-fns/dev/upload-examples-from-directory.ts +0 -42
  117. package/cli/lib/cmd-fns/dev-server-fulfill-export-requests.ts +0 -43
  118. package/cli/lib/cmd-fns/dev-server-upload.ts +0 -56
  119. package/cli/lib/cmd-fns/export-gerbers.ts +0 -28
  120. package/cli/lib/cmd-fns/export-kicad-pcb.ts +0 -36
  121. package/cli/lib/cmd-fns/export-pnp-csv.ts +0 -32
  122. package/cli/lib/cmd-fns/gen-jlcpcb-component.ts +0 -64
  123. package/cli/lib/cmd-fns/go.ts +0 -14
  124. package/cli/lib/cmd-fns/index.ts +0 -46
  125. package/cli/lib/cmd-fns/init/create-or-modify-npmrc.ts +0 -21
  126. package/cli/lib/cmd-fns/init/get-generated-npmrc.ts +0 -8
  127. package/cli/lib/cmd-fns/init/get-generated-readme.ts +0 -41
  128. package/cli/lib/cmd-fns/init/get-generated-tsconfig.ts +0 -34
  129. package/cli/lib/cmd-fns/init/index.ts +0 -193
  130. package/cli/lib/cmd-fns/install.ts +0 -34
  131. package/cli/lib/cmd-fns/lint.ts +0 -43
  132. package/cli/lib/cmd-fns/open.ts +0 -19
  133. package/cli/lib/cmd-fns/package-examples-create.ts +0 -36
  134. package/cli/lib/cmd-fns/package-examples-get.ts +0 -20
  135. package/cli/lib/cmd-fns/package-examples-list.ts +0 -18
  136. package/cli/lib/cmd-fns/package-files-create.ts +0 -31
  137. package/cli/lib/cmd-fns/package-files-download.ts +0 -29
  138. package/cli/lib/cmd-fns/package-files-get.ts +0 -3
  139. package/cli/lib/cmd-fns/package-files-list.ts +0 -28
  140. package/cli/lib/cmd-fns/package-files-upload-directory.ts +0 -6
  141. package/cli/lib/cmd-fns/package-releases-create.ts +0 -35
  142. package/cli/lib/cmd-fns/package-releases-get.ts +0 -3
  143. package/cli/lib/cmd-fns/package-releases-list.ts +0 -32
  144. package/cli/lib/cmd-fns/package-releases-update.ts +0 -45
  145. package/cli/lib/cmd-fns/packages-create.ts +0 -16
  146. package/cli/lib/cmd-fns/packages-get.ts +0 -16
  147. package/cli/lib/cmd-fns/packages-list.ts +0 -16
  148. package/cli/lib/cmd-fns/publish/index.ts +0 -336
  149. package/cli/lib/cmd-fns/remove.ts +0 -31
  150. package/cli/lib/cmd-fns/render.ts +0 -45
  151. package/cli/lib/cmd-fns/soupify.ts +0 -31
  152. package/cli/lib/cmd-fns/uninstall.ts +0 -31
  153. package/cli/lib/cmd-fns/version.ts +0 -38
  154. package/cli/lib/create-config-manager.ts +0 -97
  155. package/cli/lib/export-fns/export-bom-csv.ts +0 -32
  156. package/cli/lib/export-fns/export-gerbers.ts +0 -108
  157. package/cli/lib/export-fns/export-kicad-pcb.ts +0 -32
  158. package/cli/lib/export-fns/export-pnp-csv.ts +0 -31
  159. package/cli/lib/get-program.ts +0 -387
  160. package/cli/lib/param-handlers/index.ts +0 -21
  161. package/cli/lib/param-handlers/interact-for-local-directory.ts +0 -58
  162. package/cli/lib/param-handlers/interact-for-local-file.ts +0 -59
  163. package/cli/lib/param-handlers/interact-for-package-example-id.ts +0 -25
  164. package/cli/lib/param-handlers/interact-for-package-name-with-version.ts +0 -63
  165. package/cli/lib/param-handlers/interact-for-package-name.ts +0 -45
  166. package/cli/lib/param-handlers/interact-for-package-release-id.ts +0 -15
  167. package/cli/lib/param-handlers/interact-for-registry-url.ts +0 -27
  168. package/cli/lib/param-handlers/interact-for-runtime.ts +0 -33
  169. package/cli/lib/param-handlers/param-handler-type.ts +0 -7
  170. package/cli/lib/posthog.ts +0 -23
  171. package/cli/lib/soupify/get-export-name-from-file.ts +0 -29
  172. package/cli/lib/soupify/get-tmp-entrpoint-filepath.ts +0 -15
  173. package/cli/lib/soupify/index.ts +0 -1
  174. package/cli/lib/soupify/run-entrypoint-file.ts +0 -59
  175. package/cli/lib/soupify/soupify-with-core.ts +0 -74
  176. package/cli/lib/soupify/soupify.ts +0 -6
  177. package/cli/lib/util/app-context.ts +0 -17
  178. package/cli/lib/util/create-context-and-run-program.ts +0 -168
  179. package/cli/lib/util/get-all-package-files.ts +0 -66
  180. package/cli/lib/util/lint-project.ts +0 -137
  181. package/cli/tests/export-gerber-keyboard.test.ts +0 -16
  182. package/cli/tests/export-gerber.test.ts +0 -49
  183. package/cli/tests/export-kicad-pcb.test.ts +0 -23
  184. package/cli/tests/export-pnp-csv.test.ts +0 -24
  185. package/cli/tests/fixtures/preload.ts +0 -54
  186. package/cli/tests/init.test.ts +0 -9
  187. package/cli/tests/open.test.ts +0 -9
  188. package/cli/tests/soupify-builder.test.ts +0 -9
  189. package/cli/tests/soupify-core.test.ts +0 -9
  190. package/dist/cli.js +0 -3676
  191. package/docs/EDIT_EVENT_PIPELINE.md +0 -34
  192. package/example-project/README.md +0 -18
  193. package/example-project/examples/basic-capacitor.tsx +0 -5
  194. package/example-project/examples/basic-chip.tsx +0 -26
  195. package/example-project/examples/basic-resistor.tsx +0 -3
  196. package/example-project/examples/macrokeypad.tsx +0 -59
  197. package/example-project/index.ts +0 -1
  198. package/example-project/package.json +0 -5
  199. package/example-project/src/ArduinoProMicroBreakout.tsx +0 -37
  200. package/example-project/src/Key.tsx +0 -46
  201. package/example-project/src/Keyswitch.tsx +0 -26
  202. package/example-project/src/KeyswitchSocket.tsx +0 -56
  203. package/example-project/src/MyCircuit.tsx +0 -38
  204. package/example-project/src/manual-edits.ts +0 -93
  205. package/frontend/README.md +0 -3
  206. package/frontend/bun.lockb +0 -0
  207. package/frontend/components/command-k.tsx +0 -86
  208. package/frontend/components/dialogs/generic-export-dialog.tsx +0 -189
  209. package/frontend/components/dialogs/gerber-export-dialog.tsx +0 -168
  210. package/frontend/components/global-context-providers.tsx +0 -11
  211. package/frontend/components/select-example-search.tsx +0 -118
  212. package/frontend/components/ui/alert-dialog.tsx +0 -139
  213. package/frontend/components/ui/alert.tsx +0 -59
  214. package/frontend/components/ui/breadcrumb.tsx +0 -115
  215. package/frontend/components/ui/button.tsx +0 -57
  216. package/frontend/components/ui/card.tsx +0 -76
  217. package/frontend/components/ui/command.tsx +0 -153
  218. package/frontend/components/ui/context-menu.tsx +0 -202
  219. package/frontend/components/ui/dialog.tsx +0 -120
  220. package/frontend/components/ui/menubar.tsx +0 -238
  221. package/frontend/components/ui/navigation-menu.tsx +0 -128
  222. package/frontend/components/ui/popover.tsx +0 -31
  223. package/frontend/components/ui/select.tsx +0 -162
  224. package/frontend/components/ui/tabs.tsx +0 -53
  225. package/frontend/components/ui/toggle-group.tsx +0 -59
  226. package/frontend/components/ui/toggle.tsx +0 -43
  227. package/frontend/components/ui/tooltip.tsx +0 -28
  228. package/frontend/components.json +0 -17
  229. package/frontend/hooks/toast-if-api-not-connected.ts +0 -23
  230. package/frontend/hooks/use-active-dev-package-example-lite.ts +0 -39
  231. package/frontend/hooks/use-dev-package-examples.tsx +0 -18
  232. package/frontend/hooks/use-global-store.ts +0 -42
  233. package/frontend/index.css +0 -76
  234. package/frontend/index.html +0 -13
  235. package/frontend/lib/utils.ts +0 -6
  236. package/frontend/main.tsx +0 -13
  237. package/frontend/tailwind.config.js +0 -74
  238. package/frontend/views/App.tsx +0 -22
  239. package/frontend/views/Header.tsx +0 -55
  240. package/frontend/views/HeaderMenu.tsx +0 -326
  241. package/frontend/views/MainContentView.tsx +0 -172
  242. package/frontend/vite-env.d.ts +0 -1
  243. package/frontend/vite.config.ts +0 -50
  244. package/renovate.json +0 -16
  245. package/scripts/build-cli.ts +0 -12
  246. package/tsup.config.ts +0 -7
@@ -0,0 +1,26 @@
1
+ # Created using @tscircuit/plop (npm install -g @tscircuit/plop)
2
+ name: Format Check
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ branches: [main]
9
+
10
+ jobs:
11
+ format-check:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v3
16
+
17
+ - name: Setup bun
18
+ uses: oven-sh/setup-bun@v1
19
+ with:
20
+ bun-version: latest
21
+
22
+ - name: Install dependencies
23
+ run: bun install
24
+
25
+ - name: Run format check
26
+ run: bun run format:check
@@ -0,0 +1,25 @@
1
+ # Created using @tscircuit/plop (npm install -g @tscircuit/plop)
2
+ name: Publish to npm
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ jobs:
8
+ publish:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v3
12
+ - name: Setup bun
13
+ uses: oven-sh/setup-bun@v1
14
+ with:
15
+ bun-version: latest
16
+ - uses: actions/setup-node@v3
17
+ with:
18
+ node-version: 20
19
+ registry-url: https://registry.npmjs.org/
20
+ - run: npm install -g pver
21
+ - run: bun install --frozen-lockfile
22
+ - run: bun run build
23
+ - run: pver release
24
+ env:
25
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -22,8 +22,5 @@ jobs:
22
22
  - name: Install dependencies
23
23
  run: bun i
24
24
 
25
- - name: Build (required for dist imports)
26
- run: bun run build
27
-
28
25
  - name: Run type check
29
26
  run: bunx tsc --noEmit
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 tscircuit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,57 +1,54 @@
1
- # `tsci` - The TSCircuit Command Line & Development Tools
1
+ # tscircuit command line interface (CLI)
2
2
 
3
- Command line tool for developing tscircuit projects and interacting with the
4
- tscircuit registry.
3
+ A CLI for developing, managing and publishing tscircuit code (the "npm for tscircuit")
5
4
 
6
- ## Installation
5
+ ## Usage
7
6
 
8
7
  ```bash
9
- npm install -g @tscircuit/cli
8
+ # Start a local server that watches for changes in
9
+ # this file or it's dependencies and updates the
10
+ # browser preview
11
+ tsci dev ./path/to/file.tsx
12
+
13
+ # Clone a snippet from the registry
14
+ tsci clone author/snippetName
10
15
  ```
11
16
 
12
- ## Usage
17
+ > Note: The snippets CLI uses the same configuration files as the [@tscircuit/cli](https://github.com/tscircuit/cli), so you may need to also install `npm install -g @tscircuit/cli` and run `tsci login` to authenticate!
13
18
 
14
- The `tsci` CLI is interactive by default. You can specify the `-y` or any fully-
15
- qualified with all required arguments to skip the interactive mode.
19
+ ## Installation
16
20
 
17
21
  ```bash
18
- # Interactively choose a command and options:
19
- tsci
20
-
21
- # Login
22
- tsci login
23
-
24
- # Create a Project
25
- tsci init
22
+ npm install -g @tscircuit/cli
23
+ ```
26
24
 
27
- # Develop a Project (preview, export, and edit circuit files in browser)
28
- tsci dev
25
+ ## Development
29
26
 
30
- # Manage Dependencies
31
- tsci install
32
- tsci add some-package
33
- tsci remove some-package
27
+ This command will open the `snippets.tsx` file for editing.
34
28
 
35
- # Publish a Project
36
- tsci publish
29
+ ```bash
30
+ bun run dev
37
31
  ```
38
32
 
39
- ## Developing
33
+ ## How it Works
40
34
 
41
- This project is developed with [bun](https://bun.sh/), make sure you have
42
- that installed.
35
+ When you run `snippets dev`, we start a local
36
+ server that uses the [@tscircuit/file-server](https://github.com/tscircuit/file-server) and [@tscircuit/runframe](https://github.com/tscircuit/runframe) (on the browser)
43
37
 
44
- Run `bun install` to install dependencies and `bun cli/cli.ts` to run test the cli in development, or `bun run dev` to run the dev server.
38
+ We use commanderjs to define the CLI commands inside
39
+ of `cli/main.ts`
45
40
 
46
- To run tests, run `bun test`
41
+ Utility functions are defined in `lib/*`
47
42
 
48
- If you want to test developing, run `bun dev` and visit http://127.0.0.1:5173. The project being
49
- loaded is inside `example-project`
43
+ ## Development
50
44
 
51
- ![image](https://github.com/tscircuit/cli/assets/1910070/d6facd4d-0887-4871-8aa1-e525c519c50d)
45
+ ### Dynamically Loading Runframe
52
46
 
53
- ## Features Coming Soon
47
+ Use the `RUNFRAME_STANDALONE_FILE_PATH` environment variable to point to the runframe standalone file. You will still need to run `bun run build` inside
48
+ runframe each time you'd like to load a new version of runframe.
54
49
 
55
- - [`tsci format`](https://github.com/tscircuit/cli/issues/1)
56
- - [`tsci lint`](https://github.com/tscircuit/cli/issues/2)
57
- - [`tsci open`](https://github.com/tscircuit/cli/issues/4)
50
+ ```bash
51
+ export RUNFRAME_STANDALONE_FILE_PATH=../runframe/dist/standalone.min.js
52
+ cd ../runframe && bun run build
53
+ cd ../cli && bun run dev
54
+ ```
package/biome.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json",
2
+ "$schema": "https://biomejs.dev/schemas/1.9.3/schema.json",
3
3
  "organizeImports": {
4
4
  "enabled": true
5
5
  },
@@ -8,13 +8,7 @@
8
8
  "indentStyle": "space"
9
9
  },
10
10
  "files": {
11
- "ignore": [
12
- "cosmos-export",
13
- "dist",
14
- "package.json",
15
- "tsconfig.json",
16
- "static-routes.ts"
17
- ]
11
+ "ignore": ["cosmos-export", "dist", "package.json", "tsconfig.json"]
18
12
  },
19
13
  "javascript": {
20
14
  "formatter": {
@@ -28,13 +22,19 @@
28
22
  }
29
23
  },
30
24
  "linter": {
31
- "enabled": false,
25
+ "enabled": true,
32
26
  "rules": {
27
+ "recommended": true,
33
28
  "suspicious": {
34
29
  "noExplicitAny": "off"
35
30
  },
31
+ "complexity": {
32
+ "noForEach": "off"
33
+ },
36
34
  "style": {
35
+ "noUselessElse": "off",
37
36
  "noNonNullAssertion": "off",
37
+ "useNumberNamespace": "off",
38
38
  "useFilenamingConvention": {
39
39
  "level": "error",
40
40
  "options": {
package/bun.lockb CHANGED
Binary file
@@ -0,0 +1,8 @@
1
+ import type { CliConfig } from "lib/cli-config"
2
+
3
+ /**
4
+ * The CLI context contains information that is commonly passed to all functions
5
+ */
6
+ export interface CliContext {
7
+ cliConfig: CliConfig
8
+ }
@@ -0,0 +1,73 @@
1
+ import type { Command } from "commander"
2
+ import { cliConfig } from "lib/cli-config"
3
+ import delay from "delay"
4
+ import { getKy } from "lib/registry-api/get-ky"
5
+ import type { EndpointResponse } from "lib/registry-api/endpoint-types"
6
+
7
+ export const registerAuthLogin = (program: Command) => {
8
+ program.commands
9
+ .find((c) => c.name() === "auth")!
10
+ .command("login")
11
+ .description("Authenticate CLI, login to registry")
12
+ .action(async (args) => {
13
+ const ky = getKy()
14
+
15
+ const { login_page } = await ky
16
+ .post<EndpointResponse["sessions/login_page/create"]>(
17
+ "sessions/login_page/create",
18
+ {
19
+ json: {},
20
+ },
21
+ )
22
+ .json()
23
+
24
+ console.log("Please visit the following URL to log in:")
25
+ console.log(login_page.url)
26
+
27
+ // Wait until we receive confirmation
28
+ while (true) {
29
+ const { login_page: new_login_page } = await ky
30
+ .post<EndpointResponse["sessions/login_page/get"]>(
31
+ "sessions/login_page/get",
32
+ {
33
+ json: {
34
+ login_page_id: login_page.login_page_id,
35
+ },
36
+ headers: {
37
+ Authorization: `Bearer ${login_page.login_page_auth_token}`,
38
+ },
39
+ },
40
+ )
41
+ .json()
42
+
43
+ if (new_login_page.was_login_successful) {
44
+ console.log("Logged in! Generating token...")
45
+ break
46
+ }
47
+
48
+ if (new_login_page.is_expired) {
49
+ throw new Error("Login page expired")
50
+ }
51
+
52
+ await delay(1000)
53
+ }
54
+
55
+ const { session } = await ky
56
+ .post<EndpointResponse["sessions/login_page/exchange_for_cli_session"]>(
57
+ "sessions/login_page/exchange_for_cli_session",
58
+ {
59
+ json: {
60
+ login_page_id: login_page.login_page_id,
61
+ },
62
+ headers: {
63
+ Authorization: `Bearer ${login_page.login_page_auth_token}`,
64
+ },
65
+ },
66
+ )
67
+ .json()
68
+
69
+ cliConfig.set("sessionToken", session.token)
70
+
71
+ console.log("Ready to use!")
72
+ })
73
+ }
@@ -0,0 +1,11 @@
1
+ import type { Command } from "commander"
2
+
3
+ export const registerAuthLogout = (program: Command) => {
4
+ program.commands
5
+ .find((c) => c.name() === "auth")!
6
+ .command("logout")
7
+ .description("Logout from registry")
8
+ .action((args) => {
9
+ console.log("logout")
10
+ })
11
+ }
@@ -0,0 +1,5 @@
1
+ import type { Command } from "commander"
2
+
3
+ export const registerAuth = (program: Command) => {
4
+ program.command("auth").description("Login/logout")
5
+ }
@@ -0,0 +1,99 @@
1
+ import type { Command } from "commander"
2
+ import { getKy } from "lib/registry-api/get-ky"
3
+ import * as fs from "node:fs"
4
+ import * as path from "node:path"
5
+
6
+ export const registerClone = (program: Command) => {
7
+ program
8
+ .command("clone")
9
+ .description("Clone a snippet from the registry")
10
+ .argument("<snippet>", "Snippet to clone (e.g. author/snippetName)")
11
+ .action(async (snippetPath: string) => {
12
+ let author: string
13
+ let snippetName: string
14
+ if (!snippetPath.startsWith("@tsci/") && snippetPath.includes("/")) {
15
+ ;[author, snippetName] = snippetPath.split("/")
16
+ } else {
17
+ const trimmedPath = snippetPath.replace("@tsci/", "")
18
+ const firstDotIndex = trimmedPath.indexOf(".")
19
+ author = trimmedPath.slice(0, firstDotIndex)
20
+ snippetName = trimmedPath.slice(firstDotIndex + 1)
21
+ }
22
+
23
+ if (!author || !snippetName) {
24
+ console.error(
25
+ "Invalid snippet path. Use format: author/snippetName, author.snippetName or @tsci/author.snippetName",
26
+ )
27
+ process.exit(1)
28
+ }
29
+
30
+ const ky = getKy()
31
+
32
+ try {
33
+ console.log(`Cloning ${author}/${snippetName}...`)
34
+
35
+ const packageFileList = await ky
36
+ .post<{
37
+ package_files: Array<{
38
+ package_file_id: string
39
+ package_release_id: string
40
+ file_path: string
41
+ created_at: string
42
+ }>
43
+ }>("package_files/list", {
44
+ json: {
45
+ package_name: `${author}/${snippetName}`,
46
+ use_latest_version: true,
47
+ },
48
+ })
49
+ .json()
50
+
51
+ // Create directory if it doesn't exist
52
+ const dirPath = `./${author}.${snippetName}`
53
+ if (!fs.existsSync(dirPath)) {
54
+ fs.mkdirSync(dirPath)
55
+ }
56
+
57
+ // Download each file that doesn't start with dist/
58
+ for (const fileInfo of packageFileList.package_files) {
59
+ const filePath = fileInfo.file_path.startsWith("/")
60
+ ? fileInfo.file_path.slice(1)
61
+ : fileInfo.file_path
62
+
63
+ if (filePath.startsWith("dist/")) continue
64
+
65
+ const fileContent = await ky
66
+ .post<{
67
+ package_file: {
68
+ content_text: string
69
+ }
70
+ }>("package_files/get", {
71
+ json: {
72
+ package_name: `${author}/${snippetName}`,
73
+ file_path: fileInfo.file_path,
74
+ },
75
+ })
76
+ .json()
77
+
78
+ const fullPath = path.join(dirPath, filePath)
79
+ const dirName = path.dirname(fullPath)
80
+
81
+ // Create nested directories if they don't exist
82
+ if (!fs.existsSync(dirName)) {
83
+ fs.mkdirSync(dirName, { recursive: true })
84
+ }
85
+
86
+ fs.writeFileSync(fullPath, fileContent.package_file.content_text)
87
+ }
88
+
89
+ console.log(`Successfully cloned to ./${author}.${snippetName}/`)
90
+ } catch (error) {
91
+ if (error instanceof Error) {
92
+ console.error("Failed to clone snippet:", error.message)
93
+ } else {
94
+ console.error("Failed to clone snippet:", error)
95
+ }
96
+ process.exit(1)
97
+ }
98
+ })
99
+ }
@@ -0,0 +1,12 @@
1
+ import type { Command } from "commander"
2
+ import { cliConfig } from "lib/cli-config"
3
+
4
+ export const registerConfigPrint = (program: Command) => {
5
+ program.commands
6
+ .find((c) => c.name() === "config")!
7
+ .command("print")
8
+ .description("Print the current config")
9
+ .action(() => {
10
+ console.log(JSON.stringify(cliConfig.all, null, 2))
11
+ })
12
+ }
@@ -0,0 +1,5 @@
1
+ import type { Command } from "commander"
2
+
3
+ export const registerConfig = (program: Command) => {
4
+ program.command("config").description("Manage tscircuit CLI configuration")
5
+ }
@@ -0,0 +1,111 @@
1
+ import type { Command } from "commander"
2
+ import * as path from "node:path"
3
+ import * as chokidar from "chokidar"
4
+ import * as fs from "node:fs"
5
+ import { createServer } from "lib/server/createServer"
6
+ import { getLocalFileDependencies } from "lib/dependency-analysis/getLocalFileDependencies"
7
+ import { installTypes } from "../../lib/dependency-analysis/installNodeModuleTypes"
8
+ import { EventsWatcher } from "../../lib/server/EventsWatcher"
9
+
10
+ export const registerDev = (program: Command) => {
11
+ program
12
+ .command("dev")
13
+ .description("Start development server for a snippet")
14
+ .argument("<file>", "Path to the snippet file")
15
+ .option("-p, --port <number>", "Port to run server on", "3000")
16
+ .action(async (file: string, options: { port: string }) => {
17
+ const absolutePath = path.resolve(file)
18
+ const fileDir = path.dirname(absolutePath)
19
+ const port = parseInt(options.port)
20
+
21
+ try {
22
+ console.log("Installing types for imported snippets...")
23
+ await installTypes(absolutePath)
24
+ console.log("Types installed successfully")
25
+ } catch (error) {
26
+ console.warn("Failed to install types:", error)
27
+ }
28
+
29
+ // Start the server
30
+ await createServer(port)
31
+
32
+ const eventsWatcher = new EventsWatcher(`http://localhost:${port}`)
33
+ eventsWatcher.start()
34
+
35
+ await fetch(`http://localhost:${port}/api/files/upsert`, {
36
+ method: "POST",
37
+ headers: { "Content-Type": "application/json" },
38
+ body: JSON.stringify({
39
+ file_path: "entrypoint.tsx",
40
+ text_content: `
41
+ import MyCircuit from "./snippet.tsx"
42
+
43
+ circuit.add(<MyCircuit />)
44
+ `,
45
+ }),
46
+ })
47
+
48
+ // Function to update file content
49
+ const updateFile = async (filePath: string) => {
50
+ try {
51
+ const content = await fs.promises.readFile(filePath, "utf-8")
52
+ const response = await fetch(
53
+ `http://localhost:${port}/api/files/upsert`,
54
+ {
55
+ method: "POST",
56
+ headers: { "Content-Type": "application/json" },
57
+ body: JSON.stringify({
58
+ file_path: path.relative(fileDir, filePath),
59
+ text_content: content,
60
+ }),
61
+ },
62
+ )
63
+ if (!response.ok) {
64
+ console.error(`Failed to update ${filePath}`)
65
+ }
66
+ } catch (error) {
67
+ console.error(`Error updating ${filePath}:`, error)
68
+ }
69
+ }
70
+
71
+ // Get initial dependencies
72
+ const dependencies = new Set([absolutePath])
73
+ try {
74
+ const deps = getLocalFileDependencies(absolutePath)
75
+ deps.forEach((dep) => dependencies.add(dep))
76
+ } catch (error) {
77
+ console.warn("Failed to analyze dependencies:", error)
78
+ }
79
+
80
+ // Watch the main file and its dependencies
81
+ const filesystemWatcher = chokidar.watch(Array.from(dependencies), {
82
+ persistent: true,
83
+ ignoreInitial: false,
84
+ })
85
+
86
+ filesystemWatcher.on("change", async (filePath) => {
87
+ console.log(`File ${filePath} changed`)
88
+ await updateFile(filePath)
89
+ })
90
+
91
+ filesystemWatcher.on("add", async (filePath) => {
92
+ console.log(`File ${filePath} added`)
93
+ await updateFile(filePath)
94
+ })
95
+
96
+ eventsWatcher.on("FILE_UPDATED", async (ev) => {
97
+ if (ev.file_path === "manual-edits.json") {
98
+ console.log("Manual edits updated, updating on filesystem...")
99
+ const { file } = await fetch(
100
+ `http://localhost:${port}/api/files/get?file_path=manual-edits.json`,
101
+ ).then((r) => r.json())
102
+ fs.writeFileSync(
103
+ path.join(fileDir, "manual-edits.json"),
104
+ file.text_content,
105
+ )
106
+ }
107
+ })
108
+
109
+ console.log(`Watching ${file} and its dependencies...`)
110
+ })
111
+ }
package/cli/main.ts ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander"
3
+ import { registerDev } from "./dev/register"
4
+ import { registerAuthLogin } from "./auth/login/register"
5
+ import { registerAuthLogout } from "./auth/logout/register"
6
+ import { registerAuth } from "./auth/register"
7
+ import { registerConfig } from "./config/register"
8
+ import { registerConfigPrint } from "./config/print/register"
9
+ import { registerClone } from "./clone/register"
10
+ import { perfectCli } from "perfect-cli"
11
+
12
+ const program = new Command()
13
+
14
+ program
15
+ .name("tsci")
16
+ .description("CLI for developing tscircuit snippets")
17
+ .version("1.0.0")
18
+
19
+ registerDev(program)
20
+ registerClone(program)
21
+
22
+ registerAuth(program)
23
+ registerAuthLogin(program)
24
+ registerAuthLogout(program)
25
+
26
+ registerConfig(program)
27
+ registerConfigPrint(program)
28
+
29
+ if (process.argv.length === 2) {
30
+ perfectCli(program, process.argv)
31
+ } else {
32
+ program.parse()
33
+ }