webtools

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 01fe00b8820bc3af480d444b3d92fe2c21b16f22
parent 996705ec5176c4e3ec8c9763c135cb3b74d982a3
Author: minerva-jupiter <ryouturn@gmail.com>
Date:   Sun, 28 Sep 2025 15:55:30 +0900

add password gen page

Diffstat:
M.gitignore | 2++
Mapp/globals.css | 42------------------------------------------
Mapp/layout.tsx | 15+--------------
Mapp/page.module.css | 167-------------------------------------------------------------------------------
Mapp/page.tsx | 17+++++++++--------
Aapp/password/page.tsx | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpackage.json | 2+-
Awasm-webtools/.cargo/config.toml | 2++
Mwasm-webtools/Cargo.lock | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mwasm-webtools/Cargo.toml | 3+++
Mwasm-webtools/pkg/.gitignore | 3++-
Mwasm-webtools/pkg/wasm_webtools.d.ts | 10++++++----
Mwasm-webtools/pkg/wasm_webtools.js | 112+++++++++++++++++++++++++++++++++++--------------------------------------------
Mwasm-webtools/pkg/wasm_webtools_bg.wasm | 0
Mwasm-webtools/pkg/wasm_webtools_bg.wasm.d.ts | 8+++++---
Mwasm-webtools/src/lib.rs | 31+++++++++++++++++++++++++------
Mwasm-webtools/target/.rustc_info.json | 12++++++------
Mwasm-webtools/target/wasm32-unknown-unknown/release/.fingerprint/wasm-webtools-dbe1619293742a9c/lib-wasm_webtools | 4++--
Mwasm-webtools/target/wasm32-unknown-unknown/release/.fingerprint/wasm-webtools-dbe1619293742a9c/lib-wasm_webtools.json | 8++++++--
Mwasm-webtools/target/wasm32-unknown-unknown/release/deps/wasm_webtools.wasm | 0
Mwasm-webtools/target/wasm32-unknown-unknown/release/wasm_webtools.wasm | 0
21 files changed, 408 insertions(+), 319 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -39,3 +39,5 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +/wasm-webtools/target* diff --git a/app/globals.css b/app/globals.css @@ -1,42 +0,0 @@ -:root { - --background: #ffffff; - --foreground: #171717; -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - -html, -body { - max-width: 100vw; - overflow-x: hidden; -} - -body { - color: var(--foreground); - background: var(--background); - font-family: Arial, Helvetica, sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -a { - color: inherit; - text-decoration: none; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } -} diff --git a/app/layout.tsx b/app/layout.tsx @@ -1,17 +1,6 @@ import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - export const metadata: Metadata = { title: "Webtools by Minerva Juppiter", description: "Webtools by minerva-jupiter", @@ -24,9 +13,7 @@ export default function RootLayout({ }>) { return ( <html lang="en"> - <body className={`${geistSans.variable} ${geistMono.variable}`}> - {children} - </body> + <body>{children}</body> </html> ); } diff --git a/app/page.module.css b/app/page.module.css @@ -1,167 +0,0 @@ -.page { - --gray-rgb: 0, 0, 0; - --gray-alpha-200: rgba(var(--gray-rgb), 0.08); - --gray-alpha-100: rgba(var(--gray-rgb), 0.05); - - --button-primary-hover: #383838; - --button-secondary-hover: #f2f2f2; - - display: grid; - grid-template-rows: 20px 1fr 20px; - align-items: center; - justify-items: center; - min-height: 100svh; - padding: 80px; - gap: 64px; - font-family: var(--font-geist-sans); -} - -@media (prefers-color-scheme: dark) { - .page { - --gray-rgb: 255, 255, 255; - --gray-alpha-200: rgba(var(--gray-rgb), 0.145); - --gray-alpha-100: rgba(var(--gray-rgb), 0.06); - - --button-primary-hover: #ccc; - --button-secondary-hover: #1a1a1a; - } -} - -.main { - display: flex; - flex-direction: column; - gap: 32px; - grid-row-start: 2; -} - -.main ol { - font-family: var(--font-geist-mono); - padding-left: 0; - margin: 0; - font-size: 14px; - line-height: 24px; - letter-spacing: -0.01em; - list-style-position: inside; -} - -.main li:not(:last-of-type) { - margin-bottom: 8px; -} - -.main code { - font-family: inherit; - background: var(--gray-alpha-100); - padding: 2px 4px; - border-radius: 4px; - font-weight: 600; -} - -.ctas { - display: flex; - gap: 16px; -} - -.ctas a { - appearance: none; - border-radius: 128px; - height: 48px; - padding: 0 20px; - border: 1px solid transparent; - transition: - background 0.2s, - color 0.2s, - border-color 0.2s; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - line-height: 20px; - font-weight: 500; -} - -a.primary { - background: var(--foreground); - color: var(--background); - gap: 8px; -} - -a.secondary { - border-color: var(--gray-alpha-200); - min-width: 158px; -} - -.footer { - grid-row-start: 3; - display: flex; - gap: 24px; -} - -.footer a { - display: flex; - align-items: center; - gap: 8px; -} - -.footer img { - flex-shrink: 0; -} - -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - a.primary:hover { - background: var(--button-primary-hover); - border-color: transparent; - } - - a.secondary:hover { - background: var(--button-secondary-hover); - border-color: transparent; - } - - .footer a:hover { - text-decoration: underline; - text-underline-offset: 4px; - } -} - -@media (max-width: 600px) { - .page { - padding: 32px; - padding-bottom: 80px; - } - - .main { - align-items: center; - } - - .main ol { - text-align: center; - } - - .ctas { - flex-direction: column; - } - - .ctas a { - font-size: 14px; - height: 40px; - padding: 0 16px; - } - - a.secondary { - min-width: auto; - } - - .footer { - flex-wrap: wrap; - align-items: center; - justify-content: center; - } -} - -@media (prefers-color-scheme: dark) { - .logo { - filter: invert(); - } -} diff --git a/app/page.tsx b/app/page.tsx @@ -1,15 +1,16 @@ -"use client"; -import init, { greet } from "../wasm-webtools/pkg/wasm_webtools"; -import { useEffect } from "react"; +import Link from "next/link"; export default function Home() { - useEffect(() => { - init(); - }, []); return ( <main> - <h1>webtools</h1> - <button onClick={() => greet("App")}>greet</button> + <h1>Webtools</h1> + <h4>by Minerva_Juppiter</h4> + <br /> + <ul> + <li> + <Link href="/password">Password Generator</Link> + </li> + </ul> </main> ); } diff --git a/app/password/page.tsx b/app/password/page.tsx @@ -0,0 +1,169 @@ +"use client"; +import React, { useState, useEffect } from "react"; + +type WasmModule = { + generate_password: (length: number, asciiFlags: Uint8Array) => string; +}; + +// ASCII printable symbols: 33–126 (除外: A-Z, a-z, 0-9) +const SYMBOLS = Array.from({ length: 126 - 33 + 1 }, (_, i) => + String.fromCharCode(i + 33), +).filter((c) => { + const code = c.charCodeAt(0); + return !( + ( + (code >= 48 && code <= 57) || // digits + (code >= 65 && code <= 90) || // upper + (code >= 97 && code <= 122) + ) // lower + ); +}); + +export default function PasswordGenerator() { + const [wasm, setWasm] = useState<WasmModule | null>(null); + const [password, setPassword] = useState(""); + const [length, setLength] = useState(12); + + const [useUpper, setUseUpper] = useState(true); + const [useLower, setUseLower] = useState(true); + const [useDigits, setUseDigits] = useState(true); + + const [symbolFlags, setSymbolFlags] = useState<Record<string, boolean>>( + SYMBOLS.reduce((acc, s) => ({ ...acc, [s]: false }), {}), + ); + + useEffect(() => { + (async () => { + const wasmModule: WasmModule = await import( + "../../wasm-webtools/pkg/wasm_webtools.js" + ); + await (wasmModule as any).default(); // wasm 初期化 + setWasm(wasmModule); + })(); + }, []); + + const buildAsciiFlags = () => { + const flags = new Uint8Array(128); + + if (useUpper) for (let i = 65; i <= 90; i++) flags[i] = 1; + if (useLower) for (let i = 97; i <= 122; i++) flags[i] = 1; + if (useDigits) for (let i = 48; i <= 57; i++) flags[i] = 1; + + for (const s of SYMBOLS) { + if (symbolFlags[s]) { + flags[s.charCodeAt(0)] = 1; + } + } + return flags; + }; + + const generate = () => { + if (wasm) { + const flags = buildAsciiFlags(); + const pw = wasm.generate_password(length, flags); + setPassword(pw); + } + }; + + const toggleSymbol = (s: string) => { + setSymbolFlags((prev) => ({ ...prev, [s]: !prev[s] })); + }; + + // 一括選択/解除 + const setAllSymbols = (checked: boolean) => { + setSymbolFlags(SYMBOLS.reduce((acc, s) => ({ ...acc, [s]: checked }), {})); + }; + + return ( + <main> + <h2>Password Generator</h2> + + <label> + Length: + <input + type="number" + value={length} + min={4} + max={64} + onChange={(e) => setLength(parseInt(e.target.value))} + /> + </label> + + <div style={{ marginTop: 12 }}> + <label> + <input + type="checkbox" + checked={useUpper} + onChange={() => setUseUpper(!useUpper)} + /> + Uppercase (A–Z) + </label> + <br /> + <label> + <input + type="checkbox" + checked={useLower} + onChange={() => setUseLower(!useLower)} + /> + Lowercase (a–z) + </label> + <br /> + <label> + <input + type="checkbox" + checked={useDigits} + onChange={() => setUseDigits(!useDigits)} + /> + Digits (0–9) + </label> + </div> + + <div style={{ marginTop: 12 }}> + <strong>Symbols (ASCII 33–126 非英数字):</strong> + <div style={{ marginBottom: 8 }}> + <button onClick={() => setAllSymbols(true)}>Select All</button> + <button + onClick={() => setAllSymbols(false)} + style={{ marginLeft: 8 }} + > + Deselect All + </button> + </div> + <div style={{ display: "flex", flexWrap: "wrap", gap: "6px" }}> + {SYMBOLS.map((s) => ( + <label + key={s} + style={{ display: "flex", alignItems: "center", gap: 2 }} + > + <input + type="checkbox" + checked={symbolFlags[s]} + onChange={() => toggleSymbol(s)} + /> + <span style={{ fontFamily: "monospace" }}>{s}</span> + </label> + ))} + </div> + </div> + + <button onClick={generate} disabled={!wasm} style={{ marginTop: 12 }}> + Generate + </button> + + {password && ( + <div style={{ marginTop: 12 }}> + <strong>Generated Password:</strong> + <div + style={{ + fontFamily: "monospace", + padding: 8, + border: "1px solid #ddd", + }} + > + {password} + </div> + </div> + )} + </main> + ); +} diff --git a/package.json b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "next dev --turbopack", "build": "next build --turbopack", - "testbuild": "wasm-pack build --release --target web && next build --turbopack", + "testbuild": "cd ./wasm-webtools && wasm-pack build --release --target web && cd .. && next build --turbopack", "start": "next start", "lint": "biome check", "format": "biome format --write" diff --git a/wasm-webtools/.cargo/config.toml b/wasm-webtools/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.wasm32-unknown-unknown] +rustflags = ["--cfg", 'getrandom_backend="wasm_js"'] diff --git a/wasm-webtools/Cargo.lock b/wasm-webtools/Cargo.lock @@ -15,6 +15,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.176" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" + +[[package]] name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -27,6 +57,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] name = "proc-macro2" version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -45,6 +84,41 @@ dependencies = [ ] [[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -68,6 +142,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] name = "wasm-bindgen" version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -130,5 +222,33 @@ dependencies = [ name = "wasm-webtools" version = "0.1.0" dependencies = [ + "getrandom", + "rand", "wasm-bindgen", ] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/wasm-webtools/Cargo.toml b/wasm-webtools/Cargo.toml @@ -7,4 +7,7 @@ edition = "2024" crate-type = ["cdylib"] [dependencies] +rand = "0.9.2" wasm-bindgen = "0.2" +getrandom = { version = "0.3", features = ["wasm_js"] } + diff --git a/wasm-webtools/pkg/.gitignore b/wasm-webtools/pkg/.gitignore @@ -1 +1 @@ - +*+ \ No newline at end of file diff --git a/wasm-webtools/pkg/wasm_webtools.d.ts b/wasm-webtools/pkg/wasm_webtools.d.ts @@ -1,15 +1,17 @@ /* tslint:disable */ /* eslint-disable */ -export function greet(name: string): void; +export function generate_password(length: number, ascii_flags: Uint8Array): string; export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { readonly memory: WebAssembly.Memory; - readonly greet: (a: number, b: number) => void; - readonly __wbindgen_export_0: WebAssembly.Table; + readonly generate_password: (a: number, b: number, c: number) => [number, number]; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __externref_table_alloc: () => number; + readonly __wbindgen_export_2: WebAssembly.Table; readonly __wbindgen_malloc: (a: number, b: number) => number; - readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __wbindgen_start: () => void; } diff --git a/wasm-webtools/pkg/wasm_webtools.js b/wasm-webtools/pkg/wasm_webtools.js @@ -9,6 +9,35 @@ function getUint8ArrayMemory0() { return cachedUint8ArrayMemory0; } +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +function addToExternrefTable0(obj) { + const idx = wasm.__externref_table_alloc(); + wasm.__wbindgen_export_2.set(idx, obj); + return idx; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + const idx = addToExternrefTable0(e); + wasm.__wbindgen_exn_store(idx); + } +} + +let WASM_VECTOR_LEN = 0; + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); cachedTextDecoder.decode(); @@ -29,67 +58,24 @@ function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; return decodeText(ptr, len); } - -let WASM_VECTOR_LEN = 0; - -const cachedTextEncoder = new TextEncoder(); - -if (!('encodeInto' in cachedTextEncoder)) { - cachedTextEncoder.encodeInto = function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; - } -} - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8ArrayMemory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); - const ret = cachedTextEncoder.encodeInto(arg, view); - - offset += ret.written; - ptr = realloc(ptr, len, offset, 1) >>> 0; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} /** - * @param {string} name + * @param {number} length + * @param {Uint8Array} ascii_flags + * @returns {string} */ -export function greet(name) { - const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - wasm.greet(ptr0, len0); +export function generate_password(length, ascii_flags) { + let deferred2_0; + let deferred2_1; + try { + const ptr0 = passArray8ToWasm0(ascii_flags, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.generate_password(length, ptr0, len0); + deferred2_0 = ret[0]; + deferred2_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); + } } const EXPECTED_RESPONSE_TYPES = new Set(['basic', 'cors', 'default']); @@ -130,11 +116,11 @@ async function __wbg_load(module, imports) { function __wbg_get_imports() { const imports = {}; imports.wbg = {}; - imports.wbg.__wbg_alert_1475fbfe66663308 = function(arg0, arg1) { - alert(getStringFromWasm0(arg0, arg1)); - }; + imports.wbg.__wbg_getRandomValues_3c9c0d586e575a16 = function() { return handleError(function (arg0, arg1) { + globalThis.crypto.getRandomValues(getArrayU8FromWasm0(arg0, arg1)); + }, arguments) }; imports.wbg.__wbindgen_init_externref_table = function() { - const table = wasm.__wbindgen_export_0; + const table = wasm.__wbindgen_export_2; const offset = table.grow(4); table.set(0, undefined); table.set(offset + 0, undefined); diff --git a/wasm-webtools/pkg/wasm_webtools_bg.wasm b/wasm-webtools/pkg/wasm_webtools_bg.wasm Binary files differ. diff --git a/wasm-webtools/pkg/wasm_webtools_bg.wasm.d.ts b/wasm-webtools/pkg/wasm_webtools_bg.wasm.d.ts @@ -1,8 +1,10 @@ /* tslint:disable */ /* eslint-disable */ export const memory: WebAssembly.Memory; -export const greet: (a: number, b: number) => void; -export const __wbindgen_export_0: WebAssembly.Table; +export const generate_password: (a: number, b: number, c: number) => [number, number]; +export const __wbindgen_exn_store: (a: number) => void; +export const __externref_table_alloc: () => number; +export const __wbindgen_export_2: WebAssembly.Table; export const __wbindgen_malloc: (a: number, b: number) => number; -export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __wbindgen_start: () => void; diff --git a/wasm-webtools/src/lib.rs b/wasm-webtools/src/lib.rs @@ -1,11 +1,30 @@ use wasm_bindgen::prelude::*; +use rand::Rng; #[wasm_bindgen] -extern { - pub fn alert(s: &str); -} +pub fn generate_password(length: usize, ascii_flags: &[u8]) -> String { + if ascii_flags.len() != 128 { + return String::from(""); + } -#[wasm_bindgen] -pub fn greet(name: &str) { - alert(&format!("Hello, {}!", name)); + let mut charset: Vec<char> = Vec::new(); + for (i, flag) in ascii_flags.iter().enumerate() { + if *flag == 1 { + if let Some(c) = char::from_u32(i as u32) { + charset.push(c); + } + } + } + + if charset.is_empty() { + return String::from(""); + } + + let mut rng = rand::rng(); + (0..length) + .map(|_| { + let idx = rng.random_range(0..charset.len()); + charset[idx] + }) + .collect() } diff --git a/wasm-webtools/target/.rustc_info.json b/wasm-webtools/target/.rustc_info.json @@ -8,19 +8,19 @@ "stdout": "___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\ryout\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n", "stderr": "" }, - "17747080675513052775": { + "6711017332200297983": { "success": true, "status": "", "code": 0, - "stdout": "rustc 1.90.0 (1159e78c4 2025-09-14)\nbinary: rustc\ncommit-hash: 1159e78c4747b02ef996e55082b704c09b970588\ncommit-date: 2025-09-14\nhost: x86_64-pc-windows-msvc\nrelease: 1.90.0\nLLVM version: 20.1.8\n", - "stderr": "" + "stdout": "___.wasm\nlib___.rlib\n___.wasm\nlib___.a\nC:\\Users\\ryout\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\noff\n___\ndebug_assertions\ngetrandom_backend=\"wasm_js\"\npanic=\"abort\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"wasm32\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"wasm\"\ntarget_feature=\"bulk-memory\"\ntarget_feature=\"multivalue\"\ntarget_feature=\"mutable-globals\"\ntarget_feature=\"nontrapping-fptoint\"\ntarget_feature=\"reference-types\"\ntarget_feature=\"sign-ext\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"unknown\"\ntarget_pointer_width=\"32\"\ntarget_vendor=\"unknown\"\n", + "stderr": "warning: dropping unsupported crate type `dylib` for target `wasm32-unknown-unknown`\n\nwarning: dropping unsupported crate type `proc-macro` for target `wasm32-unknown-unknown`\n\nwarning: 2 warnings emitted\n\n" }, - "11652014622397750202": { + "17747080675513052775": { "success": true, "status": "", "code": 0, - "stdout": "___.wasm\nlib___.rlib\n___.wasm\nlib___.a\nC:\\Users\\ryout\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\noff\n___\ndebug_assertions\npanic=\"abort\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"wasm32\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"wasm\"\ntarget_feature=\"bulk-memory\"\ntarget_feature=\"multivalue\"\ntarget_feature=\"mutable-globals\"\ntarget_feature=\"nontrapping-fptoint\"\ntarget_feature=\"reference-types\"\ntarget_feature=\"sign-ext\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"unknown\"\ntarget_pointer_width=\"32\"\ntarget_vendor=\"unknown\"\n", - "stderr": "warning: dropping unsupported crate type `dylib` for target `wasm32-unknown-unknown`\n\nwarning: dropping unsupported crate type `proc-macro` for target `wasm32-unknown-unknown`\n\nwarning: 2 warnings emitted\n\n" + "stdout": "rustc 1.90.0 (1159e78c4 2025-09-14)\nbinary: rustc\ncommit-hash: 1159e78c4747b02ef996e55082b704c09b970588\ncommit-date: 2025-09-14\nhost: x86_64-pc-windows-msvc\nrelease: 1.90.0\nLLVM version: 20.1.8\n", + "stderr": "" } }, "successes": {} diff --git a/wasm-webtools/target/wasm32-unknown-unknown/release/.fingerprint/wasm-webtools-dbe1619293742a9c/lib-wasm_webtools b/wasm-webtools/target/wasm32-unknown-unknown/release/.fingerprint/wasm-webtools-dbe1619293742a9c/lib-wasm_webtools @@ -1 +1 @@ -1dda1f8dbec2c317- \ No newline at end of file +08dcc873efd98ebe+ \ No newline at end of file diff --git a/wasm-webtools/target/wasm32-unknown-unknown/release/.fingerprint/wasm-webtools-dbe1619293742a9c/lib-wasm_webtools.json b/wasm-webtools/target/wasm32-unknown-unknown/release/.fingerprint/wasm-webtools-dbe1619293742a9c/lib-wasm_webtools.json @@ -5,7 +5,11 @@ "target": 5696381987966493737, "profile": 2040997289075261528, "path": 10763286916239946207, - "deps": [[14523432694356582846, "wasm_bindgen", false, 17994470996234034743]], + "deps": [ + [3331586631144870129, "getrandom", false, 11561567353179385507], + [11916940916964035392, "rand", false, 17811854299403166000], + [14523432694356582846, "wasm_bindgen", false, 3218038190105477635] + ], "local": [ { "CheckDepInfo": { @@ -14,7 +18,7 @@ } } ], - "rustflags": [], + "rustflags": ["--cfg", "getrandom_backend=\"wasm_js\""], "config": 2069994364910194474, "compile_kind": 14682669768258224367 } diff --git a/wasm-webtools/target/wasm32-unknown-unknown/release/deps/wasm_webtools.wasm b/wasm-webtools/target/wasm32-unknown-unknown/release/deps/wasm_webtools.wasm Binary files differ. diff --git a/wasm-webtools/target/wasm32-unknown-unknown/release/wasm_webtools.wasm b/wasm-webtools/target/wasm32-unknown-unknown/release/wasm_webtools.wasm Binary files differ.