@loopress/cli 0.21.0 → 0.22.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 (65) hide show
  1. package/README.md +169 -56
  2. package/dist/commands/acf/list.d.ts +2 -2
  3. package/dist/commands/acf/list.js +2 -5
  4. package/dist/commands/acf/pull.js +9 -22
  5. package/dist/commands/acf/push.js +3 -6
  6. package/dist/commands/api/list.js +2 -1
  7. package/dist/commands/api/publish.js +6 -22
  8. package/dist/commands/api/pull.js +12 -17
  9. package/dist/commands/api/push.js +7 -10
  10. package/dist/commands/dev.js +1 -1
  11. package/dist/commands/doctor.js +2 -1
  12. package/dist/commands/form/list.d.ts +2 -4
  13. package/dist/commands/form/list.js +3 -10
  14. package/dist/commands/form/pull.js +15 -24
  15. package/dist/commands/form/push.js +17 -42
  16. package/dist/commands/login.js +6 -2
  17. package/dist/commands/logout.js +2 -1
  18. package/dist/commands/page/pull.js +17 -28
  19. package/dist/commands/page/push.js +27 -52
  20. package/dist/commands/plugin/pull.d.ts +1 -0
  21. package/dist/commands/plugin/pull.js +8 -10
  22. package/dist/commands/plugin/push.d.ts +3 -0
  23. package/dist/commands/plugin/push.js +32 -22
  24. package/dist/commands/project/config.js +4 -1
  25. package/dist/commands/project/list.d.ts +16 -1
  26. package/dist/commands/project/list.js +22 -16
  27. package/dist/commands/project/pull.js +3 -2
  28. package/dist/commands/project/push.d.ts +5 -0
  29. package/dist/commands/project/push.js +79 -58
  30. package/dist/commands/promote.d.ts +18 -0
  31. package/dist/commands/promote.js +90 -0
  32. package/dist/commands/pull.d.ts +12 -0
  33. package/dist/commands/pull.js +51 -0
  34. package/dist/commands/push.d.ts +13 -0
  35. package/dist/commands/push.js +57 -0
  36. package/dist/commands/seo/list.d.ts +9 -2
  37. package/dist/commands/seo/list.js +9 -11
  38. package/dist/commands/seo/pull.js +14 -37
  39. package/dist/commands/seo/push.js +24 -48
  40. package/dist/commands/snippet/list.js +2 -1
  41. package/dist/commands/snippet/publish.js +5 -21
  42. package/dist/commands/snippet/pull.js +15 -20
  43. package/dist/commands/snippet/push.js +21 -30
  44. package/dist/commands/validate.d.ts +8 -0
  45. package/dist/commands/validate.js +24 -0
  46. package/dist/lib/base.d.ts +9 -0
  47. package/dist/lib/base.js +51 -22
  48. package/dist/lib/guard-production-push.d.ts +12 -0
  49. package/dist/lib/guard-production-push.js +20 -0
  50. package/dist/lib/load-snippets.js +65 -60
  51. package/dist/lib/local-callback-server.js +9 -4
  52. package/dist/lib/push-command.d.ts +3 -0
  53. package/dist/lib/push-command.js +22 -15
  54. package/dist/lib/put-or-create.d.ts +13 -0
  55. package/dist/lib/put-or-create.js +19 -0
  56. package/dist/lib/readdir-tolerant.d.ts +5 -0
  57. package/dist/lib/readdir-tolerant.js +11 -0
  58. package/dist/lib/resolve-linked-project.d.ts +8 -0
  59. package/dist/lib/resolve-linked-project.js +27 -0
  60. package/dist/lib/validate-local.d.ts +10 -0
  61. package/dist/lib/validate-local.js +183 -0
  62. package/dist/utils/pluralize.d.ts +1 -0
  63. package/dist/utils/pluralize.js +5 -0
  64. package/oclif.manifest.json +242 -27
  65. package/package.json +16 -15
