{"_id":"@affino/analytics-core","name":"@affino/analytics-core","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@affino/analytics-core","version":"0.1.0","author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"type":"module","description":"Headless analytics core for Affino query and aggregation logic","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"main":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/affinio/affinio.git","directory":"packages/analytics-core"},"homepage":"https://github.com/affinio/affinio/tree/main/packages/analytics-core#readme","license":"MIT","keywords":["affino","analytics","query","aggregation","headless"],"devDependencies":{"vitest":"^4.0.18"},"bugs":{"url":"https://github.com/affinio/affinio/issues"},"module":"dist/index.js","scripts":{"build":"tsc -p tsconfig.json","type-check":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit && tsc -p tsconfig.examples.json --noEmit","test":"vitest run --config ./vitest.config.ts"},"_id":"@affino/analytics-core@0.1.0","_integrity":"sha512-pBNVYuqVleANsMv4SSvucGbJ3MgnylkB/sW/cjy3HCmgVCtOp12k958VgCNQ/wFm6b7MJ8YBcL011fWWhvjC0Q==","_resolved":"/tmp/76bd51e42bb1bf381f5b12d3eabc9410/affino-analytics-core-0.1.0.tgz","_from":"file:affino-analytics-core-0.1.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-pBNVYuqVleANsMv4SSvucGbJ3MgnylkB/sW/cjy3HCmgVCtOp12k958VgCNQ/wFm6b7MJ8YBcL011fWWhvjC0Q==","shasum":"f7d237c69f03cbae9eb70e9639bba75ff59b8f83","tarball":"https://registry.npmjs.org/@affino/analytics-core/-/analytics-core-0.1.0.tgz","fileCount":24,"unpackedSize":22960,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEW4I0rzIFmiMty2iPJ+OnaAFZ5N3B7o17+RD0C1ljG9AiAAp/QFv5QJG1GaFajg+QISPzejozzPDzjppqaueRUo1A=="}]},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"directories":{},"maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/analytics-core_0.1.0_1779187114562_0.7286888352884755"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T10:38:34.484Z","0.1.0":"2026-05-19T10:38:34.746Z","modified":"2026-05-19T10:38:34.945Z"},"maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"description":"Headless analytics core for Affino query and aggregation logic","homepage":"https://github.com/affinio/affinio/tree/main/packages/analytics-core#readme","keywords":["affino","analytics","query","aggregation","headless"],"repository":{"type":"git","url":"git+https://github.com/affinio/affinio.git","directory":"packages/analytics-core"},"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"bugs":{"url":"https://github.com/affinio/affinio/issues"},"license":"MIT","readme":"# @affino/analytics-core\n\nHeadless analytics data pipeline utilities for plain TypeScript rows. The package has no UI, rendering, Vue, React, DOM, Canvas, SVG, or chart dependencies.\n\nCurrent pipeline:\n\n```text\nrows -> filters -> aggregation -> sort/limit -> dataset\n```\n\nUse it to prepare chart-ready, map-ready, KPI, or DataGrid-derived result rows without coupling the analytics model to any rendering layer.\n\n## Schema Inference\n\n```ts\nimport { inferAnalyticsSchema } from \"@affino/analytics-core\"\n\nconst schema = inferAnalyticsSchema([\n  { region: \"UK\", amount: 100, active: true },\n  { region: \"EU\", amount: 250, active: false },\n])\n\n// {\n//   fields: [\n//     { id: \"region\", type: \"string\" },\n//     { id: \"amount\", type: \"number\" },\n//     { id: \"active\", type: \"boolean\" },\n//   ],\n// }\n```\n\n## Grouped Aggregation\n\n```ts\nimport { aggregateRows } from \"@affino/analytics-core\"\n\nconst rows = aggregateRows([\n  { region: \"UK\", amount: 100 },\n  { region: \"UK\", amount: 200 },\n  { region: \"EU\", amount: 250 },\n], {\n  dimensions: [{ field: \"region\" }],\n  measures: [\n    { op: \"count\", as: \"count\" },\n    { field: \"amount\", op: \"sum\", as: \"totalAmount\" },\n  ],\n})\n\n// [\n//   { region: \"UK\", count: 2, totalAmount: 300 },\n//   { region: \"EU\", count: 1, totalAmount: 250 },\n// ]\n```\n\n## Filtered Top-N Dataset\n\n```ts\nimport { createAnalyticsDataset } from \"@affino/analytics-core\"\n\nconst dataset = createAnalyticsDataset([\n  { region: \"UK\", amount: 100, status: \"active\" },\n  { region: \"UK\", amount: 200, status: \"active\" },\n  { region: \"EU\", amount: 250, status: \"inactive\" },\n], {\n  filters: [{ field: \"status\", op: \"equals\", value: \"active\" }],\n  dimensions: [{ field: \"region\" }],\n  measures: [\n    { op: \"count\", as: \"count\" },\n    { field: \"amount\", op: \"sum\", as: \"totalAmount\" },\n  ],\n  sort: [{ field: \"totalAmount\", direction: \"desc\" }],\n  limit: 10,\n}, {\n  generatedAt: \"2026-05-18T00:00:00.000Z\",\n})\n\n// {\n//   rows: [{ region: \"UK\", count: 2, totalAmount: 300 }],\n//   fields: [\n//     { id: \"region\", type: \"string\" },\n//     { id: \"count\", type: \"number\" },\n//     { id: \"totalAmount\", type: \"number\" },\n//   ],\n//   meta: {\n//     rowCount: 1,\n//     sourceRowCount: 3,\n//     generatedAt: \"2026-05-18T00:00:00.000Z\",\n//   },\n// }\n```\n\n## Behavior Notes\n\n- Filters use AND semantics.\n- String filters are string-only: `contains`, `startsWith`, and `endsWith` ignore non-string row values.\n- Numeric comparisons are number-only: `gt`, `gte`, `lt`, and `lte` ignore non-number row values.\n- Numeric aggregations ignore non-numeric values.\n- Numeric aggregations return `null` when no numeric values exist in a group.\n- `executeAnalyticsQuery` returns aggregated/query result rows after filtering, sorting, and limiting.\n- `createAnalyticsDataset` infers fields from output rows, not source rows.\n- `generatedAt` is only included in dataset metadata when provided.\n\n## Non-Goals For v0.1\n\n- No chart rendering.\n- No Vue, React, or DOM integration.\n- No visual encoding model yet.\n- No date or numeric buckets yet.\n- No server SQL pushdown.\n","readmeFilename":"README.md","_rev":"1-02a5b6a2c3defaccdfa6bf71a7c29bef"}