@crowi/api 2.0.0-alpha.2 → 2.0.0-alpha.3
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/dist/collab/attach.d.ts +34 -10
- package/dist/collab/attach.js +77 -1
- package/dist/collab/attach.js.map +1 -1
- package/dist/crowi/index.js +7 -6
- package/dist/crowi/index.js.map +1 -1
- package/dist/hono/handlers/page-collab.js +4 -0
- package/dist/hono/handlers/page-collab.js.map +1 -1
- package/dist/migration/cli-api.d.ts +8 -1
- package/dist/migration/cli-api.js +2 -0
- package/dist/migration/cli-api.js.map +1 -1
- package/dist/migration/migrations/code-mask.d.ts +76 -0
- package/dist/migration/migrations/code-mask.js +224 -0
- package/dist/migration/migrations/code-mask.js.map +1 -0
- package/dist/migration/migrations/files-url-to-attachments.d.ts +65 -1
- package/dist/migration/migrations/files-url-to-attachments.js +15 -1
- package/dist/migration/migrations/files-url-to-attachments.js.map +1 -1
- package/dist/migration/migrations/page-status-default.d.ts +31 -1
- package/dist/migration/migrations/relocate-reserved-api-paths.d.ts +37 -1
- package/dist/migration/migrations/relocate-reserved-api-paths.js +11 -3
- package/dist/migration/migrations/relocate-reserved-api-paths.js.map +1 -1
- package/dist/migration/migrations/revisions-schema-unify.d.ts +35 -1
- package/dist/migration/migrations/user-unique-prepare.d.ts +55 -1
- package/dist/migration/migrations/user-unique-prepare.js +5 -0
- package/dist/migration/migrations/user-unique-prepare.js.map +1 -1
- package/dist/migration/migrations/wikilink-format.d.ts +75 -1
- package/dist/migration/migrations/wikilink-format.js +18 -1
- package/dist/migration/migrations/wikilink-format.js.map +1 -1
- package/dist/migration/migrations/wikilink-html-recover.d.ts +76 -1
- package/dist/migration/migrations/wikilink-html-recover.js +33 -7
- package/dist/migration/migrations/wikilink-html-recover.js.map +1 -1
- package/dist/migration/registry.d.ts +8 -2
- package/dist/migration/registry.js +5 -1
- package/dist/migration/registry.js.map +1 -1
- package/dist/migration/run-boot-migrations.d.ts +4 -1
- package/dist/migration/run-boot-migrations.js +55 -23
- package/dist/migration/run-boot-migrations.js.map +1 -1
- package/dist/migration/runner.js +8 -1
- package/dist/migration/runner.js.map +1 -1
- package/dist/migration/types.d.ts +57 -5
- package/dist/migration/types.js.map +1 -1
- package/dist/models/page.d.ts +20 -3
- package/dist/models/page.js +60 -5
- package/dist/models/page.js.map +1 -1
- package/dist/plugin/plugin-manager.js +1 -1
- package/dist/renderer/registry.js +1 -1
- package/dist/util/ws-token.d.ts +13 -0
- package/dist/util/ws-token.js +43 -3
- package/dist/util/ws-token.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-unique-prepare.js","sourceRoot":"","sources":["../../../src/migration/migrations/user-unique-prepare.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"user-unique-prepare.js","sourceRoot":"","sources":["../../../src/migration/migrations/user-unique-prepare.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { MigrationContext } from '../types';
|
|
1
2
|
/**
|
|
2
3
|
* RFC-0008 §10.2 step 4 / §4.3.1 — `wikilink-format` (preflight layer).
|
|
3
4
|
*
|
|
@@ -72,6 +73,13 @@ export interface WikilinkOccurrence {
|
|
|
72
73
|
* occurrence list so callers don't walk the regex twice. `body` is returned by
|
|
73
74
|
* reference when nothing changed, letting callers cheap-skip via
|
|
74
75
|
* `result.body === body`. Pure function — no side effects, no I/O.
|
|
76
|
+
*
|
|
77
|
+
* Code regions (fenced blocks + inline spans) are excluded: `</…>` written as a
|
|
78
|
+
* code example is left byte-identical, so it is never misdetected as a v1
|
|
79
|
+
* wikilink. We run the detection regex only on the non-`code` segments via the
|
|
80
|
+
* shared `rewriteOutsideCode` primitive, re-joining in original order
|
|
81
|
+
* (segment-and-rewrite — see `code-mask.ts` for why this beats a fill/restore
|
|
82
|
+
* scheme). Indented code blocks are an accepted divergence (still rewritten).
|
|
75
83
|
*/
|
|
76
84
|
export declare function rewriteAndDetect(body: string): {
|
|
77
85
|
body: string;
|
|
@@ -83,4 +91,70 @@ export declare function rewriteAndDetect(body: string): {
|
|
|
83
91
|
* twice.
|
|
84
92
|
*/
|
|
85
93
|
export declare function rewriteWikilinks(body: string): string;
|
|
86
|
-
export declare const wikilinkFormat:
|
|
94
|
+
export declare const wikilinkFormat: {
|
|
95
|
+
id: string;
|
|
96
|
+
fromVersion: string;
|
|
97
|
+
toVersion: string;
|
|
98
|
+
layer: "preflight";
|
|
99
|
+
severity: "cosmetic";
|
|
100
|
+
description: string;
|
|
101
|
+
/**
|
|
102
|
+
* Pending verdict = at least one published page whose **current** revision
|
|
103
|
+
* body still contains a genuine legacy wikilink. Two constraints shape this:
|
|
104
|
+
*
|
|
105
|
+
* 1. The verdict uses the **full detection rule**, not the bare substring.
|
|
106
|
+
* A v1 wikilink (`</docs/api>`) and an HTML close tag (`</div>`) both
|
|
107
|
+
* start with `</`, and there is no index on `revision.body`, so an
|
|
108
|
+
* index-backed O(1) probe is impossible without a text index (which §9
|
|
109
|
+
* says the framework does not own). We therefore walk published pages and
|
|
110
|
+
* run `bodyHasRewritableWikilink` (the same `shouldRewriteWikilink` filter
|
|
111
|
+
* used by `detect`/stage) on each current-revision body. `</` is kept only
|
|
112
|
+
* as a cheap prefilter inside that helper to skip the regex on bodies that
|
|
113
|
+
* obviously cannot contain a legacy link.
|
|
114
|
+
*
|
|
115
|
+
* This is load-bearing for boot under preflight + `block` (the default):
|
|
116
|
+
* the substring alone would over-match `</div>` and report pending forever
|
|
117
|
+
* even after `migrate apply` — apply rewrites only genuine wikilinks, so
|
|
118
|
+
* HTML close tags survive and a substring verdict would never clear,
|
|
119
|
+
* deadlocking boot (§6.2: a false positive blocks every cluster boot, and
|
|
120
|
+
* here it would be unrecoverable). Using the full rule means once the
|
|
121
|
+
* migration rewrites the genuine wikilinks, a body left with only `</div>`
|
|
122
|
+
* reports false and boot clears.
|
|
123
|
+
* 2. We scan only each page's **current** revision, never the whole
|
|
124
|
+
* `revisions` collection. Historical revisions keep their original
|
|
125
|
+
* `</path>` text forever (revisions are immutable), so a collection-wide
|
|
126
|
+
* scan would report pending permanently after any wikilink page ever
|
|
127
|
+
* existed — even once every live page was rewritten. So we read only the
|
|
128
|
+
* body each page's editor seeds from.
|
|
129
|
+
*
|
|
130
|
+
* We short-circuit at the first page carrying a genuine wikilink, so this
|
|
131
|
+
* stops early rather than reading every page.
|
|
132
|
+
*/
|
|
133
|
+
isPending: (ctx: MigrationContext) => Promise<boolean>;
|
|
134
|
+
/**
|
|
135
|
+
* Full scan for `plan`: count the pages that actually contain a rewritable
|
|
136
|
+
* occurrence (applying the full `shouldRewriteWikilink` rule, not just the
|
|
137
|
+
* substring pre-filter), plus the total occurrence count. Not called at boot.
|
|
138
|
+
*/
|
|
139
|
+
detect: (ctx: MigrationContext) => Promise<{
|
|
140
|
+
summary: string;
|
|
141
|
+
counts: {
|
|
142
|
+
pages: number;
|
|
143
|
+
occurrences: number;
|
|
144
|
+
};
|
|
145
|
+
}>;
|
|
146
|
+
stages: {
|
|
147
|
+
name: string;
|
|
148
|
+
fn: (ctx: MigrationContext) => Promise<{
|
|
149
|
+
name: string;
|
|
150
|
+
transformed: number;
|
|
151
|
+
stats: {
|
|
152
|
+
wouldRewrite: number;
|
|
153
|
+
};
|
|
154
|
+
} | {
|
|
155
|
+
name: string;
|
|
156
|
+
transformed: number;
|
|
157
|
+
stats?: undefined;
|
|
158
|
+
}>;
|
|
159
|
+
}[];
|
|
160
|
+
};
|
|
@@ -9,6 +9,7 @@ const api_contract_1 = require("@crowi/api-contract");
|
|
|
9
9
|
const page_1 = require("../../models/page");
|
|
10
10
|
const helpers_1 = require("../helpers");
|
|
11
11
|
const types_1 = require("../types");
|
|
12
|
+
const code_mask_1 = require("./code-mask");
|
|
12
13
|
/**
|
|
13
14
|
* RFC-0008 §10.2 step 4 / §4.3.1 — `wikilink-format` (preflight layer).
|
|
14
15
|
*
|
|
@@ -101,10 +102,17 @@ function shouldRewriteWikilink(innerPath) {
|
|
|
101
102
|
* occurrence list so callers don't walk the regex twice. `body` is returned by
|
|
102
103
|
* reference when nothing changed, letting callers cheap-skip via
|
|
103
104
|
* `result.body === body`. Pure function — no side effects, no I/O.
|
|
105
|
+
*
|
|
106
|
+
* Code regions (fenced blocks + inline spans) are excluded: `</…>` written as a
|
|
107
|
+
* code example is left byte-identical, so it is never misdetected as a v1
|
|
108
|
+
* wikilink. We run the detection regex only on the non-`code` segments via the
|
|
109
|
+
* shared `rewriteOutsideCode` primitive, re-joining in original order
|
|
110
|
+
* (segment-and-rewrite — see `code-mask.ts` for why this beats a fill/restore
|
|
111
|
+
* scheme). Indented code blocks are an accepted divergence (still rewritten).
|
|
104
112
|
*/
|
|
105
113
|
function rewriteAndDetect(body) {
|
|
106
114
|
const occurrences = [];
|
|
107
|
-
const
|
|
115
|
+
const rewriteSegment = (text) => text.replace(exports.WIKILINK_DETECTION_REGEX, (whole, innerPath, aliasWithPipe) => {
|
|
108
116
|
if (!shouldRewriteWikilink(innerPath))
|
|
109
117
|
return whole;
|
|
110
118
|
occurrences.push({
|
|
@@ -115,6 +123,10 @@ function rewriteAndDetect(body) {
|
|
|
115
123
|
const aliasSegment = aliasWithPipe ?? '';
|
|
116
124
|
return `[[${innerPath}${aliasSegment}]]`;
|
|
117
125
|
});
|
|
126
|
+
const rewritten = (0, code_mask_1.rewriteOutsideCode)(body, rewriteSegment);
|
|
127
|
+
// `rewriteOutsideCode` already returns `body` by reference when nothing
|
|
128
|
+
// changed; the `occurrences.length === 0` guard keeps that explicit so the
|
|
129
|
+
// detect / isPending cheap-skip (`result.body === body`) is unmistakable.
|
|
118
130
|
return { body: occurrences.length === 0 ? body : rewritten, occurrences };
|
|
119
131
|
}
|
|
120
132
|
/**
|
|
@@ -168,6 +180,11 @@ exports.wikilinkFormat = (0, types_1.defineMigration)({
|
|
|
168
180
|
fromVersion: '1.x',
|
|
169
181
|
toVersion: '2.1',
|
|
170
182
|
layer: 'preflight',
|
|
183
|
+
// Body display syntax only; no index / integrity impact. `isPending` scans
|
|
184
|
+
// the live corpus, so new v1-syntax content re-triggers it forever — the
|
|
185
|
+
// BUG 2 deadlock. Cosmetic so a pending verdict only warns, never refuses
|
|
186
|
+
// boot.
|
|
187
|
+
severity: 'cosmetic',
|
|
171
188
|
description: 'Migrate wikilink syntax',
|
|
172
189
|
/**
|
|
173
190
|
* Pending verdict = at least one published page whose **current** revision
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wikilink-format.js","sourceRoot":"","sources":["../../../src/migration/migrations/wikilink-format.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"wikilink-format.js","sourceRoot":"","sources":["../../../src/migration/migrations/wikilink-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { MigrationContext } from '../types';
|
|
1
2
|
/**
|
|
2
3
|
* `wikilink-html-recover` (preflight layer) — undo the `wikilink-format`
|
|
3
4
|
* close-tag misfire.
|
|
@@ -83,11 +84,31 @@ export interface RecoverableOccurrence {
|
|
|
83
84
|
* per-occurrence).
|
|
84
85
|
*/
|
|
85
86
|
export declare function detectRecoverable(body: string): RecoverableOccurrence[];
|
|
87
|
+
/**
|
|
88
|
+
* `detectRecoverable` restricted to the non-code segments of `body`: a
|
|
89
|
+
* `[[/font]]` written as a code example (inside a fence or inline span) is NOT
|
|
90
|
+
* reported, so it never reaches the collision probe / pending verdict and is
|
|
91
|
+
* never reverted to `</font>`. This is the detect-side counterpart of routing
|
|
92
|
+
* the rewrite through `rewriteOutsideCode`; `rewrite` and `detect` are
|
|
93
|
+
* asymmetric (an async per-element collision probe sits between them), so they
|
|
94
|
+
* cannot share one `fn` — `detect` materialises occurrences here instead.
|
|
95
|
+
*
|
|
96
|
+
* `detectRecoverable` resets `lastIndex` at entry, so calling it once per
|
|
97
|
+
* non-code segment is safe (no cross-segment state). AD-1 (a stray backtick
|
|
98
|
+
* straddling `[[/font]]` so the token is absorbed into an inline-code span) is
|
|
99
|
+
* documented in the spec — an accepted false-negative.
|
|
100
|
+
*/
|
|
101
|
+
export declare function detectRecoverableOutsideCode(body: string): RecoverableOccurrence[];
|
|
86
102
|
/**
|
|
87
103
|
* Rewrite `body`, reverting `[[/<x>]]` → `</x>` for every recoverable element.
|
|
88
104
|
* Elements in `skip` (those that collide with a live same-named page) are left
|
|
89
105
|
* untouched. Returns the input by reference when nothing changed so callers can
|
|
90
106
|
* cheap-skip.
|
|
107
|
+
*
|
|
108
|
+
* Code regions (fenced blocks + inline spans) are excluded via the shared
|
|
109
|
+
* `rewriteOutsideCode` primitive: a `[[/font]]` written as a code example is
|
|
110
|
+
* left byte-identical (never reverted) so a migration-doc example cannot be
|
|
111
|
+
* corrupted. The detect side mirrors this via `detectRecoverableOutsideCode`.
|
|
91
112
|
*/
|
|
92
113
|
export declare function rewriteBody(body: string, skip: ReadonlySet<string>): string;
|
|
93
114
|
/**
|
|
@@ -113,4 +134,58 @@ export interface CollisionRecord {
|
|
|
113
134
|
* carried no path.
|
|
114
135
|
*/
|
|
115
136
|
export declare function formatCollisions(collisions: readonly CollisionRecord[]): string;
|
|
116
|
-
export declare const wikilinkHtmlRecover:
|
|
137
|
+
export declare const wikilinkHtmlRecover: {
|
|
138
|
+
id: string;
|
|
139
|
+
fromVersion: string;
|
|
140
|
+
toVersion: string;
|
|
141
|
+
layer: "preflight";
|
|
142
|
+
severity: "cosmetic";
|
|
143
|
+
order: number;
|
|
144
|
+
description: string;
|
|
145
|
+
/**
|
|
146
|
+
* Pending iff at least one published page's current revision body still
|
|
147
|
+
* carries a revertible `[[/<deprecated-tag>]]` whose element has no live
|
|
148
|
+
* same-named page. There is no index on `revision.body`, so this walks
|
|
149
|
+
* published pages (projecting `body`) and short-circuits at the first
|
|
150
|
+
* revertible occurrence.
|
|
151
|
+
*
|
|
152
|
+
* Colliding occurrences (`[[/font]]` with a live `/font` page) do NOT count
|
|
153
|
+
* as pending: this migration will never revert them, so reporting pending
|
|
154
|
+
* for them would block boot forever under preflight + `block`.
|
|
155
|
+
*/
|
|
156
|
+
isPending: (ctx: MigrationContext) => Promise<false>;
|
|
157
|
+
/**
|
|
158
|
+
* Full scan for `plan`: report how many pages / occurrences would be
|
|
159
|
+
* reverted plus, separately, the deprecated-tag names that were left alone
|
|
160
|
+
* because a live same-named page exists (the operator must resolve those
|
|
161
|
+
* by hand). Not called at boot.
|
|
162
|
+
*/
|
|
163
|
+
detect: (ctx: MigrationContext) => Promise<{
|
|
164
|
+
summary: string;
|
|
165
|
+
counts: {
|
|
166
|
+
pages: number;
|
|
167
|
+
occurrences: number;
|
|
168
|
+
collisions: number;
|
|
169
|
+
};
|
|
170
|
+
}>;
|
|
171
|
+
stages: {
|
|
172
|
+
name: string;
|
|
173
|
+
fn: (ctx: MigrationContext) => Promise<{
|
|
174
|
+
name: string;
|
|
175
|
+
transformed: number;
|
|
176
|
+
stats: {
|
|
177
|
+
wouldRevert: number;
|
|
178
|
+
occurrences: number;
|
|
179
|
+
collisions: number;
|
|
180
|
+
};
|
|
181
|
+
} | {
|
|
182
|
+
name: string;
|
|
183
|
+
transformed: number;
|
|
184
|
+
stats: {
|
|
185
|
+
collisions: number;
|
|
186
|
+
wouldRevert?: undefined;
|
|
187
|
+
occurrences?: undefined;
|
|
188
|
+
};
|
|
189
|
+
}>;
|
|
190
|
+
}[];
|
|
191
|
+
};
|
|
@@ -3,10 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.wikilinkHtmlRecover = exports.WIKILINK_HTML_CANDIDATE_REGEX = exports.RECOVERABLE_DEPRECATED_TAGS = void 0;
|
|
4
4
|
exports.shouldRecoverSegment = shouldRecoverSegment;
|
|
5
5
|
exports.detectRecoverable = detectRecoverable;
|
|
6
|
+
exports.detectRecoverableOutsideCode = detectRecoverableOutsideCode;
|
|
6
7
|
exports.rewriteBody = rewriteBody;
|
|
7
8
|
exports.formatCollisions = formatCollisions;
|
|
8
9
|
const page_1 = require("../../models/page");
|
|
9
10
|
const types_1 = require("../types");
|
|
11
|
+
const code_mask_1 = require("./code-mask");
|
|
10
12
|
const published_current_revision_1 = require("./published-current-revision");
|
|
11
13
|
const helpers_1 = require("../helpers");
|
|
12
14
|
/**
|
|
@@ -103,23 +105,44 @@ function detectRecoverable(body) {
|
|
|
103
105
|
}
|
|
104
106
|
return occurrences;
|
|
105
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* `detectRecoverable` restricted to the non-code segments of `body`: a
|
|
110
|
+
* `[[/font]]` written as a code example (inside a fence or inline span) is NOT
|
|
111
|
+
* reported, so it never reaches the collision probe / pending verdict and is
|
|
112
|
+
* never reverted to `</font>`. This is the detect-side counterpart of routing
|
|
113
|
+
* the rewrite through `rewriteOutsideCode`; `rewrite` and `detect` are
|
|
114
|
+
* asymmetric (an async per-element collision probe sits between them), so they
|
|
115
|
+
* cannot share one `fn` — `detect` materialises occurrences here instead.
|
|
116
|
+
*
|
|
117
|
+
* `detectRecoverable` resets `lastIndex` at entry, so calling it once per
|
|
118
|
+
* non-code segment is safe (no cross-segment state). AD-1 (a stray backtick
|
|
119
|
+
* straddling `[[/font]]` so the token is absorbed into an inline-code span) is
|
|
120
|
+
* documented in the spec — an accepted false-negative.
|
|
121
|
+
*/
|
|
122
|
+
function detectRecoverableOutsideCode(body) {
|
|
123
|
+
return (0, code_mask_1.splitCodeSegments)(body)
|
|
124
|
+
.filter((s) => !s.code)
|
|
125
|
+
.flatMap((s) => detectRecoverable(s.text));
|
|
126
|
+
}
|
|
106
127
|
/**
|
|
107
128
|
* Rewrite `body`, reverting `[[/<x>]]` → `</x>` for every recoverable element.
|
|
108
129
|
* Elements in `skip` (those that collide with a live same-named page) are left
|
|
109
130
|
* untouched. Returns the input by reference when nothing changed so callers can
|
|
110
131
|
* cheap-skip.
|
|
132
|
+
*
|
|
133
|
+
* Code regions (fenced blocks + inline spans) are excluded via the shared
|
|
134
|
+
* `rewriteOutsideCode` primitive: a `[[/font]]` written as a code example is
|
|
135
|
+
* left byte-identical (never reverted) so a migration-doc example cannot be
|
|
136
|
+
* corrupted. The detect side mirrors this via `detectRecoverableOutsideCode`.
|
|
111
137
|
*/
|
|
112
138
|
function rewriteBody(body, skip) {
|
|
113
|
-
|
|
114
|
-
const rewritten = body.replace(exports.WIKILINK_HTML_CANDIDATE_REGEX, (whole, segment) => {
|
|
139
|
+
return (0, code_mask_1.rewriteOutsideCode)(body, (text) => text.replace(exports.WIKILINK_HTML_CANDIDATE_REGEX, (whole, segment) => {
|
|
115
140
|
if (!shouldRecoverSegment(segment))
|
|
116
141
|
return whole;
|
|
117
142
|
if (skip.has(segment))
|
|
118
143
|
return whole;
|
|
119
|
-
changed = true;
|
|
120
144
|
return `</${segment}>`;
|
|
121
|
-
});
|
|
122
|
-
return changed ? rewritten : body;
|
|
145
|
+
}));
|
|
123
146
|
}
|
|
124
147
|
/**
|
|
125
148
|
* A memoised live-content `/<element>` existence probe. The probe restricts to
|
|
@@ -165,7 +188,7 @@ async function scan(ctx) {
|
|
|
165
188
|
if (typeof body !== 'string' || !body.includes('[[/'))
|
|
166
189
|
return;
|
|
167
190
|
const pagePath = typeof revision.path === 'string' ? revision.path : undefined;
|
|
168
|
-
const occurrences =
|
|
191
|
+
const occurrences = detectRecoverableOutsideCode(body);
|
|
169
192
|
if (occurrences.length === 0)
|
|
170
193
|
return;
|
|
171
194
|
// Partition this page's elements into collide-skip vs revertible. Each
|
|
@@ -225,6 +248,9 @@ exports.wikilinkHtmlRecover = (0, types_1.defineMigration)({
|
|
|
225
248
|
fromVersion: '2.1',
|
|
226
249
|
toVersion: '2.1',
|
|
227
250
|
layer: 'preflight',
|
|
251
|
+
// HTML close-tag repair only; no index impact. `isPending` walks the live
|
|
252
|
+
// corpus → re-triggers on new content. Cosmetic (see `severity`).
|
|
253
|
+
severity: 'cosmetic',
|
|
228
254
|
// `fromVersion: '2.1'` already sequences this after `wikilink-format`
|
|
229
255
|
// (`fromVersion: '1.x'`) — the registry orders by `fromVersion` FIRST
|
|
230
256
|
// (registry.ts compareMigrations), so the misfire's source is registered
|
|
@@ -251,7 +277,7 @@ exports.wikilinkHtmlRecover = (0, types_1.defineMigration)({
|
|
|
251
277
|
const body = revision.body;
|
|
252
278
|
if (typeof body !== 'string' || !body.includes('[[/'))
|
|
253
279
|
return;
|
|
254
|
-
for (const occ of
|
|
280
|
+
for (const occ of detectRecoverableOutsideCode(body)) {
|
|
255
281
|
if (!(await pageExists(occ.element))) {
|
|
256
282
|
pending = true;
|
|
257
283
|
return published_current_revision_1.STOP;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wikilink-html-recover.js","sourceRoot":"","sources":["../../../src/migration/migrations/wikilink-html-recover.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"wikilink-html-recover.js","sourceRoot":"","sources":["../../../src/migration/migrations/wikilink-html-recover.ts"],"names":[],"mappings":";;;AAgFA,oDAGC;AAgBD,8CAYC;AAgBD,oEAIC;AAaD,kCAQC;AAuHD,4CAeC;AA9RD,0CAAmE;AAEnE,oCAA2C;AAC3C,2CAAoE;AACpE,6EAAqF;AACrF,wCAAiD;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH;;;;;;GAMG;AACU,QAAA,2BAA2B,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1H;;;;;;GAMG;AACU,QAAA,6BAA6B,GAAG,wBAAwB,CAAC;AAEtE;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,OAAe;IAClD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,mCAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAUD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,MAAM,WAAW,GAA4B,EAAE,CAAC;IAChD,qCAA6B,CAAC,SAAS,GAAG,CAAC,CAAC;IAC5C,IAAI,KAAK,GAAG,qCAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,GAAG,qCAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,4BAA4B,CAAC,IAAY;IACvD,OAAO,IAAA,6BAAiB,EAAC,IAAI,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SACtB,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,WAAW,CAAC,IAAY,EAAE,IAAyB;IACjE,OAAO,IAAA,8BAAkB,EAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACvC,IAAI,CAAC,OAAO,CAAC,qCAA6B,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QACrE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,KAAK,OAAO,GAAG,CAAC;IACzB,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAoCD;;;;;;;;;;;;;;GAcG;AACH,SAAS,mBAAmB,CAAC,IAAe;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACzC,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,uBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5I,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,IAAI,CAAC,GAAqB;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE7C,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAE9B,MAAM,IAAA,4DAA+B,EAAC,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QACrG,MAAM,IAAI,GAAI,QAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO;QAC9D,MAAM,QAAQ,GAAG,OAAQ,QAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,QAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7H,MAAM,WAAW,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErC,uEAAuE;QACvE,wEAAwE;QACxE,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;oBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACtB,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,YAAY,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,YAAY,KAAK,CAAC;YAAE,OAAO;QAE/B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/B,qBAAqB,IAAI,YAAY,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,gBAAgB,CAAC,UAAsC;IACrE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;SAC5B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAEY,QAAA,mBAAmB,GAAG,IAAA,uBAAe,EAAC;IACjD,EAAE,EAAE,uBAAuB;IAC3B,WAAW,EAAE,KAAK;IAClB,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,WAAW;IAClB,0EAA0E;IAC1E,kEAAkE;IAClE,QAAQ,EAAE,UAAU;IACpB,sEAAsE;IACtE,sEAAsE;IACtE,yEAAyE;IACzE,uEAAuE;IACvE,6CAA6C;IAC7C,KAAK,EAAE,GAAG;IACV,WAAW,EAAE,yGAAyG;IAEtH;;;;;;;;;;OAUG;IACH,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAA,4DAA+B,EAAC,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACxF,MAAM,IAAI,GAAI,QAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO;YAC9D,KAAK,MAAM,GAAG,IAAI,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACrC,OAAO,GAAG,IAAI,CAAC;oBACf,OAAO,iCAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,MAAM,gDAAgD,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtJ,OAAO;YACL,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,iBAAiB,qBAAqB,iCAAiC,aAAa,EAAE;YAC7G,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,WAAW,EAAE,qBAAqB;gBAClC,UAAU,EAAE,SAAS,CAAC,MAAM;aAC7B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,EAAE;QACN;YACE,IAAI,EAAE,yBAAyB;YAC/B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAChB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;oBACf,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC3E,OAAO;wBACL,IAAI,EAAE,yBAAyB;wBAC/B,WAAW,EAAE,CAAC;wBACd,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,iBAAiB,CAAC,IAAI,EAAE;qBAC5G,CAAC;gBACJ,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,IAAA,6BAAmB,EAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;gBAC7E,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEnC,IAAI,QAAQ,GAAG,CAAC,CAAC;gBACjB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;oBACxB,MAAM,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;oBAC/E,QAAQ,IAAI,CAAC,CAAC;oBACd,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAC3B,CAAC;gBAED,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACjB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sDAAsD,QAAQ,yDAAyD,CAAC,CAAC;gBAC3I,CAAC;gBACD,IAAI,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,+BAA+B,iBAAiB,CAAC,IAAI,2DAA2D,gBAAgB,CAC9H,UAAU,CACX,+CAA+C,CACjD,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC;YACnH,CAAC;SACF;KACF;CACF,CAAC,CAAC"}
|
|
@@ -4,8 +4,14 @@ export declare class MigrationRegistry {
|
|
|
4
4
|
constructor(defs: MigrationDefinition[]);
|
|
5
5
|
/** All migrations in version-range + `order` sequence. */
|
|
6
6
|
all(): readonly MigrationDefinition[];
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Migrations of a given layer, in order. The return type narrows by the
|
|
9
|
+
* `layer` literal so `byLayer('preflight')` yields `severity`-bearing
|
|
10
|
+
* definitions (and `byLayer('boot')` ones without).
|
|
11
|
+
*/
|
|
12
|
+
byLayer<L extends MigrationLayer>(layer: L): readonly Extract<MigrationDefinition, {
|
|
13
|
+
layer: L;
|
|
14
|
+
}>[];
|
|
9
15
|
/** Look up a migration by id, or undefined. */
|
|
10
16
|
get(id: string): MigrationDefinition | undefined;
|
|
11
17
|
/** The latest reachable target version across all registered migrations. */
|
|
@@ -73,7 +73,11 @@ class MigrationRegistry {
|
|
|
73
73
|
all() {
|
|
74
74
|
return this.migrations;
|
|
75
75
|
}
|
|
76
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Migrations of a given layer, in order. The return type narrows by the
|
|
78
|
+
* `layer` literal so `byLayer('preflight')` yields `severity`-bearing
|
|
79
|
+
* definitions (and `byLayer('boot')` ones without).
|
|
80
|
+
*/
|
|
77
81
|
byLayer(layer) {
|
|
78
82
|
return this.migrations.filter((m) => m.layer === layer);
|
|
79
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migration/registry.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migration/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,10 @@ export interface RunBootMigrationsOptions {
|
|
|
25
25
|
}
|
|
26
26
|
export interface RunBootMigrationsResult {
|
|
27
27
|
appliedBootIds: string[];
|
|
28
|
-
|
|
28
|
+
/** Pending `severity:'blocking'` preflight migrations (gate boot under `block`). */
|
|
29
|
+
pendingBlockingIds: string[];
|
|
30
|
+
/** Pending `severity:'cosmetic'` preflight migrations (never gate boot). */
|
|
31
|
+
pendingCosmeticIds: string[];
|
|
29
32
|
policy: PreflightUnappliedPolicy;
|
|
30
33
|
}
|
|
31
34
|
export declare function runBootMigrations(crowi: Crowi, options?: RunBootMigrationsOptions): Promise<RunBootMigrationsResult>;
|
|
@@ -13,21 +13,25 @@ const runner_1 = require("./runner");
|
|
|
13
13
|
* 1. Apply every `layer:'boot'` migration that `isPending` flags, in
|
|
14
14
|
* version-range + `order` sequence, appending each result to the
|
|
15
15
|
* `migrationApplications` audit log.
|
|
16
|
-
* 2. Probe every `layer:'preflight'` migration with `isPending` (cheap)
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* 2. Probe every `layer:'preflight'` migration with `isPending` (cheap) and
|
|
17
|
+
* split the pending ones by `severity` (§4.2.7 amendment / §12.7):
|
|
18
|
+
* - `cosmetic` pending → always warn-and-continue (policy ignored);
|
|
19
|
+
* - `blocking` pending → refuse boot under `block` (the default), or
|
|
20
|
+
* warn-and-continue under `warn` — per `preflightUnappliedPolicy`.
|
|
19
21
|
*
|
|
20
|
-
* `block` is the safe default (§4.2.7)
|
|
21
|
-
* before v2 boot, *every replica fail-fasts*
|
|
22
|
-
* autoIndex would otherwise hit E11000 (§9) on
|
|
23
|
-
* operator then runs `crowi-admin migrate apply`
|
|
24
|
-
* up.
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* is what matters. Phase 2 adds `page-status-default` as the first boot
|
|
28
|
-
* migration.
|
|
22
|
+
* `block` is the safe default (§4.2.7) for `blocking` migrations: if
|
|
23
|
+
* `user-unique-prepare` hasn't run before v2 boot, *every replica fail-fasts*
|
|
24
|
+
* with a clear error before autoIndex would otherwise hit E11000 (§9) on
|
|
25
|
+
* not-yet-deduped data. The operator then runs `crowi-admin migrate apply`
|
|
26
|
+
* once and brings the cluster up. A pending `cosmetic` migration never blocks
|
|
27
|
+
* boot: its `isPending` re-scans the live corpus, so new content could keep it
|
|
28
|
+
* pending forever and a uniform block would deadlock the cluster (BUG 2).
|
|
29
29
|
*/
|
|
30
30
|
const POLICY_ENV_VAR = 'MIGRATION_PREFLIGHT_UNAPPLIED_POLICY';
|
|
31
|
+
/** Compile-time exhaustiveness guard (throws if a future `severity` reaches it). */
|
|
32
|
+
function assertNever(value) {
|
|
33
|
+
throw new Error(`[crowi:migration] unhandled migration severity: ${String(value)}`);
|
|
34
|
+
}
|
|
31
35
|
/** Error thrown when boot is refused under the `block` policy. */
|
|
32
36
|
class PreflightBlockedError extends Error {
|
|
33
37
|
pendingIds;
|
|
@@ -74,22 +78,50 @@ async function runBootMigrations(crowi, options = {}) {
|
|
|
74
78
|
appliedBootIds.push(def.id);
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
|
-
// ── 2. Probe preflight migrations (cheap isPending) ──
|
|
78
|
-
|
|
81
|
+
// ── 2. Probe preflight migrations (cheap isPending), split by severity ──
|
|
82
|
+
//
|
|
83
|
+
// Every preflight migration is still probed (RFC-0008 §6.1/§6.2: inspection
|
|
84
|
+
// = source of truth). What changed is only the *consequence* of a pending
|
|
85
|
+
// verdict, decided per-migration by `severity`:
|
|
86
|
+
// - `cosmetic` pending → always warn-and-continue (global knob ignored);
|
|
87
|
+
// - `blocking` pending → refuse boot under `block`, warn-and-continue under
|
|
88
|
+
// `warn` (the existing emergency override).
|
|
89
|
+
const pendingBlockingIds = [];
|
|
90
|
+
const pendingCosmeticIds = [];
|
|
79
91
|
for (const def of registry.byLayer('preflight')) {
|
|
80
|
-
if (await runner.isPending(def))
|
|
81
|
-
|
|
92
|
+
if (!(await runner.isPending(def)))
|
|
93
|
+
continue;
|
|
94
|
+
switch (def.severity) {
|
|
95
|
+
case 'blocking':
|
|
96
|
+
pendingBlockingIds.push(def.id);
|
|
97
|
+
break;
|
|
98
|
+
case 'cosmetic':
|
|
99
|
+
pendingCosmeticIds.push(def.id);
|
|
100
|
+
break;
|
|
101
|
+
default:
|
|
102
|
+
// Exhaustive: a new severity must consciously pick a boot-gate side
|
|
103
|
+
// rather than silently fall through to non-blocking (fail-open).
|
|
104
|
+
assertNever(def.severity);
|
|
82
105
|
}
|
|
83
106
|
}
|
|
84
|
-
|
|
107
|
+
// Cosmetic pending always warns and continues, regardless of policy. Emitted
|
|
108
|
+
// before the blocking decision so it is observable even on the block-throw
|
|
109
|
+
// path (the result object is not returned then). A distinct message per
|
|
110
|
+
// severity keeps operator grep / alert rules simple.
|
|
111
|
+
if (pendingCosmeticIds.length > 0) {
|
|
112
|
+
console.warn(`[crowi:migration] WARNING: ${pendingCosmeticIds.length} cosmetic preflight migration(s) unapplied ` +
|
|
113
|
+
`[${pendingCosmeticIds.join(', ')}] — body display only; boot continues.`);
|
|
114
|
+
}
|
|
115
|
+
if (pendingBlockingIds.length > 0) {
|
|
85
116
|
if (policy === 'block') {
|
|
86
|
-
// Whole-cluster fail-fast (§4.2.7).
|
|
87
|
-
|
|
117
|
+
// Whole-cluster fail-fast for blocking migrations only (§4.2.7). The
|
|
118
|
+
// result object (and its severity split) is not returned on this path.
|
|
119
|
+
throw new PreflightBlockedError(pendingBlockingIds);
|
|
88
120
|
}
|
|
89
|
-
// warn: operator explicitly accepts the risk.
|
|
90
|
-
console.warn(`[crowi:migration] WARNING: ${
|
|
91
|
-
`
|
|
121
|
+
// warn: operator explicitly accepts the data-integrity risk.
|
|
122
|
+
console.warn(`[crowi:migration] WARNING: ${pendingBlockingIds.length} preflight migration(s) unapplied ` +
|
|
123
|
+
`[${pendingBlockingIds.join(', ')}] — data-integrity risk; autoIndex may fail with E11000.`);
|
|
92
124
|
}
|
|
93
|
-
return { appliedBootIds,
|
|
125
|
+
return { appliedBootIds, pendingBlockingIds, pendingCosmeticIds, policy };
|
|
94
126
|
}
|
|
95
127
|
//# sourceMappingURL=run-boot-migrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-boot-migrations.js","sourceRoot":"","sources":["../../src/migration/run-boot-migrations.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"run-boot-migrations.js","sourceRoot":"","sources":["../../src/migration/run-boot-migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/migration/runner.js
CHANGED
|
@@ -44,7 +44,14 @@ function buildContext(crowi, opts) {
|
|
|
44
44
|
// next onLoadDocument rebuilds the Y.Doc from the new body (§4.3.1).
|
|
45
45
|
const actingUserId = options?.userId ?? page.lastUpdateUser?.toString?.() ?? page.creator?.toString?.();
|
|
46
46
|
const user = actingUserId ? await User.findById(actingUserId).exec() : null;
|
|
47
|
-
|
|
47
|
+
// preserveTimestamps: a body-rewrite migration is a non-destructive,
|
|
48
|
+
// forward-only fixup. It must NOT bump the page's `updatedAt` (which would
|
|
49
|
+
// reorder recently-updated lists) nor overwrite `lastUpdateUser` with the
|
|
50
|
+
// migration bot. Preserving in place (rather than bumping then restoring)
|
|
51
|
+
// also keeps the search index consistent: the `update` event fires with the
|
|
52
|
+
// original `updatedAt`, so `indexPageInSearch` indexes the original value
|
|
53
|
+
// and never diverges from Mongo (RFC-0008 follow-up — see the migration spec).
|
|
54
|
+
await Page.updatePage(page, newBody, user, { preserveTimestamps: true });
|
|
48
55
|
};
|
|
49
56
|
const invalidateYjsPersistence = async (pageIds) => {
|
|
50
57
|
if (opts.dryRun || pageIds.length === 0)
|