@omega.js/web 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +98 -0
- package/README.md +640 -0
- package/bin/omega +2 -0
- package/bin/omega-web +2 -0
- package/bin/omg +2 -0
- package/core/_includes/admin/sections/sidebar.json +100 -0
- package/core/_includes/admin/sections/topbar.json +11 -0
- package/core/_includes/backend/sections/sidebar.json +39 -0
- package/core/_includes/backend/sections/topbar.json +16 -0
- package/core/_includes/core/body.html +102 -0
- package/core/_includes/core/foot.html +536 -0
- package/core/_includes/core/head.html +423 -0
- package/core/_includes/core/pricing/price-per-unit.html +33 -0
- package/core/_includes/core/showcase/entry-body.html +94 -0
- package/core/_includes/core/showcase/index-body.html +43 -0
- package/core/_includes/core/showcase/nav.html +60 -0
- package/core/_includes/frontend/sections/footer.json +74 -0
- package/core/_includes/frontend/sections/nav.json +70 -0
- package/core/_includes/global/sections/account.json +31 -0
- package/core/_includes/modules/engagement/giscus.html +26 -0
- package/core/_layouts/blueprint/404.html +10 -0
- package/core/_layouts/blueprint/about.html +10 -0
- package/core/_layouts/blueprint/account/index.html +11 -0
- package/core/_layouts/blueprint/admin/calendar/index.html +590 -0
- package/core/_layouts/blueprint/admin/dashboard/index.html +301 -0
- package/core/_layouts/blueprint/admin/firebase/index.html +214 -0
- package/core/_layouts/blueprint/admin/posts/editor.html +157 -0
- package/core/_layouts/blueprint/admin/posts/index.html +126 -0
- package/core/_layouts/blueprint/admin/stackblitz/index.html +30 -0
- package/core/_layouts/blueprint/admin/studio/index.html +85 -0
- package/core/_layouts/blueprint/admin/users/index.html +272 -0
- package/core/_layouts/blueprint/admin/users/new.html +82 -0
- package/core/_layouts/blueprint/admin/verts/index.html +204 -0
- package/core/_layouts/blueprint/alternatives/alternative.html +15 -0
- package/core/_layouts/blueprint/alternatives/index.html +10 -0
- package/core/_layouts/blueprint/app.html +10 -0
- package/core/_layouts/blueprint/auth/reset.html +19 -0
- package/core/_layouts/blueprint/auth/signin.html +19 -0
- package/core/_layouts/blueprint/auth/signup.html +19 -0
- package/core/_layouts/blueprint/auth/token.html +19 -0
- package/core/_layouts/blueprint/blog/categories/category.html +8 -0
- package/core/_layouts/blueprint/blog/categories/index.html +11 -0
- package/core/_layouts/blueprint/blog/index.html +10 -0
- package/core/_layouts/blueprint/blog/post.html +5 -0
- package/core/_layouts/blueprint/blog/tags/index.html +11 -0
- package/core/_layouts/blueprint/blog/tags/tag.html +8 -0
- package/core/_layouts/blueprint/careers.md +13 -0
- package/core/_layouts/blueprint/collection/category.html +9 -0
- package/core/_layouts/blueprint/collection/document.html +9 -0
- package/core/_layouts/blueprint/collection/index.html +9 -0
- package/core/_layouts/blueprint/connections/callback.html +11 -0
- package/core/_layouts/blueprint/contact.html +14 -0
- package/core/_layouts/blueprint/dashboard/index.html +10 -0
- package/core/_layouts/blueprint/download.html +20 -0
- package/core/_layouts/blueprint/extension/index.html +14 -0
- package/core/_layouts/blueprint/extension/installed.html +11 -0
- package/core/_layouts/blueprint/feedback.html +10 -0
- package/core/_layouts/blueprint/index.html +16 -0
- package/core/_layouts/blueprint/legal/cookies.md +57 -0
- package/core/_layouts/blueprint/legal/privacy.md +109 -0
- package/core/_layouts/blueprint/legal/terms.md +155 -0
- package/core/_layouts/blueprint/payment/checkout.html +15 -0
- package/core/_layouts/blueprint/payment/confirmation.html +14 -0
- package/core/_layouts/blueprint/portal/email-preferences.html +15 -0
- package/core/_layouts/blueprint/pricing.html +20 -0
- package/core/_layouts/blueprint/status.html +10 -0
- package/core/_layouts/blueprint/team/index.html +10 -0
- package/core/_layouts/blueprint/team/member.html +5 -0
- package/core/_layouts/blueprint/updates/index.html +10 -0
- package/core/_layouts/blueprint/updates/update.html +10 -0
- package/core/_layouts/core/root.html +45 -0
- package/core/_layouts/modules/utilities/redirect.html +129 -0
- package/core/css/_studio.scss +237 -0
- package/core/css/components/_index.scss +146 -0
- package/core/css/core/_.scss +0 -0
- package/core/css/core/_alert.scss +87 -0
- package/core/css/core/_animations.scss +343 -0
- package/core/css/core/_bindings.scss +116 -0
- package/core/css/core/_blog-search.scss +57 -0
- package/core/css/core/_chatsy.scss +61 -0
- package/core/css/core/_consent.scss +424 -0
- package/core/css/core/_custom-font-awesome.scss +146 -0
- package/core/css/core/_exit-popup.scss +42 -0
- package/core/css/core/_generated-badge.scss +33 -0
- package/core/css/core/_initialize.scss +29 -0
- package/core/css/core/_lazy-loading.scss +104 -0
- package/core/css/core/_social-sharing.scss +41 -0
- package/core/css/core/_tones.scss +32 -0
- package/core/css/core/_utilities.scss +157 -0
- package/core/css/main.scss +54 -0
- package/core/css/motion/_index.scss +368 -0
- package/core/css/pages/404/index.scss +0 -0
- package/core/css/pages/admin/calendar/index.scss +692 -0
- package/core/css/pages/admin/firebase/index.scss +33 -0
- package/core/css/pages/admin/index.scss +9 -0
- package/core/css/pages/admin/users/index.scss +9 -0
- package/core/css/pages/admin/verts/index.scss +9 -0
- package/core/css/pages/alternatives/[alternative]/index.scss +0 -0
- package/core/css/pages/blog/[slug].scss +55 -0
- package/core/css/pages/dashboard/account/index.scss +242 -0
- package/core/css/pages/download/index.scss +480 -0
- package/core/css/pages/extension/installed/index.scss +317 -0
- package/core/css/pages/feedback/index.scss +31 -0
- package/core/css/pages/payment/confirmation/index.scss +14 -0
- package/core/css/pages/pricing/index.scss +0 -0
- package/core/css/pages/status/index.scss +162 -0
- package/core/css/pages/test/libraries/layers/index.scss +28 -0
- package/core/css/pages/updates/[update].scss +46 -0
- package/core/css/pages/updates/index.scss +13 -0
- package/core/css/shell/_index.scss +207 -0
- package/core/css/tokens/_index.scss +166 -0
- package/core/icons/flags/ar.svg +1 -0
- package/core/icons/flags/bd.svg +1 -0
- package/core/icons/flags/ca.svg +1 -0
- package/core/icons/flags/ch.svg +1 -0
- package/core/icons/flags/cn.svg +1 -0
- package/core/icons/flags/co.svg +1 -0
- package/core/icons/flags/cw.svg +1 -0
- package/core/icons/flags/cz.svg +1 -0
- package/core/icons/flags/de.svg +1 -0
- package/core/icons/flags/dk.svg +1 -0
- package/core/icons/flags/eg.svg +1 -0
- package/core/icons/flags/es.svg +1 -0
- package/core/icons/flags/fi.svg +1 -0
- package/core/icons/flags/fr.svg +1 -0
- package/core/icons/flags/gb.svg +1 -0
- package/core/icons/flags/gq.svg +1 -0
- package/core/icons/flags/gr.svg +1 -0
- package/core/icons/flags/gt.svg +1 -0
- package/core/icons/flags/hn.svg +1 -0
- package/core/icons/flags/id.svg +1 -0
- package/core/icons/flags/ie.svg +1 -0
- package/core/icons/flags/in.svg +1 -0
- package/core/icons/flags/ir.svg +1 -0
- package/core/icons/flags/it.svg +1 -0
- package/core/icons/flags/jp.svg +1 -0
- package/core/icons/flags/kp.svg +1 -0
- package/core/icons/flags/kr.svg +1 -0
- package/core/icons/flags/ly.svg +1 -0
- package/core/icons/flags/ma.svg +1 -0
- package/core/icons/flags/mu.svg +1 -0
- package/core/icons/flags/mx.svg +1 -0
- package/core/icons/flags/ng.svg +1 -0
- package/core/icons/flags/pa.svg +1 -0
- package/core/icons/flags/ph.svg +1 -0
- package/core/icons/flags/pk.svg +1 -0
- package/core/icons/flags/pt.svg +1 -0
- package/core/icons/flags/ru.svg +1 -0
- package/core/icons/flags/sa.svg +1 -0
- package/core/icons/flags/sd.svg +1 -0
- package/core/icons/flags/se.svg +1 -0
- package/core/icons/flags/th.svg +1 -0
- package/core/icons/flags/tm.svg +1 -0
- package/core/icons/flags/tr.svg +1 -0
- package/core/icons/flags/us.svg +1 -0
- package/core/icons/flags/uy.svg +1 -0
- package/core/icons/flags/vn.svg +1 -0
- package/core/icons/flags/za.svg +1 -0
- package/core/images/exit-popup/subscriber-1.jpg +0 -0
- package/core/images/exit-popup/subscriber-2.jpg +0 -0
- package/core/images/exit-popup/subscriber-3.jpg +0 -0
- package/core/images/exit-popup/subscriber-4.jpg +0 -0
- package/core/images/placeholder/photo-1.jpg +0 -0
- package/core/images/placeholder/photo-2.jpg +0 -0
- package/core/images/placeholder/photo-3.jpg +0 -0
- package/core/js/core/analytics-loader.js +253 -0
- package/core/js/core/app-shell.js +136 -0
- package/core/js/core/appearance.js +195 -0
- package/core/js/core/auth.js +457 -0
- package/core/js/core/complete.js +72 -0
- package/core/js/core/consent.js +384 -0
- package/core/js/core/dev-icon-audit.js +63 -0
- package/core/js/core/dev-palette.js +670 -0
- package/core/js/core/dev-sections.js +53 -0
- package/core/js/core/exit-popup.js +276 -0
- package/core/js/core/initialize.js +8 -0
- package/core/js/core/language-switcher.js +167 -0
- package/core/js/core/lazy-loading.js +479 -0
- package/core/js/core/motion.js +28 -0
- package/core/js/core/query-strings.js +146 -0
- package/core/js/core/service-worker.js +28 -0
- package/core/js/core/social-sharing.js +293 -0
- package/core/js/first-paint.js +35 -0
- package/core/js/layouts/modules/utilities/redirect.js +122 -0
- package/core/js/libs/admin-helpers.js +62 -0
- package/core/js/libs/alert-dismiss.js +35 -0
- package/core/js/libs/analytics.js +368 -0
- package/core/js/libs/auth/email.js +144 -0
- package/core/js/libs/auth/errors.js +119 -0
- package/core/js/libs/auth/forms.js +206 -0
- package/core/js/libs/auth/index.js +181 -0
- package/core/js/libs/auth/oauth.js +394 -0
- package/core/js/libs/auth/orphan.js +110 -0
- package/core/js/libs/auth/password-toggle.js +44 -0
- package/core/js/libs/auth/session-params.js +266 -0
- package/core/js/libs/auth/tracking.js +41 -0
- package/core/js/libs/charts.js +516 -0
- package/core/js/libs/consent-region.js +127 -0
- package/core/js/libs/dev.js +150 -0
- package/core/js/libs/graph.js +201 -0
- package/core/js/libs/initialize-tooltips.js +31 -0
- package/core/js/libs/logger.js +38 -0
- package/core/js/libs/omega-copy.js +89 -0
- package/core/js/libs/path-prefix.js +44 -0
- package/core/js/libs/payment-config.js +76 -0
- package/core/js/libs/recaptcha.js +94 -0
- package/core/js/libs/sale-name.js +295 -0
- package/core/js/libs/showcase-frames.js +37 -0
- package/core/js/libs/srcset.js +69 -0
- package/core/js/libs/tracking-consent.js +161 -0
- package/core/js/main.js +144 -0
- package/core/js/pages/404/index.js +57 -0
- package/core/js/pages/admin/calendar/calendar-core.js +701 -0
- package/core/js/pages/admin/calendar/calendar-events.js +853 -0
- package/core/js/pages/admin/calendar/calendar-renderer.js +807 -0
- package/core/js/pages/admin/calendar/campaign-preview.js +105 -0
- package/core/js/pages/admin/calendar/index.js +40 -0
- package/core/js/pages/admin/firebase/index.js +727 -0
- package/core/js/pages/admin/index.js +531 -0
- package/core/js/pages/admin/posts/editor/index.js +230 -0
- package/core/js/pages/admin/posts/index.js +237 -0
- package/core/js/pages/admin/studio/index.js +538 -0
- package/core/js/pages/admin/users/index.js +669 -0
- package/core/js/pages/admin/users/new/index.js +65 -0
- package/core/js/pages/admin/verts/index.js +407 -0
- package/core/js/pages/alternatives/[alternative]/index.js +17 -0
- package/core/js/pages/app/index.js +135 -0
- package/core/js/pages/blog/[slug].js +132 -0
- package/core/js/pages/blog/_search.mjs +108 -0
- package/core/js/pages/blog/index.js +193 -0
- package/core/js/pages/blog/page/[num]/index.js +7 -0
- package/core/js/pages/connections/callback/index.js +148 -0
- package/core/js/pages/contact/index.js +170 -0
- package/core/js/pages/cookies.js +2 -0
- package/core/js/pages/dashboard/account/index.js +366 -0
- package/core/js/pages/dashboard/account/modules/orders.js +82 -0
- package/core/js/pages/dashboard/account/sections/api-keys.js +149 -0
- package/core/js/pages/dashboard/account/sections/billing.js +1667 -0
- package/core/js/pages/dashboard/account/sections/connections.js +333 -0
- package/core/js/pages/dashboard/account/sections/data-request.js +225 -0
- package/core/js/pages/dashboard/account/sections/delete.js +80 -0
- package/core/js/pages/dashboard/account/sections/notifications.js +167 -0
- package/core/js/pages/dashboard/account/sections/orders.js +151 -0
- package/core/js/pages/dashboard/account/sections/profile.js +200 -0
- package/core/js/pages/dashboard/account/sections/referrals.js +217 -0
- package/core/js/pages/dashboard/account/sections/refund.js +253 -0
- package/core/js/pages/dashboard/account/sections/security.js +726 -0
- package/core/js/pages/dashboard/account/sections/team.js +247 -0
- package/core/js/pages/download/index.js +418 -0
- package/core/js/pages/extension/index.js +164 -0
- package/core/js/pages/extension/installed/index.js +135 -0
- package/core/js/pages/feedback/index.js +193 -0
- package/core/js/pages/legal/_document.js +91 -0
- package/core/js/pages/payment/checkout/index.js +420 -0
- package/core/js/pages/payment/checkout/modules/api.js +139 -0
- package/core/js/pages/payment/checkout/modules/dev-section.js +175 -0
- package/core/js/pages/payment/checkout/modules/discount.js +69 -0
- package/core/js/pages/payment/checkout/modules/pricing.js +73 -0
- package/core/js/pages/payment/checkout/modules/state.js +339 -0
- package/core/js/pages/payment/checkout/modules/tracking.js +54 -0
- package/core/js/pages/payment/confirmation/index.js +91 -0
- package/core/js/pages/payment/confirmation/modules/celebration.js +45 -0
- package/core/js/pages/payment/confirmation/modules/state.js +112 -0
- package/core/js/pages/payment/confirmation/modules/tracking.js +133 -0
- package/core/js/pages/payment/confirmation/modules/verify.js +142 -0
- package/core/js/pages/portal/email-preferences/index.js +183 -0
- package/core/js/pages/pricing/index.js +425 -0
- package/core/js/pages/privacy.js +2 -0
- package/core/js/pages/reset/index.js +12 -0
- package/core/js/pages/signin/index.js +22 -0
- package/core/js/pages/signup/index.js +23 -0
- package/core/js/pages/status/index.js +687 -0
- package/core/js/pages/terms.js +2 -0
- package/core/js/pages/test/components/[category]/[name]/index.js +26 -0
- package/core/js/pages/test/libraries/appearance/index.js +220 -0
- package/core/js/pages/test/libraries/form-manager/index.js +328 -0
- package/core/js/pages/test/libraries/layers/index.js +16 -0
- package/core/js/pages/test/libraries/verts/index.js +68 -0
- package/core/js/pages/test/sections/[category]/[name]/index.js +28 -0
- package/core/js/pages/test/styleguide/index.js +35 -0
- package/core/js/pages/token/index.js +203 -0
- package/core/logos/brandmarks/original/apple-app-store.svg +1 -0
- package/core/logos/brandmarks/original/apple.svg +6 -0
- package/core/logos/brandmarks/original/bitbucket.svg +14 -0
- package/core/logos/brandmarks/original/bitcoin.svg +1 -0
- package/core/logos/brandmarks/original/bluesky.svg +7 -0
- package/core/logos/brandmarks/original/bootstrap.svg +43 -0
- package/core/logos/brandmarks/original/brave.svg +1 -0
- package/core/logos/brandmarks/original/chrome.svg +1 -0
- package/core/logos/brandmarks/original/discord.svg +1 -0
- package/core/logos/brandmarks/original/dropbox.svg +10 -0
- package/core/logos/brandmarks/original/edge.svg +1 -0
- package/core/logos/brandmarks/original/facebook-f.svg +1 -0
- package/core/logos/brandmarks/original/facebook.svg +8 -0
- package/core/logos/brandmarks/original/figma.svg +10 -0
- package/core/logos/brandmarks/original/firefox.svg +1 -0
- package/core/logos/brandmarks/original/github.svg +6 -0
- package/core/logos/brandmarks/original/gitlab.svg +17 -0
- package/core/logos/brandmarks/original/google-a-s.svg +1 -0
- package/core/logos/brandmarks/original/google-chrome-webstore.svg +49 -0
- package/core/logos/brandmarks/original/google-play-store.svg +1 -0
- package/core/logos/brandmarks/original/google-web-search.svg +1 -0
- package/core/logos/brandmarks/original/google.svg +1 -0
- package/core/logos/brandmarks/original/gulp.svg +4 -0
- package/core/logos/brandmarks/original/html-5.svg +1 -0
- package/core/logos/brandmarks/original/instagram.svg +1 -0
- package/core/logos/brandmarks/original/javascript.svg +1 -0
- package/core/logos/brandmarks/original/jira.svg +18 -0
- package/core/logos/brandmarks/original/kick.svg +7 -0
- package/core/logos/brandmarks/original/linkedin.svg +1 -0
- package/core/logos/brandmarks/original/linux.svg +28 -0
- package/core/logos/brandmarks/original/messenger.svg +16 -0
- package/core/logos/brandmarks/original/microsoft.svg +1 -0
- package/core/logos/brandmarks/original/npm.svg +8 -0
- package/core/logos/brandmarks/original/opera.svg +1 -0
- package/core/logos/brandmarks/original/patreon.svg +6 -0
- package/core/logos/brandmarks/original/pinterest.svg +6 -0
- package/core/logos/brandmarks/original/reddit.svg +1 -0
- package/core/logos/brandmarks/original/safari.svg +31 -0
- package/core/logos/brandmarks/original/sass.svg +3 -0
- package/core/logos/brandmarks/original/signal.svg +6 -0
- package/core/logos/brandmarks/original/skype.svg +47 -0
- package/core/logos/brandmarks/original/slack.svg +33 -0
- package/core/logos/brandmarks/original/soundcloud.svg +1 -0
- package/core/logos/brandmarks/original/spotify.svg +5 -0
- package/core/logos/brandmarks/original/steam.svg +6 -0
- package/core/logos/brandmarks/original/telegram.svg +14 -0
- package/core/logos/brandmarks/original/tiktok.svg +1 -0
- package/core/logos/brandmarks/original/trello.svg +16 -0
- package/core/logos/brandmarks/original/tumblr.svg +1 -0
- package/core/logos/brandmarks/original/twitch.svg +6 -0
- package/core/logos/brandmarks/original/twitter.svg +6 -0
- package/core/logos/brandmarks/original/unity.svg +6 -0
- package/core/logos/brandmarks/original/x.svg +7 -0
- package/core/logos/brandmarks/original/yahoo-y.svg +1 -0
- package/core/logos/brandmarks/original/youtube-square.svg +1 -0
- package/core/logos/brandmarks/original/youtube.svg +1 -0
- package/core/logos/combomarks/dark/airbnb.svg +30 -0
- package/core/logos/combomarks/dark/slack.svg +38 -0
- package/core/logos/combomarks/dark/spotify.svg +35 -0
- package/core/logos/combomarks/dark/twilio.svg +26 -0
- package/core/logos/combomarks/dark/weebly.svg +35 -0
- package/core/logos/combomarks/gray/airbnb.svg +33 -0
- package/core/logos/combomarks/gray/alphabet.svg +23 -0
- package/core/logos/combomarks/gray/amazon.svg +38 -0
- package/core/logos/combomarks/gray/boring-company.svg +91 -0
- package/core/logos/combomarks/gray/burberry.svg +239 -0
- package/core/logos/combomarks/gray/embark.svg +21 -0
- package/core/logos/combomarks/gray/fitbit.svg +61 -0
- package/core/logos/combomarks/gray/fred-perry.svg +94 -0
- package/core/logos/combomarks/gray/google.svg +27 -0
- package/core/logos/combomarks/gray/hollister.svg +34 -0
- package/core/logos/combomarks/gray/hubspot.svg +27 -0
- package/core/logos/combomarks/gray/kaplan.svg +33 -0
- package/core/logos/combomarks/gray/lenovo.svg +27 -0
- package/core/logos/combomarks/gray/levis.svg +25 -0
- package/core/logos/combomarks/gray/mapbox.svg +37 -0
- package/core/logos/combomarks/gray/netflix.svg +15 -0
- package/core/logos/combomarks/gray/new-balance.svg +32 -0
- package/core/logos/combomarks/gray/nike.svg +17 -0
- package/core/logos/combomarks/gray/paypal.svg +41 -0
- package/core/logos/combomarks/gray/puma.svg +82 -0
- package/core/logos/combomarks/gray/samsung.svg +26 -0
- package/core/logos/combomarks/gray/shopify.svg +36 -0
- package/core/logos/combomarks/gray/slack.svg +42 -0
- package/core/logos/combomarks/gray/spotify.svg +38 -0
- package/core/logos/combomarks/gray/stripe.svg +24 -0
- package/core/logos/combomarks/gray/tnf.svg +30 -0
- package/core/logos/combomarks/gray/twilio.svg +29 -0
- package/core/logos/combomarks/gray/uber.svg +24 -0
- package/core/logos/combomarks/gray/weebly.svg +38 -0
- package/core/logos/combomarks/original/airbnb.svg +33 -0
- package/core/logos/combomarks/original/alphabet.svg +23 -0
- package/core/logos/combomarks/original/amazon.svg +38 -0
- package/core/logos/combomarks/original/asana.svg +8 -0
- package/core/logos/combomarks/original/boring-company.svg +91 -0
- package/core/logos/combomarks/original/discord.svg +6 -0
- package/core/logos/combomarks/original/embark.svg +24 -0
- package/core/logos/combomarks/original/fitbit.svg +60 -0
- package/core/logos/combomarks/original/github.svg +6 -0
- package/core/logos/combomarks/original/gitlab.svg +20 -0
- package/core/logos/combomarks/original/google.svg +28 -0
- package/core/logos/combomarks/original/hubspot.svg +29 -0
- package/core/logos/combomarks/original/instagram.svg +7 -0
- package/core/logos/combomarks/original/kickstarter.svg +6 -0
- package/core/logos/combomarks/original/lenovo.svg +24 -0
- package/core/logos/combomarks/original/linkedin.svg +6 -0
- package/core/logos/combomarks/original/mapbox.svg +39 -0
- package/core/logos/combomarks/original/mastodon.svg +7 -0
- package/core/logos/combomarks/original/medium.svg +6 -0
- package/core/logos/combomarks/original/meta.svg +22 -0
- package/core/logos/combomarks/original/microsoft.svg +13 -0
- package/core/logos/combomarks/original/monday.svg +12 -0
- package/core/logos/combomarks/original/netflix.svg +15 -0
- package/core/logos/combomarks/original/notion.svg +9 -0
- package/core/logos/combomarks/original/paypal.svg +41 -0
- package/core/logos/combomarks/original/reddit.svg +13 -0
- package/core/logos/combomarks/original/samsung.svg +25 -0
- package/core/logos/combomarks/original/shopify.svg +35 -0
- package/core/logos/combomarks/original/slack.svg +47 -0
- package/core/logos/combomarks/original/spotify.svg +37 -0
- package/core/logos/combomarks/original/stackoverflow.svg +28 -0
- package/core/logos/combomarks/original/stripe.svg +24 -0
- package/core/logos/combomarks/original/tiktok.svg +12 -0
- package/core/logos/combomarks/original/tumblr.svg +6 -0
- package/core/logos/combomarks/original/uber.svg +24 -0
- package/core/logos/combomarks/original/weebly.svg +34 -0
- package/core/logos/combomarks/original/whatsapp.svg +20 -0
- package/core/logos/combomarks/original/youtube.svg +10 -0
- package/core/logos/combomarks/original/zoom.svg +7 -0
- package/core/logos/combomarks/white/airbnb.svg +33 -0
- package/core/logos/combomarks/white/alphabet.svg +23 -0
- package/core/logos/combomarks/white/amazon.svg +38 -0
- package/core/logos/combomarks/white/boring-company.svg +91 -0
- package/core/logos/combomarks/white/embark.svg +21 -0
- package/core/logos/combomarks/white/fitbit.svg +61 -0
- package/core/logos/combomarks/white/google.svg +27 -0
- package/core/logos/combomarks/white/hubspot.svg +27 -0
- package/core/logos/combomarks/white/kaplan.svg +33 -0
- package/core/logos/combomarks/white/lenovo.svg +27 -0
- package/core/logos/combomarks/white/mapbox.svg +37 -0
- package/core/logos/combomarks/white/netflix.svg +15 -0
- package/core/logos/combomarks/white/paypal.svg +40 -0
- package/core/logos/combomarks/white/samsung.svg +26 -0
- package/core/logos/combomarks/white/shopify.svg +36 -0
- package/core/logos/combomarks/white/slack.svg +42 -0
- package/core/logos/combomarks/white/spotify.svg +38 -0
- package/core/logos/combomarks/white/stripe.svg +24 -0
- package/core/logos/combomarks/white/twilio.svg +29 -0
- package/core/logos/combomarks/white/uber.svg +24 -0
- package/core/logos/combomarks/white/weebly.svg +38 -0
- package/defaults/pages/404.md +4 -0
- package/defaults/pages/about.md +4 -0
- package/defaults/pages/admin/calendar/index.html +4 -0
- package/defaults/pages/admin/firebase/index.html +4 -0
- package/defaults/pages/admin/index.md +4 -0
- package/defaults/pages/admin/posts/editor.html +4 -0
- package/defaults/pages/admin/posts/index.html +4 -0
- package/defaults/pages/admin/stackblitz/index.html +4 -0
- package/defaults/pages/admin/studio/index.html +4 -0
- package/defaults/pages/admin/users/index.html +4 -0
- package/defaults/pages/admin/users/new.html +4 -0
- package/defaults/pages/admin/verts/index.html +4 -0
- package/defaults/pages/ads-txt.html +11 -0
- package/defaults/pages/alternatives/index.md +4 -0
- package/defaults/pages/app.md +4 -0
- package/defaults/pages/auth/reset.md +4 -0
- package/defaults/pages/auth/signin.md +4 -0
- package/defaults/pages/auth/signup.md +4 -0
- package/defaults/pages/auth/token.md +4 -0
- package/defaults/pages/blog/categories/category.html +21 -0
- package/defaults/pages/blog/categories.md +4 -0
- package/defaults/pages/blog/index-json.html +27 -0
- package/defaults/pages/blog/tags/tag.html +21 -0
- package/defaults/pages/blog/tags.md +4 -0
- package/defaults/pages/blog.md +22 -0
- package/defaults/pages/careers.md +4 -0
- package/defaults/pages/connections/callback.md +4 -0
- package/defaults/pages/contact.md +4 -0
- package/defaults/pages/dashboard/account.md +4 -0
- package/defaults/pages/dashboard/index.md +12 -0
- package/defaults/pages/download.md +4 -0
- package/defaults/pages/extension/index.html +4 -0
- package/defaults/pages/extension/installed.html +4 -0
- package/defaults/pages/feedback.md +4 -0
- package/defaults/pages/feeds/posts-json.html +40 -0
- package/defaults/pages/feeds/posts-xml.html +38 -0
- package/defaults/pages/humans.html +25 -0
- package/defaults/pages/index.md +4 -0
- package/defaults/pages/legal/cookies.md +4 -0
- package/defaults/pages/legal/privacy.md +4 -0
- package/defaults/pages/legal/terms.md +4 -0
- package/defaults/pages/llms-txt.html +46 -0
- package/defaults/pages/opensearch.html +16 -0
- package/defaults/pages/pages-json.html +42 -0
- package/defaults/pages/payment/checkout.md +4 -0
- package/defaults/pages/payment/confirmation.md +4 -0
- package/defaults/pages/portal/email-preferences.md +4 -0
- package/defaults/pages/pricing.md +4 -0
- package/defaults/pages/redirects/account.md +12 -0
- package/defaults/pages/redirects/admin/dashboard.md +11 -0
- package/defaults/pages/redirects/auth/change-password.md +9 -0
- package/defaults/pages/redirects/auth/forgot.md +9 -0
- package/defaults/pages/redirects/auth/join.md +9 -0
- package/defaults/pages/redirects/auth/login.md +9 -0
- package/defaults/pages/redirects/auth/recover.md +9 -0
- package/defaults/pages/redirects/auth/register.md +9 -0
- package/defaults/pages/redirects/auth/reset-password.md +9 -0
- package/defaults/pages/redirects/billing/cancel.md +9 -0
- package/defaults/pages/redirects/billing/refund.md +9 -0
- package/defaults/pages/robots.html +36 -0
- package/defaults/pages/security-txt.html +11 -0
- package/defaults/pages/sitemap.html +37 -0
- package/defaults/pages/status.md +4 -0
- package/defaults/pages/team/index.md +4 -0
- package/defaults/pages/test/account/dashboard.html +16 -0
- package/defaults/pages/test/index.md +12 -0
- package/defaults/pages/test/libraries/appearance.html +268 -0
- package/defaults/pages/test/libraries/cover.html +50 -0
- package/defaults/pages/test/libraries/error.html +30 -0
- package/defaults/pages/test/libraries/firestore.html +202 -0
- package/defaults/pages/test/libraries/form-manager.html +374 -0
- package/defaults/pages/test/libraries/layers.html +52 -0
- package/defaults/pages/test/libraries/lazy-loading.html +450 -0
- package/defaults/pages/test/libraries/verts.html +149 -0
- package/defaults/pages/test/redirect/external.md +13 -0
- package/defaults/pages/test/redirect/internal.md +13 -0
- package/defaults/pages/test/styleguide/index.html +588 -0
- package/defaults/pages/test/translation/index.md +50 -0
- package/defaults/pages/updates/index.md +4 -0
- package/defaults/sample-posts/2026-01-12-welcome-to-the-blog.md +26 -0
- package/defaults/sample-posts/2026-02-03-a-field-guide-to-good-defaults.md +50 -0
- package/defaults/sample-posts/2026-02-24-shipping-week-notes.md +37 -0
- package/defaults/sample-posts/2026-03-17-the-case-for-one-config.md +36 -0
- package/defaults/sample-posts/2026-04-09-write-release-notes-people-read.md +34 -0
- package/defaults/sample-posts/2026-05-21-dark-mode-done-properly.md +38 -0
- package/defaults/sample-posts/2026-06-02-the-boring-deploy-is-the-good-deploy.md +30 -0
- package/defaults/sample-posts/2026-06-11-naming-things-a-survival-guide.md +30 -0
- package/defaults/sample-posts/2026-06-19-your-pricing-page-is-a-product.md +28 -0
- package/defaults/sample-posts/2026-06-30-email-is-an-api-with-feelings.md +28 -0
- package/defaults/sample-posts/2026-07-08-ship-the-docs-with-the-diff.md +30 -0
- package/defaults/sample-team/avery-quinn.md +22 -0
- package/defaults/sample-team/jordan-reyes.md +25 -0
- package/defaults/sample-team/riley-nakamura.md +22 -0
- package/defaults/sample-team/sam-okafor.md +22 -0
- package/defaults/sample-updates/v1.0.0.md +28 -0
- package/defaults/sample-updates/v1.1.0.md +27 -0
- package/defaults/sample-updates/v1.2.0.md +27 -0
- package/defaults/sample-updates/v1.3.0.md +28 -0
- package/defaults/showcase/components.html +62 -0
- package/defaults/showcase/entry.html +76 -0
- package/defaults/showcase/frame.html +62 -0
- package/defaults/showcase/index.html +59 -0
- package/dist/assets.js +1349 -0
- package/dist/brand-tokens.js +195 -0
- package/dist/build.js +192 -0
- package/dist/cachebreak-html.js +71 -0
- package/dist/cli-run.js +25 -0
- package/dist/cli.js +47 -0
- package/dist/collections.js +183 -0
- package/dist/commands/audit.js +470 -0
- package/dist/commands/build.js +197 -0
- package/dist/commands/clean.js +18 -0
- package/dist/commands/customize.js +125 -0
- package/dist/commands/deploy.js +441 -0
- package/dist/commands/dev.js +1067 -0
- package/dist/commands/install.js +31 -0
- package/dist/commands/lib/deploy-precheck.js +43 -0
- package/dist/commands/lib/ensure-target.js +115 -0
- package/dist/commands/migrate.js +86 -0
- package/dist/commands/purge.js +31 -0
- package/dist/commands/test.js +237 -0
- package/dist/commands/translate.js +57 -0
- package/dist/commands/update.js +22 -0
- package/dist/commands/version.js +11 -0
- package/dist/config-sections.js +245 -0
- package/dist/consumer-scan.js +118 -0
- package/dist/consumer.js +49 -0
- package/dist/customize.js +328 -0
- package/dist/decisions.js +153 -0
- package/dist/dist-audit.js +417 -0
- package/dist/dynamic-pages.js +357 -0
- package/dist/engine.js +1402 -0
- package/dist/firebase-auth-helpers.js +198 -0
- package/dist/font-metrics.js +420 -0
- package/dist/frontmatter-liquid.js +253 -0
- package/dist/github-secrets.js +80 -0
- package/dist/hero-animations.js +170 -0
- package/dist/imagemin.js +261 -0
- package/dist/index.js +41 -0
- package/dist/inline-icons.js +65 -0
- package/dist/language-flags.js +55 -0
- package/dist/layers.js +80 -0
- package/dist/layouts.js +44 -0
- package/dist/limit-collections.js +199 -0
- package/dist/link-resolver.js +303 -0
- package/dist/markdown-images.js +85 -0
- package/dist/merge.js +20 -0
- package/dist/migrate/codemod.js +172 -0
- package/dist/migrate/config-convert.js +448 -0
- package/dist/migrate/consumer-assets.js +130 -0
- package/dist/migrate/index.js +223 -0
- package/dist/migrate/lint.js +108 -0
- package/dist/migrate/rules.js +1929 -0
- package/dist/minify-html.js +148 -0
- package/dist/mode-helpers.js +96 -0
- package/dist/omega-bin.js +7 -0
- package/dist/overrides.js +190 -0
- package/dist/path-prefix.js +167 -0
- package/dist/paths.js +37 -0
- package/dist/pricing.js +301 -0
- package/dist/purge.js +95 -0
- package/dist/redirect-page.js +45 -0
- package/dist/sample-content.js +210 -0
- package/dist/scaffold.js +123 -0
- package/dist/sections.js +810 -0
- package/dist/service-worker.js +200 -0
- package/dist/social-pages.js +142 -0
- package/dist/srcset.js +67 -0
- package/dist/static-assets.js +154 -0
- package/dist/target-shortlinks.js +123 -0
- package/dist/theme-vocabulary.js +76 -0
- package/dist/translate/collect-text-nodes.js +93 -0
- package/dist/translate/default-routes.js +152 -0
- package/dist/translate/generate-defaults.js +297 -0
- package/dist/translate/index.js +568 -0
- package/dist/translate/packaged-defaults.js +127 -0
- package/dist/translate/sitemap.js +108 -0
- package/dist/vendor/account/engine.js +182 -0
- package/dist/vendor/account/features.js +220 -0
- package/dist/vendor/account/index.js +53 -0
- package/dist/vendor/account/schema.js +272 -0
- package/dist/vendor/account/subscription.js +38 -0
- package/dist/vendor/config/company.js +31 -0
- package/dist/vendor/config/defaults.js +173 -0
- package/dist/vendor/config/demo.js +18 -0
- package/dist/vendor/config/desktop-artifacts.js +110 -0
- package/dist/vendor/config/edit.js +769 -0
- package/dist/vendor/config/env-delivery.js +145 -0
- package/dist/vendor/config/env-rules.js +93 -0
- package/dist/vendor/config/env-schema.js +1078 -0
- package/dist/vendor/config/env.js +445 -0
- package/dist/vendor/config/hooks.js +97 -0
- package/dist/vendor/config/index.js +237 -0
- package/dist/vendor/config/instances.js +208 -0
- package/dist/vendor/config/load.js +490 -0
- package/dist/vendor/config/merge.js +68 -0
- package/dist/vendor/config/order.js +139 -0
- package/dist/vendor/config/ports.js +374 -0
- package/dist/vendor/config/providers.js +32 -0
- package/dist/vendor/config/repo.js +142 -0
- package/dist/vendor/config/retired-keys.js +430 -0
- package/dist/vendor/config/schema.js +1610 -0
- package/dist/vendor/config/secrets.js +50 -0
- package/dist/vendor/config/seed.js +34 -0
- package/dist/vendor/config/site-global.js +205 -0
- package/dist/vendor/config/validate.js +554 -0
- package/dist/vendor/config/winback.js +61 -0
- package/dist/vendor/devkit/actions-secrets.js +145 -0
- package/dist/vendor/devkit/attach-log-file.js +262 -0
- package/dist/vendor/devkit/bare-requires.js +153 -0
- package/dist/vendor/devkit/bundle.js +292 -0
- package/dist/vendor/devkit/ci-workflows.js +520 -0
- package/dist/vendor/devkit/cli-router.js +156 -0
- package/dist/vendor/devkit/command-path.js +46 -0
- package/dist/vendor/devkit/defaults-engine.js +372 -0
- package/dist/vendor/devkit/deploy-precheck.js +54 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/deploy.js +286 -0
- package/dist/vendor/devkit/env-watch.js +132 -0
- package/dist/vendor/devkit/framework-deps.js +46 -0
- package/dist/vendor/devkit/icons.js +178 -0
- package/dist/vendor/devkit/license.js +155 -0
- package/dist/vendor/devkit/local-https.js +360 -0
- package/dist/vendor/devkit/local.js +1905 -0
- package/dist/vendor/devkit/logger.js +128 -0
- package/dist/vendor/devkit/merge-line-files.js +296 -0
- package/dist/vendor/devkit/omega-bin.js +345 -0
- package/dist/vendor/devkit/reads.js +274 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/stop-signals.js +28 -0
- package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
- package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
- package/dist/vendor/devkit/target-secrets.js +165 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/translate/cache.js +84 -0
- package/dist/vendor/devkit/translate/engine.js +243 -0
- package/dist/vendor/devkit/translate/index.js +49 -0
- package/dist/vendor/devkit/translate/languages.js +134 -0
- package/dist/vendor/devkit/translate/providers.js +188 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/dist/vendor/template-kit/data/language-flags.js +54 -0
- package/dist/vendor/template-kit/data/languages.js +195 -0
- package/dist/vendor/template-kit/data/social-urls.js +26 -0
- package/dist/vendor/template-kit/filters.js +227 -0
- package/dist/vendor/template-kit/index.js +28 -0
- package/dist/vendor/template-kit/jekyll-compat.js +268 -0
- package/dist/vendor/template-kit/register-liquid.js +0 -0
- package/dist/vendor/template-kit/tags/collections.js +191 -0
- package/dist/vendor/template-kit/tags/conditionals.js +101 -0
- package/dist/vendor/template-kit/tags/content.js +175 -0
- package/dist/vendor/template-kit/tags/index.js +33 -0
- package/dist/vendor/template-kit/tags/media.js +376 -0
- package/dist/vendor/template-kit/variable-resolver.js +163 -0
- package/docs/ads-system.md +109 -0
- package/docs/classy-v2/DIRECTION.md +92 -0
- package/docs/classy-v2/draft-1.html +1932 -0
- package/docs/classy-v2/draft-2.html +1956 -0
- package/docs/frontmatter.md +153 -0
- package/docs/index.md +254 -0
- package/docs/libs.md +298 -0
- package/docs/omega-sections-spec.md +159 -0
- package/docs/page-contract.md +112 -0
- package/docs/sections.md +845 -0
- package/docs/shared/agent-docs.md +89 -0
- package/docs/shared/analytics.md +612 -0
- package/docs/shared/brands.md +51 -0
- package/docs/shared/breaking-changes.md +497 -0
- package/docs/shared/config.md +1387 -0
- package/docs/shared/deploys.md +215 -0
- package/docs/shared/icons.md +201 -0
- package/docs/shared/local-dev.md +147 -0
- package/docs/shared/logging.md +202 -0
- package/docs/shared/monitoring.md +153 -0
- package/docs/shared/publishing.md +183 -0
- package/docs/shared/rulings.md +34 -0
- package/docs/shared/testing.md +147 -0
- package/docs/shared/theming.md +604 -0
- package/docs/shared/translation.md +291 -0
- package/docs/shared/updates.md +61 -0
- package/docs/template-kit.md +128 -0
- package/docs/test-framework.md +163 -0
- package/package.json +122 -0
- package/runtime/boot.js +149 -0
- package/runtime/icons.js +77 -0
- package/runtime/manager.js +36 -0
- package/scaffold/.github/workflows/build.yml +139 -0
- package/scaffold/.nvmrc +1 -0
- package/scaffold/AGENTS.md +55 -0
- package/scaffold/CLAUDE.md +1 -0
- package/scaffold/_.gitattributes +4 -0
- package/scaffold/_.gitignore +27 -0
- package/scaffold/config/omega.json5 +20 -0
- package/scaffold/src/assets/css/pages/.gitkeep +0 -0
- package/scaffold/src/assets/images/.gitkeep +0 -0
- package/scaffold/src/assets/js/pages/.gitkeep +0 -0
- package/scaffold/src/pages/.gitkeep +0 -0
- package/scaffold/src/pages/example.md.txt +94 -0
- package/scaffold/src/service-worker.js +16 -0
- package/sw/entry.js +19 -0
- package/sw/manager.js +281 -0
- package/themes/_template/README.md +115 -0
- package/themes/_template/_config.scss +60 -0
- package/themes/_template/_theme.js +14 -0
- package/themes/_template/_theme.scss +28 -0
- package/themes/_template/css/base/_root.scss +19 -0
- package/themes/_template/css/components/_components.scss +23 -0
- package/themes/base/README.md +5 -0
- package/themes/base/_components/data/org-chart/component.html +33 -0
- package/themes/base/_components/data/org-chart/component.json5 +33 -0
- package/themes/base/_components/data/org-chart/component.scss +183 -0
- package/themes/base/_components/heading/masthead/component.html +22 -0
- package/themes/base/_components/heading/masthead/component.json5 +30 -0
- package/themes/base/_components/heading/section-head/component.html +18 -0
- package/themes/base/_components/heading/section-head/component.json5 +27 -0
- package/themes/base/_components/pricing/features/component.html +29 -0
- package/themes/base/_components/pricing/features/component.json5 +30 -0
- package/themes/base/_hero/orbit/index.html +30 -0
- package/themes/base/_hero/orbit/script.js +33 -0
- package/themes/base/_hero/orbit/style.scss +133 -0
- package/themes/base/_includes/admin/sections/sidebar.html +3 -0
- package/themes/base/_includes/admin/sections/topbar.html +3 -0
- package/themes/base/_includes/backend/sections/sidebar.html +3 -0
- package/themes/base/_includes/backend/sections/topbar.html +3 -0
- package/themes/base/_includes/frontend/components/connection-card.html +49 -0
- package/themes/base/_includes/frontend/components/post-card.html +54 -0
- package/themes/base/_includes/frontend/sections/account-connections.html +42 -0
- package/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
- package/themes/base/_includes/frontend/sections/footer.html +154 -0
- package/themes/base/_includes/frontend/sections/nav.html +276 -0
- package/themes/base/_includes/global/sections/account.html +72 -0
- package/themes/base/_includes/global/sections/app-sidebar.html +248 -0
- package/themes/base/_includes/global/sections/app-topbar.html +228 -0
- package/themes/base/_includes/global/sections/page-header.html +99 -0
- package/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
- package/themes/base/_layouts/admin/core/minimal.html +23 -0
- package/themes/base/_layouts/backend/core/base.html +57 -0
- package/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
- package/themes/base/_layouts/backend/core/minimal.html +32 -0
- package/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
- package/themes/base/_layouts/frontend/core/base.html +31 -0
- package/themes/base/_layouts/frontend/core/cover.html +40 -0
- package/themes/base/_layouts/frontend/core/minimal.html +47 -0
- package/themes/base/_layouts/frontend/pages/404.html +54 -0
- package/themes/base/_layouts/frontend/pages/about.html +144 -0
- package/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
- package/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
- package/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
- package/themes/base/_layouts/frontend/pages/app.html +142 -0
- package/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
- package/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
- package/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
- package/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
- package/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
- package/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
- package/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
- package/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
- package/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
- package/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
- package/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
- package/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
- package/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
- package/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
- package/themes/base/_layouts/frontend/pages/contact.html +214 -0
- package/themes/base/_layouts/frontend/pages/download.html +793 -0
- package/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
- package/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
- package/themes/base/_layouts/frontend/pages/feedback.html +171 -0
- package/themes/base/_layouts/frontend/pages/index.html +66 -0
- package/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
- package/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
- package/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
- package/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
- package/themes/base/_layouts/frontend/pages/pricing.html +596 -0
- package/themes/base/_layouts/frontend/pages/status.html +361 -0
- package/themes/base/_layouts/frontend/pages/team/index.html +210 -0
- package/themes/base/_layouts/frontend/pages/team/member.html +125 -0
- package/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
- package/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
- package/themes/base/_sections/about/hero/section.html +68 -0
- package/themes/base/_sections/about/hero/section.json5 +58 -0
- package/themes/base/_sections/about/letter/section.html +60 -0
- package/themes/base/_sections/about/letter/section.json5 +56 -0
- package/themes/base/_sections/about/photo-band/section.html +24 -0
- package/themes/base/_sections/about/photo-band/section.json5 +23 -0
- package/themes/base/_sections/about/principles/section.html +17 -0
- package/themes/base/_sections/about/principles/section.json5 +34 -0
- package/themes/base/_sections/about/timeline/section.html +20 -0
- package/themes/base/_sections/about/timeline/section.json5 +34 -0
- package/themes/base/_sections/marketing/bento/section.html +91 -0
- package/themes/base/_sections/marketing/bento/section.json5 +152 -0
- package/themes/base/_sections/marketing/cta/section.html +44 -0
- package/themes/base/_sections/marketing/cta/section.json5 +47 -0
- package/themes/base/_sections/marketing/faq/section.html +52 -0
- package/themes/base/_sections/marketing/faq/section.json5 +68 -0
- package/themes/base/_sections/marketing/hero/section.html +349 -0
- package/themes/base/_sections/marketing/hero/section.json5 +335 -0
- package/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
- package/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
- package/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
- package/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
- package/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
- package/themes/base/_sections/marketing/product-demo/section.html +62 -0
- package/themes/base/_sections/marketing/product-demo/section.js +44 -0
- package/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
- package/themes/base/_sections/marketing/prose/section.html +22 -0
- package/themes/base/_sections/marketing/prose/section.json5 +41 -0
- package/themes/base/_sections/marketing/showcase/section.html +35 -0
- package/themes/base/_sections/marketing/showcase/section.json5 +52 -0
- package/themes/base/_sections/marketing/stats/section.html +32 -0
- package/themes/base/_sections/marketing/stats/section.json5 +44 -0
- package/themes/base/_sections/marketing/testimonials/section.html +54 -0
- package/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
- package/themes/base/_sections/marketing/trusted-by/section.html +30 -0
- package/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
- package/themes/base/_sections/verts/unit/section.html +7 -0
- package/themes/base/_sections/verts/unit/section.js +22 -0
- package/themes/base/_sections/verts/unit/section.json5 +24 -0
- package/themes/base/_sections/verts/unit/section.scss +24 -0
- package/themes/base/_theme.js +13 -0
- package/themes/base/_theme.scss +4 -0
- package/themes/bootstrap/_theme.js +16 -0
- package/themes/bootstrap/_theme.scss +11 -0
- package/themes/bootstrap/js/index.esm.js +19 -0
- package/themes/bootstrap/js/index.umd.js +34 -0
- package/themes/bootstrap/js/src/alert.js +87 -0
- package/themes/bootstrap/js/src/base-component.js +86 -0
- package/themes/bootstrap/js/src/button.js +72 -0
- package/themes/bootstrap/js/src/carousel.js +474 -0
- package/themes/bootstrap/js/src/collapse.js +297 -0
- package/themes/bootstrap/js/src/dom/data.js +55 -0
- package/themes/bootstrap/js/src/dom/event-handler.js +317 -0
- package/themes/bootstrap/js/src/dom/manipulator.js +71 -0
- package/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
- package/themes/bootstrap/js/src/dropdown.js +458 -0
- package/themes/bootstrap/js/src/modal.js +378 -0
- package/themes/bootstrap/js/src/offcanvas.js +282 -0
- package/themes/bootstrap/js/src/popover.js +97 -0
- package/themes/bootstrap/js/src/scrollspy.js +296 -0
- package/themes/bootstrap/js/src/tab.js +315 -0
- package/themes/bootstrap/js/src/toast.js +224 -0
- package/themes/bootstrap/js/src/tooltip.js +632 -0
- package/themes/bootstrap/js/src/util/backdrop.js +151 -0
- package/themes/bootstrap/js/src/util/component-functions.js +35 -0
- package/themes/bootstrap/js/src/util/config.js +65 -0
- package/themes/bootstrap/js/src/util/focustrap.js +115 -0
- package/themes/bootstrap/js/src/util/index.js +306 -0
- package/themes/bootstrap/js/src/util/sanitizer.js +117 -0
- package/themes/bootstrap/js/src/util/scrollbar.js +114 -0
- package/themes/bootstrap/js/src/util/swipe.js +146 -0
- package/themes/bootstrap/js/src/util/template-factory.js +160 -0
- package/themes/bootstrap/overrides/_accordion.scss +21 -0
- package/themes/bootstrap/overrides/_avatars.scss +51 -0
- package/themes/bootstrap/overrides/_blog-images.scss +45 -0
- package/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
- package/themes/bootstrap/overrides/_color-shades.scss +25 -0
- package/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
- package/themes/bootstrap/overrides/_index.scss +30 -0
- package/themes/bootstrap/overrides/_links.scss +26 -0
- package/themes/bootstrap/overrides/_soft-colors.scss +99 -0
- package/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
- package/themes/bootstrap/overrides/_spinners.scss +22 -0
- package/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
- package/themes/bootstrap/scss/_accordion.scss +153 -0
- package/themes/bootstrap/scss/_alert.scss +68 -0
- package/themes/bootstrap/scss/_badge.scss +38 -0
- package/themes/bootstrap/scss/_breadcrumb.scss +40 -0
- package/themes/bootstrap/scss/_button-group.scss +147 -0
- package/themes/bootstrap/scss/_buttons.scss +216 -0
- package/themes/bootstrap/scss/_card.scss +238 -0
- package/themes/bootstrap/scss/_carousel.scss +226 -0
- package/themes/bootstrap/scss/_close.scss +66 -0
- package/themes/bootstrap/scss/_containers.scss +41 -0
- package/themes/bootstrap/scss/_dropdown.scss +250 -0
- package/themes/bootstrap/scss/_forms.scss +9 -0
- package/themes/bootstrap/scss/_functions.scss +302 -0
- package/themes/bootstrap/scss/_grid.scss +39 -0
- package/themes/bootstrap/scss/_helpers.scss +12 -0
- package/themes/bootstrap/scss/_images.scss +42 -0
- package/themes/bootstrap/scss/_list-group.scss +199 -0
- package/themes/bootstrap/scss/_maps.scss +174 -0
- package/themes/bootstrap/scss/_mixins.scss +42 -0
- package/themes/bootstrap/scss/_modal.scss +240 -0
- package/themes/bootstrap/scss/_nav.scss +197 -0
- package/themes/bootstrap/scss/_navbar.scss +289 -0
- package/themes/bootstrap/scss/_offcanvas.scss +147 -0
- package/themes/bootstrap/scss/_pagination.scss +109 -0
- package/themes/bootstrap/scss/_placeholders.scss +51 -0
- package/themes/bootstrap/scss/_popover.scss +196 -0
- package/themes/bootstrap/scss/_progress.scss +68 -0
- package/themes/bootstrap/scss/_reboot.scss +611 -0
- package/themes/bootstrap/scss/_root.scss +187 -0
- package/themes/bootstrap/scss/_spinners.scss +85 -0
- package/themes/bootstrap/scss/_tables.scss +171 -0
- package/themes/bootstrap/scss/_toasts.scss +73 -0
- package/themes/bootstrap/scss/_tooltip.scss +119 -0
- package/themes/bootstrap/scss/_transitions.scss +27 -0
- package/themes/bootstrap/scss/_type.scss +106 -0
- package/themes/bootstrap/scss/_utilities.scss +806 -0
- package/themes/bootstrap/scss/_variables-dark.scss +102 -0
- package/themes/bootstrap/scss/_variables.scss +1753 -0
- package/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
- package/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
- package/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
- package/themes/bootstrap/scss/bootstrap.scss +52 -0
- package/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
- package/themes/bootstrap/scss/forms/_form-check.scss +189 -0
- package/themes/bootstrap/scss/forms/_form-control.scss +214 -0
- package/themes/bootstrap/scss/forms/_form-range.scss +91 -0
- package/themes/bootstrap/scss/forms/_form-select.scss +80 -0
- package/themes/bootstrap/scss/forms/_form-text.scss +11 -0
- package/themes/bootstrap/scss/forms/_input-group.scss +132 -0
- package/themes/bootstrap/scss/forms/_labels.scss +36 -0
- package/themes/bootstrap/scss/forms/_validation.scss +12 -0
- package/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
- package/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
- package/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
- package/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
- package/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
- package/themes/bootstrap/scss/helpers/_position.scss +36 -0
- package/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
- package/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
- package/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
- package/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
- package/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
- package/themes/bootstrap/scss/helpers/_vr.scss +8 -0
- package/themes/bootstrap/scss/mixins/_alert.scss +18 -0
- package/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
- package/themes/bootstrap/scss/mixins/_banner.scss +7 -0
- package/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
- package/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
- package/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
- package/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
- package/themes/bootstrap/scss/mixins/_caret.scss +69 -0
- package/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
- package/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
- package/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
- package/themes/bootstrap/scss/mixins/_container.scss +11 -0
- package/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
- package/themes/bootstrap/scss/mixins/_forms.scss +163 -0
- package/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
- package/themes/bootstrap/scss/mixins/_grid.scss +151 -0
- package/themes/bootstrap/scss/mixins/_image.scss +16 -0
- package/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
- package/themes/bootstrap/scss/mixins/_lists.scss +7 -0
- package/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
- package/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
- package/themes/bootstrap/scss/mixins/_resize.scss +6 -0
- package/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
- package/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- package/themes/bootstrap/scss/mixins/_transition.scss +26 -0
- package/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
- package/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
- package/themes/bootstrap/scss/tests/jasmine.js +16 -0
- package/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
- package/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
- package/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
- package/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
- package/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
- package/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
- package/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
- package/themes/bootstrap/scss/utilities/_api.scss +47 -0
- package/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
- package/themes/classy/README.md +89 -0
- package/themes/classy/_config.scss +245 -0
- package/themes/classy/_theme.js +31 -0
- package/themes/classy/_theme.scss +57 -0
- package/themes/classy/css/app/_panels.scss +183 -0
- package/themes/classy/css/base/_fonts.scss +79 -0
- package/themes/classy/css/base/_no-raise.scss +49 -0
- package/themes/classy/css/base/_root.scss +113 -0
- package/themes/classy/css/base/_typography.scss +154 -0
- package/themes/classy/css/base/_utilities.scss +284 -0
- package/themes/classy/css/components/_alerts.scss +51 -0
- package/themes/classy/css/components/_badges.scss +46 -0
- package/themes/classy/css/components/_buttons.scss +175 -0
- package/themes/classy/css/components/_cards.scss +41 -0
- package/themes/classy/css/components/_dropdowns.scss +48 -0
- package/themes/classy/css/components/_forms.scss +171 -0
- package/themes/classy/css/components/_receipt.scss +45 -0
- package/themes/classy/css/layout/_footer.scss +298 -0
- package/themes/classy/css/layout/_general.scss +209 -0
- package/themes/classy/css/layout/_nav.scss +154 -0
- package/themes/classy/css/layout/_shell.scss +458 -0
- package/themes/classy/css/marketing/_bento.scss +238 -0
- package/themes/classy/css/marketing/_content.scss +1328 -0
- package/themes/classy/css/marketing/_downloads.scss +246 -0
- package/themes/classy/css/marketing/_hero.scss +311 -0
- package/themes/classy/css/marketing/_sections.scss +649 -0
- package/themes/classy/css/pages/404/index.scss +67 -0
- package/themes/classy/css/pages/_auth.scss +235 -0
- package/themes/classy/css/pages/admin/firebase/index.scss +22 -0
- package/themes/classy/css/pages/blog/[slug].scss +56 -0
- package/themes/classy/css/pages/cookies.scss +2 -0
- package/themes/classy/css/pages/dashboard/account/index.scss +31 -0
- package/themes/classy/css/pages/feedback/index.scss +39 -0
- package/themes/classy/css/pages/legal/_document.scss +192 -0
- package/themes/classy/css/pages/payment/checkout/index.scss +585 -0
- package/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
- package/themes/classy/css/pages/privacy.scss +2 -0
- package/themes/classy/css/pages/status/index.scss +164 -0
- package/themes/classy/css/pages/terms.scss +2 -0
- package/themes/classy/css/pages/updates/index.scss +128 -0
- package/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
- package/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
- package/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
- package/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
- package/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
- package/themes/classy/js/hero-demo-form.js +56 -0
- package/themes/neobrutalism/README.md +118 -0
- package/themes/neobrutalism/_config.scss +139 -0
- package/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
- package/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
- package/themes/neobrutalism/_theme.js +24 -0
- package/themes/neobrutalism/_theme.scss +61 -0
- package/themes/neobrutalism/css/base/_mixins.scss +46 -0
- package/themes/neobrutalism/css/base/_root.scss +169 -0
- package/themes/neobrutalism/css/base/_typography.scss +61 -0
- package/themes/neobrutalism/css/base/_utilities.scss +89 -0
- package/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
- package/themes/neobrutalism/css/components/_buttons.scss +148 -0
- package/themes/neobrutalism/css/components/_cards.scss +47 -0
- package/themes/neobrutalism/css/components/_forms.scss +88 -0
- package/themes/neobrutalism/css/components/_marketing.scss +244 -0
- package/themes/neobrutalism/css/layout/_general.scss +213 -0
- package/themes/neobrutalism/css/layout/_navigation.scss +171 -0
- package/themes/neobrutalism/css/pages/index.scss +203 -0
- package/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
- package/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
- package/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
- package/themes/newsflash/README.md +117 -0
- package/themes/newsflash/_components/heading/lede/component.html +14 -0
- package/themes/newsflash/_components/heading/lede/component.json5 +23 -0
- package/themes/newsflash/_components/heading/rule-head/component.html +17 -0
- package/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
- package/themes/newsflash/_components/news/byline/component.html +12 -0
- package/themes/newsflash/_components/news/byline/component.json5 +18 -0
- package/themes/newsflash/_components/news/story-card/component.html +25 -0
- package/themes/newsflash/_components/news/story-card/component.json5 +21 -0
- package/themes/newsflash/_config.scss +147 -0
- package/themes/newsflash/_layouts/frontend/core/base.html +51 -0
- package/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
- package/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
- package/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
- package/themes/newsflash/_sections/marketing/desks/section.html +39 -0
- package/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
- package/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
- package/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
- package/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
- package/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
- package/themes/newsflash/_theme.js +24 -0
- package/themes/newsflash/_theme.scss +70 -0
- package/themes/newsflash/css/base/_fonts.scss +80 -0
- package/themes/newsflash/css/base/_mixins.scss +51 -0
- package/themes/newsflash/css/base/_root.scss +257 -0
- package/themes/newsflash/css/base/_typography.scss +49 -0
- package/themes/newsflash/css/base/_utilities.scss +122 -0
- package/themes/newsflash/css/components/_badges.scss +65 -0
- package/themes/newsflash/css/components/_billing-toggle.scss +61 -0
- package/themes/newsflash/css/components/_buttons.scss +139 -0
- package/themes/newsflash/css/components/_cards.scss +47 -0
- package/themes/newsflash/css/components/_editorial.scss +173 -0
- package/themes/newsflash/css/components/_forms.scss +75 -0
- package/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
- package/themes/newsflash/css/components/_panels.scss +156 -0
- package/themes/newsflash/css/components/_ticker.scss +67 -0
- package/themes/newsflash/css/layout/_general.scss +330 -0
- package/themes/newsflash/css/layout/_navigation.scss +168 -0
- package/themes/newsflash/css/pages/404/index.scss +79 -0
- package/themes/newsflash/css/pages/blog/[slug].scss +186 -0
- package/themes/newsflash/css/pages/blog/index.scss +17 -0
- package/themes/newsflash/css/pages/index.scss +157 -0
- package/themes/newsflash/css/pages/pricing/index.scss +55 -0
- package/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
- package/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
- package/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
- package/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
- package/themes/newsflash/js/pages/blog/[slug].js +29 -0
- package/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
- package/translations/es/pages/404.json +86 -0
- package/translations/es/pages/account.json +36 -0
- package/translations/es/pages/app.json +44 -0
- package/translations/es/pages/cancel.json +36 -0
- package/translations/es/pages/change-password.json +36 -0
- package/translations/es/pages/connections/callback.json +41 -0
- package/translations/es/pages/dashboard/account.json +475 -0
- package/translations/es/pages/dashboard.json +36 -0
- package/translations/es/pages/forgot.json +36 -0
- package/translations/es/pages/join.json +36 -0
- package/translations/es/pages/login.json +36 -0
- package/translations/es/pages/payment/checkout.json +83 -0
- package/translations/es/pages/payment/confirmation.json +62 -0
- package/translations/es/pages/portal/email-preferences.json +46 -0
- package/translations/es/pages/recover.json +36 -0
- package/translations/es/pages/refund.json +36 -0
- package/translations/es/pages/register.json +36 -0
- package/translations/es/pages/reset-password.json +36 -0
- package/translations/es/pages/reset.json +42 -0
- package/translations/es/pages/signin.json +45 -0
- package/translations/es/pages/signup.json +60 -0
- package/translations/es/pages/token.json +39 -0
- package/translations/fa/pages/404.json +86 -0
- package/translations/fa/pages/account.json +36 -0
- package/translations/fa/pages/app.json +44 -0
- package/translations/fa/pages/cancel.json +36 -0
- package/translations/fa/pages/change-password.json +36 -0
- package/translations/fa/pages/connections/callback.json +41 -0
- package/translations/fa/pages/dashboard/account.json +475 -0
- package/translations/fa/pages/dashboard.json +36 -0
- package/translations/fa/pages/forgot.json +36 -0
- package/translations/fa/pages/join.json +36 -0
- package/translations/fa/pages/login.json +36 -0
- package/translations/fa/pages/payment/checkout.json +83 -0
- package/translations/fa/pages/payment/confirmation.json +62 -0
- package/translations/fa/pages/portal/email-preferences.json +46 -0
- package/translations/fa/pages/recover.json +36 -0
- package/translations/fa/pages/refund.json +36 -0
- package/translations/fa/pages/register.json +36 -0
- package/translations/fa/pages/reset-password.json +36 -0
- package/translations/fa/pages/reset.json +42 -0
- package/translations/fa/pages/signin.json +45 -0
- package/translations/fa/pages/signup.json +60 -0
- package/translations/fa/pages/token.json +39 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* omega-bin — the context-aware dispatcher behind every framework's `omega`/`omg` bin.
|
|
3
|
+
*
|
|
4
|
+
* Problem: every OMEGA framework ships the same bin names (`omega`, `omg`, `mgr`).
|
|
5
|
+
* In a brand monorepo with several targets, npm hoists all of them to the brand root
|
|
6
|
+
* and only ONE framework's file wins the node_modules/.bin link — so the bin that
|
|
7
|
+
* actually runs is arbitrary. This module makes any winner correct: it resolves
|
|
8
|
+
* the context that owns the CALLER'S cwd — nearest first, walking up — and runs
|
|
9
|
+
* THAT context's CLI:
|
|
10
|
+
*
|
|
11
|
+
* - an OMEGA PACKAGE'S OWN ROOT (package.json `name` is `@omega.js/*`) →
|
|
12
|
+
* that package's own CLI, or a refusal when it ships none. Checked FIRST,
|
|
13
|
+
* ahead of the dependency rule: a framework devDepends on other frameworks
|
|
14
|
+
* (extension and desktop on @omega.js/web for vendorAssets, the manager on
|
|
15
|
+
* @omega.js/backend), and reading those as a target made `omega test` in
|
|
16
|
+
* packages/extension run WEB's CLI, which scaffolded a web target into the
|
|
17
|
+
* package ([#757](https://github.com/Omega-JS-Stack/omega/issues/757))
|
|
18
|
+
* - a TARGET (nearest package.json declaring a framework, including the
|
|
19
|
+
* backend's functions/ layout) → that framework's CLI
|
|
20
|
+
* - a BRAND ROOT (config/omega.json5 with no framework declared nearer)
|
|
21
|
+
* → @omega.js/manager's CLI, so `omega test` at a brand root fans out
|
|
22
|
+
* over the brand's targets instead of guessing one framework
|
|
23
|
+
*
|
|
24
|
+
* Contract: every dispatch target exposes `exports['./cli']` → a module with
|
|
25
|
+
* `run()` that parses process.argv itself. Framework bin shims call
|
|
26
|
+
* `run({ hostName, hostRun })` — hostRun executes the host's own CLI via a
|
|
27
|
+
* RELATIVE require (vendor-safe), so the host never resolves itself by name.
|
|
28
|
+
*
|
|
29
|
+
* This module stays stdlib-only (fs/path/module): it is vendored into every
|
|
30
|
+
* framework dist and must never assume another package is installed.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
const fs = require('fs');
|
|
34
|
+
const path = require('path');
|
|
35
|
+
const { createRequire } = require('module');
|
|
36
|
+
|
|
37
|
+
const FRAMEWORKS = [
|
|
38
|
+
'@omega.js/web',
|
|
39
|
+
'@omega.js/backend',
|
|
40
|
+
'@omega.js/desktop',
|
|
41
|
+
'@omega.js/extension',
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
const MANAGER = '@omega.js/manager';
|
|
45
|
+
|
|
46
|
+
// Every package in the OMEGA monorepo carries this name prefix; no consumer
|
|
47
|
+
// target ever does. A manifest with it IS the package, never a project built
|
|
48
|
+
// on top of one (#757).
|
|
49
|
+
const OMEGA_SCOPE = '@omega.js/';
|
|
50
|
+
|
|
51
|
+
// Dirs that are a VIEW of the target one level up, never a context of their own:
|
|
52
|
+
// a backend's runtime cwd (functions/) and its staged build output (dist/,
|
|
53
|
+
// which carries a COMPOSED config/omega.json5 that would otherwise read as a
|
|
54
|
+
// brand root). Stdlib twin of @omega.js/config's TARGET_SUBDIRS — that module is
|
|
55
|
+
// the canonical list ([#307](https://github.com/Omega-JS-Stack/omega/issues/307)).
|
|
56
|
+
const TARGET_SUBDIRS = ['functions', 'dist'];
|
|
57
|
+
|
|
58
|
+
// The only verbs allowed to run with NO target context. The fallback exists for
|
|
59
|
+
// the bootstrap case (`npx omega onboard` in a fresh clone, #276) and for verbs
|
|
60
|
+
// that only READ; every other verb runs its target scaffold first (#675), so a
|
|
61
|
+
// run in a directory that owns no target WRITES one there — that is how a stray
|
|
62
|
+
// `omega deploy` at a workspace root scaffolded a whole desktop target into it
|
|
63
|
+
// ([#699](https://github.com/Omega-JS-Stack/omega/issues/699)).
|
|
64
|
+
//
|
|
65
|
+
// Tokens, not command names: a flag-style alias (`omega --deploy`, `omega -v`)
|
|
66
|
+
// selects a verb too, so every spelling of an allowed verb is listed —
|
|
67
|
+
// onboard/help/version across the router frameworks and the manager, plus
|
|
68
|
+
// backend's `cwd` and desktop's `logs`, the two read-only reporters.
|
|
69
|
+
const CONTEXTLESS_VERBS = new Set([
|
|
70
|
+
'onboard', 'create', 'new', '-o', '--onboard',
|
|
71
|
+
'help', 'h', '-h', '--help',
|
|
72
|
+
'version', 'v', '-v', '--version',
|
|
73
|
+
'cwd',
|
|
74
|
+
'logs', 'log', '--logs', 'logs:read', 'logs:tail', 'logs:stream',
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
// The signing box's verbs. A box that hosts the Windows EV signing runner is a
|
|
78
|
+
// MACHINE, not a project: `omega runner` and `omega sign-windows` read their
|
|
79
|
+
// configuration from the runner home and run from any directory. Both belong
|
|
80
|
+
// to @omega.js/desktop, so with no target they go to desktop's CLI — the host
|
|
81
|
+
// when desktop won the bin link (a bare `npm i -g @omega.js/desktop`), else
|
|
82
|
+
// desktop resolved from the cwd (a monorepo checkout, a brand root) — and
|
|
83
|
+
// refuse naming the install when it is nowhere. They scaffold nothing
|
|
84
|
+
// ([#337](https://github.com/Omega-JS-Stack/omega/issues/337)).
|
|
85
|
+
const BOX_VERBS = new Set(['runner', 'sign-windows']);
|
|
86
|
+
const DESKTOP = '@omega.js/desktop';
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The signing-box verb this invocation selects, or null. The ONE reading of
|
|
90
|
+
* "is this the box's", shared by the dispatcher below and by
|
|
91
|
+
* @omega.js/desktop's CLI (which skips the project `.env` cascade for exactly
|
|
92
|
+
* these) — two readings would drift, and the drift is a brand's token reaching
|
|
93
|
+
* the box.
|
|
94
|
+
*
|
|
95
|
+
* Both spellings count: the bare token (`omega runner status`) and the `--`
|
|
96
|
+
* flag desktop's alias table takes (`omega --runner`, `omega --sign-windows
|
|
97
|
+
* --smoke`). `--help` is never one: it prints help, in every spelling. A box
|
|
98
|
+
* verb sitting in an ARGUMENT position is not one either — `omega test runner`
|
|
99
|
+
* runs the test verb — so the first positional has to be the box verb itself.
|
|
100
|
+
*
|
|
101
|
+
* @param {string[]} argv - Arguments after the bin name.
|
|
102
|
+
* @returns {string|null} The box verb's canonical name, or null.
|
|
103
|
+
*/
|
|
104
|
+
function boxVerbOf(argv) {
|
|
105
|
+
argv = argv || [];
|
|
106
|
+
if (argv.includes('--help') || argv.includes('-h')) return null;
|
|
107
|
+
|
|
108
|
+
const positional = argv.find((arg) => !arg.startsWith('-'));
|
|
109
|
+
if (positional && BOX_VERBS.has(positional)) return positional;
|
|
110
|
+
|
|
111
|
+
const flag = argv.find((arg) => arg.startsWith('--') && BOX_VERBS.has(arg.slice(2)));
|
|
112
|
+
return flag ? flag.slice(2) : null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Boolean half of boxVerbOf — what callers that only need the yes/no ask.
|
|
117
|
+
*
|
|
118
|
+
* @param {string[]} argv - Arguments after the bin name.
|
|
119
|
+
* @returns {boolean}
|
|
120
|
+
*/
|
|
121
|
+
function isBoxVerbArgv(argv) {
|
|
122
|
+
return boxVerbOf(argv) !== null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function readPackage(dir) {
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8'));
|
|
128
|
+
} catch (e) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function frameworksOf(pkg) {
|
|
134
|
+
if (!pkg) return [];
|
|
135
|
+
const declared = Object.assign({}, pkg.dependencies || {}, pkg.devDependencies || {});
|
|
136
|
+
return FRAMEWORKS.filter((name) => declared[name]);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Is `dir` a brand-monorepo root? Carries a config/omega.json5 that is not
|
|
141
|
+
* itself a TARGET_SUBDIR view (functions/, dist/) and not a TARGET of a brand above
|
|
142
|
+
* it (directly under a targets/ dir whose parent also carries a brand config).
|
|
143
|
+
* Stdlib twin of @omega.js/config's resolveBrandRoot rule — that module is the
|
|
144
|
+
* canonical definition; this copy exists because the dispatcher cannot depend
|
|
145
|
+
* on @omega.js/config.
|
|
146
|
+
*/
|
|
147
|
+
function isBrandRoot(dir) {
|
|
148
|
+
if (TARGET_SUBDIRS.includes(path.basename(path.resolve(dir)))) return false;
|
|
149
|
+
if (!fs.existsSync(path.join(dir, 'config', 'omega.json5'))) return false;
|
|
150
|
+
|
|
151
|
+
const parent = path.dirname(dir);
|
|
152
|
+
const isTargetOfBrand = path.basename(parent) === 'targets'
|
|
153
|
+
&& fs.existsSync(path.join(path.dirname(parent), 'config', 'omega.json5'));
|
|
154
|
+
|
|
155
|
+
return !isTargetOfBrand;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Walk up from startDir to the nearest dispatch context. At each level, in
|
|
160
|
+
* order: the dir's own package.json being an OMEGA package, then declaring a
|
|
161
|
+
* framework, then brand-root-ness. IDENTITY beats dependency — a framework
|
|
162
|
+
* devDepends on other frameworks, and reading those as a target dispatched a
|
|
163
|
+
* framework's own root to a sibling framework's CLI (#757). Framework checks
|
|
164
|
+
* then come before the brand check so a standalone consumer (framework dep AND
|
|
165
|
+
* its own config/omega.json5 in one dir) dispatches as a target, not a brand.
|
|
166
|
+
* The CLI entry normalizes a functions/ cwd up to the target root
|
|
167
|
+
* (muscle-memory `cd functions` still works).
|
|
168
|
+
*
|
|
169
|
+
* The walk is BOUNDED at the nearest `.git` (that directory is still checked
|
|
170
|
+
* first): past the repo boundary is somebody else's tree, never this dir's
|
|
171
|
+
* dispatch context. Same bound as @omega.js/config's resolveBrandRoot and the
|
|
172
|
+
* Claude plugin's inject hook.
|
|
173
|
+
*
|
|
174
|
+
* @returns {{ kind: 'self', name: string, dir: string }
|
|
175
|
+
* | { kind: 'framework', name: string, dir: string }
|
|
176
|
+
* | { kind: 'brand', dir: string } | null} dir = the package's own root
|
|
177
|
+
* (self) / where the framework dep is declared (framework) / the brand root
|
|
178
|
+
* (brand)
|
|
179
|
+
*/
|
|
180
|
+
function findTarget(startDir) {
|
|
181
|
+
let dir = path.resolve(startDir);
|
|
182
|
+
while (true) {
|
|
183
|
+
const pkg = readPackage(dir);
|
|
184
|
+
|
|
185
|
+
if (pkg && typeof pkg.name === 'string' && pkg.name.startsWith(OMEGA_SCOPE)) {
|
|
186
|
+
return { kind: 'self', name: pkg.name, dir };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const matches = frameworksOf(pkg);
|
|
190
|
+
if (matches.length > 1) {
|
|
191
|
+
// Targets are one-framework-per-target by design — a multi-framework
|
|
192
|
+
// manifest dispatches by FRAMEWORKS order, which must never be silent.
|
|
193
|
+
console.error(`omega: ${dir} declares ${matches.length} frameworks (${matches.join(', ')}) — dispatching ${matches[0]}`);
|
|
194
|
+
}
|
|
195
|
+
const own = matches[0] || null;
|
|
196
|
+
if (own) return { kind: 'framework', name: own, dir };
|
|
197
|
+
|
|
198
|
+
if (isBrandRoot(dir)) {
|
|
199
|
+
return { kind: 'brand', dir };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Repo boundary — stop here rather than statting out through the host
|
|
203
|
+
// filesystem to /.
|
|
204
|
+
if (fs.existsSync(path.join(dir, '.git'))) return null;
|
|
205
|
+
|
|
206
|
+
const parent = path.dirname(dir);
|
|
207
|
+
if (parent === dir) return null;
|
|
208
|
+
dir = parent;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Resolve a dispatch target's ./cli from where it is declared.
|
|
214
|
+
* @returns {{ cliPath: string } | { error: Error }} — callers decide whether an
|
|
215
|
+
* unresolvable target is fatal (cross-framework) or falls back (brand).
|
|
216
|
+
*/
|
|
217
|
+
function tryResolveCli(name, fromDir) {
|
|
218
|
+
const req = createRequire(path.join(fromDir, 'package.json'));
|
|
219
|
+
try {
|
|
220
|
+
return { cliPath: req.resolve(`${name}/cli`) };
|
|
221
|
+
} catch (e) {
|
|
222
|
+
return { error: e };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Resolve a dispatch target's ./cli from where it is declared, with a clear failure. */
|
|
227
|
+
function resolveCli(name, fromDir, hint) {
|
|
228
|
+
const { cliPath, error } = tryResolveCli(name, fromDir);
|
|
229
|
+
if (error) {
|
|
230
|
+
console.error(`omega: found ${name} context (${fromDir}) but could not resolve '${name}/cli': ${error.message}`);
|
|
231
|
+
console.error(hint);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
return cliPath;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* The verb an invocation resolves to, as far as the dispatcher can see it: the
|
|
239
|
+
* frameworks' own resolution rules minus their per-framework alias tables.
|
|
240
|
+
* `--help`/`-h` wins outright (cli-router routes it ahead of positionals, so
|
|
241
|
+
* `omega deploy --help` prints help), then the first positional token, then the
|
|
242
|
+
* first flag-style alias. A bare `omega` has no verb — every CLI defaults to help.
|
|
243
|
+
*
|
|
244
|
+
* @param {string[]} argv - Arguments after the bin name.
|
|
245
|
+
* @returns {string|null} The selecting token, or null for a bare invocation.
|
|
246
|
+
*/
|
|
247
|
+
function verbOf(argv) {
|
|
248
|
+
if (argv.includes('--help') || argv.includes('-h')) return 'help';
|
|
249
|
+
return argv.find((arg) => !arg.startsWith('-')) || argv[0] || null;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
async function run({ hostName, hostRun, argv = process.argv.slice(2) }) {
|
|
253
|
+
const target = findTarget(process.cwd());
|
|
254
|
+
|
|
255
|
+
// No context — the bootstrap case (a verb run in a fresh directory has
|
|
256
|
+
// no framework dep yet, by definition). Run the HOST framework's CLI, exactly
|
|
257
|
+
// like the pre-dispatcher bins did, and say which one so a hoist-winner at a
|
|
258
|
+
// brand root is never a silent mystery.
|
|
259
|
+
if (!target) {
|
|
260
|
+
// …but ONLY for a verb that cannot write. The fallback hands a mutating verb
|
|
261
|
+
// to whichever framework won npm's bin link, and that verb scaffolds its own
|
|
262
|
+
// target into the cwd — a directory that owns no target is never where that
|
|
263
|
+
// should land (#699). Twin of ensure-target's refusal (devkit scaffold-guard.js).
|
|
264
|
+
const verb = verbOf(argv);
|
|
265
|
+
const boxVerb = boxVerbOf(argv);
|
|
266
|
+
if (boxVerb) {
|
|
267
|
+
if (hostName === DESKTOP) return hostRun();
|
|
268
|
+
const { cliPath } = tryResolveCli(DESKTOP, process.cwd());
|
|
269
|
+
if (!cliPath) {
|
|
270
|
+
console.error(`omega: "${boxVerb}" is ${DESKTOP}'s — a signing box runs it from any directory, but ${DESKTOP} is not installed here (from ${process.cwd()}). \`npm i -g ${DESKTOP}\`, then run it again.`);
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
console.error(`omega: no target context found from ${process.cwd()} — "${boxVerb}" is a signing-box verb, running ${DESKTOP}`);
|
|
274
|
+
return require(cliPath).run();
|
|
275
|
+
}
|
|
276
|
+
if (verb && !CONTEXTLESS_VERBS.has(verb)) {
|
|
277
|
+
console.error(`omega: refusing to run "${verb}" — ${process.cwd()} is not inside an OMEGA target (no framework dependency and no config/omega.json5 above it). Nothing was scaffolded.`);
|
|
278
|
+
console.error('Run it from a target directory, or `npx omega onboard` to create one here. Without a target, only onboard (create, new), help, version, cwd and logs run; the signing box\'s runner and sign-windows run through @omega.js/desktop.');
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
console.error(`omega: no target context found from ${process.cwd()} — running ${hostName}`);
|
|
283
|
+
return hostRun();
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// An OMEGA package's OWN root — run ITS CLI, so `omega test` in
|
|
287
|
+
// packages/extension runs the extension's self-test. A package is never a
|
|
288
|
+
// target: nothing here may reach the host fallback, whose ensure-target would
|
|
289
|
+
// scaffold a consumer project into the framework source tree (#757).
|
|
290
|
+
if (target.kind === 'self') {
|
|
291
|
+
if (target.name === hostName) return hostRun();
|
|
292
|
+
|
|
293
|
+
const { cliPath, error } = tryResolveCli(target.name, target.dir);
|
|
294
|
+
if (!cliPath) {
|
|
295
|
+
// Two different facts share one refusal: a package that exports no
|
|
296
|
+
// `./cli` at all (config, devkit, ...) versus one that declares it but
|
|
297
|
+
// cannot resolve it right now (an unbuilt dist, a fresh clone before
|
|
298
|
+
// `npm install`). Name the one that applies.
|
|
299
|
+
const reason = error && error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED'
|
|
300
|
+
? 'which ships no CLI'
|
|
301
|
+
: `whose './cli' did not resolve (${error ? error.message : 'unknown'}; an unbuilt dist? run its prepare)`;
|
|
302
|
+
console.error(`omega: refusing to run — ${target.dir} is the ${target.name} package itself, ${reason}, and an OMEGA package is never a target. Nothing was scaffolded.`);
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
return require(cliPath).run();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// A brand root — the manager owns brand-level commands (`omega test` fans
|
|
309
|
+
// out over targets/*). Resolve it from the brand root and hand over.
|
|
310
|
+
if (target.kind === 'brand') {
|
|
311
|
+
const { cliPath } = tryResolveCli(MANAGER, target.dir);
|
|
312
|
+
|
|
313
|
+
// Brand-SHAPED is not always a brand: every verb's ensureTarget scaffolds
|
|
314
|
+
// config/omega.json5 into a standalone project before its framework dep lands
|
|
315
|
+
// in package.json, so the walk classifies a fresh target as a brand root. With
|
|
316
|
+
// no manager installed there is no brand-level CLI to hand over to — fall
|
|
317
|
+
// back to the host framework rather than dead-ending (#194). A real brand
|
|
318
|
+
// root still dispatches to the manager the moment it exists.
|
|
319
|
+
if (!cliPath) {
|
|
320
|
+
// When the HOST is the manager itself (its own bin in a fresh template
|
|
321
|
+
// clone), "install the manager" would name the thing about to run —
|
|
322
|
+
// that message is for framework hosts only.
|
|
323
|
+
if (hostName === MANAGER) {
|
|
324
|
+
console.error(`omega: brand-shaped directory at ${target.dir} with no installed ${MANAGER} — running the bundled ${hostName} (run npm install to use the pinned version)`);
|
|
325
|
+
} else {
|
|
326
|
+
console.error(`omega: brand-shaped directory at ${target.dir} but ${MANAGER} is not installed — running ${hostName} instead (install ${MANAGER} at the brand root, or \`mgr i local\` for a monorepo link, if this really is a brand)`);
|
|
327
|
+
}
|
|
328
|
+
return hostRun();
|
|
329
|
+
}
|
|
330
|
+
return require(cliPath).run();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// The bin that won npm's .bin link belongs to this target's framework — run it directly.
|
|
334
|
+
if (target.name === hostName) {
|
|
335
|
+
return hostRun();
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// The target belongs to a DIFFERENT framework — resolve its CLI from where the
|
|
339
|
+
// dependency is declared and hand over.
|
|
340
|
+
const cliPath = resolveCli(target.name, target.dir,
|
|
341
|
+
'Is the framework installed? Try npm install, or `mgr i local` for a monorepo link.');
|
|
342
|
+
return require(cliPath).run();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
module.exports = { run, findTarget, isBrandRoot, verbOf, isBoxVerbArgv, TARGET_SUBDIRS, CONTEXTLESS_VERBS, BOX_VERBS, FRAMEWORKS, MANAGER };
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency-tracked config reads (#200). Devkit-homed (the build-time
|
|
3
|
+
* harmonization ruling, docs/shared/rulings.md): any framework dev loop may
|
|
4
|
+
* adopt it; @omega.js/web is the first consumer. Every config-time filesystem
|
|
5
|
+
* read goes through this helper, and READING IS THE REGISTRATION: each
|
|
6
|
+
* call records the directory it touched into the active capture scope, and
|
|
7
|
+
* `omega dev` watches the recorded union for config resets. No caller ever
|
|
8
|
+
* maintains a watch list, so a capture added later cannot drift out of the
|
|
9
|
+
* watch set — the hand list was the thing that kept forgetting (#139).
|
|
10
|
+
*
|
|
11
|
+
* The recording rules live HERE, never in the callers:
|
|
12
|
+
* - DIRECTORY granularity: a file read records its dirname. One dir is one
|
|
13
|
+
* watch target (the watcher walks it recursively anyway), and per-file
|
|
14
|
+
* targets would multiply with every page of a real brand.
|
|
15
|
+
* - A MISS still arms: probing a dir/file that does not exist records the
|
|
16
|
+
* directory anyway, so a brand that authors src/_includes mid-session gets
|
|
17
|
+
* its reset without a restart (the unconditional-arm idiom).
|
|
18
|
+
* - REALPATH outside the consumer dir: a linked brand reaches the framework
|
|
19
|
+
* through a `node_modules/@omega.js/web` symlink, and Eleventy's watcher
|
|
20
|
+
* ignores that whole subtree — the resolved path sidesteps it (#134).
|
|
21
|
+
* Consumer-dir paths are recorded as read; the dev loop derives them from
|
|
22
|
+
* cwd, which is already resolved.
|
|
23
|
+
* - CONTAINMENT pruning: every watcher over a recorded dir is recursive, so a
|
|
24
|
+
* recorded dir with a recorded ancestor is the same target twice. Only the
|
|
25
|
+
* shallowest survives (a section library alone records one dir per entry
|
|
26
|
+
* folder — 83 targets on the playground brand, 14 after pruning).
|
|
27
|
+
*
|
|
28
|
+
* Two KINDS of capture (#200):
|
|
29
|
+
* - `reset` (Lane A, the default): the product is baked into the Eleventy
|
|
30
|
+
* config, so a change rebuilds the whole config.
|
|
31
|
+
* - `rescan` (Lane B, `reads.rescan(run)`): the product gates per-page
|
|
32
|
+
* decisions the render consults LIVE, so a change re-runs just `run` — no
|
|
33
|
+
* config reset, which is what keeps ordinary page edits on Eleventy's
|
|
34
|
+
* incremental lane. A dir both lanes read stays `reset`: the config itself
|
|
35
|
+
* depends on it, and a reset covers the rescan too.
|
|
36
|
+
*
|
|
37
|
+
* Scope lifecycle: `configureOmega` opens ONE scope per config build and
|
|
38
|
+
* closes it on the way out, so every config-time read is inside one. `omega
|
|
39
|
+
* dev` arms `onNextScope` before the engine runs and registers the union when
|
|
40
|
+
* the scope closes (web's src/commands/dev.js). Everywhere else — the boot phase,
|
|
41
|
+
* the asset lane, `omega build` — no scope is open and recording is a no-op:
|
|
42
|
+
* the reads still work, they just record nothing.
|
|
43
|
+
*/
|
|
44
|
+
const fs = require('node:fs');
|
|
45
|
+
const path = require('node:path');
|
|
46
|
+
|
|
47
|
+
// The active capture scope: { consumerDir, dirs: Map<string, entry>, handler,
|
|
48
|
+
// rescan }. An entry is { kind, reruns: Set<function> }; `rescan` is the
|
|
49
|
+
// capture currently running, if any. One scope at a time — config builds never
|
|
50
|
+
// nest.
|
|
51
|
+
let scope = null;
|
|
52
|
+
|
|
53
|
+
// The handler armed for the NEXT scope (dev.js, before the engine runs).
|
|
54
|
+
let armed = null;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Arm a handler for the next capture scope: it receives that scope's recorded
|
|
58
|
+
* targets when the scope closes. Armed for ONE scope — every config build arms
|
|
59
|
+
* its own.
|
|
60
|
+
* @param {function} handler - (targets) => void
|
|
61
|
+
*/
|
|
62
|
+
function onNextScope(handler) {
|
|
63
|
+
armed = handler;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Open a capture scope. Any scope still open is replaced — a config build that
|
|
68
|
+
* threw halfway leaves one behind, and the next build must still record.
|
|
69
|
+
* @param {object} options
|
|
70
|
+
* @param {string} [options.consumerDir] - the Eleventy input dir (paths under
|
|
71
|
+
* it are recorded as read; everything else resolves through realpath)
|
|
72
|
+
*/
|
|
73
|
+
function openScope(options) {
|
|
74
|
+
const consumerDir = options && options.consumerDir;
|
|
75
|
+
scope = {
|
|
76
|
+
consumerDir: consumerDir ? path.resolve(consumerDir) : null,
|
|
77
|
+
dirs: new Map(),
|
|
78
|
+
handler: armed,
|
|
79
|
+
rescan: null,
|
|
80
|
+
};
|
|
81
|
+
armed = null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Close the active capture scope and hand its unions to the armed handler:
|
|
86
|
+
* the reset targets first (the dev loop registers them with Eleventy), the
|
|
87
|
+
* rescan targets second (the dev loop's own light watcher).
|
|
88
|
+
* @returns {Array<{ dir: string, kind: string }>} the recorded reset union
|
|
89
|
+
*/
|
|
90
|
+
function closeScope() {
|
|
91
|
+
const targets = recordedTargets();
|
|
92
|
+
const rescans = rescanTargets();
|
|
93
|
+
const handler = scope && scope.handler;
|
|
94
|
+
scope = null;
|
|
95
|
+
if (handler) handler(targets, rescans);
|
|
96
|
+
return targets;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Run a RESCAN capture: `run()` executes immediately (its reads are what
|
|
101
|
+
* record), every dir it touches is recorded with kind `rescan`, and the
|
|
102
|
+
* recorded target carries `run` itself — so the dev loop re-runs exactly the
|
|
103
|
+
* scan whose input changed. ONE line per capture at the call site: whatever
|
|
104
|
+
* `run` writes into is the live decision the render reads.
|
|
105
|
+
* @param {function} run - the scan, re-runnable at any time
|
|
106
|
+
* @returns {*} run()'s return value
|
|
107
|
+
*/
|
|
108
|
+
function rescan(run) {
|
|
109
|
+
if (!scope) return run();
|
|
110
|
+
const previous = scope.rescan;
|
|
111
|
+
scope.rescan = run;
|
|
112
|
+
try {
|
|
113
|
+
return run();
|
|
114
|
+
} finally {
|
|
115
|
+
scope.rescan = previous;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The active scope's recorded RESET union — deduped, contained dirs pruned,
|
|
121
|
+
* one entry per directory. A change to any of them rebuilds the whole Eleventy
|
|
122
|
+
* config.
|
|
123
|
+
* @returns {Array<{ dir: string, kind: string }>}
|
|
124
|
+
*/
|
|
125
|
+
function recordedTargets() {
|
|
126
|
+
return union('reset').map(({ dir }) => ({ dir, kind: 'reset' }));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The active scope's recorded RESCAN union — same pruning, each surviving
|
|
131
|
+
* target carrying a `rerun` that re-runs every capture recorded under it
|
|
132
|
+
* (a pruned dir's capture rides the ancestor that swallowed it).
|
|
133
|
+
* @returns {Array<{ dir: string, kind: string, rerun: function }>}
|
|
134
|
+
*/
|
|
135
|
+
function rescanTargets() {
|
|
136
|
+
return union('rescan').map(({ dir, reruns }) => ({
|
|
137
|
+
dir,
|
|
138
|
+
kind: 'rescan',
|
|
139
|
+
rerun: () => reruns.forEach((run) => run()),
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The pruned union of one kind: contained dirs fold into their shallowest
|
|
145
|
+
* recorded ancestor, and that ancestor inherits their captures.
|
|
146
|
+
* @param {string} kind
|
|
147
|
+
* @returns {Array<{ dir: string, reruns: Set<function> }>}
|
|
148
|
+
*/
|
|
149
|
+
function union(kind) {
|
|
150
|
+
if (!scope) return [];
|
|
151
|
+
const dirs = new Set([...scope.dirs].filter(([, entry]) => entry.kind === kind).map(([dir]) => dir));
|
|
152
|
+
const kept = new Map();
|
|
153
|
+
|
|
154
|
+
for (const dir of dirs) {
|
|
155
|
+
const cover = covering(dir, dirs);
|
|
156
|
+
const reruns = kept.get(cover) || new Set();
|
|
157
|
+
scope.dirs.get(dir).reruns.forEach((run) => reruns.add(run));
|
|
158
|
+
kept.set(cover, reruns);
|
|
159
|
+
}
|
|
160
|
+
return [...kept].map(([dir, reruns]) => ({ dir, reruns }));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The SHALLOWEST recorded ancestor of a dir, or the dir itself when nothing
|
|
165
|
+
* recorded contains it.
|
|
166
|
+
* @param {string} dir
|
|
167
|
+
* @param {Set<string>} dirs - the recorded dirs of one kind
|
|
168
|
+
* @returns {string}
|
|
169
|
+
*/
|
|
170
|
+
function covering(dir, dirs) {
|
|
171
|
+
let cover = dir;
|
|
172
|
+
let parent = path.dirname(dir);
|
|
173
|
+
while (parent !== path.dirname(parent)) {
|
|
174
|
+
if (dirs.has(parent)) cover = parent;
|
|
175
|
+
parent = path.dirname(parent);
|
|
176
|
+
}
|
|
177
|
+
return cover;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Record a directory into the active scope (no-op outside one). A reset
|
|
182
|
+
* recording is final — the config's own dependency outranks a rescan's.
|
|
183
|
+
* @param {string} dir
|
|
184
|
+
*/
|
|
185
|
+
function record(dir) {
|
|
186
|
+
if (!scope) return;
|
|
187
|
+
const abs = path.resolve(dir);
|
|
188
|
+
const inConsumer = scope.consumerDir
|
|
189
|
+
&& (abs === scope.consumerDir || abs.startsWith(scope.consumerDir + path.sep));
|
|
190
|
+
const key = inConsumer ? abs : resolved(abs);
|
|
191
|
+
const kind = scope.rescan ? 'rescan' : 'reset';
|
|
192
|
+
const entry = scope.dirs.get(key) || { kind, reruns: new Set() };
|
|
193
|
+
|
|
194
|
+
if (entry.kind === 'rescan' && kind === 'reset') {
|
|
195
|
+
entry.kind = 'reset';
|
|
196
|
+
entry.reruns.clear();
|
|
197
|
+
}
|
|
198
|
+
if (scope.rescan && entry.kind === 'rescan') entry.reruns.add(scope.rescan);
|
|
199
|
+
scope.dirs.set(key, entry);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* The realpath of a path. A MISSING path has nothing to resolve, but the way
|
|
204
|
+
* to it can still run through a symlink — a linked brand's not-yet-shipped
|
|
205
|
+
* packaged dir is reached through `node_modules/@omega.js/web`, the subtree
|
|
206
|
+
* Eleventy's watcher ignores wholesale — so the nearest EXISTING ancestor is
|
|
207
|
+
* resolved and the missing tail re-joined onto it.
|
|
208
|
+
* @param {string} abs
|
|
209
|
+
* @returns {string}
|
|
210
|
+
*/
|
|
211
|
+
function resolved(abs) {
|
|
212
|
+
try {
|
|
213
|
+
return fs.realpathSync(abs);
|
|
214
|
+
} catch {
|
|
215
|
+
const parent = path.dirname(abs);
|
|
216
|
+
if (parent === abs) return abs; // the filesystem root: nothing above it to resolve
|
|
217
|
+
return path.join(resolved(parent), path.basename(abs));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* List a directory, recording it. Reading through here is what arms the watch.
|
|
223
|
+
* @param {string} dir
|
|
224
|
+
* @param {object} [options] - fs.readdirSync options (withFileTypes, recursive)
|
|
225
|
+
* @returns {Array} fs.readdirSync's result
|
|
226
|
+
*/
|
|
227
|
+
function readdir(dir, options) {
|
|
228
|
+
record(dir);
|
|
229
|
+
return fs.readdirSync(dir, options);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Read a UTF-8 file, recording its directory.
|
|
234
|
+
* @param {string} file
|
|
235
|
+
* @returns {string}
|
|
236
|
+
*/
|
|
237
|
+
function read(file) {
|
|
238
|
+
record(path.dirname(file));
|
|
239
|
+
return fs.readFileSync(file, 'utf8');
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Does a directory exist? Records it either way — a dir that appears
|
|
244
|
+
* mid-session must already be armed.
|
|
245
|
+
* @param {string} dir
|
|
246
|
+
* @returns {boolean}
|
|
247
|
+
*/
|
|
248
|
+
function dirExists(dir) {
|
|
249
|
+
record(dir);
|
|
250
|
+
return fs.existsSync(dir);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Does a file exist? Records the directory that holds it, present or not.
|
|
255
|
+
* @param {string} file
|
|
256
|
+
* @returns {boolean}
|
|
257
|
+
*/
|
|
258
|
+
function fileExists(file) {
|
|
259
|
+
record(path.dirname(file));
|
|
260
|
+
return fs.existsSync(file);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
module.exports = {
|
|
264
|
+
onNextScope,
|
|
265
|
+
openScope,
|
|
266
|
+
closeScope,
|
|
267
|
+
rescan,
|
|
268
|
+
recordedTargets,
|
|
269
|
+
rescanTargets,
|
|
270
|
+
readdir,
|
|
271
|
+
read,
|
|
272
|
+
dirExists,
|
|
273
|
+
fileExists,
|
|
274
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// safeInstall(command) — run a shell command, routing `npm install` through Socket
|
|
2
|
+
// Firewall (sfw) when it's available so dependency trees are scanned for malware,
|
|
3
|
+
// typosquats, and supply-chain attacks before download. Non-install commands and
|
|
4
|
+
// machines without sfw pass through unchanged.
|
|
5
|
+
|
|
6
|
+
const { execute } = require('node-powertools');
|
|
7
|
+
|
|
8
|
+
let _hasSfw;
|
|
9
|
+
async function safeInstall(command, options) {
|
|
10
|
+
if (_hasSfw === undefined) {
|
|
11
|
+
_hasSfw = await execute('sfw --version', { log: false }).then(() => true).catch(() => false);
|
|
12
|
+
}
|
|
13
|
+
const isInstall = /^npm\s+(install|i)\b/.test(command);
|
|
14
|
+
const prefix = (_hasSfw && isInstall) ? 'sfw ' : '';
|
|
15
|
+
return execute(`${prefix}${command}`, options || { log: true });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
module.exports = { safeInstall };
|