@@ -0,0 +1 @@
1
+ export declare function pluralize(count: number, singular: string, plural?: string): string;
@@ -0,0 +1,5 @@
1
+ // `${pluralize(files.length, 'form')}` renders "1 form" or "3 forms"; pass an explicit
2
+ // plural for irregular words (e.g. `pluralize(n, 'box', 'boxes')`).
3
+ export function pluralize(count, singular, plural = `${singular}s`) {
4
+ return `${count} ${count === 1 ? singular : plural}`;
5
+ }
@@ -157,6 +157,182 @@
157
157
  "logout.js"
158
158
  ]
159
159
  },
160
+ "promote": {
161
+ "aliases": [],
162
+ "args": {
163
+ "from": {
164
+ "description": "Environment to copy the configuration from",
165
+ "name": "from",
166
+ "required": true
167
+ },
168
+ "to": {
169
+ "description": "Environment to copy the configuration to",
170
+ "name": "to",
171
+ "required": true
172
+ }
173
+ },
174
+ "description": "Copy every tracked resource from one environment to another by pulling from <from> then pushing to <to>. Local tracked files are overwritten with <from> in the process.",
175
+ "examples": [
176
+ "$ lps promote staging production",
177
+ "$ lps promote production staging --dry-run"
178
+ ],
179
+ "flags": {
180
+ "dry-run": {
181
+ "char": "d",
182
+ "description": "Show what would change without making changes",
183
+ "name": "dry-run",
184
+ "allowNo": false,
185
+ "type": "boolean"
186
+ },
187
+ "yes": {
188
+ "char": "y",
189
+ "description": "Answer yes to confirmation prompts",
190
+ "name": "yes",
191
+ "allowNo": false,
192
+ "type": "boolean"
193
+ }
194
+ },
195
+ "hasDynamicHelp": false,
196
+ "hiddenAliases": [],
197
+ "id": "promote",
198
+ "pluginAlias": "@loopress/cli",
199
+ "pluginName": "@loopress/cli",
200
+ "pluginType": "core",
201
+ "strict": true,
202
+ "enableJsonFlag": false,
203
+ "isESM": true,
204
+ "relativePath": [
205
+ "dist",
206
+ "commands",
207
+ "promote.js"
208
+ ]
209
+ },
210
+ "pull": {
211
+ "aliases": [],
212
+ "args": {},
213
+ "description": "Pull all content, plugins, composer dependencies, ACF, API routes, forms, pages, SEO, and snippets, from WordPress",
214
+ "examples": [
215
+ "$ lps pull",
216
+ "$ lps pull --env staging",
217
+ "$ lps pull --dry-run"
218
+ ],
219
+ "flags": {
220
+ "env": {
221
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
222
+ "name": "env",
223
+ "hasDynamicHelp": false,
224
+ "multiple": false,
225
+ "type": "option"
226
+ },
227
+ "dry-run": {
228
+ "char": "d",
229
+ "description": "Show what would change without making changes",
230
+ "name": "dry-run",
231
+ "allowNo": false,
232
+ "type": "boolean"
233
+ },
234
+ "yes": {
235
+ "char": "y",
236
+ "description": "Answer yes to confirmation prompts",
237
+ "name": "yes",
238
+ "allowNo": false,
239
+ "type": "boolean"
240
+ }
241
+ },
242
+ "hasDynamicHelp": false,
243
+ "hiddenAliases": [],
244
+ "id": "pull",
245
+ "pluginAlias": "@loopress/cli",
246
+ "pluginName": "@loopress/cli",
247
+ "pluginType": "core",
248
+ "strict": true,
249
+ "enableJsonFlag": false,
250
+ "dryRunFlag": {
251
+ "dry-run": {
252
+ "char": "d",
253
+ "description": "Show what would change without making changes",
254
+ "allowNo": false,
255
+ "type": "boolean"
256
+ }
257
+ },
258
+ "yesFlag": {
259
+ "yes": {
260
+ "char": "y",
261
+ "description": "Answer yes to confirmation prompts",
262
+ "allowNo": false,
263
+ "type": "boolean"
264
+ }
265
+ },
266
+ "isESM": true,
267
+ "relativePath": [
268
+ "dist",
269
+ "commands",
270
+ "pull.js"
271
+ ]
272
+ },
273
+ "push": {
274
+ "aliases": [],
275
+ "args": {},
276
+ "description": "Push all local content, plugins, composer dependencies, ACF, API routes, forms, pages, SEO, and snippets, to WordPress",
277
+ "examples": [
278
+ "$ lps push",
279
+ "$ lps push --env staging",
280
+ "$ lps push --dry-run"
281
+ ],
282
+ "flags": {
283
+ "env": {
284
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
285
+ "name": "env",
286
+ "hasDynamicHelp": false,
287
+ "multiple": false,
288
+ "type": "option"
289
+ },
290
+ "dry-run": {
291
+ "char": "d",
292
+ "description": "Show what would change without making changes",
293
+ "name": "dry-run",
294
+ "allowNo": false,
295
+ "type": "boolean"
296
+ },
297
+ "yes": {
298
+ "char": "y",
299
+ "description": "Answer yes to confirmation prompts",
300
+ "name": "yes",
301
+ "allowNo": false,
302
+ "type": "boolean"
303
+ }
304
+ },
305
+ "hasDynamicHelp": false,
306
+ "hiddenAliases": [],
307
+ "id": "push",
308
+ "pluginAlias": "@loopress/cli",
309
+ "pluginName": "@loopress/cli",
310
+ "pluginType": "core",
311
+ "strict": true,
312
+ "enableJsonFlag": false,
313
+ "dryRunFlag": {
314
+ "dry-run": {
315
+ "char": "d",
316
+ "description": "Show what would change without making changes",
317
+ "allowNo": false,
318
+ "type": "boolean"
319
+ }
320
+ },
321
+ "yesFlag": {
322
+ "yes": {
323
+ "char": "y",
324
+ "description": "Answer yes to confirmation prompts",
325
+ "allowNo": false,
326
+ "type": "boolean"
327
+ }
328
+ },
329
+ "isESM": true,
330
+ "relativePath": [
331
+ "dist",
332
+ "commands",
333
+ "push.js"
334
+ ]
335
+ },
160
336
  "sentry-test": {
161
337
  "aliases": [],
162
338
  "args": {},
@@ -217,6 +393,37 @@
217
393
  "status.js"
218
394
  ]
