@cmssy/codemod 8.0.4 → 9.1.0

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.
Files changed (2) hide show
  1. package/dist/index.js +102 -15
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -212,12 +212,103 @@ function transform3(source) {
212
212
  return notes.length > 0 ? { code, changed, notes } : { code, changed };
213
213
  }
214
214
 
215
+ // src/v9.ts
216
+ var KEYS = ["defaultLocale", "enabledLocales"];
217
+ function configRegions(code) {
218
+ const regions = [];
219
+ const openers = [/defineCmssyConfig\s*\(\s*\{/g, /:\s*CmssyConfig\s*=\s*\{/g];
220
+ for (const opener of openers) {
221
+ for (const match of code.matchAll(opener)) {
222
+ const start = match.index + match[0].length - 1;
223
+ let depth = 0;
224
+ for (let i = start; i < code.length; i++) {
225
+ if (code[i] === "{") depth++;
226
+ else if (code[i] === "}") {
227
+ depth--;
228
+ if (depth === 0) {
229
+ regions.push({ start, end: i });
230
+ break;
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ return regions;
237
+ }
238
+ function stripKey(slice, key) {
239
+ const property = new RegExp(`(^|\\n)([ \\t]*)${key}\\s*:\\s*`);
240
+ const match = property.exec(slice);
241
+ if (!match) return { code: slice, removed: null };
242
+ const valueStart = match.index + match[0].length;
243
+ let i = valueStart;
244
+ let square = 0;
245
+ let curly = 0;
246
+ for (; i < slice.length; i++) {
247
+ const char = slice[i];
248
+ if (char === "[") square++;
249
+ else if (char === "]") square--;
250
+ else if (char === "{") curly++;
251
+ else if (char === "}") {
252
+ if (curly === 0) break;
253
+ curly--;
254
+ } else if (char === "," && square === 0 && curly === 0) {
255
+ i++;
256
+ break;
257
+ }
258
+ }
259
+ let end = i;
260
+ if (slice[end] === "\n" || slice.startsWith("\r\n", end)) {
261
+ end += slice[end] === "\r" ? 2 : 1;
262
+ }
263
+ const from = match.index + (match[1] ?? "").length;
264
+ return {
265
+ code: slice.slice(0, from) + slice.slice(end),
266
+ removed: slice.slice(valueStart, i).trim().replace(/,$/, "")
267
+ };
268
+ }
269
+ function transform4(source) {
270
+ let code = source;
271
+ const notes = [];
272
+ for (const key of KEYS) {
273
+ let removed;
274
+ do {
275
+ removed = null;
276
+ for (const { start, end } of configRegions(code)) {
277
+ const slice = code.slice(start, end + 1);
278
+ const result = stripKey(slice, key);
279
+ if (result.removed !== null) {
280
+ code = code.slice(0, start) + result.code + code.slice(end + 1);
281
+ removed = result.removed;
282
+ notes.push(
283
+ `removed config.${key} (${removed}) - the workspace languages rule now; confirm Settings \u2192 Languages matches`
284
+ );
285
+ break;
286
+ }
287
+ }
288
+ } while (removed !== null);
289
+ }
290
+ const changed = code !== source;
291
+ return notes.length > 0 ? { code, changed, notes } : { code, changed };
292
+ }
293
+
215
294
  // src/index.ts
216
- var TRANSFORMS = { v5: transform, v7: transform2, v8: transform3 };
295
+ var TRANSFORMS = {
296
+ v5: transform,
297
+ v7: transform2,
298
+ v8: transform3,
299
+ v9: transform4
300
+ };
217
301
  var PREVIOUS_MAJOR = {
218
302
  v5: "4.x",
219
303
  v7: "6.x",
220
- v8: "7.x"
304
+ v8: "7.x",
305
+ v9: "8.x"
306
+ };
307
+ var MIGRATION_GUIDE = {
308
+ v5: "https://github.com/cmssy-io/cmssy-sdk/blob/main/docs/migrations/v4-to-v5.md",
309
+ v7: "https://github.com/cmssy-io/cmssy-sdk/blob/main/docs/migrations/v4-to-v5.md",
310
+ v8: "https://github.com/cmssy-io/cmssy-sdk/blob/main/docs/migrations/v7-to-v8.md",
311
+ v9: "https://github.com/cmssy-io/cmssy-sdk/blob/main/docs/migrations/v8-to-v9.md"
221
312
  };
222
313
  var SKIP = /* @__PURE__ */ new Set(["node_modules", "dist", "build", "out", "coverage"]);
223
314
  var EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs"];
@@ -240,9 +331,9 @@ async function sourceFiles(dir) {
240
331
  async function main() {
241
332
  const args = process.argv.slice(2);
242
333
  const version = args[0];
243
- const transform4 = TRANSFORMS[version];
244
- if (!transform4) {
245
- console.error("usage: cmssy-codemod v5|v7|v8 [path] [--dry]");
334
+ const transform5 = TRANSFORMS[version];
335
+ if (!transform5) {
336
+ console.error("usage: cmssy-codemod v5|v7|v8|v9 [path] [--dry]");
246
337
  process.exitCode = 1;
247
338
  return;
248
339
  }
@@ -256,7 +347,7 @@ async function main() {
256
347
  let needsCore = false;
257
348
  for (const file of files) {
258
349
  const source = await readFile(file, "utf8");
259
- const { code, changed, notes } = transform4(source);
350
+ const { code, changed, notes } = transform5(source);
260
351
  if (notes && notes.length > 0) manual.push({ file, notes });
261
352
  if (!changed) continue;
262
353
  touched.push(file);
@@ -277,19 +368,15 @@ async function main() {
277
368
  for (const file of touched) console.log(` ${report(file)}`);
278
369
  }
279
370
  if (manual.length > 0) {
280
- console.log(
281
- `
282
- cmssy: ${manual.length} file(s) need a human - a block's content must be
283
- derived from its schema, and only you know which fields it means to read:
284
- `
285
- );
371
+ console.log(`
372
+ cmssy: ${manual.length} file(s) need a look from you:
373
+ `);
286
374
  for (const { file, notes } of manual) {
287
375
  console.log(` ${report(file)}
288
376
  ${notes.join("\n ")}`);
289
377
  }
290
- console.log(
291
- "\n https://github.com/cmssy-io/cmssy-sdk/blob/main/docs/migrations/v7-to-v8.md"
292
- );
378
+ console.log(`
379
+ ${MIGRATION_GUIDE[version]}`);
293
380
  }
294
381
  if (needsCore && !await dependsOnCore(target)) {
295
382
  console.log(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmssy/codemod",
3
- "version": "8.0.4",
3
+ "version": "9.1.0",
4
4
  "description": "Rewrites cmssy imports across major versions, so a breaking release costs minutes instead of an afternoon.",
5
5
  "keywords": [
6
6
  "cmssy",