@swoff/cli 0.3.3 → 0.3.5

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 (67) hide show
  1. package/README.md +23 -15
  2. package/dist/__tests__/assemble-sw.test.js +26 -11
  3. package/dist/__tests__/assemble-sw.test.js.map +1 -1
  4. package/dist/__tests__/cli-integration.test.js +11 -14
  5. package/dist/__tests__/cli-integration.test.js.map +1 -1
  6. package/dist/__tests__/config-types.test.js +19 -22
  7. package/dist/__tests__/config-types.test.js.map +1 -1
  8. package/dist/__tests__/file-generators.test.js +9 -97
  9. package/dist/__tests__/file-generators.test.js.map +1 -1
  10. package/dist/__tests__/loader.test.js +6 -6
  11. package/dist/__tests__/loader.test.js.map +1 -1
  12. package/dist/__tests__/validator.test.js +47 -38
  13. package/dist/__tests__/validator.test.js.map +1 -1
  14. package/dist/index.js +2 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/lib/cli/help.js +3 -3
  17. package/dist/lib/cli/help.js.map +1 -1
  18. package/dist/lib/commands/add.js +14 -5
  19. package/dist/lib/commands/add.js.map +1 -1
  20. package/dist/lib/commands/generate-guide.js +122 -0
  21. package/dist/lib/commands/generate-guide.js.map +1 -0
  22. package/dist/lib/commands/generate.js +7 -10
  23. package/dist/lib/commands/generate.js.map +1 -1
  24. package/dist/lib/commands/info.js +10 -4
  25. package/dist/lib/commands/info.js.map +1 -1
  26. package/dist/lib/commands/init.js +6 -12
  27. package/dist/lib/commands/init.js.map +1 -1
  28. package/dist/lib/commands/validate.js +8 -2
  29. package/dist/lib/commands/validate.js.map +1 -1
  30. package/dist/lib/config/validator.js +52 -51
  31. package/dist/lib/config/validator.js.map +1 -1
  32. package/dist/lib/generators/file-generators/auth-fetch.js +156 -0
  33. package/dist/lib/generators/file-generators/auth-fetch.js.map +1 -0
  34. package/dist/lib/generators/file-generators/auth-state.js +38 -0
  35. package/dist/lib/generators/file-generators/auth-state.js.map +1 -0
  36. package/dist/lib/generators/file-generators/auth-store.js +127 -0
  37. package/dist/lib/generators/file-generators/auth-store.js.map +1 -0
  38. package/dist/lib/generators/file-generators/auth-user.js +95 -0
  39. package/dist/lib/generators/file-generators/auth-user.js.map +1 -0
  40. package/dist/lib/generators/file-generators/context.js.map +1 -1
  41. package/dist/lib/generators/file-generators/generate-hooks.js +167 -0
  42. package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -0
  43. package/dist/lib/generators/file-generators/mutation-queue.js +27 -5
  44. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
  45. package/dist/lib/generators/file-generators/store.js +1 -1
  46. package/dist/lib/generators/file-generators/store.js.map +1 -1
  47. package/dist/lib/generators/file-generators/sw-generator-build.js +1 -1
  48. package/dist/lib/generators/file-generators/sw-injector.js +5 -2
  49. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
  50. package/dist/lib/generators/file-generators/type-definitions.js +4 -1
  51. package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
  52. package/dist/lib/generators/sw-sections/assemble-sw.js +6 -4
  53. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
  54. package/dist/lib/generators/sw-sections/background-sync-handler.js +9 -6
  55. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
  56. package/dist/lib/generators/sw-sections/config-header.js +2 -2
  57. package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
  58. package/dist/lib/generators/sw-sections/message-handler.js +12 -2
  59. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
  60. package/dist/lib/generators/swoff-files-generator.js +11 -2
  61. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  62. package/dist/lib/shared/config-types.js +34 -24
  63. package/dist/lib/shared/config-types.js.map +1 -1
  64. package/dist/lib/utils/detect-framework.js +33 -0
  65. package/dist/lib/utils/detect-framework.js.map +1 -0
  66. package/package.json +2 -3
  67. package/src/lib/templates/sw-template.js +0 -61
