@remix-run/data-table 0.2.0 → 0.3.0

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.
Files changed (66) hide show
  1. package/README.md +77 -75
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/lib/adapter.d.ts +10 -271
  5. package/dist/lib/adapter.d.ts.map +1 -1
  6. package/dist/lib/column.d.ts.map +1 -1
  7. package/dist/lib/column.js +10 -1
  8. package/dist/lib/migrations/directive.d.ts +12 -0
  9. package/dist/lib/migrations/directive.d.ts.map +1 -0
  10. package/dist/lib/migrations/directive.js +28 -0
  11. package/dist/lib/migrations/directory-name.d.ts +12 -0
  12. package/dist/lib/migrations/directory-name.d.ts.map +1 -0
  13. package/dist/lib/migrations/directory-name.js +18 -0
  14. package/dist/lib/migrations/journal-store.d.ts +1 -1
  15. package/dist/lib/migrations/journal-store.d.ts.map +1 -1
  16. package/dist/lib/migrations/journal-store.js +18 -18
  17. package/dist/lib/migrations/registry.d.ts +1 -1
  18. package/dist/lib/migrations/registry.js +1 -1
  19. package/dist/lib/migrations/runner.d.ts +2 -2
  20. package/dist/lib/migrations/runner.d.ts.map +1 -1
  21. package/dist/lib/migrations/runner.js +44 -71
  22. package/dist/lib/migrations-node.d.ts +7 -4
  23. package/dist/lib/migrations-node.d.ts.map +1 -1
  24. package/dist/lib/migrations-node.js +52 -41
  25. package/dist/lib/migrations.d.ts +19 -200
  26. package/dist/lib/migrations.d.ts.map +1 -1
  27. package/dist/lib/migrations.js +1 -38
  28. package/dist/lib/query.d.ts +33 -0
  29. package/dist/lib/query.d.ts.map +1 -1
  30. package/dist/lib/query.js +28 -0
  31. package/dist/lib/sql-helpers.d.ts +1 -7
  32. package/dist/lib/sql-helpers.d.ts.map +1 -1
  33. package/dist/lib/sql-helpers.js +0 -16
  34. package/dist/migrations.d.ts +2 -5
  35. package/dist/migrations.d.ts.map +1 -1
  36. package/dist/migrations.js +1 -3
  37. package/dist/sql-helpers.d.ts +1 -1
  38. package/dist/sql-helpers.d.ts.map +1 -1
  39. package/dist/sql-helpers.js +1 -1
  40. package/package.json +7 -8
  41. package/src/index.ts +1 -34
  42. package/src/lib/adapter.ts +10 -330
  43. package/src/lib/column.ts +14 -2
  44. package/src/lib/migrations/directive.ts +38 -0
  45. package/src/lib/migrations/directory-name.ts +23 -0
  46. package/src/lib/migrations/journal-store.ts +22 -18
  47. package/src/lib/migrations/registry.ts +1 -1
  48. package/src/lib/migrations/runner.ts +51 -85
  49. package/src/lib/migrations-node.ts +58 -38
  50. package/src/lib/migrations.ts +19 -224
  51. package/src/lib/query.ts +33 -0
  52. package/src/lib/sql-helpers.ts +1 -22
  53. package/src/migrations.ts +3 -13
  54. package/src/sql-helpers.ts +0 -1
  55. package/dist/lib/migrations/filename.d.ts +0 -12
  56. package/dist/lib/migrations/filename.d.ts.map +0 -1
  57. package/dist/lib/migrations/filename.js +0 -20
  58. package/dist/lib/migrations/helpers.d.ts +0 -11
  59. package/dist/lib/migrations/helpers.d.ts.map +0 -1
  60. package/dist/lib/migrations/helpers.js +0 -77
  61. package/dist/lib/migrations/schema-api.d.ts +0 -7
  62. package/dist/lib/migrations/schema-api.d.ts.map +0 -1
  63. package/dist/lib/migrations/schema-api.js +0 -326
  64. package/src/lib/migrations/filename.ts +0 -25
  65. package/src/lib/migrations/helpers.ts +0 -108
  66. package/src/lib/migrations/schema-api.ts +0 -417
