Implements Phases 1-8 of the TFTSR implementation plan. Rust backend (Tauri 2.x, src-tauri/): - Multi-provider AI: OpenAI-compatible, Anthropic, Gemini, Mistral, Ollama - PII detection engine: 11 regex patterns with overlap resolution - SQLCipher AES-256 encrypted database with 10 versioned migrations - 28 Tauri IPC commands for triage, analysis, document, and system ops - Ollama: hardware probe, model recommendations, pull/delete with events - RCA and blameless post-mortem Markdown document generators - PDF export via printpdf - Audit log: SHA-256 hash of every external data send - Integration stubs for Confluence, ServiceNow, Azure DevOps (v0.2) Frontend (React 18 + TypeScript + Vite, src/): - 9 pages: full triage workflow NewIssue→LogUpload→Triage→Resolution→RCA→Postmortem→History+Settings - 7 components: ChatWindow, TriageProgress, PiiDiffViewer, DocEditor, HardwareReport, ModelSelector, UI primitives - 3 Zustand stores: session, settings (persisted), history - Type-safe tauriCommands.ts matching Rust backend types exactly - 8 IT domain system prompts (Linux, Windows, Network, K8s, DB, Virt, HW, Obs) DevOps: - .woodpecker/test.yml: rustfmt, clippy, cargo test, tsc, vitest on every push - .woodpecker/release.yml: linux/amd64 + linux/arm64 builds, Gogs release upload Verified: - cargo check: zero errors - tsc --noEmit: zero errors - vitest run: 13/13 unit tests passing Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
4.6 KiB
style-to-js
Parses CSS inline style to JavaScript object (camelCased):
StyleToJS(string)
Example
import parse from 'style-to-js';
parse('background-color: #BADA55;');
Output:
{ "backgroundColor": "#BADA55" }
Install
NPM:
npm install style-to-js --save
Yarn:
yarn add style-to-js
CDN:
<script src="https://unpkg.com/style-to-js@latest/umd/style-to-js.min.js"></script>
<script>
window.StyleToJS(/* string */);
</script>
Usage
Import
Import with ES Modules:
import parse from 'style-to-js';
Require with CommonJS:
const parse = require('style-to-js');
Parse style
Parse single declaration:
parse('line-height: 42');
Output:
{ "lineHeight": "42" }
Note
Notice that the CSS property is camelCased.
Parse multiple declarations:
parse(`
border-color: #ACE;
z-index: 1337;
`);
Output:
{
"borderColor": "#ACE",
"zIndex": "1337"
}
Vendor prefix
Parse vendor prefix:
parse(`
-webkit-transition: all 4s ease;
-moz-transition: all 4s ease;
-ms-transition: all 4s ease;
-o-transition: all 4s ease;
-khtml-transition: all 4s ease;
`);
Output:
{
"webkitTransition": "all 4s ease",
"mozTransition": "all 4s ease",
"msTransition": "all 4s ease",
"oTransition": "all 4s ease",
"khtmlTransition": "all 4s ease"
}
Custom property
Parse custom property:
parse('--custom-property: #f00');
Output:
{ "--custom-property": "#f00" }
Unknown declaration
This library does not validate declarations, so unknown declarations can be parsed:
parse('the-answer: 42;');
Output:
{ "theAnswer": "42" }
Invalid declaration
Declarations with missing value are removed:
parse(`
margin-top: ;
margin-right: 1em;
`);
Output:
{ "marginRight": "1em" }
Other invalid declarations or arguments:
parse(); // {}
parse(null); // {}
parse(1); // {}
parse(true); // {}
parse('top:'); // {}
parse(':12px'); // {}
parse(':'); // {}
parse(';'); // {}
The following values will throw an error:
parse('top'); // Uncaught Error: property missing ':'
parse('/*'); // Uncaught Error: End of comment missing
Options
reactCompat
When option reactCompat is true, the vendor prefix will be capitalized:
parse(
`
-webkit-transition: all 4s ease;
-moz-transition: all 4s ease;
-ms-transition: all 4s ease;
-o-transition: all 4s ease;
-khtml-transition: all 4s ease;
`,
{ reactCompat: true },
);
Output:
{
"WebkitTransition": "all 4s ease",
"MozTransition": "all 4s ease",
"msTransition": "all 4s ease",
"OTransition": "all 4s ease",
"KhtmlTransition": "all 4s ease"
}
This removes the React warning:
Warning: Unsupported vendor-prefixed style property %s. Did you mean %s?%s", "oTransition", "OTransition"
Testing
Run tests with coverage:
npm test
Run tests in watch mode:
npm run test:watch
Lint files:
npm run lint
Fix lint errors:
npm run lint:fix
Release
Release and publish are automated by Release Please.
