@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.
- package/LICENSE +21 -0
- package/README.md +117 -2
- package/devkit +0 -0
- package/notices/NOTICE.txt +395 -0
- package/notices/cargo/adler2-2.0.1-238207d3/notice-001.txt +12 -0
- package/notices/cargo/adler2-2.0.1-238207d3/notice-002.txt +201 -0
- package/notices/cargo/adler2-2.0.1-238207d3/notice-003.txt +23 -0
- package/notices/cargo/aho-corasick-1.1.5-90cd2b64/notice-001.txt +3 -0
- package/notices/cargo/aho-corasick-1.1.5-90cd2b64/notice-002.txt +21 -0
- package/notices/cargo/aho-corasick-1.1.5-90cd2b64/notice-003.txt +24 -0
- package/notices/cargo/annotate-snippets-0.12.17-e17d8c74/notice-001.txt +202 -0
- package/notices/cargo/annotate-snippets-0.12.17-e17d8c74/notice-002.txt +19 -0
- package/notices/cargo/anstyle-1.0.14-f65811ba/notice-001.txt +202 -0
- package/notices/cargo/anstyle-1.0.14-f65811ba/notice-002.txt +19 -0
- package/notices/cargo/anyhow-1.0.104-dc6381fb/notice-001.txt +176 -0
- package/notices/cargo/anyhow-1.0.104-dc6381fb/notice-002.txt +23 -0
- package/notices/cargo/arraydeque-0.5.1-42a9cc56/notice-001.txt +21 -0
- package/notices/cargo/autocfg-1.5.1-41f0cbe6/notice-001.txt +201 -0
- package/notices/cargo/autocfg-1.5.1-41f0cbe6/notice-002.txt +25 -0
- package/notices/cargo/base64-0.22.1-26575a7c/notice-001.txt +201 -0
- package/notices/cargo/base64-0.22.1-26575a7c/notice-002.txt +21 -0
- package/notices/cargo/base64-0.23.1-9f42fcbf/notice-001.txt +201 -0
- package/notices/cargo/base64-0.23.1-9f42fcbf/notice-002.txt +21 -0
- package/notices/cargo/bitflags-2.13.2-a49cf0c5/notice-001.txt +201 -0
- package/notices/cargo/bitflags-2.13.2-a49cf0c5/notice-002.txt +25 -0
- package/notices/cargo/block-buffer-0.10.4-0a748df3/notice-001.txt +201 -0
- package/notices/cargo/block-buffer-0.10.4-0a748df3/notice-002.txt +25 -0
- package/notices/cargo/bytes-1.12.1-e3524fe6/notice-001.txt +25 -0
- package/notices/cargo/cc-1.10.0-cda055ec/notice-001.txt +201 -0
- package/notices/cargo/cc-1.10.0-cda055ec/notice-002.txt +25 -0
- package/notices/cargo/cfg-if-1.0.5-cd0760fa/notice-001.txt +201 -0
- package/notices/cargo/cfg-if-1.0.5-cd0760fa/notice-002.txt +25 -0
- package/notices/cargo/core_detect-1.0.0-7ba90a69/notice-001.txt +201 -0
- package/notices/cargo/core_detect-1.0.0-7ba90a69/notice-002.txt +25 -0
- package/notices/cargo/cpufeatures-0.2.17-bcd8b7c7/notice-001.txt +201 -0
- package/notices/cargo/cpufeatures-0.2.17-bcd8b7c7/notice-002.txt +25 -0
- package/notices/cargo/crc32fast-1.5.3-6de55ffd/notice-001.txt +202 -0
- package/notices/cargo/crc32fast-1.5.3-6de55ffd/notice-002.txt +21 -0
- package/notices/cargo/crypto-common-0.1.7-d182dd5c/notice-001.txt +201 -0
- package/notices/cargo/crypto-common-0.1.7-d182dd5c/notice-002.txt +25 -0
- package/notices/cargo/digest-0.10.7-c92dfead/notice-001.txt +201 -0
- package/notices/cargo/digest-0.10.7-c92dfead/notice-002.txt +25 -0
- package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-001.txt +17 -0
- package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-002.txt +202 -0
- package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-003.txt +25 -0
- package/notices/cargo/encoding_rs-0.8.42-46195b9c/notice-004.txt +26 -0
- package/notices/cargo/encoding_rs_io-0.1.8-60e8f178/notice-001.txt +8 -0
- package/notices/cargo/encoding_rs_io-0.1.8-60e8f178/notice-002.txt +201 -0
- package/notices/cargo/encoding_rs_io-0.1.8-60e8f178/notice-003.txt +21 -0
- package/notices/cargo/equivalent-1.0.3-2193bbe7/notice-001.txt +201 -0
- package/notices/cargo/equivalent-1.0.3-2193bbe7/notice-002.txt +25 -0
- package/notices/cargo/errno-0.3.14-3ca95530/notice-001.txt +201 -0
- package/notices/cargo/errno-0.3.14-3ca95530/notice-002.txt +25 -0
- package/notices/cargo/fastrand-2.5.0-f2fd8a52/notice-001.txt +201 -0
- package/notices/cargo/fastrand-2.5.0-f2fd8a52/notice-002.txt +23 -0
- package/notices/cargo/filetime-0.2.29-d64063cd/notice-001.txt +201 -0
- package/notices/cargo/filetime-0.2.29-d64063cd/notice-002.txt +25 -0
- package/notices/cargo/find-msvc-tools-0.1.15-7bf23a75/notice-001.txt +201 -0
- package/notices/cargo/find-msvc-tools-0.1.15-7bf23a75/notice-002.txt +25 -0
- package/notices/cargo/flate2-1.1.10-8985ab4e/notice-001.txt +201 -0
- package/notices/cargo/flate2-1.1.10-8985ab4e/notice-002.txt +25 -0
- package/notices/cargo/foldhash-0.2.0-3ee6d7fb/notice-001.txt +19 -0
- package/notices/cargo/generic-array-0.14.7-31bd8478/notice-001.txt +21 -0
- package/notices/cargo/getrandom-0.2.17-766fa84f/notice-001.txt +201 -0
- package/notices/cargo/getrandom-0.2.17-766fa84f/notice-002.txt +26 -0
- package/notices/cargo/getrandom-0.4.3-4f1c9ebb/notice-001.txt +201 -0
- package/notices/cargo/getrandom-0.4.3-4f1c9ebb/notice-002.txt +26 -0
- package/notices/cargo/granit-parser-2.0.0-65bc2836/notice-001.txt +15 -0
- package/notices/cargo/hashbrown-0.17.1-97fc3cc1/notice-001.txt +201 -0
- package/notices/cargo/hashbrown-0.17.1-97fc3cc1/notice-002.txt +25 -0
- package/notices/cargo/http-1.5.0-6a40d4c4/notice-001.txt +201 -0
- package/notices/cargo/http-1.5.0-6a40d4c4/notice-002.txt +25 -0
- package/notices/cargo/httparse-1.10.1-cfa5aaf5/notice-001.txt +201 -0
- package/notices/cargo/httparse-1.10.1-cfa5aaf5/notice-002.txt +20 -0
- package/notices/cargo/indexmap-2.14.2-a08229e1/notice-001.txt +201 -0
- package/notices/cargo/indexmap-2.14.2-a08229e1/notice-002.txt +25 -0
- package/notices/cargo/itoa-1.0.18-b22a1f7a/notice-001.txt +176 -0
- package/notices/cargo/itoa-1.0.18-b22a1f7a/notice-002.txt +23 -0
- package/notices/cargo/libc-0.2.191-18856c2b/notice-001.txt +176 -0
- package/notices/cargo/libc-0.2.191-18856c2b/notice-002.txt +25 -0
- package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-001.txt +29 -0
- package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-002.txt +201 -0
- package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-003.txt +220 -0
- package/notices/cargo/linux-raw-sys-0.12.1-270748a5/notice-004.txt +23 -0
- package/notices/cargo/log-0.4.34-23464387/notice-001.txt +201 -0
- package/notices/cargo/log-0.4.34-23464387/notice-002.txt +25 -0
- package/notices/cargo/memchr-2.8.3-9c6980a5/notice-001.txt +3 -0
- package/notices/cargo/memchr-2.8.3-9c6980a5/notice-002.txt +21 -0
- package/notices/cargo/memchr-2.8.3-9c6980a5/notice-003.txt +24 -0
- package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-001.txt +25 -0
- package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-002.txt +177 -0
- package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-003.txt +24 -0
- package/notices/cargo/miniz_oxide-0.9.1-d0d7eacf/notice-004.txt +14 -0
- package/notices/cargo/multiversion_no_op-1.0.0-1ef14dda/notice-001.txt +15 -0
- package/notices/cargo/multiversion_no_op-1.0.0-1ef14dda/notice-002.txt +202 -0
- package/notices/cargo/multiversion_no_op-1.0.0-1ef14dda/notice-003.txt +25 -0
- package/notices/cargo/nohash-hasher-0.2.0-8ab2027b/notice-001.txt +202 -0
- package/notices/cargo/nohash-hasher-0.2.0-8ab2027b/notice-002.txt +18 -0
- package/notices/cargo/num-traits-0.2.19-d58f8d42/notice-001.txt +201 -0
- package/notices/cargo/num-traits-0.2.19-d58f8d42/notice-002.txt +25 -0
- package/notices/cargo/once_cell-1.21.4-4a678fe2/notice-001.txt +201 -0
- package/notices/cargo/once_cell-1.21.4-4a678fe2/notice-002.txt +23 -0
- package/notices/cargo/percent-encoding-2.3.2-9472d0b5/notice-001.txt +201 -0
- package/notices/cargo/percent-encoding-2.3.2-9472d0b5/notice-002.txt +25 -0
- package/notices/cargo/proc-macro2-1.0.107-ccabd92a/notice-001.txt +176 -0
- package/notices/cargo/proc-macro2-1.0.107-ccabd92a/notice-002.txt +23 -0
- package/notices/cargo/quote-1.0.47-0f6442d5/notice-001.txt +176 -0
- package/notices/cargo/quote-1.0.47-0f6442d5/notice-002.txt +23 -0
- package/notices/cargo/regex-1.13.1-3a9e4453/notice-001.txt +201 -0
- package/notices/cargo/regex-1.13.1-3a9e4453/notice-002.txt +25 -0
- package/notices/cargo/regex-automata-0.4.18-8f2fdfe1/notice-001.txt +201 -0
- package/notices/cargo/regex-automata-0.4.18-8f2fdfe1/notice-002.txt +25 -0
- package/notices/cargo/regex-syntax-0.8.11-22c58573/notice-001.txt +201 -0
- package/notices/cargo/regex-syntax-0.8.11-22c58573/notice-002.txt +25 -0
- package/notices/cargo/regex-syntax-0.8.11-22c58573/notice-003.txt +57 -0
- package/notices/cargo/ring-0.17.14-a2ecd079/notice-001.txt +9 -0
- package/notices/cargo/ring-0.17.14-a2ecd079/notice-002.txt +272 -0
- package/notices/cargo/ring-0.17.14-a2ecd079/notice-003.txt +13 -0
- package/notices/cargo/ring-0.17.14-a2ecd079/notice-004.txt +201 -0
- package/notices/cargo/ring-0.17.14-a2ecd079/notice-005.txt +23 -0
- package/notices/cargo/ring-0.17.14-a2ecd079/notice-006.txt +15 -0
- package/notices/cargo/rustix-1.1.5-75031891/notice-001.txt +29 -0
- package/notices/cargo/rustix-1.1.5-75031891/notice-002.txt +201 -0
- package/notices/cargo/rustix-1.1.5-75031891/notice-003.txt +220 -0
- package/notices/cargo/rustix-1.1.5-75031891/notice-004.txt +23 -0
- package/notices/cargo/rustls-0.23.46-d439923c/notice-001.txt +201 -0
- package/notices/cargo/rustls-0.23.46-d439923c/notice-002.txt +15 -0
- package/notices/cargo/rustls-0.23.46-d439923c/notice-003.txt +25 -0
- package/notices/cargo/rustls-pki-types-1.15.1-0cee9399/notice-001.txt +201 -0
- package/notices/cargo/rustls-pki-types-1.15.1-0cee9399/notice-002.txt +25 -0
- package/notices/cargo/rustls-webpki-0.103.16-8f5bb5a5/notice-001.txt +19 -0
- package/notices/cargo/rustversion-1.0.23-84eb0e4f/notice-001.txt +176 -0
- package/notices/cargo/rustversion-1.0.23-84eb0e4f/notice-002.txt +23 -0
- package/notices/cargo/scopeguard-1.2.0-ccdf1abe/notice-001.txt +201 -0
- package/notices/cargo/scopeguard-1.2.0-ccdf1abe/notice-002.txt +25 -0
- package/notices/cargo/serde-1.0.229-f2b8eb6e/notice-001.txt +176 -0
- package/notices/cargo/serde-1.0.229-f2b8eb6e/notice-002.txt +23 -0
- package/notices/cargo/serde-saphyr-2.0.0-6dbd70ad/notice-001.txt +176 -0
- package/notices/cargo/serde-saphyr-2.0.0-6dbd70ad/notice-002.txt +23 -0
- package/notices/cargo/serde_core-1.0.229-08cccc74/notice-001.txt +176 -0
- package/notices/cargo/serde_core-1.0.229-08cccc74/notice-002.txt +23 -0
- package/notices/cargo/serde_derive-1.0.229-db09cb76/notice-001.txt +176 -0
- package/notices/cargo/serde_derive-1.0.229-db09cb76/notice-002.txt +23 -0
- package/notices/cargo/serde_json-1.0.154-084efbf1/notice-001.txt +176 -0
- package/notices/cargo/serde_json-1.0.154-084efbf1/notice-002.txt +23 -0
- package/notices/cargo/serde_spanned-1.1.2-13274efe/notice-001.txt +202 -0
- package/notices/cargo/serde_spanned-1.1.2-13274efe/notice-002.txt +19 -0
- package/notices/cargo/sha1-0.10.7-be2212b4/notice-001.txt +201 -0
- package/notices/cargo/sha1-0.10.7-be2212b4/notice-002.txt +27 -0
- package/notices/cargo/sha2-0.10.9-be6ca6b4/notice-001.txt +201 -0
- package/notices/cargo/sha2-0.10.9-be6ca6b4/notice-002.txt +27 -0
- package/notices/cargo/shell-words-1.1.1-0d55474b/notice-001.txt +201 -0
- package/notices/cargo/shell-words-1.1.1-0d55474b/notice-002.txt +25 -0
- package/notices/cargo/shlex-2.0.1-39c59096/notice-001.txt +13 -0
- package/notices/cargo/shlex-2.0.1-39c59096/notice-002.txt +21 -0
- package/notices/cargo/signal-hook-0.3.18-a332e163/notice-001.txt +201 -0
- package/notices/cargo/signal-hook-0.3.18-a332e163/notice-002.txt +25 -0
- package/notices/cargo/signal-hook-registry-1.4.8-497004d4/notice-001.txt +201 -0
- package/notices/cargo/signal-hook-registry-1.4.8-497004d4/notice-002.txt +25 -0
- package/notices/cargo/simd-adler32-0.3.10-938489e4/notice-001.txt +21 -0
- package/notices/cargo/simdutf8-0.1.5-2b987c0c/notice-001.txt +177 -0
- package/notices/cargo/simdutf8-0.1.5-2b987c0c/notice-002.txt +19 -0
- package/notices/cargo/smallvec-1.16.4-cc422042/notice-001.txt +201 -0
- package/notices/cargo/smallvec-1.16.4-cc422042/notice-002.txt +25 -0
- package/notices/cargo/subtle-2.6.1-380cc33b/notice-001.txt +29 -0
- package/notices/cargo/syn-3.0.9-7a98808e/notice-001.txt +176 -0
- package/notices/cargo/syn-3.0.9-7a98808e/notice-002.txt +23 -0
- package/notices/cargo/tar-0.4.46-d72ec350/notice-001.txt +201 -0
- package/notices/cargo/tar-0.4.46-d72ec350/notice-002.txt +25 -0
- package/notices/cargo/tempfile-3.27.0-1f0bd317/notice-001.txt +201 -0
- package/notices/cargo/tempfile-3.27.0-1f0bd317/notice-002.txt +25 -0
- package/notices/cargo/toml-1.1.8-spec-1.1.0-ee8a4c7b/notice-001.txt +202 -0
- package/notices/cargo/toml-1.1.8-spec-1.1.0-ee8a4c7b/notice-002.txt +19 -0
- package/notices/cargo/toml_datetime-1.1.2-spec-1.1.0-f08fbf1e/notice-001.txt +202 -0
- package/notices/cargo/toml_datetime-1.1.2-spec-1.1.0-f08fbf1e/notice-002.txt +19 -0
- package/notices/cargo/toml_parser-1.1.5-spec-1.1.0-a11a62b2/notice-001.txt +202 -0
- package/notices/cargo/toml_parser-1.1.5-spec-1.1.0-a11a62b2/notice-002.txt +19 -0
- package/notices/cargo/toml_writer-1.1.3-spec-1.1.0-62b81a9a/notice-001.txt +202 -0
- package/notices/cargo/toml_writer-1.1.3-spec-1.1.0-62b81a9a/notice-002.txt +19 -0
- package/notices/cargo/typenum-1.20.1-6cdf3ca9/notice-001.txt +1 -0
- package/notices/cargo/typenum-1.20.1-6cdf3ca9/notice-002.txt +201 -0
- package/notices/cargo/typenum-1.20.1-6cdf3ca9/notice-003.txt +21 -0
- package/notices/cargo/unicode-ident-1.0.27-0f0691b5/notice-001.txt +176 -0
- package/notices/cargo/unicode-ident-1.0.27-0f0691b5/notice-002.txt +23 -0
- package/notices/cargo/unicode-ident-1.0.27-0f0691b5/notice-003.txt +39 -0
- package/notices/cargo/unicode-width-0.2.2-39fb3891/notice-001.txt +7 -0
- package/notices/cargo/unicode-width-0.2.2-39fb3891/notice-002.txt +201 -0
- package/notices/cargo/unicode-width-0.2.2-39fb3891/notice-003.txt +25 -0
- package/notices/cargo/untrusted-0.9.0-67ed8671/notice-001.txt +13 -0
- package/notices/cargo/ureq-3.5.0-13110b1a/notice-001.txt +201 -0
- package/notices/cargo/ureq-3.5.0-13110b1a/notice-002.txt +21 -0
- package/notices/cargo/ureq-proto-0.6.5-5c45f89a/notice-001.txt +202 -0
- package/notices/cargo/ureq-proto-0.6.5-5c45f89a/notice-002.txt +7 -0
- package/notices/cargo/utf8-zero-0.8.1-cf839cb2/notice-001.txt +176 -0
- package/notices/cargo/utf8-zero-0.8.1-cf839cb2/notice-002.txt +23 -0
- package/notices/cargo/uuid-1.29.0-9339a6aa/notice-001.txt +201 -0
- package/notices/cargo/uuid-1.29.0-9339a6aa/notice-002.txt +26 -0
- package/notices/cargo/version_check-0.9.5-13f5a7bf/notice-001.txt +201 -0
- package/notices/cargo/version_check-0.9.5-13f5a7bf/notice-002.txt +19 -0
- package/notices/cargo/webpki-roots-1.0.11-98a8d969/notice-001.txt +61 -0
- package/notices/cargo/winnow-1.0.4-06523b18/notice-001.txt +18 -0
- package/notices/cargo/zeroize-1.9.1-23ddc90c/notice-001.txt +202 -0
- package/notices/cargo/zeroize-1.9.1-23ddc90c/notice-002.txt +25 -0
- package/notices/cargo/zmij-1.0.23-bfa80998/notice-001.txt +23 -0
- package/notices/notice-set.json +2779 -0
- package/notices/rust/COPYRIGHT-library.html +29357 -0
- package/notices/rust/licenses/Apache-2.0.txt +73 -0
- package/notices/rust/licenses/BSD-2-Clause.txt +9 -0
- package/notices/rust/licenses/CC-BY-SA-4.0.txt +427 -0
- package/notices/rust/licenses/GCC-exception-3.1.txt +30 -0
- package/notices/rust/licenses/GPL-2.0-only.txt +133 -0
- package/notices/rust/licenses/GPL-3.0-or-later.txt +202 -0
- package/notices/rust/licenses/ISC.txt +7 -0
- package/notices/rust/licenses/LLVM-exception.txt +15 -0
- package/notices/rust/licenses/MIT.txt +9 -0
- package/notices/rust/licenses/NCSA.txt +29 -0
- package/notices/rust/licenses/OFL-1.1.txt +43 -0
- package/notices/rust/licenses/Unicode-3.0.txt +39 -0
- package/npm/docouno-env-0.3.1.tgz +0 -0
- package/package.json +27 -4
- package/release.json +1249 -0
- package/runtime/LICENSE +21 -0
- package/runtime/compose.tools.yaml +102 -0
- package/runtime/desktop-seccomp.json +1262 -0
- package/runtime/desktop.Dockerfile +29 -0
- package/runtime/devkit.mk +81 -0
- package/runtime/devkit.sh +87 -0
- package/runtime/licenses/Apache-2.0.txt +202 -0
- package/runtime/licenses/moby-profiles.NOTICE +4 -0
- package/runtime/rust.Dockerfile +8 -0
- package/runtime/toolchains.env +8 -0
- package/templates/electron-react/LICENSE +21 -0
- package/templates/electron-react/electron-builder.config.cjs +11 -0
- package/templates/electron-react/electron.vite.config.cjs +20 -0
- package/templates/electron-react/eslint.config.mjs +2 -0
- package/templates/electron-react/package-lock.json +7106 -0
- package/templates/electron-react/package.json +57 -0
- package/templates/electron-react/prettier.config.mjs +1 -0
- package/templates/electron-react/src/bridge.ts +10 -0
- package/templates/electron-react/src/main/api.test.ts +26 -0
- package/templates/electron-react/src/main/api.ts +38 -0
- package/templates/electron-react/src/main/index.ts +118 -0
- package/templates/electron-react/src/main/renderer-url.test.ts +18 -0
- package/templates/electron-react/src/main/renderer-url.ts +21 -0
- package/templates/electron-react/src/preload/index.ts +7 -0
- package/templates/electron-react/src/renderer/index.html +16 -0
- package/templates/electron-react/src/renderer/src/ClientApp.test.tsx +41 -0
- package/templates/electron-react/src/renderer/src/ClientApp.tsx +75 -0
- package/templates/electron-react/src/renderer/src/api.test.ts +15 -0
- package/templates/electron-react/src/renderer/src/api.ts +17 -0
- package/templates/electron-react/src/renderer/src/env.d.ts +6 -0
- package/templates/electron-react/src/renderer/src/main.tsx +24 -0
- package/templates/electron-react/src/renderer/src/style.css +71 -0
- package/templates/electron-react/tsconfig.json +8 -0
- package/templates/electron-react/tsconfig.node.json +13 -0
- package/templates/electron-react/tsconfig.test.json +7 -0
- package/templates/electron-react/variants/shared/files/src/renderer/src/main.tsx +24 -0
- package/templates/electron-react/variants/shared/variant.json +7 -0
- package/templates/electron-react/vitest.config.mjs +19 -0
- package/templates/node-api/LICENSE +21 -0
- package/templates/node-api/eslint.config.mjs +2 -0
- package/templates/node-api/package-lock.json +1989 -0
- package/templates/node-api/package.json +41 -0
- package/templates/node-api/prettier.config.mjs +1 -0
- package/templates/node-api/src/greeting.test.ts +14 -0
- package/templates/node-api/src/greeting.ts +8 -0
- package/templates/node-api/src/http.test.ts +64 -0
- package/templates/node-api/src/http.ts +46 -0
- package/templates/node-api/src/index.ts +26 -0
- package/templates/node-api/tsconfig.build.json +5 -0
- package/templates/node-api/tsconfig.json +9 -0
- package/templates/react-client/LICENSE +21 -0
- package/templates/react-client/eslint.config.mjs +2 -0
- package/templates/react-client/package-lock.json +3758 -0
- package/templates/react-client/package.json +68 -0
- package/templates/react-client/prettier.config.mjs +1 -0
- package/templates/react-client/src/ClientApp.test.tsx +41 -0
- package/templates/react-client/src/ClientApp.tsx +75 -0
- package/templates/react-client/src/index.ts +2 -0
- package/templates/react-client/src/style.css +71 -0
- package/templates/react-client/tsconfig.build.json +10 -0
- package/templates/react-client/tsconfig.json +8 -0
- package/templates/react-client/tsconfig.test.json +7 -0
- package/templates/react-client/vitest.config.mjs +19 -0
- package/templates/react-web/LICENSE +21 -0
- package/templates/react-web/eslint.config.mjs +2 -0
- package/templates/react-web/index.html +12 -0
- package/templates/react-web/package-lock.json +3754 -0
- package/templates/react-web/package.json +50 -0
- package/templates/react-web/prettier.config.mjs +1 -0
- package/templates/react-web/src/ClientApp.test.tsx +41 -0
- package/templates/react-web/src/ClientApp.tsx +75 -0
- package/templates/react-web/src/api.test.ts +24 -0
- package/templates/react-web/src/api.ts +29 -0
- package/templates/react-web/src/main.tsx +15 -0
- package/templates/react-web/src/style.css +71 -0
- package/templates/react-web/tsconfig.json +8 -0
- package/templates/react-web/tsconfig.test.json +7 -0
- package/templates/react-web/variants/shared/files/src/main.tsx +15 -0
- package/templates/react-web/variants/shared/variant.json +3 -0
- package/templates/react-web/vite.config.mjs +14 -0
- package/templates/react-web/vitest.config.mjs +19 -0
- package/templates/rust-api/Cargo.lock +476 -0
- package/templates/rust-api/Cargo.toml +22 -0
- package/templates/rust-api/LICENSE +21 -0
- package/templates/rust-api/rust-toolchain.toml +3 -0
- package/templates/rust-api/rustfmt.toml +2 -0
- package/templates/rust-api/src/lib.rs +68 -0
- package/templates/rust-api/src/main.rs +23 -0
- package/templates/rust-api/tests/api.rs +85 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "devkit-node-app",
|
|
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.build.json eslint.config.mjs prettier.config.mjs",
|
|
12
|
+
"lint": "eslint --no-ignore --max-warnings 0 src eslint.config.mjs prettier.config.mjs",
|
|
13
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
14
|
+
"fix": "prettier --write src tsconfig.json tsconfig.build.json eslint.config.mjs prettier.config.mjs && eslint --no-ignore --max-warnings 0 --fix src eslint.config.mjs prettier.config.mjs",
|
|
15
|
+
"test": "node --test --test-reporter=@docouno/env/node-test-reporter 'src/**/*.test.ts'",
|
|
16
|
+
"build": "tsc -p tsconfig.build.json",
|
|
17
|
+
"dev": "node --watch src/index.ts",
|
|
18
|
+
"start": "node dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"zod": "4.6.7"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@docouno/env": "0.3.1",
|
|
25
|
+
"@types/node": "24.19.2",
|
|
26
|
+
"eslint": "10.13.0",
|
|
27
|
+
"prettier": "3.9.10",
|
|
28
|
+
"typescript": "6.0.3"
|
|
29
|
+
},
|
|
30
|
+
"devkit": {
|
|
31
|
+
"sourceDirectories": [
|
|
32
|
+
"src"
|
|
33
|
+
],
|
|
34
|
+
"typecheckConfigs": [
|
|
35
|
+
"tsconfig.json"
|
|
36
|
+
],
|
|
37
|
+
"boundaries": {
|
|
38
|
+
"forbidCrossAppImports": true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@docouno/env/prettier';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { greeting } from './greeting.ts';
|
|
4
|
+
|
|
5
|
+
await test('normalizes a name and gives an explicit default', () => {
|
|
6
|
+
assert.deepEqual(greeting(' Ada '), { message: 'Hello, Ada!' });
|
|
7
|
+
assert.deepEqual(greeting(' '), { message: 'Hello, world!' });
|
|
8
|
+
assert.deepEqual(greeting(undefined), { message: 'Hello, world!' });
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
await test('rejects invalid input instead of coercing it silently', () => {
|
|
12
|
+
assert.throws(() => greeting(42));
|
|
13
|
+
assert.throws(() => greeting('x'.repeat(81)));
|
|
14
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { once } from 'node:events';
|
|
3
|
+
import { createConnection } from 'node:net';
|
|
4
|
+
import test from 'node:test';
|
|
5
|
+
import { createApplication } from './http.ts';
|
|
6
|
+
|
|
7
|
+
await test('serves the real API and exposes failure statuses', async () => {
|
|
8
|
+
const server = createApplication();
|
|
9
|
+
server.listen(0, '127.0.0.1');
|
|
10
|
+
await once(server, 'listening');
|
|
11
|
+
const address = server.address();
|
|
12
|
+
assert.ok(address && typeof address !== 'string');
|
|
13
|
+
const root = `http://127.0.0.1:${address.port}`;
|
|
14
|
+
try {
|
|
15
|
+
const health = await fetch(`${root}/health`);
|
|
16
|
+
assert.equal(health.status, 200);
|
|
17
|
+
assert.deepEqual(await health.json(), { status: 'ok' });
|
|
18
|
+
const named = await fetch(`${root}/api/greeting?name=%20Ada%20`);
|
|
19
|
+
assert.equal(named.status, 200);
|
|
20
|
+
assert.deepEqual(await named.json(), { message: 'Hello, Ada!' });
|
|
21
|
+
const empty = await fetch(`${root}/api/greeting?name=%20`);
|
|
22
|
+
assert.deepEqual(await empty.json(), { message: 'Hello, world!' });
|
|
23
|
+
const invalid = await fetch(`${root}/api/greeting?name=${'x'.repeat(81)}`);
|
|
24
|
+
assert.equal(invalid.status, 400);
|
|
25
|
+
const method = await fetch(`${root}/api/greeting`, { method: 'POST' });
|
|
26
|
+
assert.equal(method.status, 405);
|
|
27
|
+
assert.equal((await fetch(`${root}/missing`)).status, 404);
|
|
28
|
+
} finally {
|
|
29
|
+
await new Promise<void>((resolve, reject) => {
|
|
30
|
+
server.close((error) => (error ? reject(error) : resolve()));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
await test('a malformed raw request target returns 400 and keeps the server responsive', async () => {
|
|
36
|
+
const server = createApplication();
|
|
37
|
+
server.listen(0, '127.0.0.1');
|
|
38
|
+
await once(server, 'listening');
|
|
39
|
+
const address = server.address();
|
|
40
|
+
assert.ok(address && typeof address !== 'string');
|
|
41
|
+
try {
|
|
42
|
+
const response = await new Promise<string>((resolve, reject) => {
|
|
43
|
+
const socket = createConnection({ host: '127.0.0.1', port: address.port }, () => {
|
|
44
|
+
socket.end('GET // HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n');
|
|
45
|
+
});
|
|
46
|
+
socket.setEncoding('utf8');
|
|
47
|
+
socket.setTimeout(5_000, () => socket.destroy(new Error('Raw HTTP request timed out.')));
|
|
48
|
+
let raw = '';
|
|
49
|
+
socket.on('data', (chunk: string) => {
|
|
50
|
+
raw += chunk;
|
|
51
|
+
});
|
|
52
|
+
socket.once('end', () => resolve(raw));
|
|
53
|
+
socket.once('error', reject);
|
|
54
|
+
});
|
|
55
|
+
assert.match(response, /^HTTP\/1\.1 400 Bad Request\r\n/u);
|
|
56
|
+
assert.deepEqual(await (await fetch(`http://127.0.0.1:${address.port}/health`)).json(), {
|
|
57
|
+
status: 'ok',
|
|
58
|
+
});
|
|
59
|
+
} finally {
|
|
60
|
+
await new Promise<void>((resolve, reject) => {
|
|
61
|
+
server.close((error) => (error ? reject(error) : resolve()));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import type { Server, ServerResponse } from 'node:http';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { greeting } from './greeting.ts';
|
|
5
|
+
|
|
6
|
+
function send(response: ServerResponse, status: number, body: Record<string, unknown>): void {
|
|
7
|
+
response.writeHead(status, {
|
|
8
|
+
'content-type': 'application/json; charset=utf-8',
|
|
9
|
+
'cache-control': 'no-store',
|
|
10
|
+
});
|
|
11
|
+
response.end(`${JSON.stringify(body)}\n`);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function createApplication(): Server {
|
|
15
|
+
return createServer((request, response) => {
|
|
16
|
+
let url: URL;
|
|
17
|
+
try {
|
|
18
|
+
url = new URL(request.url ?? '/', 'http://localhost');
|
|
19
|
+
} catch {
|
|
20
|
+
send(response, 400, { error: 'Invalid request target.' });
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!['/health', '/api/greeting'].includes(url.pathname)) {
|
|
24
|
+
send(response, 404, { error: 'Not found.' });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (request.method !== 'GET') {
|
|
28
|
+
response.setHeader('allow', 'GET');
|
|
29
|
+
send(response, 405, { error: 'Method not allowed.' });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (url.pathname === '/health') {
|
|
33
|
+
send(response, 200, { status: 'ok' });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
send(response, 200, greeting(url.searchParams.get('name') ?? undefined));
|
|
38
|
+
} catch (error) {
|
|
39
|
+
if (error instanceof z.ZodError) {
|
|
40
|
+
send(response, 400, { error: 'Name must contain at most 80 characters.' });
|
|
41
|
+
} else {
|
|
42
|
+
send(response, 500, { error: 'Unable to produce a greeting.' });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { env } from 'node:process';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { createApplication } from './http.ts';
|
|
4
|
+
|
|
5
|
+
const port = z.coerce.number().int().min(0).max(65_535).default(8080).parse(env.PORT);
|
|
6
|
+
const server = createApplication();
|
|
7
|
+
server.on('error', (error: Error) => {
|
|
8
|
+
console.error(`Server error: ${error.message}`);
|
|
9
|
+
process.exitCode = 1;
|
|
10
|
+
});
|
|
11
|
+
server.listen(port, '0.0.0.0', () => {
|
|
12
|
+
const address = server.address();
|
|
13
|
+
if (address && typeof address !== 'string') {
|
|
14
|
+
console.log(`Listening on 0.0.0.0:${address.port}`);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
for (const signal of ['SIGINT', 'SIGTERM'] as const) {
|
|
18
|
+
process.once(signal, () => {
|
|
19
|
+
server.close((error) => {
|
|
20
|
+
if (error) {
|
|
21
|
+
console.error(`Unable to close the server: ${error.message}`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Devkit contributors
|
|
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.
|