@@ -14,11 +14,17 @@ export async function infoCommand(projectRoot) {
14
14
  }
15
15
  log.normal(`Version: ${config.version}`);
16
16
  log.normal(`SW Version: ${config.version === "from-package" ? "(from package.json)" : config.version}`);
17
- log.normal(`Default Strategy: ${config.serviceWorker.defaultStrategy}`);
18
- log.normal(`Auto Register: ${config.serviceWorker.autoRegister}`);
19
- log.normal(`Auto Activate: ${config.serviceWorker.autoActivate}`);
17
+ log.normal(`Default Strategy: ${config.features.serviceWorker.defaultStrategy}`);
18
+ log.normal(`Auto Register: ${config.features.serviceWorker.autoRegister}`);
19
+ log.normal(`Auto Activate: ${config.features.serviceWorker.autoActivate}`);
20
20
  const enabledFeatures = Object.entries(config.features)
21
- .filter(([_, v]) => v)
21
+ .filter(([k, v]) => {
22
+ if (k === "serviceWorker")
23
+ return false;
24
+ if (typeof v === "object" && v !== null)
25
+ return v.enabled === true;
26
+ return v === true;
27
+ })
22
28
  .map(([k]) => k);
23
29
  log.normal("Features Enabled:");
24
30
  enabledFeatures.forEach((f) => log.help(` ${f}`));
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/lib/commands/info.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { writeFileSync, existsSync, mkdirSync } from "fs";
5
5
  import { join } from "path";
6
6
  import { log } from "../cli/logger.js";
7
7
  import { defaultInitConfig } from "../shared/config-types.js";