219
395
  },
396
+ "validate": {
397
+ "aliases": [],
398
+ "args": {},
399
+ "description": "Check local tracked files are well formed and push-ready, without contacting WordPress",
400
+ "examples": [
401
+ "$ lps validate"
402
+ ],
403
+ "flags": {
404
+ "json": {
405
+ "description": "Format output as json.",
406
+ "helpGroup": "GLOBAL",
407
+ "name": "json",
408
+ "allowNo": false,
409
+ "type": "boolean"
410
+ }
411
+ },
412
+ "hasDynamicHelp": false,
413
+ "hiddenAliases": [],
414
+ "id": "validate",
415
+ "pluginAlias": "@loopress/cli",
416
+ "pluginName": "@loopress/cli",
417
+ "pluginType": "core",
418
+ "strict": true,
419
+ "enableJsonFlag": true,
420
+ "isESM": true,
421
+ "relativePath": [
422
+ "dist",
423
+ "commands",
424
+ "validate.js"
425
+ ]
426
+ },
220
427
  "acf:list": {
221
428
  "aliases": [],
222
429
  "args": {},
@@ -226,6 +433,13 @@
226
433
  "$ lps acf list --type field-groups"
227
434
  ],
228
435
  "flags": {
436
+ "json": {
437
+ "description": "Format output as json.",
438
+ "helpGroup": "GLOBAL",
439
+ "name": "json",
440
+ "allowNo": false,
441
+ "type": "boolean"
442
+ },
229
443
  "env": {
230
444
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
231
445
  "name": "env",
@@ -233,13 +447,6 @@
233
447
  "multiple": false,
234
448
  "type": "option"
235
449
  },
236
- "json": {
237
- "char": "j",
238
- "description": "Output in JSON format",
239
- "name": "json",
240
- "allowNo": false,
241
- "type": "boolean"
242
- },
243
450
  "type": {
244
451
  "description": "Limit to specific ACF object types",
245
452
  "name": "type",
@@ -261,7 +468,7 @@
261
468
  "pluginName": "@loopress/cli",
262
469
  "pluginType": "core",
263
470
  "strict": true,
264
- "enableJsonFlag": false,
471
+ "enableJsonFlag": true,
265
472
  "dryRunFlag": {
266
473
  "dry-run": {
267
474
  "char": "d",
@@ -831,19 +1038,19 @@
831
1038
  "$ lps form list"
832
1039
  ],
833
1040
  "flags": {
1041
+ "json": {
1042
+ "description": "Format output as json.",
1043
+ "helpGroup": "GLOBAL",
1044
+ "name": "json",
1045
+ "allowNo": false,
1046
+ "type": "boolean"
1047
+ },
834
1048
  "env": {
835
1049
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
836
1050
  "name": "env",
837
1051
  "hasDynamicHelp": false,
838
1052
  "multiple": false,
839
1053
  "type": "option"
840
- },
841
- "json": {
842
- "char": "j",
843
- "description": "Output in JSON format",
844
- "name": "json",
845
- "allowNo": false,
846
- "type": "boolean"
847
1054
  }
848
1055
  },
849
1056
  "hasDynamicHelp": false,
@@ -853,7 +1060,7 @@
853
1060
  "pluginName": "@loopress/cli",
854
1061
  "pluginType": "core",
855
1062
  "strict": true,
856
- "enableJsonFlag": false,
1063
+ "enableJsonFlag": true,
857
1064
  "dryRunFlag": {
858
1065
  "dry-run": {
859
1066
  "char": "d",
@@ -1392,7 +1599,15 @@
1392
1599
  "examples": [
1393
1600
  "$ lps project list"
1394
1601
  ],
1395
- "flags": {},
1602
+ "flags": {
1603
+ "json": {
1604
+ "description": "Format output as json.",
1605
+ "helpGroup": "GLOBAL",
1606
+ "name": "json",
1607
+ "allowNo": false,
1608
+ "type": "boolean"
1609
+ }
1610
+ },
1396
1611
  "hasDynamicHelp": false,
1397
1612
  "hiddenAliases": [],
1398
1613
  "id": "project:list",
@@ -1400,7 +1615,7 @@
1400
1615
  "pluginName": "@loopress/cli",
1401
1616
  "pluginType": "core",
1402
1617
  "strict": true,
1403
- "enableJsonFlag": false,
1618
+ "enableJsonFlag": true,
1404
1619
  "isESM": true,
1405
1620
  "relativePath": [
1406
1621
  "dist",
@@ -1571,6 +1786,13 @@
1571
1786
  "$ lps seo list --post-type post"
1572
1787
  ],
1573
1788
  "flags": {
1789
+ "json": {
1790
+ "description": "Format output as json.",
1791
+ "helpGroup": "GLOBAL",
1792
+ "name": "json",
1793
+ "allowNo": false,
1794
+ "type": "boolean"
1795
+ },
1574
1796
  "env": {
1575
1797
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
1576
1798
  "name": "env",
@@ -1578,13 +1800,6 @@
1578
1800
  "multiple": false,
1579
1801
  "type": "option"
1580
1802
  },
1581
- "json": {
1582
- "char": "j",
1583
- "description": "Output in JSON format",
1584
- "name": "json",
1585
- "allowNo": false,
1586
- "type": "boolean"
1587
- },
1588
1803
  "post-type": {
1589
1804
  "description": "Limit to specific post types",
1590
1805
  "name": "post-type",
@@ -1600,7 +1815,7 @@
1600
1815
  "pluginName": "@loopress/cli",
1601
1816
  "pluginType": "core",
1602
1817
  "strict": true,
1603
- "enableJsonFlag": false,
1818
+ "enableJsonFlag": true,
1604
1819
  "dryRunFlag": {
1605
1820
  "dry-run": {
1606
1821
  "char": "d",
@@ -2018,5 +2233,5 @@
2018
2233
  ]
2019
2234
  }
2020
2235
  },
2021
- "version": "0.21.0"
2236
+ "version": "0.22.0"
2022
2237
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loopress/cli",
3
3
  "description": "CLI tool for syncing WordPress code snippets, plugins, and Composer dependencies via the REST API",
4
- "version": "0.21.0",
4
+ "version": "0.22.0",
5
5
  "author": "jean-smaug",
6
6
  "bin": {
7
7
  "loopress": "bin/run.js",
@@ -11,16 +11,16 @@
11
11
  "url": "https://github.com/loopress/loopress/issues"
12
12
  },
13
13
  "dependencies": {
14
- "@inquirer/prompts": "^8.5.2",
15
- "@oclif/core": "^4.13.2",
16
- "@oclif/plugin-help": "^6.2.56",
17
- "@oclif/plugin-warn-if-update-available": "^3.1.70",
18
- "@sentry/node": "^10.69.0",
14
+ "@inquirer/prompts": "^8.7.0",
15
+ "@oclif/core": "^4.14.0",
16
+ "@oclif/plugin-help": "^6.3.0",
17
+ "@oclif/plugin-warn-if-update-available": "^3.2.0",
18
+ "@sentry/node": "^10.71.0",
19
19
  "chokidar": "^5.0.0",
20
20
  "glob": "13.0.6",
21
21
  "got": "^15.1.0",
22
- "listr2": "^11.0.0",
23
- "open": "^11.0.0",
22
+ "listr2": "^11.0.1",
23
+ "open": "^11.0.1",
24
24
  "playwright-core": "^1.62.1",
25
25
  "slugify": "^1.6.9",
26
26
  "write-file-atomic": "^8.0.0"
@@ -30,20 +30,21 @@
30
30
  "@oclif/prettier-config": "^0.2.1",
31
31
  "@stryker-mutator/core": "^9.6.1",
32
32
  "@stryker-mutator/vitest-runner": "^9.6.1",
33
- "@types/node": "26.1.2",
33
+ "@types/node": "26.4.0",
34
34
  "@types/write-file-atomic": "^4.0.3",
35
- "@vitest/coverage-v8": "4.1.10",
36
- "eslint": "^10.8.0",
37
- "eslint-config-oclif": "^7.1.1",
35
+ "@vitest/coverage-v8": "4.1.11",
36
+ "eslint": "^10.9.1",
37
+ "eslint-config-oclif": "^7.1.7",
38
38
  "eslint-config-prettier": "^10",
39
+ "eslint-plugin-sonarjs": "^4.2.0",
39
40
  "json-schema-to-typescript": "^15.0.4",
40
- "oclif": "^4.23.29",
41
+ "oclif": "^4.24.0",
41
42
  "prettier": "3.9.6",
42
43
  "shx": "^0.4.0",
43
44
  "ts-node": "10.9.2",
44
- "tsx": "4.23.9",
45
+ "tsx": "4.23.12",
45
46
  "typescript": "^6.0.3",
46
- "vitest": "^4.1.10"
47
+ "vitest": "^4.1.11"
47
48
  },
48
49
  "engines": {
49
50
  "node": ">=18.0.0"