{"_id":"@avento-space/ts-sdk","name":"@avento-space/ts-sdk","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@avento-space/ts-sdk","version":"1.0.0","description":"Centralized SDK for Avento developers","type":"module","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","private":false,"sideEffects":false,"engines":{"node":">=18"},"license":"UNLICENSED","repository":{"type":"git","url":"git+https://github.com/avento/ts-sdk.git"},"bugs":{"url":"https://github.com/avento/ts-sdk/issues"},"homepage":"https://github.com/avento/ts-sdk#readme","keywords":["sdk","avento","logging","validation","crypto","async"],"publishConfig":{"access":"public"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./shared/logging":{"types":"./dist/shared/logging/index.d.ts","import":"./dist/shared/logging/index.mjs","require":"./dist/shared/logging/index.js"},"./shared/async":{"types":"./dist/shared/async/index.d.ts","import":"./dist/shared/async/index.mjs","require":"./dist/shared/async/index.js"},"./shared/crypto":{"types":"./dist/shared/crypto/index.d.ts","import":"./dist/shared/crypto/index.mjs","require":"./dist/shared/crypto/index.js"},"./shared/dates":{"types":"./dist/shared/dates/index.d.ts","import":"./dist/shared/dates/index.mjs","require":"./dist/shared/dates/index.js"},"./shared/events":{"types":"./dist/shared/events/index.d.ts","import":"./dist/shared/events/index.mjs","require":"./dist/shared/events/index.js"},"./shared/ids":{"types":"./dist/shared/ids/index.d.ts","import":"./dist/shared/ids/index.mjs","require":"./dist/shared/ids/index.js"},"./shared/validation":{"types":"./dist/shared/validation/index.d.ts","import":"./dist/shared/validation/index.mjs","require":"./dist/shared/validation/index.js"},"./shared/collections":{"types":"./dist/shared/collections/index.d.ts","import":"./dist/shared/collections/index.mjs","require":"./dist/shared/collections/index.js"},"./shared/algorithms":{"types":"./dist/shared/algorithms/index.d.ts","import":"./dist/shared/algorithms/index.mjs","require":"./dist/shared/algorithms/index.js"},"./shared/string":{"types":"./dist/shared/string/index.d.ts","import":"./dist/shared/string/index.mjs","require":"./dist/shared/string/index.js"},"./shared/result":{"types":"./dist/shared/result/index.d.ts","import":"./dist/shared/result/index.mjs","require":"./dist/shared/result/index.js"},"./shared/memoize":{"types":"./dist/shared/memoize/index.d.ts","import":"./dist/shared/memoize/index.mjs","require":"./dist/shared/memoize/index.js"},"./shared/cookie":{"types":"./dist/shared/cookie/index.d.ts","import":"./dist/shared/cookie/index.mjs","require":"./dist/shared/cookie/index.js"},"./shared/url":{"types":"./dist/shared/url/index.d.ts","import":"./dist/shared/url/index.mjs","require":"./dist/shared/url/index.js"},"./platform/node":{"types":"./dist/platform/node/index.d.ts","import":"./dist/platform/node/index.mjs","require":"./dist/platform/node/index.js"},"./platform/browser":{"types":"./dist/platform/browser/index.d.ts","import":"./dist/platform/browser/index.mjs","require":"./dist/platform/browser/index.js"},"./domains/billing":{"types":"./dist/domains/billing/index.d.ts","import":"./dist/domains/billing/index.mjs","require":"./dist/domains/billing/index.js"},"./domains/storage":{"types":"./dist/domains/storage/index.d.ts","import":"./dist/domains/storage/index.mjs","require":"./dist/domains/storage/index.js"},"./domains/notifications":{"types":"./dist/domains/notifications/index.d.ts","import":"./dist/domains/notifications/index.mjs","require":"./dist/domains/notifications/index.js"},"./domains/sessions":{"types":"./dist/domains/sessions/index.d.ts","import":"./dist/domains/sessions/index.mjs","require":"./dist/domains/sessions/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./internal/*":null,"./eslint":"./eslint.config.mjs"},"scripts":{"prepare":"npm run build","build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""},"dependencies":{"bcryptjs":"^3.0.3","date-fns":"^4.1.0","eventemitter3":"^5.0.1","mnemonist":"^0.39.8","ms":"^2.1.3","nanoid":"^5.1.3","pino":"^9.6.0","uuid":"^11.1.0","zod":"^3.24.2"},"devDependencies":{"@types/bcryptjs":"^2.4.6","@types/ms":"^2.1.0","@types/node":"^22.13.10","@types/uuid":"^10.0.0","pino-pretty":"^13.0.0","tsup":"^8.4.0","typescript":"^5.8.2","vitest":"^3.0.8"},"gitHead":"b70fbcf6d3431a61211d9df8c9ddc1cc84b30403","_id":"@avento-space/ts-sdk@1.0.0","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-nxZCGapaVVXvJ72VB9F+Q3ymiRZc+gun5GfZEtgHpOuvZeNiGnTxCz6pmENuQONLeRSl8ZTwYsiLVe8HL2P8ww==","shasum":"256a99e8fb6e2c1b48bf90f10243a02a42c7fa0d","tarball":"https://registry.npmjs.org/@avento-space/ts-sdk/-/ts-sdk-1.0.0.tgz","fileCount":214,"unpackedSize":3114407,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDyfE35LRZcKBddaY67+EpFaxJLbtgjbQufyriAr40OgQIgfnJSLgbAoStXYIXuZhI22FHu8nTToa34+lnK9qaZWvQ="}]},"_npmUser":{"name":"avento-space-npm","email":"infra@avento.lat"},"directories":{},"maintainers":[{"name":"avento-space-npm","email":"infra@avento.lat"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ts-sdk_1.0.0_1781795929290_0.7623774530971279"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-18T15:18:49.107Z","1.0.0":"2026-06-18T15:18:49.466Z","modified":"2026-06-18T15:18:49.717Z"},"maintainers":[{"name":"avento-space-npm","email":"infra@avento.lat"}],"description":"Centralized SDK for Avento developers","homepage":"https://github.com/avento/ts-sdk#readme","keywords":["sdk","avento","logging","validation","crypto","async"],"repository":{"type":"git","url":"git+https://github.com/avento/ts-sdk.git"},"bugs":{"url":"https://github.com/avento/ts-sdk/issues"},"license":"UNLICENSED","readme":"# @avento/ts-sdk\n\nInfrastructure toolkit that absorbs cross-cutting complexity so product\nteams build features without reinventing the wheel or coupling apps to\nthird-party libraries.\n\nSee [`SDK_DEFINITION.md`](./docs/SDK_DEFINITION.md) for the full contract —\ndesign principles, scope, dependency rules, and success criteria.\n\n## Installation\n\n```bash\nnpm install git+ssh://git@github.com/AventoSpace/avento-ts-sdk.git#v1.0.0\n```\n\n> This package is proprietary and **not published to npm**. Install it as a Git dependency. The `prepare` script builds the package automatically during install.\n\n## Entry Points\n\nImport only what you need. Every module is tree-shakable.\n\n```typescript\n// Root — convenience barrel (everything re-exported here)\nimport { BaseError, ValidationError, NotFoundError } from \"@avento/ts-sdk\";\nimport type { DeepPartial, Nullable, AsyncResult } from \"@avento/ts-sdk\";\n\n// Shared modules — preferred for tree-shaking\nimport { sleep, retry } from \"@avento/ts-sdk/shared/async\";\nimport { z, createSchema } from \"@avento/ts-sdk/shared/validation\";\nimport { createLogger } from \"@avento/ts-sdk/shared/logging\";\nimport { uuid, nanoid } from \"@avento/ts-sdk/shared/ids\";\nimport { sha256, hashPassword } from \"@avento/ts-sdk/shared/crypto\";\nimport { TypedEventEmitter } from \"@avento/ts-sdk/shared/events\";\nimport { format, parseDuration } from \"@avento/ts-sdk/shared/dates\";\nimport { pick, omit, unique } from \"@avento/ts-sdk/shared/collections\";\nimport { Ok, Err } from \"@avento/ts-sdk/shared/result\";\nimport { parseCookie } from \"@avento/ts-sdk/shared/cookie\";\nimport { buildUrl } from \"@avento/ts-sdk/shared/url\";\nimport { memoize } from \"@avento/ts-sdk/shared/memoize\";\nimport { truncate, slugify } from \"@avento/ts-sdk/shared/string\";\nimport { bubbleSort, quickSort } from \"@avento/ts-sdk/shared/algorithms\";\n\n// Platform utilities\nimport { clipboard, isOnline } from \"@avento/ts-sdk/platform/browser\";\nimport { fsUtils } from \"@avento/ts-sdk/platform/node\";\n\n// Domain ports + mock adapters (hexagonal)\nimport { MockObjectStorage } from \"@avento/ts-sdk/domains/storage\";\nimport { MockNotificationSender } from \"@avento/ts-sdk/domains/notifications\";\nimport { MockSessionStore } from \"@avento/ts-sdk/domains/sessions\";\nimport { MockBillingProvider } from \"@avento/ts-sdk/domains/billing\";\n\n// Testing\nimport { createMockLogger, Builder, waitFor } from \"@avento/ts-sdk/testing\";\n```\n\n> ❌ Never import from internal or dist paths:\n> `@avento/ts-sdk/internal/*` or `@avento/ts-sdk/dist/*`\n\n## Module Overview\n\n### Shared Modules\n\n| Module | Description |\n|--------|-------------|\n| `shared/async` | Promise utilities: `sleep`, `retry`, `timeout`, `parallel` |\n| `shared/validation` | Zod-based schema validation: `createSchema`, `commonSchemas` |\n| `shared/logging` | Structured logging: `createLogger`, `ConsoleLogger`, `NoopLogger`, `installConsoleOverrides` |\n| `shared/crypto` | Hashing: `sha256`, `hashPassword`, `verifyPassword`, `generateToken` |\n| `shared/ids` | UUID and nanoid generation |\n| `shared/events` | Typed event emitter |\n| `shared/dates` | Date formatting and duration parsing |\n| `shared/collections` | `pick`, `omit`, `unique`, `chunk`, `groupBy`, `Queue`, `Stack` |\n| `shared/algorithms` | `bubbleSort`, `quickSort`, `binarySearch`, `debounce`, `throttle` |\n| `shared/result` | `Ok`, `Err`, `Result` discriminated union |\n| `shared/memoize` | `memoize` with TTL support |\n| `shared/cookie` | `parseCookie`, `serializeCookie` |\n| `shared/url` | `buildUrl`, `parseUrl`, `isAbsolute` |\n| `shared/string` | `truncate`, `slugify`, `capitalize` |\n\n### Domain Ports (Hexagonal)\n\n| Domain | Port | Mock Adapter |\n|--------|------|------------|\n| `domains/billing` | `BillingProvider` | `MockBillingProvider` |\n| `domains/storage` | `ObjectStorage` | `MockObjectStorage` |\n| `domains/notifications` | `NotificationSender` | `MockNotificationSender` |\n| `domains/sessions` | `SessionStore` | `MockSessionStore` |\n\n### Platform Modules\n\n| Module | Description |\n|--------|-------------|\n| `platform/browser` | `clipboard`, `isOnline`, `onOnline`, `onOffline`, `fetchWithTimeout` |\n| `platform/node` | `fsUtils.readJSON`, `writeJSON`, `ensureDir`, `exists` |\n\n### Testing Utilities\n\n| Import | Description |\n|--------|-------------|\n| `createMockLogger` | Pre-configured mock logger for unit tests |\n| `Builder<T>` | Generic test data builder with fluent API |\n| `wait` | `sleep` alias for test helpers |\n| `waitFor` | Polls a predicate until it passes or times out |\n\n### Console Override\n\nEnforce SDK logger usage at runtime in the consumer project:\n\n```typescript\nimport { installConsoleOverrides } from \"@avento/ts-sdk/shared/logging\";\n\ninstallConsoleOverrides();\n// console.log/warn/error now route through the SDK logger\n// with a one-time deprecation warning per call site\n```\n\n### ESLint Config\n\nForbid `console.*` at build time:\n\n```js\n// eslint.config.mjs\nimport sdkEslint from \"@avento/ts-sdk/eslint\";\nexport default [...sdkEslint];\n```\n\n## Architecture\n\nThe SDK follows a strict layered architecture. Dependencies flow downward only.\n\n```\nROOT INDEX          re-exports every public symbol for convenience\n     │\n     ├── SHARED MODULES     async  crypto  dates  events  ids\n     │          │           validation  logging  collections\n     │          │           algorithms  string  result  memoize\n     │          │           cookie  url\n     │          │\n     │          ├── CORE    errors  types\n     │          │\n     │          └── PLATFORM    browser  node\n     │\n     ├── DOMAINS     billing  storage  notifications  sessions\n     │\n     └── TESTING     mocks  builder  wait\n```\n\n**Rules:**\n- `core` — imports NO other SDK module (only stdlib + externals)\n- `shared` — may import `core` only\n- `domains` — may import `shared` and `core`; never depends on other domains\n- `platform` — isolated per environment; never depends on other modules\n- `testing` — may import any module (test-only, not for production)\n\n## Design Principles\n\n| # | Principle |\n|---|-----------|\n| P1 | **Prefer functions over classes** — no stateless classes in public API |\n| P2 | **Zero side-effects on import** — importing must never connect, log, or mutate globals |\n| P3 | **Explicit typing** — no `any` in public APIs |\n| P4 | **Fail loudly** — always throw typed `BaseError` subclasses |\n| P5 | **Composition over inheritance** — no abstract classes in public API |\n| P6 | **No circular dependencies** — enforced in CI |\n| P7 | **Input immutability** — never mutate arguments |\n| P8 | **Deliberate dependencies** — every external dep must be justified |\n\n## Development\n\n```bash\nnpm run build       # Build with tsup (CJS + ESM + DTS)\nnpm test            # Run vitest (132+ tests)\nnpm run clean       # Remove dist/\n```\n\n## Scripts\n\n### Scaffold a new monorepo project\n\nCreate a project with DDD + CQRS architecture, ESLint, Vitest, Prettier, and TypeScript pre-configured:\n\n```bash\n# from your new project directory:\nnode /path/to/@avento/ts-sdk/scripts/new-project.js my-app\n\n# or if the SDK is installed as a dependency:\nnode node_modules/@avento/ts-sdk/scripts/new-project.js my-app\n```\n\nThe scaffold generates:\n```\nmy-app/\n├── apps/api/              Application entry point\n├── domains/\n│   ├── users/             User management (DDD + CQRS)\n│   └── orders/            Order management (DDD + CQRS)\n├── infrastructure/        Shared infrastructure (database, messaging)\n├── shared/                Shared domain primitives\n├── packages/              Additional packages\n├── docs/                  Architecture & rules documentation\n├── eslint.config.mjs      ESLint (flat config, strict)\n├── vitest.workspace.ts    Vitest workspace\n├── tsconfig.base.json     TypeScript strict\n└── .prettierrc            Prettier config\n```\n","readmeFilename":"README.md","_rev":"1-c099399a57e6873acbb9f555497e15fe"}