@ketvietlab/ketjs 0.1.2 → 0.1.5
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 +1 -1
- package/README.md +8 -2
- package/dist/agent/capabilities.d.ts +1 -3
- package/dist/agent/capabilities.d.ts.map +1 -1
- package/dist/agent/capabilities.js +10 -1
- package/dist/agent/capabilities.js.map +1 -1
- package/dist/agent/permissions.d.ts +43 -1
- package/dist/agent/permissions.d.ts.map +1 -1
- package/dist/agent/permissions.js +50 -2
- package/dist/agent/permissions.js.map +1 -1
- package/dist/cli.js +246 -97
- package/dist/cli.js.map +1 -1
- package/dist/codegen/dts.d.ts.map +1 -1
- package/dist/codegen/dts.js +1 -0
- package/dist/codegen/dts.js.map +1 -1
- package/dist/data/changeset.d.ts +12 -0
- package/dist/data/changeset.d.ts.map +1 -1
- package/dist/data/changeset.js +73 -17
- package/dist/data/changeset.js.map +1 -1
- package/dist/data/expr.d.ts +25 -1
- package/dist/data/expr.d.ts.map +1 -1
- package/dist/data/expr.js +47 -6
- package/dist/data/expr.js.map +1 -1
- package/dist/data/fleet.d.ts +41 -1
- package/dist/data/fleet.d.ts.map +1 -1
- package/dist/data/fleet.js +100 -11
- package/dist/data/fleet.js.map +1 -1
- package/dist/data/migrate.d.ts +20 -0
- package/dist/data/migrate.d.ts.map +1 -1
- package/dist/data/migrate.js +86 -3
- package/dist/data/migrate.js.map +1 -1
- package/dist/data/physical.d.ts +5 -0
- package/dist/data/physical.d.ts.map +1 -0
- package/dist/data/physical.js +196 -0
- package/dist/data/physical.js.map +1 -0
- package/dist/data/pool.d.ts +2 -1
- package/dist/data/pool.d.ts.map +1 -1
- package/dist/data/pool.js +159 -31
- package/dist/data/pool.js.map +1 -1
- package/dist/data/query.d.ts +10 -1
- package/dist/data/query.d.ts.map +1 -1
- package/dist/data/query.js +136 -27
- package/dist/data/query.js.map +1 -1
- package/dist/data/sqlite.d.ts.map +1 -1
- package/dist/data/sqlite.js +350 -52
- package/dist/data/sqlite.js.map +1 -1
- package/dist/data/time.d.ts +13 -0
- package/dist/data/time.d.ts.map +1 -1
- package/dist/data/time.js +61 -17
- package/dist/data/time.js.map +1 -1
- package/dist/index.d.ts +45 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -18
- package/dist/index.js.map +1 -1
- package/dist/kernel/audit.d.ts +27 -0
- package/dist/kernel/audit.d.ts.map +1 -0
- package/dist/kernel/audit.js +67 -0
- package/dist/kernel/audit.js.map +1 -0
- package/dist/kernel/classification.d.ts +26 -0
- package/dist/kernel/classification.d.ts.map +1 -0
- package/dist/kernel/classification.js +73 -0
- package/dist/kernel/classification.js.map +1 -0
- package/dist/kernel/compose.d.ts +6 -2
- package/dist/kernel/compose.d.ts.map +1 -1
- package/dist/kernel/compose.js +269 -15
- package/dist/kernel/compose.js.map +1 -1
- package/dist/kernel/define.d.ts +2 -3
- package/dist/kernel/define.d.ts.map +1 -1
- package/dist/kernel/define.js +22 -12
- package/dist/kernel/define.js.map +1 -1
- package/dist/kernel/diff.d.ts.map +1 -1
- package/dist/kernel/diff.js +28 -4
- package/dist/kernel/diff.js.map +1 -1
- package/dist/kernel/graph.js +1 -1
- package/dist/kernel/graph.js.map +1 -1
- package/dist/kernel/i18n.d.ts +10 -1
- package/dist/kernel/i18n.d.ts.map +1 -1
- package/dist/kernel/i18n.js +34 -1
- package/dist/kernel/i18n.js.map +1 -1
- package/dist/kernel/layout.d.ts +97 -0
- package/dist/kernel/layout.d.ts.map +1 -1
- package/dist/kernel/layout.js +294 -12
- package/dist/kernel/layout.js.map +1 -1
- package/dist/kernel/menu.d.ts +33 -2
- package/dist/kernel/menu.d.ts.map +1 -1
- package/dist/kernel/menu.js +99 -7
- package/dist/kernel/menu.js.map +1 -1
- package/dist/kernel/modules.d.ts +3 -3
- package/dist/kernel/modules.d.ts.map +1 -1
- package/dist/kernel/modules.js +21 -21
- package/dist/kernel/modules.js.map +1 -1
- package/dist/kernel/permissions.d.ts +10 -0
- package/dist/kernel/permissions.d.ts.map +1 -0
- package/dist/kernel/permissions.js +365 -0
- package/dist/kernel/permissions.js.map +1 -0
- package/dist/kernel/schedule.d.ts +23 -0
- package/dist/kernel/schedule.d.ts.map +1 -0
- package/dist/kernel/schedule.js +83 -0
- package/dist/kernel/schedule.js.map +1 -0
- package/dist/kernel/types.d.ts.map +1 -1
- package/dist/kernel/types.js +5 -4
- package/dist/kernel/types.js.map +1 -1
- package/dist/kernel/workspace.d.ts +92 -14
- package/dist/kernel/workspace.d.ts.map +1 -1
- package/dist/kernel/workspace.js +128 -49
- package/dist/kernel/workspace.js.map +1 -1
- package/dist/pdf/assets/Inter-Bold.ttf +0 -0
- package/dist/pdf/assets/Inter-Regular.ttf +0 -0
- package/dist/pdf/assets/Inter-SemiBold.ttf +0 -0
- package/dist/pdf/assets/LICENSE.txt +92 -0
- package/dist/pdf/font.d.ts +10 -0
- package/dist/pdf/font.d.ts.map +1 -0
- package/dist/pdf/font.js +83 -0
- package/dist/pdf/font.js.map +1 -0
- package/dist/pdf/image.d.ts +8 -0
- package/dist/pdf/image.d.ts.map +1 -0
- package/dist/pdf/image.js +94 -0
- package/dist/pdf/image.js.map +1 -0
- package/dist/pdf/index.d.ts +15 -0
- package/dist/pdf/index.d.ts.map +1 -0
- package/dist/pdf/index.js +17 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/markup.d.ts +19 -0
- package/dist/pdf/markup.d.ts.map +1 -0
- package/dist/pdf/markup.js +146 -0
- package/dist/pdf/markup.js.map +1 -0
- package/dist/pdf/render.d.ts +14 -0
- package/dist/pdf/render.d.ts.map +1 -0
- package/dist/pdf/render.js +387 -0
- package/dist/pdf/render.js.map +1 -0
- package/dist/scaffold/index.js +6 -6
- package/dist/scaffold/index.js.map +1 -1
- package/dist/scaffold/templates/{app.test.ts.tmpl → deployment.test.ts.tmpl} +3 -3
- package/dist/scaffold/templates/ket.workspace.ts.tmpl +4 -6
- package/dist/scaffold/templates/module.ts.tmpl +1 -4
- package/dist/server/assets.d.ts +23 -0
- package/dist/server/assets.d.ts.map +1 -0
- package/dist/server/assets.js +97 -0
- package/dist/server/assets.js.map +1 -0
- package/dist/server/boot.d.ts +174 -38
- package/dist/server/boot.d.ts.map +1 -1
- package/dist/server/boot.js +399 -140
- package/dist/server/boot.js.map +1 -1
- package/dist/server/config.d.ts +30 -10
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +73 -17
- package/dist/server/config.js.map +1 -1
- package/dist/server/ctx.d.ts +10 -0
- package/dist/server/ctx.d.ts.map +1 -1
- package/dist/server/ctx.js +284 -48
- package/dist/server/ctx.js.map +1 -1
- package/dist/server/development.d.ts +10 -0
- package/dist/server/development.d.ts.map +1 -0
- package/dist/server/development.js +15 -0
- package/dist/server/development.js.map +1 -0
- package/dist/server/fn.d.ts +22 -3
- package/dist/server/fn.d.ts.map +1 -1
- package/dist/server/fn.js +116 -32
- package/dist/server/fn.js.map +1 -1
- package/dist/server/form.d.ts +33 -0
- package/dist/server/form.d.ts.map +1 -0
- package/dist/server/form.js +47 -0
- package/dist/server/form.js.map +1 -0
- package/dist/server/http.d.ts +82 -3
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +373 -37
- package/dist/server/http.js.map +1 -1
- package/dist/server/idem.d.ts +3 -2
- package/dist/server/idem.d.ts.map +1 -1
- package/dist/server/idem.js +12 -4
- package/dist/server/idem.js.map +1 -1
- package/dist/server/jobs.js +1 -1
- package/dist/server/jobs.js.map +1 -1
- package/dist/server/log/combinators.d.ts +42 -0
- package/dist/server/log/combinators.d.ts.map +1 -0
- package/dist/server/log/combinators.js +270 -0
- package/dist/server/log/combinators.js.map +1 -0
- package/dist/server/log/console.d.ts +12 -0
- package/dist/server/log/console.d.ts.map +1 -0
- package/dist/server/log/console.js +96 -0
- package/dist/server/log/console.js.map +1 -0
- package/dist/server/log/file.d.ts +11 -0
- package/dist/server/log/file.d.ts.map +1 -0
- package/dist/server/log/file.js +61 -0
- package/dist/server/log/file.js.map +1 -0
- package/dist/server/log/index.d.ts +23 -0
- package/dist/server/log/index.d.ts.map +1 -0
- package/dist/server/log/index.js +45 -0
- package/dist/server/log/index.js.map +1 -0
- package/dist/server/log/logger.d.ts +53 -0
- package/dist/server/log/logger.d.ts.map +1 -0
- package/dist/server/log/logger.js +94 -0
- package/dist/server/log/logger.js.map +1 -0
- package/dist/server/log/memory.d.ts +11 -0
- package/dist/server/log/memory.d.ts.map +1 -0
- package/dist/server/log/memory.js +25 -0
- package/dist/server/log/memory.js.map +1 -0
- package/dist/server/log/types.d.ts +112 -0
- package/dist/server/log/types.d.ts.map +1 -0
- package/dist/server/log/types.js +58 -0
- package/dist/server/log/types.js.map +1 -0
- package/dist/server/policy.d.ts +29 -0
- package/dist/server/policy.d.ts.map +1 -0
- package/dist/server/policy.js +29 -0
- package/dist/server/policy.js.map +1 -0
- package/dist/server/queue.d.ts +1 -1
- package/dist/server/queue.d.ts.map +1 -1
- package/dist/server/queue.js.map +1 -1
- package/dist/server/ratelimit.d.ts +48 -0
- package/dist/server/ratelimit.d.ts.map +1 -0
- package/dist/server/ratelimit.js +102 -0
- package/dist/server/ratelimit.js.map +1 -0
- package/dist/server/respond.d.ts.map +1 -1
- package/dist/server/respond.js +16 -1
- package/dist/server/respond.js.map +1 -1
- package/dist/server/runtime.d.ts +18 -3
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +32 -2
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/schedule.d.ts +18 -0
- package/dist/server/schedule.d.ts.map +1 -0
- package/dist/server/schedule.js +70 -0
- package/dist/server/schedule.js.map +1 -0
- package/dist/server/sequence.d.ts +42 -0
- package/dist/server/sequence.d.ts.map +1 -0
- package/dist/server/sequence.js +97 -0
- package/dist/server/sequence.js.map +1 -0
- package/dist/server/session.d.ts +21 -0
- package/dist/server/session.d.ts.map +1 -1
- package/dist/server/session.js +84 -10
- package/dist/server/session.js.map +1 -1
- package/dist/server/sessionstore.d.ts +3 -1
- package/dist/server/sessionstore.d.ts.map +1 -1
- package/dist/server/sessionstore.js +7 -3
- package/dist/server/sessionstore.js.map +1 -1
- package/dist/server/storage/index.d.ts +1 -1
- package/dist/server/storage/index.d.ts.map +1 -1
- package/dist/server/storage/index.js +61 -1
- package/dist/server/storage/index.js.map +1 -1
- package/dist/server/storage/types.d.ts +8 -0
- package/dist/server/storage/types.d.ts.map +1 -1
- package/dist/server/storage/types.js +58 -0
- package/dist/server/storage/types.js.map +1 -1
- package/dist/server/stream.d.ts +8 -2
- package/dist/server/stream.d.ts.map +1 -1
- package/dist/server/stream.js +44 -4
- package/dist/server/stream.js.map +1 -1
- package/dist/server/streamstore.d.ts +10 -0
- package/dist/server/streamstore.d.ts.map +1 -1
- package/dist/server/streamstore.js +72 -6
- package/dist/server/streamstore.js.map +1 -1
- package/dist/server/tenants.d.ts +20 -18
- package/dist/server/tenants.d.ts.map +1 -1
- package/dist/server/tenants.js +133 -84
- package/dist/server/tenants.js.map +1 -1
- package/dist/server/transport/types.js +2 -2
- package/dist/server/transport/types.js.map +1 -1
- package/dist/server/worker.d.ts +19 -3
- package/dist/server/worker.d.ts.map +1 -1
- package/dist/server/worker.js +168 -21
- package/dist/server/worker.js.map +1 -1
- package/dist/testing.d.ts +26 -10
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +41 -14
- package/dist/testing.js.map +1 -1
- package/dist/theme/contracts.d.ts +14 -1
- package/dist/theme/contracts.d.ts.map +1 -1
- package/dist/theme/contracts.js +35 -6
- package/dist/theme/contracts.js.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/joint-runtime.d.ts +33 -0
- package/dist/theme/joint-runtime.d.ts.map +1 -0
- package/dist/theme/joint-runtime.js +121 -0
- package/dist/theme/joint-runtime.js.map +1 -0
- package/dist/theme/joints.d.ts.map +1 -1
- package/dist/theme/joints.js +15 -97
- package/dist/theme/joints.js.map +1 -1
- package/dist/theme/ktl/compile.d.ts +4 -0
- package/dist/theme/ktl/compile.d.ts.map +1 -1
- package/dist/theme/ktl/compile.js +54 -1
- package/dist/theme/ktl/compile.js.map +1 -1
- package/dist/theme/ktl/parser.d.ts +4 -0
- package/dist/theme/ktl/parser.d.ts.map +1 -1
- package/dist/theme/ktl/parser.js +8 -0
- package/dist/theme/ktl/parser.js.map +1 -1
- package/dist/theme/render.d.ts +8 -0
- package/dist/theme/render.d.ts.map +1 -1
- package/dist/theme/render.js +88 -118
- package/dist/theme/render.js.map +1 -1
- package/dist/theme/tokens.d.ts +18 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +33 -0
- package/dist/theme/tokens.js.map +1 -1
- package/dist/theme/viewmodel.d.ts +24 -0
- package/dist/theme/viewmodel.d.ts.map +1 -1
- package/dist/theme/viewmodel.js +75 -6
- package/dist/theme/viewmodel.js.map +1 -1
- package/dist/types.d.ts +320 -56
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -2
- package/dist/kernel/apps.d.ts +0 -43
- package/dist/kernel/apps.d.ts.map +0 -1
- package/dist/kernel/apps.js +0 -234
- package/dist/kernel/apps.js.map +0 -1
package/dist/data/sqlite.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// SQLite adapter on node:sqlite. Zero dependencies - this ships inside Node.
|
|
2
2
|
import { DatabaseSync } from 'node:sqlite';
|
|
3
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
4
|
import { assertAdapter } from './adapter.js';
|
|
4
5
|
import { dateBucket } from './time.js';
|
|
6
|
+
import { canonicalDecimal, DECIMAL_MAX_CHARS, decimalText } from './changeset.js';
|
|
5
7
|
// Binding rules belong to the adapter, not to the layers above it: SQLite has no
|
|
6
8
|
// boolean and no JSON, Postgres has both. Normalising here means every call path —
|
|
7
9
|
// query builder, changeset, raw run — is covered once.
|
|
@@ -26,80 +28,376 @@ const SQL = {
|
|
|
26
28
|
datetime: 'TEXT',
|
|
27
29
|
ref: 'TEXT',
|
|
28
30
|
};
|
|
31
|
+
const PLAIN_DECIMAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/;
|
|
32
|
+
/**
|
|
33
|
+
* Exact scientific parts without ever passing through a binary float.
|
|
34
|
+
*
|
|
35
|
+
* `exponent` is the number of integer digits in the normalized value and
|
|
36
|
+
* `digits` has neither leading nor trailing zeroes. Together they let SQLite
|
|
37
|
+
* compare arbitrarily large or finely scaled decimal text exactly while the
|
|
38
|
+
* selected column itself remains TEXT and therefore decodes byte for byte.
|
|
39
|
+
*/
|
|
40
|
+
const decimalParts = (value) => {
|
|
41
|
+
if (value == null)
|
|
42
|
+
return null;
|
|
43
|
+
if (typeof value !== 'string' && typeof value !== 'number')
|
|
44
|
+
return null;
|
|
45
|
+
let held = typeof value === 'number' ? decimalText(value) : String(value).trim();
|
|
46
|
+
if (held.length > DECIMAL_MAX_CHARS)
|
|
47
|
+
return null;
|
|
48
|
+
if (!PLAIN_DECIMAL.test(held))
|
|
49
|
+
return null;
|
|
50
|
+
const negative = held.startsWith('-');
|
|
51
|
+
held = held.replace(/^[+-]/, '');
|
|
52
|
+
const [rawWhole = '', fraction = ''] = held.split('.');
|
|
53
|
+
const whole = rawWhole || '0';
|
|
54
|
+
const combined = whole + fraction;
|
|
55
|
+
const first = combined.search(/[1-9]/);
|
|
56
|
+
if (first < 0)
|
|
57
|
+
return { sign: 0, exponent: 0, digits: '' };
|
|
58
|
+
let last = combined.length - 1;
|
|
59
|
+
while (combined[last] === '0')
|
|
60
|
+
last--;
|
|
61
|
+
return {
|
|
62
|
+
sign: negative ? -1 : 1,
|
|
63
|
+
exponent: whole.length - first,
|
|
64
|
+
digits: combined.slice(first, last + 1),
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
const compareDecimals = (left, right) => {
|
|
68
|
+
const a = decimalParts(left);
|
|
69
|
+
const b = decimalParts(right);
|
|
70
|
+
if (!a || !b)
|
|
71
|
+
return null;
|
|
72
|
+
if (a.sign !== b.sign)
|
|
73
|
+
return a.sign < b.sign ? -1 : 1;
|
|
74
|
+
if (a.sign === 0)
|
|
75
|
+
return 0;
|
|
76
|
+
let magnitude = 0;
|
|
77
|
+
if (a.exponent !== b.exponent)
|
|
78
|
+
magnitude = a.exponent < b.exponent ? -1 : 1;
|
|
79
|
+
else if (a.digits !== b.digits)
|
|
80
|
+
magnitude = a.digits < b.digits ? -1 : 1;
|
|
81
|
+
return a.sign === -1 ? -magnitude : magnitude;
|
|
82
|
+
};
|
|
83
|
+
/** One canonical spelling for SQL equality/grouping without losing precision. */
|
|
84
|
+
const decimalKey = canonicalDecimal;
|
|
85
|
+
const scaledDecimal = (value) => {
|
|
86
|
+
const parts = decimalParts(value);
|
|
87
|
+
if (!parts)
|
|
88
|
+
return null;
|
|
89
|
+
if (parts.sign === 0)
|
|
90
|
+
return { coefficient: 0n, scale: 0 };
|
|
91
|
+
const coefficient = BigInt(parts.digits) * BigInt(parts.sign);
|
|
92
|
+
return { coefficient, scale: parts.digits.length - parts.exponent };
|
|
93
|
+
};
|
|
94
|
+
const renderScaledDecimal = ({ coefficient, scale }) => {
|
|
95
|
+
if (coefficient === 0n)
|
|
96
|
+
return '0';
|
|
97
|
+
while (coefficient % 10n === 0n) {
|
|
98
|
+
coefficient /= 10n;
|
|
99
|
+
scale--;
|
|
100
|
+
}
|
|
101
|
+
const sign = coefficient < 0n ? '-' : '';
|
|
102
|
+
const digits = (coefficient < 0n ? -coefficient : coefficient).toString();
|
|
103
|
+
const exponent = digits.length - scale;
|
|
104
|
+
if (exponent <= 0)
|
|
105
|
+
return `${sign}0.${'0'.repeat(-exponent)}${digits}`;
|
|
106
|
+
if (exponent >= digits.length)
|
|
107
|
+
return `${sign}${digits}${'0'.repeat(exponent - digits.length)}`;
|
|
108
|
+
return `${sign}${digits.slice(0, exponent)}.${digits.slice(exponent)}`;
|
|
109
|
+
};
|
|
110
|
+
const addDecimals = (left, right) => {
|
|
111
|
+
const a = scaledDecimal(left);
|
|
112
|
+
const b = scaledDecimal(right);
|
|
113
|
+
if (!a || !b)
|
|
114
|
+
return null;
|
|
115
|
+
const scale = Math.max(a.scale, b.scale);
|
|
116
|
+
const coefficient = a.coefficient * 10n ** BigInt(scale - a.scale) + b.coefficient * 10n ** BigInt(scale - b.scale);
|
|
117
|
+
return renderScaledDecimal({ coefficient, scale });
|
|
118
|
+
};
|
|
119
|
+
/** Exact division with PostgreSQL NUMERIC's tie-breaking rule. */
|
|
120
|
+
const averageDecimal = (held, count, requestedScale) => {
|
|
121
|
+
const divisor = count;
|
|
122
|
+
const scale = Number(requestedScale);
|
|
123
|
+
if (!Number.isSafeInteger(scale) || scale < 0 || scale > DECIMAL_MAX_CHARS)
|
|
124
|
+
throw new Error(`decimal average scale must be an integer from 0 to ${DECIMAL_MAX_CHARS}`);
|
|
125
|
+
if (divisor === 0n)
|
|
126
|
+
return null;
|
|
127
|
+
if (divisor < 0n)
|
|
128
|
+
throw new Error('decimal average count must not be negative');
|
|
129
|
+
let numerator = held.coefficient;
|
|
130
|
+
let denominator = divisor;
|
|
131
|
+
const shift = scale - held.scale;
|
|
132
|
+
if (shift >= 0)
|
|
133
|
+
numerator *= 10n ** BigInt(shift);
|
|
134
|
+
else
|
|
135
|
+
denominator *= 10n ** BigInt(-shift);
|
|
136
|
+
let rounded = numerator / denominator;
|
|
137
|
+
const remainder = numerator % denominator;
|
|
138
|
+
const magnitude = remainder < 0n ? -remainder : remainder;
|
|
139
|
+
if (magnitude * 2n >= denominator)
|
|
140
|
+
rounded += numerator < 0n ? -1n : 1n;
|
|
141
|
+
const result = renderScaledDecimal({ coefficient: rounded, scale });
|
|
142
|
+
if (result.length > DECIMAL_MAX_CHARS)
|
|
143
|
+
throw new Error('decimal average exceeds the decimal character limit');
|
|
144
|
+
return result;
|
|
145
|
+
};
|
|
146
|
+
const decodeDecimalAverageState = (value) => {
|
|
147
|
+
const held = String(value ?? '');
|
|
148
|
+
if (!held)
|
|
149
|
+
return { coefficient: 0n, sumScale: 0, count: 0n, requestedScale: null };
|
|
150
|
+
const first = held.indexOf('|');
|
|
151
|
+
const second = held.indexOf('|', first + 1);
|
|
152
|
+
const third = held.indexOf('|', second + 1);
|
|
153
|
+
if (first < 0 || second < 0 || third < 0)
|
|
154
|
+
throw new Error('invalid decimal average state');
|
|
155
|
+
return {
|
|
156
|
+
requestedScale: Number(held.slice(0, first)),
|
|
157
|
+
count: BigInt(held.slice(first + 1, second)),
|
|
158
|
+
sumScale: Number(held.slice(second + 1, third)),
|
|
159
|
+
coefficient: BigInt(held.slice(third + 1)),
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
const encodeDecimalAverageState = (state) => `${String(state.requestedScale)}|${state.count}|${state.sumScale}|${state.coefficient}`;
|
|
29
163
|
export function sqliteAdapter(path = ':memory:') {
|
|
30
164
|
let db = null;
|
|
31
|
-
|
|
165
|
+
// node:sqlite has one synchronous connection. Promise-shaped adapter methods can
|
|
166
|
+
// still interleave while a transaction body awaits, so every root operation joins
|
|
167
|
+
// this queue. The adapter handed to tx() bypasses it on purpose: those calls are
|
|
168
|
+
// already inside the queue slot owned by that transaction.
|
|
169
|
+
let operationTail = Promise.resolve();
|
|
170
|
+
const transactionContext = new AsyncLocalStorage();
|
|
32
171
|
const need = () => {
|
|
33
172
|
if (!db)
|
|
34
173
|
throw new Error('adapter is not open()');
|
|
35
174
|
return db;
|
|
36
175
|
};
|
|
176
|
+
const serialize = (work) => {
|
|
177
|
+
// Calling the root adapter from its own transaction callback would otherwise
|
|
178
|
+
// enqueue work behind the callback that is currently awaiting it. Refuse the
|
|
179
|
+
// misuse immediately and point callers at the scoped adapter/ctx passed to the
|
|
180
|
+
// callback; outside work still queues normally behind the transaction.
|
|
181
|
+
if (transactionContext.getStore()?.active)
|
|
182
|
+
return Promise.reject(new Error('root SQLite adapter used inside its transaction; use the transaction-scoped adapter'));
|
|
183
|
+
const result = operationTail.then(work);
|
|
184
|
+
operationTail = result.then(() => undefined, () => undefined);
|
|
185
|
+
return result;
|
|
186
|
+
};
|
|
187
|
+
const quoteIdent = (name) => `"${String(name).replace(/"/g, '""')}"`;
|
|
188
|
+
const columnSql = (column) => SQL[column.base] ?? 'TEXT';
|
|
189
|
+
const execDirect = (sql) => need().exec(sql);
|
|
190
|
+
const allDirect = (sql, params = []) => need()
|
|
191
|
+
.prepare(sql)
|
|
192
|
+
.all(...params.map(bind));
|
|
193
|
+
const runDirect = (sql, params = []) => {
|
|
194
|
+
const result = need()
|
|
195
|
+
.prepare(sql)
|
|
196
|
+
.run(...params.map(bind));
|
|
197
|
+
return { changes: Number(result.changes) };
|
|
198
|
+
};
|
|
199
|
+
const introspectDirect = () => {
|
|
200
|
+
const tables = {};
|
|
201
|
+
const names = need()
|
|
202
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`)
|
|
203
|
+
.all();
|
|
204
|
+
for (const table of names) {
|
|
205
|
+
tables[table.name] = {};
|
|
206
|
+
const columns = need()
|
|
207
|
+
.prepare(`PRAGMA table_info(${quoteIdent(table.name)})`)
|
|
208
|
+
.all();
|
|
209
|
+
for (const column of columns)
|
|
210
|
+
tables[table.name][column.name] = column.type;
|
|
211
|
+
}
|
|
212
|
+
return tables;
|
|
213
|
+
};
|
|
214
|
+
const scopedTransactionAdapter = () => {
|
|
215
|
+
let active = true;
|
|
216
|
+
const within = (work) => {
|
|
217
|
+
if (!active)
|
|
218
|
+
throw new Error('transaction-scoped adapter used after its transaction ended');
|
|
219
|
+
return work();
|
|
220
|
+
};
|
|
221
|
+
return {
|
|
222
|
+
adapter: {
|
|
223
|
+
name: 'sqlite',
|
|
224
|
+
transaction: true,
|
|
225
|
+
async open() {
|
|
226
|
+
throw new Error('a transaction-scoped adapter is already open');
|
|
227
|
+
},
|
|
228
|
+
async close() {
|
|
229
|
+
throw new Error('a transaction-scoped adapter cannot close its root connection');
|
|
230
|
+
},
|
|
231
|
+
async exec(sql) {
|
|
232
|
+
within(() => execDirect(sql));
|
|
233
|
+
},
|
|
234
|
+
async all(sql, params = []) {
|
|
235
|
+
return within(() => allDirect(sql, params));
|
|
236
|
+
},
|
|
237
|
+
async run(sql, params = []) {
|
|
238
|
+
return within(() => runDirect(sql, params));
|
|
239
|
+
},
|
|
240
|
+
async tx() {
|
|
241
|
+
throw new Error('nested transactions are not supported');
|
|
242
|
+
},
|
|
243
|
+
quoteIdent,
|
|
244
|
+
columnSql,
|
|
245
|
+
async introspect() {
|
|
246
|
+
return within(introspectDirect);
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
deactivate: () => {
|
|
250
|
+
active = false;
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
};
|
|
37
254
|
const a = {
|
|
38
255
|
name: 'sqlite',
|
|
39
|
-
get transaction() {
|
|
40
|
-
return inTransaction;
|
|
41
|
-
},
|
|
42
256
|
async open() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
257
|
+
await serialize(() => {
|
|
258
|
+
db = new DatabaseSync(path);
|
|
259
|
+
db.function('ket_date_bucket', (value, interval, timezone) => dateBucket(value, String(interval), String(timezone)));
|
|
260
|
+
db.function('ket_decimal_cmp', compareDecimals);
|
|
261
|
+
db.function('ket_decimal_key', decimalKey);
|
|
262
|
+
db.function('ket_decimal_sign', (value) => decimalParts(value)?.sign ?? null);
|
|
263
|
+
db.function('ket_decimal_exponent', (value) => decimalParts(value)?.exponent ?? null);
|
|
264
|
+
db.function('ket_decimal_digits', (value) => decimalParts(value)?.digits ?? null);
|
|
265
|
+
db.aggregate('ket_decimal_avg', {
|
|
266
|
+
start: '',
|
|
267
|
+
step: (encoded, value, scale) => {
|
|
268
|
+
const state = decodeDecimalAverageState(encoded);
|
|
269
|
+
const requestedScale = Number(scale);
|
|
270
|
+
if (state.requestedScale !== null && state.requestedScale !== requestedScale)
|
|
271
|
+
throw new Error('decimal average scale changed within one aggregate');
|
|
272
|
+
if (value == null)
|
|
273
|
+
return encodeDecimalAverageState({ ...state, requestedScale });
|
|
274
|
+
const next = scaledDecimal(value);
|
|
275
|
+
if (!next)
|
|
276
|
+
throw new Error('invalid or over-budget decimal value');
|
|
277
|
+
if (state.count === 0n)
|
|
278
|
+
return encodeDecimalAverageState({
|
|
279
|
+
coefficient: next.coefficient,
|
|
280
|
+
sumScale: next.scale,
|
|
281
|
+
count: 1n,
|
|
282
|
+
requestedScale,
|
|
283
|
+
});
|
|
284
|
+
const sumScale = Math.max(state.sumScale, next.scale);
|
|
285
|
+
const coefficient = state.coefficient * 10n ** BigInt(sumScale - state.sumScale) +
|
|
286
|
+
next.coefficient * 10n ** BigInt(sumScale - next.scale);
|
|
287
|
+
return encodeDecimalAverageState({
|
|
288
|
+
coefficient,
|
|
289
|
+
sumScale,
|
|
290
|
+
count: state.count + 1n,
|
|
291
|
+
requestedScale,
|
|
292
|
+
});
|
|
293
|
+
},
|
|
294
|
+
result: (encoded) => {
|
|
295
|
+
const state = decodeDecimalAverageState(encoded);
|
|
296
|
+
return state.count === 0n || state.requestedScale === null
|
|
297
|
+
? null
|
|
298
|
+
: averageDecimal({ coefficient: state.coefficient, scale: state.sumScale }, state.count, state.requestedScale);
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
db.aggregate('ket_decimal_sum', {
|
|
302
|
+
start: '',
|
|
303
|
+
step: (sum, value) => {
|
|
304
|
+
if (value == null)
|
|
305
|
+
return String(sum);
|
|
306
|
+
const next = decimalKey(value);
|
|
307
|
+
if (next == null)
|
|
308
|
+
throw new Error('invalid or over-budget decimal value');
|
|
309
|
+
if (sum === '')
|
|
310
|
+
return next;
|
|
311
|
+
const added = addDecimals(sum, next);
|
|
312
|
+
if (added == null)
|
|
313
|
+
throw new Error('invalid decimal aggregate state');
|
|
314
|
+
return added;
|
|
315
|
+
},
|
|
316
|
+
result: (sum) => (sum === '' ? null : String(sum)),
|
|
317
|
+
});
|
|
318
|
+
db.aggregate('ket_decimal_min', {
|
|
319
|
+
start: '',
|
|
320
|
+
step: (minimum, value) => {
|
|
321
|
+
if (value == null)
|
|
322
|
+
return String(minimum);
|
|
323
|
+
const next = decimalKey(value);
|
|
324
|
+
if (next == null)
|
|
325
|
+
throw new Error('invalid or over-budget decimal value');
|
|
326
|
+
if (minimum === '')
|
|
327
|
+
return next;
|
|
328
|
+
return (compareDecimals(next, minimum) ?? 0) < 0 ? next : String(minimum);
|
|
329
|
+
},
|
|
330
|
+
result: (minimum) => (minimum === '' ? null : String(minimum)),
|
|
331
|
+
});
|
|
332
|
+
db.aggregate('ket_decimal_max', {
|
|
333
|
+
start: '',
|
|
334
|
+
step: (maximum, value) => {
|
|
335
|
+
if (value == null)
|
|
336
|
+
return String(maximum);
|
|
337
|
+
const next = decimalKey(value);
|
|
338
|
+
if (next == null)
|
|
339
|
+
throw new Error('invalid or over-budget decimal value');
|
|
340
|
+
if (maximum === '')
|
|
341
|
+
return next;
|
|
342
|
+
return (compareDecimals(next, maximum) ?? 0) > 0 ? next : String(maximum);
|
|
343
|
+
},
|
|
344
|
+
result: (maximum) => (maximum === '' ? null : String(maximum)),
|
|
345
|
+
});
|
|
346
|
+
db.exec('PRAGMA journal_mode = WAL');
|
|
347
|
+
db.exec('PRAGMA foreign_keys = ON');
|
|
348
|
+
});
|
|
47
349
|
},
|
|
48
350
|
async close() {
|
|
49
|
-
|
|
50
|
-
|
|
351
|
+
await serialize(() => {
|
|
352
|
+
db?.close();
|
|
353
|
+
db = null;
|
|
354
|
+
});
|
|
51
355
|
},
|
|
52
356
|
async exec(sql) {
|
|
53
|
-
|
|
357
|
+
await serialize(() => execDirect(sql));
|
|
54
358
|
},
|
|
55
359
|
async all(sql, params = []) {
|
|
56
|
-
return
|
|
57
|
-
.prepare(sql)
|
|
58
|
-
.all(...params.map(bind));
|
|
360
|
+
return serialize(() => allDirect(sql, params));
|
|
59
361
|
},
|
|
60
362
|
async run(sql, params = []) {
|
|
61
|
-
|
|
62
|
-
.prepare(sql)
|
|
63
|
-
.run(...params.map(bind));
|
|
64
|
-
return { changes: Number(r.changes) };
|
|
363
|
+
return serialize(() => runDirect(sql, params));
|
|
65
364
|
},
|
|
66
365
|
async tx(fn) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
366
|
+
return serialize(async () => {
|
|
367
|
+
const connection = need();
|
|
368
|
+
let began = false;
|
|
369
|
+
let deactivate = () => { };
|
|
370
|
+
const marker = { active: true };
|
|
371
|
+
try {
|
|
372
|
+
connection.exec('BEGIN');
|
|
373
|
+
began = true;
|
|
374
|
+
const scoped = scopedTransactionAdapter();
|
|
375
|
+
deactivate = scoped.deactivate;
|
|
376
|
+
const result = await transactionContext.run(marker, () => fn(scoped.adapter));
|
|
377
|
+
connection.exec('COMMIT');
|
|
378
|
+
return result;
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
if (began) {
|
|
382
|
+
try {
|
|
383
|
+
connection.exec('ROLLBACK');
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
// Preserve the failure from the body or COMMIT; it is the actionable one.
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
throw error;
|
|
390
|
+
}
|
|
391
|
+
finally {
|
|
392
|
+
marker.active = false;
|
|
393
|
+
deactivate();
|
|
394
|
+
}
|
|
395
|
+
});
|
|
88
396
|
},
|
|
397
|
+
quoteIdent,
|
|
398
|
+
columnSql,
|
|
89
399
|
async introspect() {
|
|
90
|
-
|
|
91
|
-
const names = need()
|
|
92
|
-
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`)
|
|
93
|
-
.all();
|
|
94
|
-
for (const t of names) {
|
|
95
|
-
tables[t.name] = {};
|
|
96
|
-
const cols = need()
|
|
97
|
-
.prepare(`PRAGMA table_info(${a.quoteIdent(t.name)})`)
|
|
98
|
-
.all();
|
|
99
|
-
for (const c of cols)
|
|
100
|
-
tables[t.name][c.name] = c.type;
|
|
101
|
-
}
|
|
102
|
-
return tables;
|
|
400
|
+
return serialize(introspectDirect);
|
|
103
401
|
},
|
|
104
402
|
};
|
|
105
403
|
return assertAdapter(a);
|
package/dist/data/sqlite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/sqlite.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/data/time.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
export type GroupInterval = 'day' | 'week' | 'month' | 'quarter' | 'year';
|
|
2
|
+
/**
|
|
3
|
+
* The closed set of bucketing intervals.
|
|
4
|
+
*
|
|
5
|
+
* `GroupInterval` is only a compile-time type: a value that arrives as JSON — a
|
|
6
|
+
* `listState.groupBy[].interval` an agent or a form sends — has never been checked
|
|
7
|
+
* against it by the time it reaches the query builder. The Postgres dialect
|
|
8
|
+
* interpolates the interval into `DATE_TRUNC('<interval>', …)` (SQLite binds it),
|
|
9
|
+
* so an unchecked string there is SQL, not data. This is the guard that keeps the
|
|
10
|
+
* type's promise at runtime, at the one boundary where being wrong is an injection.
|
|
11
|
+
*/
|
|
12
|
+
export declare const GROUP_INTERVALS: readonly GroupInterval[];
|
|
13
|
+
export declare const isGroupInterval: (value: unknown) => value is GroupInterval;
|
|
14
|
+
export declare const assertGroupInterval: (value: unknown) => GroupInterval;
|
|
2
15
|
export declare const isTimezone: (value: string) => boolean;
|
|
3
16
|
export declare const assertTimezone: (value: string) => string;
|
|
4
17
|
/** Stable local-calendar bucket key shared by SQLite and application tests. */
|
package/dist/data/time.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAEzE;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAAgD,CAAA;AAEpG,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,aAC2B,CAAA;AAErF,eAAO,MAAM,mBAAmB,UAAW,OAAO,KAAG,aAQpD,CAAA;AAMD,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,OAS1C,CAAA;AAED,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,MAI9C,CAAA;AA8CD,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,SAAQ,GAAG,MAAM,GAAG,IAAI,CAWnG;AAeD,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,CA4B1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/E"}
|
package/dist/data/time.js
CHANGED
|
@@ -1,7 +1,35 @@
|
|
|
1
1
|
import { KetError } from '../kernel/errors.js';
|
|
2
|
+
import { dateTimeFormatter } from '../kernel/i18n.js';
|
|
3
|
+
/**
|
|
4
|
+
* The closed set of bucketing intervals.
|
|
5
|
+
*
|
|
6
|
+
* `GroupInterval` is only a compile-time type: a value that arrives as JSON — a
|
|
7
|
+
* `listState.groupBy[].interval` an agent or a form sends — has never been checked
|
|
8
|
+
* against it by the time it reaches the query builder. The Postgres dialect
|
|
9
|
+
* interpolates the interval into `DATE_TRUNC('<interval>', …)` (SQLite binds it),
|
|
10
|
+
* so an unchecked string there is SQL, not data. This is the guard that keeps the
|
|
11
|
+
* type's promise at runtime, at the one boundary where being wrong is an injection.
|
|
12
|
+
*/
|
|
13
|
+
export const GROUP_INTERVALS = ['day', 'week', 'month', 'quarter', 'year'];
|
|
14
|
+
export const isGroupInterval = (value) => typeof value === 'string' && GROUP_INTERVALS.includes(value);
|
|
15
|
+
export const assertGroupInterval = (value) => {
|
|
16
|
+
if (!isGroupInterval(value))
|
|
17
|
+
throw new KetError({
|
|
18
|
+
code: 'E_GROUP_INTERVAL',
|
|
19
|
+
message: `invalid group interval ${JSON.stringify(value)}`,
|
|
20
|
+
hint: `interval must be one of ${GROUP_INTERVALS.join(', ')}`,
|
|
21
|
+
});
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
const validTimezones = new Set();
|
|
25
|
+
const datePartFormatters = new Map();
|
|
26
|
+
const localPartFormatters = new Map();
|
|
2
27
|
export const isTimezone = (value) => {
|
|
28
|
+
if (validTimezones.has(value))
|
|
29
|
+
return true;
|
|
3
30
|
try {
|
|
4
|
-
|
|
31
|
+
dateTimeFormatter('en', { timeZone: value });
|
|
32
|
+
validTimezones.add(value);
|
|
5
33
|
return true;
|
|
6
34
|
}
|
|
7
35
|
catch {
|
|
@@ -13,6 +41,36 @@ export const assertTimezone = (value) => {
|
|
|
13
41
|
throw new KetError({ code: 'E_TIMEZONE', message: `invalid IANA timezone "${value}"` });
|
|
14
42
|
return value;
|
|
15
43
|
};
|
|
44
|
+
const datePartFormatter = (timezone) => {
|
|
45
|
+
const held = datePartFormatters.get(timezone);
|
|
46
|
+
if (held)
|
|
47
|
+
return held;
|
|
48
|
+
const formatter = dateTimeFormatter('en-CA', {
|
|
49
|
+
timeZone: assertTimezone(timezone),
|
|
50
|
+
year: 'numeric',
|
|
51
|
+
month: '2-digit',
|
|
52
|
+
day: '2-digit',
|
|
53
|
+
});
|
|
54
|
+
datePartFormatters.set(timezone, formatter);
|
|
55
|
+
return formatter;
|
|
56
|
+
};
|
|
57
|
+
const localPartFormatter = (timezone) => {
|
|
58
|
+
const held = localPartFormatters.get(timezone);
|
|
59
|
+
if (held)
|
|
60
|
+
return held;
|
|
61
|
+
const formatter = dateTimeFormatter('en-CA', {
|
|
62
|
+
timeZone: assertTimezone(timezone),
|
|
63
|
+
year: 'numeric',
|
|
64
|
+
month: '2-digit',
|
|
65
|
+
day: '2-digit',
|
|
66
|
+
hour: '2-digit',
|
|
67
|
+
minute: '2-digit',
|
|
68
|
+
second: '2-digit',
|
|
69
|
+
hourCycle: 'h23',
|
|
70
|
+
});
|
|
71
|
+
localPartFormatters.set(timezone, formatter);
|
|
72
|
+
return formatter;
|
|
73
|
+
};
|
|
16
74
|
const partsIn = (value, timezone) => {
|
|
17
75
|
if (value == null)
|
|
18
76
|
return null;
|
|
@@ -22,12 +80,7 @@ const partsIn = (value, timezone) => {
|
|
|
22
80
|
const date = new Date(String(value));
|
|
23
81
|
if (Number.isNaN(date.getTime()))
|
|
24
82
|
return null;
|
|
25
|
-
const parts =
|
|
26
|
-
timeZone: assertTimezone(timezone),
|
|
27
|
-
year: 'numeric',
|
|
28
|
-
month: '2-digit',
|
|
29
|
-
day: '2-digit',
|
|
30
|
-
}).formatToParts(date);
|
|
83
|
+
const parts = datePartFormatter(timezone).formatToParts(date);
|
|
31
84
|
const get = (type) => Number(parts.find((p) => p.type === type)?.value);
|
|
32
85
|
return { year: get('year'), month: get('month'), day: get('day') };
|
|
33
86
|
};
|
|
@@ -51,16 +104,7 @@ export function dateBucket(value, interval, timezone = 'UTC') {
|
|
|
51
104
|
return ymd(at.getUTCFullYear(), at.getUTCMonth() + 1, at.getUTCDate());
|
|
52
105
|
}
|
|
53
106
|
const localPartsAt = (instant, timezone) => {
|
|
54
|
-
const parts = new
|
|
55
|
-
timeZone: assertTimezone(timezone),
|
|
56
|
-
year: 'numeric',
|
|
57
|
-
month: '2-digit',
|
|
58
|
-
day: '2-digit',
|
|
59
|
-
hour: '2-digit',
|
|
60
|
-
minute: '2-digit',
|
|
61
|
-
second: '2-digit',
|
|
62
|
-
hourCycle: 'h23',
|
|
63
|
-
}).formatToParts(new Date(instant));
|
|
107
|
+
const parts = localPartFormatter(timezone).formatToParts(new Date(instant));
|
|
64
108
|
const get = (type) => Number(parts.find((part) => part.type === type)?.value);
|
|
65
109
|
return {
|
|
66
110
|
year: get('year'),
|
package/dist/data/time.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"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"}
|