Skip to content

Commit fd888e8

Browse files
committed
chore: wip
chore: wip
1 parent 1db707e commit fd888e8

File tree

2 files changed

+115
-65
lines changed

2 files changed

+115
-65
lines changed

storage/framework/core/spreadsheets/README.md

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ bun install bun-spreadsheets
2222
Now, you can use it in your project:
2323

2424
```ts
25-
import { createSpreadsheet } from 'bun-spreadsheets'
25+
import { spreadsheet, createSpreadsheet } from 'bun-spreadsheets'
2626

2727
// Create a spreadsheet
2828
const data = {
@@ -34,17 +34,42 @@ const data = {
3434
]
3535
}
3636

37-
// Generate a CSV spreadsheet
38-
const csvSpreadsheet = createSpreadsheet(data, 'csv')
37+
// Generate and manipulate spreadsheets
3938

40-
// Generate an Excel spreadsheet
41-
const excelSpreadsheet = createSpreadsheet(data, 'excel')
39+
// 1. Using createSpreadsheet function
40+
const csvSpreadsheet = createSpreadsheet(data, { type: 'csv' })
41+
const excelSpreadsheet = createSpreadsheet(data, { type: 'excel' })
4242

4343
// Store the spreadsheet to disk
44-
await spreadsheet.store(csvSpreadsheet, 'output.csv')
44+
await csvSpreadsheet.store('output.csv')
4545

4646
// Create a download response
47-
const response = spreadsheet.download(excelSpreadsheet, 'data.xlsx')
47+
const response1 = excelSpreadsheet.download('data.xlsx')
48+
49+
// 2. Using spreadsheet object directly
50+
const csvContent = spreadsheet.generateCSV(data)
51+
await csvContent.store('output2.csv')
52+
53+
const excelContent = spreadsheet.generateExcel(data)
54+
await excelContent.store('output3.xlsx')
55+
56+
// Or chain the methods directly
57+
await spreadsheet.generateCSV(data).store('output4.csv')
58+
await spreadsheet.generateExcel(data).store('output5.xlsx')
59+
60+
// Create a download response for Excel
61+
const response2 = spreadsheet(data).excel().download('data2.xlsx')
62+
63+
// 3. Chaining methods
64+
const response3 = spreadsheet(data).csv().download('data3.csv')
65+
await spreadsheet(data).store('output3.xlsx')
66+
67+
// 4. Accessing raw content
68+
const rawCsvContent = spreadsheet(data).csv().getContent()
69+
const rawExcelContent = spreadsheet(data).excel().getContent()
70+
71+
console.log('CSV Content:', rawCsvContent)
72+
console.log('Excel Content:', rawExcelContent)
4873
```
4974

