@swoff/cli 0.0.2 → 0.2.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 (100) hide show
  1. package/README.md +49 -0
  2. package/bin/swoff +0 -0
  3. package/dist/__tests__/assemble-sw.test.js +145 -0
  4. package/dist/__tests__/assemble-sw.test.js.map +1 -0
  5. package/dist/__tests__/cli-integration.test.js +128 -0
  6. package/dist/__tests__/cli-integration.test.js.map +1 -0
  7. package/dist/__tests__/config-types.test.js +82 -0
  8. package/dist/__tests__/config-types.test.js.map +1 -0
  9. package/dist/__tests__/detect-language.test.js +51 -0
  10. package/dist/__tests__/detect-language.test.js.map +1 -0
  11. package/dist/__tests__/file-generators.test.js +271 -0
  12. package/dist/__tests__/file-generators.test.js.map +1 -0
  13. package/dist/__tests__/invalidation-tags.test.js +99 -0
  14. package/dist/__tests__/invalidation-tags.test.js.map +1 -0
  15. package/dist/__tests__/loader.test.js +77 -0
  16. package/dist/__tests__/loader.test.js.map +1 -0
  17. package/dist/__tests__/validator.test.js +232 -0
  18. package/dist/__tests__/validator.test.js.map +1 -0
  19. package/dist/index.js +36 -348
  20. package/dist/index.js.map +1 -1
  21. package/dist/lib/cli/colors.js +14 -0
  22. package/dist/lib/cli/colors.js.map +1 -0
  23. package/dist/lib/cli/help.js +63 -0
  24. package/dist/lib/cli/help.js.map +1 -0
  25. package/dist/lib/cli/logger.js +13 -0
  26. package/dist/lib/cli/logger.js.map +1 -0
  27. package/dist/lib/commands/add.js +58 -0
  28. package/dist/lib/commands/add.js.map +1 -0
  29. package/dist/lib/commands/clean.js +39 -0
  30. package/dist/lib/commands/clean.js.map +1 -0
  31. package/dist/lib/commands/generate.js +84 -0
  32. package/dist/lib/commands/generate.js.map +1 -0
  33. package/dist/lib/commands/info.js +44 -0
  34. package/dist/lib/commands/info.js.map +1 -0
  35. package/dist/lib/commands/init.js +46 -0
  36. package/dist/lib/commands/init.js.map +1 -0
  37. package/dist/lib/commands/validate.js +30 -0
  38. package/dist/lib/commands/validate.js.map +1 -0
  39. package/dist/lib/config/loader.js +80 -0
  40. package/dist/lib/config/loader.js.map +1 -0
  41. package/dist/lib/config/validator.js +102 -0
  42. package/dist/lib/config/validator.js.map +1 -0
  43. package/dist/lib/generators/file-generators/background-sync.js +59 -0
  44. package/dist/lib/generators/file-generators/background-sync.js.map +1 -0
  45. package/dist/lib/generators/file-generators/cache.js +55 -0
  46. package/dist/lib/generators/file-generators/cache.js.map +1 -0
  47. package/dist/lib/generators/file-generators/context.js +16 -0
  48. package/dist/lib/generators/file-generators/context.js.map +1 -0
  49. package/dist/lib/generators/file-generators/fetch-wrapper.js +80 -0
  50. package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -0
  51. package/dist/lib/generators/file-generators/indexeddb.js +73 -0
  52. package/dist/lib/generators/file-generators/indexeddb.js.map +1 -0
  53. package/dist/lib/generators/file-generators/invalidation-tags.js +91 -0
  54. package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -0
  55. package/dist/lib/generators/file-generators/manifest.js +26 -0
  56. package/dist/lib/generators/file-generators/manifest.js.map +1 -0
  57. package/dist/lib/generators/file-generators/mutation-queue.js +226 -0
  58. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -0
  59. package/dist/lib/generators/file-generators/pwa-install.js +102 -0
  60. package/dist/lib/generators/file-generators/pwa-install.js.map +1 -0
  61. package/dist/lib/generators/file-generators/reconcile.js +54 -0
  62. package/dist/lib/generators/file-generators/reconcile.js.map +1 -0
  63. package/dist/lib/generators/file-generators/store.js +75 -0
  64. package/dist/lib/generators/file-generators/store.js.map +1 -0
  65. package/dist/lib/generators/file-generators/sw-generator-build.js +70 -0
  66. package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -0
  67. package/dist/lib/generators/file-generators/sw-injector.js +195 -0
  68. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -0
  69. package/dist/lib/generators/file-generators/sw-template.js +143 -0
  70. package/dist/lib/generators/file-generators/sw-template.js.map +1 -0
  71. package/dist/lib/generators/file-generators/type-definitions.js +69 -0
  72. package/dist/lib/generators/file-generators/type-definitions.js.map +1 -0
  73. package/dist/lib/generators/sw-generator.js +37 -239
  74. package/dist/lib/generators/sw-generator.js.map +1 -1
  75. package/dist/lib/generators/sw-sections/activate-handler.js +16 -0
  76. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -0
  77. package/dist/lib/generators/sw-sections/assemble-sw.js +38 -0
  78. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -0
  79. package/dist/lib/generators/sw-sections/background-sync-handler.js +106 -0
  80. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -0
  81. package/dist/lib/generators/sw-sections/config-header.js +15 -0
  82. package/dist/lib/generators/sw-sections/config-header.js.map +1 -0
  83. package/dist/lib/generators/sw-sections/default-template.js +51 -0
  84. package/dist/lib/generators/sw-sections/default-template.js.map +1 -0
  85. package/dist/lib/generators/sw-sections/fetch-handler.js +210 -0
  86. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -0
  87. package/dist/lib/generators/sw-sections/install-handler.js +35 -0
  88. package/dist/lib/generators/sw-sections/install-handler.js.map +1 -0
  89. package/dist/lib/generators/sw-sections/message-handler.js +20 -0
  90. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -0
  91. package/dist/lib/generators/sw-sections/tag-management.js +69 -0
  92. package/dist/lib/generators/sw-sections/tag-management.js.map +1 -0
  93. package/dist/lib/generators/swoff-files-generator.js +80 -1043
  94. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  95. package/dist/lib/shared/config-types.js +87 -0
  96. package/dist/lib/shared/config-types.js.map +1 -0
  97. package/dist/lib/utils/detect-language.js +33 -0
  98. package/dist/lib/utils/detect-language.js.map +1 -0
  99. package/package.json +6 -2
  100. package/src/lib/templates/sw-template.js +23 -6
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACzC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAElC,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF,MAAM,GAAG,GAAG;IACV,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;IAC5E,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;IAChF,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;IAC/E,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;IAC5E,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC3E,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;CAClF,CAAC;AAEF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAQ9B,MAAM,QAAQ,GAA+B;IAC3C,IAAI,EAAE;QACJ,WAAW,EAAE,uCAAuC;QACpD,KAAK,EAAE,qDAAqD;QAC5D,QAAQ,EAAE,CAAC,YAAY,EAAE,mCAAmC,CAAC;KAC9D;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,EAAE,6BAA6B,CAAC;KACxF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,CAAC,gBAAgB,CAAC;KAC7B;IACD,GAAG,EAAE;QACH,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,CAAC,mBAAmB,EAAE,eAAe,EAAE,0BAA0B,CAAC;KAC7E;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,sBAAsB;QAC7B,QAAQ,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC;KAC5C;CACF,CAAC;AAEF,SAAS,QAAQ,CAAC,WAAoB;IACpC,IAAI,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,SAAS,WAAW,UAAU,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,KAAK,uCAAuC,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,IAAI,4BAA4B,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,uBAAuB,MAAM,CAAC,KAAK,0CAA0C,CAAC,CAAC;IACjH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAkB;IAC3C,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,kBAAkB,cAAc,kBAAkB,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAYf;QACF,OAAO,EAAE,0CAA0C;QACnD,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,cAAc;QACvB,mBAAmB,EAAE,OAAO;QAC5B,aAAa,EAAE;YACb,UAAU,EAAE,KAAK;YACjB,eAAe,EAAE,aAAa;YAC9B,UAAU,EAAE;gBACV,QAAQ,EAAE,eAAe;gBACzB,WAAW,EAAE,aAAa;aAC3B;SACF;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,KAAK;YACrB,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,KAAK;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,IAAI;YACrB,kBAAkB,EAAE,IAAI;SACzB;QACD,KAAK,EAAE;YACL,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,IAAI;SACjB;KACF,CAAC;IAEF,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QAC/D,aAAa,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5C,aAAa,CAAC,aAAa,CAAC,UAAU,GAAG;YACvC,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,aAAa;SAC3B,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,aAAa,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5C,aAAa,CAAC,aAAa,CAAC,UAAU,GAAG;YACvC,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,aAAa;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC1D,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,IAAI,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACnE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAE/C,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3D,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1B,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACnC,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AAC/D,CAAC;AAQD,KAAK,UAAU,eAAe,CAAC,UAA2B,EAAE;IAC1D,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEhE,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAErC,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAI,MAAM,GAAmC,IAAI,CAAC;IAClD,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAExC,MAAM,YAAY,GAAG,QAAQ,IAAI,qBAAqB,EAAE,CAAC;IACzD,GAAG,CAAC,IAAI,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,GAAG,CAAC,KAAK,CAAC,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,0BAA0B,EAAE;gBAC7C,gBAAgB,EAAE,WAAW;gBAC7B,eAAe,EAAE,UAAU;gBAC3B,YAAY,EAAE,YAAY;gBAC1B,eAAe,EAAE,UAAW;aAC7B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,GAAG,CAAC,KAAK,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,aAAqB,EAAE,YAAsB,EAAE;IACnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;QAEnF,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,aAAa,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,EAAE;YACxD,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,GAAG,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAI,MAAM,GAAmC,IAAI,CAAC;IAClD,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAClD,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC1F,OAAO;gBACT,CAAC;YACH,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;IAExC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACpF,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAExE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,4BAA4B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,YAAY,MAAO,CAAC,OAAiB,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,IAAI,CAAC,qBAAsB,MAAO,CAAC,aAAyC,CAAC,eAAyB,EAAE,CAAC,CAAC;IAC9G,GAAG,CAAC,IAAI,CACN,qBAAqB,MAAM,CAAC,OAAO,CAAC,MAAO,CAAC,QAAmC,CAAC;SAC7E,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe;IACvC,GAAG,CAAC,MAAM,CAAC,UAAU,OAAO,UAAU,CAAC,CAAC;IAExC,MAAM,UAAU,GAA4C;QAC1D,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;QAC/B,gBAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;QACzC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;QACtC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;QAClB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;QACnC,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;QAChC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;KACrB,CAAC;IAEF,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,IAAI,MAAM,GAAmC,IAAI,CAAC;IAClD,IAAI,UAAU,GAAW,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAEhE,KAAK,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACjE,MAAM,GAAG;YACP,OAAO,EAAE,0CAA0C;YACnD,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,cAAc;YACvB,mBAAmB,EAAE,OAAO;YAC5B,aAAa,EAAE;gBACb,UAAU,EAAE,KAAK;gBACjB,eAAe,EAAE,aAAa;gBAC9B,UAAU,EAAE,EAAE;aACf;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,KAAK;gBACnB,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,KAAK;gBACrB,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,KAAK;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,IAAI;gBACrB,kBAAkB,EAAE,IAAI;aACzB;YACD,KAAK,EAAE;gBACL,SAAS,EAAE,MAAM;gBACjB,UAAU,EAAE,IAAI;aACjB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM,CAAC,QAAmC,EAAE,GAAG,YAAY,EAAE,CAAC;IACrF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,GAAG,CAAC,OAAO,CAAC,kCAAkC,OAAO,UAAU,CAAC,CAAC;IAEjE,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,OAAO,CAAC,GAAG,OAAO,8BAA8B,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,qBAAqB;IAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACtD,IAAI,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,GAAG,CAAC,YAAY,EAAE,UAAU;gBAAE,OAAO,IAAI,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBACtC,OAAO,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACtD,CAAC,KAA8C,EAAE,EAAE,CACjD,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CACnD,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9E,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM;QACR,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7C,MAAM;QACR,CAAC;QACD,KAAK,UAAU;YACb,MAAM,eAAe,EAAE,CAAC;YACxB,MAAM;QACR,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC7C,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACvC,GAAG,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAC1B,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM;QACR;YACE,GAAG,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ANSI color constants for terminal output.
3
+ */
4
+ export const colors = {
5
+ reset: "\x1b[0m",
6
+ bright: "\x1b[1m",
7
+ dim: "\x1b[2m",
8
+ green: "\x1b[32m",
9
+ yellow: "\x1b[33m",
10
+ blue: "\x1b[34m",
11
+ red: "\x1b[31m",
12
+ cyan: "\x1b[36m",
13
+ };
14
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../../src/lib/cli/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,UAAU;CACjB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Command registry and help display.
3
+ */
4
+ import { colors } from "./colors.js";
5
+ import { log } from "./logger.js";
6
+ export const commands = {
7
+ init: {
8
+ description: "Initialize Swoff in current directory",
9
+ usage: "swoff init [--framework react-vite|nextjs|vue-vite]",
10
+ examples: ["swoff init", "swoff init --framework react-vite"],
11
+ },
12
+ generate: {
13
+ description: "Generate service worker and supporting files",
14
+ usage: "swoff generate [--sw-only|--files-only]",
15
+ examples: ["swoff generate", "swoff generate --sw-only", "swoff generate --files-only"],
16
+ },
17
+ validate: {
18
+ description: "Validate swoff.config.json",
19
+ usage: "swoff validate",
20
+ examples: ["swoff validate"],
21
+ },
22
+ add: {
23
+ description: "Add specific feature files",
24
+ usage: "swoff add <feature>",
25
+ examples: ["swoff add offline", "swoff add pwa", "swoff add mutation-queue"],
26
+ },
27
+ info: {
28
+ description: "Show Swoff configuration summary",
29
+ usage: "swoff info",
30
+ examples: ["swoff info"],
31
+ },
32
+ clean: {
33
+ description: "Remove Swoff from the project (swoff/, config, version.json)",
34
+ usage: "swoff clean",
35
+ examples: ["swoff clean"],
36
+ },
37
+ help: {
38
+ description: "Show help information",
39
+ usage: "swoff help [command]",
40
+ examples: ["swoff help", "swoff help init"],
41
+ },
42
+ };
43
+ export function showHelp(commandName) {
44
+ if (commandName && commands[commandName]) {
45
+ const cmd = commands[commandName];
46
+ log.header(`Swoff ${commandName} Command`);
47
+ console.log(`Description: ${cmd.description}`);
48
+ console.log(`\nUsage: ${cmd.usage}`);
49
+ console.log(`\nExamples:`);
50
+ cmd.examples.forEach((ex) => console.log(` ${ex}`));
51
+ }
52
+ else {
53
+ log.header("Swoff CLI");
54
+ console.log(`${colors.dim}Swoff${colors.reset} - Offline-first web apps made easy\n`);
55
+ console.log(`Usage: ${colors.cyan}swoff <command> [options]${colors.reset}\n`);
56
+ console.log("Commands:");
57
+ Object.entries(commands).forEach(([name, cmd]) => {
58
+ console.log(` ${colors.green}${name.padEnd(12)}${colors.reset} ${cmd.description}`);
59
+ });
60
+ console.log(`\nRun ${colors.cyan}swoff help <command>${colors.reset} for more details on a specific command.`);
61
+ }
62
+ }
63
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/lib/cli/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAQlC,MAAM,CAAC,MAAM,QAAQ,GAA+B;IAClD,IAAI,EAAE;QACJ,WAAW,EAAE,uCAAuC;QACpD,KAAK,EAAE,qDAAqD;QAC5D,QAAQ,EAAE,CAAC,YAAY,EAAE,mCAAmC,CAAC;KAC9D;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,EAAE,6BAA6B,CAAC;KACxF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,CAAC,gBAAgB,CAAC;KAC7B;IACD,GAAG,EAAE;QACH,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,CAAC,mBAAmB,EAAE,eAAe,EAAE,0BAA0B,CAAC;KAC7E;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,kCAAkC;QAC/C,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;IACD,KAAK,EAAE;QACL,WAAW,EAAE,8DAA8D;QAC3E,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,aAAa,CAAC;KAC1B;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,sBAAsB;QAC7B,QAAQ,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC;KAC5C;CACF,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,WAAoB;IAC3C,IAAI,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,SAAS,WAAW,UAAU,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,KAAK,uCAAuC,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,IAAI,4BAA4B,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,uBAAuB,MAAM,CAAC,KAAK,0CAA0C,CAAC,CAAC;IACjH,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Structured logger for CLI output.
3
+ */
4
+ import { colors } from "./colors.js";
5
+ export const log = {
6
+ info: (msg) => console.log(`${colors.blue}${msg}${colors.reset}`),
7
+ success: (msg) => console.log(`${colors.green}✓ ${msg}${colors.reset}`),
8
+ warn: (msg) => console.log(`${colors.yellow}⚠️ ${msg}${colors.reset}`),
9
+ error: (msg) => console.log(`${colors.red}❌ ${msg}${colors.reset}`),
10
+ help: (msg) => console.log(` ${colors.cyan}${msg}${colors.reset}`),
11
+ header: (msg) => console.log(`${colors.bright}${msg}${colors.reset}`),
12
+ };
13
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/lib/cli/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACzE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CACvB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACvD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CACpB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACzD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC3E,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC3E,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;CAC9E,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * add command - enables a feature flag and regenerates.
3
+ */
4
+ import { readFileSync, writeFileSync } from "fs";
5
+ import { join } from "path";
6
+ import { log } from "../cli/logger.js";
7
+ import { loadConfigAsync } from "../config/loader.js";
8
+ import { defaultConfig } from "../shared/config-types.js";
9
+ import { generateCommand } from "./generate.js";
10
+ const featureMap = {
11
+ offline: { offlineReads: true },
12
+ "mutation-queue": { mutationQueue: true },
13
+ mutationqueue: { mutationQueue: true },
14
+ pwa: { pwa: true },
15
+ "cross-tab": { crossTabSync: true },
16
+ crosstab: { crossTabSync: true },
17
+ auth: { auth: true },
18
+ "tag-invalidation": { tagInvalidation: true },
19
+ taginvalidation: { tagInvalidation: true },
20
+ "background-sync": { backgroundSync: true },
21
+ backgroundsync: { backgroundSync: true },
22
+ indexeddb: { indexeddb: true },
23
+ };
24
+ export async function addCommand(projectRoot, feature) {
25
+ log.header(`Adding ${feature} feature`);
26
+ const configUpdate = featureMap[feature.toLowerCase()];
27
+ if (!configUpdate) {
28
+ log.error(`Unknown feature: ${feature}`);
29
+ log.info("Available features: offline, mutation-queue, pwa, cross-tab, auth, tag-invalidation, background-sync, indexeddb");
30
+ return;
31
+ }
32
+ const { configPath } = await loadConfigAsync(projectRoot);
33
+ const resolvedConfigPath = configPath || join(projectRoot, "swoff.config.json");
34
+ if (!configPath) {
35
+ log.warn("No config found. Creating new config with feature...");
36
+ const newConfig = {
37
+ ...defaultConfig,
38
+ $schema: "https://swoff.netlify.app/schema/v1.json",
39
+ minSupportedVersion: "0.0.0",
40
+ features: {
41
+ ...defaultConfig.features,
42
+ offlineReads: false,
43
+ crossTabSync: false,
44
+ },
45
+ };
46
+ writeFileSync(resolvedConfigPath, JSON.stringify(newConfig, null, 2));
47
+ log.success(`Created swoff.config.json with ${feature} feature`);
48
+ }
49
+ else {
50
+ const raw = JSON.parse(readFileSync(resolvedConfigPath, "utf8"));
51
+ raw.features = { ...raw.features, ...configUpdate };
52
+ writeFileSync(resolvedConfigPath, JSON.stringify(raw, null, 2));
53
+ log.success(`Updated swoff.config.json with ${feature} feature`);
54
+ }
55
+ await generateCommand(projectRoot);
56
+ log.success(`${feature} feature added successfully!`);
57
+ }
58
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/lib/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * clean command - removes Swoff trace from the project (swoff/, config, version info).
3
+ */
4
+ import { rmSync, existsSync } from "fs";
5
+ import { join } from "path";
6
+ import { log } from "../cli/logger.js";
7
+ import { loadConfigAsync } from "../config/loader.js";
8
+ export async function cleanCommand(projectRoot) {
9
+ log.header("Removing Swoff");
10
+ const { config, configPath } = await loadConfigAsync(projectRoot);
11
+ const configFiles = ["swoff.config.json", "swoff.config.js"];
12
+ const outputDir = config?.build?.outputDir || "dist";
13
+ let count = 0;
14
+ const swoffDir = join(projectRoot, "swoff");
15
+ if (existsSync(swoffDir)) {
16
+ rmSync(swoffDir, { recursive: true, force: true });
17
+ log.info("Removed swoff/");
18
+ count++;
19
+ }
20
+ const existingConfig = configFiles.find((f) => existsSync(join(projectRoot, f)));
21
+ if (existingConfig) {
22
+ rmSync(join(projectRoot, existingConfig));
23
+ log.info(`Removed ${existingConfig}`);
24
+ count++;
25
+ }
26
+ const versionPath = join(projectRoot, outputDir, "version.json");
27
+ if (existsSync(versionPath)) {
28
+ rmSync(versionPath);
29
+ log.info(`Removed ${outputDir}/version.json`);
30
+ count++;
31
+ }
32
+ if (count === 0) {
33
+ log.info("No Swoff files found to remove.");
34
+ }
35
+ else {
36
+ log.success("Swoff has been removed from the project.");
37
+ }
38
+ }
39
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../../src/lib/commands/clean.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE7B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,MAAM,CAAC;IAErD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3B,KAAK,EAAE,CAAC;IACV,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,WAAW,cAAc,EAAE,CAAC,CAAC;QACtC,KAAK,EAAE,CAAC;IACV,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,WAAW,CAAC,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,WAAW,SAAS,eAAe,CAAC,CAAC;QAC9C,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * generate command - orchestrates SW and file generation.
3
+ * Uses direct imports (no subprocess spawning) for a single status line.
4
+ */
5
+ import { log } from "../cli/logger.js";
6
+ import { loadConfig } from "../config/loader.js";
7
+ import { detectProjectLanguage } from "../utils/detect-language.js";
8
+ import { generateSW } from "../generators/sw-generator.js";
9
+ import { generateFiles } from "../generators/swoff-files-generator.js";
10
+ import { join } from "path";
11
+ function statusLine(msg) {
12
+ if (process.stdout.isTTY) {
13
+ const cols = process.stdout.columns || 80;
14
+ process.stdout.write(`\r${" ".repeat(cols - 1)}\r ${msg}`);
15
+ }
16
+ else {
17
+ console.log(` ${msg}`);
18
+ }
19
+ }
20
+ function clearStatusLine() {
21
+ if (process.stdout.isTTY) {
22
+ const cols = process.stdout.columns || 80;
23
+ process.stdout.write(`\r${" ".repeat(cols - 1)}\r`);
24
+ }
25
+ }
26
+ export async function generateCommand(projectRoot, options = {}) {
27
+ const { swOnly = false, filesOnly = false, language } = options;
28
+ log.header("Generating Swoff Files");
29
+ const { config, configPath } = loadConfig(projectRoot);
30
+ if (!configPath) {
31
+ log.warn('No swoff.config.json found. Run "swoff init" first.');
32
+ return;
33
+ }
34
+ log.info(`Config: ${configPath}`);
35
+ const detectedLang = language ?? detectProjectLanguage(projectRoot);
36
+ log.info(`Language: ${detectedLang}`);
37
+ if (!filesOnly) {
38
+ statusLine("→ Service worker...");
39
+ try {
40
+ await generateSW({
41
+ projectRoot,
42
+ configPath,
43
+ onStatus: (msg) => statusLine(msg),
44
+ });
45
+ }
46
+ catch (err) {
47
+ clearStatusLine();
48
+ log.error(`Service worker failed: ${err instanceof Error ? err.message : String(err)}`);
49
+ }
50
+ }
51
+ if (!swOnly) {
52
+ const ext = detectedLang === "ts" ? "ts" : "js";
53
+ const swoffDir = join(projectRoot, "swoff");
54
+ const generatedFiles = [];
55
+ const ctx = {
56
+ config,
57
+ projectRoot,
58
+ swoffDir,
59
+ ext,
60
+ generatedFiles,
61
+ };
62
+ statusLine("→ Files...");
63
+ try {
64
+ const files = generateFiles(ctx, (name) => statusLine(`→ ${name}...`));
65
+ clearStatusLine();
66
+ log.success(`Generated ${files.length} supporting files`);
67
+ }
68
+ catch (err) {
69
+ clearStatusLine();
70
+ log.error(`File generation failed: ${err instanceof Error ? err.message : String(err)}`);
71
+ }
72
+ }
73
+ log.success("Generation complete!");
74
+ log.info("Next steps:");
75
+ log.help("1. Import the SW injector in your app entry point:");
76
+ log.help(" import { initServiceWorker, shouldRegisterSW } from './swoff/sw-injector.js';");
77
+ log.help(" if (shouldRegisterSW()) initServiceWorker();");
78
+ log.help("2. Use the fetch wrapper for API calls:");
79
+ log.help(" import { fetchWithCache } from './swoff/fetch-wrapper.js';");
80
+ log.help(" const data = await fetchWithCache('/api/data').then(r => r.json());");
81
+ log.help('3. Add to your build script: "build": "your-build && node swoff/sw-generator.js"');
82
+ log.help("4. Read the docs: https://swoff.netlify.app/docs");
83
+ }
84
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/lib/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * info command - displays configuration summary and generated files.
3
+ */
4
+ import { readFileSync, existsSync, readdirSync } from "fs";
5
+ import { join } from "path";
6
+ import { log } from "../cli/logger.js";
7
+ import { loadConfigAsync } from "../config/loader.js";
8
+ export async function infoCommand(projectRoot) {
9
+ log.header("Swoff Configuration Summary");
10
+ const { config, configPath } = await loadConfigAsync(projectRoot);
11
+ if (!configPath) {
12
+ log.warn('No swoff.config.json found. Run "swoff init" first.');
13
+ return;
14
+ }
15
+ log.info(`Version: ${config.version}`);
16
+ log.info(`SW Version: ${config.version === "from-package" ? "(from package.json)" : config.version}`);
17
+ log.info(`Default Strategy: ${config.serviceWorker.defaultStrategy}`);
18
+ log.info(`Auto Register: ${config.serviceWorker.autoRegister}`);
19
+ log.info(`Auto Update: ${config.serviceWorker.autoUpdate}`);
20
+ const enabledFeatures = Object.entries(config.features)
21
+ .filter(([_, v]) => v)
22
+ .map(([k]) => k);
23
+ log.info("\nFeatures Enabled:");
24
+ enabledFeatures.forEach((f) => log.help(` ${f}`));
25
+ log.info("\nGenerated Files:");
26
+ const swoffDir = join(projectRoot, "swoff");
27
+ if (existsSync(swoffDir)) {
28
+ const files = readdirSync(swoffDir);
29
+ files.forEach((f) => log.help(` swoff/${f}`));
30
+ }
31
+ const manifestPath = join(projectRoot, "public", "manifest.json");
32
+ if (existsSync(manifestPath)) {
33
+ log.help(" public/manifest.json");
34
+ }
35
+ const outputDir = config.build.outputDir || "dist";
36
+ const swFilename = config.build.swFilename || "sw";
37
+ const versionPath = join(projectRoot, outputDir, "version.json");
38
+ if (existsSync(versionPath)) {
39
+ const versionInfo = JSON.parse(readFileSync(versionPath, "utf8"));
40
+ log.info(`\nService Worker: ${outputDir}/${swFilename}-v${versionInfo.version}.js`);
41
+ log.info(`Version Info: ${outputDir}/version.json`);
42
+ }
43
+ }
44
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACnD,GAAG,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAE1C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAElE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACtG,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IAE5D,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SACpD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnD,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,GAAG,CAAC,IAAI,CAAC,qBAAqB,SAAS,IAAI,UAAU,KAAK,WAAW,CAAC,OAAO,KAAK,CAAC,CAAC;QACpF,GAAG,CAAC,IAAI,CAAC,iBAAiB,SAAS,eAAe,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * init command - creates swoff.config.json and swoff/ directory.
3
+ */
4
+ import { writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join } from "path";
6
+ import { log } from "../cli/logger.js";
7
+ import { defaultInitConfig } from "../shared/config-types.js";
8
+ export async function initCommand(projectRoot, framework) {
9
+ log.header("Initializing Swoff");
10
+ const configFiles = ["swoff.config.json", "swoff.config.js"];
11
+ const existingConfig = configFiles.find((f) => existsSync(join(projectRoot, f)));
12
+ if (existingConfig) {
13
+ log.warn(`Found existing ${existingConfig}. Skipping init.`);
14
+ log.info("To reinitialize, delete the config file first.");
15
+ return;
16
+ }
17
+ const config = { ...defaultInitConfig };
18
+ if (framework === "react-vite" || framework === "nextjs" || framework === "vue-vite") {
19
+ config.features.mutationQueue = true;
20
+ config.serviceWorker.strategies = {
21
+ "/api/*": "network-first",
22
+ "/static/*": "cache-first",
23
+ "/assets/*": "cache-first",
24
+ };
25
+ }
26
+ const configPath = join(projectRoot, "swoff.config.json");
27
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
28
+ log.info("Created swoff.config.json");
29
+ const dirs = ["swoff"];
30
+ for (const dir of dirs) {
31
+ const dirPath = join(projectRoot, dir);
32
+ if (!existsSync(dirPath)) {
33
+ mkdirSync(dirPath, { recursive: true });
34
+ log.info(`Created ${dir}/`);
35
+ }
36
+ }
37
+ log.success("Swoff initialized successfully!");
38
+ log.info("Next steps:");
39
+ log.help("1. Review swoff.config.json and customize as needed");
40
+ log.help("2. Run: swoff generate");
41
+ log.help("3. Import the SW injector in your app entry point:");
42
+ log.help(" import { initServiceWorker, shouldRegisterSW } from './swoff/sw-injector.js';");
43
+ log.help(" if (shouldRegisterSW()) initServiceWorker();");
44
+ log.help("4. Read the docs: https://swoff.netlify.app/docs");
45
+ }
46
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/lib/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,2BAA2B,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAkB;IACvE,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,kBAAkB,cAAc,kBAAkB,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAErD,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QACrF,MAAM,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,UAAU,GAAG;YAChC,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,aAAa;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC1D,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC/C,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACnC,GAAG,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAC/D,GAAG,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IAC7F,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * validate command - validates swoff.config.json against expected schema.
3
+ */
4
+ import { log } from "../cli/logger.js";
5
+ import { loadConfigAsync } from "../config/loader.js";
6
+ import { validateConfig } from "../config/validator.js";
7
+ export async function validateCommand(projectRoot) {
8
+ log.header("Validating Swoff Configuration");
9
+ const { config, configPath, configSource } = await loadConfigAsync(projectRoot);
10
+ if (!configPath) {
11
+ log.warn('No swoff.config.json found. Run "swoff init" first.');
12
+ return;
13
+ }
14
+ log.info(`Validating ${configPath}...`);
15
+ const errors = validateConfig(config);
16
+ if (errors.length > 0) {
17
+ log.error(`Validation failed with ${errors.length} error(s):`);
18
+ errors.forEach((e) => log.help(` - ${e}`));
19
+ return;
20
+ }
21
+ log.success("Configuration is valid!");
22
+ log.info("\nConfig summary:");
23
+ log.help(`Version: ${config.version}`);
24
+ log.help(`Default strategy: ${config.serviceWorker.defaultStrategy}`);
25
+ log.help(`Features enabled: ${Object.entries(config.features)
26
+ .filter(([_, v]) => v)
27
+ .map(([k]) => k)
28
+ .join(", ")}`);
29
+ }
30
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/lib/commands/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,GAAG,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAE7C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAEhF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,cAAc,CAAC,MAA4C,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CACN,qBAAqB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Config loader - reads and merges swoff.config.json/JS with defaults.
3
+ * Eliminates duplicated config-loading logic across CLI commands and generators.
4
+ */
5
+ import { readFileSync, existsSync } from "fs";
6
+ import { join } from "path";
7
+ import { defaultConfig, mergeConfigs } from "../shared/config-types.js";
8
+ /**
9
+ * Load config from project root. Tries JSON first, then JS.
10
+ * Falls back to defaults if no config found or parse fails.
11
+ */
12
+ export function loadConfig(projectRoot, explicitPath) {
13
+ const configFiles = ["swoff.config.json", "swoff.config.js"];
14
+ // If an explicit path was provided, use it
15
+ if (explicitPath && existsSync(explicitPath)) {
16
+ if (explicitPath.endsWith(".json")) {
17
+ try {
18
+ const raw = JSON.parse(readFileSync(explicitPath, "utf8"));
19
+ return {
20
+ config: mergeConfigs(defaultConfig, raw),
21
+ configPath: explicitPath,
22
+ configSource: "JSON",
23
+ };
24
+ }
25
+ catch {
26
+ return { config: defaultConfig, configPath: null, configSource: "defaults" };
27
+ }
28
+ }
29
+ }
30
+ // Try each config file in order
31
+ for (const file of configFiles) {
32
+ const path = join(projectRoot, file);
33
+ if (!existsSync(path))
34
+ continue;
35
+ if (file.endsWith(".json")) {
36
+ try {
37
+ const raw = JSON.parse(readFileSync(path, "utf8"));
38
+ return {
39
+ config: mergeConfigs(defaultConfig, raw),
40
+ configPath: path,
41
+ configSource: "JSON",
42
+ };
43
+ }
44
+ catch {
45
+ // Continue to try JS config below
46
+ }
47
+ }
48
+ // Return the JS path so loadConfigAsync can dynamically import it
49
+ if (file.endsWith(".js")) {
50
+ return {
51
+ config: defaultConfig,
52
+ configPath: path,
53
+ configSource: "JavaScript",
54
+ };
55
+ }
56
+ }
57
+ return { config: defaultConfig, configPath: null, configSource: "defaults" };
58
+ }
59
+ /**
60
+ * Async version that also tries to load .js configs via dynamic import.
61
+ */
62
+ export async function loadConfigAsync(projectRoot, explicitPath) {
63
+ const syncResult = loadConfig(projectRoot, explicitPath);
64
+ if (syncResult.configPath && syncResult.configPath.endsWith(".js")) {
65
+ try {
66
+ const mod = await import(syncResult.configPath);
67
+ const raw = (mod.default || mod);
68
+ return {
69
+ config: mergeConfigs(defaultConfig, raw),
70
+ configPath: syncResult.configPath,
71
+ configSource: "JavaScript",
72
+ };
73
+ }
74
+ catch {
75
+ return { config: defaultConfig, configPath: null, configSource: "defaults" };
76
+ }
77
+ }
78
+ return syncResult;
79
+ }
80
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/lib/config/loader.ts"],"names":[],"mappings":"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"}