├── .cz-config.js ├── .czrc ├── .editorconfig ├── .eslintrc ├── .eslintrc.json ├── .firebase └── hosting.ZGlzdFxzdGF0aWNcZG9jLXNpdGVz.cache ├── .gitattributes ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── ----docs-report.md │ ├── ---bug-report.md │ └── ---feature-request.md ├── PULL_REQUEST_TEMPLATE.md ├── build-artifacts │ └── action.yml ├── module-cache │ └── action.yaml ├── test-build-verdaccio │ └── action.yml ├── test-build │ └── action.yml └── workflows │ ├── PublishToNpm.yml │ ├── bumpAndTag.yml │ ├── codeql-analysis.yml │ ├── publish.yml │ └── workflow.yml ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .huskyrc ├── .prettierignore ├── .prettierrc ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── apps ├── .gitkeep ├── sample-blog │ ├── .browserslistrc │ ├── src │ │ ├── app │ │ │ ├── about │ │ │ │ ├── about-routing.module.ts │ │ │ │ ├── about.component.css │ │ │ │ ├── about.component.html │ │ │ │ ├── about.component.ts │ │ │ │ └── about.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.css │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.sps.module.ts │ │ │ ├── basehref │ │ │ │ ├── basehref.module.ts │ │ │ │ └── dist │ │ │ │ │ └── .nx-results │ │ │ ├── blog │ │ │ │ ├── blog-holder.component.ts │ │ │ │ ├── blog-list │ │ │ │ │ ├── blog-list.component.css │ │ │ │ │ ├── blog-list.component.html │ │ │ │ │ ├── blog-list.component.spec.ts │ │ │ │ │ └── blog-list.component.ts │ │ │ │ ├── blog-routing.module.ts │ │ │ │ ├── blog.component.css │ │ │ │ ├── blog.component.html │ │ │ │ ├── blog.component.spec.ts │ │ │ │ ├── blog.component.ts │ │ │ │ └── blog.module.ts │ │ │ ├── content │ │ │ │ ├── content.component.ts │ │ │ │ └── content.module.ts │ │ │ ├── demo │ │ │ │ ├── demo-routing.module.ts │ │ │ │ ├── demo.component.css │ │ │ │ ├── demo.component.html │ │ │ │ ├── demo.component.spec.ts │ │ │ │ ├── demo.component.ts │ │ │ │ └── demo.module.ts │ │ │ ├── dist │ │ │ │ └── .nx-results │ │ │ ├── exclude │ │ │ │ ├── exclude-routing.module.ts │ │ │ │ ├── exclude.component.spec.ts │ │ │ │ ├── exclude.component.ts │ │ │ │ └── exclude.module.ts │ │ │ ├── manual-idle │ │ │ │ ├── manual-idle-routing.module.ts │ │ │ │ ├── manual-idle.component.css │ │ │ │ ├── manual-idle.component.html │ │ │ │ ├── manual-idle.component.spec.ts │ │ │ │ ├── manual-idle.component.ts │ │ │ │ └── manual-idle.module.ts │ │ │ ├── noscript │ │ │ │ └── noscript.module.ts │ │ │ ├── pagenotfound │ │ │ │ ├── pagenotfound-routing.module.ts │ │ │ │ ├── pagenotfound.component.css │ │ │ │ ├── pagenotfound.component.html │ │ │ │ ├── pagenotfound.component.spec.ts │ │ │ │ ├── pagenotfound.component.ts │ │ │ │ └── pagenotfound.module.ts │ │ │ ├── slow │ │ │ │ ├── slow-routing.module.ts │ │ │ │ ├── slow.component.spec.ts │ │ │ │ ├── slow.component.ts │ │ │ │ └── slow.module.ts │ │ │ ├── static │ │ │ │ ├── static-routing.module.ts │ │ │ │ ├── static.component.css │ │ │ │ ├── static.component.html │ │ │ │ ├── static.component.spec.ts │ │ │ │ ├── static.component.ts │ │ │ │ └── static.module.ts │ │ │ ├── tss-resolver │ │ │ │ ├── tss-resolver-routing.module.ts │ │ │ │ ├── tss-resolver.component.css │ │ │ │ ├── tss-resolver.component.html │ │ │ │ ├── tss-resolver.component.spec.ts │ │ │ │ ├── tss-resolver.component.ts │ │ │ │ ├── tss-resolver.module.ts │ │ │ │ └── user.resolver.ts │ │ │ └── user │ │ │ │ ├── post │ │ │ │ ├── post.component.css │ │ │ │ ├── post.component.html │ │ │ │ ├── post.component.spec.ts │ │ │ │ └── post.component.ts │ │ │ │ ├── posts │ │ │ │ ├── posts.component.css │ │ │ │ ├── posts.component.html │ │ │ │ ├── posts.component.spec.ts │ │ │ │ └── posts.component.ts │ │ │ │ ├── user-routing.module.ts │ │ │ │ ├── user.component.css │ │ │ │ ├── user.component.html │ │ │ │ ├── user.component.spec.ts │ │ │ │ ├── user.component.ts │ │ │ │ ├── user.module.ts │ │ │ │ └── users │ │ │ │ ├── users.component.css │ │ │ │ ├── users.component.html │ │ │ │ ├── users.component.spec.ts │ │ │ │ └── users.component.ts │ │ ├── assets │ │ │ ├── .gitkeep │ │ │ └── scullyio-logo-black.svg │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ └── test.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── tslint.json ├── scully-docs │ ├── .browserslistrc │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.css │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.sps.module.ts │ │ │ ├── components │ │ │ │ ├── footer │ │ │ │ │ ├── component │ │ │ │ │ │ ├── footer.component.css │ │ │ │ │ │ ├── footer.component.spec.ts │ │ │ │ │ │ └── footer.component.ts │ │ │ │ │ ├── footer.module.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── header │ │ │ │ │ ├── component │ │ │ │ │ │ └── nav-header │ │ │ │ │ │ │ ├── nav-header.component.css │ │ │ │ │ │ │ ├── nav-header.component.spec.ts │ │ │ │ │ │ │ └── nav-header.component.ts │ │ │ │ │ ├── header.module.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── lang-select │ │ │ │ │ ├── component │ │ │ │ │ │ └── lang-select │ │ │ │ │ │ │ ├── lang-select.component.css │ │ │ │ │ │ │ ├── lang-select.component.spec.ts │ │ │ │ │ │ │ └── lang-select.component.ts │ │ │ │ │ └── lang-select.module.ts │ │ │ │ └── nav-list │ │ │ │ │ ├── nav-list.module.ts │ │ │ │ │ ├── nav-list.service.ts │ │ │ │ │ └── navitem.ts │ │ │ ├── page-not-found.component.ts │ │ │ └── pages │ │ │ │ ├── docs │ │ │ │ ├── docs-routing.module.ts │ │ │ │ ├── docs.module.ts │ │ │ │ └── page │ │ │ │ │ ├── docs.page.component.css │ │ │ │ │ ├── docs.page.component.spec.ts │ │ │ │ │ └── docs.page.component.ts │ │ │ │ ├── extraPages │ │ │ │ └── extra-page.module.ts │ │ │ │ └── landing │ │ │ │ ├── components │ │ │ │ ├── features │ │ │ │ │ ├── features.component.css │ │ │ │ │ ├── features.component.spec.ts │ │ │ │ │ └── features.component.ts │ │ │ │ ├── intro │ │ │ │ │ ├── intro.component.css │ │ │ │ │ ├── intro.component.spec.ts │ │ │ │ │ └── intro.component.ts │ │ │ │ ├── quote │ │ │ │ │ ├── quote.component.css │ │ │ │ │ ├── quote.component.spec.ts │ │ │ │ │ └── quote.component.ts │ │ │ │ └── resources │ │ │ │ │ ├── resources.component.css │ │ │ │ │ ├── resources.component.spec.ts │ │ │ │ │ └── resources.component.ts │ │ │ │ ├── landing-routing.module.ts │ │ │ │ ├── landing.module.ts │ │ │ │ └── page │ │ │ │ ├── landing.component.spec.ts │ │ │ │ └── landing.component.ts │ │ ├── assets │ │ │ ├── .gitkeep │ │ │ ├── beta-badge.png │ │ │ ├── clipboard.min.js │ │ │ └── img │ │ │ │ ├── footer-bg.png │ │ │ │ ├── icons │ │ │ │ ├── angle-double-right-solid.svg │ │ │ │ ├── angular-brands.svg │ │ │ │ ├── arrow-left-solid.svg │ │ │ │ ├── arrow-right-solid.svg │ │ │ │ ├── bars-regular.svg │ │ │ │ ├── blog-solid.svg │ │ │ │ ├── book-solid.svg │ │ │ │ ├── check-solid.svg │ │ │ │ ├── chevron-right-solid.svg │ │ │ │ ├── code-branch-solid.svg │ │ │ │ ├── file-exclamation-regular.svg │ │ │ │ ├── github-brands.svg │ │ │ │ ├── globe-solid.svg │ │ │ │ ├── pen-solid.svg │ │ │ │ ├── play-solid.svg │ │ │ │ └── puzzle-piece-solid.svg │ │ │ │ ├── scully-symbol.svg │ │ │ │ ├── scully-triad.svg │ │ │ │ ├── scullyio-logo-black.svg │ │ │ │ ├── scullyio-logo-light.svg │ │ │ │ ├── scullyio-logo.svg │ │ │ │ └── showcase │ │ │ │ ├── 1800contacts-01.jpg │ │ │ │ ├── angularenterprise-01.jpg │ │ │ │ ├── appsatease-01.jpg │ │ │ │ ├── brunoelo-blog.jpg │ │ │ │ ├── collage-club.jpg │ │ │ │ ├── configcat-01.jpg │ │ │ │ ├── desitrails-01.jpg │ │ │ │ ├── devjobsscanner-01.jpg │ │ │ │ ├── essentialclinic-01.jpg │ │ │ │ ├── gammastream-01.jpg │ │ │ │ ├── glitchtip-01.jpg │ │ │ │ ├── learning.dev-01.jpg │ │ │ │ ├── ledgedevops-01.jpg │ │ │ │ ├── mnm-01.jpg │ │ │ │ ├── nicolatoledo-01.jpg │ │ │ │ ├── owlly-01.jpg │ │ │ │ ├── scully-01.jpg │ │ │ │ └── solocoding-01.jpg │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles │ │ │ ├── _beta.css │ │ │ ├── _reset.css │ │ │ ├── _variables.css │ │ │ ├── blockquote.css │ │ │ ├── code.css │ │ │ ├── details.css │ │ │ ├── headings.css │ │ │ ├── icon_button.css │ │ │ ├── link_table.css │ │ │ ├── links.css │ │ │ ├── nav.css │ │ │ ├── paragraph_list.css │ │ │ ├── prev_next.css │ │ │ ├── prism-scully.css │ │ │ ├── showcase.css │ │ │ ├── table.css │ │ │ └── toc.css │ │ └── test.ts │ ├── tsconfig.app.json │ ├── tsconfig.editor.json │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── tslint.json └── sps-sample │ ├── .browserslistrc │ ├── .eslintrc.json │ ├── jest.config.js │ ├── src │ ├── app │ │ ├── about │ │ │ ├── about-routing.module.ts │ │ │ ├── about.component.css │ │ │ ├── about.component.html │ │ │ ├── about.component.spec.ts │ │ │ ├── about.component.ts │ │ │ └── about.module.ts │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── app.sps.module.ts │ │ ├── demo │ │ │ ├── demo-routing.module.ts │ │ │ ├── demo.component.ts │ │ │ └── demo.module.ts │ │ ├── docs │ │ │ ├── docs-routing.module.ts │ │ │ ├── docs.component.css │ │ │ ├── docs.component.html │ │ │ ├── docs.component.spec.ts │ │ │ ├── docs.component.ts │ │ │ └── docs.module.ts │ │ ├── home │ │ │ ├── home-routing.module.ts │ │ │ ├── home.component.css │ │ │ ├── home.component.html │ │ │ ├── home.component.spec.ts │ │ │ ├── home.component.ts │ │ │ └── home.module.ts │ │ └── user │ │ │ ├── user-routing.module.ts │ │ │ ├── user.component.spec.ts │ │ │ ├── user.component.ts │ │ │ └── user.module.ts │ ├── assets │ │ └── .gitkeep │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── polyfills.ts │ ├── styles.css │ └── test-setup.ts │ ├── tsconfig.app.json │ ├── tsconfig.editor.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── assets ├── 1800contacts_logo_indigo.png ├── hero-devs-logo-400x400.jpg ├── hero-devs-logo-80x80.jpg └── logos │ ├── PNG │ ├── Black │ │ ├── scullyio-icon-black.png │ │ ├── scullyio-logo-black.png │ │ └── scullyio-wordmark-black.png │ ├── Green │ │ ├── scullyio-icon-green.png │ │ ├── scullyio-logo-green.png │ │ └── scullyio-wordmark-green.png │ ├── White │ │ ├── scullyio-icon-white.png │ │ ├── scullyio-logo-white.png │ │ └── scullyio-wordmark-white.png │ ├── scullyio-icon.png │ ├── scullyio-logo.png │ └── scullyio-wordmark.png │ ├── SVG │ ├── Black │ │ ├── scullyio-icon-black.svg │ │ ├── scullyio-logo-black.svg │ │ └── wordmark-black.svg │ ├── Green │ │ ├── scullyio-icon-green.svg │ │ ├── scullyio-logo-green.svg │ │ └── wordmark-green.svg │ ├── White │ │ ├── scullyio-icon-white.svg │ │ ├── scullyio-logo-white.svg │ │ └── wordmark-white.svg │ ├── scully-triad.svg │ ├── scullyio-icon.svg │ ├── scullyio-logo.svg │ └── wordmark.svg │ ├── scullyio-logo-base.pdf │ ├── scullyio-logo-source.ai │ └── twitter │ ├── scullyio-twitter-cover.png │ └── scullyio-twitter-profile-icon.png ├── cleanCSStest.ts ├── client_id ├── commitlint.config.js ├── cypress.json ├── demos └── plugins │ ├── errorPlugin.js │ ├── newSample.js │ ├── tocPlugin.js │ └── voidPlugin.js ├── depedencyHash.cjs ├── docs ├── Reference │ ├── command-line-options.md │ ├── command-line-options_es.md │ ├── config.md │ ├── config_es.md │ ├── legacy-support │ │ ├── angular-v8.md │ │ ├── angular-v8_es.md │ │ ├── overview.md │ │ ├── overview_es.md │ │ ├── polyfills.md │ │ └── polyfills_es.md │ ├── ngLib │ │ ├── idle-monitor-service.md │ │ ├── idle-monitor-service_es.md │ │ ├── overview.md │ │ ├── overview_es.md │ │ ├── scully-content-component.md │ │ ├── scully-content-component_es.md │ │ ├── scully-routes-service.md │ │ ├── scully-routes-service_es.md │ │ ├── transfer-state-service.md │ │ ├── transfer-state-service_es.md │ │ ├── utility-methods.md │ │ └── utility-methods_es.md │ ├── overview.md │ ├── overview_es.md │ ├── plugins │ │ ├── built-in-plugins │ │ │ ├── adoc.md │ │ │ ├── adoc_es.md │ │ │ ├── contentFolder.md │ │ │ ├── contentFolder_es.md │ │ │ ├── criticalcss.md │ │ │ ├── criticalcss_es.md │ │ │ ├── flashPrevention.md │ │ │ ├── flashPrevention_es.md │ │ │ ├── ignored.md │ │ │ ├── ignored_es.md │ │ │ ├── json.md │ │ │ ├── json_es.md │ │ │ ├── md.md │ │ │ ├── md_es.md │ │ │ ├── overview.md │ │ │ ├── overview_es.md │ │ │ ├── router-.md │ │ │ ├── router-_es.md │ │ │ ├── router-render.md │ │ │ ├── router-render_es.md │ │ │ ├── seoHrefOptimize.md │ │ │ └── seoHrefOptimize_es.md │ │ ├── community-plugins │ │ │ ├── amp-css.md │ │ │ ├── amp-css_es.md │ │ │ ├── canonical.md │ │ │ ├── canonical_es.md │ │ │ ├── disableAngular.md │ │ │ ├── disableAngular_es.md │ │ │ ├── fouc.md │ │ │ ├── fouc_es.md │ │ │ ├── http404.md │ │ │ ├── http404_es.md │ │ │ ├── lazyImages.md │ │ │ ├── lazyImages_es.md │ │ │ ├── mediumZoom.md │ │ │ ├── mediumZoom_es.md │ │ │ ├── meetup.md │ │ │ ├── meetup_es.md │ │ │ ├── minifyHtml.md │ │ │ ├── minifyHtml_es.md │ │ │ ├── overview.md │ │ │ ├── overview_es.md │ │ │ ├── page-title.md │ │ │ ├── page-title_es.md │ │ │ ├── regex.md │ │ │ ├── regex_es.md │ │ │ ├── rss.md │ │ │ ├── rss_es.md │ │ │ ├── sitemap.md │ │ │ ├── sitemap_es.md │ │ │ ├── time-to-read.md │ │ │ ├── time-to-read_es.md │ │ │ ├── toc.md │ │ │ └── toc_es.md │ │ ├── custom-plugins │ │ │ ├── create-a-plugin-function.md │ │ │ ├── create-a-plugin-function_es.md │ │ │ ├── overview.md │ │ │ ├── overview_es.md │ │ │ ├── register-a-new-plugin.md │ │ │ ├── register-a-new-plugin_es.md │ │ │ ├── use-a-custom-plugin.md │ │ │ └── use-a-custom-plugin_es.md │ │ ├── overview.md │ │ ├── overview_es.md │ │ └── types │ │ │ ├── allDone.md │ │ │ ├── allDone_es.md │ │ │ ├── beforeAll.md │ │ │ ├── enterprise.md │ │ │ ├── enterprise_es.md │ │ │ ├── fileHandler.md │ │ │ ├── fileHandler_es.md │ │ │ ├── overview.md │ │ │ ├── overview_es.md │ │ │ ├── postProcessByDom.md │ │ │ ├── postProcessByDom_es.md │ │ │ ├── postProcessByHtml.md │ │ │ ├── route-process.md │ │ │ ├── route-process_es.md │ │ │ ├── routeDiscoveryDone.md │ │ │ ├── routeDiscoveryDone_es.md │ │ │ ├── routeRenderer.md │ │ │ ├── router.md │ │ │ ├── router_es.md │ │ │ ├── system.md │ │ │ └── system_es.md │ ├── routRenders │ │ ├── overview.md │ │ ├── playwright.md │ │ └── sps.md │ ├── schematics │ │ ├── create-blog-config.md │ │ ├── create-blog-config_es.md │ │ ├── create-markdown-files-and-skeleton.md │ │ ├── create-markdown-files-and-skeleton_es.md │ │ ├── create-scully-files-with-ng-add.md │ │ ├── create-scully-files-with-ng-add_es.md │ │ ├── overview.md │ │ └── overview_es.md │ ├── scully-api │ │ ├── findPlugin.md │ │ ├── findPlugin_es.md │ │ ├── overview.md │ │ ├── overview_es.md │ │ ├── registerPlugin.md │ │ ├── registerPlugin_es.md │ │ ├── utils.md │ │ └── utils_es.md │ └── utilities │ │ ├── overview.md │ │ ├── overview_es.md │ │ ├── prism-js.md │ │ ├── prism-js_es.md │ │ ├── scully-publish.md │ │ └── scully-publish_es.md ├── community │ ├── code-of-conduct.md │ ├── code-of-conduct_es.md │ ├── contributing.md │ ├── contributing_es.md │ ├── issues.md │ ├── issues_es.md │ ├── overview.md │ ├── overview_es.md │ ├── showcase.md │ ├── showcase_es.md │ ├── sponsors.md │ ├── sponsors_es.md │ ├── starters.md │ ├── starters_es.md │ ├── support.md │ └── support_es.md ├── concepts │ ├── handled-routes.md │ ├── handled-routes_es.md │ ├── overview.md │ ├── overview_es.md │ ├── plugins.md │ ├── plugins_es.md │ ├── process.md │ ├── process_es.md │ ├── unhandled-routes.md │ └── unhandled-routes_es.md ├── faq.md ├── faq_es.md ├── learn │ ├── create-a-blog │ │ ├── add-blog-support.md │ │ ├── add-blog-support_es.md │ │ ├── generate-new-blog-posts.md │ │ ├── generate-new-blog-posts_es.md │ │ ├── overview.md │ │ ├── overview_es.md │ │ ├── use-blog-post-data-in-template.md │ │ └── use-blog-post-data-in-template_es.md │ ├── create-a-plugin │ │ ├── create-a-plugin.md │ │ └── create-a-plugin_es.md │ ├── getting-started │ │ ├── building.md │ │ ├── building_es.md │ │ ├── installation.md │ │ ├── installation_es.md │ │ ├── manualInstallation.md │ │ ├── overview.md │ │ ├── overview_es.md │ │ ├── requirements.md │ │ ├── requirements_es.md │ │ ├── serving.md │ │ ├── serving_es.md │ │ ├── tips-for-testing.md │ │ └── tips-for-testing_es.md │ ├── introduction.md │ ├── introduction_es.md │ ├── overview.md │ ├── overview_es.md │ └── use-netlify-cms │ │ ├── use-netlify-cms.md │ │ └── use-netlify-cms_es.md ├── overview.md ├── overview_es.md └── roadmap.md ├── docs_extraPages └── support.md ├── firebase.json ├── jest.config.js ├── jest.preset.js ├── libs ├── .gitkeep ├── ng-lib │ ├── README.md │ ├── ng-package.json │ ├── package.json │ ├── src │ │ ├── lib │ │ │ ├── config │ │ │ │ └── scully-config.ts │ │ │ ├── idleMonitor │ │ │ │ └── idle-monitor.service.ts │ │ │ ├── route-service │ │ │ │ └── scully-routes.service.ts │ │ │ ├── scully-content │ │ │ │ ├── scully-content.component.ts │ │ │ │ └── scully-content.module.ts │ │ │ ├── scully-lib.module.ts │ │ │ ├── transfer-state │ │ │ │ └── transfer-state.service.ts │ │ │ └── utils │ │ │ │ ├── basePathOnly.ts │ │ │ │ ├── fetchHttp.ts │ │ │ │ ├── findComments.ts │ │ │ │ ├── fromMutationObserver.ts │ │ │ │ ├── isScully.ts │ │ │ │ └── merge-paths.ts │ │ └── public-api.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ ├── tsconfig.lib.prod.json │ └── tslint.json ├── platform-server │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.js │ ├── ng-package.json │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── lib │ │ │ └── platform-server.module.ts │ │ └── test-setup.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ ├── tsconfig.lib.prod.json │ └── tsconfig.spec.json ├── plugins │ ├── base-href-rewrite │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── dist │ │ │ └── .nx-results │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-base-href-rewrite.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── docs-link-update │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-docs-link-update.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ └── tsconfig.spec.json │ ├── extra │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-extra.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── from-data │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-from-data.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── google-analytics │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-google-analytics.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── logrocket │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-logrocket.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── scully-plugin-copy-to-clipboard │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-scully-plugin-copy-to-clipboard.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── scully-plugin-critical-css │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-scully-plugin-critical-css.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── scully-plugin-flash-prevention │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── index.ts │ │ ├── package.json │ │ ├── src │ │ │ └── lib │ │ │ │ ├── flash-prevention.plugin.ts │ │ │ │ └── utils.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── scully-plugin-local-cache │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ ├── cacheDone.ts │ │ │ │ ├── cli-options.ts │ │ │ │ ├── config.ts │ │ │ │ ├── deferred.ts │ │ │ │ ├── generateId.ts │ │ │ │ ├── handlePuppeteerRequest.ts │ │ │ │ ├── handlePuppeteerResponse.ts │ │ │ │ ├── http.ts │ │ │ │ ├── installInterceptor.ts │ │ │ │ ├── ldb.ts │ │ │ │ ├── local-cache.interface.ts │ │ │ │ ├── plugins-local-cache.ts │ │ │ │ └── usageStatistics.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ ├── scully-plugin-playwright │ │ ├── .babelrc │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ ├── plugins-scully-plugin-playwright-utils.ts │ │ │ │ ├── plugins-scully-plugin-playwright.spec.ts │ │ │ │ └── plugins-scully-plugin-playwright.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ └── tsconfig.spec.json │ ├── scully-plugin-puppeteer │ │ ├── .babelrc │ │ ├── .eslintrc.json │ │ ├── README.md │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ ├── launchedBrowser.ts │ │ │ │ ├── plugins-scully-plugin-puppeteer.spec.ts │ │ │ │ └── plugins-scully-plugin-puppeteer.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.lib.json │ │ └── tsconfig.spec.json │ ├── scully-plugin-remove-scripts │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── lib │ │ │ │ └── plugins-scully-plugin-remove-scripts.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json │ └── sentry │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ ├── plugins-sentry.ts │ │ │ └── sentry.errorhandler.ts │ │ ├── tsconfig.json │ │ └── tsconfig.lib.json ├── scully-schematics │ ├── .eslintrc │ ├── .gitignore │ ├── .npmignore │ ├── README.md │ ├── assets │ │ └── meta-data-template.yml │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── add-blog │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── schema.json │ │ │ └── schema.ts │ │ ├── add-plugin │ │ │ ├── index.ts │ │ │ ├── schema.json │ │ │ └── schema.ts │ │ ├── add-post │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── schema.json │ │ │ └── schema.ts │ │ ├── collection.json │ │ ├── create-markdown │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── schema.json │ │ │ └── schema.ts │ │ ├── files │ │ │ ├── blog-add │ │ │ │ └── blog-X.md │ │ │ ├── blog-module │ │ │ │ ├── blog-routing.module.ts │ │ │ │ ├── blog.component.css │ │ │ │ ├── blog.component.html │ │ │ │ ├── blog.component.spec.ts.template │ │ │ │ ├── blog.component.ts │ │ │ │ └── blog.module.ts │ │ │ ├── blog │ │ │ │ └── page-1.example.md │ │ │ ├── markdown-module │ │ │ │ ├── __name@dasherize__-routing.module.ts.template │ │ │ │ ├── __name@dasherize__.component.__style__.template │ │ │ │ ├── __name@dasherize__.component.html.template │ │ │ │ ├── __name@dasherize__.component.spec.ts.template │ │ │ │ ├── __name@dasherize__.component.ts.template │ │ │ │ └── __name@dasherize__.module.ts.template │ │ │ └── plugin │ │ │ │ ├── render │ │ │ │ └── __name@dasherize__.plugin.js.template │ │ │ │ └── router │ │ │ │ └── __name@dasherize__.plugin.js.template │ │ ├── index.ts │ │ ├── migration.json │ │ ├── ng-add │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── package-config.ts │ │ │ ├── schema.json │ │ │ ├── schema.ts │ │ │ └── version-names.ts │ │ ├── ng-update │ │ │ └── index.ts │ │ ├── plugin-ts │ │ │ ├── index.ts │ │ │ ├── schema.json │ │ │ └── schema.ts │ │ ├── route-discovery │ │ │ ├── index.ts │ │ │ ├── schema.json │ │ │ └── schema.ts │ │ ├── scully │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ └── schema.json │ │ ├── test-setup.ts │ │ └── utils │ │ │ ├── test-utils.ts │ │ │ └── utils.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── scully │ ├── .eslintrc │ ├── .npmrc │ ├── README.md │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── lib │ │ │ ├── fileHanderPlugins │ │ │ │ ├── asciidoc.ts │ │ │ │ ├── html.ts │ │ │ │ ├── index.ts │ │ │ │ └── markdown.ts │ │ │ ├── index.ts │ │ │ ├── pluginManagement │ │ │ │ ├── Plugin.interfaces.ts │ │ │ │ ├── index.ts │ │ │ │ ├── pluginConfig.ts │ │ │ │ ├── pluginRepository.ts │ │ │ │ ├── pluginWrap.ts │ │ │ │ └── systemPlugins.ts │ │ │ ├── renderPlugins │ │ │ │ ├── content-render-utils │ │ │ │ │ ├── convertAndInjectContent.ts │ │ │ │ │ ├── customMarkdownOptions.ts │ │ │ │ │ ├── findComments.ts │ │ │ │ │ ├── getIdAttrName.ts │ │ │ │ │ ├── getScript.ts │ │ │ │ │ ├── handleFile.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── injectHtml.ts │ │ │ │ │ └── readFileAndCheckPrePublishSlug.ts │ │ │ │ ├── contentRenderPlugin.ts │ │ │ │ ├── contentTextRenderPlugin.ts │ │ │ │ ├── executePlugins.ts │ │ │ │ ├── index.ts │ │ │ │ ├── jsdomPlugins.ts │ │ │ │ └── seoHrefCompletionPlugin.ts │ │ │ ├── routerPlugins │ │ │ │ ├── addOptionalRoutesPlugin.ts │ │ │ │ ├── contentFolderPlugin.ts │ │ │ │ ├── defaultRouterPlugin.ts │ │ │ │ ├── handledRoute.interface.ts │ │ │ │ ├── ignoredRoutePlugin.ts │ │ │ │ ├── index.ts │ │ │ │ ├── jsonRoutePlugin.ts │ │ │ │ ├── renderTemplate.ts │ │ │ │ └── traverseAppRoutesPlugin.ts │ │ │ ├── systemPlugins │ │ │ │ ├── index.ts │ │ │ │ ├── storeRoutes.ts │ │ │ │ └── writeToFs.plugin.ts │ │ │ ├── testData │ │ │ │ ├── index.ts │ │ │ │ ├── posts-testdata.ts │ │ │ │ └── users-testdata.ts │ │ │ └── utils │ │ │ │ ├── assertNever.ts │ │ │ │ ├── asyncPool.ts │ │ │ │ ├── cache.ts │ │ │ │ ├── cacheFolder.ts │ │ │ │ ├── captureMessage.ts │ │ │ │ ├── chunk.ts │ │ │ │ ├── cli-options.ts │ │ │ │ ├── compileConfig.ts │ │ │ │ ├── config.ts │ │ │ │ ├── createFolderFor.ts │ │ │ │ ├── deepClone.ts │ │ │ │ ├── deepGet.ts │ │ │ │ ├── exitHandler.ts │ │ │ │ ├── findAngularJsonPath.ts │ │ │ │ ├── fsAngular.ts │ │ │ │ ├── fsFolder.ts │ │ │ │ ├── handlers │ │ │ │ ├── beforAll.ts │ │ │ │ ├── defaultAction.ts │ │ │ │ ├── handleAllDone.ts │ │ │ │ ├── handleRouteDiscoveryDone.ts │ │ │ │ ├── handleTravesal.ts │ │ │ │ ├── index.ts │ │ │ │ ├── processRoutes.ts │ │ │ │ ├── renderParallel.ts │ │ │ │ ├── renderPlugin.ts │ │ │ │ └── routeDiscovery.ts │ │ │ │ ├── httpGetJson.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interfacesandenums.ts │ │ │ │ ├── log.ts │ │ │ │ ├── nodeFsFolder.ts │ │ │ │ ├── performanceIds.ts │ │ │ │ ├── platform-server │ │ │ │ ├── deferred.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ps-worker.ts │ │ │ │ ├── serverPlatformRender.ts │ │ │ │ └── startupSpS.ts │ │ │ │ ├── procesmanager │ │ │ │ ├── TaskWorker.ts │ │ │ │ ├── handleJobs.ts │ │ │ │ ├── index.ts │ │ │ │ ├── job.ts │ │ │ │ ├── startWorkerListener.ts │ │ │ │ ├── taskPool.ts │ │ │ │ └── tasks.interface.ts │ │ │ │ ├── randomString.ts │ │ │ │ ├── read-angular-json.ts │ │ │ │ ├── replaceFirstRouteParamWithVal.ts │ │ │ │ ├── restart.ts │ │ │ │ ├── routeSplit.ts │ │ │ │ ├── scullydot.ts │ │ │ │ ├── serverstuff │ │ │ │ ├── addSSL.ts │ │ │ │ ├── dataServer.ts │ │ │ │ ├── handleUnknownRoute.ts │ │ │ │ ├── index.ts │ │ │ │ ├── isPortTaken.ts │ │ │ │ ├── proxyAdd.ts │ │ │ │ ├── staticServer.ts │ │ │ │ ├── title404.ts │ │ │ │ └── waitForServerToBeAvailable.ts │ │ │ │ ├── services │ │ │ │ ├── index.ts │ │ │ │ └── routeStorage.ts │ │ │ │ ├── startup │ │ │ │ ├── index.ts │ │ │ │ ├── scullyInit.ts │ │ │ │ ├── startBackgroundServer.ts │ │ │ │ ├── startUpEnvChecks.ts │ │ │ │ ├── startup.ts │ │ │ │ └── watchMode.ts │ │ │ │ ├── validateConfig.ts │ │ │ │ └── waitForIt.ts │ │ └── scully.ts │ └── tsconfig.json └── universal │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.js │ ├── ng-package.json │ ├── package.json │ ├── src │ ├── index.ts │ ├── lib │ │ ├── ScullyXhr.ts │ │ ├── universal.module.ts │ │ └── unversalWorker.ts │ └── test-setup.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ ├── tsconfig.lib.prod.json │ └── tsconfig.spec.json ├── nx.json ├── package-lock.json ├── package.json ├── proxy.conf.js ├── scully.heavy.config.ts ├── scully.pw-sample-blog.config.ts ├── scully.sample-blog.config.ts ├── scully.scully-docs.config.ts ├── scully.sps-sample.config.ts ├── scully ├── .gitignore ├── baseconfig.ts ├── loadRenderer.ts ├── plugins │ ├── error.ts │ ├── render-once.ts │ └── sampleFromTS.ts ├── tsconfig.json ├── tsconfig.sample-blog.json └── tsconfig.scully-docs.json ├── testexit.js ├── tests ├── assets │ ├── blog-files │ │ ├── 2014 │ │ │ └── 2 │ │ │ │ └── 12 │ │ │ │ └── asdf.md │ │ ├── foreign-chars.md │ │ ├── page-1.md │ │ ├── page-2.md │ │ ├── page-3.md │ │ ├── page-4.adoc │ │ ├── page-5.md │ │ ├── page-6.md │ │ ├── scullyio-icon.png │ │ ├── test │ │ │ └── testing.md │ │ └── testing-empty.md │ └── certs │ │ ├── localhost.cert │ │ └── localhost.key ├── cypress │ ├── fixtures │ │ └── example.json │ ├── integration │ │ ├── doclinkScoll.spec.js │ │ ├── getcurrent.spec.js │ │ ├── sampleBlog.spec.js │ │ └── scullyContent.spec.js │ ├── plugins │ │ └── index.js │ └── support │ │ ├── commands.js │ │ └── index.js └── jest │ └── src │ ├── __tests__ │ ├── __snapshots__ │ │ ├── blog-index.spec.ts.snap │ │ ├── contentText.spec.ts.snap │ │ ├── home.spec.ts.snap │ │ ├── transfer-state.spec.ts.snap │ │ └── users.spec.ts.snap │ ├── baseHrefRewrite.spec.ts │ ├── blog-index.spec.ts │ ├── contentText.spec.ts │ ├── docsThere.spec.ts │ ├── exclude.spec.ts │ ├── extra-users.spec.ts │ ├── extraRoutes.spec.ts │ ├── flash-prevention.spec.ts │ ├── home.spec.ts │ ├── manualIdle.spec.ts │ ├── rawPage.spec.ts │ ├── readmesThere.spec.ts │ ├── route404.spec.ts │ ├── seoOptimize.spec.ts │ ├── transfer-state.spec.ts │ └── users.spec.ts │ ├── jest.config.js │ ├── setup-jest.ts │ ├── test-config.helper.ts │ ├── tsconfig.json │ └── tsconfig.spec.json ├── testsps.sh ├── tools ├── buildIt.ts ├── bumpAndTag.ts ├── cmdLineOptions.ts ├── deps-track.ts ├── docker │ ├── chromium-base.dockerfile │ └── pupeteer.dockerfile ├── generators │ ├── .gitkeep │ └── publish │ │ ├── index.ts │ │ └── schema.json ├── listVersions.ts ├── makeHash.ts ├── package.json ├── publishCurrent.ts ├── publishLocal.ts ├── publishPackage.ts ├── pushtoGit.ts ├── tsconfig.tools.json ├── updateRelaseFiles.ts └── utils.ts ├── tsconfig.base.json ├── tsconfig.json ├── tsconfig.spec.json ├── tslint.json └── workspace.json /.czrc: -------------------------------------------------------------------------------- 1 | { "path": "cz-customizable" } 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | max_line_length = 132 11 | 12 | 13 | [*.md] 14 | max_line_length = off 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set the default behavior, in case people don't have core.autocrlf set. 2 | * text=auto 3 | 4 | # Explicitly declare text files you want to always be normalized and converted 5 | # to native line endings on checkout. 6 | *.ts text eol=lf 7 | *.js text eol=lf 8 | 9 | # Declare files that will always have CRLF line endings on checkout. 10 | # *.sln text eol=crlf 11 | 12 | # Denote all files that are truly binary and should not be modified. 13 | *.png binary 14 | *.jpg binary 15 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Lines starting with '#' are comments. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | # These owners will be the default owners for everything in the repo. 5 | * @SanderElias 6 | 7 | # Order is important. The last matching pattern has the most precedence. 8 | # So if a pull request only touches javascript files, only these owners 9 | # will be requested to review. 10 | 11 | # You can also use email addresses if you prefer. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: '🧩 Feature request' 3 | about: Suggest an idea for Scully 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | --- 8 | 9 | ## 🧩 Feature request 10 | 11 | ### Description 12 | 13 | A clear and concise description of the problem or missing capability... 14 | 15 | ### Describe the solution you'd like 16 | 17 | If you have a solution in mind, please describe it. 18 | 19 | ### Describe alternatives you've considered 20 | 21 | Have you considered any alternative solutions or workarounds? 22 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx commitlint -e $HUSKY_GIT_PARAMS -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged -------------------------------------------------------------------------------- /.huskyrc: -------------------------------------------------------------------------------- 1 | { 2 | "hooks": { 3 | "pre-commit": "pretty-quick --staged && npm run chkPackage" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Add files here to ignore them from prettier formatting 2 | 3 | /dist 4 | /coverage 5 | /test/ 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["esbenp.prettier-vscode", "firsttris.vscode-jest-runner"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": [ 3 | { 4 | "type": "npm", 5 | "script": "deb", 6 | "group": "test", 7 | "problemMatcher": [], 8 | "label": "npm: deb", 9 | "detail": "node --inspect=0.0.0.0:5858 --nolazy ./dist/libs/scully/scully --pr sample-blog" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /apps/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/sample-blog/.browserslistrc: -------------------------------------------------------------------------------- 1 | and_chr 98 2 | chrome 97 3 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/about/about-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { AboutComponent } from './about.component'; 5 | 6 | const routes: Routes = [{ path: '', component: AboutComponent }]; 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule] 11 | }) 12 | export class AboutRoutingModule {} 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/about/about.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/app/about/about.component.css -------------------------------------------------------------------------------- /apps/sample-blog/src/app/about/about.component.html: -------------------------------------------------------------------------------- 1 |

