@docouno/devkit 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -2
  3. package/devkit +0 -0
  4. package/notices/NOTICE.txt +395 -0
  5. package/notices/cargo/adler2-2.0.1-238207d3/notice-001.txt +12 -0
  6. package/notices/cargo/adler2-2.0.1-238207d3/notice-002.txt +201 -0
  7. package/notices/cargo/adler2-2.0.1-238207d3/notice-003.txt +23 -0
  8. package/notices/cargo/aho-corasick-1.1.5-90cd2b64/notice-001.txt +3 -0
  9. package/notices/cargo/aho-corasick-1.1.5-90cd2b64/notice-002.txt +21 -0
  10. package/notices/cargo/aho-corasick-1.1.5-90cd2b64/notice-003.txt +24 -0
  11. package/notices/cargo/annotate-snippets-0.12.17-e17d8c74/notice-001.txt +202 -0
  12. package/notices/cargo/annotate-snippets-0.12.17-e17d8c74/notice-002.txt +19 -0
  13. package/notices/cargo/anstyle-1.0.14-f65811ba/notice-001.txt +202 -0
  14. package/notices/cargo/anstyle-1.0.14-f65811ba/notice-002.txt +19 -0
  15. package/notices/cargo/anyhow-1.0.104-dc6381fb/notice-001.txt +176 -0
  16. package/notices/cargo/anyhow-1.0.104-dc6381fb/notice-002.txt +23 -0
  17. package/notices/cargo/arraydeque-0.5.1-42a9cc56/notice-001.txt +21 -0
  18. package/notices/cargo/autocfg-1.5.1-41f0cbe6/notice-001.txt +201 -0
  19. package/notices/cargo/autocfg-1.5.1-41f0cbe6/notice-002.txt +25 -0
  20. package/notices/cargo/base64-0.22.1-26575a7c/notice-001.txt +201 -0
  21. package/notices/cargo/base64-0.22.1-26575a7c/notice-002.txt +21 -0
  22. package/notices/cargo/base64-0.23.1-9f42fcbf/notice-001.txt +201 -0
  23. package/notices/cargo/base64-0.23.1-9f42fcbf/notice-002.txt +21 -0
  24. package/notices/cargo/bitflags-2.13.2-a49cf0c5/notice-001.txt +201 -0
  25. package/notices/cargo/bitflags-2.13.2-a49cf0c5/notice-002.txt +25 -0
  26. package/notices/cargo/block-buffer-0.10.4-0a748df3/notice-001.txt +201 -0
  27. package/notices/cargo/block-buffer-0.10.4-0a748df3/notice-002.txt +25 -0
  28. package/notices/cargo/bytes-1.12.1-e3524fe6/notice-001.txt +25 -0
  29. package/notices/cargo/cc-1.10.0-cda055ec/notice-001.txt +201 -0
  30. package/notices/cargo/cc-1.10.0-cda055ec/notice-002.txt +25 -0
  31. package/notices/cargo/cfg-if-1.0.5-cd0760fa/notice-001.txt +201 -0
  32. package/notices/cargo/cfg-if-1.0.5-cd0760fa/notice-002.txt +25 -0
  33. package/notices/cargo/core_detect-1.0.0-7ba90a69/notice-001.txt +201 -0
  34. package/notices/cargo/core_detect-1.0.0-7ba90a69/notice-002.txt +25 -0
  35. package/notices/cargo/cpufeatures-0.2.17-bcd8b7c7/notice-001.txt +201 -0
  36. package/notices/cargo/cpufeatures-0.2.17-bcd8b7c7/notice-002.txt +25 -0
  37. package/notices/cargo/crc32fast-1.5.3-6de55ffd/notice-001.txt +202 -0
  38. package/notices/cargo/crc32fast-1.5.3-6de55ffd/notice-002.txt +21 -0
  39. package/notices/cargo/crypto-common-0.1.7-d182dd5c/notice-001.txt +201 -0
  40. package/notices/cargo/crypto-common-0.1.7-d182dd5c/notice-002.txt +25 -0
  41. package/notices/cargo/digest-0.10.7-c92dfead/notice-001.txt +201 -0
  42. package/notices/cargo/digest-0.10.7-c92dfead/notice-002.txt +25 -0
  43. package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-001.txt +17 -0
  44. package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-002.txt +202 -0
  45. package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-003.txt +25 -0
  46. package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-004.txt +26 -0
  47. package/notices/cargo/encoding_rs_io-0.1.8-60e8f178/notice-001.txt +8 -0
  48. package/notices/cargo/encoding_rs_io-0.1.8-60e8f178/notice-002.txt +201 -0
  49. package/notices/cargo/encoding_rs_io-0.1.8-60e8f178/notice-003.txt +21 -0
  50. package/notices/cargo/equivalent-1.0.3-2193bbe7/notice-001.txt +201 -0
  51. package/notices/cargo/equivalent-1.0.3-2193bbe7/notice-002.txt +25 -0
  52. package/notices/cargo/errno-0.3.14-3ca95530/notice-001.txt +201 -0
  53. package/notices/cargo/errno-0.3.14-3ca95530/notice-002.txt +25 -0
  54. package/notices/cargo/fastrand-2.5.0-f2fd8a52/notice-001.txt +201 -0
  55. package/notices/cargo/fastrand-2.5.0-f2fd8a52/notice-002.txt +23 -0
  56. package/notices/cargo/filetime-0.2.29-d64063cd/notice-001.txt +201 -0
  57. package/notices/cargo/filetime-0.2.29-d64063cd/notice-002.txt +25 -0
  58. package/notices/cargo/find-msvc-tools-0.1.15-7bf23a75/notice-001.txt +201 -0
  59. package/notices/cargo/find-msvc-tools-0.1.15-7bf23a75/notice-002.txt +25 -0
  60. package/notices/cargo/flate2-1.1.10-8985ab4e/notice-001.txt +201 -0
  61. package/notices/cargo/flate2-1.1.10-8985ab4e/notice-002.txt +25 -0
  62. package/notices/cargo/foldhash-0.2.0-3ee6d7fb/notice-001.txt +19 -0
  63. package/notices/cargo/generic-array-0.14.7-31bd8478/notice-001.txt +21 -0
  64. package/notices/cargo/getrandom-0.2.17-766fa84f/notice-001.txt +201 -0
  65. package/notices/cargo/getrandom-0.2.17-766fa84f/notice-002.txt +26 -0
  66. package/notices/cargo/getrandom-0.4.3-4f1c9ebb/notice-001.txt +201 -0
  67. package/notices/cargo/getrandom-0.4.3-4f1c9ebb/notice-002.txt +26 -0
  68. package/notices/cargo/granit-parser-2.0.0-65bc2836/notice-001.txt +15 -0
  69. package/notices/cargo/hashbrown-0.17.1-97fc3cc1/notice-001.txt +201 -0
  70. package/notices/cargo/hashbrown-0.17.1-97fc3cc1/notice-002.txt +25 -0
  71. package/notices/cargo/http-1.5.0-6a40d4c4/notice-001.txt +201 -0
  72. package/notices/cargo/http-1.5.0-6a40d4c4/notice-002.txt +25 -0
  73. package/notices/cargo/httparse-1.10.1-cfa5aaf5/notice-001.txt +201 -0
  74. package/notices/cargo/httparse-1.10.1-cfa5aaf5/notice-002.txt +20 -0
  75. package/notices/cargo/indexmap-2.14.2-a08229e1/notice-001.txt +201 -0
  76. package/notices/cargo/indexmap-2.14.2-a08229e1/notice-002.txt +25 -0
  77. package/notices/cargo/itoa-1.0.18-b22a1f7a/notice-001.txt +176 -0
  78. package/notices/cargo/itoa-1.0.18-b22a1f7a/notice-002.txt +23 -0
  79. package/notices/cargo/libc-0.2.191-18856c2b/notice-001.txt +176 -0
  80. package/notices/cargo/libc-0.2.191-18856c2b/notice-002.txt +25 -0
  81. package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-001.txt +29 -0
  82. package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-002.txt +201 -0
  83. package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-003.txt +220 -0
  84. package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-004.txt +23 -0
  85. package/notices/cargo/log-0.4.34-23464387/notice-001.txt +201 -0
  86. package/notices/cargo/log-0.4.34-23464387/notice-002.txt +25 -0
  87. package/notices/cargo/memchr-2.8.3-9c6980a5/notice-001.txt +3 -0
  88. package/notices/cargo/memchr-2.8.3-9c6980a5/notice-002.txt +21 -0
  89. package/notices/cargo/memchr-2.8.3-9c6980a5/notice-003.txt +24 -0
  90. package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-001.txt +25 -0
  91. package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-002.txt +177 -0
  92. package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-003.txt +24 -0
  93. package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-004.txt +14 -0
  94. package/notices/cargo/multiversion_no_op-1.0.0-1ef14dda/notice-001.txt +15 -0
  95. package/notices/cargo/multiversion_no_op-1.0.0-1ef14dda/notice-002.txt +202 -0
  96. package/notices/cargo/multiversion_no_op-1.0.0-1ef14dda/notice-003.txt +25 -0
  97. package/notices/cargo/nohash-hasher-0.2.0-8ab2027b/notice-001.txt +202 -0
  98. package/notices/cargo/nohash-hasher-0.2.0-8ab2027b/notice-002.txt +18 -0
  99. package/notices/cargo/num-traits-0.2.19-d58f8d42/notice-001.txt +201 -0
  100. package/notices/cargo/num-traits-0.2.19-d58f8d42/notice-002.txt +25 -0
  101. package/notices/cargo/once_cell-1.21.4-4a678fe2/notice-001.txt +201 -0
  102. package/notices/cargo/once_cell-1.21.4-4a678fe2/notice-002.txt +23 -0
  103. package/notices/cargo/percent-encoding-2.3.2-9472d0b5/notice-001.txt +201 -0
  104. package/notices/cargo/percent-encoding-2.3.2-9472d0b5/notice-002.txt +25 -0
  105. package/notices/cargo/proc-macro2-1.0.107-ccabd92a/notice-001.txt +176 -0
  106. package/notices/cargo/proc-macro2-1.0.107-ccabd92a/notice-002.txt +23 -0
  107. package/notices/cargo/quote-1.0.47-0f6442d5/notice-001.txt +176 -0
  108. package/notices/cargo/quote-1.0.47-0f6442d5/notice-002.txt +23 -0
  109. package/notices/cargo/regex-1.13.1-3a9e4453/notice-001.txt +201 -0
  110. package/notices/cargo/regex-1.13.1-3a9e4453/notice-002.txt +25 -0
  111. package/notices/cargo/regex-automata-0.4.18-8f2fdfe1/notice-001.txt +201 -0
  112. package/notices/cargo/regex-automata-0.4.18-8f2fdfe1/notice-002.txt +25 -0
  113. package/notices/cargo/regex-syntax-0.8.11-22c58573/notice-001.txt +201 -0
  114. package/notices/cargo/regex-syntax-0.8.11-22c58573/notice-002.txt +25 -0
  115. package/notices/cargo/regex-syntax-0.8.11-22c58573/notice-003.txt +57 -0
  116. package/notices/cargo/ring-0.17.14-a2ecd079/notice-001.txt +9 -0
  117. package/notices/cargo/ring-0.17.14-a2ecd079/notice-002.txt +272 -0
  118. package/notices/cargo/ring-0.17.14-a2ecd079/notice-003.txt +13 -0
  119. package/notices/cargo/ring-0.17.14-a2ecd079/notice-004.txt +201 -0
  120. package/notices/cargo/ring-0.17.14-a2ecd079/notice-005.txt +23 -0
  121. package/notices/cargo/ring-0.17.14-a2ecd079/notice-006.txt +15 -0
  122. package/notices/cargo/rustix-1.1.5-75031891/notice-001.txt +29 -0
  123. package/notices/cargo/rustix-1.1.5-75031891/notice-002.txt +201 -0
  124. package/notices/cargo/rustix-1.1.5-75031891/notice-003.txt +220 -0
  125. package/notices/cargo/rustix-1.1.5-75031891/notice-004.txt +23 -0
  126. package/notices/cargo/rustls-0.23.46-d439923c/notice-001.txt +201 -0
  127. package/notices/cargo/rustls-0.23.46-d439923c/notice-002.txt +15 -0
  128. package/notices/cargo/rustls-0.23.46-d439923c/notice-003.txt +25 -0
  129. package/notices/cargo/rustls-pki-types-1.15.1-0cee9399/notice-001.txt +201 -0
  130. package/notices/cargo/rustls-pki-types-1.15.1-0cee9399/notice-002.txt +25 -0
  131. package/notices/cargo/rustls-webpki-0.103.16-8f5bb5a5/notice-001.txt +19 -0
  132. package/notices/cargo/rustversion-1.0.23-84eb0e4f/notice-001.txt +176 -0
  133. package/notices/cargo/rustversion-1.0.23-84eb0e4f/notice-002.txt +23 -0
  134. package/notices/cargo/scopeguard-1.2.0-ccdf1abe/notice-001.txt +201 -0
  135. package/notices/cargo/scopeguard-1.2.0-ccdf1abe/notice-002.txt +25 -0
  136. package/notices/cargo/serde-1.0.229-f2b8eb6e/notice-001.txt +176 -0
  137. package/notices/cargo/serde-1.0.229-f2b8eb6e/notice-002.txt +23 -0
  138. package/notices/cargo/serde-saphyr-2.0.0-6dbd70ad/notice-001.txt +176 -0
  139. package/notices/cargo/serde-saphyr-2.0.0-6dbd70ad/notice-002.txt +23 -0
  140. package/notices/cargo/serde_core-1.0.229-08cccc74/notice-001.txt +176 -0
  141. package/notices/cargo/serde_core-1.0.229-08cccc74/notice-002.txt +23 -0
  142. package/notices/cargo/serde_derive-1.0.229-db09cb76/notice-001.txt +176 -0
  143. package/notices/cargo/serde_derive-1.0.229-db09cb76/notice-002.txt +23 -0
  144. package/notices/cargo/serde_json-1.0.154-084efbf1/notice-001.txt +176 -0
  145. package/notices/cargo/serde_json-1.0.154-084efbf1/notice-002.txt +23 -0
  146. package/notices/cargo/serde_spanned-1.1.2-13274efe/notice-001.txt +202 -0
  147. package/notices/cargo/serde_spanned-1.1.2-13274efe/notice-002.txt +19 -0
  148. package/notices/cargo/sha1-0.10.7-be2212b4/notice-001.txt +201 -0
  149. package/notices/cargo/sha1-0.10.7-be2212b4/notice-002.txt +27 -0
  150. package/notices/cargo/sha2-0.10.9-be6ca6b4/notice-001.txt +201 -0
  151. package/notices/cargo/sha2-0.10.9-be6ca6b4/notice-002.txt +27 -0
  152. package/notices/cargo/shell-words-1.1.1-0d55474b/notice-001.txt +201 -0
  153. package/notices/cargo/shell-words-1.1.1-0d55474b/notice-002.txt +25 -0
  154. package/notices/cargo/shlex-2.0.1-39c59096/notice-001.txt +13 -0
  155. package/notices/cargo/shlex-2.0.1-39c59096/notice-002.txt +21 -0
  156. package/notices/cargo/signal-hook-0.3.18-a332e163/notice-001.txt +201 -0
  157. package/notices/cargo/signal-hook-0.3.18-a332e163/notice-002.txt +25 -0
  158. package/notices/cargo/signal-hook-registry-1.4.8-497004d4/notice-001.txt +201 -0
  159. package/notices/cargo/signal-hook-registry-1.4.8-497004d4/notice-002.txt +25 -0
  160. package/notices/cargo/simd-adler32-0.3.10-938489e4/notice-001.txt +21 -0
  161. package/notices/cargo/simdutf8-0.1.5-2b987c0c/notice-001.txt +177 -0
  162. package/notices/cargo/simdutf8-0.1.5-2b987c0c/notice-002.txt +19 -0
  163. package/notices/cargo/smallvec-1.16.4-cc422042/notice-001.txt +201 -0
  164. package/notices/cargo/smallvec-1.16.4-cc422042/notice-002.txt +25 -0
  165. package/notices/cargo/subtle-2.6.1-380cc33b/notice-001.txt +29 -0
  166. package/notices/cargo/syn-3.0.9-7a98808e/notice-001.txt +176 -0
  167. package/notices/cargo/syn-3.0.9-7a98808e/notice-002.txt +23 -0
  168. package/notices/cargo/tar-0.4.46-d72ec350/notice-001.txt +201 -0
  169. package/notices/cargo/tar-0.4.46-d72ec350/notice-002.txt +25 -0
  170. package/notices/cargo/tempfile-3.27.0-1f0bd317/notice-001.txt +201 -0
  171. package/notices/cargo/tempfile-3.27.0-1f0bd317/notice-002.txt +25 -0
  172. package/notices/cargo/toml-1.1.8-spec-1.1.0-ee8a4c7b/notice-001.txt +202 -0
  173. package/notices/cargo/toml-1.1.8-spec-1.1.0-ee8a4c7b/notice-002.txt +19 -0
  174. package/notices/cargo/toml_datetime-1.1.2-spec-1.1.0-f08fbf1e/notice-001.txt +202 -0
  175. package/notices/cargo/toml_datetime-1.1.2-spec-1.1.0-f08fbf1e/notice-002.txt +19 -0
  176. package/notices/cargo/toml_parser-1.1.5-spec-1.1.0-a11a62b2/notice-001.txt +202 -0
  177. package/notices/cargo/toml_parser-1.1.5-spec-1.1.0-a11a62b2/notice-002.txt +19 -0
  178. package/notices/cargo/toml_writer-1.1.3-spec-1.1.0-62b81a9a/notice-001.txt +202 -0
  179. package/notices/cargo/toml_writer-1.1.3-spec-1.1.0-62b81a9a/notice-002.txt +19 -0
  180. package/notices/cargo/typenum-1.20.1-6cdf3ca9/notice-001.txt +1 -0
  181. package/notices/cargo/typenum-1.20.1-6cdf3ca9/notice-002.txt +201 -0
  182. package/notices/cargo/typenum-1.20.1-6cdf3ca9/notice-003.txt +21 -0
  183. package/notices/cargo/unicode-ident-1.0.27-0f0691b5/notice-001.txt +176 -0
  184. package/notices/cargo/unicode-ident-1.0.27-0f0691b5/notice-002.txt +23 -0
  185. package/notices/cargo/unicode-ident-1.0.27-0f0691b5/notice-003.txt +39 -0
  186. package/notices/cargo/unicode-width-0.2.2-39fb3891/notice-001.txt +7 -0
  187. package/notices/cargo/unicode-width-0.2.2-39fb3891/notice-002.txt +201 -0
  188. package/notices/cargo/unicode-width-0.2.2-39fb3891/notice-003.txt +25 -0
  189. package/notices/cargo/untrusted-0.9.0-67ed8671/notice-001.txt +13 -0
  190. package/notices/cargo/ureq-3.5.0-13110b1a/notice-001.txt +201 -0
  191. package/notices/cargo/ureq-3.5.0-13110b1a/notice-002.txt +21 -0
  192. package/notices/cargo/ureq-proto-0.6.5-5c45f89a/notice-001.txt +202 -0
  193. package/notices/cargo/ureq-proto-0.6.5-5c45f89a/notice-002.txt +7 -0
  194. package/notices/cargo/utf8-zero-0.8.1-cf839cb2/notice-001.txt +176 -0
  195. package/notices/cargo/utf8-zero-0.8.1-cf839cb2/notice-002.txt +23 -0
  196. package/notices/cargo/uuid-1.29.0-9339a6aa/notice-001.txt +201 -0
  197. package/notices/cargo/uuid-1.29.0-9339a6aa/notice-002.txt +26 -0
  198. package/notices/cargo/version_check-0.9.5-13f5a7bf/notice-001.txt +201 -0
  199. package/notices/cargo/version_check-0.9.5-13f5a7bf/notice-002.txt +19 -0
  200. package/notices/cargo/webpki-roots-1.0.11-98a8d969/notice-001.txt +61 -0
  201. package/notices/cargo/winnow-1.0.4-06523b18/notice-001.txt +18 -0
  202. package/notices/cargo/zeroize-1.9.1-23ddc90c/notice-001.txt +202 -0
  203. package/notices/cargo/zeroize-1.9.1-23ddc90c/notice-002.txt +25 -0
  204. package/notices/cargo/zmij-1.0.23-bfa80998/notice-001.txt +23 -0
  205. package/notices/notice-set.json +2779 -0
  206. package/notices/rust/COPYRIGHT-library.html +29357 -0
  207. package/notices/rust/licenses/Apache-2.0.txt +73 -0
  208. package/notices/rust/licenses/BSD-2-Clause.txt +9 -0
  209. package/notices/rust/licenses/CC-BY-SA-4.0.txt +427 -0
  210. package/notices/rust/licenses/GCC-exception-3.1.txt +30 -0
  211. package/notices/rust/licenses/GPL-2.0-only.txt +133 -0
  212. package/notices/rust/licenses/GPL-3.0-or-later.txt +202 -0
  213. package/notices/rust/licenses/ISC.txt +7 -0
  214. package/notices/rust/licenses/LLVM-exception.txt +15 -0
  215. package/notices/rust/licenses/MIT.txt +9 -0
  216. package/notices/rust/licenses/NCSA.txt +29 -0
  217. package/notices/rust/licenses/OFL-1.1.txt +43 -0
  218. package/notices/rust/licenses/Unicode-3.0.txt +39 -0
  219. package/npm/docouno-env-0.3.1.tgz +0 -0
  220. package/package.json +27 -4
  221. package/release.json +1249 -0
  222. package/runtime/LICENSE +21 -0
  223. package/runtime/compose.tools.yaml +102 -0
  224. package/runtime/desktop-seccomp.json +1262 -0
  225. package/runtime/desktop.Dockerfile +29 -0
  226. package/runtime/devkit.mk +81 -0
  227. package/runtime/devkit.sh +87 -0
  228. package/runtime/licenses/Apache-2.0.txt +202 -0
  229. package/runtime/licenses/moby-profiles.NOTICE +4 -0
  230. package/runtime/rust.Dockerfile +8 -0
  231. package/runtime/toolchains.env +8 -0
  232. package/templates/electron-react/LICENSE +21 -0
  233. package/templates/electron-react/electron-builder.config.cjs +11 -0
  234. package/templates/electron-react/electron.vite.config.cjs +20 -0
  235. package/templates/electron-react/eslint.config.mjs +2 -0
  236. package/templates/electron-react/package-lock.json +7106 -0
  237. package/templates/electron-react/package.json +57 -0
  238. package/templates/electron-react/prettier.config.mjs +1 -0
  239. package/templates/electron-react/src/bridge.ts +10 -0
  240. package/templates/electron-react/src/main/api.test.ts +26 -0
  241. package/templates/electron-react/src/main/api.ts +38 -0
  242. package/templates/electron-react/src/main/index.ts +118 -0
  243. package/templates/electron-react/src/main/renderer-url.test.ts +18 -0
  244. package/templates/electron-react/src/main/renderer-url.ts +21 -0
  245. package/templates/electron-react/src/preload/index.ts +7 -0
  246. package/templates/electron-react/src/renderer/index.html +16 -0
  247. package/templates/electron-react/src/renderer/src/ClientApp.test.tsx +41 -0
  248. package/templates/electron-react/src/renderer/src/ClientApp.tsx +75 -0
  249. package/templates/electron-react/src/renderer/src/api.test.ts +15 -0
  250. package/templates/electron-react/src/renderer/src/api.ts +17 -0
  251. package/templates/electron-react/src/renderer/src/env.d.ts +6 -0
  252. package/templates/electron-react/src/renderer/src/main.tsx +24 -0
  253. package/templates/electron-react/src/renderer/src/style.css +71 -0
  254. package/templates/electron-react/tsconfig.json +8 -0
  255. package/templates/electron-react/tsconfig.node.json +13 -0
  256. package/templates/electron-react/tsconfig.test.json +7 -0
  257. package/templates/electron-react/variants/shared/files/src/renderer/src/main.tsx +24 -0
  258. package/templates/electron-react/variants/shared/variant.json +7 -0
  259. package/templates/electron-react/vitest.config.mjs +19 -0
  260. package/templates/node-api/LICENSE +21 -0
  261. package/templates/node-api/eslint.config.mjs +2 -0
  262. package/templates/node-api/package-lock.json +1989 -0
  263. package/templates/node-api/package.json +41 -0
  264. package/templates/node-api/prettier.config.mjs +1 -0
  265. package/templates/node-api/src/greeting.test.ts +14 -0
  266. package/templates/node-api/src/greeting.ts +8 -0
  267. package/templates/node-api/src/http.test.ts +64 -0
  268. package/templates/node-api/src/http.ts +46 -0
  269. package/templates/node-api/src/index.ts +26 -0
  270. package/templates/node-api/tsconfig.build.json +5 -0
  271. package/templates/node-api/tsconfig.json +9 -0
  272. package/templates/react-client/LICENSE +21 -0
  273. package/templates/react-client/eslint.config.mjs +2 -0
  274. package/templates/react-client/package-lock.json +3758 -0
  275. package/templates/react-client/package.json +68 -0
  276. package/templates/react-client/prettier.config.mjs +1 -0
  277. package/templates/react-client/src/ClientApp.test.tsx +41 -0
  278. package/templates/react-client/src/ClientApp.tsx +75 -0
  279. package/templates/react-client/src/index.ts +2 -0
  280. package/templates/react-client/src/style.css +71 -0
  281. package/templates/react-client/tsconfig.build.json +10 -0
  282. package/templates/react-client/tsconfig.json +8 -0
  283. package/templates/react-client/tsconfig.test.json +7 -0
  284. package/templates/react-client/vitest.config.mjs +19 -0
  285. package/templates/react-web/LICENSE +21 -0
  286. package/templates/react-web/eslint.config.mjs +2 -0
  287. package/templates/react-web/index.html +12 -0
  288. package/templates/react-web/package-lock.json +3754 -0
  289. package/templates/react-web/package.json +50 -0
  290. package/templates/react-web/prettier.config.mjs +1 -0
  291. package/templates/react-web/src/ClientApp.test.tsx +41 -0
  292. package/templates/react-web/src/ClientApp.tsx +75 -0
  293. package/templates/react-web/src/api.test.ts +24 -0
  294. package/templates/react-web/src/api.ts +29 -0
  295. package/templates/react-web/src/main.tsx +15 -0
  296. package/templates/react-web/src/style.css +71 -0
  297. package/templates/react-web/tsconfig.json +8 -0
  298. package/templates/react-web/tsconfig.test.json +7 -0
  299. package/templates/react-web/variants/shared/files/src/main.tsx +15 -0
  300. package/templates/react-web/variants/shared/variant.json +3 -0
  301. package/templates/react-web/vite.config.mjs +14 -0
  302. package/templates/react-web/vitest.config.mjs +19 -0
  303. package/templates/rust-api/Cargo.lock +476 -0
  304. package/templates/rust-api/Cargo.toml +22 -0
  305. package/templates/rust-api/LICENSE +21 -0
  306. package/templates/rust-api/rust-toolchain.toml +3 -0
  307. package/templates/rust-api/rustfmt.toml +2 -0
  308. package/templates/rust-api/src/lib.rs +68 -0
  309. package/templates/rust-api/src/main.rs +23 -0
  310. package/templates/rust-api/tests/api.rs +85 -0
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "devkit-react-web",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "engines": {
7
+ "node": "^24.22.1"
8
+ },
9
+ "scripts": {
10
+ "check": "devkit-verify && npm run format:check && npm run lint && npm run typecheck && npm test",
11
+ "format:check": "prettier --check src tsconfig.json tsconfig.test.json eslint.config.mjs prettier.config.mjs vitest.config.mjs index.html vite.config.mjs",
12
+ "lint": "eslint --no-ignore --max-warnings 0 src eslint.config.mjs prettier.config.mjs vitest.config.mjs vite.config.mjs",
13
+ "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json",
14
+ "test": "vitest run --config vitest.config.mjs",
15
+ "fix": "prettier --write src tsconfig.json tsconfig.test.json eslint.config.mjs prettier.config.mjs vitest.config.mjs index.html vite.config.mjs && eslint --no-ignore --max-warnings 0 --fix src eslint.config.mjs prettier.config.mjs vitest.config.mjs vite.config.mjs && prettier --write src tsconfig.json tsconfig.test.json eslint.config.mjs prettier.config.mjs vitest.config.mjs index.html vite.config.mjs",
16
+ "build": "npm run typecheck && vite build",
17
+ "dev": "vite --host 0.0.0.0 --port 5173 --strictPort"
18
+ },
19
+ "devDependencies": {
20
+ "@docouno/env": "0.3.1",
21
+ "@testing-library/dom": "10.4.2",
22
+ "@testing-library/react": "16.3.3",
23
+ "@types/node": "24.19.2",
24
+ "@types/react": "19.3.0",
25
+ "@types/react-dom": "19.3.0",
26
+ "@vitejs/plugin-react": "6.1.2",
27
+ "eslint": "10.13.0",
28
+ "jsdom": "30.1.3",
29
+ "prettier": "3.9.10",
30
+ "typescript": "6.0.3",
31
+ "vite": "8.3.5",
32
+ "vitest": "5.0.5"
33
+ },
34
+ "devkit": {
35
+ "sourceDirectories": [
36
+ "src"
37
+ ],
38
+ "typecheckConfigs": [
39
+ "tsconfig.json",
40
+ "tsconfig.test.json"
41
+ ],
42
+ "boundaries": {
43
+ "forbidCrossAppImports": true
44
+ }
45
+ },
46
+ "dependencies": {
47
+ "react": "19.3.1",
48
+ "react-dom": "19.3.1"
49
+ }
50
+ }
@@ -0,0 +1 @@
1
+ export { default } from '@docouno/env/prettier';
@@ -0,0 +1,41 @@
1
+ import { cleanup, fireEvent, render, screen } from '@testing-library/react';
2
+ import { afterEach, expect, it } from 'vitest';
3
+ import { ClientApp } from './ClientApp.js';
4
+
5
+ afterEach(cleanup);
6
+
7
+ it('works locally without requiring a backend', () => {
8
+ render(<ClientApp platform="web" />);
9
+ fireEvent.change(screen.getByLabelText('Name'), { target: { value: ' Ada ' } });
10
+ expect(screen.getByTestId('local-greeting').textContent).toBe('Hello, Ada!');
11
+ fireEvent.click(screen.getByRole('button', { name: 'Increment' }));
12
+ expect(screen.getByTestId('count').textContent).toBe('Clicks: 1');
13
+ expect(screen.queryByRole('button', { name: 'Ask API' })).toBeNull();
14
+ });
15
+
16
+ it('uses the supplied API and renders its response', async () => {
17
+ let requested = '';
18
+ render(
19
+ <ClientApp
20
+ platform="desktop"
21
+ api={{
22
+ greet: (name) => {
23
+ requested = name;
24
+ return Promise.resolve({ message: 'Hello from API!' });
25
+ },
26
+ }}
27
+ />,
28
+ );
29
+ fireEvent.change(screen.getByLabelText('Name'), { target: { value: 'Ada' } });
30
+ fireEvent.click(screen.getByRole('button', { name: 'Ask API' }));
31
+ expect(await screen.findByText('Hello from API!')).toBeDefined();
32
+ expect(requested).toBe('Ada');
33
+ });
34
+
35
+ it('shows an API failure without substituting a local response', async () => {
36
+ render(
37
+ <ClientApp platform="web" api={{ greet: () => Promise.reject(new Error('Unavailable')) }} />,
38
+ );
39
+ fireEvent.click(screen.getByRole('button', { name: 'Ask API' }));
40
+ expect((await screen.findByRole('alert')).textContent).toBe('Unavailable');
41
+ });
@@ -0,0 +1,75 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+
3
+ export interface ClientApi {
4
+ greet(name: string): Promise<{ message: string }>;
5
+ }
6
+
7
+ type RemoteState = { phase: 'idle' | 'loading' } | { phase: 'ready' | 'error'; message: string };
8
+
9
+ export function ClientApp({ api, platform }: { api?: ClientApi; platform: string }) {
10
+ const [name, setName] = useState('world');
11
+ const [count, setCount] = useState(0);
12
+ const [remote, setRemote] = useState<RemoteState>({ phase: 'idle' });
13
+ const request = useRef(0);
14
+ useEffect(
15
+ () => () => {
16
+ request.current += 1;
17
+ },
18
+ [],
19
+ );
20
+
21
+ function requestGreeting() {
22
+ if (!api) {
23
+ return;
24
+ }
25
+ const current = ++request.current;
26
+ setRemote({ phase: 'loading' });
27
+ api.greet(name).then(
28
+ (reply) => {
29
+ if (request.current === current) {
30
+ setRemote({ phase: 'ready', message: reply.message });
31
+ }
32
+ },
33
+ (error: unknown) => {
34
+ if (request.current === current) {
35
+ setRemote({
36
+ phase: 'error',
37
+ message: error instanceof Error ? error.message : 'API request failed.',
38
+ });
39
+ }
40
+ },
41
+ );
42
+ }
43
+
44
+ return (
45
+ <main>
46
+ <p className="eyebrow">Devkit · {platform}</p>
47
+ <h1>A small app, ready to change.</h1>
48
+ <p>One interface for local interaction and an optional API connection.</p>
49
+ <section className="card" aria-label="Local interaction">
50
+ <label htmlFor="name">Name</label>
51
+ <input
52
+ id="name"
53
+ value={name}
54
+ maxLength={80}
55
+ onChange={(event) => setName(event.target.value)}
56
+ />
57
+ <output data-testid="local-greeting">Hello, {name.trim() || 'world'}!</output>
58
+ <button type="button" onClick={() => setCount((value) => value + 1)}>
59
+ Increment
60
+ </button>
61
+ <span data-testid="count">Clicks: {count}</span>
62
+ </section>
63
+ {api && (
64
+ <section className="api-panel" aria-label="API greeting">
65
+ <h2>API connection</h2>
66
+ <button type="button" onClick={requestGreeting} disabled={remote.phase === 'loading'}>
67
+ {remote.phase === 'loading' ? 'Requesting…' : 'Ask API'}
68
+ </button>
69
+ {remote.phase === 'ready' && <p role="status">{remote.message}</p>}
70
+ {remote.phase === 'error' && <p role="alert">{remote.message}</p>}
71
+ </section>
72
+ )}
73
+ </main>
74
+ );
75
+ }
@@ -0,0 +1,24 @@
1
+ import { expect, it } from 'vitest';
2
+ import { greet } from './api.js';
3
+
4
+ it('encodes the greeting request and validates the response', async () => {
5
+ let requested = '';
6
+ const fetcher: typeof fetch = (input) => {
7
+ requested = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
8
+ return Promise.resolve(new Response(JSON.stringify({ message: 'Hello, Ada & Bob!' })));
9
+ };
10
+ await expect(greet('Ada & Bob', fetcher)).resolves.toEqual({ message: 'Hello, Ada & Bob!' });
11
+ expect(requested).toBe('/api/greeting?name=Ada+%26+Bob');
12
+ });
13
+
14
+ it('rejects HTTP and malformed response failures', async () => {
15
+ await expect(
16
+ greet('Ada', () => Promise.resolve(new Response('down', { status: 503 }))),
17
+ ).rejects.toThrow('503');
18
+ await expect(greet('Ada', () => Promise.resolve(new Response('<html>')))).rejects.toThrow(
19
+ 'invalid JSON',
20
+ );
21
+ await expect(greet('Ada', () => Promise.resolve(new Response('{"message":42}')))).rejects.toThrow(
22
+ 'invalid greeting',
23
+ );
24
+ });
@@ -0,0 +1,29 @@
1
+ export async function greet(
2
+ name: string,
3
+ fetcher: typeof fetch = fetch,
4
+ ): Promise<{ message: string }> {
5
+ const query = new URLSearchParams({ name });
6
+ const response = await fetcher(`/api/greeting?${query.toString()}`, {
7
+ headers: { accept: 'application/json' },
8
+ signal: AbortSignal.timeout(5000),
9
+ });
10
+ if (!response.ok) {
11
+ throw new Error(`API request failed (${response.status}).`);
12
+ }
13
+ let value: unknown;
14
+ try {
15
+ value = await response.json();
16
+ } catch {
17
+ throw new Error('API returned invalid JSON.');
18
+ }
19
+ if (
20
+ !value ||
21
+ typeof value !== 'object' ||
22
+ !('message' in value) ||
23
+ typeof value.message !== 'string' ||
24
+ !value.message
25
+ ) {
26
+ throw new Error('API returned an invalid greeting.');
27
+ }
28
+ return { message: value.message };
29
+ }
@@ -0,0 +1,15 @@
1
+ import { StrictMode } from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+ import { ClientApp } from './ClientApp.js';
4
+ import { greet } from './api.js';
5
+ import './style.css';
6
+ const element = document.getElementById('root');
7
+ if (!element) {
8
+ throw new Error('Missing application root.');
9
+ }
10
+ const api = import.meta.env.VITE_API_ENABLED === 'true' ? { greet } : undefined;
11
+ createRoot(element).render(
12
+ <StrictMode>
13
+ <ClientApp platform="web" {...(api ? { api } : {})} />
14
+ </StrictMode>,
15
+ );
@@ -0,0 +1,71 @@
1
+ :root {
2
+ font-family: system-ui, sans-serif;
3
+ color: #17233a;
4
+ background: #f4f7fb;
5
+ font-synthesis: none;
6
+ }
7
+
8
+ body {
9
+ margin: 0;
10
+ }
11
+ main {
12
+ max-width: 44rem;
13
+ margin: 4rem auto;
14
+ padding: 0 1.5rem;
15
+ }
16
+ h1 {
17
+ font-size: clamp(2rem, 5vw, 3rem);
18
+ line-height: 1.1;
19
+ }
20
+ h2 {
21
+ font-size: 1.25rem;
22
+ }
23
+ p {
24
+ line-height: 1.6;
25
+ }
26
+ .eyebrow {
27
+ color: #3159a6;
28
+ font-weight: 650;
29
+ }
30
+ .card,
31
+ .api-panel {
32
+ display: grid;
33
+ gap: 1rem;
34
+ margin-top: 2rem;
35
+ padding: 1.5rem;
36
+ border: 1px solid #dce3ef;
37
+ border-radius: 1rem;
38
+ background: white;
39
+ }
40
+ input,
41
+ button {
42
+ font: inherit;
43
+ padding: 0.75rem 1rem;
44
+ border-radius: 0.5rem;
45
+ }
46
+ input {
47
+ border: 1px solid #8391a9;
48
+ }
49
+ button {
50
+ justify-self: start;
51
+ border: none;
52
+ background: #3159a6;
53
+ color: white;
54
+ cursor: pointer;
55
+ }
56
+ button:disabled {
57
+ opacity: 0.65;
58
+ cursor: wait;
59
+ }
60
+ input:focus-visible,
61
+ button:focus-visible {
62
+ outline: 3px solid #8eafe8;
63
+ outline-offset: 3px;
64
+ }
65
+ output {
66
+ font-size: 1.4rem;
67
+ font-weight: 600;
68
+ }
69
+ [role='alert'] {
70
+ color: #a5222a;
71
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "@docouno/env/tsconfig/browser.json",
3
+ "compilerOptions": {
4
+ "types": ["vite/client"]
5
+ },
6
+ "include": ["src/**/*.ts", "src/**/*.tsx"],
7
+ "exclude": ["src/**/*.test.ts", "src/**/*.test.tsx"]
8
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "@docouno/env/tsconfig/browser.json",
3
+ "compilerOptions": {
4
+ "types": ["vite/client", "node"]
5
+ },
6
+ "include": ["src/**/*.ts", "src/**/*.tsx"]
7
+ }
@@ -0,0 +1,15 @@
1
+ import { StrictMode } from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+ import { ClientApp } from '__DEVKIT_CLIENT_PACKAGE__';
4
+ import { greet } from './api.js';
5
+ import '__DEVKIT_CLIENT_PACKAGE__/style.css';
6
+ const element = document.getElementById('root');
7
+ if (!element) {
8
+ throw new Error('Missing application root.');
9
+ }
10
+ const api = import.meta.env.VITE_API_ENABLED === 'true' ? { greet } : undefined;
11
+ createRoot(element).render(
12
+ <StrictMode>
13
+ <ClientApp platform="web" {...(api ? { api } : {})} />
14
+ </StrictMode>,
15
+ );
@@ -0,0 +1,3 @@
1
+ {
2
+ "remove": ["src/ClientApp.tsx", "src/ClientApp.test.tsx", "src/style.css"]
3
+ }
@@ -0,0 +1,14 @@
1
+ import { env } from 'node:process';
2
+ import react from '@vitejs/plugin-react';
3
+ import { defineConfig } from 'vite';
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ cacheDir: 'node_modules/.cache/devkit-vite',
7
+ resolve: { dedupe: ['react', 'react-dom'] },
8
+ server: {
9
+ host: '0.0.0.0',
10
+ port: 5173,
11
+ strictPort: true,
12
+ ...(env.DEVKIT_API_TARGET ? { proxy: { '/api': env.DEVKIT_API_TARGET } } : {}),
13
+ },
14
+ });
@@ -0,0 +1,19 @@
1
+ import react from '@vitejs/plugin-react';
2
+ import { defineConfig } from 'vitest/config';
3
+ import RunnableTestsReporter from '@docouno/env/vitest-reporter';
4
+
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ cacheDir: 'node_modules/.cache/devkit-vitest',
8
+ resolve: { dedupe: ['react', 'react-dom'] },
9
+ test: {
10
+ environment: 'jsdom',
11
+ include: ['src/**/*.test.{ts,tsx}'],
12
+ globals: false,
13
+ passWithNoTests: false,
14
+ reporters: ['default', new RunnableTestsReporter()],
15
+ restoreMocks: true,
16
+ clearMocks: true,
17
+ maxWorkers: 2,
18
+ },
19
+ });