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
|
|
103
|
-
let
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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 (
|
|
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;
|
|
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"}
|