@syncular/migrations 0.0.1 → 0.0.2-126
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.
- package/README.md +37 -0
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +100 -3
- package/dist/define.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/runner.js +2 -2
- package/package.json +25 -3
- package/src/define.ts +116 -3
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# @syncular/migrations
|
|
2
|
+
|
|
3
|
+
Versioned migration utilities for Syncular apps. Provides `defineMigrations()` and `runMigrations()` with migration tracking and checksum validation (plus an optional reset strategy for client DBs).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @syncular/migrations
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { defineMigrations, runMigrations } from '@syncular/migrations';
|
|
15
|
+
|
|
16
|
+
export const migrations = defineMigrations({
|
|
17
|
+
v1: async (db) => {
|
|
18
|
+
await db.schema.createTable('tasks').addColumn('id', 'text').execute();
|
|
19
|
+
},
|
|
20
|
+
v2: async (db) => {
|
|
21
|
+
await db.schema.alterTable('tasks').addColumn('done', 'integer').execute();
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
await runMigrations({ db, migrations });
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Documentation
|
|
29
|
+
|
|
30
|
+
- Schema migrations: https://syncular.dev/docs/build/migrations
|
|
31
|
+
|
|
32
|
+
## Links
|
|
33
|
+
|
|
34
|
+
- GitHub: https://github.com/syncular/syncular
|
|
35
|
+
- Issues: https://github.com/syncular/syncular/issues
|
|
36
|
+
|
|
37
|
+
> Status: Alpha. APIs and storage layouts may change between releases.
|
package/dist/define.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EACf,eAAe,EAChB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EACf,eAAe,EAChB,MAAM,SAAS,CAAC;AAwJjB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,GAAG,OAAO,EACZ,CAAC,SAAS,eAAe,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC,EACnD,mBAAmB,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,CA0C/C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EACrC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,GAC7B,MAAM,CAER"}
|
package/dist/define.js
CHANGED
|
@@ -17,10 +17,107 @@ function parseVersionKey(key) {
|
|
|
17
17
|
* Strips comments and collapses whitespace so that formatting-only
|
|
18
18
|
* changes don't break checksums.
|
|
19
19
|
*/
|
|
20
|
+
function stripCommentsPreservingStrings(source) {
|
|
21
|
+
let out = '';
|
|
22
|
+
let i = 0;
|
|
23
|
+
let mode = 'code';
|
|
24
|
+
while (i < source.length) {
|
|
25
|
+
const char = source[i];
|
|
26
|
+
const next = source[i + 1];
|
|
27
|
+
if (mode === 'lineComment') {
|
|
28
|
+
if (char === '\n') {
|
|
29
|
+
out += '\n';
|
|
30
|
+
mode = 'code';
|
|
31
|
+
}
|
|
32
|
+
i += 1;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (mode === 'blockComment') {
|
|
36
|
+
if (char === '*' && next === '/') {
|
|
37
|
+
i += 2;
|
|
38
|
+
mode = 'code';
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (char === '\n') {
|
|
42
|
+
out += '\n';
|
|
43
|
+
}
|
|
44
|
+
i += 1;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (mode === 'singleQuote') {
|
|
48
|
+
out += char;
|
|
49
|
+
if (char === '\\' && next !== undefined) {
|
|
50
|
+
out += next;
|
|
51
|
+
i += 2;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (char === "'") {
|
|
55
|
+
mode = 'code';
|
|
56
|
+
}
|
|
57
|
+
i += 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (mode === 'doubleQuote') {
|
|
61
|
+
out += char;
|
|
62
|
+
if (char === '\\' && next !== undefined) {
|
|
63
|
+
out += next;
|
|
64
|
+
i += 2;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (char === '"') {
|
|
68
|
+
mode = 'code';
|
|
69
|
+
}
|
|
70
|
+
i += 1;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (mode === 'template') {
|
|
74
|
+
out += char;
|
|
75
|
+
if (char === '\\' && next !== undefined) {
|
|
76
|
+
out += next;
|
|
77
|
+
i += 2;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (char === '`') {
|
|
81
|
+
mode = 'code';
|
|
82
|
+
}
|
|
83
|
+
i += 1;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (char === '/' && next === '/') {
|
|
87
|
+
mode = 'lineComment';
|
|
88
|
+
i += 2;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (char === '/' && next === '*') {
|
|
92
|
+
mode = 'blockComment';
|
|
93
|
+
i += 2;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (char === "'") {
|
|
97
|
+
mode = 'singleQuote';
|
|
98
|
+
out += char;
|
|
99
|
+
i += 1;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (char === '"') {
|
|
103
|
+
mode = 'doubleQuote';
|
|
104
|
+
out += char;
|
|
105
|
+
i += 1;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (char === '`') {
|
|
109
|
+
mode = 'template';
|
|
110
|
+
out += char;
|
|
111
|
+
i += 1;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
out += char;
|
|
115
|
+
i += 1;
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
20
119
|
function normalizeSource(source) {
|
|
21
|
-
return source
|
|
22
|
-
.replace(/\/\/[^\n]*/g, '') // strip // comments
|
|
23
|
-
.replace(/\/\*[\s\S]*?\*\//g, '') // strip /* */ comments
|
|
120
|
+
return stripCommentsPreservingStrings(source)
|
|
24
121
|
.replace(/\s+/g, ' ') // collapse whitespace
|
|
25
122
|
.trim();
|
|
26
123
|
}
|
package/dist/define.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW,EAAiB;IACnD,oCAAoC;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAAA,CAC/C;AAED;;;;GAIG;AACH,SAAS,
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW,EAAiB;IACnD,oCAAoC;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAAA,CAC/C;AAED;;;;GAIG;AACH,SAAS,8BAA8B,CAAC,MAAc,EAAU;IAC9D,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,IAAI,GAMa,MAAM,CAAC;IAE5B,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,GAAG,IAAI,IAAI,CAAC;gBACZ,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,CAAC,IAAI,CAAC,CAAC;gBACP,IAAI,GAAG,MAAM,CAAC;gBACd,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,GAAG,IAAI,IAAI,CAAC;YACd,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,GAAG,IAAI,IAAI,CAAC;YACZ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,GAAG,IAAI,IAAI,CAAC;gBACZ,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,GAAG,IAAI,IAAI,CAAC;YACZ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,GAAG,IAAI,IAAI,CAAC;gBACZ,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,GAAG,IAAI,IAAI,CAAC;YACZ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,GAAG,IAAI,IAAI,CAAC;gBACZ,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,IAAI,GAAG,aAAa,CAAC;YACrB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,IAAI,GAAG,cAAc,CAAC;YACtB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,GAAG,aAAa,CAAC;YACrB,GAAG,IAAI,IAAI,CAAC;YACZ,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,GAAG,aAAa,CAAC;YACrB,GAAG,IAAI,IAAI,CAAC;YACZ,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,GAAG,UAAU,CAAC;YAClB,GAAG,IAAI,IAAI,CAAC;YACZ,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,GAAG,IAAI,IAAI,CAAC;QACZ,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,OAAO,GAAG,CAAC;AAAA,CACZ;AAED,SAAS,eAAe,CAAC,MAAc,EAAU;IAC/C,OAAO,8BAA8B,CAAC,MAAM,CAAC;SAC1C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,sBAAsB;SAC3C,IAAI,EAAE,CAAC;AAAA,CACX;AAED;;;GAGG;AACH,SAAS,eAAe,CAAK,EAAmB,EAAU;IACxD,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAAA,CAC3C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gBAAgB,CAG9B,mBAAsB,EAAyB;IAC/C,MAAM,UAAU,GAA0B,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,0BAA0B,GAAG,0DAA0D,CACxF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,6BAA6B,OAAO,yBAAyB,CAC9D,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,IAAI,CAAC;YACd,OAAO;YACP,IAAI,EAAE,GAAG;YACT,EAAE;SACH,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAEjD,+BAA+B;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAClB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,OAAO;QACL,UAAU;QACV,cAAc;QACd,YAAY,CAAC,OAAe,EAAE;YAC5B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QAAA,CACtD;KACF,CAAC;AAAA,CACH;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAA8B,EACtB;IACR,OAAO,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAAA,CACtC"}
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides migration definition, tracking, and execution.
|
|
5
5
|
*/
|
|
6
|
-
export * from './define';
|
|
7
|
-
export * from './runner';
|
|
8
|
-
export * from './tracking';
|
|
9
|
-
export * from './types';
|
|
6
|
+
export * from './define.js';
|
|
7
|
+
export * from './runner.js';
|
|
8
|
+
export * from './tracking.js';
|
|
9
|
+
export * from './types.js';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
package/dist/runner.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @syncular/migrations - Migration runner
|
|
3
3
|
*/
|
|
4
|
-
import { getMigrationChecksum } from './define';
|
|
5
|
-
import { clearAppliedMigrations, ensureTrackingTable, getAppliedMigrations, recordAppliedMigration, } from './tracking';
|
|
4
|
+
import { getMigrationChecksum } from './define.js';
|
|
5
|
+
import { clearAppliedMigrations, ensureTrackingTable, getAppliedMigrations, recordAppliedMigration, } from './tracking.js';
|
|
6
6
|
const DEFAULT_TRACKING_TABLE = 'sync_migration_state';
|
|
7
7
|
/**
|
|
8
8
|
* Run pending migrations and track their state.
|
package/package.json
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/migrations",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2-126",
|
|
4
|
+
"description": "Database migration utilities for Syncular",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Benjamin Kniffler",
|
|
7
|
+
"homepage": "https://syncular.dev",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/syncular/syncular.git",
|
|
11
|
+
"directory": "packages/migrations"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/syncular/syncular/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"sync",
|
|
18
|
+
"offline-first",
|
|
19
|
+
"realtime",
|
|
20
|
+
"database",
|
|
21
|
+
"typescript",
|
|
22
|
+
"migrations",
|
|
23
|
+
"database"
|
|
24
|
+
],
|
|
4
25
|
"private": false,
|
|
5
26
|
"publishConfig": {
|
|
6
27
|
"access": "public"
|
|
@@ -18,13 +39,14 @@
|
|
|
18
39
|
"scripts": {
|
|
19
40
|
"test": "bun test --pass-with-no-tests",
|
|
20
41
|
"tsgo": "tsgo --noEmit",
|
|
21
|
-
"build": "
|
|
42
|
+
"build": "tsgo",
|
|
43
|
+
"release": "bunx syncular-publish"
|
|
22
44
|
},
|
|
23
45
|
"peerDependencies": {
|
|
24
46
|
"kysely": "^0.28.0"
|
|
25
47
|
},
|
|
26
48
|
"devDependencies": {
|
|
27
|
-
"@syncular/config": "
|
|
49
|
+
"@syncular/config": "0.0.0",
|
|
28
50
|
"kysely": "*"
|
|
29
51
|
},
|
|
30
52
|
"files": [
|
package/src/define.ts
CHANGED
|
@@ -25,10 +25,123 @@ function parseVersionKey(key: string): number | null {
|
|
|
25
25
|
* Strips comments and collapses whitespace so that formatting-only
|
|
26
26
|
* changes don't break checksums.
|
|
27
27
|
*/
|
|
28
|
+
function stripCommentsPreservingStrings(source: string): string {
|
|
29
|
+
let out = '';
|
|
30
|
+
let i = 0;
|
|
31
|
+
let mode:
|
|
32
|
+
| 'code'
|
|
33
|
+
| 'singleQuote'
|
|
34
|
+
| 'doubleQuote'
|
|
35
|
+
| 'template'
|
|
36
|
+
| 'lineComment'
|
|
37
|
+
| 'blockComment' = 'code';
|
|
38
|
+
|
|
39
|
+
while (i < source.length) {
|
|
40
|
+
const char = source[i]!;
|
|
41
|
+
const next = source[i + 1];
|
|
42
|
+
|
|
43
|
+
if (mode === 'lineComment') {
|
|
44
|
+
if (char === '\n') {
|
|
45
|
+
out += '\n';
|
|
46
|
+
mode = 'code';
|
|
47
|
+
}
|
|
48
|
+
i += 1;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (mode === 'blockComment') {
|
|
53
|
+
if (char === '*' && next === '/') {
|
|
54
|
+
i += 2;
|
|
55
|
+
mode = 'code';
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (char === '\n') {
|
|
59
|
+
out += '\n';
|
|
60
|
+
}
|
|
61
|
+
i += 1;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (mode === 'singleQuote') {
|
|
66
|
+
out += char;
|
|
67
|
+
if (char === '\\' && next !== undefined) {
|
|
68
|
+
out += next;
|
|
69
|
+
i += 2;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (char === "'") {
|
|
73
|
+
mode = 'code';
|
|
74
|
+
}
|
|
75
|
+
i += 1;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (mode === 'doubleQuote') {
|
|
80
|
+
out += char;
|
|
81
|
+
if (char === '\\' && next !== undefined) {
|
|
82
|
+
out += next;
|
|
83
|
+
i += 2;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (char === '"') {
|
|
87
|
+
mode = 'code';
|
|
88
|
+
}
|
|
89
|
+
i += 1;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (mode === 'template') {
|
|
94
|
+
out += char;
|
|
95
|
+
if (char === '\\' && next !== undefined) {
|
|
96
|
+
out += next;
|
|
97
|
+
i += 2;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (char === '`') {
|
|
101
|
+
mode = 'code';
|
|
102
|
+
}
|
|
103
|
+
i += 1;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (char === '/' && next === '/') {
|
|
108
|
+
mode = 'lineComment';
|
|
109
|
+
i += 2;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (char === '/' && next === '*') {
|
|
113
|
+
mode = 'blockComment';
|
|
114
|
+
i += 2;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (char === "'") {
|
|
118
|
+
mode = 'singleQuote';
|
|
119
|
+
out += char;
|
|
120
|
+
i += 1;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (char === '"') {
|
|
124
|
+
mode = 'doubleQuote';
|
|
125
|
+
out += char;
|
|
126
|
+
i += 1;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (char === '`') {
|
|
130
|
+
mode = 'template';
|
|
131
|
+
out += char;
|
|
132
|
+
i += 1;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
out += char;
|
|
137
|
+
i += 1;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
|
|
28
143
|
function normalizeSource(source: string): string {
|
|
29
|
-
return source
|
|
30
|
-
.replace(/\/\/[^\n]*/g, '') // strip // comments
|
|
31
|
-
.replace(/\/\*[\s\S]*?\*\//g, '') // strip /* */ comments
|
|
144
|
+
return stripCommentsPreservingStrings(source)
|
|
32
145
|
.replace(/\s+/g, ' ') // collapse whitespace
|
|
33
146
|
.trim();
|
|
34
147
|
}
|