@@ -1,108 +0,0 @@
1
- import type { TableRef } from '../adapter.ts'
2
- import type { IndexColumns, KeyColumns } from '../migrations.ts'
3
-
4
- export function toTableRef(name: string): TableRef {
5
- let segments = name.split('.')
6
-
7
- if (segments.length === 1) {
8
- return { name }
9
- }
10
-
11
- return {
12
- schema: segments[0],
13
- name: segments.slice(1).join('.'),
14
- }
15
- }
16
-
17
- export function normalizeIndexColumns(columns: IndexColumns): string[] {
18
- return normalizeKeyColumns(columns)
19
- }
20
-
21
- export function normalizeKeyColumns(columns: KeyColumns): string[] {
22
- if (Array.isArray(columns)) {
23
- return [...columns]
24
- }
25
-
26
- return [columns]
27
- }
28
-
29
- function normalizeNamePart(value: string): string {
30
- let normalized = value
31
- .toLowerCase()
32
- .replace(/[^a-z0-9]+/g, '_')
33
- .replace(/^_+|_+$/g, '')
34
-
35
- if (normalized.length === 0) {
36
- return 'item'
37
- }
38
-
39
- return normalized
40
- }
41
-
42
- function tableNamePart(table: TableRef): string {
43
- if (table.schema) {
44
- return normalizeNamePart(table.schema + '_' + table.name)
45
- }
46
-
47
- return normalizeNamePart(table.name)
48
- }
49
-
50
- function hashString(value: string): number {
51
- let hash = 5381
52
-
53
- for (let index = 0; index < value.length; index++) {
54
- hash = ((hash << 5) + hash) ^ value.charCodeAt(index)
55
- }
56
-
57
- return hash >>> 0
58
- }
59
-
60
- function withNameLimit(name: string): string {
61
- let limit = 63
62
-
63
- if (name.length <= limit) {
64
- return name
65
- }
66
-
67
- let suffix = hashString(name).toString(36).padStart(8, '0').slice(0, 8)
68
- return name.slice(0, limit - 9) + '_' + suffix
69
- }
70
-
71
- function columnsNamePart(columns: string[]): string {
72
- return columns.map((column) => normalizeNamePart(column)).join('_')
73
- }
74
-
75
- export function createPrimaryKeyName(table: TableRef): string {
76
- return withNameLimit(tableNamePart(table) + '_pk')
77
- }
78
-
79
- export function createUniqueName(table: TableRef, columns: string[]): string {
80
- return withNameLimit(tableNamePart(table) + '_' + columnsNamePart(columns) + '_uq')
81
- }
82
-
83
- export function createForeignKeyName(
84
- table: TableRef,
85
- columns: string[],
86
- references: TableRef,
87
- referenceColumns: string[],
88
- ): string {
89
- let base =
90
- tableNamePart(table) +
91
- '_' +
92
- columnsNamePart(columns) +
93
- '_' +
94
- tableNamePart(references) +
95
- '_' +
96
- columnsNamePart(referenceColumns) +
97
- '_fk'
98
- return withNameLimit(base)
99
- }
100
-
101
- export function createCheckName(table: TableRef, expression: string): string {
102
- let suffix = hashString(expression).toString(36)
103
- return withNameLimit(tableNamePart(table) + '_chk_' + suffix)
104
- }
105
-
106
- export function createIndexName(table: TableRef, columns: string[]): string {
107
- return withNameLimit(tableNamePart(table) + '_' + columnsNamePart(columns) + '_idx')
108
- }
@@ -1,417 +0,0 @@
1
- import type { Database } from '../database.ts'
2
- import type {
3
- AlterTableChange,
4
- CheckConstraint,
5
- ColumnDefinition,
6
- CreateTableOperation,
7
- DataMigrationOperation,
8
- ForeignKeyConstraint,
9
- PrimaryKeyConstraint,
10
- TableRef,
11
- TransactionToken,
12
- UniqueConstraint,
13
- } from '../adapter.ts'
14
- import { rawSql } from '../sql.ts'
15
- import { getTableColumnDefinitions, getTableName, getTablePrimaryKey } from '../table.ts'
16
- import type { AnyTable } from '../table.ts'
17
- import type {
18
- AlterTableBuilder,
19
- CreateIndexOptions,
20
- ForeignKeyOptions,
21
- KeyColumns,
22
- MigrationSchema,
23
- NamedConstraintOptions,
24
- TableInput,
25
- } from '../migrations.ts'
26
-
27
- import { ColumnBuilder } from '../column.ts'
28
- import {
29
- createCheckName,
30
- createForeignKeyName,
31
- createIndexName,
32
- createPrimaryKeyName,
33
- createUniqueName,
34
- normalizeIndexColumns,
35
- normalizeKeyColumns,
36
- toTableRef,
37
- } from './helpers.ts'
38
-
39
- function asColumnDefinition(definition: ColumnDefinition | ColumnBuilder): ColumnDefinition {
40
- if (definition instanceof ColumnBuilder) {
41
- return definition.build()
42
- }
43
-
44
- return definition
45
- }
46
-
47
- function asTableRef(value: TableInput): TableRef {
48
- if (typeof value === 'string') {
49
- return toTableRef(value)
50
- }
51
-
52
- return toTableRef(getTableName(value))
53
- }
54
-
55
- function lowerTableForCreate(table: AnyTable): CreateTableOperation {
56
- let tableRef = toTableRef(getTableName(table))
57
- let sourceColumnDefinitions = getTableColumnDefinitions(table)
58
- let columns: Record<string, ColumnDefinition> = {}
59
- let uniques: UniqueConstraint[] = []
60
- let checks: CheckConstraint[] = []
61
- let foreignKeys: ForeignKeyConstraint[] = []
62
-
63
- for (let columnName in sourceColumnDefinitions) {
64
- if (!Object.prototype.hasOwnProperty.call(sourceColumnDefinitions, columnName)) {
65
- continue
66
- }
67
-
68
- let sourceDefinition = sourceColumnDefinitions[columnName]
69
- let columnDefinition: ColumnDefinition = {
70
- ...sourceDefinition,
71
- checks: undefined,
72
- references: undefined,
73
- primaryKey: undefined,
74
- }
75
-
76
- let unique = sourceDefinition.unique
77
-
78
- if (unique) {
79
- let uniqueName =
80
- typeof unique === 'object' && unique.name
81
- ? unique.name
82
- : createUniqueName(tableRef, [columnName])
83
- uniques.push({
84
- name: uniqueName,
85
- columns: [columnName],
86
- })
87
- columnDefinition.unique = undefined
88
- }
89
-
90
- if (sourceDefinition.checks) {
91
- for (let check of sourceDefinition.checks) {
92
- checks.push({
93
- name: check.name || createCheckName(tableRef, check.expression),
94
- expression: check.expression,
95
- })
96
- }
97
- }
98
-
99
- if (sourceDefinition.references) {
100
- let referenceColumns = [...sourceDefinition.references.columns]
101
- let referencesTable = { ...sourceDefinition.references.table }
102
- foreignKeys.push({
103
- name:
104
- sourceDefinition.references.name ||
105
- createForeignKeyName(tableRef, [columnName], referencesTable, referenceColumns),
106
- columns: [columnName],
107
- references: {
108
- table: referencesTable,
109
- columns: referenceColumns,
110
- },
111
- onDelete: sourceDefinition.references.onDelete,
112
- onUpdate: sourceDefinition.references.onUpdate,
113
- })
114
- }
115
-
116
- columns[columnName] = columnDefinition
117
- }
118
-
119
- let primaryKeyColumns = [...getTablePrimaryKey(table)]
120
- let primaryKey: PrimaryKeyConstraint | undefined
121
-
122
- if (primaryKeyColumns.length > 0) {
123
- primaryKey = {
124
- columns: primaryKeyColumns,
125
- name: createPrimaryKeyName(tableRef),
126
- }
127
- }
128
-
129
- return {
130
- kind: 'createTable',
131
- table: tableRef,
132
- columns,
133
- primaryKey,
134
- uniques: uniques.length > 0 ? uniques : undefined,
135
- checks: checks.length > 0 ? checks : undefined,
136
- foreignKeys: foreignKeys.length > 0 ? foreignKeys : undefined,
137
- }
138
- }
139
-
140
- class AlterTableBuilderRuntime implements AlterTableBuilder {
141
- alterChanges: AlterTableChange[] = []
142
- extraStatements: DataMigrationOperation[] = []
143
- table: TableRef
144
-
145
- constructor(table: TableRef) {
146
- this.table = table
147
- }
148
-
149
- addColumn(name: string, definition: ColumnDefinition | ColumnBuilder): void {
150
- this.alterChanges.push({
151
- kind: 'addColumn',
152
- column: name,
153
- definition: asColumnDefinition(definition),
154
- })
155
- }
156
-
157
- changeColumn(name: string, definition: ColumnDefinition | ColumnBuilder): void {
158
- this.alterChanges.push({
159
- kind: 'changeColumn',
160
- column: name,
161
- definition: asColumnDefinition(definition),
162
- })
163
- }
164
-
165
- renameColumn(from: string, to: string): void {
166
- this.alterChanges.push({ kind: 'renameColumn', from, to })
167
- }
168
-
169
- dropColumn(name: string, options?: { ifExists?: boolean }): void {
170
- this.alterChanges.push({ kind: 'dropColumn', column: name, ifExists: options?.ifExists })
171
- }
172
-
173
- addPrimaryKey(columns: KeyColumns, options?: NamedConstraintOptions): void {
174
- let normalizedColumns = normalizeKeyColumns(columns)
175
- this.alterChanges.push({
176
- kind: 'addPrimaryKey',
177
- constraint: {
178
- columns: normalizedColumns,
179
- name: options?.name ?? createPrimaryKeyName(this.table),
180
- },
181
- })
182
- }
183
-
184
- dropPrimaryKey(name: string): void {
185
- this.alterChanges.push({ kind: 'dropPrimaryKey', name })
186
- }
187
-
188
- addUnique(columns: KeyColumns, options?: NamedConstraintOptions): void {
189
- let normalizedColumns = normalizeKeyColumns(columns)
190
- this.alterChanges.push({
191
- kind: 'addUnique',
192
- constraint: {
193
- columns: normalizedColumns,
194
- name: options?.name ?? createUniqueName(this.table, normalizedColumns),
195
- },
196
- })
197
- }
198
-
199
- dropUnique(name: string): void {
200
- this.alterChanges.push({ kind: 'dropUnique', name })
201
- }
202
-
203
- addForeignKey(
204
- columns: KeyColumns,
205
- refTable: TableInput,
206
- refColumns?: KeyColumns,
207
- options?: ForeignKeyOptions,
208
- ): void {
209
- let normalizedColumns = normalizeKeyColumns(columns)
210
- let normalizedReferenceColumns = refColumns ? normalizeKeyColumns(refColumns) : ['id']
211
- let referenceTable = asTableRef(refTable)
212
- this.alterChanges.push({
213
- kind: 'addForeignKey',
214
- constraint: {
215
- columns: normalizedColumns,
216
- references: {
217
- table: referenceTable,
218
- columns: normalizedReferenceColumns,
219
- },
220
- name:
221
- options?.name ??
222
- createForeignKeyName(
223
- this.table,
224
- normalizedColumns,
225
- referenceTable,
226
- normalizedReferenceColumns,
227
- ),
228
- onDelete: options?.onDelete,
229
- onUpdate: options?.onUpdate,
230
- },
231
- })
232
- }
233
-
234
- dropForeignKey(name: string): void {
235
- this.alterChanges.push({ kind: 'dropForeignKey', name })
236
- }
237
-
238
- addCheck(expression: string, options?: NamedConstraintOptions): void {
239
- this.alterChanges.push({
240
- kind: 'addCheck',
241
- constraint: {
242
- expression,
243
- name: options?.name ?? createCheckName(this.table, expression),
244
- },
245
- })
246
- }
247
-
248
- dropCheck(name: string): void {
249
- this.alterChanges.push({ kind: 'dropCheck', name })
250
- }
251
-
252
- addIndex(columns: string | string[], options?: CreateIndexOptions): void {
253
- let normalizedColumns = normalizeIndexColumns(columns)
254
- let { name, ifNotExists, ...indexOptions } = options ?? {}
255
- this.extraStatements.push({
256
- kind: 'createIndex',
257
- index: {
258
- table: this.table,
259
- name: name ?? createIndexName(this.table, normalizedColumns),
260
- columns: normalizedColumns,
261
- ...indexOptions,
262
- },
263
- ifNotExists,
264
- })
265
- }
266
-
267
- dropIndex(name: string): void {
268
- this.extraStatements.push({
269
- kind: 'dropIndex',
270
- table: this.table,
271
- name,
272
- })
273
- }
274
-
275
- comment(text: string): void {
276
- this.alterChanges.push({ kind: 'setTableComment', comment: text })
277
- }
278
- }
279
-
280
- export function createMigrationSchema(
281
- db: Database,
282
- emit: (operation: DataMigrationOperation) => Promise<void>,
283
- options?: { transaction?: TransactionToken },
284
- ): MigrationSchema {
285
- return {
286
- async createTable(table, options) {
287
- let operation = lowerTableForCreate(table)
288
- operation.ifNotExists = options?.ifNotExists
289
- await emit(operation)
290
- },
291
- async alterTable(input, migrate, options) {
292
- let tableRef = asTableRef(input)
293
- let builder = new AlterTableBuilderRuntime(tableRef)
294
- migrate(builder)
295
-
296
- if (builder.alterChanges.length > 0) {
297
- await emit({
298
- kind: 'alterTable',
299
- table: tableRef,
300
- changes: builder.alterChanges,
301
- ifExists: options?.ifExists,
302
- })
303
- }
304
-
305
- for (let operation of builder.extraStatements) {
306
- await emit(operation)
307
- }
308
- },
309
- async renameTable(from, to) {
310
- await emit({ kind: 'renameTable', from: asTableRef(from), to: toTableRef(to) })
311
- },
312
- async dropTable(table, options) {
313
- await emit({
314
- kind: 'dropTable',
315
- table: asTableRef(table),
316
- ifExists: options?.ifExists,
317
- cascade: options?.cascade,
318
- })
319
- },
320
- async createIndex(table, columns, options) {
321
- let tableRef = asTableRef(table)
322
- let normalizedColumns = normalizeIndexColumns(columns)
323
- let { name, ifNotExists, ...indexOptions } = options ?? {}
324
- await emit({
325
- kind: 'createIndex',
326
- index: {
327
- table: tableRef,
328
- name: name ?? createIndexName(tableRef, normalizedColumns),
329
- columns: normalizedColumns,
330
- ...indexOptions,
331
- },
332
- ifNotExists,
333
- })
334
- },
335
- async dropIndex(table, name, options) {
336
- await emit({
337
- kind: 'dropIndex',
338
- table: asTableRef(table),
339
- name,
340
- ifExists: options?.ifExists,
341
- })
342
- },
343
- async renameIndex(table, from, to) {
344
- await emit({
345
- kind: 'renameIndex',
346
- table: asTableRef(table),
347
- from,
348
- to,
349
- })
350
- },
351
- async addForeignKey(table, columns, refTable, refColumns, options) {
352
- let tableRef = asTableRef(table)
353
- let normalizedColumns = normalizeKeyColumns(columns)
354
- let referenceTable = asTableRef(refTable)
355
- let normalizedReferenceColumns = refColumns ? normalizeKeyColumns(refColumns) : ['id']
356
- await emit({
357
- kind: 'addForeignKey',
358
- table: tableRef,
359
- constraint: {
360
- columns: normalizedColumns,
361
- references: {
362
- table: referenceTable,
363
- columns: normalizedReferenceColumns,
364
- },
365
- name:
366
- options?.name ??
367
- createForeignKeyName(
368
- tableRef,
369
- normalizedColumns,
370
- referenceTable,
371
- normalizedReferenceColumns,
372
- ),
373
- onDelete: options?.onDelete,
374
- onUpdate: options?.onUpdate,
375
- },
376
- })
377
- },
378
- async dropForeignKey(table, name) {
379
- await emit({
380
- kind: 'dropForeignKey',
381
- table: asTableRef(table),
382
- name,
383
- })
384
- },
385
- async addCheck(table, expression, options) {
386
- let tableRef = asTableRef(table)
387
- await emit({
388
- kind: 'addCheck',
389
- table: tableRef,
390
- constraint: {
391
- expression,
392
- name: options?.name ?? createCheckName(tableRef, expression),
393
- },
394
- })
395
- },
396
- async dropCheck(table, name) {
397
- await emit({
398
- kind: 'dropCheck',
399
- table: asTableRef(table),
400
- name,
401
- })
402
- },
403
- async plan(sql) {
404
- let statement = typeof sql === 'string' ? rawSql(sql) : sql
405
- await emit({
406
- kind: 'raw',
407
- sql: statement,
408
- })
409
- },
410
- async hasTable(table) {
411
- return db.adapter.hasTable(asTableRef(table), options?.transaction)
412
- },
413
- async hasColumn(table, columnName) {
414
- return db.adapter.hasColumn(asTableRef(table), columnName, options?.transaction)
415
- },
416
- }
417
- }