5075
To view the full documentation, please visit [https://stacksjs.org/docs/bun-spreadsheets](https://stacksjs.org/docs/bun-spreadsheets).

storage/framework/core/spreadsheets/src/index.ts

Lines changed: 83 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -23,74 +23,97 @@ export interface SpreadsheetContent {
2323
type: SpreadsheetType
2424
}
2525

26-
export interface SpreadsheetOptions {
26+
export type SpreadsheetOptions = Partial<{
2727
type: SpreadsheetType
28-
}
28+
}>
2929

3030
export type Spreadsheet = {
31+
(
32+
data: Content,
33+
): {
34+
csv: () => SpreadsheetWrapper
35+
excel: () => SpreadsheetWrapper
36+
store: (path: string) => Promise<void>
37+
generateCSV: () => SpreadsheetWrapper
38+
generateExcel: () => SpreadsheetWrapper
39+
}
3140
create: (data: Content, options: SpreadsheetOptions) => SpreadsheetContent
3241
generate: (data: Content, options: SpreadsheetOptions) => string | Uint8Array
33-
generateCSV: (content: Content) => string | SpreadsheetWrapper
34-
generateExcel: (content: Content) => Uint8Array | SpreadsheetWrapper
42+
generateCSV: (content: Content) => SpreadsheetWrapper
43+
generateExcel: (content: Content) => SpreadsheetWrapper
3544
store: (spreadsheet: SpreadsheetContent, path: string) => Promise<void>
3645
download: (spreadsheet: SpreadsheetContent, filename: string) => Response
3746
}
3847

39-
export const spreadsheet: Spreadsheet = {
40-
generate: (data: Content, options: SpreadsheetOptions = { type: 'csv' }): string | Uint8Array => {
41-
const generators: Record<SpreadsheetType, (content: Content) => string | Uint8Array | SpreadsheetWrapper> = {
42-
csv: spreadsheet.generateCSV,
43-
excel: spreadsheet.generateExcel,
44-
}
45-
46-
const generator = generators[options.type]
47-
48-
if (!generator) {
49-
throw new Error(`Unsupported spreadsheet type: ${options.type}`)
50-
}
51-
52-
const result = generator(data)
53-
if (result instanceof SpreadsheetWrapper) {
54-
return result.getContent()
55-
}
56-
return result
57-
},
58-
59-
create: (data: Content, options: SpreadsheetOptions = { type: 'csv' }): SpreadsheetContent => ({
60-
content: spreadsheet.generate(data, options),
61-
type: options.type,
48+
export const spreadsheet: Spreadsheet = Object.assign(
49+
(data: Content) => ({
50+
csv: () => spreadsheet.generateCSV(data),
51+
excel: () => spreadsheet.generateExcel(data),
52+
store: async (path: string) => {
53+
const type = path.toLowerCase().endsWith('.csv') ? 'csv' : 'excel'
54+
const content = spreadsheet.generate(data, { type })
55+
await spreadsheet.store({ content, type }, path)
56+
},
57+
generateCSV: () => spreadsheet.generateCSV(data),
58+
generateExcel: () => spreadsheet.generateExcel(data),
6259
}),
63-
64-
generateCSV: (content: Content): string | SpreadsheetWrapper => {
65-
const csvContent = generateCSVContent(content)
66-
return new SpreadsheetWrapper(csvContent, 'csv')
67-
},
68-
69-
generateExcel: (content: Content): Uint8Array | SpreadsheetWrapper => {
70-
const excelContent = generateExcelContent(content)
71-
return new SpreadsheetWrapper(excelContent, 'excel')
72-
},
73-
74-
store: async ({ content }: SpreadsheetContent, path: string): Promise<void> => {
75-
try {
76-
await Bun.write(path, content)
77-
} catch (error) {
78-
throw new Error(`Failed to store spreadsheet: ${(error as Error).message}`)
79-
}
60+
{
61+
generate: (data: Content, options: SpreadsheetOptions = { type: 'csv' }): string | Uint8Array => {
62+
const generators: Record<SpreadsheetType, (content: Content) => string | Uint8Array | SpreadsheetWrapper> = {
63+
csv: spreadsheet.generateCSV,
64+
excel: spreadsheet.generateExcel,
65+
}
66+
67+
const generator = generators[options.type || 'csv']
68+
69+
if (!generator) {
70+
throw new Error(`Unsupported spreadsheet type: ${options.type}`)
71+
}
72+
73+
const result = generator(data)
74+
if (result instanceof SpreadsheetWrapper) {
75+
return result.getContent()
76+
}
77+
78+
return result
79+
},
80+
81+
create: (data: Content, options: SpreadsheetOptions = { type: 'csv' }): SpreadsheetContent => ({
82+
content: spreadsheet.generate(data, options),
83+
type: options.type || 'csv',
84+
}),
85+
86+
generateCSV: (content: Content): SpreadsheetWrapper => {
87+
const csvContent = generateCSVContent(content)
88+
return new SpreadsheetWrapper(csvContent, 'csv')
89+
},
90+
91+
generateExcel: (content: Content): SpreadsheetWrapper => {
92+
const excelContent = generateExcelContent(content)
93+
return new SpreadsheetWrapper(excelContent, 'excel')
94+
},
95+
96+
store: async ({ content }: SpreadsheetContent, path: string): Promise<void> => {
97+
try {
98+
await Bun.write(path, content)
99+
} catch (error) {
100+
throw new Error(`Failed to store spreadsheet: ${(error as Error).message}`)
101+
}
102+
},
103+
104+
download: ({ content, type }: SpreadsheetContent, filename: string): Response => {
105+
const mimeType = type === 'csv' ? 'text/csv' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
106+
const blob = new Blob([content], { type: mimeType })
107+
108+
return new Response(blob, {
109+
headers: {
110+
'Content-Type': mimeType,
111+
'Content-Disposition': `attachment; filename="${filename}"`,
112+
},
113+
})
114+
},
80115
},
81-
82-
download: ({ content, type }: SpreadsheetContent, filename: string): Response => {
83-
const mimeType = type === 'csv' ? 'text/csv' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
84-
const blob = new Blob([content], { type: mimeType })
85-
86-
return new Response(blob, {
87-
headers: {
88-
'Content-Type': mimeType,
89-
'Content-Disposition': `attachment; filename="${filename}"`,
90-
},
91-
})
92-
},
93-
}
116+
)
94117

95118
export class SpreadsheetWrapper {
96119
constructor(
@@ -113,11 +136,13 @@ export class SpreadsheetWrapper {
113136

114137
export function createSpreadsheet(data: Content, options: SpreadsheetOptions = { type: 'csv' }): SpreadsheetWrapper {
115138
const content = spreadsheet.generate(data, options)
116-
return new SpreadsheetWrapper(content, options.type)
139+
140+
return new SpreadsheetWrapper(content, options.type || 'csv')
117141
}
118142

119143
export function generateCSVContent(content: Content): string {
120144
const rows = [content.headings, ...content.data]
145+
121146
return rows.map((row) => row.join(',')).join('\n')
122147
}
123148

0 commit comments

Comments
 (0)