registry.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. (function attachBackgroundStepRegistry(root, factory) {
  2. root.MultiPageBackgroundStepRegistry = factory();
  3. })(typeof self !== 'undefined' ? self : globalThis, function createBackgroundStepRegistryModule() {
  4. function createStepRegistry(definitions = []) {
  5. const ordered = (Array.isArray(definitions) ? definitions : [])
  6. .map((definition) => ({
  7. id: Number(definition?.id),
  8. order: Number(definition?.order),
  9. key: String(definition?.key || '').trim(),
  10. title: String(definition?.title || '').trim(),
  11. execute: definition?.execute,
  12. }))
  13. .filter((definition) => Number.isFinite(definition.id) && typeof definition.execute === 'function')
  14. .sort((left, right) => {
  15. const leftOrder = Number.isFinite(left.order) ? left.order : left.id;
  16. const rightOrder = Number.isFinite(right.order) ? right.order : right.id;
  17. return leftOrder - rightOrder;
  18. });
  19. const byId = new Map(ordered.map((definition) => [definition.id, definition]));
  20. function getStepDefinition(step) {
  21. return byId.get(Number(step)) || null;
  22. }
  23. function getOrderedSteps() {
  24. return ordered.slice();
  25. }
  26. function executeStep(step, state) {
  27. const definition = getStepDefinition(step);
  28. if (!definition) {
  29. throw new Error(`未知步骤:${step}`);
  30. }
  31. return definition.execute(state);
  32. }
  33. return {
  34. executeStep,
  35. getOrderedSteps,
  36. getStepDefinition,
  37. };
  38. }
  39. return {
  40. createStepRegistry,
  41. };
  42. });