spine-framework 0.2.6 → 0.2.8

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.
@@ -99,64 +99,40 @@ async function migrateCommand(options: MigrateOptions): Promise<void> {
99
99
  // Dollar-quoted strings ($$ ... $$ or $tag$ ... $tag$) can contain semicolons
100
100
  // that are NOT statement terminators.
101
101
  function splitSqlStatements(sql: string): string[] {
102
- const statements: string[] = []
103
- let current = ''
104
- let inDollarQuote = false
105
- let dollarTag = ''
106
- let i = 0
107
-
108
- while (i < sql.length) {
109
- if (!inDollarQuote) {
110
- // Check for start of dollar quote: $tag$ or $$
111
- const dollarMatch = sql.slice(i).match(/^(\$[A-Za-z_]*\$)/)
112
- if (dollarMatch) {
113
- inDollarQuote = true
114
- dollarTag = dollarMatch[1]
115
- current += dollarMatch[1]
116
- i += dollarMatch[1].length
117
- continue
118
- }
119
- // Check for statement terminator (semicolon outside dollar quote)
120
- if (sql[i] === ';') {
121
- const stmt = current.trim()
122
- if (stmt.length > 0 && !stmt.startsWith('--')) {
123
- statements.push(stmt + ';')
124
- }
125
- current = ''
126
- i++
127
- continue
128
- }
129
- } else {
130
- // We're inside a dollar-quoted string
131
- // Check for end of dollar quote
132
- if (sql.slice(i, i + dollarTag.length) === dollarTag) {
133
- inDollarQuote = false
134
- current += dollarTag
135
- i += dollarTag.length
136
- continue
137
- }
138
- }
139
- current += sql[i]
140
- i++
141
- }
142
-
143
- // Don't forget the last statement (might not have trailing semicolon)
144
- const last = current.trim()
145
- if (last.length > 0 && !last.startsWith('--')) {
146
- statements.push(last + (last.endsWith(';') ? '' : ';'))
147
- }
148
-
149
- return statements
102
+ const dollarBlocks: string[] = []
103
+ let blockIndex = 0
104
+
105
+ // Step 1: Protect dollar-quoted blocks with placeholders (preserves internal semicolons)
106
+ const protectedSql = sql.replace(/\$[A-Za-z_]*\$[\s\S]*?\$[A-Za-z_]*\$/g, (match) => {
107
+ const placeholder = `__DOLLAR_BLOCK_${blockIndex}__`
108
+ dollarBlocks[blockIndex] = match
109
+ blockIndex++
110
+ return placeholder
111
+ })
112
+
113
+ // Step 2: Strip single-line comments (prevents semicolons inside -- comments
114
+ // from being treated as statement terminators)
115
+ const noComments = protectedSql.replace(/--[^\n]*/g, '')
116
+
117
+ // Step 3: Split by semicolons, restore dollar blocks, and filter empty statements
118
+ return noComments
119
+ .split(';')
120
+ .map(s => {
121
+ let restored = s.trim()
122
+ // Use function form of replace — prevents JS from interpreting $$ as $
123
+ dollarBlocks.forEach((block, idx) => {
124
+ restored = restored.replace(`__DOLLAR_BLOCK_${idx}__`, () => block)
125
+ })
126
+ return restored
127
+ })
128
+ .filter(s => s.length > 0)
129
+ .map(s => s + ';')
150
130
  }
151
131
 
152
132
  const statements = splitSqlStatements(sql)
153
133
 
154
134
  try {
155
- for (let i = 0; i < statements.length; i++) {
156
- const stmt = statements[i]
157
- if (process.env.SPINE_DEBUG_MIGRATE) {
158
- console.log(`\n [${i + 1}/${statements.length}] ${stmt.substring(0, 60).replace(/\n/g, ' ')}...`)
159
- }
135
+ for (const stmt of statements) {
160
136
  await client.query(stmt)
161
137
  }
162
138
  console.log('✓')
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/migrate.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsKxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAevD"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../.framework/cli/commands/migrate.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8IxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAevD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spine-framework",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "private": false,
5
5
  "description": "Spine — enterprise application framework built on Supabase + Netlify + React",
6
6
  "type": "module",