Skip to content

Commit

Permalink
feat: generate full database sql dump
Browse files Browse the repository at this point in the history
  • Loading branch information
farnabaz committed Nov 1, 2024
1 parent da3a6d6 commit 1cfdbe9
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 13 deletions.
8 changes: 5 additions & 3 deletions src/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import fastGlob from 'fast-glob'
import htmlTags from '@nuxtjs/mdc/runtime/parser/utils/html-tags-list'
import { kebabCase, pascalCase } from 'scule'
import { generateCollectionInsert, generateCollectionTableDefinition, parseSourceBase } from './utils/collection'
import { collectionsTemplate, componentsManifestTemplate, contentTypesTemplate, manifestTemplate, moduleTemplates } from './utils/templates'
import { collectionsTemplate, componentsManifestTemplate, contentTypesTemplate, fullDatabaseRawDumpTemplate, manifestTemplate, moduleTemplates } from './utils/templates'
import type { ResolvedCollection } from './types/collection'
import type { ModuleOptions, SqliteDatabaseConfig } from './types/module'
import { getContentChecksum, localDatabase, logger, watchContents, chunks, watchComponents, watchConfig } from './utils/dev'
Expand Down Expand Up @@ -126,10 +126,11 @@ export default defineNuxtModule<ModuleOptions>({

// Add Templates & aliases
nuxt.options.nitro.alias = nuxt.options.nitro.alias || {}
addTypeTemplate(contentTypesTemplate(collections))
addTemplate(fullDatabaseRawDumpTemplate(manifest))
nuxt.options.nitro.alias['#content/collections'] = addTemplate(collectionsTemplate(collections)).dst
nuxt.options.alias['#content/components'] = addTemplate(componentsManifestTemplate(manifest)).dst
nuxt.options.alias['#content/manifest'] = addTemplate(manifestTemplate(collections, manifest)).dst
addTypeTemplate(contentTypesTemplate(collections))

// Load preset
nuxt.hook('nitro:config', async (config) => {
Expand Down Expand Up @@ -169,7 +170,8 @@ export default defineNuxtModule<ModuleOptions>({

return updateTemplates({
filter: template => [
moduleTemplates.dump,
moduleTemplates.fullRawDump,
moduleTemplates.fullCompressedDump,
moduleTemplates.manifest,
moduleTemplates.components,
].includes(template.filename),
Expand Down
4 changes: 2 additions & 2 deletions src/presets/cloudflare-pages.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { addTemplate } from '@nuxt/kit'
import { join } from 'pathe'
import { sqlDumpTemplateRaw } from '../utils/templates'
import { collectionDumpTemplate } from '../utils/templates'
import { definePreset } from '../utils/preset'
import { logger } from '../utils/dev'

Expand All @@ -21,7 +21,7 @@ export default definePreset({
// Add raw content dump
manifest.collections.map(async (collection) => {
if (!collection.private) {
addTemplate(sqlDumpTemplateRaw(collection.name, manifest))
addTemplate(collectionDumpTemplate(collection.name, manifest))
}
})

Expand Down
4 changes: 2 additions & 2 deletions src/presets/node.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { addTemplate } from '@nuxt/kit'
import { sqlDumpTemplate } from '../utils/templates'
import { fullDatabaseCompressedDumpTemplate } from '../utils/templates'
import { definePreset } from '../utils/preset'

export default definePreset({
Expand All @@ -8,7 +8,7 @@ export default definePreset({
nitroConfig.alias = nitroConfig.alias || {}
nitroConfig.handlers ||= []

nitroConfig.alias['#content/dump'] = addTemplate(sqlDumpTemplate(manifest)).dst
nitroConfig.alias['#content/dump'] = addTemplate(fullDatabaseCompressedDumpTemplate(manifest)).dst
nitroConfig.handlers.push({
route: '/api/content/:collection/database.sql',
handler: resolver.resolve('./runtime/presets/node/database.sql'),
Expand Down
2 changes: 1 addition & 1 deletion src/utils/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ export async function watchContents(nuxt: Nuxt, collections: ResolvedCollection[
await updateTemplates({
filter: template => [
moduleTemplates.manifest,
moduleTemplates.dump,
moduleTemplates.fullCompressedDump,
// moduleTemplates.raw,
].includes(template.filename),
})
Expand Down
22 changes: 18 additions & 4 deletions src/utils/templates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ export const moduleTemplates = {
collections: 'content/collections.mjs',
manifest: 'content/manifest.ts',
components: 'content/components.ts',
dump: 'content/dump.mjs',
fullCompressedDump: 'content/database.compressed.mjs',
fullRawDump: 'content/database.sql',
}

export const contentTypesTemplate = (collections: ResolvedCollection[]) => ({
Expand Down Expand Up @@ -79,8 +80,8 @@ export const collectionsTemplate = (collections: ResolvedCollection[]) => ({
write: true,
})

export const sqlDumpTemplate = (manifest: Manifest) => ({
filename: moduleTemplates.dump,
export const fullDatabaseCompressedDumpTemplate = (manifest: Manifest) => ({
filename: moduleTemplates.fullCompressedDump,
getContents: ({ options }: { options: { manifest: Manifest } }) => {
return Object.entries(options.manifest.dump).map(([key, value]) => {
const str = Buffer.from(deflate(value.join('\n')).buffer).toString('base64')
Expand All @@ -93,7 +94,20 @@ export const sqlDumpTemplate = (manifest: Manifest) => ({
},
})

export const sqlDumpTemplateRaw = (collection: string, manifest: Manifest) => ({
export const fullDatabaseRawDumpTemplate = (manifest: Manifest) => ({
filename: moduleTemplates.fullRawDump,
getContents: ({ options }: { options: { manifest: Manifest } }) => {
return Object.entries(options.manifest.dump).map(([_key, value]) => {
return value.join('\n')
}).join('\n')
},
write: true,
options: {
manifest,
},
})

export const collectionDumpTemplate = (collection: string, manifest: Manifest) => ({
filename: `content/raw/dump.${collection}.sql`,
getContents: ({ options }: { options: { manifest: Manifest } }) => {
const compressed = deflate((options.manifest.dump[collection] || []).join('\n'))
Expand Down
2 changes: 1 addition & 1 deletion test/base.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ describe('empty', async () => {

describe('SQL dump', () => {
test('is generated', async () => {
const dump = await import(new URL('./fixtures/empty/.nuxt/content/dump.mjs', import.meta.url).pathname).then(m => m.content)
const dump = await import(new URL('./fixtures/empty/.nuxt/content/database.compressed.mjs', import.meta.url).pathname).then(m => m.content)

const parsedDump = await decompressSQLDump(dump)

Expand Down

0 comments on commit 1cfdbe9

Please sign in to comment.