@vrplatform/kysely 1.3.30 → 1.3.34
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/build/.data.tar +0 -0
- package/build/main/index.d.ts +1 -1
- package/build/main/index.js.map +1 -1
- package/build/main/local/generate.js +1 -1
- package/build/main/local/generate.js.map +1 -1
- package/build/main/local/index.d.ts +1 -2
- package/build/main/local/index.js +0 -53
- package/build/main/local/index.js.map +1 -1
- package/build/main/local/prune-pulled-schema.d.ts +20 -0
- package/build/main/local/prune-pulled-schema.js +166 -0
- package/build/main/local/prune-pulled-schema.js.map +1 -0
- package/build/main/local.d.ts +3 -0
- package/build/main/local.js +158 -0
- package/build/main/local.js.map +1 -0
- package/build/main/query/listing/status.js +4 -3
- package/build/main/query/listing/status.js.map +1 -1
- package/build/main/tsconfig.main.tsbuildinfo +1 -1
- package/build/main/v0.generated.d.ts +1996 -0
- package/build/main/v0.generated.js +7 -0
- package/build/main/v0.generated.js.map +1 -0
- package/build/main/v1.generated.d.ts +150 -66
- package/build/main/v1.generated.js.map +1 -1
- package/build/module/index.d.ts +1 -1
- package/build/module/index.js.map +1 -1
- package/build/module/local/generate.js +1 -1
- package/build/module/local/generate.js.map +1 -1
- package/build/module/local/index.d.ts +1 -2
- package/build/module/local/index.js +0 -20
- package/build/module/local/index.js.map +1 -1
- package/build/module/local/prune-pulled-schema.d.ts +20 -0
- package/build/module/local/prune-pulled-schema.js +157 -0
- package/build/module/local/prune-pulled-schema.js.map +1 -0
- package/build/module/local.d.ts +3 -0
- package/build/module/local.js +119 -0
- package/build/module/local.js.map +1 -0
- package/build/module/query/listing/status.js +4 -3
- package/build/module/query/listing/status.js.map +1 -1
- package/build/module/tsconfig.esm.tsbuildinfo +1 -1
- package/build/module/v0.generated.d.ts +1996 -0
- package/build/module/v0.generated.js +6 -0
- package/build/module/v0.generated.js.map +1 -0
- package/build/module/v1.generated.d.ts +150 -66
- package/build/module/v1.generated.js.map +1 -1
- package/package.json +32 -15
- package/src/index.ts +167 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const START_MARKER = '-- VRP legacy-column-prune:start';
|
|
4
|
+
const END_MARKER = '-- VRP legacy-column-prune:end';
|
|
5
|
+
const hasuraAuditTriggerPattern = /^CREATE TRIGGER "(notify_hasura_audit_[^"]+)" [\s\S]*? ON ([^\s;]+) FOR EACH ROW EXECUTE FUNCTION hdb_catalog\."notify_hasura_audit_[^"]+"\(\);$/gm;
|
|
6
|
+
/**
|
|
7
|
+
* Active removals currently validated by runtime + type usage.
|
|
8
|
+
* Add new entries here incrementally to surface compile/runtime callers.
|
|
9
|
+
*/
|
|
10
|
+
export const activeLegacyColumnPrunes = [
|
|
11
|
+
{
|
|
12
|
+
issue: 'VRI-45',
|
|
13
|
+
table: 'public.app',
|
|
14
|
+
column: 'fly_app',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
issue: 'VRI-45',
|
|
18
|
+
table: 'public.app',
|
|
19
|
+
column: 'default_machine_size',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
issue: 'VRI-45',
|
|
23
|
+
table: 'public.app',
|
|
24
|
+
column: 'endpoint',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
issue: 'VRI-45',
|
|
28
|
+
table: 'public.app',
|
|
29
|
+
column: 'uid',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
issue: 'VRI-45',
|
|
33
|
+
table: 'public.app',
|
|
34
|
+
column: 'plugin_data',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
issue: 'VRI-45',
|
|
38
|
+
table: 'public.app',
|
|
39
|
+
column: 'config',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
issue: 'VRI-45',
|
|
43
|
+
table: 'public.app',
|
|
44
|
+
column: 'flows',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
issue: 'PRO-12855',
|
|
48
|
+
table: 'public.owner_statement',
|
|
49
|
+
column: 'cent_accounting_balance_start',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
issue: 'PRO-12855',
|
|
53
|
+
table: 'public.owner_statement',
|
|
54
|
+
column: 'cent_accounting_balance_end',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
issue: 'PRO-12855',
|
|
58
|
+
table: 'accounting.contact',
|
|
59
|
+
column: 'pms_status',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
issue: 'PRO-12855',
|
|
63
|
+
table: 'public.owner',
|
|
64
|
+
column: 'pms_status',
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
export function extractHasuraAuditTriggers(sql) {
|
|
68
|
+
const unique = new Map();
|
|
69
|
+
for (const match of sql.matchAll(hasuraAuditTriggerPattern)) {
|
|
70
|
+
const name = match[1];
|
|
71
|
+
const table = match[2];
|
|
72
|
+
const key = `${name}::${table}`;
|
|
73
|
+
if (!unique.has(key)) {
|
|
74
|
+
unique.set(key, { name, table });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return [...unique.values()];
|
|
78
|
+
}
|
|
79
|
+
export function buildPruneBlock(columns, hasuraAuditTriggers = []) {
|
|
80
|
+
const columnStatements = columns.map((item) => `ALTER TABLE ${item.table} DROP COLUMN IF EXISTS ${item.column}; -- ${item.issue}`);
|
|
81
|
+
const triggerStatements = hasuraAuditTriggers.map((trigger) => `DROP TRIGGER IF EXISTS "${trigger.name}" ON ${trigger.table}; -- hasura-audit`);
|
|
82
|
+
return [
|
|
83
|
+
START_MARKER,
|
|
84
|
+
'-- Managed by src/local/prune-pulled-schema.ts',
|
|
85
|
+
...columnStatements,
|
|
86
|
+
...(triggerStatements.length > 0
|
|
87
|
+
? [
|
|
88
|
+
'',
|
|
89
|
+
'-- Disable Hasura audit triggers in local bootstrap',
|
|
90
|
+
...triggerStatements,
|
|
91
|
+
]
|
|
92
|
+
: []),
|
|
93
|
+
END_MARKER,
|
|
94
|
+
].join('\n');
|
|
95
|
+
}
|
|
96
|
+
export function buildPruneReminderLog(columns) {
|
|
97
|
+
const lines = [
|
|
98
|
+
`[kysely] Legacy column prune reminder (${columns.length} columns). Remove these from production schema when ready:`,
|
|
99
|
+
];
|
|
100
|
+
for (const item of columns) {
|
|
101
|
+
lines.push(` - ${item.table}.${item.column} [${item.issue}]`);
|
|
102
|
+
}
|
|
103
|
+
return lines;
|
|
104
|
+
}
|
|
105
|
+
export function applyPruneBlock(sql, columns) {
|
|
106
|
+
const hasuraAuditTriggers = extractHasuraAuditTriggers(sql);
|
|
107
|
+
const startAt = sql.indexOf(START_MARKER);
|
|
108
|
+
let base = sql;
|
|
109
|
+
if (startAt !== -1) {
|
|
110
|
+
const endAt = sql.indexOf(END_MARKER, startAt);
|
|
111
|
+
if (endAt === -1) {
|
|
112
|
+
throw new Error(`Malformed legacy prune block in initial SQL: missing "${END_MARKER}".`);
|
|
113
|
+
}
|
|
114
|
+
const tailStart = endAt + END_MARKER.length;
|
|
115
|
+
const afterTail = sql.slice(tailStart).replace(/^\s*\n/, '');
|
|
116
|
+
base = `${sql.slice(0, startAt).trimEnd()}\n${afterTail}`;
|
|
117
|
+
}
|
|
118
|
+
const next = base.trimEnd();
|
|
119
|
+
if (columns.length === 0) {
|
|
120
|
+
return `${next}\n`;
|
|
121
|
+
}
|
|
122
|
+
return `${next}\n\n${buildPruneBlock(columns, hasuraAuditTriggers)}\n`;
|
|
123
|
+
}
|
|
124
|
+
export async function prunePulledSchemaFile(filePath) {
|
|
125
|
+
const original = await readFile(filePath, 'utf8');
|
|
126
|
+
const updated = applyPruneBlock(original, activeLegacyColumnPrunes);
|
|
127
|
+
const changed = updated !== original;
|
|
128
|
+
if (changed) {
|
|
129
|
+
await writeFile(filePath, updated, 'utf8');
|
|
130
|
+
}
|
|
131
|
+
const status = changed ? 'applied' : 'already up to date';
|
|
132
|
+
console.log(`[kysely] Legacy column prune block ${status}.`);
|
|
133
|
+
for (const line of buildPruneReminderLog(activeLegacyColumnPrunes)) {
|
|
134
|
+
console.log(line);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export async function prunePulledSchema(root) {
|
|
138
|
+
const filePath = join(root, 'initial/0000000000000-init.sql');
|
|
139
|
+
await prunePulledSchemaFile(filePath);
|
|
140
|
+
}
|
|
141
|
+
async function run() {
|
|
142
|
+
await prunePulledSchema(process.cwd());
|
|
143
|
+
}
|
|
144
|
+
function isDirectExecution() {
|
|
145
|
+
const entryPath = process.argv[1];
|
|
146
|
+
if (!entryPath) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return (entryPath.endsWith('prune-pulled-schema.ts') ||
|
|
150
|
+
entryPath.endsWith('prune-pulled-schema.js'));
|
|
151
|
+
}
|
|
152
|
+
(async () => {
|
|
153
|
+
if (isDirectExecution()) {
|
|
154
|
+
await run();
|
|
155
|
+
}
|
|
156
|
+
})();
|
|
157
|
+
//# sourceMappingURL=prune-pulled-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-pulled-schema.js","sourceRoot":"src/","sources":["local/prune-pulled-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst START_MARKER = '-- VRP legacy-column-prune:start';\nconst END_MARKER = '-- VRP legacy-column-prune:end';\n\nexport type LegacyColumnPrune = {\n table: `${string}.${string}`;\n column: string;\n issue: string;\n};\n\nconst hasuraAuditTriggerPattern =\n /^CREATE TRIGGER \"(notify_hasura_audit_[^\"]+)\" [\\s\\S]*? ON ([^\\s;]+) FOR EACH ROW EXECUTE FUNCTION hdb_catalog\\.\"notify_hasura_audit_[^\"]+\"\\(\\);$/gm;\n\nexport type HasuraAuditTrigger = {\n name: string;\n table: `${string}.${string}`;\n};\n\n/**\n * Active removals currently validated by runtime + type usage.\n * Add new entries here incrementally to surface compile/runtime callers.\n */\nexport const activeLegacyColumnPrunes: LegacyColumnPrune[] = [\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'fly_app',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'default_machine_size',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'endpoint',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'uid',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'plugin_data',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'config',\n },\n {\n issue: 'VRI-45',\n table: 'public.app',\n column: 'flows',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner_statement',\n column: 'cent_accounting_balance_start',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner_statement',\n column: 'cent_accounting_balance_end',\n },\n {\n issue: 'PRO-12855',\n table: 'accounting.contact',\n column: 'pms_status',\n },\n {\n issue: 'PRO-12855',\n table: 'public.owner',\n column: 'pms_status',\n },\n];\n\nexport function extractHasuraAuditTriggers(sql: string): HasuraAuditTrigger[] {\n const unique = new Map<string, HasuraAuditTrigger>();\n\n for (const match of sql.matchAll(hasuraAuditTriggerPattern)) {\n const name = match[1];\n const table = match[2] as `${string}.${string}`;\n const key = `${name}::${table}`;\n\n if (!unique.has(key)) {\n unique.set(key, { name, table });\n }\n }\n\n return [...unique.values()];\n}\n\nexport function buildPruneBlock(\n columns: readonly LegacyColumnPrune[],\n hasuraAuditTriggers: readonly HasuraAuditTrigger[] = []\n): string {\n const columnStatements = columns.map(\n (item) =>\n `ALTER TABLE ${item.table} DROP COLUMN IF EXISTS ${item.column}; -- ${item.issue}`\n );\n const triggerStatements = hasuraAuditTriggers.map(\n (trigger) =>\n `DROP TRIGGER IF EXISTS \"${trigger.name}\" ON ${trigger.table}; -- hasura-audit`\n );\n\n return [\n START_MARKER,\n '-- Managed by src/local/prune-pulled-schema.ts',\n ...columnStatements,\n ...(triggerStatements.length > 0\n ? [\n '',\n '-- Disable Hasura audit triggers in local bootstrap',\n ...triggerStatements,\n ]\n : []),\n END_MARKER,\n ].join('\\n');\n}\n\nexport function buildPruneReminderLog(columns: readonly LegacyColumnPrune[]) {\n const lines = [\n `[kysely] Legacy column prune reminder (${columns.length} columns). Remove these from production schema when ready:`,\n ];\n\n for (const item of columns) {\n lines.push(` - ${item.table}.${item.column} [${item.issue}]`);\n }\n\n return lines;\n}\n\nexport function applyPruneBlock(\n sql: string,\n columns: readonly LegacyColumnPrune[]\n): string {\n const hasuraAuditTriggers = extractHasuraAuditTriggers(sql);\n const startAt = sql.indexOf(START_MARKER);\n\n let base = sql;\n if (startAt !== -1) {\n const endAt = sql.indexOf(END_MARKER, startAt);\n if (endAt === -1) {\n throw new Error(\n `Malformed legacy prune block in initial SQL: missing \"${END_MARKER}\".`\n );\n }\n const tailStart = endAt + END_MARKER.length;\n const afterTail = sql.slice(tailStart).replace(/^\\s*\\n/, '');\n base = `${sql.slice(0, startAt).trimEnd()}\\n${afterTail}`;\n }\n\n const next = base.trimEnd();\n if (columns.length === 0) {\n return `${next}\\n`;\n }\n\n return `${next}\\n\\n${buildPruneBlock(columns, hasuraAuditTriggers)}\\n`;\n}\n\nexport async function prunePulledSchemaFile(filePath: string) {\n const original = await readFile(filePath, 'utf8');\n const updated = applyPruneBlock(original, activeLegacyColumnPrunes);\n const changed = updated !== original;\n if (changed) {\n await writeFile(filePath, updated, 'utf8');\n }\n\n const status = changed ? 'applied' : 'already up to date';\n console.log(`[kysely] Legacy column prune block ${status}.`);\n for (const line of buildPruneReminderLog(activeLegacyColumnPrunes)) {\n console.log(line);\n }\n}\n\nexport async function prunePulledSchema(root: string) {\n const filePath = join(root, 'initial/0000000000000-init.sql');\n await prunePulledSchemaFile(filePath);\n}\n\nasync function run() {\n await prunePulledSchema(process.cwd());\n}\n\nfunction isDirectExecution() {\n const entryPath = process.argv[1];\n if (!entryPath) {\n return false;\n }\n\n return (\n entryPath.endsWith('prune-pulled-schema.ts') ||\n entryPath.endsWith('prune-pulled-schema.js')\n );\n}\n\n(async () => {\n if (isDirectExecution()) {\n await run();\n }\n})();\n"]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import { exists } from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { PGlite } from '@electric-sql/pglite';
|
|
6
|
+
import { CamelCasePlugin, FileMigrationProvider, Kysely, Migrator, } from 'kysely';
|
|
7
|
+
import codegen from 'kysely-codegen';
|
|
8
|
+
import { KyselyPGlite } from 'kysely-pglite';
|
|
9
|
+
const root = join(__dirname, '..');
|
|
10
|
+
async function migrate(client) {
|
|
11
|
+
console.log('migrating pglite ....');
|
|
12
|
+
const glob = new Bun.Glob('initial/*.sql');
|
|
13
|
+
for await (const migration of glob.scan(root)) {
|
|
14
|
+
await client.exec(await Bun.file(join(root, migration)).text());
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function migrateKysely(kysely) {
|
|
18
|
+
console.log('init migrating kysely ....');
|
|
19
|
+
const migrator = new Migrator({
|
|
20
|
+
db: kysely,
|
|
21
|
+
migrationTableSchema: 'core',
|
|
22
|
+
migrationTableName: 'kysely_migration',
|
|
23
|
+
migrationLockTableName: 'kysely_migration_lock',
|
|
24
|
+
provider: new FileMigrationProvider({
|
|
25
|
+
fs,
|
|
26
|
+
path,
|
|
27
|
+
// This needs to be an absolute path.
|
|
28
|
+
migrationFolder: path.join(root, 'migrations'),
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
console.log('migrating kysely ....');
|
|
32
|
+
const { error, results } = await migrator.migrateToLatest().catch(() => {
|
|
33
|
+
console.error('failed to migrate');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|
|
36
|
+
for (const it of results ?? []) {
|
|
37
|
+
if (it.status === 'Success') {
|
|
38
|
+
console.log(`migration "${it.migrationName}" was executed successfully`);
|
|
39
|
+
}
|
|
40
|
+
else if (it.status === 'Error') {
|
|
41
|
+
console.error(`failed to execute migration "${it.migrationName}"`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (error) {
|
|
45
|
+
console.error('failed to migrate');
|
|
46
|
+
console.error(error);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const dumpPath = join(root, '.data.tar');
|
|
51
|
+
const dumpFile = (async () => {
|
|
52
|
+
const dataExists = await exists(dumpPath).catch(() => false);
|
|
53
|
+
if (!dataExists) {
|
|
54
|
+
console.log('Creating initial dump');
|
|
55
|
+
const main = new PGlite();
|
|
56
|
+
await migrate(main).catch(async (err) => {
|
|
57
|
+
console.error('failed to migrate initial dump');
|
|
58
|
+
await Bun.write('../logs/migrate-initial-dump.json', JSON.stringify(err, null, 2));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
});
|
|
61
|
+
const { dialect } = new KyselyPGlite(main);
|
|
62
|
+
const kysely = new Kysely({
|
|
63
|
+
dialect,
|
|
64
|
+
plugins: [new CamelCasePlugin()],
|
|
65
|
+
});
|
|
66
|
+
await migrateKysely(kysely).catch(() => {
|
|
67
|
+
console.error('failed to migrate kysely');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
});
|
|
70
|
+
await codegen
|
|
71
|
+
.generate({
|
|
72
|
+
db: kysely,
|
|
73
|
+
outFile: path.join(root, 'src/v1.generated.ts'),
|
|
74
|
+
defaultSchemas: ['xxx'],
|
|
75
|
+
camelCase: true,
|
|
76
|
+
dialect: codegen.getDialect('postgres'),
|
|
77
|
+
})
|
|
78
|
+
.catch(() => {
|
|
79
|
+
console.error('failed to generate kysely');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
});
|
|
82
|
+
const content = await main.dumpDataDir('none').catch(() => {
|
|
83
|
+
console.error('failed to dump data');
|
|
84
|
+
process.exit(1);
|
|
85
|
+
});
|
|
86
|
+
await Bun.write(dumpPath, content).catch(() => {
|
|
87
|
+
console.error('failed to write dump');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
});
|
|
90
|
+
return content;
|
|
91
|
+
}
|
|
92
|
+
return Bun.file(dumpPath);
|
|
93
|
+
})();
|
|
94
|
+
export async function useLocalKysely() {
|
|
95
|
+
let isDestroyed = false;
|
|
96
|
+
const now = performance.now();
|
|
97
|
+
const dump = await dumpFile;
|
|
98
|
+
const pglite = new PGlite({ loadDataDir: dump });
|
|
99
|
+
// warm up
|
|
100
|
+
await pglite.sql `SELECT 1`;
|
|
101
|
+
const { dialect } = new KyselyPGlite(pglite);
|
|
102
|
+
const kysely = new Kysely({
|
|
103
|
+
dialect,
|
|
104
|
+
plugins: [new CamelCasePlugin()],
|
|
105
|
+
});
|
|
106
|
+
const originalDestroy = kysely.destroy.bind(kysely);
|
|
107
|
+
kysely.destroy = async () => {
|
|
108
|
+
if (isDestroyed)
|
|
109
|
+
return;
|
|
110
|
+
isDestroyed = true;
|
|
111
|
+
const destroyTime = performance.now();
|
|
112
|
+
await originalDestroy().catch(() => undefined);
|
|
113
|
+
await pglite.close().catch(() => undefined);
|
|
114
|
+
console.log(`Database destroyed: ${Math.round(performance.now() - destroyTime)}ms`);
|
|
115
|
+
};
|
|
116
|
+
console.log(`Database initialized: ${Math.round(performance.now() - now)}ms`);
|
|
117
|
+
return kysely;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"src/","sources":["local.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport { exists } from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { join } from 'node:path';\nimport { PGlite } from '@electric-sql/pglite';\nimport {\n CamelCasePlugin,\n FileMigrationProvider,\n Kysely,\n Migrator,\n} from 'kysely';\nimport codegen from 'kysely-codegen';\nimport { KyselyPGlite } from 'kysely-pglite';\nimport type { DB } from './v1.generated';\n\nconst root = join(__dirname, '..');\nasync function migrate(client: PGlite) {\n console.log('migrating pglite ....');\n const glob = new Bun.Glob('initial/*.sql');\n for await (const migration of glob.scan(root)) {\n await client.exec(await Bun.file(join(root, migration)).text());\n }\n}\n\nasync function migrateKysely(kysely: Kysely<any>) {\n console.log('init migrating kysely ....');\n const migrator = new Migrator({\n db: kysely,\n migrationTableSchema: 'core',\n migrationTableName: 'kysely_migration',\n migrationLockTableName: 'kysely_migration_lock',\n provider: new FileMigrationProvider({\n fs,\n path,\n // This needs to be an absolute path.\n migrationFolder: path.join(root, 'migrations'),\n }),\n });\n\n console.log('migrating kysely ....');\n const { error, results } = await migrator.migrateToLatest().catch(() => {\n console.error('failed to migrate');\n process.exit(1);\n });\n\n for (const it of results ?? []) {\n if (it.status === 'Success') {\n console.log(`migration \"${it.migrationName}\" was executed successfully`);\n } else if (it.status === 'Error') {\n console.error(`failed to execute migration \"${it.migrationName}\"`);\n }\n }\n\n if (error) {\n console.error('failed to migrate');\n console.error(error);\n process.exit(1);\n }\n}\n\nconst dumpPath = join(root, '.data.tar');\nconst dumpFile = (async () => {\n const dataExists = await exists(dumpPath).catch(() => false);\n if (!dataExists) {\n console.log('Creating initial dump');\n const main = new PGlite();\n await migrate(main).catch(async (err) => {\n console.error('failed to migrate initial dump');\n await Bun.write(\n '../logs/migrate-initial-dump.json',\n JSON.stringify(err as any, null, 2)\n );\n process.exit(1);\n });\n const { dialect } = new KyselyPGlite(main);\n const kysely = new Kysely<DB>({\n dialect,\n plugins: [new CamelCasePlugin()],\n });\n await migrateKysely(kysely).catch(() => {\n console.error('failed to migrate kysely');\n process.exit(1);\n });\n await codegen\n .generate({\n db: kysely,\n outFile: path.join(root, 'src/v1.generated.ts'),\n defaultSchemas: ['xxx'],\n camelCase: true,\n dialect: codegen.getDialect('postgres'),\n })\n .catch(() => {\n console.error('failed to generate kysely');\n process.exit(1);\n });\n const content = await main.dumpDataDir('none').catch(() => {\n console.error('failed to dump data');\n process.exit(1);\n });\n await Bun.write(dumpPath, content).catch(() => {\n console.error('failed to write dump');\n process.exit(1);\n });\n return content;\n }\n return Bun.file(dumpPath);\n})();\n\nexport async function useLocalKysely() {\n let isDestroyed = false;\n const now = performance.now();\n\n const dump = await dumpFile;\n\n const pglite = new PGlite({ loadDataDir: dump });\n // warm up\n await pglite.sql`SELECT 1`;\n const { dialect } = new KyselyPGlite(pglite);\n const kysely = new Kysely<DB>({\n dialect,\n plugins: [new CamelCasePlugin()],\n });\n\n const originalDestroy = kysely.destroy.bind(kysely);\n kysely.destroy = async () => {\n if (isDestroyed) return;\n isDestroyed = true;\n const destroyTime = performance.now();\n await originalDestroy().catch(() => undefined);\n await pglite.close().catch(() => undefined);\n console.log(\n `Database destroyed: ${Math.round(performance.now() - destroyTime)}ms`\n );\n };\n\n console.log(`Database initialized: ${Math.round(performance.now() - now)}ms`);\n\n return kysely;\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { day } from '@vrplatform/utils';
|
|
2
2
|
function hasInactiveOwnership(eb, today) {
|
|
3
|
+
const onDate = day(today).toDate();
|
|
3
4
|
return eb.exists(eb
|
|
4
5
|
.selectFrom('public.listingOwnershipPeriod as lop')
|
|
5
6
|
.select('lop.id')
|
|
@@ -8,11 +9,11 @@ function hasInactiveOwnership(eb, today) {
|
|
|
8
9
|
.where('lop.setListingInactive', '=', true)
|
|
9
10
|
.where((eb2) => eb2.or([
|
|
10
11
|
eb2.and([
|
|
11
|
-
eb2('lop.startAt', '<=',
|
|
12
|
-
eb2('lop.endAt', '>=',
|
|
12
|
+
eb2('lop.startAt', '<=', onDate),
|
|
13
|
+
eb2('lop.endAt', '>=', onDate),
|
|
13
14
|
]),
|
|
14
15
|
eb2.and([
|
|
15
|
-
eb2('lop.startAt', '<=',
|
|
16
|
+
eb2('lop.startAt', '<=', onDate),
|
|
16
17
|
eb2('lop.endAt', 'is', null),
|
|
17
18
|
]),
|
|
18
19
|
]))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/listing/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,SAAS,oBAAoB,CAC3B,EAAqD,EACrD,KAAa,EACb;IACA,OAAO,EAAE,CAAC,MAAM,CACd,EAAE;SACC,UAAU,CAAC,sCAAsC,CAAC;SAClD,MAAM,CAAC,QAAQ,CAAC;SAChB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC;SACtC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC;SAC3C,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE,IAAI,CAAC;SAC1C,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,CAAC,EAAE,CAAC;QACL,GAAG,CAAC,GAAG,CAAC;YACN,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"src/","sources":["query/listing/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,SAAS,oBAAoB,CAC3B,EAAqD,EACrD,KAAa,EACb;IACA,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC,OAAO,EAAE,CAAC,MAAM,CACd,EAAE;SACC,UAAU,CAAC,sCAAsC,CAAC;SAClD,MAAM,CAAC,QAAQ,CAAC;SAChB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC;SACtC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC;SAC3C,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE,IAAI,CAAC;SAC1C,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,CAAC,EAAE,CAAC;QACL,GAAG,CAAC,GAAG,CAAC;YACN,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC;YAChC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC;SAC/B,CAAC;QACF,GAAG,CAAC,GAAG,CAAC;YACN,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC;YAChC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC;SAC7B,CAAC;KACH,CAAC,CACH;SACA,KAAK,CAAC,CAAC,CAAC,CACZ,CAAC;AAAA,CACH;AAED,MAAM,UAAU,sBAAsB,CACpC,EAAqD,EACrD,KAAK,GAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,EAChC;IACA,OAAO,oBAAoB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAAA,CACxC;AAED,MAAM,UAAU,oBAAoB,CAClC,EAAqD,EACrD,KAAK,GAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,EAChC;IACA,OAAO,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,CAClD;AAED,MAAM,UAAU,uBAAuB,CACrC,EAAqD,EACrD,KAAK,GAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,EAChC;IACA,OAAO,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAAA,CAC1C;AAED,MAAM,UAAU,qBAAqB,CACnC,EAAqD,EACrD,KAAK,GAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,EAChC;IACA,OAAO,oBAAoB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAAA,CACxC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAqD,EACrD,KAAK,GAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,EAChC;IACA,OAAO,EAAE;SACN,IAAI,EAAE;SACN,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;SACvC,IAAI,CAAC,UAAU,CAAC;SAChB,IAAI,CAAC,QAAQ,CAAC;SACd,GAAG,EAAE,CAAC;AAAA,CACV","sourcesContent":["import { day } from '@vrplatform/utils';\nimport type { DB, ExpressionBuilder, PublicListing } from '../../isomorphic';\n\nfunction hasInactiveOwnership(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string\n) {\n const onDate = day(today).toDate();\n return eb.exists(\n eb\n .selectFrom('public.listingOwnershipPeriod as lop')\n .select('lop.id')\n .whereRef('lop.listingId', '=', 'l.id')\n .whereRef('lop.tenantId', '=', 'l.tenantId')\n .where('lop.setListingInactive', '=', true)\n .where((eb2) =>\n eb2.or([\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', '>=', onDate),\n ]),\n eb2.and([\n eb2('lop.startAt', '<=', onDate),\n eb2('lop.endAt', 'is', null),\n ]),\n ])\n )\n .limit(1)\n );\n}\n\nexport function whereListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return hasInactiveOwnership(eb, today);\n}\n\nexport function whereListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb.not(whereListingIsInactive(eb, today));\n}\n\nexport function selectListingIsInactive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsInactive(eb, today);\n}\n\nexport function selectListingIsActive(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return whereListingIsActive(eb, today);\n}\n\nexport function selectListingStatus(\n eb: ExpressionBuilder<DB & { l: PublicListing }, 'l'>,\n today: string = day().yyyymmdd()\n) {\n return eb\n .case()\n .when(whereListingIsInactive(eb, today))\n .then('inactive')\n .else('active')\n .end();\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"7.0.0-dev.20251218.3","root":["../../src/error.ts","../../src/index.ts","../../src/isomorphic.ts","../../src/plugins.ts","../../src/v1.generated.ts","../../src/camel-case/index.ts","../../src/local/digest.ts","../../src/local/generate.ts","../../src/local/index.ts","../../src/pganalyze-comment-plugin/comment-transformer.ts","../../src/pganalyze-comment-plugin/index.ts","../../src/query/index.ts","../../src/query/listing/index.ts","../../src/query/listing/status.ts","../../src/test/index.ts"]}
|
|
1
|
+
{"version":"7.0.0-dev.20251218.3","root":["../../src/error.ts","../../src/index.ts","../../src/isomorphic.ts","../../src/plugins.ts","../../src/v1.generated.ts","../../src/camel-case/index.ts","../../src/local/digest.ts","../../src/local/generate.ts","../../src/local/index.ts","../../src/local/prune-pulled-schema.ts","../../src/pganalyze-comment-plugin/comment-transformer.ts","../../src/pganalyze-comment-plugin/index.ts","../../src/query/index.ts","../../src/query/listing/index.ts","../../src/query/listing/status.ts","../../src/test/index.ts"]}
|