Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: gajus/slonik
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v33.0.2
Choose a base ref
...
head repository: gajus/slonik
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v33.0.3
Choose a head ref
  • 1 commit
  • 2 files changed
  • 1 contributor

Commits on Nov 13, 2022

  1. Copy the full SHA
    235c365 View commit details
Showing with 54 additions and 12 deletions.
  1. +30 −12 src/sqlFragmentFactories/createIntervalSqlFragment.ts
  2. +24 −0 test/slonik/templateTags/sql/interval.ts
42 changes: 30 additions & 12 deletions src/sqlFragmentFactories/createIntervalSqlFragment.ts
Original file line number Diff line number Diff line change
@@ -9,15 +9,17 @@ import {
type SqlFragment,
} from '../types';

const IntervalInput = z.object({
days: z.number().optional(),
hours: z.number().optional(),
minutes: z.number().optional(),
months: z.number().optional(),
seconds: z.number().optional(),
weeks: z.number().optional(),
years: z.number().optional(),
}).strict();
const IntervalInput = z
.object({
days: z.number().optional(),
hours: z.number().optional(),
minutes: z.number().optional(),
months: z.number().optional(),
seconds: z.number().optional(),
weeks: z.number().optional(),
years: z.number().optional(),
})
.strict();

const intervalFragments = [
'years',
@@ -28,13 +30,23 @@ const intervalFragments = [
'seconds',
];

export const createIntervalSqlFragment = (token: IntervalSqlToken, greatestParameterPosition: number): SqlFragment => {
const tokenMap = {
minutes: 'mins',
seconds: 'secs',
};

export const createIntervalSqlFragment = (
token: IntervalSqlToken,
greatestParameterPosition: number,
): SqlFragment => {
let intervalInput;

try {
intervalInput = IntervalInput.parse(token.interval);
} catch {
throw new InvalidInputError('Interval input must not contain unknown properties.');
throw new InvalidInputError(
'Interval input must not contain unknown properties.',
);
}

const values: number[] = [];
@@ -47,7 +59,13 @@ export const createIntervalSqlFragment = (token: IntervalSqlToken, greatestParam
if (value !== undefined) {
values.push(value);

intervalTokens.push(intervalFragment + ' => $' + String(greatestParameterPosition + values.length));
const mappedToken = tokenMap[intervalFragment] ?? intervalFragment;

intervalTokens.push(
mappedToken +
' => $' +
String(greatestParameterPosition + values.length),
);
}
}

24 changes: 24 additions & 0 deletions test/slonik/templateTags/sql/interval.ts
Original file line number Diff line number Diff line change
@@ -18,6 +18,30 @@ test('creates an empty make_interval invocation', (t) => {
});
});

test('creates an interval', (t) => {
const query = sql.fragment`SELECT ${sql.interval({
days: 3,
hours: 4,
minutes: 5,
months: 2,
seconds: 6,
years: 1,
})}`;

t.deepEqual(query, {
sql: 'SELECT make_interval(years => $1, months => $2, days => $3, hours => $4, mins => $5, secs => $6)',
type: FragmentToken,
values: [
1,
2,
3,
4,
5,
6,
],
});
});

test('throws if contains unknown properties', (t) => {
const error = t.throws(() => {
sql.fragment`SELECT ${sql.interval({