8
+ import { detectFramework } from "../utils/detect-framework.js";
8
9
  export async function initCommand(projectRoot, framework) {
9
10
  log.header("Initializing Swoff");
10
11
  const configFiles = ["swoff.config.json", "swoff.config.js"];
@@ -14,21 +15,14 @@ export async function initCommand(projectRoot, framework) {
14
15
  log.info("To reinitialize, delete the config file first.");
15
16
  return;
16
17
  }
17
- const config = { ...defaultInitConfig };
18
- if (framework === "react-vite" ||
19
- framework === "nextjs" ||
20
- framework === "vue-vite") {
21
- config.features.mutationQueue = true;
22
- config.serviceWorker.strategies = {
23
- "/api/*": "network-first",
24
- "/static/*": "cache-first",
25
- "/assets/*": "cache-first",
26
- };
27
- }
18
+ const config = {
19
+ ...defaultInitConfig,
20
+ framework: (framework || detectFramework(projectRoot)),
21
+ };
28
22
  const configPath = join(projectRoot, "swoff.config.json");
29
23
  writeFileSync(configPath, JSON.stringify(config, null, 2));
30
24
  log.info("Created swoff.config.json");
31
- const dirs = ["swoff"];
25
+ const dirs = ["swoff", "swoff/hooks"];
32
26
  for (const dir of dirs) {
33
27
  const dirPath = join(projectRoot, dir);
34
28
  if (!existsSync(dirPath)) {
@@ -1 +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,CAC5C,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;IAEF,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,IACE,SAAS,KAAK,YAAY;QAC1B,SAAS,KAAK,QAAQ;QACtB,SAAS,KAAK,UAAU,EACxB,CAAC;QACD,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,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AAC/D,CAAC"}
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;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,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,CAC5C,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;IAEF,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;QAC1B,GAAG,iBAAiB;QACpB,SAAS,EAAE,CAAC,SAAS,IAAI,eAAe,CAAC,WAAW,CAAC,CAA6B;KACnF,CAAC;IAEF,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,EAAE,aAAa,CAAC,CAAC;IACtC,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,MAAM,CAAC,eAAe,CAAC,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AAC/D,CAAC"}
@@ -21,9 +21,15 @@ export async function validateCommand(projectRoot) {
21
21
  log.success("Configuration is valid!");
22
22
  log.info("\nConfig summary:");
23
23
  log.help(`Version: ${config.version}`);
24
- log.help(`Default strategy: ${config.serviceWorker.defaultStrategy}`);
24
+ log.help(`Default strategy: ${config.features.serviceWorker.defaultStrategy}`);
25
25
  log.help(`Features enabled: ${Object.entries(config.features)
26
- .filter(([_, v]) => v)
26
+ .filter(([k, v]) => {
27
+ if (k === "serviceWorker")
28
+ return false;
29
+ if (typeof v === "object" && v !== null)
30
+ return v.enabled === true;
31
+ return v === true;
32
+ })
27
33
  .map(([k]) => k)
28
34
  .join(", ")}`);
29
35
  }
@@ -1 +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"}
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,QAAQ,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;IAC/E,GAAG,CAAC,IAAI,CACN,qBAAqB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,KAAK,eAAe;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAQ,CAA6B,CAAC,OAAO,KAAK,IAAI,CAAC;QAChG,OAAO,CAAC,KAAK,IAAI,CAAC;IACpB,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;AACJ,CAAC"}
@@ -1,40 +1,11 @@
1
1
  import { KNOWN_FEATURES, OBJECT_FEATURES, VALID_STRATEGIES } from "../shared/config-types.js";
2
2
  export function validateConfig(config) {
3
3
  const errors = [];
4
- const requiredFields = ["enabled", "version", "serviceWorker", "features", "build"];
4
+ const requiredFields = ["enabled", "version", "features", "build"];
5
5
  const missingFields = requiredFields.filter((field) => config[field] === undefined || config[field] === null);
6
6
  if (missingFields.length > 0) {
7
7
  errors.push(`Missing required fields: ${missingFields.join(", ")}`);
8
8
  }
9
- if (config.serviceWorker) {
10
- const sw = config.serviceWorker;
11
- if (sw.autoRegister !== undefined && typeof sw.autoRegister !== "boolean") {
12
- errors.push("serviceWorker.autoRegister must be a boolean");
13
- }
14
- if (sw.autoActivate !== undefined && typeof sw.autoActivate !== "boolean") {
15
- errors.push("serviceWorker.autoActivate must be a boolean");
16
- }
17
- if (sw.defaultStrategy && !VALID_STRATEGIES.includes(sw.defaultStrategy)) {
18
- errors.push(`Invalid defaultStrategy "${sw.defaultStrategy}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
19
- }
20
- if (sw.strategies && typeof sw.strategies === "object") {
21
- const strategies = sw.strategies;
22
- for (const [pattern, strategy] of Object.entries(strategies)) {
23
- if (!VALID_STRATEGIES.includes(strategy)) {
24
- errors.push(`Invalid strategy "${strategy}" for pattern "${pattern}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
25
- }
26
- }
27
- }
28
- if (sw.clearRuntimeOnUpdate !== undefined && typeof sw.clearRuntimeOnUpdate !== "boolean") {
29
- errors.push("serviceWorker.clearRuntimeOnUpdate must be a boolean");
30
- }
31
- if (sw.navigationMode !== undefined && !["spa", "default"].includes(sw.navigationMode)) {
32
- errors.push('serviceWorker.navigationMode must be "spa" or "default"');
33
- }
34
- if (sw.spaEntry !== undefined && typeof sw.spaEntry !== "string") {
35
- errors.push("serviceWorker.spaEntry must be a string");
36
- }
37
- }
38
9
  if (config.features) {
39
10
  const features = config.features;
40
11
  for (const [key, value] of Object.entries(features)) {
@@ -61,35 +32,61 @@ export function validateConfig(config) {
61
32
  errors.push("features.pwa.preventDefaultInstall must be a boolean");
62
33
  }
63
34
  }
35
+ const sw = features.serviceWorker;
36
+ if (sw) {
37
+ if (sw.autoRegister !== undefined && typeof sw.autoRegister !== "boolean") {
38
+ errors.push("features.serviceWorker.autoRegister must be a boolean");
39
+ }
40
+ if (sw.autoActivate !== undefined && typeof sw.autoActivate !== "boolean") {
41
+ errors.push("features.serviceWorker.autoActivate must be a boolean");
42
+ }
43
+ if (sw.defaultStrategy && !VALID_STRATEGIES.includes(sw.defaultStrategy)) {
44
+ errors.push(`Invalid defaultStrategy "${sw.defaultStrategy}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
45
+ }
46
+ if (sw.strategies && typeof sw.strategies === "object") {
47
+ const strategies = sw.strategies;
48
+ for (const [pattern, strategy] of Object.entries(strategies)) {
49
+ if (!VALID_STRATEGIES.includes(strategy)) {
50
+ errors.push(`Invalid strategy "${strategy}" for pattern "${pattern}". Must be one of: ${VALID_STRATEGIES.join(", ")}`);
51
+ }
52
+ }
53
+ }
54
+ if (sw.clearRuntimeOnUpdate !== undefined && typeof sw.clearRuntimeOnUpdate !== "boolean") {
55
+ errors.push("features.serviceWorker.clearRuntimeOnUpdate must be a boolean");
56
+ }
57
+ if (sw.versionedSw !== undefined && typeof sw.versionedSw !== "boolean") {
58
+ errors.push("features.serviceWorker.versionedSw must be a boolean");
59
+ }
60
+ if (sw.navigationMode !== undefined && !["spa", "default"].includes(sw.navigationMode)) {
61
+ errors.push('features.serviceWorker.navigationMode must be "spa" or "default"');
62
+ }
63
+ if (sw.spaEntry !== undefined && typeof sw.spaEntry !== "string") {
64
+ errors.push("features.serviceWorker.spaEntry must be a string");
65
+ }
66
+ }
64
67
  const tagInvalidationVal = features.tagInvalidation;
65
68
  const crossTabSyncVal = features.crossTabSync;
66
69
  if (crossTabSyncVal === true && tagInvalidationVal !== true) {
67
70
  errors.push("crossTabSync requires tagInvalidation to be enabled");
68
71
  }
69
- const indexeddb = features.indexeddb;
70
- if (indexeddb && typeof indexeddb === "object") {
71
- if (indexeddb.enabled !== undefined && typeof indexeddb.enabled !== "boolean") {
72
- errors.push("features.indexeddb.enabled must be a boolean");
73
- }
74
- if (indexeddb.name !== undefined && typeof indexeddb.name !== "string") {
75
- errors.push("features.indexeddb.name must be a string");
72
+ const backgroundSyncVal = features.backgroundSync;
73
+ const mutationQueueVal = features.mutationQueue;
74
+ if (backgroundSyncVal === true && mutationQueueVal !== true) {
75
+ errors.push("backgroundSync requires mutationQueue to be enabled");
76
+ }
77
+ const auth = features.auth;
78
+ if (auth && typeof auth === "object") {
79
+ if (auth.enabled !== undefined && typeof auth.enabled !== "boolean") {
80
+ errors.push("features.auth.enabled must be a boolean");
76
81
  }
77
- if (indexeddb.name && typeof indexeddb.name === "string" && !/^[a-zA-Z0-9-_]+$/.test(indexeddb.name)) {
78
- errors.push(`features.indexeddb.name "${indexeddb.name}" must match pattern ^[a-zA-Z0-9-_]+$`);
82
+ if (auth.type !== undefined && !["cookie", "bearer", "custom"].includes(auth.type)) {
83
+ errors.push('features.auth.type must be "cookie", "bearer", or "custom"');
79
84
  }
80
- if (indexeddb.stores !== undefined && !Array.isArray(indexeddb.stores)) {
81
- errors.push("features.indexeddb.stores must be an array");
85
+ if (auth.refreshPath !== undefined && typeof auth.refreshPath !== "string") {
86
+ errors.push("features.auth.refreshPath must be a string");
82
87
  }
83
- if (indexeddb.stores && Array.isArray(indexeddb.stores)) {
84
- for (const store of indexeddb.stores) {
85
- if (typeof store !== "string") {
86
- errors.push("features.indexeddb.stores must contain only strings");
87
- break;
88
- }
89
- if (!/^[a-zA-Z0-9-_]+$/.test(store)) {
90
- errors.push(`features.indexeddb.store "${store}" must match pattern ^[a-zA-Z0-9-_]+$`);
91
- }
92
- }
88
+ if (auth.userEndpoint !== undefined && typeof auth.userEndpoint !== "string") {
89
+ errors.push("features.auth.userEndpoint must be a string");
93
90
  }
94
91
  }
95
92
  }
@@ -103,6 +100,10 @@ export function validateConfig(config) {
103
100
  errors.push(`Invalid minSupportedVersion "${config.minSupportedVersion}". Must be semver (e.g., "1.0.0")`);
104
101
  }
105
102
  }
103
+ const fw = config.framework;
104
+ if (fw !== undefined && typeof fw === "string" && !["react", "vue", "svelte", "vanilla"].includes(fw)) {
105
+ errors.push('framework must be "react", "vue", "svelte", or "vanilla"');
106
+ }
106
107
  if (config.build) {
107
108
  const build = config.build;
108
109
  if (build.outputDir && typeof build.outputDir !== "string") {
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/config/validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/config/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Generates auth-fetch.ts/js — config-driven authenticated fetch wrapper.
3
+ * Uses auth config to generate appropriate withAuthHeaders() and isAuthUrl().
4
+ */
5
+ import { writeFile } from "./context.js";
6
+ export function generateAuthFetch(ctx) {
7
+ const ext = ctx.ext;
8
+ const authConfig = ctx.config.features.auth;
9
+ const { refreshPath, userEndpoint, type } = authConfig;
10
+ function generateWithAuthHeaders() {
11
+ switch (type) {
12
+ case "cookie":
13
+ return `function withAuthHeaders(headers, _auth) {
14
+ // Cookie/Session auth — browser auto-sends cookies.
15
+ // No header modification needed.
16
+ return headers;
17
+ }`;
18
+ case "bearer":
19
+ return `function withAuthHeaders(headers, auth) {
20
+ // --- EDIT THIS BLOCK FOR YOUR BACKEND ---
21
+ // JWT Bearer token:
22
+ if (auth?.token) {
23
+ headers.set("Authorization", \`Bearer \${auth.token}\`);
24
+ }
25
+ // --- END OF EDITABLE BLOCK ---
26
+ return headers;
27
+ }`;
28
+ case "custom":
29
+ return `function withAuthHeaders(headers, auth) {
30
+ // --- EDIT THIS BLOCK FOR YOUR BACKEND ---
31
+ // Custom header (e.g., X-API-Key, X-Auth-Token):
32
+ // if (auth?.token) {
33
+ // headers.set("X-Auth-Token", auth.token);
34
+ // }
35
+ // --- END OF EDITABLE BLOCK ---
36
+ return headers;
37
+ }`;
38
+ default:
39
+ return `function withAuthHeaders(headers, auth) {
40
+ // --- EDIT THIS BLOCK FOR YOUR BACKEND ---
41
+ if (auth?.token) {
42
+ headers.set("Authorization", \`Bearer \${auth.token}\`);
43
+ }
44
+ // --- END OF EDITABLE BLOCK ---
45
+ return headers;
46
+ }`;
47
+ }
48
+ }
49
+ const credentialsLine = type === "cookie"
50
+ ? `const fetchOptions = { ...options, headers, credentials: "include" };`
51
+ : `const fetchOptions = { ...options, headers };`;
52
+ const code = `/**
53
+ * Auth-Aware Fetch — attaches auth headers, excludes auth endpoints from cache,
54
+ * and handles 401 responses.
55
+ *
56
+ * Usage:
57
+ * import { authenticatedFetch } from "./auth-fetch.${ext}";
58
+ * const data = await authenticatedFetch("/api/data").then((r) => r.json());
59
+ */
60
+
61
+ import { fetchWithCache } from "./fetch-wrapper.${ext}";
62
+ import { getAuth, setAuth, clearAuth } from "./auth-store.${ext}";
63
+
64
+ ${generateWithAuthHeaders()}
65
+
66
+ /**
67
+ * Auth endpoints that should never be cached by the SW.
68
+ * Edit this list to match your backend's auth routes.
69
+ */
70
+ function isAuthUrl(url) {
71
+ const authPaths = [
72
+ "/login",
73
+ "/logout",
74
+ "/register",
75
+ "/api/login",
76
+ "/api/logout",
77
+ "/api/register",
78
+ "${refreshPath}",
79
+ "${userEndpoint}",
80
+ ];
81
+ return authPaths.some((path) => url.includes(path));
82
+ }
83
+
84
+ /**
85
+ * Auth-aware fetch wrapper.
86
+ * Attaches identity, excludes auth endpoints from cache, handles 401.
87
+ */
88
+ export async function authenticatedFetch(input, options = {}) {
89
+ const auth = await getAuth();
90
+ const headers = new Headers(options.headers);
91
+
92
+ // Attach auth headers (your backend determines how)
93
+ withAuthHeaders(headers, auth);
94
+
95
+ // Determine if this is an auth endpoint (login, logout, refresh)
96
+ const url = typeof input === "string" ? input : input.url;
97
+
98
+ // Mark auth endpoints as mutation to bypass SW cache
99
+ if (isAuthUrl(url) && !headers.has("X-SW-Cache-Strategy")) {
100
+ headers.set("X-SW-Cache-Strategy", "mutation");
101
+ }
102
+
103
+ ${credentialsLine}
104
+ const response = await fetchWithCache(input, fetchOptions);
105
+
106
+ // Handle 401 — auth expired or invalidated server-side
107
+ if (response.status === 401) {
108
+ await clearAuth();
109
+ window.dispatchEvent(new CustomEvent("sw-auth-unauthorized"));
110
+ }
111
+
112
+ return response;
113
+ }
114
+
115
+ /**
116
+ * Token refresh helper — called before requests when token may be expired.
117
+ * Uses refreshPath from config.
118
+ */
119
+ let refreshPromise = null;
120
+
121
+ export async function ensureValidAuth() {
122
+ const auth = await getAuth();
123
+ if (!auth) return null;
124
+ if (!auth.expiresAt || Date.now() < auth.expiresAt) return auth;
125
+
126
+ // Token expired — refresh it (deduplicated)
127
+ if (!refreshPromise) {
128
+ refreshPromise = (async () => {
129
+ const response = await authenticatedFetch("${refreshPath}", {
130
+ method: "POST",
131
+ headers: { "X-SW-Cache-Strategy": "mutation" },
132
+ });
133
+
134
+ if (!response.ok) {
135
+ await clearAuth();
136
+ window.dispatchEvent(new CustomEvent("sw-auth-unauthorized"));
137
+ return null;
138
+ }
139
+
140
+ const data = await response.json();
141
+ const updated = { ...auth, token: data.token, expiresAt: data.expiresAt };
142
+ await setAuth(updated);
143
+ return updated;
144
+ })();
145
+ }
146
+
147
+ try {
148
+ return await refreshPromise;
149
+ } finally {
150
+ refreshPromise = null;
151
+ }
152
+ }
153
+ `;
154
+ writeFile(ctx, `auth-fetch.${ext}`, code);
155
+ }
156
+ //# sourceMappingURL=auth-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-fetch.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;IAEvD,SAAS,uBAAuB;QAC9B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,OAAO;;;;EAIb,CAAC;YACG,KAAK,QAAQ;gBACX,OAAO;;;;;;;;EAQb,CAAC;YACG,KAAK,QAAQ;gBACX,OAAO;;;;;;;;EAQb,CAAC;YACG;gBACE,OAAO;;;;;;;EAOb,CAAC;QACC,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GACnB,IAAI,KAAK,QAAQ;QACf,CAAC,CAAC,uEAAuE;QACzE,CAAC,CAAC,+CAA+C,CAAC;IAEtD,MAAM,IAAI,GAAG;;;;;wDAKyC,GAAG;;;;kDAIT,GAAG;4DACO,GAAG;;EAE7D,uBAAuB,EAAE;;;;;;;;;;;;;;OAcpB,WAAW;OACX,YAAY;;;;;;;;;;;;;;;;;;;;;;;;IAwBf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;mDA0BgC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;CAwB7D,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Generates auth-state.ts/js — auth state detection for the 4-state matrix.
3
+ */
4
+ import { writeFile } from "./context.js";
5
+ export function generateAuthState(ctx) {
6
+ const ext = ctx.ext;
7
+ const code = `/**
8
+ * Auth State — detect the four auth states for offline/online handling.
9
+ *
10
+ * States:
11
+ * 1. Online + Authenticated → Normal (fresh data, full UI)
12
+ * 2. Online + Unauthenticated → Login prompt
13
+ * 3. Offline + Authenticated → Offline access (cached data)
14
+ * 4. Offline + Unauthenticated → Strict offline (public content only)
15
+ *
16
+ * Usage:
17
+ * import { getAuthState } from "./auth-state.${ext}";
18
+ * const { authenticated, user, online } = await getAuthState();
19
+ */
20
+
21
+ import { getAuth, isAuthValid } from "./auth-store.${ext}";
22
+ import { getCachedUser } from "./auth-user.${ext}";
23
+
24
+ export async function getAuthState() {
25
+ const auth = await getAuth();
26
+ const valid = isAuthValid(auth);
27
+ const user = valid ? await getCachedUser() : null;
28
+
29
+ return {
30
+ authenticated: valid,
31
+ user,
32
+ online: navigator.onLine,
33
+ };
34
+ }
35
+ `;
36
+ writeFile(ctx, `auth-state.${ext}`, code);
37
+ }
38
+ //# sourceMappingURL=auth-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-state.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAEpB,MAAM,IAAI,GAAG;;;;;;;;;;kDAUmC,GAAG;;;;qDAIA,GAAG;6CACX,GAAG;;;;;;;;;;;;;CAa/C,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Generates auth-store.ts/js — token storage with memory-only for token,
3
+ * IndexedDB for offline user info only (no token persisted).
4
+ *
5
+ * Security: the Bearer token lives in memory only and is cleared on page
6
+ * refresh. Only { user, expiresAt } is persisted to IndexedDB for offline
7
+ * user display. After a page refresh, re-login is required.
8
+ */
9
+ import { writeFile } from "./context.js";
10
+ export function generateAuthStore(ctx) {
11
+ const ext = ctx.ext;
12
+ const code = `/**
13
+ * Auth Store — Token in memory only; user info in IndexedDB for offline access.
14
+ *
15
+ * Security:
16
+ * The Bearer token lives in JavaScript memory and is cleared on page refresh.
17
+ * Only { user, expiresAt } is persisted to IndexedDB so the app can display
18
+ * user info offline. After a page refresh, re-login is required.
19
+ *
20
+ * Usage:
21
+ * import { setAuth, getAuth, clearAuth, isAuthValid } from "./auth-store.${ext}";
22
+ *
23
+ * await setAuth({ token, user, expiresAt });
24
+ * const auth = await getAuth();
25
+ * await clearAuth();
26
+ */
27
+
28
+ const DB_NAME = "swoff-auth";
29
+ const STORE_NAME = "auth";
30
+
31
+ let memoryAuth = null;
32
+
33
+ function openAuthDB() {
34
+ return new Promise((resolve, reject) => {
35
+ const request = indexedDB.open(DB_NAME, 1);
36
+ request.onupgradeneeded = (e) => {
37
+ const db = e.target.result;
38
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
39
+ db.createObjectStore(STORE_NAME, { keyPath: "key" });
40
+ }
41
+ };
42
+ request.onsuccess = (e) => resolve(e.target.result);
43
+ request.onerror = (e) => reject(e.target.error);
44
+ });
45
+ }
46
+
47
+ async function persistUserData(authData) {
48
+ // Only persist { user, expiresAt } — never the token
49
+ const userData = { user: authData?.user, expiresAt: authData?.expiresAt };
50
+ const db = await openAuthDB();
51
+ return new Promise((resolve, reject) => {
52
+ const tx = db.transaction(STORE_NAME, "readwrite");
53
+ const store = tx.objectStore(STORE_NAME);
54
+ const request = store.put({ key: "session", value: userData });
55
+ request.onsuccess = () => resolve();
56
+ request.onerror = () => reject(request.error);
57
+ });
58
+ }
59
+
60
+ async function loadUserData() {
61
+ const db = await openAuthDB();
62
+ return new Promise((resolve, reject) => {
63
+ const tx = db.transaction(STORE_NAME, "readonly");
64
+ const store = tx.objectStore(STORE_NAME);
65
+ const request = store.get("session");
66
+ request.onsuccess = () => resolve(request.result?.value || null);
67
+ request.onerror = () => reject(request.error);
68
+ });
69
+ }
70
+
71
+ async function clearPersistedData() {
72
+ const db = await openAuthDB();
73
+ return new Promise((resolve, reject) => {
74
+ const tx = db.transaction(STORE_NAME, "readwrite");
75
+ const store = tx.objectStore(STORE_NAME);
76
+ const request = store.delete("session");
77
+ request.onsuccess = () => resolve();
78
+ request.onerror = () => reject(request.error);
79
+ });
80
+ }
81
+
82
+ /**
83
+ * Store auth data — token stays in memory only.
84
+ * Only user info and expiry are persisted to IndexedDB.
85
+ * @param {{ token?: string, user?: object, expiresAt?: number }} authData
86
+ */
87
+ export async function setAuth(authData) {
88
+ memoryAuth = authData;
89
+ await persistUserData(authData);
90
+ }
91
+
92
+ /**
93
+ * Get stored auth — returns memory copy (with token) or
94
+ * falls back to IndexedDB (user info only, no token after refresh).
95
+ */
96
+ export async function getAuth() {
97
+ if (memoryAuth) return memoryAuth;
98
+
99
+ const userData = await loadUserData();
100
+ if (userData) {
101
+ // After refresh: user info available, but no token — re-login required
102
+ memoryAuth = userData;
103
+ }
104
+ return memoryAuth;
105
+ }
106
+
107
+ /**
108
+ * Clear auth — removes from memory and IndexedDB.
109
+ */
110
+ export async function clearAuth() {
111
+ memoryAuth = null;
112
+ await clearPersistedData();
113
+ }
114
+
115
+ /**
116
+ * Check if auth exists and is not expired.
117
+ * @param {object | null} auth — The auth object from getAuth()
118
+ */
119
+ export function isAuthValid(auth) {
120
+ if (!auth) return false;
121
+ if (!auth.expiresAt) return true;
122
+ return Date.now() < auth.expiresAt;
123
+ }
124
+ `;
125
+ writeFile(ctx, `auth-store.${ext}`, code);
126
+ }
127
+ //# sourceMappingURL=auth-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAEpB,MAAM,IAAI,GAAG;;;;;;;;;8EAS+D,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGhF,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}