cloudcommerce 0.0.115 → 0.0.116
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/ecomplus-stores/monocard/functions/core/package.json +1 -1
- package/ecomplus-stores/monocard/functions/events/package.json +2 -2
- package/ecomplus-stores/monocard/functions/modules/package.json +2 -2
- package/ecomplus-stores/monocard/functions/passport/package.json +2 -2
- package/ecomplus-stores/monocard/functions/ssr/.eslintrc.cjs +6 -0
- package/ecomplus-stores/monocard/functions/ssr/content/contacts.json +3 -3
- package/ecomplus-stores/monocard/functions/ssr/content/settings.json +0 -7
- package/ecomplus-stores/monocard/functions/ssr/package.json +10 -4
- package/ecomplus-stores/monocard/functions/ssr/public/assets/fonts/FavoritPro-Regular.woff2 +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/fonts/MyriadPro-Regular.woff2 +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/lotties/img_1.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/lotties/phone-nfc.json +1 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/fluxo.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/padronagem-tilada.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/sua-logo-aqui.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/DemoVideo.vue +5 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/HowItWorksAccordion.vue +32 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/LottiePhoneNFC.vue +19 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/MonocardCustomizer.vue +358 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/TheHeader.vue +40 -3
- package/ecomplus-stores/monocard/functions/ssr/src/components/TopBar.vue +10 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/header/HeaderButtonLink.vue +5 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/header/HeaderButtons.vue +59 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/header/HeaderNav.vue +61 -0
- package/ecomplus-stores/monocard/functions/ssr/src/components/header/HeaderNavLink.vue +5 -0
- package/ecomplus-stores/monocard/functions/ssr/src/layouts/Base.astro +58 -0
- package/ecomplus-stores/monocard/functions/ssr/src/layouts/Pages.astro +18 -41
- package/ecomplus-stores/monocard/functions/ssr/src/layouts/PagesHeader.astro +51 -0
- package/{packages/storefront/src/lib → ecomplus-stores/monocard/functions/ssr/src}/main/Fallback.astro +0 -0
- package/ecomplus-stores/monocard/functions/ssr/src/main/Home.astro +63 -0
- package/{packages/storefront/src/lib → ecomplus-stores/monocard/functions/ssr/src}/main/Wildcard.astro +0 -0
- package/ecomplus-stores/monocard/functions/ssr/src/pages/[...slug].astro +2 -2
- package/ecomplus-stores/monocard/functions/ssr/src/pages/comprar/index.astro +45 -0
- package/ecomplus-stores/monocard/functions/ssr/src/pages/index.astro +3 -3
- package/{packages/storefront/src/components/.gitkeep → ecomplus-stores/monocard/functions/ssr/src/pages/monocard.astro} +0 -0
- package/ecomplus-stores/monocard/functions/ssr/tsconfig.json +14 -1
- package/ecomplus-stores/monocard/package.json +1 -1
- package/package.json +8 -8
- package/packages/api/lib/types.d.ts +14 -3
- package/packages/api/package.json +1 -1
- package/packages/api/src/types.ts +35 -12
- package/packages/apps/correios/package.json +1 -1
- package/packages/apps/custom-shipping/package.json +1 -1
- package/packages/apps/discounts/package.json +1 -1
- package/packages/apps/frenet/package.json +1 -1
- package/packages/apps/mercadopago/package.json +1 -1
- package/packages/apps/tiny-erp/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/config/lib/config.js +12 -4
- package/packages/config/lib/config.js.map +1 -1
- package/packages/config/package.json +1 -1
- package/packages/config/src/config.ts +12 -4
- package/packages/events/package.json +2 -2
- package/packages/firebase/package.json +1 -1
- package/packages/i18n/package.json +1 -1
- package/packages/modules/package.json +1 -1
- package/packages/modules/src/firebase/serve-modules-api.ts +1 -0
- package/packages/passport/package.json +1 -1
- package/packages/passport/src/firebase/authenticate-customer.ts +1 -1
- package/packages/passport/src/firebase/serve-passport-api.ts +2 -0
- package/packages/ssr/package.json +3 -3
- package/packages/storefront/astro.config.mjs +22 -17
- package/packages/storefront/package.json +6 -7
- package/packages/storefront/scripts/prepare-monorepo.sh +6 -0
- package/packages/storefront/src/env.d.ts +1 -1
- package/packages/storefront/src/lib/assets/pico.css +12 -11
- package/packages/storefront/src/lib/components/ADrawer.vue +33 -21
- package/packages/storefront/src/lib/components/LoginDrawer.vue +7 -13
- package/packages/storefront/src/lib/components/LoginForm.vue +3 -1
- package/packages/storefront/src/lib/layouts/Base.astro +3 -3
- package/packages/storefront/src/lib/layouts/BaseStateJson.astro +5 -0
- package/packages/storefront/src/lib/ssr-context.ts +6 -1
- package/packages/storefront/src/lib/state/customer-session.ts +1 -1
- package/packages/storefront/src/lib/types/cms-code.d.ts +1 -1
- package/packages/storefront/src/lib/types/cms-contacts.d.ts +1 -1
- package/packages/storefront/src/lib/types/cms-header.d.ts +1 -1
- package/packages/storefront/src/lib/types/cms-settings.d.ts +1 -1
- package/packages/storefront/src/lib/types/cms-social.d.ts +1 -1
- package/packages/storefront/tailwind.config.cjs +76 -1
- package/packages/storefront/tsconfig.json +4 -1
- package/packages/storefront/uno.config.ts +12 -31
- package/packages/types/package.json +1 -1
- package/ecomplus-stores/monocard/functions/ssr/public/assets/icons/bootstrap-icons/font/storefront-icons.woff2 +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/icons/feather-icons/font/storefront-icons.woff2 +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/icons/font-awesome/font/storefront-icons.woff2 +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/icons/line-awesome/font/storefront-icons.woff2 +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/icons/tabler-icons/font/storefront-icons.woff2 +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/img-placeholder.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/payments.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/banner1.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/banner2.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/banner2.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/headless.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/headphone.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/headphone.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/passion.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/passion.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/pwa-reliable.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/rect8589.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/rect859.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/rect89.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/rect89.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/ssl-safe.png +0 -0
- package/packages/storefront/content/blog.json +0 -18
- package/packages/storefront/content/brands.json +0 -24
- package/packages/storefront/content/categories.json +0 -24
- package/packages/storefront/content/code.json +0 -5
- package/packages/storefront/content/collections.json +0 -24
- package/packages/storefront/content/contacts.json +0 -13
- package/packages/storefront/content/footer.json +0 -46
- package/packages/storefront/content/header.json +0 -35
- package/packages/storefront/content/home.json +0 -45
- package/packages/storefront/content/info.json +0 -18
- package/packages/storefront/content/maintenance.json +0 -6
- package/packages/storefront/content/menu.json +0 -6
- package/packages/storefront/content/pages/contato.json +0 -6
- package/packages/storefront/content/pages/entrega.json +0 -6
- package/packages/storefront/content/pages/faq.json +0 -6
- package/packages/storefront/content/pages/pagamentos.json +0 -6
- package/packages/storefront/content/pages/privacidade.json +0 -6
- package/packages/storefront/content/pages/sobre-nos.json +0 -6
- package/packages/storefront/content/pages/termos.json +0 -6
- package/packages/storefront/content/pages/trocas.json +0 -6
- package/packages/storefront/content/posts/esta-loja-e-um-pwa.json +0 -9
- package/packages/storefront/content/products.json +0 -32
- package/packages/storefront/content/search.json +0 -8
- package/packages/storefront/content/settings.json +0 -21
- package/packages/storefront/content/social.json +0 -5
- package/packages/storefront/content/widgets/analytics.json +0 -11
- package/packages/storefront/content/widgets/compre-confie.json +0 -11
- package/packages/storefront/content/widgets/ebit.json +0 -11
- package/packages/storefront/content/widgets/fb-pixel.json +0 -12
- package/packages/storefront/content/widgets/gmc-ratings.json +0 -12
- package/packages/storefront/content/widgets/minicart.json +0 -6
- package/packages/storefront/content/widgets/offers-notification.json +0 -11
- package/packages/storefront/content/widgets/opinioes-verificadas.json +0 -18
- package/packages/storefront/content/widgets/product-card.json +0 -10
- package/packages/storefront/content/widgets/product.json +0 -13
- package/packages/storefront/content/widgets/search-engine.json +0 -8
- package/packages/storefront/content/widgets/search.json +0 -6
- package/packages/storefront/content/widgets/tag-manager.json +0 -12
- package/packages/storefront/content/widgets/tawkto.json +0 -12
- package/packages/storefront/content/widgets/trustvox.json +0 -15
- package/packages/storefront/content/widgets/user.json +0 -5
- package/packages/storefront/dist/server/assets/_...slug_.648f7d81.css +0 -4
- package/packages/storefront/dist/server/manifest.webmanifest +0 -1
- package/packages/storefront/dist/server/registerSW.js +0 -1
- package/packages/storefront/public/admin/config.json +0 -1
- package/packages/storefront/public/assets/cms-preview.css +0 -274
- package/packages/storefront/public/assets/cms.css +0 -114
- package/packages/storefront/public/assets/cvv.png +0 -0
- package/packages/storefront/public/assets/icons/bootstrap-icons/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/public/assets/icons/feather-icons/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/public/assets/icons/font-awesome/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/public/assets/icons/line-awesome/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/public/assets/icons/tabler-icons/font/storefront-icons.woff2 +0 -0
- package/packages/storefront/public/assets/img-placeholder.png +0 -0
- package/packages/storefront/public/assets/payments.png +0 -0
- package/packages/storefront/public/assets/ssl-safe.png +0 -0
- package/packages/storefront/public/img/icon.png +0 -0
- package/packages/storefront/public/img/large-icon.png +0 -0
- package/packages/storefront/public/img/uploads/banner1.png +0 -0
- package/packages/storefront/public/img/uploads/banner2.png +0 -0
- package/packages/storefront/public/img/uploads/banner2.webp +0 -0
- package/packages/storefront/public/img/uploads/favicon.png +0 -0
- package/packages/storefront/public/img/uploads/headless.png +0 -0
- package/packages/storefront/public/img/uploads/headphone.png +0 -0
- package/packages/storefront/public/img/uploads/headphone.webp +0 -0
- package/packages/storefront/public/img/uploads/icon.png +0 -0
- package/packages/storefront/public/img/uploads/large-icon.png +0 -0
- package/packages/storefront/public/img/uploads/logo.png +0 -0
- package/packages/storefront/public/img/uploads/logo.webp +0 -0
- package/packages/storefront/public/img/uploads/og-image.png +0 -0
- package/packages/storefront/public/img/uploads/passion.png +0 -0
- package/packages/storefront/public/img/uploads/passion.webp +0 -0
- package/packages/storefront/public/img/uploads/pwa-reliable.png +0 -0
- package/packages/storefront/public/img/uploads/rect8589.png +0 -0
- package/packages/storefront/public/img/uploads/rect859.png +0 -0
- package/packages/storefront/public/img/uploads/rect89.png +0 -0
- package/packages/storefront/public/img/uploads/rect89.webp +0 -0
- package/packages/storefront/public/img/uploads/ssl-safe.png +0 -0
- package/packages/storefront/public/robots.txt +0 -8
- package/packages/storefront/scripts/prerelease.sh +0 -4
- package/packages/storefront/src/layouts/Pages.astro +0 -38
- package/packages/storefront/src/lib/components/TheHeader.vue +0 -49
- package/packages/storefront/src/lib/components/TopBar.vue +0 -133
- package/packages/storefront/src/lib/layouts/Checkout.astro +0 -0
- package/packages/storefront/src/lib/layouts/Pages.astro +0 -26
- package/packages/storefront/src/lib/layouts/PagesHeader.astro +0 -116
- package/packages/storefront/src/lib/main/Home.astro +0 -19
- package/packages/storefront/src/pages/[...slug].astro +0 -36
- package/packages/storefront/src/pages/app/account.astro +0 -0
- package/packages/storefront/src/pages/app/index.astro +0 -0
- package/packages/storefront/src/pages/fallback.astro +0 -19
- package/packages/storefront/src/pages/index.astro +0 -26
- package/packages/storefront/src/scripts/InlineScripts.astro +0 -11
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { PageContext } from '@@storefront/ssr-context';
|
|
3
|
+
import { getImage } from '@@storefront/ssr/image';
|
|
4
|
+
import TopBar from '@@components/TopBar.vue';
|
|
5
|
+
import TheHeader from '@@components/TheHeader.vue';
|
|
6
|
+
import HeaderNav from '@@components/header/HeaderNav.vue';
|
|
7
|
+
import HeaderButtons from '@@components/header/HeaderButtons.vue';
|
|
8
|
+
|
|
9
|
+
export interface Props {
|
|
10
|
+
pageContext: PageContext;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const {
|
|
14
|
+
pageContext: {
|
|
15
|
+
apiState,
|
|
16
|
+
settings,
|
|
17
|
+
},
|
|
18
|
+
} = Astro.props as Props;
|
|
19
|
+
const loginDrawerAdditionalLinks = [{
|
|
20
|
+
href: 'https://mono.direct/login',
|
|
21
|
+
innerHTML: '<i class="i-pencil-square mr-1"></i> Gerenciar conta Monocard',
|
|
22
|
+
}];
|
|
23
|
+
|
|
24
|
+
const logo = {
|
|
25
|
+
...await getImage({
|
|
26
|
+
src: settings.logo,
|
|
27
|
+
width: 150,
|
|
28
|
+
format: 'webp',
|
|
29
|
+
quality: 80,
|
|
30
|
+
}) as any,
|
|
31
|
+
alt: settings.name,
|
|
32
|
+
};
|
|
33
|
+
const logoAltHeading = Astro.url.pathname === '/' ? 'h1' : 'h2';
|
|
34
|
+
const { categories } = apiState;
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
<Fragment>
|
|
38
|
+
<slot name="top-bar">
|
|
39
|
+
<TopBar />
|
|
40
|
+
</slot>
|
|
41
|
+
<slot name="header">
|
|
42
|
+
<TheHeader { logo } logoAltHeading={logoAltHeading}>
|
|
43
|
+
<Fragment slot="nav">
|
|
44
|
+
<HeaderNav categories={categories} />
|
|
45
|
+
</Fragment>
|
|
46
|
+
<Fragment slot="buttons">
|
|
47
|
+
<HeaderButtons client:idle { loginDrawerAdditionalLinks } />
|
|
48
|
+
</Fragment>
|
|
49
|
+
</TheHeader>
|
|
50
|
+
</slot>
|
|
51
|
+
</Fragment>
|
|
File without changes
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { PageContext } from '@@storefront/ssr-context';
|
|
3
|
+
import api from '@cloudcommerce/api';
|
|
4
|
+
import LottiePhoneNFC from '@@components/LottiePhoneNFC.vue';
|
|
5
|
+
import HowItWorksAccordion from '~/components/HowItWorksAccordion.vue';
|
|
6
|
+
import DemoVideo from '~/components/DemoVideo.vue';
|
|
7
|
+
|
|
8
|
+
export interface Props {
|
|
9
|
+
pageContext: PageContext;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const products = (await api.get('products')).data.result;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<main class="mt-0 pt-0">
|
|
16
|
+
<article class="my-0 bg-surface">
|
|
17
|
+
<div class="container">
|
|
18
|
+
<div class="grid grid-cols-1 lg:grid-cols-7 items-center xl:px-20">
|
|
19
|
+
<div class="lg:col-span-3 pt-5 lg:py-18 xl:py-20 text-right">
|
|
20
|
+
<h2 class="text-6xl font-bold">O seu cartão definitivo</h2>
|
|
21
|
+
<p class="text-lg">
|
|
22
|
+
O cartão de visitas eletrônico veio para revolucionar o modo como você compartilha suas informações.
|
|
23
|
+
</p>
|
|
24
|
+
<a role="button" href="/produtos">Compre agora</a>
|
|
25
|
+
<div class="pt-7 xl:pt-10 text-sm">
|
|
26
|
+
<div class="flex items-center justify-end">
|
|
27
|
+
<b class="text-lg">Instantâneo</b>
|
|
28
|
+
<i class="i-wpf:define-location text-2xl ml-2"></i>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="mt-2 mb-4">Compartilhe suas informações com um toque</div>
|
|
31
|
+
<div class="flex items-center justify-end">
|
|
32
|
+
<b class="text-lg">Fácil e compatível</b>
|
|
33
|
+
<i class="i-wpf:nfc-checkpoint text-2xl ml-2"></i>
|
|
34
|
+
<i class="i-wpf:android text-2xl ml-1"></i>
|
|
35
|
+
<i class="i-wpf:iphone text-2xl ml-1"></i>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="mt-2">
|
|
38
|
+
Seus prospects não precisam de app
|
|
39
|
+
<br>Funciona em Android e iPhone
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="lg:col-span-4">
|
|
44
|
+
<LottiePhoneNFC client:only />
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</article>
|
|
49
|
+
<section class="container py-20">
|
|
50
|
+
<div class="md:flex gap-16 items-center">
|
|
51
|
+
<div class="grow">
|
|
52
|
+
<h2><a href="#compre-agora">Escolha o seu Monocard</a></h2>
|
|
53
|
+
<p class="text-lg">
|
|
54
|
+
No momento da compra você decide o Monocard que mais combina com
|
|
55
|
+
você ou sua empresa. Opte pela versão clássica ou personalizada.
|
|
56
|
+
</p>
|
|
57
|
+
<HowItWorksAccordion />
|
|
58
|
+
</div>
|
|
59
|
+
<DemoVideo />
|
|
60
|
+
</div>
|
|
61
|
+
</section>
|
|
62
|
+
<section id="compre-agora"></section>
|
|
63
|
+
</main>
|
|
File without changes
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
import api from '@cloudcommerce/api';
|
|
3
3
|
import loadPageContext, { PageContext } from '@cloudcommerce/storefront/src/lib/ssr-context';
|
|
4
|
-
import WildcardMain from '
|
|
5
|
-
import PagesLayout from '
|
|
4
|
+
import WildcardMain from '~/main/Wildcard.astro';
|
|
5
|
+
import PagesLayout from '~/layouts/Pages.astro';
|
|
6
6
|
|
|
7
7
|
if (String(Astro.params.slug).endsWith('.css.map')) {
|
|
8
8
|
return new Response(null, { status: 404 });
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
import loadPageContext, { PageContext } from '@@storefront/ssr-context';
|
|
3
|
+
import PagesLayout from '~/layouts/Pages.astro';
|
|
4
|
+
import MonocardCustomizer from '~/components/MonocardCustomizer.vue';
|
|
5
|
+
import HowItWorksAccordion from '~/components/HowItWorksAccordion.vue';
|
|
6
|
+
import DemoVideo from '~/components/DemoVideo.vue';
|
|
7
|
+
|
|
8
|
+
let pageContext: PageContext;
|
|
9
|
+
let loadError: any;
|
|
10
|
+
try {
|
|
11
|
+
pageContext = await loadPageContext(Astro);
|
|
12
|
+
} catch (err) {
|
|
13
|
+
if (err.astroResponse) {
|
|
14
|
+
return err.astroResponse;
|
|
15
|
+
}
|
|
16
|
+
loadError = err;
|
|
17
|
+
}
|
|
18
|
+
const monocard = await (await fetch('https://ioapi.ecvol.com/51301/v1/products/634830dc73321213f8aa199f.json')).json();
|
|
19
|
+
const monocardWithLogo = await (await fetch('https://ioapi.ecvol.com/51301/v1/products/62eab3eaeb85911216a3c430.json')).json();
|
|
20
|
+
const inlineClientJS = `
|
|
21
|
+
window.monocard = ${JSON.stringify(monocard)};
|
|
22
|
+
window.monocardWithLogo = ${JSON.stringify(monocardWithLogo)};`;
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
<!DOCTYPE html>
|
|
26
|
+
<html lang={pageContext?.lang.replace('_', '-')}>
|
|
27
|
+
{pageContext &&
|
|
28
|
+
<PagesLayout pageContext={pageContext}>
|
|
29
|
+
<script is:inline set:html={inlineClientJS} />
|
|
30
|
+
<MonocardCustomizer client:load {monocard} />
|
|
31
|
+
<div class="max-w-3xl mx-auto mt-14">
|
|
32
|
+
<HowItWorksAccordion isStartOpen={true} />
|
|
33
|
+
<div class="my-10 text-center">
|
|
34
|
+
<a id="como-funciona"></a>
|
|
35
|
+
<DemoVideo width="900" />
|
|
36
|
+
<a href="#comprar" role="button" class="text-xl mt-10">
|
|
37
|
+
<i class="i-arrow-up-circle mr-1"></i>
|
|
38
|
+
Crie seu Monocard
|
|
39
|
+
</a>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</PagesLayout>
|
|
43
|
+
}
|
|
44
|
+
{loadError && <Fragment set:html={loadError.responseHTML} />}
|
|
45
|
+
</html>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
import loadPageContext, { PageContext } from '
|
|
3
|
-
import HomeMain from '
|
|
4
|
-
import PagesLayout from '
|
|
2
|
+
import loadPageContext, { PageContext } from '@@storefront/ssr-context';
|
|
3
|
+
import HomeMain from '~/main/Home.astro';
|
|
4
|
+
import PagesLayout from '~/layouts/Pages.astro';
|
|
5
5
|
|
|
6
6
|
let pageContext: PageContext;
|
|
7
7
|
let loadError: any;
|
|
File without changes
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"extends": "@cloudcommerce/storefront/tsconfig.json"
|
|
2
|
+
"extends": "@cloudcommerce/storefront/tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"paths": {
|
|
6
|
+
"@@i18n": ["./node_modules/@cloudcommerce/i18n/src/pt_br.ts"],
|
|
7
|
+
"@@storefront/*": ["./node_modules/@cloudcommerce/storefront/src/lib/*"],
|
|
8
|
+
"@@components/*": [
|
|
9
|
+
"./src/components/*",
|
|
10
|
+
"./node_modules/@cloudcommerce/storefront/src/lib/components/*",
|
|
11
|
+
],
|
|
12
|
+
"~/*": ["./src/*"],
|
|
13
|
+
"content/*": ["./content/*"],
|
|
14
|
+
}
|
|
15
|
+
}
|
|
3
16
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloudcommerce",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.116",
|
|
5
5
|
"description": "Open fair-code headless commerce platform: API-first, microservices based, event driven and cloud native",
|
|
6
6
|
"main": "packages/api/lib/index.js",
|
|
7
7
|
"author": "E-Com Club Softwares para E-commerce <ti@e-com.club>",
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
"@commitlint/cli": "^17.1.2",
|
|
20
20
|
"@commitlint/config-conventional": "^17.1.0",
|
|
21
21
|
"@commitlint/rules": "^17.0.0",
|
|
22
|
-
"@types/node": "
|
|
23
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
24
|
-
"@typescript-eslint/parser": "^5.
|
|
25
|
-
"esbuild": "^0.15.
|
|
22
|
+
"@types/node": "18.8.0",
|
|
23
|
+
"@typescript-eslint/eslint-plugin": "^5.40.0",
|
|
24
|
+
"@typescript-eslint/parser": "^5.40.0",
|
|
25
|
+
"esbuild": "^0.15.11",
|
|
26
26
|
"eslint": "^8.25.0",
|
|
27
27
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
28
28
|
"eslint-plugin-import": "^2.26.0",
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
"node-fetch": "^3.2.10",
|
|
32
32
|
"standard-version": "^9.5.0",
|
|
33
33
|
"ts-node": "^10.9.1",
|
|
34
|
-
"turbo": "^1.5.
|
|
34
|
+
"turbo": "^1.5.6",
|
|
35
35
|
"typescript": "^4.8.4",
|
|
36
36
|
"uglify-js": "^3.17.3",
|
|
37
|
-
"vite": "^3.1.
|
|
38
|
-
"vitest": "^0.24.
|
|
37
|
+
"vite": "^3.1.8",
|
|
38
|
+
"vitest": "^0.24.3",
|
|
39
39
|
"zx": "^7.1.1"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
@@ -41,12 +41,23 @@ declare type BaseListResultMeta = {
|
|
|
41
41
|
limit: number;
|
|
42
42
|
fields: Array<string>;
|
|
43
43
|
};
|
|
44
|
-
declare type ListEndpoint<TResource extends Resource> = TResource | `${TResource}?${string}`;
|
|
45
44
|
declare type ListResultDocs<Document extends any> = Array<Partial<Document> & {
|
|
46
45
|
_id: ResourceId;
|
|
47
46
|
}>;
|
|
47
|
+
declare type ProductsList = ListResultDocs<Products>;
|
|
48
|
+
declare type CategoriesList = ListResultDocs<Categories>;
|
|
49
|
+
declare type BrandsList = ListResultDocs<Brands>;
|
|
50
|
+
declare type CollectionsList = ListResultDocs<Collections>;
|
|
51
|
+
declare type GridsList = ListResultDocs<Grids>;
|
|
52
|
+
declare type CartsList = ListResultDocs<Carts>;
|
|
53
|
+
declare type OrdersList = ListResultDocs<Orders>;
|
|
54
|
+
declare type CustomersList = ListResultDocs<Customers>;
|
|
55
|
+
declare type StoresList = ListResultDocs<Stores>;
|
|
56
|
+
declare type ApplicationsList = ListResultDocs<Applications>;
|
|
57
|
+
declare type AuthenticationsList = ListResultDocs<Authentications>;
|
|
58
|
+
declare type ListEndpoint<TResource extends Resource> = TResource | `${TResource}?${string}`;
|
|
48
59
|
declare type ResourceListResult<TEndpoint extends ResourceOpQuery> = {
|
|
49
|
-
result: TEndpoint extends ListEndpoint<'products'> ?
|
|
60
|
+
result: TEndpoint extends ListEndpoint<'products'> ? ProductsList : TEndpoint extends ListEndpoint<'categories'> ? CategoriesList : TEndpoint extends ListEndpoint<'brands'> ? BrandsList : TEndpoint extends ListEndpoint<'collections'> ? CollectionsList : TEndpoint extends ListEndpoint<'grids'> ? GridsList : TEndpoint extends ListEndpoint<'carts'> ? CartsList : TEndpoint extends ListEndpoint<'orders'> ? OrdersList : TEndpoint extends ListEndpoint<'customers'> ? CustomersList : TEndpoint extends ListEndpoint<'stores'> ? StoresList : TEndpoint extends ListEndpoint<'applications'> ? ApplicationsList : TEndpoint extends ListEndpoint<'authentications'> ? AuthenticationsList : never;
|
|
50
61
|
meta: BaseListResultMeta & {
|
|
51
62
|
count?: number;
|
|
52
63
|
sort: Array<{
|
|
@@ -118,4 +129,4 @@ declare type ErrorBody = {
|
|
|
118
129
|
};
|
|
119
130
|
more_info?: string;
|
|
120
131
|
};
|
|
121
|
-
export type { Products, Categories, Brands, Collections, Grids, Carts, Orders, Customers, Stores, Applications, Authentications, ProductSet, CategorySet, BrandSet, CollectionSet, GridSet, CartSet, OrderSet, CustomerSet, StoreSet, ApplicationSet, AuthenticationSet, Resource, ResourceId, ResourceAndId, ResourceOpQuery, Endpoint, Method, Config, ResourceListResult, EventsResult, ResponseBody, RequestBody, ErrorBody, };
|
|
132
|
+
export type { Products, Categories, Brands, Collections, Grids, Carts, Orders, Customers, Stores, Applications, Authentications, ProductSet, CategorySet, BrandSet, CollectionSet, GridSet, CartSet, OrderSet, CustomerSet, StoreSet, ApplicationSet, AuthenticationSet, ProductsList, CategoriesList, BrandsList, CollectionsList, GridsList, CartsList, OrdersList, CustomersList, StoresList, ApplicationsList, AuthenticationsList, Resource, ResourceId, ResourceAndId, ResourceOpQuery, Endpoint, Method, Config, ResourceListResult, EventsResult, ResponseBody, RequestBody, ErrorBody, };
|
|
@@ -72,21 +72,33 @@ type BaseListResultMeta = {
|
|
|
72
72
|
fields: Array<string>,
|
|
73
73
|
};
|
|
74
74
|
|
|
75
|
-
type ListEndpoint<TResource extends Resource> = TResource | `${TResource}?${string}`;
|
|
76
75
|
type ListResultDocs<Document extends any> = Array<Partial<Document> & { _id: ResourceId }>;
|
|
76
|
+
type ProductsList = ListResultDocs<Products>;
|
|
77
|
+
type CategoriesList = ListResultDocs<Categories>;
|
|
78
|
+
type BrandsList = ListResultDocs<Brands>;
|
|
79
|
+
type CollectionsList = ListResultDocs<Collections>;
|
|
80
|
+
type GridsList = ListResultDocs<Grids>;
|
|
81
|
+
type CartsList = ListResultDocs<Carts>;
|
|
82
|
+
type OrdersList = ListResultDocs<Orders>;
|
|
83
|
+
type CustomersList = ListResultDocs<Customers>;
|
|
84
|
+
type StoresList = ListResultDocs<Stores>;
|
|
85
|
+
type ApplicationsList = ListResultDocs<Applications>;
|
|
86
|
+
type AuthenticationsList = ListResultDocs<Authentications>;
|
|
87
|
+
|
|
88
|
+
type ListEndpoint<TResource extends Resource> = TResource | `${TResource}?${string}`;
|
|
77
89
|
type ResourceListResult<TEndpoint extends ResourceOpQuery> = {
|
|
78
90
|
result:
|
|
79
|
-
TEndpoint extends ListEndpoint<'products'> ?
|
|
80
|
-
TEndpoint extends ListEndpoint<'categories'> ?
|
|
81
|
-
TEndpoint extends ListEndpoint<'brands'> ?
|
|
82
|
-
TEndpoint extends ListEndpoint<'collections'> ?
|
|
83
|
-
TEndpoint extends ListEndpoint<'grids'> ?
|
|
84
|
-
TEndpoint extends ListEndpoint<'carts'> ?
|
|
85
|
-
TEndpoint extends ListEndpoint<'orders'> ?
|
|
86
|
-
TEndpoint extends ListEndpoint<'customers'> ?
|
|
87
|
-
TEndpoint extends ListEndpoint<'stores'> ?
|
|
88
|
-
TEndpoint extends ListEndpoint<'applications'> ?
|
|
89
|
-
TEndpoint extends ListEndpoint<'authentications'> ?
|
|
91
|
+
TEndpoint extends ListEndpoint<'products'> ? ProductsList :
|
|
92
|
+
TEndpoint extends ListEndpoint<'categories'> ? CategoriesList :
|
|
93
|
+
TEndpoint extends ListEndpoint<'brands'> ? BrandsList :
|
|
94
|
+
TEndpoint extends ListEndpoint<'collections'> ? CollectionsList :
|
|
95
|
+
TEndpoint extends ListEndpoint<'grids'> ? GridsList :
|
|
96
|
+
TEndpoint extends ListEndpoint<'carts'> ? CartsList :
|
|
97
|
+
TEndpoint extends ListEndpoint<'orders'> ? OrdersList :
|
|
98
|
+
TEndpoint extends ListEndpoint<'customers'> ? CustomersList :
|
|
99
|
+
TEndpoint extends ListEndpoint<'stores'> ? StoresList :
|
|
100
|
+
TEndpoint extends ListEndpoint<'applications'> ? ApplicationsList :
|
|
101
|
+
TEndpoint extends ListEndpoint<'authentications'> ? AuthenticationsList :
|
|
90
102
|
never,
|
|
91
103
|
meta: BaseListResultMeta & {
|
|
92
104
|
count?: number,
|
|
@@ -219,6 +231,17 @@ export type {
|
|
|
219
231
|
StoreSet,
|
|
220
232
|
ApplicationSet,
|
|
221
233
|
AuthenticationSet,
|
|
234
|
+
ProductsList,
|
|
235
|
+
CategoriesList,
|
|
236
|
+
BrandsList,
|
|
237
|
+
CollectionsList,
|
|
238
|
+
GridsList,
|
|
239
|
+
CartsList,
|
|
240
|
+
OrdersList,
|
|
241
|
+
CustomersList,
|
|
242
|
+
StoresList,
|
|
243
|
+
ApplicationsList,
|
|
244
|
+
AuthenticationsList,
|
|
222
245
|
Resource,
|
|
223
246
|
ResourceId,
|
|
224
247
|
ResourceAndId,
|
|
@@ -12,14 +12,18 @@ const self = globalThis.__cloudCommerce || {
|
|
|
12
12
|
config: {},
|
|
13
13
|
};
|
|
14
14
|
globalThis.__cloudCommerce = self;
|
|
15
|
+
_env.ECOM_LANG = _env.ECOM_LANG || DEFAULT_LANG;
|
|
16
|
+
_env.ECOM_CURRENCY = _env.ECOM_CURRENCY || DEFAULT_CURRENCY;
|
|
17
|
+
_env.ECOM_CURRENCY_SYMBOL = _env.ECOM_CURRENCY_SYMBOL || DEFAULT_CURRENCY_SYMBOL;
|
|
18
|
+
_env.ECOM_COUNTRY_CODE = _env.ECOM_COUNTRY_CODE || DEFAULT_COUNTRY_CODE;
|
|
15
19
|
|
|
16
20
|
export default {
|
|
17
21
|
get() {
|
|
18
22
|
return {
|
|
19
|
-
lang: _env.ECOM_LANG
|
|
20
|
-
currency: _env.ECOM_CURRENCY
|
|
21
|
-
currencySymbol: _env.ECOM_CURRENCY_SYMBOL
|
|
22
|
-
countryCode: _env.ECOM_COUNTRY_CODE
|
|
23
|
+
lang: _env.ECOM_LANG,
|
|
24
|
+
currency: _env.ECOM_CURRENCY,
|
|
25
|
+
currencySymbol: _env.ECOM_CURRENCY_SYMBOL,
|
|
26
|
+
countryCode: _env.ECOM_COUNTRY_CODE,
|
|
23
27
|
storeId: Number(_env.ECOM_STORE_ID),
|
|
24
28
|
...self.config,
|
|
25
29
|
};
|
|
@@ -28,6 +32,10 @@ export default {
|
|
|
28
32
|
self.config = deepmerge(self.config, config);
|
|
29
33
|
if (config.storeId) {
|
|
30
34
|
_env.ECOM_STORE_ID = config.storeId;
|
|
35
|
+
_env.ECOM_LANG = _env.ECOM_LANG || self.config.lang;
|
|
36
|
+
_env.ECOM_CURRENCY = _env.ECOM_CURRENCY || self.config.currency;
|
|
37
|
+
_env.ECOM_CURRENCY_SYMBOL = _env.ECOM_CURRENCY_SYMBOL || self.config.currencySymbol;
|
|
38
|
+
_env.ECOM_COUNTRY_CODE = _env.ECOM_COUNTRY_CODE || self.config.countryCode;
|
|
31
39
|
}
|
|
32
40
|
},
|
|
33
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAUpB,aAAa;AACb,MAAM,IAAI,GAAwB,MAAM,CAAC,IAAI,CAAC,GAAG;OAC5C,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG,CAAC;OAC7C,UAAU,CAAC;AAEhB,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AAE9B,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,IAAI;IACzC,MAAM,EAAE,EAAE;CACX,CAAC;AACF,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAUpB,aAAa;AACb,MAAM,IAAI,GAAwB,MAAM,CAAC,IAAI,CAAC,GAAG;OAC5C,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,GAAG,CAAC;OAC7C,UAAU,CAAC;AAEhB,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AAE9B,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,IAAI;IACzC,MAAM,EAAE,EAAE;CACX,CAAC;AACF,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC;AAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC;AAChD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,gBAAgB,CAAC;AAC5D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,uBAAuB,CAAC;AACjF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,oBAAoB,CAAC;AAExE,eAAe;IACb,GAAG;QACD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,cAAc,EAAE,IAAI,CAAC,oBAAoB;YACzC,WAAW,EAAE,IAAI,CAAC,iBAAiB;YACnC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;YACnC,GAAG,IAAI,CAAC,MAAM;SACf,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,MAAM;QACR,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;YACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACpD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAChE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YACpF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;SAC5E;IACH,CAAC;CACF,CAAC"}
|
|
@@ -25,14 +25,18 @@ const self = globalThis.__cloudCommerce || {
|
|
|
25
25
|
config: {},
|
|
26
26
|
};
|
|
27
27
|
globalThis.__cloudCommerce = self;
|
|
28
|
+
_env.ECOM_LANG = _env.ECOM_LANG || DEFAULT_LANG;
|
|
29
|
+
_env.ECOM_CURRENCY = _env.ECOM_CURRENCY || DEFAULT_CURRENCY;
|
|
30
|
+
_env.ECOM_CURRENCY_SYMBOL = _env.ECOM_CURRENCY_SYMBOL || DEFAULT_CURRENCY_SYMBOL;
|
|
31
|
+
_env.ECOM_COUNTRY_CODE = _env.ECOM_COUNTRY_CODE || DEFAULT_COUNTRY_CODE;
|
|
28
32
|
|
|
29
33
|
export default {
|
|
30
34
|
get(): BaseConfig {
|
|
31
35
|
return {
|
|
32
|
-
lang: _env.ECOM_LANG
|
|
33
|
-
currency: _env.ECOM_CURRENCY
|
|
34
|
-
currencySymbol: _env.ECOM_CURRENCY_SYMBOL
|
|
35
|
-
countryCode: _env.ECOM_COUNTRY_CODE
|
|
36
|
+
lang: _env.ECOM_LANG,
|
|
37
|
+
currency: _env.ECOM_CURRENCY,
|
|
38
|
+
currencySymbol: _env.ECOM_CURRENCY_SYMBOL,
|
|
39
|
+
countryCode: _env.ECOM_COUNTRY_CODE,
|
|
36
40
|
storeId: Number(_env.ECOM_STORE_ID),
|
|
37
41
|
...self.config,
|
|
38
42
|
};
|
|
@@ -41,6 +45,10 @@ export default {
|
|
|
41
45
|
self.config = deepmerge(self.config, config);
|
|
42
46
|
if (config.storeId) {
|
|
43
47
|
_env.ECOM_STORE_ID = config.storeId;
|
|
48
|
+
_env.ECOM_LANG = _env.ECOM_LANG || self.config.lang;
|
|
49
|
+
_env.ECOM_CURRENCY = _env.ECOM_CURRENCY || self.config.currency;
|
|
50
|
+
_env.ECOM_CURRENCY_SYMBOL = _env.ECOM_CURRENCY_SYMBOL || self.config.currencySymbol;
|
|
51
|
+
_env.ECOM_COUNTRY_CODE = _env.ECOM_COUNTRY_CODE || self.config.countryCode;
|
|
44
52
|
}
|
|
45
53
|
},
|
|
46
54
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcommerce/events",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.116",
|
|
5
5
|
"description": "E-Com Plus Cloud Commerce app events",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@cloudcommerce/api": "workspace:*",
|
|
27
|
-
"@cloudcommerce/app-tiny-erp": "workspace:*",
|
|
28
27
|
"@cloudcommerce/app-mercadopago": "workspace:*",
|
|
28
|
+
"@cloudcommerce/app-tiny-erp": "workspace:*",
|
|
29
29
|
"@cloudcommerce/firebase": "workspace:*",
|
|
30
30
|
"firebase-admin": "^11.1.0",
|
|
31
31
|
"firebase-functions": "^3.24.1",
|
|
@@ -20,6 +20,7 @@ export default (req: Request, res: Response) => {
|
|
|
20
20
|
url = url.slice(0, -5);
|
|
21
21
|
}
|
|
22
22
|
[url] = url.split('?');
|
|
23
|
+
url = url.replace('/api/modules', ''); // due to hosting rewrite
|
|
23
24
|
const modName = url.split('/')[1];
|
|
24
25
|
|
|
25
26
|
const sendSchema = (isResponseSchema = false) => {
|
|
@@ -8,7 +8,9 @@ export default async (req: Request, res: Response) => {
|
|
|
8
8
|
if (url.endsWith('.json')) {
|
|
9
9
|
url = url.slice(0, -5);
|
|
10
10
|
}
|
|
11
|
+
url = url.replace('/api/modules', ''); // due to hosting rewrite
|
|
11
12
|
const endpoint = url.split('/')[1];
|
|
13
|
+
|
|
12
14
|
if (endpoint !== 'token') {
|
|
13
15
|
return res.sendStatus(404);
|
|
14
16
|
}
|