about works!

2 | 3 | Scully docs site 4 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/about/about.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ScullyRoutesService } from '@scullyio/ng-lib'; 3 | import { firstValueFrom } from 'rxjs'; 4 | 5 | @Component({ 6 | selector: 'app-about', 7 | templateUrl: './about.component.html', 8 | styleUrls: ['./about.component.css'] 9 | }) 10 | export class AboutComponent implements OnInit { 11 | constructor(private srs: ScullyRoutesService) {} 12 | 13 | async ngOnInit() { 14 | const cur = await firstValueFrom(this.srs.getCurrent()) 15 | console.log(cur); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/about/about.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { AboutRoutingModule } from './about-routing.module'; 5 | import { AboutComponent } from './about.component'; 6 | 7 | @NgModule({ 8 | declarations: [AboutComponent], 9 | imports: [CommonModule, AboutRoutingModule] 10 | }) 11 | export class AboutModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 |

3 | Scully demo blog app! {{ currentState }} 4 |

5 | 🏠 6 |
7 | 8 |
9 | 10 |
11 | 12 | 15 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { 3 | IdleMonitorService, 4 | isScullyGenerated, 5 | isScullyRunning 6 | } from '@scullyio/ng-lib'; 7 | 8 | @Component({ 9 | selector: 'app-root', 10 | templateUrl: './app.component.html', 11 | styleUrls: ['./app.component.css'] 12 | }) 13 | export class AppComponent { 14 | currentState = isScullyRunning() 15 | ? 'rendering inside scully' 16 | : isScullyGenerated() 17 | ? 'Loaded from static HTML' 18 | : 'SPA mode'; 19 | constructor() {} 20 | } 21 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/app.sps.module.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode, NgModule } from '@angular/core'; 2 | import { AppComponent } from './app.component'; 3 | import { AppModule } from './app.module'; 4 | import { ScullyPlatformServerModule } from '@scullyio/platform-server' 5 | import { BrowserModule } from '@angular/platform-browser'; 6 | 7 | 8 | /** 9 | * the platform server should be running in production mode. 10 | */ 11 | enableProdMode(); 12 | 13 | 14 | @NgModule({ 15 | imports: [ 16 | BrowserModule.withServerTransition({ appId: 'serverApp' }), 17 | AppModule, 18 | ScullyPlatformServerModule, 19 | ], 20 | providers: [], 21 | bootstrap: [AppComponent], 22 | }) 23 | export default class AppSPSModule {} 24 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/basehref/dist/.nx-results: -------------------------------------------------------------------------------- 1 | { 2 | "command": "serve", 3 | "results": { 4 | "sample-blog": false 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/blog/blog-list/blog-list.component.css: -------------------------------------------------------------------------------- 1 | :host { 2 | display: grid; 3 | grid-template-columns: repeat(3, 1fr); 4 | gap: 10px; 5 | } 6 | 7 | :host h1:first-child { 8 | grid-column: span 3; 9 | text-align: center; 10 | } 11 | 12 | article { 13 | background-color: royalblue; 14 | padding: 5px; 15 | border-radius: 5px; 16 | color: whitesmoke; 17 | } 18 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/blog/blog-list/blog-list.component.html: -------------------------------------------------------------------------------- 1 |

Overview of blog posts

2 | 3 | 4 |
5 |

{{ blog.title || blog.route }}

6 |

{{ blog['publish date'] | date: 'shortDate':'GMT' }}

7 |

{{ blog.description }}

8 |
9 |
10 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/blog/blog.component.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | /* color: rgb(51, 6, 37); */ 3 | /* background-color: rgb(248, 211, 236); */ 4 | background-color: royalblue; 5 | color: white; 6 | width: 100%; 7 | text-align: center; 8 | padding: 5px; 9 | border-radius: 8px; 10 | margin-top: 0.4rem; 11 | margin-bottom: 0.4rem; 12 | /* width: fit-content; */ 13 | } 14 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/blog/blog.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/blog/blog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ViewEncapsulation } from '@angular/core'; 2 | 3 | declare var window: any; 4 | 5 | @Component({ 6 | selector: 'app-blog', 7 | templateUrl: './blog.component.html', 8 | styleUrls: ['./blog.component.css'], 9 | preserveWhitespaces: true, 10 | encapsulation: ViewEncapsulation.Emulated, 11 | }) 12 | export class BlogComponent {} 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/blog/blog.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { ScullyLibModule } from '@scullyio/ng-lib'; 4 | import { BlogListComponent } from './blog-list/blog-list.component'; 5 | import { BlogRoutingModule } from './blog-routing.module'; 6 | import { BlogComponent } from './blog.component'; 7 | import { BlogHolderComponent } from './blog-holder.component'; 8 | 9 | @NgModule({ 10 | declarations: [BlogComponent, BlogListComponent, BlogHolderComponent], 11 | imports: [CommonModule, BlogRoutingModule, ScullyLibModule], 12 | }) 13 | export class BlogModule {} 14 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/content/content.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-content-component', 5 | template: `

Content component

6 | `, 7 | }) 8 | export class ContentComponent implements OnInit { 9 | constructor() {} 10 | 11 | ngOnInit() {} 12 | } 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/content/content.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { ContentComponent } from './content.component'; 4 | import { CommonModule } from '@angular/common'; 5 | import { ScullyLibModule } from '@scullyio/ng-lib'; 6 | import { Routes, RouterModule } from '@angular/router'; 7 | 8 | const routes: Routes = [ 9 | { 10 | path: ':slug', 11 | component: ContentComponent, 12 | }, 13 | { 14 | path: '**', 15 | component: ContentComponent, 16 | }, 17 | ]; 18 | 19 | @NgModule({ 20 | imports: [CommonModule, ScullyLibModule, RouterModule.forChild(routes)], 21 | declarations: [ContentComponent], 22 | }) 23 | export class ContentModule {} 24 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/demo/demo-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { DemoComponent } from './demo.component'; 5 | 6 | const routes: Routes = [{ path: ':id', component: DemoComponent }]; 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule] 11 | }) 12 | export class DemoRoutingModule {} 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/demo/demo.component.css: -------------------------------------------------------------------------------- 1 | :host { 2 | height: 100%; 3 | display: grid; 4 | place-content: center center; 5 | grid-template-columns: 1fr 1fr; 6 | grid-template-rows: 1fr; 7 | } 8 | 9 | span { 10 | grid-area: 1/1/2/3; 11 | text-align: center; 12 | font-size: 80vw; 13 | line-height: 85vh; 14 | } 15 | 16 | a { 17 | grid-area: 1/1/1/2; 18 | display: block; 19 | height: 100%; 20 | width: 100%; 21 | z-index: 1; 22 | cursor: w-resize; 23 | } 24 | 25 | a:last-child { 26 | grid-column: 2/3; 27 | cursor: e-resize; 28 | } 29 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/demo/demo.component.html: -------------------------------------------------------------------------------- 1 | 2 | {{ pageId$ | async }} 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/demo/demo.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; 3 | import { pluck, tap } from 'rxjs'; 4 | 5 | @Component({ 6 | selector: 'app-demo', 7 | templateUrl: './demo.component.html', 8 | styleUrls: ['./demo.component.css'] 9 | }) 10 | export class DemoComponent implements OnInit { 11 | pageId = this.route.snapshot.params.id; 12 | pageId$ = this.route.params.pipe( 13 | pluck('id'), 14 | tap(id => (this.pageId = id)) 15 | ); 16 | 17 | constructor(private route: ActivatedRoute) {} 18 | 19 | ngOnInit() {} 20 | } 21 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/demo/demo.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { DemoRoutingModule } from './demo-routing.module'; 5 | import { DemoComponent } from './demo.component'; 6 | 7 | @NgModule({ 8 | declarations: [DemoComponent], 9 | imports: [CommonModule, DemoRoutingModule] 10 | }) 11 | export class DemoModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/dist/.nx-results: -------------------------------------------------------------------------------- 1 | { 2 | "command": "build", 3 | "results": { 4 | "plugins-base-href-rewrite": false 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/exclude/exclude-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ExcludeComponent } from './exclude.component'; 5 | 6 | const routes: Routes = [ 7 | { path: 'present', component: ExcludeComponent }, 8 | { path: 'notpresent', component: ExcludeComponent } 9 | ]; 10 | 11 | @NgModule({ 12 | imports: [RouterModule.forChild(routes)], 13 | exports: [RouterModule] 14 | }) 15 | export class ExcludeRoutingModule {} 16 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/exclude/exclude.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-exclude', 5 | template: ` 6 |

exclude works!

7 | `, 8 | styles: [``] 9 | }) 10 | export class ExcludeComponent implements OnInit { 11 | constructor() {} 12 | 13 | ngOnInit() {} 14 | } 15 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/exclude/exclude.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { ExcludeRoutingModule } from './exclude-routing.module'; 5 | import { ExcludeComponent } from './exclude.component'; 6 | 7 | @NgModule({ 8 | declarations: [ExcludeComponent], 9 | imports: [CommonModule, ExcludeRoutingModule] 10 | }) 11 | export class ExcludeModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/manual-idle/manual-idle-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { ManualIdleComponent } from './manual-idle.component'; 5 | 6 | const routes: Routes = [{ path: '', component: ManualIdleComponent }]; 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule] 11 | }) 12 | export class ManualIdleRoutingModule {} 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/manual-idle/manual-idle.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/app/manual-idle/manual-idle.component.css -------------------------------------------------------------------------------- /apps/sample-blog/src/app/manual-idle/manual-idle.component.html: -------------------------------------------------------------------------------- 1 |

manual-idle works!

2 |

{{ text }}

3 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/manual-idle/manual-idle.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { ManualIdleRoutingModule } from './manual-idle-routing.module'; 5 | import { ManualIdleComponent } from './manual-idle.component'; 6 | 7 | @NgModule({ 8 | declarations: [ManualIdleComponent], 9 | imports: [CommonModule, ManualIdleRoutingModule] 10 | }) 11 | export class ManualIdleModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/pagenotfound/pagenotfound-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { PagenotfoundComponent } from './pagenotfound.component'; 5 | 6 | const routes: Routes = [{ path: '', component: PagenotfoundComponent }]; 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule] 11 | }) 12 | export class PagenotfoundRoutingModule {} 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/pagenotfound/pagenotfound.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/app/pagenotfound/pagenotfound.component.css -------------------------------------------------------------------------------- /apps/sample-blog/src/app/pagenotfound/pagenotfound.component.html: -------------------------------------------------------------------------------- 1 |

pagenotfound works!

2 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/pagenotfound/pagenotfound.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-pagenotfound', 5 | templateUrl: './pagenotfound.component.html', 6 | styleUrls: ['./pagenotfound.component.css'] 7 | }) 8 | export class PagenotfoundComponent implements OnInit { 9 | constructor() {} 10 | 11 | ngOnInit() {} 12 | } 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/pagenotfound/pagenotfound.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { PagenotfoundRoutingModule } from './pagenotfound-routing.module'; 5 | import { PagenotfoundComponent } from './pagenotfound.component'; 6 | 7 | @NgModule({ 8 | declarations: [PagenotfoundComponent], 9 | imports: [CommonModule, PagenotfoundRoutingModule] 10 | }) 11 | export class PagenotfoundModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/slow/slow-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { SlowComponent } from './slow.component'; 5 | 6 | const routes: Routes = [{ path: '', component: SlowComponent }]; 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule] 11 | }) 12 | export class SlowRoutingModule {} 13 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/slow/slow.component.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from '@angular/common/http'; 2 | import { Component } from '@angular/core'; 3 | import { isScullyGenerated } from '@scullyio/ng-lib'; 4 | import { first } from 'rxjs'; 5 | 6 | @Component({ 7 | selector: 'app-slow', 8 | template: ` 9 |

slow works!

10 |

Scully Not Generated

11 |

Scully Generated

12 | `, 13 | styles: [``], 14 | }) 15 | export class SlowComponent { 16 | isGenerated = isScullyGenerated(); 17 | 18 | delay$ = this.http.get('/api/slow/2000'); 19 | 20 | constructor(private http: HttpClient) { 21 | this.delay$.pipe(first()).subscribe(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/slow/slow.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { SlowRoutingModule } from './slow-routing.module'; 5 | import { SlowComponent } from './slow.component'; 6 | 7 | @NgModule({ 8 | declarations: [SlowComponent], 9 | imports: [CommonModule, SlowRoutingModule] 10 | }) 11 | export class SlowModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/static/static-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { StaticComponent } from './static.component'; 5 | 6 | const routes: Routes = [ 7 | { path: ':topLevel', component: StaticComponent }, 8 | { path: '', component: StaticComponent, pathMatch: 'full' } 9 | ]; 10 | 11 | @NgModule({ 12 | imports: [RouterModule.forChild(routes)], 13 | exports: [RouterModule] 14 | }) 15 | export class StaticRoutingModule {} 16 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/static/static.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { StaticRoutingModule } from './static-routing.module'; 5 | import { StaticComponent } from './static.component'; 6 | 7 | @NgModule({ 8 | declarations: [StaticComponent], 9 | imports: [CommonModule, StaticRoutingModule] 10 | }) 11 | export class StaticModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/tss-resolver/tss-resolver-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { TssResolverComponent } from './tss-resolver.component'; 4 | import { UserResolver } from './user.resolver'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: TssResolverComponent, 10 | resolve: { 11 | user: UserResolver, 12 | }, 13 | }, 14 | ]; 15 | 16 | @NgModule({ 17 | imports: [RouterModule.forChild(routes)], 18 | exports: [RouterModule], 19 | }) 20 | export class TssResolverRoutingModule {} 21 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/tss-resolver/tss-resolver.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/app/tss-resolver/tss-resolver.component.css -------------------------------------------------------------------------------- /apps/sample-blog/src/app/tss-resolver/tss-resolver.component.html: -------------------------------------------------------------------------------- 1 |
2 |

User Data

3 | 4 |
5 | 6 |

{{ user.id }}

7 | 8 |

{{ user.name }}

9 | 10 |

{{ user.email }}

11 | 12 |

{{ user.company.name }}

13 |
14 | 15 | {{ user.company.catchPhrase }} 16 |
17 | 18 |
Loading ...
19 |
20 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/tss-resolver/tss-resolver.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | import { pluck, tap } from 'rxjs'; 4 | 5 | @Component({ 6 | selector: 'scullyio-tss-resolver', 7 | templateUrl: './tss-resolver.component.html', 8 | styleUrls: ['./tss-resolver.component.css'], 9 | }) 10 | export class TssResolverComponent implements OnInit { 11 | user$ = this.route.data.pipe(pluck('user')); 12 | 13 | constructor(private route: ActivatedRoute) {} 14 | 15 | ngOnInit(): void {} 16 | } 17 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/tss-resolver/tss-resolver.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { TssResolverRoutingModule } from './tss-resolver-routing.module'; 5 | import { TssResolverComponent } from './tss-resolver.component'; 6 | 7 | @NgModule({ 8 | declarations: [TssResolverComponent], 9 | imports: [CommonModule, TssResolverRoutingModule], 10 | }) 11 | export class TssResolverModule {} 12 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/post/post.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/app/user/post/post.component.css -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/post/post.component.html: -------------------------------------------------------------------------------- 1 |

Post details

2 |
3 |

{{ post.title }}

4 | 5 |

{{ post.body }}

6 |
7 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/posts/posts.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/app/user/posts/posts.component.css -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/posts/posts.component.html: -------------------------------------------------------------------------------- 1 |

User posts

2 |
3 | 8 |
9 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/user.component.css: -------------------------------------------------------------------------------- 1 | a { 2 | display: inline-block; 3 | padding: 5px; 4 | margin: 10px 3px; 5 | width: 100px; 6 | border-radius: 4px; 7 | background-color: royalblue; 8 | color: white; 9 | text-align: center; 10 | text-decoration: none; 11 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 12 | transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); 13 | } 14 | 15 | a:hover { 16 | box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); 17 | } 18 | 19 | a:active { 20 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 21 | } 22 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { PostComponent } from './post/post.component'; 4 | import { PostsComponent } from './posts/posts.component'; 5 | import { UserRoutingModule } from './user-routing.module'; 6 | import { UserComponent } from './user.component'; 7 | import { UsersComponent } from './users/users.component'; 8 | 9 | @NgModule({ 10 | declarations: [UserComponent, UsersComponent, PostsComponent, PostComponent], 11 | imports: [CommonModule, UserRoutingModule] 12 | }) 13 | export class UserModule {} 14 | -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/users/users.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/app/user/users/users.component.css -------------------------------------------------------------------------------- /apps/sample-blog/src/app/user/users/users.component.html: -------------------------------------------------------------------------------- 1 |

Users

2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 17 | 18 | 19 |
IdUsername
{{ user.id }} 13 | 14 | {{ user.name }} 16 |
20 |
21 | -------------------------------------------------------------------------------- /apps/sample-blog/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/sample-blog/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /apps/sample-blog/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sample-blog/src/favicon.ico -------------------------------------------------------------------------------- /apps/sample-blog/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | sample-blog 6 | 7 | 8 | 9 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /apps/sample-blog/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | document.addEventListener('DOMContentLoaded', () => { 12 | platformBrowserDynamic() 13 | .bootstrapModule(AppModule) 14 | .catch(err => console.error(err)); 15 | }); 16 | -------------------------------------------------------------------------------- /apps/sample-blog/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/app", 5 | "types": ["node"], 6 | "strict": true 7 | }, 8 | "files": ["src/main.ts", "src/polyfills.ts"], 9 | "include": ["src/**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/sample-blog/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "files": [], 7 | "include": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.spec.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /apps/sample-blog/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "files": ["src/test-setup.ts"], 9 | "include": ["**/*.spec.ts", "**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/sample-blog/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "scullyio", "camelCase"], 5 | "component-selector": [true, "element", "scullyio", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/scully-docs/.browserslistrc: -------------------------------------------------------------------------------- 1 | and_chr 98 2 | chrome 97 3 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/components/footer/footer.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { RouterModule } from '@angular/router'; 4 | import { FooterComponent } from './component/footer.component'; 5 | 6 | @NgModule({ 7 | declarations: [FooterComponent], 8 | exports: [FooterComponent], 9 | imports: [CommonModule, RouterModule], 10 | }) 11 | export class FooterModule {} 12 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/components/footer/index.ts: -------------------------------------------------------------------------------- 1 | export * from './footer.module'; 2 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/components/header/header.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { RouterModule } from '@angular/router'; 4 | 5 | import { NavHeaderComponent } from './component/nav-header/nav-header.component'; 6 | 7 | @NgModule({ 8 | declarations: [NavHeaderComponent], 9 | exports: [NavHeaderComponent], 10 | imports: [CommonModule, RouterModule], 11 | }) 12 | export class HeaderModule {} 13 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/components/header/index.ts: -------------------------------------------------------------------------------- 1 | export * from './header.module'; 2 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/components/lang-select/lang-select.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { RouterModule } from '@angular/router'; 4 | 5 | import { LangSelectComponent } from './component/lang-select/lang-select.component'; 6 | 7 | @NgModule({ 8 | declarations: [LangSelectComponent], 9 | exports: [LangSelectComponent], 10 | imports: [CommonModule, RouterModule], 11 | }) 12 | export class LangSelectModule {} 13 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/components/nav-list/nav-list.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { RouterModule } from '@angular/router'; 4 | import { NavItemComponent } from './navitem'; 5 | 6 | @NgModule({ 7 | declarations: [NavItemComponent], 8 | exports: [NavItemComponent], 9 | imports: [CommonModule, RouterModule], 10 | }) 11 | export class NavListModule {} 12 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'scullyio-app-404', 5 | template: `

6 | Page not found 7 |

8 | `, 9 | }) 10 | export class PageNotFoundComponent implements OnInit { 11 | constructor() {} 12 | 13 | ngOnInit() {} 14 | } 15 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/pages/docs/docs-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { DocsPageComponent } from './page/docs.page.component'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: DocsPageComponent, 10 | children: [ 11 | { path: ':slug', component: DocsPageComponent }, 12 | { path: '**', component: DocsPageComponent }, 13 | ], 14 | }, 15 | ]; 16 | 17 | @NgModule({ 18 | imports: [RouterModule.forChild(routes)], 19 | exports: [RouterModule], 20 | }) 21 | export class DocsRoutingModule {} 22 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/pages/docs/docs.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { ScullyLibModule } from '@scullyio/ng-lib'; 4 | 5 | import { FooterModule } from '../../components/footer'; 6 | import { DocsRoutingModule } from './docs-routing.module'; 7 | 8 | import { DocsPageComponent } from './page/docs.page.component'; 9 | 10 | @NgModule({ 11 | declarations: [DocsPageComponent], 12 | imports: [CommonModule, ScullyLibModule, FooterModule, DocsRoutingModule], 13 | }) 14 | export class DocsModule {} 15 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/pages/landing/components/quote/quote.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ViewEncapsulation } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'section.scullyio-landing-quote', 5 | encapsulation: ViewEncapsulation.None, 6 | template: ` 7 |
8 |

Nothing will make your Angular project as fast as using Scully and embracing Jamstack.

9 |
10 | 11 |

- Aaron Frost

12 |

Scully Core Team Member

13 |
14 | `, 15 | }) 16 | export class LandingQuoteComponent {} 17 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/pages/landing/landing-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { LandingPageComponent } from './page/landing.component'; 5 | 6 | const routes: Routes = [{ path: '', component: LandingPageComponent }]; 7 | 8 | @NgModule({ 9 | imports: [RouterModule.forChild(routes)], 10 | exports: [RouterModule], 11 | }) 12 | export class LandingRoutingModule {} 13 | -------------------------------------------------------------------------------- /apps/scully-docs/src/app/pages/landing/page/landing.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ViewEncapsulation } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'scullyio-landing-page', 5 | encapsulation: ViewEncapsulation.None, 6 | template: ` 7 |
8 |
9 |
10 |
11 | 12 | `, 13 | }) 14 | export class LandingPageComponent {} 15 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/beta-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/beta-badge.png -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/footer-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/footer-bg.png -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/angle-double-right-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/angular-brands.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/arrow-left-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/arrow-right-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/bars-regular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/book-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/check-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/chevron-right-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/file-exclamation-regular.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/pen-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/icons/play-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/1800contacts-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/1800contacts-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/angularenterprise-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/angularenterprise-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/appsatease-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/appsatease-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/collage-club.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/collage-club.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/configcat-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/configcat-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/desitrails-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/desitrails-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/devjobsscanner-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/devjobsscanner-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/essentialclinic-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/essentialclinic-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/gammastream-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/gammastream-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/glitchtip-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/glitchtip-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/learning.dev-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/learning.dev-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/ledgedevops-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/ledgedevops-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/mnm-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/mnm-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/nicolatoledo-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/nicolatoledo-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/owlly-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/owlly-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/scully-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/scully-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/assets/img/showcase/solocoding-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/assets/img/showcase/solocoding-01.jpg -------------------------------------------------------------------------------- /apps/scully-docs/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /apps/scully-docs/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/scully-docs/src/favicon.ico -------------------------------------------------------------------------------- /apps/scully-docs/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic() 12 | .bootstrapModule(AppModule) 13 | .catch(err => console.error(err)); 14 | -------------------------------------------------------------------------------- /apps/scully-docs/src/styles/_beta.css: -------------------------------------------------------------------------------- 1 | img.badge { 2 | position: absolute; 3 | top: 0; 4 | left: 0; 5 | height: 100%; 6 | width: auto; 7 | z-index: 99999; 8 | } 9 | -------------------------------------------------------------------------------- /apps/scully-docs/src/styles/links.css: -------------------------------------------------------------------------------- 1 | .docs-page-content a:not([class]) { 2 | display: inline-block; 3 | padding: 0 2px; 4 | color: var(--scully-link-blue); 5 | font-weight: 800; 6 | } 7 | .docs-page-content a:not([class]):hover { 8 | color: var(--scully-link-blue-light); 9 | } 10 | 11 | .docs-page-content h2 a { 12 | font-weight: 900; 13 | } 14 | -------------------------------------------------------------------------------- /apps/scully-docs/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts", "src/polyfills.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /apps/scully-docs/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/scully-docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"], 5 | "experimentalDecorators": true 6 | }, 7 | "files": [], 8 | "include": [], 9 | "references": [ 10 | { 11 | "path": "./tsconfig.app.json" 12 | }, 13 | { 14 | "path": "./tsconfig.spec.json" 15 | }, 16 | { 17 | "path": "./tsconfig.editor.json" 18 | }, 19 | { 20 | "path": "./tsconfig.editor.json" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /apps/scully-docs/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "files": ["src/test-setup.ts"], 9 | "include": ["**/*.spec.ts", "**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/scully-docs/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "scullyio", "camelCase"], 5 | "component-selector": [true, "element", "scullyio", "kebab-case"] 6 | }, 7 | "linterOptions": { 8 | "exclude": ["!**/*"] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/sps-sample/.browserslistrc: -------------------------------------------------------------------------------- 1 | and_chr 98 2 | chrome 97 3 | -------------------------------------------------------------------------------- /apps/sps-sample/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | displayName: 'sps-sample', 3 | preset: '../../jest.preset.js', 4 | setupFilesAfterEnv: ['/src/test-setup.ts'], 5 | globals: { 6 | 'ts-jest': { 7 | tsconfig: '/tsconfig.spec.json', 8 | stringifyContentPathRegex: '\\.(html|svg)$', 9 | }, 10 | }, 11 | coverageDirectory: '../../coverage/apps/sps-sample', 12 | snapshotSerializers: [ 13 | 'jest-preset-angular/build/serializers/no-ng-attributes', 14 | 'jest-preset-angular/build/serializers/ng-snapshot', 15 | 'jest-preset-angular/build/serializers/html-comment', 16 | ], 17 | }; 18 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/about/about-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { AboutComponent } from './about.component'; 4 | 5 | const routes: Routes = [{ path: '', component: AboutComponent }]; 6 | 7 | @NgModule({ 8 | imports: [RouterModule.forChild(routes)], 9 | exports: [RouterModule] 10 | }) 11 | export class AboutRoutingModule { } 12 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/about/about.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sps-sample/src/app/about/about.component.css -------------------------------------------------------------------------------- /apps/sps-sample/src/app/about/about.component.html: -------------------------------------------------------------------------------- 1 |

about works!

2 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/about/about.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'scullyio-about', 5 | templateUrl: './about.component.html', 6 | styleUrls: ['./about.component.css'] 7 | }) 8 | export class AboutComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/about/about.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | 5 | import { AboutRoutingModule } from './about-routing.module'; 6 | import { AboutComponent } from './about.component'; 7 | 8 | const routes: Routes = [ 9 | { path: '', component: AboutComponent } 10 | ]; 11 | 12 | @NgModule({ 13 | declarations: [AboutComponent], 14 | imports: [ 15 | CommonModule, 16 | AboutRoutingModule, 17 | RouterModule.forChild(routes) 18 | ] 19 | }) 20 | export class AboutModule { } 21 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'scullyio-root', 5 | template: ` 6 | 12 | 13 | 19 | `, 20 | 21 | styles: [``], 22 | }) 23 | export class AppComponent { 24 | title = 'sps-sample'; 25 | constructor() {} 26 | } 27 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/app.sps.module.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode, NgModule } from '@angular/core'; 2 | import { AppComponent } from './app.component'; 3 | import { AppModule } from './app.module'; 4 | import { ScullyPlatformServerModule } from '@scullyio/platform-server' 5 | 6 | 7 | /** 8 | * the platform server should be running in production mode. 9 | */ 10 | enableProdMode(); 11 | 12 | 13 | @NgModule({ 14 | imports: [ 15 | AppModule, 16 | ScullyPlatformServerModule, 17 | ], 18 | providers: [], 19 | bootstrap: [AppComponent], 20 | }) 21 | export default class AppSPSModule {} 22 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/demo/demo-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { DemoComponent } from './demo.component'; 4 | 5 | const routes: Routes = [{ path: '', component: DemoComponent }]; 6 | 7 | @NgModule({ 8 | imports: [RouterModule.forChild(routes)], 9 | exports: [RouterModule] 10 | }) 11 | export class DemoRoutingModule { } 12 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/demo/demo.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | 5 | import { DemoRoutingModule } from './demo-routing.module'; 6 | import { DemoComponent } from './demo.component'; 7 | 8 | const routes: Routes = [ 9 | { path: '', component: DemoComponent } 10 | ]; 11 | 12 | @NgModule({ 13 | declarations: [DemoComponent], 14 | imports: [ 15 | CommonModule, 16 | DemoRoutingModule, 17 | RouterModule.forChild(routes) 18 | ] 19 | }) 20 | export class DemoModule { } 21 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/docs/docs-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { DocsComponent } from './docs.component'; 4 | 5 | const routes: Routes = [ 6 | { path: '/:slug', component: DocsComponent }, 7 | { path: '**', component: DocsComponent }, 8 | ]; 9 | 10 | @NgModule({ 11 | imports: [RouterModule.forChild(routes)], 12 | exports: [RouterModule] 13 | }) 14 | export class DocsRoutingModule { } 15 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/docs/docs.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sps-sample/src/app/docs/docs.component.css -------------------------------------------------------------------------------- /apps/sps-sample/src/app/docs/docs.component.html: -------------------------------------------------------------------------------- 1 |

docs works!

2 | 3 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/docs/docs.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'scullyio-docs', 5 | templateUrl: './docs.component.html', 6 | styleUrls: ['./docs.component.css'] 7 | }) 8 | export class DocsComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/docs/docs.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | 5 | import { DocsRoutingModule } from './docs-routing.module'; 6 | import { DocsComponent } from './docs.component'; 7 | import { ScullyLibModule } from '@scullyio/ng-lib'; 8 | 9 | const routes: Routes = [ 10 | { path: ':slug', component: DocsComponent } 11 | ]; 12 | 13 | @NgModule({ 14 | declarations: [ 15 | DocsComponent 16 | ], 17 | imports: [ 18 | CommonModule, 19 | DocsRoutingModule, 20 | ScullyLibModule, 21 | RouterModule.forChild(routes) 22 | ] 23 | }) 24 | export class DocsModule { } 25 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/home/home-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { HomeComponent } from './home.component'; 4 | 5 | const routes: Routes = [{ path: '', component: HomeComponent }]; 6 | 7 | @NgModule({ 8 | imports: [RouterModule.forChild(routes)], 9 | exports: [RouterModule] 10 | }) 11 | export class HomeRoutingModule { } 12 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/home/home.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sps-sample/src/app/home/home.component.css -------------------------------------------------------------------------------- /apps/sps-sample/src/app/home/home.component.html: -------------------------------------------------------------------------------- 1 |

home works!

2 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'scullyio-home', 5 | templateUrl: './home.component.html', 6 | styleUrls: ['./home.component.css'] 7 | }) 8 | export class HomeComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/home/home.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | 5 | import { HomeRoutingModule } from './home-routing.module'; 6 | import { HomeComponent } from './home.component'; 7 | 8 | const routes: Routes = [ 9 | { path: '', component: HomeComponent } 10 | ]; 11 | 12 | @NgModule({ 13 | declarations: [HomeComponent], 14 | imports: [ 15 | CommonModule, 16 | HomeRoutingModule, 17 | RouterModule.forChild(routes) 18 | ] 19 | }) 20 | export class HomeModule { } 21 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/user/user-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { UserComponent } from './user.component'; 4 | 5 | const routes: Routes = [{ path: '', component: UserComponent }]; 6 | 7 | @NgModule({ 8 | imports: [RouterModule.forChild(routes)], 9 | exports: [RouterModule] 10 | }) 11 | export class UserRoutingModule { } 12 | -------------------------------------------------------------------------------- /apps/sps-sample/src/app/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | 5 | import { UserRoutingModule } from './user-routing.module'; 6 | import { UserComponent } from './user.component'; 7 | 8 | const routes: Routes = [ 9 | { path: '', component: UserComponent } 10 | ]; 11 | 12 | @NgModule({ 13 | declarations: [UserComponent], 14 | imports: [ 15 | CommonModule, 16 | UserRoutingModule, 17 | RouterModule.forChild(routes) 18 | ] 19 | }) 20 | export class UserModule { } 21 | -------------------------------------------------------------------------------- /apps/sps-sample/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sps-sample/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/sps-sample/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | }; 4 | -------------------------------------------------------------------------------- /apps/sps-sample/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/apps/sps-sample/src/favicon.ico -------------------------------------------------------------------------------- /apps/sps-sample/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UniversalSample 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/sps-sample/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic() 12 | .bootstrapModule(AppModule) 13 | .catch((err) => console.error(err)); 14 | -------------------------------------------------------------------------------- /apps/sps-sample/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/sps-sample/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | // import 'jest-preset-angular'; 2 | import 'jest-preset-angular/setup-jest'; 3 | -------------------------------------------------------------------------------- /apps/sps-sample/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "types": [] 6 | }, 7 | "files": ["src/main.ts", "src/polyfills.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /apps/sps-sample/tsconfig.editor.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["jest", "node"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/sps-sample/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.app.json" 8 | }, 9 | { 10 | "path": "./tsconfig.spec.json" 11 | }, 12 | { 13 | "path": "./tsconfig.editor.json" 14 | } 15 | ], 16 | "compilerOptions": { 17 | "forceConsistentCasingInFileNames": true, 18 | "strict": true, 19 | "noImplicitReturns": true, 20 | "noFallthroughCasesInSwitch": true 21 | }, 22 | "angularCompilerOptions": { 23 | "strictInjectionParameters": true, 24 | "strictTemplates": true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /apps/sps-sample/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "files": ["src/test-setup.ts"], 9 | "include": ["**/*.spec.ts", "**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /assets/1800contacts_logo_indigo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/1800contacts_logo_indigo.png -------------------------------------------------------------------------------- /assets/hero-devs-logo-400x400.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/hero-devs-logo-400x400.jpg -------------------------------------------------------------------------------- /assets/hero-devs-logo-80x80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/hero-devs-logo-80x80.jpg -------------------------------------------------------------------------------- /assets/logos/PNG/Black/scullyio-icon-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/Black/scullyio-icon-black.png -------------------------------------------------------------------------------- /assets/logos/PNG/Black/scullyio-logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/Black/scullyio-logo-black.png -------------------------------------------------------------------------------- /assets/logos/PNG/Black/scullyio-wordmark-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/Black/scullyio-wordmark-black.png -------------------------------------------------------------------------------- /assets/logos/PNG/Green/scullyio-icon-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/Green/scullyio-icon-green.png -------------------------------------------------------------------------------- /assets/logos/PNG/Green/scullyio-logo-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/Green/scullyio-logo-green.png -------------------------------------------------------------------------------- /assets/logos/PNG/Green/scullyio-wordmark-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/Green/scullyio-wordmark-green.png -------------------------------------------------------------------------------- /assets/logos/PNG/White/scullyio-icon-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/White/scullyio-icon-white.png -------------------------------------------------------------------------------- /assets/logos/PNG/White/scullyio-logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/White/scullyio-logo-white.png -------------------------------------------------------------------------------- /assets/logos/PNG/White/scullyio-wordmark-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/White/scullyio-wordmark-white.png -------------------------------------------------------------------------------- /assets/logos/PNG/scullyio-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/scullyio-icon.png -------------------------------------------------------------------------------- /assets/logos/PNG/scullyio-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/scullyio-logo.png -------------------------------------------------------------------------------- /assets/logos/PNG/scullyio-wordmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/PNG/scullyio-wordmark.png -------------------------------------------------------------------------------- /assets/logos/scullyio-logo-base.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/scullyio-logo-base.pdf -------------------------------------------------------------------------------- /assets/logos/scullyio-logo-source.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/scullyio-logo-source.ai -------------------------------------------------------------------------------- /assets/logos/twitter/scullyio-twitter-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/twitter/scullyio-twitter-cover.png -------------------------------------------------------------------------------- /assets/logos/twitter/scullyio-twitter-profile-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/assets/logos/twitter/scullyio-twitter-profile-icon.png -------------------------------------------------------------------------------- /client_id: -------------------------------------------------------------------------------- 1 | 80cdc4d7-0bc3-4f35-bcba-8734037dc7fa -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@commitlint/config-conventional'], 3 | }; 4 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseUrl": "http://localhost:1668", 3 | "integrationFolder": "tests/cypress/integration", 4 | "fixturesFolder": "tests/cypress/fixtures", 5 | "pluginsFile": "tests/cypress/plugins/index.js", 6 | "screenshotsFolder": "tests/cypress/screenshots", 7 | "videosFolder": "tests/cypress/videos", 8 | "supportFile": "tests/cypress/support/index.js" 9 | } 10 | -------------------------------------------------------------------------------- /demos/plugins/errorPlugin.js: -------------------------------------------------------------------------------- 1 | const { registerPlugin, logWarn } = require('@scullyio/scully'); 2 | 3 | const errorPlugin = async (html, options) => { 4 | try { 5 | throw new Error(`new error`); 6 | } catch (e) { 7 | logWarn(`errorPlugin works!`); 8 | } 9 | return undefined; 10 | }; 11 | 12 | const validator = async (config) => []; 13 | registerPlugin('postProcessByHtml', 'errorPlugin', errorPlugin, validator); 14 | -------------------------------------------------------------------------------- /demos/plugins/voidPlugin.js: -------------------------------------------------------------------------------- 1 | const { configValidator, registerPlugin } = require('@scullyio/scully'); 2 | 3 | const voidPlugin = async (route, options) => { 4 | /** 5 | * I don't do anything here, 6 | * just return an empty array 7 | * as that will effectively remove the route from the list 8 | * */ 9 | return []; 10 | }; 11 | 12 | const validator = async conf => []; 13 | registerPlugin('router', 'void', voidPlugin, validator); 14 | -------------------------------------------------------------------------------- /depedencyHash.cjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const { createHash } = require('crypto'); 4 | const pkg = require('./package.json'); 5 | const { version, dependencies, devDependencies } = pkg; 6 | 7 | const hash = createHash('sha256'); 8 | /** create a hash that is depending on _what_ depedencies are used, not on version or complete package.json */ 9 | hash.update(JSON.stringify({ dependencies, devDependencies })); 10 | 11 | /** display it in the special format so GA can pick up the var */ 12 | console.log(`::set-output name=dependencyHash::${hash.digest('hex')}`); 13 | -------------------------------------------------------------------------------- /docs/Reference/legacy-support/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Legacy support 3 | lang: en 4 | position: 900 5 | --- 6 | 7 | # Scully Legacy support 8 | 9 | - [Angular v8](/docs/Reference/legacy-support/angular-v8) 10 | - [IE polyfills](/docs/Reference/legacy-support/polyfills) 11 | - Angular <12. Use Scully version 1 (`ng add scullyio/init@1`) 12 | -------------------------------------------------------------------------------- /docs/Reference/legacy-support/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Soporte heredado 3 | lang: es 4 | position: 900 5 | --- 6 | 7 | # Soporte heredado para Scully 8 | 9 | - [Angular v8](/docs/Reference/legacy-support/angular-v8) 10 | - [IE polyfills](/docs/Reference/legacy-support/polyfills) 11 | -------------------------------------------------------------------------------- /docs/Reference/ngLib/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Scully Library 3 | lang: en 4 | position: 100 5 | --- 6 | 7 | # Scully library features 8 | 9 | When you install Scully using the `ng add` schematics, our Angular library will also be installed. 10 | The library has some intergration features that enable you to utilize the full potential of Scully. 11 | 12 | - [ScullyRoutesService](/docs/Reference/ngLib/scully-routes-service) 13 | - [Scully-content](/docs/Reference/ngLib/scully-content-component) 14 | - [Idle-monitor](/docs/Reference/ngLib/idle-monitor-service) 15 | - [TransferStateService](/docs/Reference/ngLib/transfer-state-service) 16 | - [Utilities](/docs/Reference/ngLib/utility-methods) 17 | -------------------------------------------------------------------------------- /docs/Reference/ngLib/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Librería Scully 3 | lang: es 4 | position: 100 5 | --- 6 | 7 | # Cracterísticas de la librería Scully 8 | 9 | Cuando instalas Scully utilizando el schematics `ng add`, nuestra libería Angular también será instalada. 10 | Lalibrería tiene algunas características de integración para habilitar todo el potencial de Scully. 11 | 12 | - [ScullyRoutesService](/docs/Reference/ngLib/scully-routes-service) 13 | - [Scully-content](/docs/Reference/ngLib/scully-content-component) 14 | - [Idle-monitor](/docs/Reference/ngLib/idle-monitor-service) 15 | - [TransferStateService](/docs/Reference/ngLib/transfer-state-service) 16 | - [Utilidades](/docs/Reference/ngLib/utility-methods) 17 | -------------------------------------------------------------------------------- /docs/Reference/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Reference 3 | lang: en 4 | position: 200 5 | --- 6 | 7 | # Scully reference 8 | 9 | - [NG lib](/docs/Reference/ngLib/overview) 10 | - [Legacy support](/docs/Reference/legacy-support/overview) 11 | -------------------------------------------------------------------------------- /docs/Reference/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Referencias 3 | lang: es 4 | position: 200 5 | --- 6 | 7 | # Referencias 8 | 9 | - [NG lib](/docs/Reference/ngLib/overview) 10 | - [Legacy support](/docs/Reference/legacy-support/overview) 11 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/adoc.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: adoc Plugin 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # `adoc` Plugin 9 | 10 | ## Overview 11 | 12 | Adds capability to render adoc files as html. 13 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/adoc_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Complemento adoc 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Complemento `adoc` 9 | 10 | ## Visión General 11 | 12 | A 13 | Agrega la capacidad de renderizar archivos adoc como html 14 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/ignored.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ignored Plugin 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # `ignored` Plugin 9 | 10 | 13 | 14 | ## Overview 15 | 16 | Adds support for ignoring routes. 17 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/ignored_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Complemento `ignored` 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Complemento `ignored` 9 | 10 | 13 | 14 | ## Overview 15 | 16 | Permite ignorar rutas. 17 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Core Plugins 3 | lang: en 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Scully built in plugins 9 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Complementos principales 3 | lang: es 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Complementos desarrolados por Scully 9 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/router-.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: router Plugin 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # `router` Plugin 9 | 10 | ## Overview 11 | 12 | Adds the route verbatim. Scully uses this plugin by default. 13 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/router-_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Complemento router 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Complemento `router` 9 | 10 | ## Visión General 11 | 12 | Permite agrgar rutas textualmente. Scully utiliza este complemento por defecto. 13 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/seoHrefOptimize.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: seoHrefOptimize Plugin 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # `seoHrefOptimize` Plugin 9 | 10 | ## Overview 11 | 12 | Adds a trailing slash (`/`) to all routes that are in the routeService. Increases SEO scoring. 13 | -------------------------------------------------------------------------------- /docs/Reference/plugins/built-in-plugins/seoHrefOptimize_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Complemento seoHrefOptimize 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Complemento `seoHrefOptimize` 9 | 10 | ## Visión General 11 | 12 | Agregar una barra lateral (`/`) a todas las rutas que están en routeService. Esto aumenta la puntuación SEO. 13 | -------------------------------------------------------------------------------- /docs/Reference/plugins/community-plugins/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Community Plugins 3 | published: true 4 | lang: en 5 | position: 200 6 | --- 7 | 8 | ## Overview 9 | 10 | Scully has an rich community that provides a lot of value. In this section you will find all community plugins. 11 | -------------------------------------------------------------------------------- /docs/Reference/plugins/community-plugins/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Complementos de la Comunidad 3 | published: true 4 | lang: es 5 | position: 200 6 | --- 7 | 8 | ## Visión General 9 | 10 | Scully tiene un gran comunidad de mucho valor. En esta sección podrás encontrar todos los complementos de la comunidad. 11 | -------------------------------------------------------------------------------- /docs/Reference/plugins/custom-plugins/create-a-plugin-function.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Create 3 | published: true 4 | lang: en 5 | position: 130 6 | --- 7 | 8 | # Create a custom plugin 9 | 10 | A plugin is always a function that returns a promise. An async function is an easy way to build one. 11 | For example, if you want a plugin that does something silly like replacing strings in some piece of HTML you can do it like this: 12 | 13 | ```typescript 14 | async function replaceThings(html: string, route: handledRoute) { 15 | const replaceStrings = [[':)', '☺']]; 16 | replaceString.forEach( 17 | (find, replace) => (html = html.split(find).join(replace)) 18 | ); 19 | return html; 20 | } 21 | ``` 22 | -------------------------------------------------------------------------------- /docs/Reference/plugins/custom-plugins/register-a-new-plugin.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Register a New Plugin 3 | published: true 4 | lang: en 5 | position: 10 6 | --- 7 | 8 | # Register a new plugin 9 | 10 | 13 | 14 | ## Overview 15 | 16 | To register a new plugin into our plugin system the [registerPlugin function](/docs/Reference/scully-api/registerPlugin) is your way in. 17 | You can see all the options available in the API docs. 18 | -------------------------------------------------------------------------------- /docs/Reference/plugins/custom-plugins/register-a-new-plugin_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Registrar un Nuevo Complemento 3 | published: true 4 | lang: es 5 | position: 10 6 | --- 7 | 8 | # Registrar un Nuevo Complemento 9 | 10 | 13 | 14 | ## Visión General 15 | 16 | Para registrar un nuevo complemento dentro de nuestro sistema de complementos, la [función registerPlugin](/docs/Reference/scully-api/registerPlugin) es la indicada. 17 | Puedes ver todas las opciones disponibles en la documentación de la API. 18 | -------------------------------------------------------------------------------- /docs/Reference/plugins/custom-plugins/use-a-custom-plugin.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Use a custom plugin 3 | published: true 4 | lang: en 5 | position: 130 6 | --- 7 | 8 | # Use a custom plugin 9 | -------------------------------------------------------------------------------- /docs/Reference/plugins/custom-plugins/use-a-custom-plugin_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Usar un complemento personalizado 3 | published: true 4 | lang: es 5 | position: 130 6 | --- 7 | 8 | # Usar un complemento personalizado 9 | -------------------------------------------------------------------------------- /docs/Reference/plugins/types/allDone_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tipo de complemento allDone 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Tipo de complemento `allDone` 9 | 10 | ## Visión General 11 | 12 | Un complemento `allDone` es como un complemento [`routeDiscoveryDone`](/docs/Reference/plugins/types/routeDiscoveryDone), excepto que éste es llamado _después_ de que Scully termine de ejecutar todos los procesos. 13 | -------------------------------------------------------------------------------- /docs/Reference/plugins/types/routeDiscoveryDone_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tipo de complemento routeDiscoveryDone 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Tipo de complemento `routeDiscoveryDone` 9 | 10 | ## Visión General 11 | 12 | Este tipo de complemento es llamado automáticamente luego de todas las rutas han sido recolectadas y todos los complementos ruter estén finalizados. 13 | Recibe una copia de un arreglo `handledRoute` y devuelve `void`. 14 | -------------------------------------------------------------------------------- /docs/Reference/plugins/types/routeRenderer.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: the routeRenderer plugin 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # `routeRenderer` Plugin 9 | 10 | The `routeRenderer` is a scullySystem plugin that can be swapped out to use a different way to render the pages. 11 | It receives a [handledRoute](/docs/concepts/handled-routes.md), and should return a string containing the entire contents of the page. 12 | 13 | Its interface is: 14 | ```ts 15 | (route:HandledRoute) => Promise 16 | ``` 17 | 18 | ### responisilities. 19 | This plugin is responsible for rendering the actual content from the Angular app. When it throws, it will be retried 3 times before failure 20 | -------------------------------------------------------------------------------- /docs/Reference/plugins/types/system.md: -------------------------------------------------------------------------------- 1 | --- 2 | lang: en 3 | position: 500 4 | published: true 5 | title: System Plugins 6 | --- 7 | 8 | # The Scully system plugins. 9 | 10 | Scully has a category of system plugins. Unlike the other plugin catagories those plugins don't have a set interface. Those are used by Scully internally. 11 | It is possible to replace any of the plugins, including system plugins. This gives you an easy way to extend the functionality of Scully 12 | -------------------------------------------------------------------------------- /docs/Reference/plugins/types/system_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | lang: es 3 | position: 500 4 | published: true 5 | title: Sistema de complemento 6 | --- 7 | 8 | # Sistema de complementos de Scully 9 | 10 | Scully tiene un sistema de complementos. A diferencia de las otras categorías de complementos, esos complementos no tienen una insterfaz establecida y utilizan un símbolo como identificarlos. 11 | -------------------------------------------------------------------------------- /docs/Reference/schematics/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Scully Schematics 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # Schematics overview 9 | 10 | Scully comes with a number of schematics to support the integration with your Angular app. 11 | 12 | [Install Scully in your Angular app](/docs/Reference/schematics/create-scully-files-with-ng-add). 13 | [Create a blog](/docs/Reference/schematics/create-blog-config). 14 | [Create markdown skeleton](/docs/Reference/schematics/create-markdown-files-and-skeleton). 15 | -------------------------------------------------------------------------------- /docs/Reference/schematics/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Schematics de Scully 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Visión General 9 | 10 | Scully viene con una serie de schematics para soportar la integración con tu aplicación Angular. 11 | 12 | [Instala Scully en tu aplicación Angular](/docs/Reference/schematics/create-scully-files-with-ng-add). 13 | [Crea un blog](/docs/Reference/schematics/create-blog-config). 14 | [Crear archivos markdown](/docs/Reference/schematics/create-markdown-files-and-skeleton). 15 | -------------------------------------------------------------------------------- /docs/Reference/utilities/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 3rth Party integrations 3 | published: true 4 | lang: en 5 | position: 170 6 | --- 7 | 8 | # Utilities 9 | 10 | ## Overview 11 | 12 | Scully works well in combination with other tools and utilities: 13 | 14 | - Github Actions: 15 | - [Scully Publish](/docs/Reference/utilities/scully-publish) 16 | - Syntax Highlighting: 17 | - [PrismJS](/docs/Reference/utilities/prism-js) 18 | -------------------------------------------------------------------------------- /docs/Reference/utilities/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Integraciones de terceros 3 | published: true 4 | lang: es 5 | position: 170 6 | --- 7 | 8 | # Utilidades 9 | 10 | ## Visión General 11 | 12 | Scully trabaja muy bien combinado con otras herramientas y utilidades: 13 | 14 | - Github Actions: 15 | - [Scully Publish](/docs/Reference/utilities/scully-publish) 16 | - Syntax Highlighting: 17 | - [PrismJS](/docs/Reference/utilities/prism-js) 18 | -------------------------------------------------------------------------------- /docs/Reference/utilities/scully-publish.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Scully Publish Github Action 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # Scully Publish Github Action 9 | 10 | ## Overview 11 | 12 | The Github Action [Scully Publish](https://github.com/marketplace/actions/scully-publish) lets you easily build and deploy your Scully site to [GitHub Pages](https://pages.github.com/). 13 | -------------------------------------------------------------------------------- /docs/Reference/utilities/scully-publish_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Publicando Scully con Github Action 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Publicando Scully con Github Action 9 | 10 | ## Visión General 11 | 12 | Github Action [Scully Publish](https://github.com/marketplace/actions/scully-publish) te permite compilar y desplegar fácilmente tu sitio Scully en [GitHub Pages](https://pages.github.com/). 13 | -------------------------------------------------------------------------------- /docs/community/contributing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Contributing 3 | lang: en 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Contributing 9 | 10 | Do you want to contribute to Scully or share your experience with the community? 11 | Please check our [CONTRIBUTING](https://github.com/scullyio/scully/blob/main/CONTRIBUTING.md) guidelines. 12 | 13 | The team would love your feedback and to hear how you're using Scully with other tools! 14 | -------------------------------------------------------------------------------- /docs/community/contributing_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Contribuyendo 3 | lang: es 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Contribuyendo 9 | 10 | Quieres contribuir a Scully o compartir tu experiencia con la comunidad? 11 | Por favor chequea nuestra guía [CONTRIBUYENDO](https://github.com/scullyio/scully/blob/main/CONTRIBUTING.md). 12 | 13 | ¡Al equipo le encanta conocer tus comentarios y saber que Scully se está usando con otras herramientas! 14 | -------------------------------------------------------------------------------- /docs/community/issues.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Issues 3 | lang: en 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Issues 9 | 10 | To create a bug report, use the [Scully Bug template.](https://github.com/scullyio/scully/issues/new?assignees=&labels=bug&template=---bug-report.md&title=) 11 | 12 | To propose a new feature, use the [Scully Feature Request template.](https://github.com/scullyio/scully/issues/new?assignees=&labels=enhancement&template=---feature-request.md&title=) 13 | 14 | The Scully team is working on better documentation for creating issues. 15 | -------------------------------------------------------------------------------- /docs/community/issues_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Problemas 3 | lang: es 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Problemas 9 | 10 | Para crear un report de un error, utiliza la [plantilla de error de Scully.](https://github.com/scullyio/scully/issues/new?assignees=&labels=bug&template=---bug-report.md&title=) 11 | 12 | Para proponer una nueva característica, utiliza la [plantilla para nuevas características de Scully.](https://github.com/scullyio/scully/issues/new?assignees=&labels=enhancement&template=---feature-request.md&title=) 13 | 14 | El equipo de Scully está trabajando en la documentación para reportar problemas. 15 | -------------------------------------------------------------------------------- /docs/community/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Community 3 | lang: en 4 | published: true 5 | position: 900 6 | --- 7 | 8 | # Scully community overview 9 | -------------------------------------------------------------------------------- /docs/community/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Comunidad 3 | lang: es 4 | published: true 5 | position: 900 6 | --- 7 | 8 | # La Comunidad de Scully 9 | -------------------------------------------------------------------------------- /docs/community/sponsors.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sponsors 3 | lang: en 4 | published: true 5 | position: 901 6 | --- 7 | 8 | # Scully is made possible by those sponsors: 9 | 10 | Google 11 | 12 | HeroDevs 13 | -------------------------------------------------------------------------------- /docs/community/sponsors_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sponsors 3 | lang: es 4 | published: true 5 | position: 901 6 | --- 7 | 8 | # Scully es posible gracias a los siguientes sponsors: 9 | 10 | Google 11 | 12 | HeroDevs 13 | -------------------------------------------------------------------------------- /docs/community/support.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Support 3 | lang: en 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Support 9 | 10 | Join the Scully community on [Gitter](https://gitter.im/scullyio/community). 11 | 12 | Scully [Office Hours](https://meet.google.com/vcm-wekz-hsx?authuser=1) Google Meet every Tuesday at noon MST. 13 | -------------------------------------------------------------------------------- /docs/community/support_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Soporte 3 | lang: es 4 | published: true 5 | position: 100 6 | --- 7 | 8 | # Soporte 9 | 10 | Únete a la comunidad Scully en [Gitter](https://gitter.im/scullyio/community). 11 | 12 | Scully [Horarios de Oficina](https://meet.google.com/vcm-wekz-hsx?authuser=1) Google Meet todos los martes al mediodía MST. 13 | -------------------------------------------------------------------------------- /docs/concepts/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | lang: en 3 | position: 20 4 | published: true 5 | title: Concepts 6 | --- 7 | 8 | # Scully Concepts 9 | 10 | In this section, we explain the following Scully concepts in-depth. 11 | 12 | - [the Scully process](/docs/concepts/process) explains step by step what happens when you run scully. 13 | - [unhandled routes](/docs/concepts/unhandled-routes) explains all about `unhandled routes` 14 | - [handled routes](/docs/concepts/handled-routes) explains all about `handled routes` 15 | -------------------------------------------------------------------------------- /docs/concepts/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | lang: es 3 | position: 20 4 | published: true 5 | title: Conceptos 6 | --- 7 | 8 | # Conceptos 9 | 10 | En esta sección, explicaremos en detalle los siguiente conceptos de Scully. 11 | 12 | - [el proceso Scully](/docs/concepts/process) explicaremos paso a paso qué sucede cuando ejecutamos Scully. 13 | - [rutas no controladas](/docs/concepts/unhandled-routes) explicaremos todo soble las `rutas no controladas` 14 | - [rutas controladas](/docs/concepts/handled-routes) explicaremos todo soble las `rutas controladas` 15 | -------------------------------------------------------------------------------- /docs/learn/create-a-blog/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Create a blog 3 | lang: en 4 | position: 20 5 | --- 6 | 7 | # Creating a blog 8 | 9 | Start off with [adding blog support](/docs/learn/create-a-blog/add-blog-support). After that, you might want to find out how to [add a new post](/docs/learn/create-a-blog/generate-new-blog-posts), or how to [use blog post meta-data](/docs/learn/create-a-blog/use-blog-post-data-in-template). 10 | -------------------------------------------------------------------------------- /docs/learn/create-a-blog/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Crear un blog 3 | lang: es 4 | position: 20 5 | --- 6 | 7 | # Creando un blog 8 | 9 | Comienza con [agregar soporte para blog](/docs/learn/create-a-blog/add-blog-support). Luego de eso, seguramente desees [agregar un nuevo artículo](/docs/learn/create-a-blog/generate-new-blog-posts), o cómo [usar los metadatos de un artículo](/docs/learn/create-a-blog/use-blog-post-data-in-template). 10 | -------------------------------------------------------------------------------- /docs/learn/getting-started/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | lang: en 3 | position: 10 4 | title: Getting started 5 | --- 6 | 7 | # Getting Started 8 | 9 | First check if your app meets the [minimal requirements](/docs/learn/getting-started/requirements). When you are done with that, head over to [the installation](/docs/learn/getting-started/installation) 10 | -------------------------------------------------------------------------------- /docs/learn/getting-started/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | lang: es 3 | position: 10 4 | title: Cómo empezar 5 | --- 6 | 7 | # Cómo empezar 8 | 9 | Primero debes chequear que la aplicación cumple con [requisitos mínimos](/docs/learn/getting-started/requirements). Una vez hecho esto, puede continuar con [la instalación](/docs/learn/getting-started/installation) 10 | -------------------------------------------------------------------------------- /docs/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Scully Documentation 3 | published: true 4 | lang: en 5 | position: 100 6 | --- 7 | 8 | # Scullly documentation 9 | 10 | This document is a placeholder, this position is taken by 11 | -------------------------------------------------------------------------------- /docs/overview_es.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Scully Documentation 3 | published: true 4 | lang: es 5 | position: 100 6 | --- 7 | 8 | # Scullly documentation 9 | 10 | This document is a placeholder, this position is taken by 11 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "site": "scullyio", 4 | "public": "dist/static/doc-sites", 5 | "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], 6 | "rewrites": [ 7 | { 8 | "source": "/404", 9 | "destination": "/404/index.html", 10 | "type": 301 11 | } 12 | ], 13 | "headers": [ 14 | { 15 | "source": "**/*.@(svg|jpg|jpeg|gif|png)", 16 | "headers": [ 17 | { 18 | "key": "Cache-Control", 19 | "value": "max-age=31536000" 20 | } 21 | ] 22 | } 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | const { getJestProjects } = require('@nrwl/jest'); 2 | module.exports = { 3 | projects: ['/tests/jest/src', ...getJestProjects()], 4 | }; 5 | -------------------------------------------------------------------------------- /jest.preset.js: -------------------------------------------------------------------------------- 1 | const nxPreset = require('@nrwl/jest/preset'); 2 | 3 | module.exports = { 4 | ...nxPreset 5 | }; 6 | -------------------------------------------------------------------------------- /libs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/libs/.gitkeep -------------------------------------------------------------------------------- /libs/ng-lib/README.md: -------------------------------------------------------------------------------- 1 | # ScullyIo ng-lib 2 | 3 | This library that houses the components and services for ScullyIo 4 | 5 | - content 6 | - idlemonior 7 | - route-service 8 | -------------------------------------------------------------------------------- /libs/ng-lib/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/libs/ng-lib", 4 | "lib": { 5 | "entryFile": "src/public-api.ts" 6 | }, 7 | "allowedNonPeerDependencies": [ 8 | "rxjs" 9 | ], 10 | "whitelistedNonPeerDependencies": [ 11 | "node-fetch", 12 | "rxjs" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /libs/ng-lib/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/ng-lib", 3 | "version": "2.1.42", 4 | "repository": { 5 | "type": "GIT", 6 | "url": "https://github.com/scullyio/scully/tree/main/libs/ng-lib" 7 | }, 8 | "dependencies": { 9 | "rxjs": "^7.0.0" 10 | }, 11 | "peerDependencies": { 12 | "@angular/router": ">12.0.0 || <13.0.0", 13 | "@angular/platform-browser-dynamic": ">12.0.0 || <13.0.0", 14 | "@angular/common": ">12.0.0 || <13.0.0", 15 | "@angular/core": ">12.0.0 || <13.0.0" 16 | }, 17 | "keywords": [ 18 | "angular", 19 | "scully", 20 | "seo", 21 | "scully-plugin", 22 | "plugin" 23 | ] 24 | } -------------------------------------------------------------------------------- /libs/ng-lib/src/lib/config/scully-config.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core'; 2 | 3 | export interface ScullyLibConfig { 4 | useTransferState?: boolean; 5 | alwaysMonitor?: boolean; 6 | manualIdle?: boolean; 7 | baseURIForScullyContent?: string; 8 | } 9 | 10 | export const ScullyDefaultSettings: Required = { 11 | useTransferState: true, 12 | alwaysMonitor: false, 13 | manualIdle: false, 14 | baseURIForScullyContent: 'http://localhost:1668', 15 | }; 16 | 17 | export const SCULLY_LIB_CONFIG = new InjectionToken('scullyLibConfig', { 18 | factory: () => ScullyDefaultSettings, 19 | }); 20 | -------------------------------------------------------------------------------- /libs/ng-lib/src/lib/scully-content/scully-content.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { ScullyContentComponent } from './scully-content.component'; 3 | 4 | @NgModule({ 5 | declarations: [ScullyContentComponent], 6 | exports: [ScullyContentComponent] 7 | }) 8 | export class ScullyContentModule {} 9 | -------------------------------------------------------------------------------- /libs/ng-lib/src/lib/utils/basePathOnly.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Take a string, preferably resembling an URL, take out the search params, the anchors, and the ending slash 3 | * @param str 4 | */ 5 | export const basePathOnly = (str: string): string => { 6 | if (str.includes('#')) { 7 | str = str.split('#')[0]; 8 | } 9 | if (str.includes('?')) { 10 | str = str.split('?')[0]; 11 | } 12 | const cleanedUpVersion = str.endsWith('/') ? str.slice(0, -1) : str; 13 | return cleanedUpVersion; 14 | }; 15 | -------------------------------------------------------------------------------- /libs/ng-lib/src/lib/utils/fetchHttp.ts: -------------------------------------------------------------------------------- 1 | export function fetchHttp( 2 | url: string, 3 | responseType: XMLHttpRequestResponseType = 'json' 4 | ): Promise { 5 | return new Promise((resolve, reject) => { 6 | const xhr = new XMLHttpRequest(); 7 | xhr.responseType = responseType; 8 | xhr.addEventListener('load', ev => { 9 | if (xhr.status !== 200) { 10 | return reject(xhr); 11 | } 12 | resolve(xhr.response); 13 | }); 14 | xhr.addEventListener('error', (...err) => reject(err)); 15 | xhr.open('get', url, true); 16 | xhr.send(); 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /libs/ng-lib/src/lib/utils/isScully.ts: -------------------------------------------------------------------------------- 1 | // tslint:disable: no-string-literal 2 | export const isScullyRunning = () => window && window['ScullyIO'] === 'running'; 3 | export const isScullyGenerated = () => 4 | window && window['ScullyIO'] === 'generated'; 5 | -------------------------------------------------------------------------------- /libs/ng-lib/src/lib/utils/merge-paths.ts: -------------------------------------------------------------------------------- 1 | export function mergePaths(base: string, path: string): string { 2 | base = base ?? ''; 3 | if (base.endsWith('/') && path.startsWith('/')) { 4 | return `${base}${path.substr(1)}`; 5 | } 6 | if (!base.endsWith('/') && !path.startsWith('/')) { 7 | return `${base}/${path}`; 8 | } 9 | return `${base}${path}`; 10 | } 11 | -------------------------------------------------------------------------------- /libs/ng-lib/src/public-api.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Public API Surface of ng-lib 3 | */ 4 | 5 | export { 6 | IdleMonitorService, 7 | dropEndingSlash, 8 | } from './lib/idleMonitor/idle-monitor.service'; 9 | export { 10 | ScullyRoutesService, 11 | ScullyRoute, 12 | } from './lib/route-service/scully-routes.service'; 13 | export { ScullyContentComponent } from './lib/scully-content/scully-content.component'; 14 | export { ScullyContentModule } from './lib/scully-content/scully-content.module'; 15 | export { ScullyLibModule } from './lib/scully-lib.module'; 16 | export { TransferStateService } from './lib/transfer-state/transfer-state.service'; 17 | export { isScullyGenerated, isScullyRunning } from './lib/utils/isScully'; 18 | -------------------------------------------------------------------------------- /libs/ng-lib/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": ["**/*.ts"] 7 | } 8 | -------------------------------------------------------------------------------- /libs/ng-lib/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": { 7 | "enableIvy": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /libs/ng-lib/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tslint.json", 3 | "rules": { 4 | "directive-selector": [true, "attribute", "lib", "camelCase"], 5 | "component-selector": [true, "element", "lib", "kebab-case"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/platform-server/README.md: -------------------------------------------------------------------------------- 1 | # platform-server 2 | 3 | This library was generated with [Nx](https://nx.dev). 4 | 5 | ## Running unit tests 6 | 7 | Run `nx test platform-server` to execute the unit tests. 8 | -------------------------------------------------------------------------------- /libs/platform-server/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/libs/platform-server", 4 | "lib": { 5 | "entryFile": "src/index.ts" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /libs/platform-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/platform-server", 3 | "version": "2.1.42", 4 | "peerDependencies": { 5 | "@angular/common": ">12.0.0 || <13.0.0", 6 | "@angular/core": ">12.0.0 || <13.0.0", 7 | "@angular/platform-server": ">12.0.0 || <13.0.0", 8 | "@scullyio/ng-lib": ">2.0.0 || <3.0.0" 9 | }, 10 | "dependencies": { 11 | "tslib": "^2.3.1" 12 | } 13 | } -------------------------------------------------------------------------------- /libs/platform-server/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/platform-server.module'; 2 | -------------------------------------------------------------------------------- /libs/platform-server/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | -------------------------------------------------------------------------------- /libs/platform-server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.lib.json" 8 | }, 9 | { 10 | "path": "./tsconfig.lib.prod.json" 11 | }, 12 | { 13 | "path": "./tsconfig.spec.json" 14 | } 15 | ], 16 | "compilerOptions": { 17 | "forceConsistentCasingInFileNames": true, 18 | "strict": true, 19 | "noImplicitReturns": true, 20 | "noFallthroughCasesInSwitch": true 21 | }, 22 | "angularCompilerOptions": { 23 | "strictInjectionParameters": true, 24 | "strictInputAccessModifiers": true, 25 | "strictTemplates": true 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /libs/platform-server/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "target": "es2015", 6 | "declaration": true, 7 | "declarationMap": true, 8 | "inlineSources": true, 9 | "types": [], 10 | "lib": ["dom", "es2018"] 11 | }, 12 | "exclude": ["src/test-setup.ts", "**/*.spec.ts"], 13 | "include": ["**/*.ts"] 14 | } 15 | -------------------------------------------------------------------------------- /libs/platform-server/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.lib.json", 3 | "compilerOptions": { 4 | "declarationMap": false 5 | }, 6 | "angularCompilerOptions": { 7 | "compilationMode": "partial", 8 | "enableIvy": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /libs/platform-server/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "files": ["src/test-setup.ts"], 9 | "include": ["**/*.spec.ts", "**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /libs/plugins/base-href-rewrite/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/base-href-rewrite/dist/.nx-results: -------------------------------------------------------------------------------- 1 | { 2 | "command": "serve", 3 | "results": { 4 | "sample-blog": false 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /libs/plugins/base-href-rewrite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-base-href-rewrite", 3 | "version": "2.1.42", 4 | "main": "./src/index.js", 5 | "author": "Sander Elias", 6 | "repository": { 7 | "type": "GIT", 8 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/base-href-rewrite" 9 | }, 10 | "license": "MIT", 11 | "peerDependencies": { 12 | "@scullyio/scully": "*" 13 | } 14 | } -------------------------------------------------------------------------------- /libs/plugins/base-href-rewrite/src/index.ts: -------------------------------------------------------------------------------- 1 | export { baseHrefRewrite } from './lib/plugins-base-href-rewrite'; 2 | -------------------------------------------------------------------------------- /libs/plugins/base-href-rewrite/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/base-href-rewrite/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/docs-link-update/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/docs-link-update/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-docs-link-update", 3 | "version": "2.1.42", 4 | "peerDependencies": { 5 | "@scullyio/scully": "*", 6 | "jsdom": "^19.0.0" 7 | }, 8 | "repository": { 9 | "type": "GIT", 10 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/docs-link-update" 11 | }, 12 | "dependencies": {}, 13 | "keywords": [ 14 | "angular", 15 | "scully", 16 | "seo", 17 | "scully-plugin", 18 | "plugin" 19 | ] 20 | } -------------------------------------------------------------------------------- /libs/plugins/docs-link-update/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/plugins-docs-link-update'; 2 | -------------------------------------------------------------------------------- /libs/plugins/docs-link-update/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | }, 12 | { 13 | "path": "./tsconfig.spec.json" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /libs/plugins/docs-link-update/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/docs-link-update/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": ["**/*.spec.ts", "**/*.spec.tsx", "**/*.spec.js", "**/*.spec.jsx", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /libs/plugins/extra/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/extra/README.md: -------------------------------------------------------------------------------- 1 | # plugins-extra 2 | 3 | This is the extra routes plugin. 4 | It takes one parameter and makes that amount of routes 5 | 6 | ## Getting Started 7 | 8 | ### 1. Install the plugin: 9 | 10 | ```bash 11 | npm install -D @scullyio/scully-plugin-extra 12 | ``` 13 | 14 | ### 2. Use the plugin: 15 | 16 | TODO 17 | -------------------------------------------------------------------------------- /libs/plugins/extra/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-extra", 3 | "version": "2.1.42", 4 | "description": "Scully extra demo plugin", 5 | "main": "./src/index.js", 6 | "scripts": {}, 7 | "author": "", 8 | "license": "ISC", 9 | "peerDependencies": { 10 | "@scullyio/scully": "*" 11 | }, 12 | "dependencies": {}, 13 | "repository": { 14 | "type": "GIT", 15 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/extra" 16 | }, 17 | "keywords": [ 18 | "angular", 19 | "scully", 20 | "seo", 21 | "scully-plugin", 22 | "plugin" 23 | ] 24 | } -------------------------------------------------------------------------------- /libs/plugins/extra/src/index.ts: -------------------------------------------------------------------------------- 1 | export { extraRoutesPlugin } from './lib/plugins-extra'; 2 | -------------------------------------------------------------------------------- /libs/plugins/extra/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/extra/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/from-data/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/from-data/README.md: -------------------------------------------------------------------------------- 1 | # plugins-from-data 2 | 3 | This is a router demo plugin. 4 | 5 | ## Getting Started 6 | 7 | ### 1. Install the plugin: 8 | 9 | ```bash 10 | npm install -D @scullyio/scully-plugin-from-data 11 | ``` 12 | 13 | ### 2. Use the plugin: 14 | 15 | TODO 16 | -------------------------------------------------------------------------------- /libs/plugins/from-data/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-from-data", 3 | "version": "2.1.42", 4 | "description": "Scully demo data plugin", 5 | "main": "./src/index.js", 6 | "author": "", 7 | "license": "ISC", 8 | "dependencies": { 9 | "tslib": "^2.3.1" 10 | }, 11 | "peerDependencies": { 12 | "@scullyio/scully": "*" 13 | }, 14 | "repository": { 15 | "type": "GIT", 16 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/from-data" 17 | }, 18 | "keywords": [ 19 | "angular", 20 | "scully", 21 | "seo", 22 | "scully-plugin", 23 | "plugin" 24 | ] 25 | } -------------------------------------------------------------------------------- /libs/plugins/from-data/src/index.ts: -------------------------------------------------------------------------------- 1 | export { extraData } from './lib/plugins-from-data'; 2 | -------------------------------------------------------------------------------- /libs/plugins/from-data/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/from-data/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/google-analytics/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/google-analytics/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-google-analytics", 3 | "version": "2.1.42", 4 | "author": "Israel Guzman", 5 | "repository": { 6 | "type": "GIT", 7 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/google-analytics" 8 | }, 9 | "peerDependencies": { 10 | "@scullyio/scully": "*" 11 | }, 12 | "dependencies": {}, 13 | "license": "MIT", 14 | "keywords": [ 15 | "angular", 16 | "scully", 17 | "seo", 18 | "scully-plugin", 19 | "plugin" 20 | ] 21 | } -------------------------------------------------------------------------------- /libs/plugins/google-analytics/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/plugins-google-analytics'; 2 | -------------------------------------------------------------------------------- /libs/plugins/google-analytics/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/google-analytics/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/logrocket/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/logrocket/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-logrocket", 3 | "version": "2.1.42", 4 | "repository": { 5 | "type": "GIT", 6 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/logrocket" 7 | }, 8 | "license": "MIT", 9 | "dependencies": { 10 | "tslib": "^2.3.1" 11 | }, 12 | "peerDependencies": { 13 | "@scullyio/scully": "*" 14 | }, 15 | "keywords": [ 16 | "angular", 17 | "scully", 18 | "seo", 19 | "scully-plugin", 20 | "plugin" 21 | ] 22 | } -------------------------------------------------------------------------------- /libs/plugins/logrocket/src/index.ts: -------------------------------------------------------------------------------- 1 | export { LogRocket, logrocketPlugin } from './lib/plugins-logrocket'; 2 | -------------------------------------------------------------------------------- /libs/plugins/logrocket/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/logrocket/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-copy-to-clipboard/.eslintrc: -------------------------------------------------------------------------------- 1 | {"extends":"../../../.eslintrc","rules":{},"ignorePatterns":["!**/*"]} -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-copy-to-clipboard/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-copy-to-clipboard", 3 | "version": "2.1.42", 4 | "author": "Ankit Prajapati", 5 | "license": "MIT", 6 | "repository": { 7 | "type": "GIT", 8 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/scully-plugin-copy-to-clipboard" 9 | }, 10 | "peerDependencies": { 11 | "@scullyio/scully": "*", 12 | "jsdom": "^19.0.0" 13 | }, 14 | "dependencies": {}, 15 | "keywords": [ 16 | "angular", 17 | "scully", 18 | "prismjs", 19 | "copy-to-clipboard", 20 | "scully-plugin", 21 | "plugin" 22 | ] 23 | } -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-copy-to-clipboard/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/plugins-scully-plugin-copy-to-clipboard'; 2 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-copy-to-clipboard/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-copy-to-clipboard/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-critical-css/.eslintrc: -------------------------------------------------------------------------------- 1 | { "extends": "../../../.eslintrc", "rules": {}, "ignorePatterns": ["!**/*"] } 2 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-critical-css/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-critical-css", 3 | "version": "2.1.42", 4 | "peerDependencies": { 5 | "@scullyio/scully": "*" 6 | }, 7 | "repository": { 8 | "type": "GIT", 9 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/scully-plugin-critical-css" 10 | }, 11 | "keywords": [ 12 | "angular", 13 | "scully", 14 | "seo", 15 | "scully-plugin", 16 | "plugin", 17 | "CSS-above-the-fold" 18 | ], 19 | "dependencies": { 20 | "critical": "^4.0.1" 21 | } 22 | } -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-critical-css/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/plugins-scully-plugin-critical-css'; 2 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-critical-css/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "esModuleInterop": true, 5 | "allowSyntheticDefaultImports": true 6 | }, 7 | "files": [], 8 | "include": [], 9 | "references": [ 10 | { 11 | "path": "./tsconfig.lib.json" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-critical-css/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-flash-prevention/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-flash-prevention/index.ts: -------------------------------------------------------------------------------- 1 | export { getFlashPreventionPlugin } from './src/lib/flash-prevention.plugin'; 2 | export { appendToHead } from './src/lib/utils'; 3 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-flash-prevention/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-flash-prevention", 3 | "version": "2.1.42", 4 | "main": "./index.js", 5 | "contributors": [ 6 | "Aaron Frost " 7 | ], 8 | "dependencies": { 9 | "tslib": "^2.3.1" 10 | }, 11 | "peerDependencies": { 12 | "@scullyio/scully": "*" 13 | }, 14 | "repository": { 15 | "type": "GIT", 16 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/scully-plugin-flash-prevention" 17 | }, 18 | "keywords": [ 19 | "angular", 20 | "scully", 21 | "seo", 22 | "scully-plugin", 23 | "plugin" 24 | ] 25 | } -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-flash-prevention/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | const headEndTag = ``; 2 | 3 | export async function appendToHead(html, str) { 4 | const indexOfFirstHeadClose = html.indexOf(headEndTag); 5 | const start = html.slice(0, indexOfFirstHeadClose); 6 | const end = html.slice(indexOfFirstHeadClose); 7 | return `${start}${str}${end}`; 8 | } 9 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-flash-prevention/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-flash-prevention/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"], 5 | "module": "CommonJS", 6 | "declaration": true, 7 | }, 8 | "files": ["./index.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc.json", 3 | "ignorePatterns": ["!**/*"], 4 | "rules": {}, 5 | "overrides": [ 6 | { 7 | "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 8 | "parserOptions": { 9 | "project": ["libs/plugins/scully-plugin-local-cache/tsconfig.*?.json"] 10 | }, 11 | "rules": {} 12 | }, 13 | { 14 | "files": ["*.ts", "*.tsx"], 15 | "rules": {} 16 | }, 17 | { 18 | "files": ["*.js", "*.jsx"], 19 | "rules": {} 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-local-cache", 3 | "version": "2.1.42", 4 | "dependencies": { 5 | "level": "*" 6 | }, 7 | "main": "src/index.js", 8 | "devDependencies": {}, 9 | "peerDependencies": { 10 | "rxjs": "*", 11 | "yargs": "*", 12 | "puppeteer": "*", 13 | "@scullyio/scully": "*" 14 | } 15 | } -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/src/index.ts: -------------------------------------------------------------------------------- 1 | export { localCacheReady, localCache } from './lib/plugins-local-cache'; 2 | export { levelDbReady, del, get, set, initializeLevelDb, traverse } from './lib/ldb'; 3 | export { CacheItem, LocalCacheConfig, LookupTable } from './lib/local-cache.interface'; 4 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/src/lib/deferred.ts: -------------------------------------------------------------------------------- 1 | export class Deferred { 2 | resolve: (T?) => void; 3 | reject: (error?: any) => void; 4 | promise = new Promise((rs, rj) => { 5 | this.resolve = rs; 6 | this.reject = rj; 7 | }); 8 | } 9 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/src/lib/generateId.ts: -------------------------------------------------------------------------------- 1 | import { scullyConfig } from '@scullyio/scully'; 2 | import { config } from './config'; 3 | 4 | export function generateId() { 5 | return `${scullyConfig.projectName}_${config.environment}`; 6 | } 7 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/src/lib/usageStatistics.ts: -------------------------------------------------------------------------------- 1 | export const usageStatistics = { 2 | requests: 0, 3 | hit: 0, 4 | mis: 0, 5 | traffic: 0, 6 | saved: 0, 7 | }; 8 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.lib.json" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-local-cache/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "types": ["node"] 8 | }, 9 | "exclude": ["**/*.spec.ts"], 10 | "include": ["**/*.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [["@nrwl/web/babel", { "useBuiltIns": "usage" }]] 3 | } 4 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["../../../.eslintrc.json"], 3 | "ignorePatterns": ["!**/*"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 | "rules": {} 8 | }, 9 | { 10 | "files": ["*.ts", "*.tsx"], 11 | "rules": {} 12 | }, 13 | { 14 | "files": ["*.js", "*.jsx"], 15 | "rules": {} 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | displayName: 'plugins-scully-plugin-playwright', 3 | preset: '../../../jest.preset.js', 4 | globals: { 5 | 'ts-jest': { 6 | tsconfig: '/tsconfig.spec.json', 7 | }, 8 | }, 9 | testEnvironment: 'node', 10 | transform: { 11 | '^.+\\.[tj]sx?$': 'ts-jest', 12 | }, 13 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], 14 | coverageDirectory: '../../../coverage/libs/plugins/scully-plugin-playwright', 15 | }; 16 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-playwright", 3 | "version": "2.1.42", 4 | "repository": { 5 | "type": "GIT", 6 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/scully-plugin-playwright" 7 | }, 8 | "keywords": [ 9 | "angular", 10 | "scully", 11 | "seo", 12 | "scully-plugin", 13 | "plugin", 14 | "playwright" 15 | ], 16 | "dependencies": { 17 | "tslib": "^2.3.1" 18 | }, 19 | "peerDependencies": { 20 | "@scullyio/scully": "*", 21 | "playwright": "^1.19.2" 22 | } 23 | } -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/src/lib/plugins-scully-plugin-playwright.spec.ts: -------------------------------------------------------------------------------- 1 | import { playwrightRenderer } from './plugins-scully-plugin-playwright'; 2 | 3 | describe('playwrightRenderer', () => { 4 | it('should work', () => { 5 | expect(playwrightRenderer).toEqual(playwrightRenderer); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.base.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.lib.json" 8 | }, 9 | { 10 | "path": "./tsconfig.spec.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "types": ["node"] 8 | }, 9 | "exclude": ["**/*.spec.ts"], 10 | "include": ["**/*.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-playwright/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": ["**/*.spec.ts", "**/*.spec.tsx", "**/*.spec.js", "**/*.spec.jsx", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [["@nrwl/web/babel", { "useBuiltIns": "usage" }]] 3 | } 4 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["../../../.eslintrc.json"], 3 | "ignorePatterns": ["!**/*"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 | "rules": {} 8 | }, 9 | { 10 | "files": ["*.ts", "*.tsx"], 11 | "rules": {} 12 | }, 13 | { 14 | "files": ["*.js", "*.jsx"], 15 | "rules": {} 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/README.md: -------------------------------------------------------------------------------- 1 | # scully-plugin-puppeteer 2 | 3 | This is the Puppeteer render plugin for Scully. 4 | 5 | The interface for a renderPlugin is: 6 | ```ts 7 | (route:HandledRoute) => Promise 8 | ``` 9 | 10 | This plugin will be called for every route that is in the `handledRoute[]` When it throws its retried for 3 times. If it fails after that, the route is skipped. 11 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | displayName: 'plugins-scully-plugin-puppeteer', 3 | preset: '../../../jest.preset.js', 4 | globals: { 5 | 'ts-jest': { 6 | tsconfig: '/tsconfig.spec.json', 7 | }, 8 | }, 9 | testEnvironment: 'node', 10 | transform: { 11 | '^.+\\.[tj]sx?$': 'ts-jest', 12 | }, 13 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], 14 | coverageDirectory: '../../../coverage/libs/plugins/scully-plugin-puppeteer', 15 | }; 16 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-puppeteer", 3 | "version": "2.1.42", 4 | "description": "Scully Puppeteer render plugin", 5 | "main": "./src/index.js", 6 | "license": "MIT", 7 | "dependencies": { 8 | "tslib": "^2.3.1" 9 | }, 10 | "peerDependencies": { 11 | "@scullyio/scully": "*", 12 | "puppeteer": "^13.4.1" 13 | }, 14 | "repository": { 15 | "type": "GIT", 16 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/scully-plugin-puppeteer" 17 | }, 18 | "keywords": [ 19 | "angular", 20 | "scully", 21 | "seo", 22 | "scully-plugin", 23 | "puppeteer", 24 | "plugin", 25 | "render" 26 | ] 27 | } -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/src/lib/plugins-scully-plugin-puppeteer.spec.ts: -------------------------------------------------------------------------------- 1 | import { puppeteerRender } from './plugins-scully-plugin-puppeteer'; 2 | 3 | describe('pluginsScullyPluginPuppeteer', () => { 4 | it('should work', () => { 5 | expect(puppeteerRender).toEqual(puppeteerRender); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.base.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.lib.json" 8 | }, 9 | { 10 | "path": "./tsconfig.spec.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "types": ["node"] 8 | }, 9 | "exclude": ["**/*.spec.ts"], 10 | "include": ["**/*.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-puppeteer/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": ["**/*.spec.ts", "**/*.spec.tsx", "**/*.spec.js", "**/*.spec.jsx", "**/*.d.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-remove-scripts/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-remove-scripts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-remove-scripts", 3 | "description": "Scully plugin to remove scripts", 4 | "version": "2.1.42", 5 | "main": "./src/index.js", 6 | "author": "@herodevs", 7 | "license": "MIT", 8 | "peerDependencies": { 9 | "@scullyio/scully": "*", 10 | "jsdom": "*" 11 | }, 12 | "repository": { 13 | "type": "GIT", 14 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/scully-plugin-remove-scripts" 15 | }, 16 | "engines": { 17 | "node": ">=14" 18 | }, 19 | "keywords": [ 20 | "angular", 21 | "scully", 22 | "seo", 23 | "scully-plugin", 24 | "plugin" 25 | ] 26 | } -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-remove-scripts/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/plugins-scully-plugin-remove-scripts'; 2 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-remove-scripts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/scully-plugin-remove-scripts/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/plugins/sentry/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/plugins/sentry/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/scully-plugin-sentry", 3 | "version": "2.1.42", 4 | "repository": { 5 | "type": "GIT", 6 | "url": "https://github.com/scullyio/scully/tree/main/libs/plugins/sentry" 7 | }, 8 | "license": "MIT", 9 | "dependencies": { 10 | "tslib": "^2.3.1" 11 | }, 12 | "peerDependencies": { 13 | "@scullyio/scully": "*" 14 | }, 15 | "keywords": [ 16 | "angular", 17 | "scully", 18 | "seo", 19 | "scully-plugin", 20 | "plugin" 21 | ] 22 | } -------------------------------------------------------------------------------- /libs/plugins/sentry/src/index.ts: -------------------------------------------------------------------------------- 1 | export { Sentry, sentryPlugin } from './lib/plugins-sentry'; 2 | export { SentryErrorHandler, SentryDialogToken, sentryDialogProvider, sentryProviders } from './lib/sentry.errorhandler'; 3 | -------------------------------------------------------------------------------- /libs/plugins/sentry/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.lib.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /libs/plugins/sentry/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "outDir": "../../../dist/out-tsc", 6 | "declaration": true, 7 | "rootDir": "./src", 8 | "types": ["node"] 9 | }, 10 | "exclude": ["**/*.spec.ts"], 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /libs/scully-schematics/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["**/*", "src/**/*_spec.ts", "**/*/files/**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/scully-schematics/.gitignore: -------------------------------------------------------------------------------- 1 | # Outputs 2 | spec/**/*.js 3 | spec/**/*.js.map 4 | spec/**/*.d.ts 5 | src/**/*.js 6 | src/**/*.js.map 7 | src/**/*.d.ts 8 | 9 | # IDEs 10 | .idea/ 11 | jsconfig.json 12 | .vscode/ 13 | 14 | # Misc 15 | node_modules/ 16 | npm-debug.log* 17 | yarn-error.log* 18 | 19 | # Mac OSX Finder files. 20 | **/.DS_Store 21 | .DS_Store 22 | -------------------------------------------------------------------------------- /libs/scully-schematics/.npmignore: -------------------------------------------------------------------------------- 1 | # Ignores TypeScript files, but keeps definitions. 2 | !*.d.ts 3 | herodevs*.tgz 4 | -------------------------------------------------------------------------------- /libs/scully-schematics/assets/meta-data-template.yml: -------------------------------------------------------------------------------- 1 | title: override-me 2 | thumbnail: assets/images/default.jpg 3 | author: John Doe 4 | mail: John.Doe@example.com 5 | keywords: 6 | - angular 7 | - scully 8 | language: en 9 | -------------------------------------------------------------------------------- /libs/scully-schematics/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | displayName: 'scully-schematics', 3 | preset: '../../jest.preset.js', 4 | globals: { 5 | 'ts-jest': { 6 | tsconfig: '/tsconfig.spec.json', 7 | }, 8 | }, 9 | testEnvironment: 'node', 10 | transform: { 11 | '^.+\\.[tj]sx?$': 'ts-jest', 12 | }, 13 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], 14 | coverageDirectory: '../../coverage/libs/scully-schematics', 15 | testPathIgnorePatterns: ['/src/files/'], 16 | }; 17 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/add-blog/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "$id": "@scullyio/init:blog", 4 | "title": "Scully: Add a complete blog schematic", 5 | "type": "object", 6 | "properties": { 7 | "routingScope": { 8 | "enum": ["Child", "Root"], 9 | "type": "string", 10 | "description": "The scope for the new routing module.", 11 | "default": "Child" 12 | }, 13 | "project": { 14 | "type": "string", 15 | "description": "add the project", 16 | "default": "defaultProject" 17 | } 18 | }, 19 | "required": [] 20 | } 21 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/add-blog/schema.ts: -------------------------------------------------------------------------------- 1 | export interface Schema { 2 | /** 3 | * The scope for the new routing module. 4 | */ 5 | routingScope?: 'Child' | 'Root'; 6 | project?: string; 7 | } 8 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/add-plugin/schema.ts: -------------------------------------------------------------------------------- 1 | export interface Schema { 2 | /** 3 | * add the name for the plugin 4 | */ 5 | name: string; 6 | project: string; 7 | /** 8 | * The type of plugin 9 | */ 10 | pluginType: 'router' | 'postProcessByHtml'; 11 | } 12 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/add-post/schema.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Scully ng-add-blog schematic 3 | */ 4 | export interface Schema { 5 | /** 6 | * add the title for the post 7 | */ 8 | name: string; 9 | /** 10 | * define the target directory for the new post file 11 | */ 12 | target?: string; 13 | /** 14 | * define the file extension for the target file 15 | */ 16 | extension?: string; 17 | /** 18 | * use a meta data template file that's data will be added to the post 19 | */ 20 | metaDataFile?: string; 21 | } 22 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/create-markdown/schema.ts: -------------------------------------------------------------------------------- 1 | export interface Schema { 2 | /** 3 | * add the name for the module 4 | */ 5 | name: string; 6 | /** 7 | * add the name for the :${slug} 8 | */ 9 | slug: string; 10 | /** 11 | * The scope for the new routing module. 12 | */ 13 | routingScope?: 'Child' | 'Root'; 14 | /** 15 | * add the name for the source dir to store the markdown files 16 | */ 17 | sourceDir?: string; 18 | /** 19 | * define the route where your post will be available 20 | */ 21 | route?: string; 22 | project: string; 23 | } 24 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/blog-add/blog-X.md: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | title: This is the blog title 4 | description: blog description 5 | published: false 6 | ---# Page X example 7 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/blog-module/blog-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | import { BlogComponent } from './blog.component'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: ':slug', 9 | component: BlogComponent 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule] 16 | }) 17 | export class BlogRoutingModule {} 18 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/blog-module/blog.component.css: -------------------------------------------------------------------------------- 1 | h1 { 2 | color: rgb(51, 6, 37); 3 | background-color: rgb(248, 211, 236); 4 | padding: 5px; 5 | border-radius: 5px; 6 | width: fit-content; 7 | } 8 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/blog-module/blog.component.html: -------------------------------------------------------------------------------- 1 |

ScullyIo blog content

2 |
3 | 4 | 5 | 6 |
7 |

End of blog content

8 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/blog-module/blog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-blog', 5 | templateUrl: './blog.component.html', 6 | styleUrls: ['./blog.component.css'], 7 | }) 8 | export class BlogComponent implements OnInit { 9 | ngOnInit() {} 10 | 11 | constructor() {} 12 | } 13 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/blog-module/blog.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { ScullyLibModule } from '@scullyio/ng-lib/bundles/scullyio-ng-lib.umd'; 4 | import { BlogRoutingModule } from './blog-routing.module'; 5 | import { BlogComponent } from './blog.component'; 6 | 7 | @NgModule({ 8 | declarations: [BlogComponent], 9 | imports: [CommonModule, BlogRoutingModule, ScullyLibModule] 10 | }) 11 | export class BlogModule {} 12 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/blog/page-1.example.md: -------------------------------------------------------------------------------- 1 | # Page 1 example 2 | 3 | ## or, how to do interesting blog things 4 | 5 | ```typescript 6 | console.log('hello world'); 7 | ``` 8 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/markdown-module/__name@dasherize__-routing.module.ts.template: -------------------------------------------------------------------------------- 1 | import {NgModule} from '@angular/core'; 2 | import {Routes, RouterModule} from '@angular/router'; 3 | 4 | import {<%= classify(name) %>Component} from './<%= dasherize(name) %>.component'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: ':<%= camelize(slug) %>', 9 | component: <%= classify(name) %>Component, 10 | }, 11 | { 12 | path: '**', 13 | component: <%= classify(name) %>Component, 14 | } 15 | ]; 16 | 17 | @NgModule({ 18 | imports: [RouterModule.forChild(routes)], 19 | exports: [RouterModule], 20 | }) 21 | export class <%= classify(name) %>RoutingModule {} 22 | 23 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/markdown-module/__name@dasherize__.component.__style__.template: -------------------------------------------------------------------------------- 1 | h1 { 2 | color:rgb(51, 6, 37); 3 | background-color: rgb(248, 211, 236); 4 | padding: 5px; 5 | border-radius: 5px; 6 | width: fit-content; 7 | } 8 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/markdown-module/__name@dasherize__.component.html.template: -------------------------------------------------------------------------------- 1 |

ScullyIo content

2 |
3 | 4 | 5 | 6 |
7 |

End of content

8 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/files/markdown-module/__name@dasherize__.module.ts.template: -------------------------------------------------------------------------------- 1 | import {CommonModule} from '@angular/common'; 2 | import {NgModule} from '@angular/core'; 3 | import {ScullyLibModule} from '@scullyio/ng-lib'; 4 | import {<%= classify(name) %>RoutingModule} from './<%= dasherize(name) %>-routing.module'; 5 | import {<%= classify(name) %>Component} from './<%= dasherize(name) %>.component'; 6 | 7 | @NgModule({ 8 | declarations: [<%= classify(name) %>Component], 9 | imports: [CommonModule, <%= classify(name) %>RoutingModule, ScullyLibModule], 10 | }) 11 | export class <%= classify(name) %>Module {} 12 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/libs/scully-schematics/src/index.ts -------------------------------------------------------------------------------- /libs/scully-schematics/src/migration.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json", 3 | "schematics": { 4 | "migration-v0": { 5 | "version": "0", 6 | "description": "Updates to scully v0", 7 | "factory": "./ng-update/index#updateToV0" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/ng-add/schema.ts: -------------------------------------------------------------------------------- 1 | export interface Schema { 2 | blog: boolean; 3 | project: string; 4 | renderer: string; 5 | pluginTS: boolean; 6 | local: boolean; 7 | } 8 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/ng-add/version-names.ts: -------------------------------------------------------------------------------- 1 | export const scullyVersion = '^2.1.0'; 2 | export const scullyComponentVersion = '^2.1.0'; 3 | // export const requiredAngularVersionRange = '^9.0.0-rc.4'; 4 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/plugin-ts/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "$id": "@scullyio/init:pluginTS", 4 | "title": "Scully: Create folder and support for custom typescript plugins", 5 | "type": "object", 6 | "properties": { 7 | "project": { 8 | "type": "string", 9 | "description": "Use a non default project from angular.json", 10 | "default": "defaultProject" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/plugin-ts/schema.ts: -------------------------------------------------------------------------------- 1 | export interface Schema { 2 | project: string; 3 | } 4 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/route-discovery/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "$id": "@scullyio/init:discovery-routes", 4 | "title": "Scully: Create a discovery routes", 5 | "type": "object", 6 | "properties": { 7 | "project": { 8 | "type": "string", 9 | "description": "add the project", 10 | "default": "defaultProject" 11 | } 12 | }, 13 | "required": [] 14 | } 15 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/route-discovery/schema.ts: -------------------------------------------------------------------------------- 1 | export interface Schema { 2 | project: string; 3 | } 4 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/scully/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "$id": "@scullyio/init:scully", 4 | "title": "Scully setup schematic", 5 | "type": "object", 6 | "description": "Scully schematics for angular", 7 | "properties": { 8 | "pluginTS": { 9 | "type": "boolean", 10 | "description": "Support for custom typescript plugins", 11 | "default": true 12 | } 13 | }, 14 | "required": [] 15 | } 16 | -------------------------------------------------------------------------------- /libs/scully-schematics/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | -------------------------------------------------------------------------------- /libs/scully-schematics/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "references": [ 4 | { 5 | "path": "./tsconfig.lib.json" 6 | }, 7 | { 8 | "path": "./tsconfig.spec.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /libs/scully-schematics/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "rootDir": "./", 6 | "esModuleInterop": true, 7 | "types": ["jest", "node"], 8 | "composite": true 9 | }, 10 | "include": ["**/*.spec.ts", "**/*.spec.tsx", "**/*.spec.js", "**/*.spec.jsx", "**/*.d.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /libs/scully/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc", 3 | "rules": {}, 4 | "ignorePatterns": ["!**/*"] 5 | } 6 | -------------------------------------------------------------------------------- /libs/scully/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /libs/scully/README.md: -------------------------------------------------------------------------------- 1 | # scully 2 | 3 | This is the Scully CLI repo. for details see our [documentation](https://scully.io) 4 | Scully is the best static site generator for Angular projects looking to embrace the JAMStack. 5 | 6 | How does it work? 7 | Under the hood, Scully analyzes an Angular application, and it generates a static version of it. In addition, it is EASY TO USE because it provides several Angular schematics. 8 | 9 | Scully works on Windows, Linux and macOS. 10 | -------------------------------------------------------------------------------- /libs/scully/src/lib/fileHanderPlugins/html.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin } from '../pluginManagement/pluginRepository'; 2 | 3 | registerPlugin('fileHandler', 'html', async (raw: string) => raw, ['html']); 4 | -------------------------------------------------------------------------------- /libs/scully/src/lib/fileHanderPlugins/index.ts: -------------------------------------------------------------------------------- 1 | export * from './asciidoc'; 2 | export * from './markdown'; 3 | export * from './html'; 4 | -------------------------------------------------------------------------------- /libs/scully/src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from './fileHanderPlugins'; 2 | export * from './pluginManagement'; 3 | export * from './renderPlugins'; 4 | export * from './routerPlugins'; 5 | export * from './systemPlugins'; 6 | export * from './testData'; 7 | export * from './utils'; 8 | -------------------------------------------------------------------------------- /libs/scully/src/lib/pluginManagement/index.ts: -------------------------------------------------------------------------------- 1 | export * from './pluginRepository'; 2 | export * from './pluginConfig'; 3 | export * from './Plugin.interfaces'; 4 | -------------------------------------------------------------------------------- /libs/scully/src/lib/pluginManagement/systemPlugins.ts: -------------------------------------------------------------------------------- 1 | import '../fileHanderPlugins/asciidoc'; 2 | import '../fileHanderPlugins/html'; 3 | import '../fileHanderPlugins/markdown'; 4 | import '../renderPlugins/contentRenderPlugin'; 5 | import '../routerPlugins/contentFolderPlugin'; 6 | import '../renderPlugins/contentTextRenderPlugin'; 7 | import '../routerPlugins/defaultRouterPlugin'; 8 | import '../routerPlugins/ignoredRoutePlugin'; 9 | import '../routerPlugins/jsonRoutePlugin'; 10 | import '../renderPlugins/seoHrefCompletionPlugin'; 11 | import '../renderPlugins/content-render-utils/customMarkdownOptions'; 12 | -------------------------------------------------------------------------------- /libs/scully/src/lib/renderPlugins/content-render-utils/customMarkdownOptions.ts: -------------------------------------------------------------------------------- 1 | export const customMarkdownOptions = (html: string) => { 2 | return html.replace(/\]*\>[^<]*\<\/a\>\{[^}]*\}/g, (val, pos) => { 3 | const [start, rest] = val.split('{:'); 4 | const injectStr = rest.slice(0, -1); 5 | const [initial, end] = start.split('href='); 6 | return `${initial} ${injectStr} href=${end}`; 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /libs/scully/src/lib/renderPlugins/content-render-utils/findComments.ts: -------------------------------------------------------------------------------- 1 | export function findComments(el: Node, data?: string): Node[] | Node | undefined { 2 | const comments = [] as Node[]; 3 | for (const node of Array.from(el.childNodes)) { 4 | if (node.nodeType === 8) { 5 | if (data && node['data'] === data) { 6 | return node; 7 | } 8 | comments.push(node); 9 | } 10 | } 11 | return data ? undefined : comments; 12 | } 13 | -------------------------------------------------------------------------------- /libs/scully/src/lib/renderPlugins/content-render-utils/getIdAttrName.ts: -------------------------------------------------------------------------------- 1 | export function getIdAttrName(attrs: string): string { 2 | try { 3 | return ( 4 | attrs && 5 | attrs 6 | .split(' ') 7 | .find((at: string) => at.trim().startsWith('_ngcontent')) 8 | .split('=')[0] 9 | ); 10 | } catch { 11 | return '6'; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /libs/scully/src/lib/renderPlugins/content-render-utils/getScript.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @returns a string representing the script that parses the page and loads the scullyContent variable. 3 | * The string is kept on one line as the focus is to keep it as small as possible. 4 | */ 5 | export function getScript(ngIdentifier: string): string { 6 | // tslint:disable-next-line:no-unused-expression 7 | return `try {window['scullyContent'] = {cssId:"${ngIdentifier}",html:document.body.innerHTML.split('')[1].split('')[0]};} catch(e) {console.error('scully could not parse content');}`; 8 | } 9 | -------------------------------------------------------------------------------- /libs/scully/src/lib/renderPlugins/content-render-utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './convertAndInjectContent'; 2 | export * from './customMarkdownOptions'; 3 | export * from './findComments'; 4 | export * from './getIdAttrName'; 5 | export * from './getScript'; 6 | export * from './handleFile'; 7 | export * from './injectHtml'; 8 | export * from './readFileAndCheckPrePublishSlug'; 9 | -------------------------------------------------------------------------------- /libs/scully/src/lib/renderPlugins/index.ts: -------------------------------------------------------------------------------- 1 | export * from './contentRenderPlugin'; 2 | export * from './contentTextRenderPlugin'; 3 | export * from './executePlugins'; 4 | export * from './jsdomPlugins'; 5 | export * from './seoHrefCompletionPlugin'; 6 | -------------------------------------------------------------------------------- /libs/scully/src/lib/routerPlugins/defaultRouterPlugin.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin } from '../pluginManagement/pluginRepository'; 2 | import { RoutePlugin } from '../pluginManagement/Plugin.interfaces'; 3 | import { HandledRoute } from './handledRoute.interface'; 4 | 5 | async function defaultRouterPlugin(route: string) { 6 | return [{ route } as HandledRoute]; 7 | } 8 | registerPlugin('router', 'default', defaultRouterPlugin); 9 | -------------------------------------------------------------------------------- /libs/scully/src/lib/routerPlugins/ignoredRoutePlugin.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin } from '../pluginManagement/pluginRepository'; 2 | import { RoutePlugin } from '../pluginManagement/Plugin.interfaces'; 3 | import { HandledRoute } from './handledRoute.interface'; 4 | 5 | /** 6 | * The ignoredPlugin helps to take routes out. 7 | * when you use this plugin, the route will never be rendered. 8 | */ 9 | registerPlugin('router', 'ignored', async (route: string) => [] as HandledRoute[]); 10 | -------------------------------------------------------------------------------- /libs/scully/src/lib/routerPlugins/index.ts: -------------------------------------------------------------------------------- 1 | export * from './addOptionalRoutesPlugin'; 2 | export * from './contentFolderPlugin'; 3 | export * from './defaultRouterPlugin'; 4 | export * from './ignoredRoutePlugin'; 5 | export * from './jsonRoutePlugin'; 6 | export * from './renderTemplate'; 7 | export * from './traverseAppRoutesPlugin'; 8 | export * from './handledRoute.interface'; 9 | -------------------------------------------------------------------------------- /libs/scully/src/lib/systemPlugins/index.ts: -------------------------------------------------------------------------------- 1 | export * from './storeRoutes'; 2 | export * from './writeToFs.plugin'; 3 | -------------------------------------------------------------------------------- /libs/scully/src/lib/testData/index.ts: -------------------------------------------------------------------------------- 1 | export * from './posts-testdata'; 2 | export * from './users-testdata'; 3 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/assertNever.ts: -------------------------------------------------------------------------------- 1 | export function assertNever(x: never): never { 2 | throw new Error('Unexpected object: ' + x); 3 | } 4 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/cache.ts: -------------------------------------------------------------------------------- 1 | export const rawRoutesCache = new Set(); 2 | export const flushRawRoutesCache = () => rawRoutesCache.clear(); 3 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/cacheFolder.ts: -------------------------------------------------------------------------------- 1 | import { scullyConfig } from '@scullyio/scully'; 2 | import { join } from 'path'; 3 | 4 | export const cacheFolder = join( 5 | scullyConfig.homeFolder, 6 | 'node_modules/.cache/scully' 7 | ); 8 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/chunk.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * split an array in multiple chunks 3 | * @param arr 4 | * @param chunkSize 5 | */ 6 | export function chunk(arr: T[], chunkSize: number): T[][] { 7 | return arr.reduce( 8 | (chunks: any[], elm: any, index: number) => { 9 | if (index % chunkSize === 0) { 10 | /** create new chunk */ 11 | chunks.push([]); 12 | } 13 | const currentChunk = chunks[chunks.length - 1]; 14 | currentChunk.push(elm); 15 | return chunks; 16 | }, 17 | [[]] 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/createFolderFor.ts: -------------------------------------------------------------------------------- 1 | import { mkdirSync } from 'fs'; 2 | import { dirname } from 'path'; 3 | export function createFolderFor(file) { 4 | /** drop the /xxx.html part of the route */ 5 | const dirPath = dirname(file); 6 | try { 7 | // @ts-ignore 8 | mkdirSync(dirPath, { recursive: true }); 9 | } catch (err) { 10 | if (err.code !== 'EEXIST') { 11 | throw err; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/deepGet.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns the property if it exists in the object 3 | * @param p string or array describing the property to get (eg result.friends.list) 4 | * @param o the object to extract the data out 5 | */ 6 | export const deepGet = (p: string | string[], o: any) => { 7 | if (typeof p === 'string') { 8 | p = p.split('.'); 9 | } 10 | return p.reduce((xs, x) => (xs && xs[x] ? xs[x] : undefined), o); 11 | }; 12 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/handlers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './defaultAction'; 2 | export * from './handleAllDone'; 3 | export * from './handleRouteDiscoveryDone'; 4 | export * from './handleTravesal'; 5 | export * from './renderParallel'; 6 | export * from './routeDiscovery'; 7 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/handlers/renderPlugin.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin, scullySystem } from '../../pluginManagement'; 2 | import { HandledRoute } from '../../routerPlugins/handledRoute.interface'; 3 | import { renderParallel } from './renderParallel'; 4 | 5 | export const renderPlugin = 'renderPlugin' as const; 6 | registerPlugin(scullySystem, renderPlugin, defaultRenderPlugin); 7 | async function defaultRenderPlugin(handledRoutes: HandledRoute[]) { 8 | /** start handling each route, works in chunked parallel mode */ 9 | await renderParallel(handledRoutes); 10 | } 11 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/performanceIds.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * an constant to keep track of the id's for performance gathering 3 | */ 4 | export const performanceIds = new Set(); 5 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/platform-server/deferred.ts: -------------------------------------------------------------------------------- 1 | export class Deferred { 2 | resolve!: (result?: any) => void; 3 | reject!: (error?: any) => void; 4 | promise = new Promise((rs, rj) => { 5 | this.resolve = rs; 6 | this.reject = rj; 7 | }); 8 | } 9 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/platform-server/index.ts: -------------------------------------------------------------------------------- 1 | // export * from './ps-runner'; 2 | export { enableSPS } from './startupSpS'; 3 | export { Deferred } from './deferred'; 4 | export { SPSRouteRenderer } from './serverPlatformRender'; 5 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/procesmanager/index.ts: -------------------------------------------------------------------------------- 1 | export {Job} from './job' 2 | export {handleJobs} from './handleJobs' 3 | export {TaskWorker} from './TaskWorker' 4 | export {startWorkerListener, workerMessages$, addWorkerTask} from './startWorkerListener' 5 | export {getPool, terminatePool} from './taskPool' 6 | export {Tasks} from './tasks.interface' 7 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/procesmanager/tasks.interface.ts: -------------------------------------------------------------------------------- 1 | /** helpers for inside the actual worker */ 2 | 3 | export interface Tasks { 4 | [x: string]: (...msg: any[]) => any | Promise; 5 | } 6 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/restart.ts: -------------------------------------------------------------------------------- 1 | import { spawn } from 'child_process'; 2 | 3 | export function restartProcess() { 4 | process.on('exit', () => { 5 | spawn(process.argv.shift(), process.argv, { 6 | cwd: process.cwd(), 7 | detached: true, 8 | stdio: 'inherit' 9 | }); 10 | }); 11 | process.exit(); 12 | } 13 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/serverstuff/index.ts: -------------------------------------------------------------------------------- 1 | export * from './addSSL'; 2 | export * from './dataServer'; 3 | export * from './isPortTaken'; 4 | export * from './proxyAdd'; 5 | export * from './staticServer'; 6 | export * from './waitForServerToBeAvailable'; 7 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/serverstuff/isPortTaken.ts: -------------------------------------------------------------------------------- 1 | import { createServer } from 'net'; 2 | 3 | export const isPortTaken = (usedPort: number): Promise => 4 | new Promise((resolve, reject) => { 5 | const tester = createServer() 6 | .once('error', err => { 7 | // tslint:disable-next-line: no-string-literal 8 | if (err['code'] !== 'EADDRINUSE') { 9 | reject(err); 10 | return; 11 | } 12 | resolve(true); 13 | return; 14 | }) 15 | .once('listening', () => { 16 | tester 17 | .once('close', () => { 18 | resolve(false); 19 | }) 20 | .close(); 21 | }) 22 | .listen(usedPort); 23 | }); 24 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/serverstuff/title404.ts: -------------------------------------------------------------------------------- 1 | export const title404 = '404 - URL not provided in the app Scully is serving'; 2 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './routeStorage'; 2 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/services/routeStorage.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin } from '../../pluginManagement'; 2 | import { HandledRoute } from '../../routerPlugins'; 3 | import { Deferred } from "../platform-server/deferred"; 4 | 5 | const deferredRoutes = new Deferred(); 6 | export const getHandledRoutes = () => deferredRoutes.promise; 7 | 8 | /** this plugin will only get called in the "main" thread */ 9 | registerPlugin('routeDiscoveryDone', 'storeAllRoutes', async (routes: HandledRoute[]) => { 10 | deferredRoutes.resolve(routes); 11 | }); 12 | 13 | 14 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/startup/index.ts: -------------------------------------------------------------------------------- 1 | export * from './scullyInit'; 2 | export * from './startBackgroundServer'; 3 | export * from './startUpEnvChecks'; 4 | export * from './startup'; 5 | export * from './watchMode'; 6 | -------------------------------------------------------------------------------- /libs/scully/src/lib/utils/waitForIt.ts: -------------------------------------------------------------------------------- 1 | export function waitForIt(milliSeconds: number) { 2 | return new Promise((resolve) => setTimeout(() => resolve(), milliSeconds)); 3 | } 4 | -------------------------------------------------------------------------------- /libs/universal/README.md: -------------------------------------------------------------------------------- 1 | # @scullyio/universal 2 | 3 | Helpers for rendering Angular aps with scully and universal 4 | 5 | 6 | -------------------------------------------------------------------------------- /libs/universal/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | displayName: 'universal', 3 | preset: '../../jest.preset.js', 4 | setupFilesAfterEnv: ['/src/test-setup.ts'], 5 | globals: { 6 | 'ts-jest': { 7 | tsconfig: '/tsconfig.spec.json', 8 | stringifyContentPathRegex: '\\.(html|svg)$', 9 | }, 10 | }, 11 | coverageDirectory: '../../coverage/libs/universal', 12 | snapshotSerializers: [ 13 | 'jest-preset-angular/build/serializers/no-ng-attributes', 14 | 'jest-preset-angular/build/serializers/ng-snapshot', 15 | 'jest-preset-angular/build/serializers/html-comment', 16 | ], 17 | }; 18 | -------------------------------------------------------------------------------- /libs/universal/ng-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", 3 | "dest": "../../dist/libs/universal", 4 | "lib": { 5 | "entryFile": "src/index.ts", 6 | "umdModuleIds": { 7 | "@scullyio/scully": "@scullyio/scully", 8 | "@scullyio/ng-lib": "@scullyio/ng-lib", 9 | "crypto": "crypto" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /libs/universal/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scullyio/universal", 3 | "version": "0.0.1", 4 | "peerDependencies": { 5 | "@angular/common": "^12.0.0", 6 | "@angular/core": "^12.0.0" 7 | }, 8 | "dependencies": { 9 | "tslib": "^2.0.0" 10 | }, 11 | "devDependencies": { 12 | "@types/node": "^14.14.37" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /libs/universal/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lib/universal.module'; 2 | -------------------------------------------------------------------------------- /libs/universal/src/test-setup.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular'; 2 | -------------------------------------------------------------------------------- /libs/universal/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.lib.json" 8 | }, 9 | { 10 | "path": "./tsconfig.lib.prod.json" 11 | }, 12 | { 13 | "path": "./tsconfig.spec.json" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /libs/universal/tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "target": "es2015", 6 | "declaration": true, 7 | "declarationMap": true, 8 | "inlineSources": true, 9 | "allowJs": true, 10 | "allowSyntheticDefaultImports": true, 11 | "experimentalDecorators": true, 12 | "types": ["node"] 13 | }, 14 | "angularCompilerOptions": { 15 | "skipTemplateCodegen": false, 16 | "strictMetadataEmit": true, 17 | "enableResourceInlining": true, 18 | "enableIvy": true, 19 | "compilationMode": "partial" 20 | }, 21 | "exclude": ["src/test-setup.ts", "**/*.spec.ts"], 22 | "include": ["**/*.ts"] 23 | } 24 | -------------------------------------------------------------------------------- /libs/universal/tsconfig.lib.prod.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.lib.json", 4 | "compilerOptions": { 5 | "declarationMap": false 6 | }, 7 | "angularCompilerOptions": { 8 | "enableIvy": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /libs/universal/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "files": ["src/test-setup.ts"], 9 | "include": ["**/*.spec.ts", "**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /proxy.conf.js: -------------------------------------------------------------------------------- 1 | const PROXY_CONFIG = [ 2 | { 3 | context: ['/api'], 4 | target: 'http://localhost:8200/', 5 | changeOrigin: true, 6 | pathRewrite: { '^/api': '' }, 7 | secure: false, 8 | }, 9 | ]; 10 | 11 | module.exports = PROXY_CONFIG; 12 | -------------------------------------------------------------------------------- /scully.heavy.config.ts: -------------------------------------------------------------------------------- 1 | import { config as original } from './scully.sample-blog.config'; 2 | 3 | export const config = Object.assign({}, original); 4 | 5 | config.routes['/demo/:id'].numberOfPages = 1500; 6 | config.routes['/user/:userId'].userId.resultsHandler = undefined; 7 | /** crank it up a notch, more threads seems more likely to fail. */ 8 | config.maxRenderThreads = 32; 9 | -------------------------------------------------------------------------------- /scully/.gitignore: -------------------------------------------------------------------------------- 1 | **/*.js 2 | **/*.d.ts 3 | **/*.map 4 | -------------------------------------------------------------------------------- /scully/baseconfig.ts: -------------------------------------------------------------------------------- 1 | import { ScullyConfig } from '@scullyio/scully'; 2 | 3 | export const baseConfig: Partial = {}; 4 | -------------------------------------------------------------------------------- /scully/plugins/error.ts: -------------------------------------------------------------------------------- 1 | import { registerPlugin, logWarn } from '@scullyio/scully'; 2 | 3 | const errorPlugin = async (html, options) => { 4 | try { 5 | throw new Error(`new error`); 6 | } catch (e) { 7 | logWarn(`errorPlugin works!`); 8 | } 9 | return undefined; 10 | }; 11 | 12 | const validator = async (config) => []; 13 | registerPlugin('postProcessByHtml', 'errorPlugin', errorPlugin, validator); 14 | -------------------------------------------------------------------------------- /scully/plugins/render-once.ts: -------------------------------------------------------------------------------- 1 | import { findPlugin, HandledRoute, log, routeRenderer, registerPlugin, yellow } from '@scullyio/scully'; 2 | import { scullySystem } from '@scullyio/scully/src/lib/pluginManagement/pluginRepository'; 3 | 4 | export const renderOnce = 'renderOnce' as const; 5 | const render = findPlugin(routeRenderer); 6 | const cache = new Map>(); 7 | 8 | registerPlugin(scullySystem, renderOnce, (route: HandledRoute, config) => { 9 | if (!cache.has(config)) { 10 | cache.set(config, render(route, config)); 11 | } 12 | log(`Cache used for "${yellow(route.route)}"`); 13 | return cache.get(config); 14 | }); 15 | -------------------------------------------------------------------------------- /scully/tsconfig.sample-blog.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "runtime", 5 | "target": "es2020", 6 | "allowJs": true, 7 | "allowSyntheticDefaultImports": true, 8 | "skipDefaultLibCheck": true, 9 | "skipLibCheck": true, 10 | "lib": [ 11 | "ES2020", 12 | "DOM" 13 | ], 14 | "types": [ 15 | "node" 16 | ], 17 | "moduleResolution": "Node", 18 | "module": "CommonJS" 19 | }, 20 | "files": [ 21 | "../apps/sample-blog/src/app/app.sps.module.ts" 22 | ], 23 | "angularCompilerOptions": { 24 | "enableIvy": true, 25 | "compilationMode": "partial" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /scully/tsconfig.scully-docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "runtime", 5 | "target": "es2020", 6 | "allowJs": true, 7 | "allowSyntheticDefaultImports": true, 8 | "skipDefaultLibCheck": true, 9 | "skipLibCheck": true, 10 | "lib": [ 11 | "ES2020", 12 | "DOM" 13 | ], 14 | "types": [ 15 | "node" 16 | ], 17 | "moduleResolution": "Node", 18 | "module": "CommonJS" 19 | }, 20 | "files": [ 21 | "../apps/scully-docs/src/app/app.sps.module.ts" 22 | ], 23 | "angularCompilerOptions": { 24 | "enableIvy": true, 25 | "compilationMode": "partial" 26 | } 27 | } -------------------------------------------------------------------------------- /testexit.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * The above line is needed to be able to run in npx and CI. 5 | */ 6 | const { log, yellow } = require('./dist/libs/scully'); 7 | 8 | log(`I like ${yellow('yellow')}`); 9 | log(process.eventNames().join('\n')); 10 | -------------------------------------------------------------------------------- /tests/assets/blog-files/2014/2/12/asdf.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Deeply embedded' 3 | author: 'Sander Elias' 4 | 'publish date': 2019-11-27T00:00:00.000Z 5 | published: true 6 | description: 'This is the deep folder demo page in this sample.' 7 | slugs: 8 | --- 9 | 10 | # Deep folder 1 11 | 12 | ## its a wild world after all 13 | 14 | ```typescript 15 | console.log('amazing'); 16 | ``` 17 | 18 | Related information [page-3](/blog/page-3) 19 | 20 | [site-map](/home) 21 | -------------------------------------------------------------------------------- /tests/assets/blog-files/foreign-chars.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'This is my post in Russian' 3 | description: 'blog description' 4 | slug: Русский-слаг 5 | --- 6 | 7 | # This is my post with a slug in Russian 8 | 9 | the slug should read: Русский-слаг 10 | -------------------------------------------------------------------------------- /tests/assets/blog-files/page-1.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: My first page 3 | author: Sander Elias 4 | publish date: 2019-11-26 5 | slug: look at_my-urls Cool 6 | slugs: 7 | - 'page-1' 8 | description: This is the first demo page in this sample. 9 | --- 10 | 11 | # Page 1 12 | 13 | ## or, how to do interesting blog things 14 | 15 | ```typescript 16 | console.log('hello world'); 17 | console.log('yah'); 18 | const x = 123; 19 | ``` 20 | 21 | Hello Dolly? 22 | 23 | Related information [page-2](/blog/___UNPUBLISHED___k5nhcflm_SJwD4Z0QDrIHg1PGHo2mrfLZE8sfUsPy) 24 | 25 | [content page](/content/two) 26 | 27 | # Down-under 28 | 29 | [site-map](/home) 30 | -------------------------------------------------------------------------------- /tests/assets/blog-files/page-2.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'My second page' 3 | author: 'Sander Elias' 4 | published: false 5 | description: 'This is the second demo page in this sample.' 6 | slugs: 7 | - ___UNPUBLISHED___k5nhcflm_SJwD4Z0QDrIHg1PGHo2mrfLZE8sfUsPy 8 | - page-2 9 | --- 10 | 11 | # Page 2 12 | 13 | ## its a wild world after all 14 | 15 | Link to [angular](http://angular.io){:target=\_blank} 16 | 17 | ```typescript 18 | console.log('amazing'); 19 | ``` 20 | 21 | Related information [page-3](/blog/page-3) 22 | 23 | [site-map](/home) 24 | -------------------------------------------------------------------------------- /tests/assets/blog-files/page-3.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: My third page 3 | author: Sander Elias 4 | publish date: 2019-11-28 5 | description: At this point, I should write something different in here. 6 | slug: My third page, 7 | slugs: 8 | - page-3 9 | --- 10 | 11 | # Page 3 12 | 13 | ## its a wild world after all 14 | 15 | ```typescript 16 | console.log('amazing'); 17 | ``` 18 | 19 | Related information [page-1](/blog/page-1) 20 | 21 | [site-map](/home) 22 | -------------------------------------------------------------------------------- /tests/assets/blog-files/page-5.md: -------------------------------------------------------------------------------- 1 | # Page 5 2 | -------------------------------------------------------------------------------- /tests/assets/blog-files/scullyio-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/tests/assets/blog-files/scullyio-icon.png -------------------------------------------------------------------------------- /tests/assets/blog-files/test/testing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'My test sub page' 3 | author: 'Sander Elias' 4 | 'publish date': 2019-11-27T00:00:00.000Z 5 | published: true 6 | description: 'This is the second demo page in this sample.' 7 | slugs: 8 | --- 9 | 10 | # Deep sub test 2 11 | 12 | ## its a wild world after all 13 | 14 | ```typescript 15 | console.log('amazing'); 16 | ``` 17 | 18 | Related information [page-3](/blog/page-3) 19 | 20 | [site-map](/home) 21 | -------------------------------------------------------------------------------- /tests/assets/blog-files/testing-empty.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/tests/assets/blog-files/testing-empty.md -------------------------------------------------------------------------------- /tests/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /tests/cypress/integration/doclinkScoll.spec.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | context('docs-link-update-plugin', () => { 4 | it('should have page 6 header', () => { 5 | cy.visit('/blog/page-6'); 6 | cy.get('#page-6').should('have.text', 'Page 6'); 7 | }); 8 | 9 | it('should scroll down by clicking on hash-link', () => { 10 | cy.get('[data-hash=end-of-page]').click(); 11 | cy.get('#end-of-page').should('be.visible'); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /tests/cypress/integration/getcurrent.spec.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | context('RoutesService tests', () => { 4 | it('should start with toplevel', () => { 5 | cy.visit('/home'); 6 | cy.get('main>app-static>h1').should((el) => assert.isTrue(el.html() === 'Toplevel routes in application')); 7 | }); 8 | 9 | it('navigate to all', () => { 10 | cy.get('main > app-static > a:nth-child(2)') 11 | .click() 12 | .get('main>app-static>h1') 13 | .should((el) => assert.isTrue(el.html() === 'All routes in application')); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /tests/jest/src/__tests__/contentText.spec.ts: -------------------------------------------------------------------------------- 1 | import { readPage, replaceIndexNG } from '../test-config.helper'; 2 | import { expect } from '@jest/globals'; 3 | 4 | describe('customText plugin', () => { 5 | it('Check content generated form function', () => { 6 | const index: string = readPage('content/there'); 7 | const cleanIndex = replaceIndexNG(index); 8 | expect(cleanIndex).toMatchSnapshot(); 9 | }); 10 | }); 11 | 12 | describe('customText plugin', () => { 13 | it('Check contentPlugin render', () => { 14 | const index: string = readPage('content/two'); 15 | const cleanIndex = replaceIndexNG(index); 16 | expect(cleanIndex).toMatchSnapshot(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /tests/jest/src/__tests__/exclude.spec.ts: -------------------------------------------------------------------------------- 1 | import { readPage } from '../test-config.helper'; 2 | 3 | describe('guessParserOptions', () => { 4 | it("should remove files from route discovery so that routes aren't present", () => { 5 | let fileExists = true; 6 | // Trying to read the missing file should throw an error. If error doesn't happen, test fails. Meaning... 7 | // if the files exists (which it shouldn't, the test fails. 8 | try { 9 | readPage('/exclude/notpresent'); 10 | } catch ({ message }) { 11 | if (message.includes('" not found at location "')) { 12 | fileExists = false; 13 | } 14 | } 15 | expect(fileExists).toBe(false); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/jest/src/__tests__/extra-users.spec.ts: -------------------------------------------------------------------------------- 1 | import { readPage } from '../test-config.helper'; 2 | 3 | describe('extra-users', () => { 4 | it('should generate user-page 1 and 2', () => { 5 | let fileExists = true; 6 | // Trying to read the missing file should throw an error. If error doesn't happen, test fails. Meaning... 7 | // if the files exists (which it shouldn't, the test fails. 8 | try { 9 | readPage('/user/1'); 10 | readPage('/user/2'); 11 | } catch ({ message }) { 12 | if (message.includes('" not found at location "')) { 13 | fileExists = false; 14 | } 15 | } 16 | expect(fileExists).toBe(true); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /tests/jest/src/__tests__/home.spec.ts: -------------------------------------------------------------------------------- 1 | import { readPage, replaceIndexNG } from '../test-config.helper'; 2 | import { expect } from '@jest/globals'; 3 | 4 | describe('Check list of all', () => { 5 | it('Check clean all list from scully', () => { 6 | const index: string = readPage('/home/all'); 7 | const cleanIndex = replaceIndexNG(index); 8 | expect(cleanIndex).toMatchSnapshot(); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /tests/jest/src/__tests__/manualIdle.spec.ts: -------------------------------------------------------------------------------- 1 | import { replaceIndexNG, readPage } from '../test-config.helper'; 2 | 3 | describe('manualIdleDetection: test manual Idle detection', () => { 4 | const index: string = readPage('manualIdle'); 5 | const cleanIndex = replaceIndexNG(index); 6 | 7 | it('Should have the text "__ManualIdle__"', () => { 8 | expect(cleanIndex.includes('__ManualIdle__')).toBe(true); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /tests/jest/src/__tests__/rawPage.spec.ts: -------------------------------------------------------------------------------- 1 | import { readPage, replaceIndexNG } from '../test-config.helper'; 2 | import { expect } from '@jest/globals'; 3 | 4 | const expectedContent = `The url "/rawData" is not provided in the sampels app, but comes from an external resource`; 5 | 6 | describe('Check list of all', () => { 7 | it('Check clean all list from scully', () => { 8 | const index: string = readPage('/rawRoute'); 9 | expect(index).toContain(expectedContent); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /tests/jest/src/__tests__/users.spec.ts: -------------------------------------------------------------------------------- 1 | import { readPage, replaceIndexNG } from '../test-config.helper'; 2 | import { expect } from '@jest/globals'; 3 | 4 | describe('JsonPlugin: test user List', () => { 5 | it('Check clean blog index by scully', () => { 6 | const index: string = readPage('/user'); 7 | const cleanIndex = replaceIndexNG(index); 8 | expect(cleanIndex).toMatchSnapshot(); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /tests/jest/src/jest.config.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | module.exports = { 4 | preset: '../../../jest.preset.js', 5 | globals: { 6 | 'ts-jest': { 7 | tsconfig: '/tsconfig.spec.json', 8 | }, 9 | }, 10 | testEnvironment: 'jsdom', 11 | 12 | setupFilesAfterEnv: ['../../../tests/jest/src/setup-jest.ts'], 13 | transform: { 14 | '^.+\\.[tj]sx?$': 'ts-jest', 15 | }, 16 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'], 17 | coverageDirectory: '../../../coverage/custom-test-set', 18 | displayName: 'custom-test-set', 19 | }; 20 | -------------------------------------------------------------------------------- /tests/jest/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["node", "jest"] 5 | }, 6 | "include": [], 7 | "files": [], 8 | "references": [ 9 | { 10 | "path": "./tsconfig.spec.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /tests/jest/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": [ 9 | "**/*.spec.ts", 10 | "**/*.spec.tsx", 11 | "**/*.spec.js", 12 | "**/*.spec.jsx", 13 | "**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /testsps.sh: -------------------------------------------------------------------------------- 1 | # # rm -fr node_modules/@scullyio/ng-lib/ 2 | # rm -fr dist/libs/ng-lib 3 | # npx nx build ng-lib --prod 4 | # # npx ngcc -l info 5 | # # npx nx build sps-sample --prod 6 | # rm -fr .scully/__cache 7 | npx nx build plugins-base-href-rewrite 8 | npx nx build scully 9 | node ./dist/libs/scully/src/scully.js --project sample-blog --RSD 10 | -------------------------------------------------------------------------------- /tools/generators/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scullyio/scully/179650fc26b8951e0eaedf9edc0a0f6b9a49fc8b/tools/generators/.gitkeep -------------------------------------------------------------------------------- /tools/listVersions.ts: -------------------------------------------------------------------------------- 1 | import { join } from 'node:path'; 2 | import { folder, getPublishableProjects, readJson } from './utils.js'; 3 | 4 | const currentVersions = await getPublishableProjects(); 5 | 6 | for (const pkg of currentVersions) { 7 | const locOrg = join(folder, './', pkg.root, 'package.json'); 8 | const { name, version } = readJson(locOrg); 9 | console.log(`${name}@${version}`); 10 | } 11 | -------------------------------------------------------------------------------- /tools/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tools", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "./src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "type": "module", 10 | "author": "", 11 | "license": "MIT" 12 | } 13 | -------------------------------------------------------------------------------- /tools/pushtoGit.ts: -------------------------------------------------------------------------------- 1 | import simpleGit, { SimpleGit, SimpleGitOptions } from 'simple-git'; 2 | 3 | export async function pushToGit(commitMessage: string) { 4 | const options: Partial = { 5 | baseDir: process.cwd(), 6 | binary: 'git', 7 | maxConcurrentProcesses: 6, 8 | }; 9 | 10 | const git: SimpleGit = simpleGit(options); 11 | await git.addConfig('user.name', 'workflow-bot'); 12 | await git.addConfig('user.email', 'workflow-bot@users.noreply.github.com'); 13 | await git.add('.'); 14 | await git.commit(commitMessage); 15 | try { 16 | const resp = await git.push(); 17 | } catch (e) { 18 | console.error(e); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tools/tsconfig.tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../dist/tools", 4 | "rootDir": ".", 5 | "target": "ES2020", 6 | "moduleResolution": "Node", 7 | "module": "ESNext", 8 | "lib": ["es2021"], 9 | "types": ["node"] 10 | }, 11 | "include": ["**/*.ts", "./deployRelease.mts"] 12 | } 13 | -------------------------------------------------------------------------------- /tools/updateRelaseFiles.ts: -------------------------------------------------------------------------------- 1 | import { writeFileSync } from 'fs'; 2 | import { join } from 'path'; 3 | import { folder, getPublishableProjects } from './utils'; 4 | 5 | (async () => { 6 | console.log('replacing release checksums files with current version'); 7 | const currentVersions = await getPublishableProjects(); 8 | const releaseName = join(folder, './tools', 'releaseChecksums.release.json'); 9 | const developName = join(folder, './tools', 'releaseChecksums.develop.json'); 10 | writeFileSync(releaseName, JSON.stringify(currentVersions, undefined, 2)); 11 | writeFileSync(developName, JSON.stringify(currentVersions, undefined, 2)); 12 | })(); 13 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "types": ["jest", "node"], 6 | "esModuleInterop": true, 7 | }, 8 | "include": ["tests/jest/src/__tests__/*.spec.ts", "apps/sample-blog/src/app/**/*.d.ts"], 9 | "exclude": ["tests/cypress/**/*.spec.ts"] 10 | } 11 | --------------------------------------------------------------------------------