From c479fe8220748dc4088b038b463eac3e20c94140 Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Mon, 19 Aug 2024 09:47:57 +0300 Subject: [PATCH] docs: added edit date (#8623) --- www/apps/book/.eslintrc.js | 3 + www/apps/book/generated/edit-dates.mjs | 70 +++++ www/apps/book/package.json | 4 +- www/apps/book/providers/main-nav.tsx | 12 + www/apps/book/scripts/prepare.mjs | 7 + www/apps/resources/generated/edit-dates.mjs | 258 ++++++++++++++++++ www/apps/resources/providers/main-nav.tsx | 12 + www/apps/resources/scripts/prepare.mjs | 3 +- .../src/generate-edited-dates.ts | 156 +++++++++++ www/packages/build-scripts/src/index.ts | 1 + .../src/components/MainNav/Divider/index.tsx | 5 +- .../src/components/MainNav/EditDate/index.tsx | 30 ++ .../docs-ui/src/components/MainNav/index.tsx | 20 +- .../docs-ui/src/providers/MainNav/index.tsx | 6 +- www/packages/docs-ui/tsconfig.json | 4 +- www/yarn.lock | 1 + 16 files changed, 575 insertions(+), 17 deletions(-) create mode 100644 www/apps/book/generated/edit-dates.mjs create mode 100644 www/apps/book/scripts/prepare.mjs create mode 100644 www/apps/resources/generated/edit-dates.mjs create mode 100644 www/packages/build-scripts/src/generate-edited-dates.ts create mode 100644 www/packages/docs-ui/src/components/MainNav/EditDate/index.tsx diff --git a/www/apps/book/.eslintrc.js b/www/apps/book/.eslintrc.js index e7efd6f654..ef48b51dd2 100644 --- a/www/apps/book/.eslintrc.js +++ b/www/apps/book/.eslintrc.js @@ -8,4 +8,7 @@ module.exports = { rootDir: ".", }, }, + ignorePatterns: [ + "generated" + ] } diff --git a/www/apps/book/generated/edit-dates.mjs b/www/apps/book/generated/edit-dates.mjs new file mode 100644 index 0000000000..71a4b031de --- /dev/null +++ b/www/apps/book/generated/edit-dates.mjs @@ -0,0 +1,70 @@ +export const generatedEditDates = { + "app/basics/scheduled-jobs/page.mdx": "2024-08-05T07:24:27+00:00", + "app/basics/workflows/page.mdx": "2024-08-05T07:24:27+00:00", + "app/deployment/page.mdx": "2024-08-05T07:24:05+00:00", + "app/page.mdx": "2024-07-24T14:16:33+00:00", + "app/basics/modules-and-services/page.mdx": "2024-07-15T16:00:54+00:00", + "app/basics/commerce-modules/page.mdx": "2024-08-05T07:24:27+00:00", + "app/advanced-development/workflows/retry-failed-steps/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/workflows/workflow-hooks/page.mdx": "2024-08-13T09:55:37+03:00", + "app/cheatsheet/page.mdx": "2024-07-11T13:53:40+03:00", + "app/debugging-and-testing/logging/page.mdx": "2024-07-04T17:26:03+03:00", + "app/debugging-and-testing/tools/page.mdx": "2024-07-04T17:26:03+03:00", + "app/more-resources/page.mdx": "2024-07-04T17:26:03+03:00", + "app/storefront-development/page.mdx": "2024-07-04T17:26:03+03:00", + "app/storefront-development/nextjs-starter/page.mdx": "2024-07-04T17:26:03+03:00", + "app/basics/page.mdx": "2024-07-04T17:26:03+03:00", + "app/basics/admin-customizations/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/workflows/workflow-timeout/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/workflows/parallel-steps/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/page.mdx": "2024-07-04T17:26:03+03:00", + "app/first-customizations/page.mdx": "2024-05-07T18:00:28+02:00", + "app/debugging-and-testing/page.mdx": "2024-05-03T17:36:38+03:00", + "app/basics/medusa-container/page.mdx": "2024-08-05T07:24:27+00:00", + "app/architectural-modules/page.mdx": "2024-07-04T17:26:03+03:00", + "app/basics/project-directories-files/page.mdx": "2024-07-04T17:26:03+03:00", + "app/basics/api-routes/page.mdx": "2024-07-04T17:26:03+03:00", + "app/basics/modules-directory-structure/page.mdx": "2024-05-07T18:00:28+02:00", + "app/advanced-development/workflows/access-workflow-errors/page.mdx": "2024-07-04T17:26:03+03:00", + "app/basics/events-and-subscribers/page.mdx": "2024-08-05T07:24:27+00:00", + "app/advanced-development/modules/container/page.mdx": "2024-08-05T07:23:49+00:00", + "app/basics/data-models/page.mdx": "2024-07-15T17:46:10+02:00", + "app/advanced-development/workflows/execute-another-workflow/page.mdx": "2024-07-21T21:19:23+02:00", + "app/basics/loaders/page.mdx": "2024-08-05T07:23:49+00:00", + "app/advanced-development/admin/widgets/page.mdx": "2024-08-06T09:44:22+02:00", + "app/advanced-development/data-models/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/modules/remote-link/page.mdx": "2024-07-24T09:16:01+02:00", + "app/advanced-development/api-routes/protected-routes/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/workflows/add-workflow-hook/page.mdx": "2024-08-13T09:55:37+03:00", + "app/advanced-development/events-and-subscribers/data-payload/page.mdx": "2024-07-16T17:12:05+01:00", + "app/advanced-development/data-models/default-properties/page.mdx": "2024-07-02T12:34:44+03:00", + "app/advanced-development/workflows/advanced-example/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/events-and-subscribers/emit-event/page.mdx": "2024-08-05T11:39:47+03:00", + "app/advanced-development/workflows/conditions/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/modules/module-link-directions/page.mdx": "2024-07-24T09:16:01+02:00", + "app/advanced-development/admin/page.mdx": "2024-05-29T13:50:19+03:00", + "app/advanced-development/workflows/long-running-workflow/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/workflows/constructor-constraints/page.mdx": "2024-07-17T13:19:51+01:00", + "app/advanced-development/data-models/write-migration/page.mdx": "2024-07-15T17:46:10+02:00", + "app/advanced-development/data-models/manage-relationships/page.mdx": "2024-08-15T16:30:00+03:00", + "app/advanced-development/modules/remote-query/page.mdx": "2024-07-21T21:20:24+02:00", + "app/advanced-development/modules/options/page.mdx": "2024-08-05T07:23:49+00:00", + "app/advanced-development/data-models/relationships/page.mdx": "2024-08-15T16:30:00+03:00", + "app/advanced-development/workflows/compensation-function/page.mdx": "2024-07-31T17:01:33+03:00", + "app/advanced-development/modules/service-factory/page.mdx": "2024-07-26T14:40:56+00:00", + "app/advanced-development/data-models/primary-key/page.mdx": "2024-07-02T12:34:44+03:00", + "app/advanced-development/modules/module-links/page.mdx": "2024-07-24T09:16:01+02:00", + "app/advanced-development/data-models/searchable-property/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/scheduled-jobs/execution-number/page.mdx": "2024-07-02T09:41:15+00:00", + "app/advanced-development/api-routes/parameters/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/api-routes/http-methods/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/admin/tips/page.mdx": "2024-08-05T13:20:34+03:00", + "app/advanced-development/api-routes/cors/page.mdx": "2024-07-25T17:14:06+02:00", + "app/advanced-development/admin/ui-routes/page.mdx": "2024-08-06T09:44:22+02:00", + "app/advanced-development/api-routes/middlewares/page.mdx": "2024-07-25T17:14:06+02:00", + "app/advanced-development/modules/isolation/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/data-models/configure-properties/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/data-models/index/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/custom-cli-scripts/page.mdx": "2024-07-04T17:26:03+03:00", + "app/advanced-development/data-models/property-types/page.mdx": "2024-07-04T17:26:03+03:00" +} \ No newline at end of file diff --git a/www/apps/book/package.json b/www/apps/book/package.json index 590a13820b..9621da352e 100644 --- a/www/apps/book/package.json +++ b/www/apps/book/package.json @@ -10,7 +10,8 @@ "start": "next start", "start:monorepo": "yarn start -p 3001", "lint": "next lint --fix", - "lint:content": "eslint --no-eslintrc -c .content.eslintrc.js app/**/*.mdx --fix" + "lint:content": "eslint --no-eslintrc -c .content.eslintrc.js app/**/*.mdx --fix", + "prep": "node ./scripts/prepare.mjs" }, "dependencies": { "@mdx-js/loader": "^3.0.0", @@ -31,6 +32,7 @@ "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", "autoprefixer": "^10.0.1", + "build-scripts": "*", "eslint": "^8", "eslint-config-docs": "*", "eslint-config-next": "14.2.3", diff --git a/www/apps/book/providers/main-nav.tsx b/www/apps/book/providers/main-nav.tsx index 9bd9970e2d..d5c2fa86d0 100644 --- a/www/apps/book/providers/main-nav.tsx +++ b/www/apps/book/providers/main-nav.tsx @@ -9,6 +9,8 @@ import { import { useMemo } from "react" import { config } from "../config" import { basePathUrl } from "../utils/base-path-url" +import { usePathname } from "next/navigation" +import { generatedEditDates } from "../generated/edit-dates.mjs" type MainNavProviderProps = { children?: React.ReactNode @@ -16,6 +18,7 @@ type MainNavProviderProps = { export const MainNavProvider = ({ children }: MainNavProviderProps) => { const isBrowser = useIsBrowser() + const pathname = usePathname() const navigationDropdownItems = useMemo( () => getNavDropdownItems({ @@ -35,10 +38,19 @@ export const MainNavProvider = ({ children }: MainNavProviderProps) => { [isBrowser] ) + const editDate = useMemo( + () => + (generatedEditDates as Record)[ + `app${pathname.replace(/\/$/, "")}/page.mdx` + ], + [pathname] + ) + return ( {children} diff --git a/www/apps/book/scripts/prepare.mjs b/www/apps/book/scripts/prepare.mjs new file mode 100644 index 0000000000..2d46138e23 --- /dev/null +++ b/www/apps/book/scripts/prepare.mjs @@ -0,0 +1,7 @@ +import { generateEditedDates } from "build-scripts" + +async function main() { + await generateEditedDates() +} + +void main() diff --git a/www/apps/resources/generated/edit-dates.mjs b/www/apps/resources/generated/edit-dates.mjs new file mode 100644 index 0000000000..30a72f1781 --- /dev/null +++ b/www/apps/resources/generated/edit-dates.mjs @@ -0,0 +1,258 @@ +export const generatedEditDates = { + "app/commerce-modules/auth/auth-providers/emailpass/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/auth/auth-providers/page.mdx": "2024-07-01T10:21:19+03:00", + "app/commerce-modules/auth/authentication-route/page.mdx": "2024-06-13T12:21:54+03:00", + "app/commerce-modules/auth/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/auth/module-options/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/auth/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/cart/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/cart/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/cart/concepts/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/cart/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/cart/promotions/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/cart/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/cart/tax-lines/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/cart/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/currency/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/currency/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/currency/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/currency/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/currency/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/customer/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/customer/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/customer/customer-accounts/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/customer/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/customer/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/customer/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/fulfillment/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/fulfillment/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/fulfillment/concepts/page.mdx": "2024-06-19T13:02:16+00:00", + "app/commerce-modules/fulfillment/fulfillment-provider/page.mdx": "2024-07-01T10:21:19+03:00", + "app/commerce-modules/fulfillment/item-fulfillment/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/fulfillment/module-options/page.mdx": "2024-07-22T07:17:15+00:00", + "app/commerce-modules/fulfillment/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/fulfillment/shipping-option/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/fulfillment/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/inventory/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/inventory/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/inventory/concepts/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/inventory/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/inventory/inventory-in-flows/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/inventory/relations-to-other-modules/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/inventory/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/order/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/order/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/order/claim/page.mdx": "2024-07-09T18:14:30+03:00", + "app/commerce-modules/order/concepts/page.mdx": "2024-07-09T18:14:30+03:00", + "app/commerce-modules/order/exchange/page.mdx": "2024-07-09T18:14:30+03:00", + "app/commerce-modules/order/order-versioning/page.mdx": "2024-07-09T18:14:30+03:00", + "app/commerce-modules/order/promotion-adjustments/page.mdx": "2024-07-15T17:46:10+02:00", + "app/commerce-modules/order/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/order/return/page.mdx": "2024-07-09T18:14:30+03:00", + "app/commerce-modules/order/tax-lines/page.mdx": "2024-07-09T18:14:30+03:00", + "app/commerce-modules/order/transactions/page.mdx": "2024-07-09T18:14:30+03:00", + "app/commerce-modules/order/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/payment/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/payment/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/payment/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/payment/module-options/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/payment/payment/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/payment/payment-collection/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/payment/payment-flow/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/payment/payment-provider/stripe/page.mdx": "2024-07-18T13:04:29+02:00", + "app/commerce-modules/payment/payment-provider/page.mdx": "2024-07-01T10:21:19+03:00", + "app/commerce-modules/payment/payment-session/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/payment/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/payment/webhook-events/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/payment/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/pricing/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/pricing/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/pricing/concepts/page.mdx": "2024-07-01T16:34:13+00:00", + "app/commerce-modules/pricing/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/pricing/price-calculation/page.mdx": "2024-07-26T10:09:41+03:00", + "app/commerce-modules/pricing/price-rules/page.mdx": "2024-07-01T16:34:13+00:00", + "app/commerce-modules/pricing/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/pricing/tax-inclusive-pricing/page.mdx": "2024-07-18T19:03:37+02:00", + "app/commerce-modules/pricing/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/product/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/product/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/product/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/product/guides/price/page.mdx": "2024-07-31T17:01:33+03:00", + "app/commerce-modules/product/guides/price-with-taxes/page.mdx": "2024-08-01T15:32:54+00:00", + "app/commerce-modules/product/relations-to-other-modules/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/product/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/promotion/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/promotion/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/promotion/actions/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/promotion/application-method/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/promotion/campaign/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/promotion/concepts/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/promotion/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/promotion/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/promotion/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/region/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/region/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/region/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/region/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/region/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/sales-channel/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/sales-channel/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/sales-channel/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/sales-channel/publishable-api-keys/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/sales-channel/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/sales-channel/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/stock-location/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/stock-location/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/stock-location/concepts/page.mdx": "2024-05-03T17:36:38+03:00", + "app/commerce-modules/stock-location/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/stock-location/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/stock-location/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/store/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/store/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/store/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/store/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/store/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/tax/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/tax/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/tax/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/tax/module-options/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/tax/tax-calculation-with-provider/page.mdx": "2024-07-01T10:21:19+03:00", + "app/commerce-modules/tax/tax-rates-and-rules/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/tax/tax-region/page.mdx": "2024-05-29T11:08:06+00:00", + "app/commerce-modules/tax/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/user/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/user/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/user/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/user/module-options/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/user/user-creation-flows/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/user/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/page.mdx": "2024-05-03T17:36:38+03:00", + "app/contribution-guidelines/_admin-translations/page.mdx": "2024-05-13T18:55:11+03:00", + "app/contribution-guidelines/docs/page.mdx": "2024-05-13T18:55:11+03:00", + "app/create-medusa-app/page.mdx": "2024-08-05T11:10:55+03:00", + "app/deployment/admin/vercel/page.mdx": "2024-07-31T17:01:33+03:00", + "app/deployment/medusa-application/railway/page.mdx": "2024-07-31T17:01:33+03:00", + "app/deployment/storefront/vercel/page.mdx": "2024-07-26T07:21:31+00:00", + "app/deployment/page.mdx": "2024-07-25T09:55:22+03:00", + "app/integrations/page.mdx": "2024-07-19T08:49:08+00:00", + "app/medusa-cli/page.mdx": "2024-08-05T11:10:55+03:00", + "app/medusa-container-resources/page.mdx": "2024-08-05T07:24:27+00:00", + "app/medusa-workflows-reference/page.mdx": "2024-08-15T12:13:13+03:00", + "app/nextjs-starter/page.mdx": "2024-07-01T10:21:19+03:00", + "app/recipes/b2b/page.mdx": "2024-07-03T19:27:13+03:00", + "app/recipes/commerce-automation/page.mdx": "2024-08-05T07:24:27+00:00", + "app/recipes/digital-products/examples/standard/page.mdx": "2024-08-16T09:28:31+03:00", + "app/recipes/digital-products/page.mdx": "2024-08-02T13:02:06+00:00", + "app/recipes/ecommerce/page.mdx": "2024-06-09T15:18:43+02:00", + "app/recipes/integrate-ecommerce-stack/page.mdx": "2024-08-05T07:24:27+00:00", + "app/recipes/marketplace/examples/vendors/page.mdx": "2024-07-31T17:01:33+03:00", + "app/recipes/marketplace/page.mdx": "2024-07-11T15:56:41+00:00", + "app/recipes/multi-region-store/page.mdx": "2024-07-01T10:21:19+03:00", + "app/recipes/omnichannel/page.mdx": "2024-06-09T15:18:43+02:00", + "app/recipes/oms/page.mdx": "2024-07-01T10:21:19+03:00", + "app/recipes/personalized-products/page.mdx": "2024-07-01T10:21:19+03:00", + "app/recipes/pos/page.mdx": "2024-07-04T17:26:03+03:00", + "app/recipes/subscriptions/examples/standard/page.mdx": "2024-08-02T12:40:26+03:00", + "app/recipes/subscriptions/page.mdx": "2024-08-02T12:40:26+03:00", + "app/recipes/page.mdx": "2024-07-11T15:56:41+00:00", + "app/service-factory-reference/methods/create/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/methods/delete/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/methods/list/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/methods/listAndCount/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/methods/restore/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/methods/retrieve/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/methods/soft-delete/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/methods/update/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/tips/filtering/page.mdx": "2024-07-31T17:01:33+03:00", + "app/service-factory-reference/page.mdx": "2024-07-26T14:40:56+00:00", + "app/storefront-development/cart/context/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/cart/create/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/cart/manage-items/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/cart/retrieve/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/cart/update/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/cart/page.mdx": "2024-06-11T11:56:37+03:00", + "app/storefront-development/checkout/address/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/checkout/complete-cart/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/checkout/email/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/checkout/payment/stripe/page.mdx": "2024-07-01T10:21:19+03:00", + "app/storefront-development/checkout/payment/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/checkout/shipping/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/checkout/page.mdx": "2024-06-12T19:46:06+02:00", + "app/storefront-development/customers/addresses/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/customers/context/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/customers/log-out/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/customers/login/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/customers/profile/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/customers/register/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/customers/retrieve/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/customers/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/categories/list/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/categories/nested-categories/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/categories/products/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/categories/retrieve/page.mdx": "2024-06-11T19:55:56+02:00", + "app/storefront-development/products/categories/page.mdx": "2024-06-11T19:55:56+02:00", + "app/storefront-development/products/collections/list/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/collections/products/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/collections/retrieve/page.mdx": "2024-06-11T19:55:56+02:00", + "app/storefront-development/products/collections/page.mdx": "2024-06-11T19:55:56+02:00", + "app/storefront-development/products/list/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/price/examples/sale-price/page.mdx": "2024-07-30T12:52:21+03:00", + "app/storefront-development/products/price/examples/show-price/page.mdx": "2024-07-30T12:52:21+03:00", + "app/storefront-development/products/price/examples/tax-price/page.mdx": "2024-07-31T17:01:33+03:00", + "app/storefront-development/products/price/page.mdx": "2024-07-30T12:52:21+03:00", + "app/storefront-development/products/retrieve/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/variants/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/products/page.mdx": "2024-06-11T19:55:56+02:00", + "app/storefront-development/regions/context/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/regions/list/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/regions/store-retrieve-region/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/regions/page.mdx": "2024-06-09T15:19:09+02:00", + "app/storefront-development/tips/page.mdx": "2024-06-13T12:21:54+03:00", + "app/storefront-development/page.mdx": "2024-06-09T15:19:09+02:00", + "app/troubleshooting/cors-errors/page.mdx": "2024-05-03T17:36:38+03:00", + "app/troubleshooting/create-medusa-app-errors/page.mdx": "2024-07-11T10:29:13+03:00", + "app/troubleshooting/database-errors/page.mdx": "2024-05-03T17:36:38+03:00", + "app/troubleshooting/eaddrinuse/page.mdx": "2024-05-03T17:36:38+03:00", + "app/troubleshooting/errors-after-upgrading/page.mdx": "2024-07-11T10:29:13+03:00", + "app/troubleshooting/errors-installing-cli/page.mdx": "2024-05-03T17:36:38+03:00", + "app/troubleshooting/general-errors/page.mdx": "2024-05-03T17:36:38+03:00", + "app/troubleshooting/pnpm-errors/page.mdx": "2024-08-13T09:54:56+03:00", + "app/troubleshooting/s3/page.mdx": "2024-08-06T09:59:46+03:00", + "app/troubleshooting/page.mdx": "2024-07-18T08:57:11+02:00", + "app/upgrade-guides/page.mdx": "2024-07-18T08:57:11+02:00", + "app/usage/page.mdx": "2024-05-13T18:55:11+03:00", + "app/page.mdx": "2024-08-13T08:51:20+02:00", + "app/commerce-modules/auth/auth-providers/_google/page.mdx": "2024-07-04T17:26:03+03:00", + "app/commerce-modules/auth/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/auth/auth-flows/page.mdx": "2024-06-26T07:55:59+00:00", + "app/commerce-modules/auth/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/auth/auth-identity-and-actor-types/page.mdx": "2024-07-31T17:01:33+03:00", + "app/commerce-modules/api-key/page.mdx": "2024-08-05T07:24:27+00:00", + "app/commerce-modules/auth/create-actor-type/page.mdx": "2024-07-31T17:01:33+03:00", + "app/architectural-modules/page.mdx": "2024-05-28T13:25:03+03:00", + "app/commerce-modules/api-key/relations-to-other-modules/page.mdx": "2024-05-29T11:08:06+00:00", + "app/architectural-modules/workflow-engine/redis/page.mdx": "2024-07-18T13:04:29+02:00", + "app/commerce-modules/api-key/examples/page.mdx": "2024-07-04T17:26:03+03:00", + "app/architectural-modules/notification/sendgrid/page.mdx": "2024-08-05T07:21:11+00:00", + "app/commerce-modules/api-key/concepts/page.mdx": "2024-06-26T07:55:59+00:00", + "app/architectural-modules/workflow-engine/page.mdx": "2024-05-28T13:25:03+03:00", + "app/_events-reference/page.mdx": "2024-07-03T19:27:13+03:00", + "app/architectural-modules/cache/page.mdx": "2024-05-28T13:25:03+03:00", + "app/architectural-modules/file/s3/page.mdx": "2024-08-06T09:59:46+03:00", + "app/commerce-modules/api-key/_events/page.mdx": "2024-07-03T19:27:13+03:00", + "app/commerce-modules/api-key/_events/_events-table/page.mdx": "2024-07-03T19:27:13+03:00", + "app/architectural-modules/cache/redis/page.mdx": "2024-07-18T13:04:29+02:00", + "app/architectural-modules/event/redis/page.mdx": "2024-07-24T17:07:41+03:00", + "app/architectural-modules/event/local/page.mdx": "2024-07-24T17:07:41+03:00", + "app/architectural-modules/workflow-engine/in-memory/page.mdx": "2024-07-18T13:04:29+02:00", + "app/architectural-modules/cache/in-memory/page.mdx": "2024-07-18T13:04:29+02:00", + "app/architectural-modules/notification/local/page.mdx": "2024-07-18T13:04:29+02:00", + "app/architectural-modules/file/local/page.mdx": "2024-07-18T13:04:29+02:00", + "app/architectural-modules/notification/send-notification/page.mdx": "2024-08-06T09:59:46+03:00", + "app/architectural-modules/file/page.mdx": "2024-07-01T10:21:19+03:00", + "app/architectural-modules/event/page.mdx": "2024-05-28T13:25:03+03:00", + "app/architectural-modules/cache/create/page.mdx": "2024-07-04T17:26:03+03:00", + "app/admin-widget-injection-zones/page.mdx": "2024-05-29T13:50:19+03:00", + "app/architectural-modules/notification/page.mdx": "2024-07-04T17:26:03+03:00", + "app/architectural-modules/event/create/page.mdx": "2024-07-04T17:26:03+03:00" +} \ No newline at end of file diff --git a/www/apps/resources/providers/main-nav.tsx b/www/apps/resources/providers/main-nav.tsx index 9bd9970e2d..d5c2fa86d0 100644 --- a/www/apps/resources/providers/main-nav.tsx +++ b/www/apps/resources/providers/main-nav.tsx @@ -9,6 +9,8 @@ import { import { useMemo } from "react" import { config } from "../config" import { basePathUrl } from "../utils/base-path-url" +import { usePathname } from "next/navigation" +import { generatedEditDates } from "../generated/edit-dates.mjs" type MainNavProviderProps = { children?: React.ReactNode @@ -16,6 +18,7 @@ type MainNavProviderProps = { export const MainNavProvider = ({ children }: MainNavProviderProps) => { const isBrowser = useIsBrowser() + const pathname = usePathname() const navigationDropdownItems = useMemo( () => getNavDropdownItems({ @@ -35,10 +38,19 @@ export const MainNavProvider = ({ children }: MainNavProviderProps) => { [isBrowser] ) + const editDate = useMemo( + () => + (generatedEditDates as Record)[ + `app${pathname.replace(/\/$/, "")}/page.mdx` + ], + [pathname] + ) + return ( {children} diff --git a/www/apps/resources/scripts/prepare.mjs b/www/apps/resources/scripts/prepare.mjs index d148cd5e8b..a9ec814a87 100644 --- a/www/apps/resources/scripts/prepare.mjs +++ b/www/apps/resources/scripts/prepare.mjs @@ -1,4 +1,4 @@ -import { generateSidebar } from "build-scripts" +import { generateEditedDates, generateSidebar } from "build-scripts" import { main as generateSlugChanges } from "./generate-slug-changes.mjs" import { main as generateFilesMap } from "./generate-files-map.mjs" import { sidebar } from "../sidebar.mjs" @@ -7,6 +7,7 @@ async function main() { await generateSidebar(sidebar) await generateSlugChanges() await generateFilesMap() + await generateEditedDates() } void main() diff --git a/www/packages/build-scripts/src/generate-edited-dates.ts b/www/packages/build-scripts/src/generate-edited-dates.ts new file mode 100644 index 0000000000..4e36c84a49 --- /dev/null +++ b/www/packages/build-scripts/src/generate-edited-dates.ts @@ -0,0 +1,156 @@ +import { exec } from "child_process" +import { existsSync } from "fs" +import { readdir, readFile, stat, writeFile } from "fs/promises" +import path from "path" +import util from "util" + +const promiseExec = util.promisify(exec) + +const projectBasePath = path.resolve() +const rootPath = path.resolve("..", "..", "..") +const monorepoRelativePath = projectBasePath + .replace(rootPath, "") + .replace(/^\//, "") +const generatedFilePath = path.join( + projectBasePath, + "generated", + "edit-dates.mjs" +) + +const getGitEditDatesOfPaths = async ( + paths: string[] +): Promise> => { + const editDates: Record = {} + await Promise.all( + paths.map(async (filePath) => { + const editDateProcess = await promiseExec( + `git log -1 --pretty="format:%cI" ${filePath}` + ) + + editDates[filePath] = editDateProcess.stdout || new Date().toISOString() + }) + ) + + return editDates +} + +// Note: this gets the date a file was edited in the OS. One drawback here +// is if a file is edited on a day, but the PR is merged a few days later, so the +// date doesn't accurately represent the publish date of the file. +const getOsLastEditDates = async ( + paths: string[] +): Promise> => { + const editDates: Record = {} + await Promise.all( + paths.map(async (filePath) => { + const fileStat = await stat(filePath) + + editDates[filePath] = fileStat.mtime.toISOString() + }) + ) + + return editDates +} + +const getChangedFiles = async (): Promise => { + const changedFiles: string[] = [] + + // get untracked files + const untrackedFiles = await promiseExec( + `git ls-files --other --exclude-standard` + ) + + untrackedFiles.stdout.split("\n").forEach((file) => { + if (path.basename(file) !== "page.mdx") { + return + } + + changedFiles.push(path.relative(projectBasePath, file)) + }) + + // get tracked files + const trackedFiles = await promiseExec( + `{ git diff --name-only ; git diff --name-only --staged ; } | sort | uniq` + ) + + trackedFiles.stdout.split("\n").forEach((file) => { + // The above command retrieve the full file path relative to the monorepo + // so all parts before the project's path should be removed. + if ( + !file.startsWith(monorepoRelativePath) || + path.basename(file) !== "page.mdx" + ) { + return + } + + changedFiles.push(file.replace(`${monorepoRelativePath}/`, "")) + }) + + return changedFiles +} + +const getAllProjectFiles = async (): Promise => { + const appDir = path.join(projectBasePath, "app") + + const allFiles: string[] = [] + const filesInDir = await readdir(appDir, { + withFileTypes: true, + recursive: true, + }) + + filesInDir.forEach((file) => { + if (file.isDirectory() || path.basename(file.name) !== "page.mdx") { + return + } + + const fullFilePath = path.join(file.path, file.name) + + // TODO check if this produces correct file paths + allFiles.push(path.relative(projectBasePath, fullFilePath)) + }) + + return allFiles +} + +export const generateEditedDates = async () => { + const generatedFileExists = existsSync(generatedFilePath) + const type = generatedFileExists ? "git" : "all" + + let files: string[] = [] + let editDates: Record = {} + + if (type === "all") { + // get all files in a project + files = await getAllProjectFiles() + editDates = await getGitEditDatesOfPaths(files) + } else { + // set the last edit dates for git changes only + files = await getChangedFiles() + editDates = await getOsLastEditDates(files) + } + + if (!files.length) { + return + } + + const fileContentPrefix = `export const generatedEditDates = ` + + if (generatedFileExists) { + const existingEditDates = JSON.parse( + (await readFile(generatedFilePath, "utf-8")).replace( + fileContentPrefix, + "" + ) + ) + + editDates = Object.assign(existingEditDates, editDates) + } + + await writeFile( + generatedFilePath, + `${fileContentPrefix}${JSON.stringify(editDates, undefined, 2)}`, + { + flag: "w", + } + ) +} diff --git a/www/packages/build-scripts/src/index.ts b/www/packages/build-scripts/src/index.ts index aac08a0e2d..0e916419df 100644 --- a/www/packages/build-scripts/src/index.ts +++ b/www/packages/build-scripts/src/index.ts @@ -1,3 +1,4 @@ +export * from "./generate-edited-dates.js" export * from "./generate-sidebar.js" export * from "./utils/find-metadata-title.js" diff --git a/www/packages/docs-ui/src/components/MainNav/Divider/index.tsx b/www/packages/docs-ui/src/components/MainNav/Divider/index.tsx index 23d27c58a8..8ecd2a6cfc 100644 --- a/www/packages/docs-ui/src/components/MainNav/Divider/index.tsx +++ b/www/packages/docs-ui/src/components/MainNav/Divider/index.tsx @@ -4,10 +4,7 @@ import React from "react" export const MainNavDivider = () => { return ( ) } diff --git a/www/packages/docs-ui/src/components/MainNav/EditDate/index.tsx b/www/packages/docs-ui/src/components/MainNav/EditDate/index.tsx new file mode 100644 index 0000000000..97cb8a7cd2 --- /dev/null +++ b/www/packages/docs-ui/src/components/MainNav/EditDate/index.tsx @@ -0,0 +1,30 @@ +import React from "react" + +const DATE_REGEX = /^[a-zA-Z]+ (?[a-zA-Z]+)/ + +type MainNavEditDateProps = { + date: string +} + +export const MainNavEditDate = ({ date }: MainNavEditDateProps) => { + const today = new Date(date) + const dateObj = new Date(date) + const formattedDate = dateObj.toString() + const dateMatch = DATE_REGEX.exec(formattedDate) + + if (!dateMatch?.groups?.month) { + return <> + } + + return ( + <> + + Edited {dateMatch.groups.month} {dateObj.getDate()} + {dateObj.getFullYear() !== today.getFullYear() + ? `, ${dateObj.getFullYear()}` + : ""} + + · + + ) +} diff --git a/www/packages/docs-ui/src/components/MainNav/index.tsx b/www/packages/docs-ui/src/components/MainNav/index.tsx index a880cac2cc..5c8e5fac36 100644 --- a/www/packages/docs-ui/src/components/MainNav/index.tsx +++ b/www/packages/docs-ui/src/components/MainNav/index.tsx @@ -11,9 +11,10 @@ import { MainNavDivider } from "./Divider" import { MainNavSidebarOpener } from "./SidebarOpener" import { MainNavHelpButton } from "./HelpButton" import { SidebarLeftIcon } from "../Icons/SidebarLeft" +import { MainNavEditDate } from "./EditDate" export const MainNav = () => { - const { reportIssueLink } = useMainNav() + const { reportIssueLink, editDate } = useMainNav() const { setMobileSidebarOpen } = useSidebar() return (
{
-
- - Report Issue - +
+
+ {editDate && } + Report Issue +
- - - +
+ + + +
) diff --git a/www/packages/docs-ui/src/providers/MainNav/index.tsx b/www/packages/docs-ui/src/providers/MainNav/index.tsx index a9404d14ae..4037054c52 100644 --- a/www/packages/docs-ui/src/providers/MainNav/index.tsx +++ b/www/packages/docs-ui/src/providers/MainNav/index.tsx @@ -1,12 +1,13 @@ "use client" -import React, { createContext, useContext, useMemo, useState } from "react" +import React, { createContext, useContext, useMemo } from "react" import { NavigationDropdownItem } from "types" export type MainNavContext = { navItems: NavigationDropdownItem[] activeItem?: NavigationDropdownItem reportIssueLink: string + editDate?: string } const MainNavContext = createContext(null) @@ -14,6 +15,7 @@ const MainNavContext = createContext(null) export type MainNavProviderProps = { navItems: NavigationDropdownItem[] reportIssueLink: string + editDate?: string children?: React.ReactNode } @@ -21,6 +23,7 @@ export const MainNavProvider = ({ navItems, reportIssueLink, children, + editDate, }: MainNavProviderProps) => { const activeItem = useMemo( () => navItems.find((item) => item.type === "link" && item.isActive), @@ -33,6 +36,7 @@ export const MainNavProvider = ({ navItems, activeItem, reportIssueLink, + editDate, }} > {children} diff --git a/www/packages/docs-ui/tsconfig.json b/www/packages/docs-ui/tsconfig.json index 7d9a4e9261..2eaa172852 100644 --- a/www/packages/docs-ui/tsconfig.json +++ b/www/packages/docs-ui/tsconfig.json @@ -9,9 +9,9 @@ "tsBuildInfoFile": "./dist/.tsbuildinfo-client", "noEmit": false, "jsx": "react", - "lib": ["dom", "ES2015", "es2022"], + "lib": ["dom", "es2022"], "module": "ESNext", - "target": "es6", + "target": "ESNext", "declaration": true, "declarationMap": true }, diff --git a/www/yarn.lock b/www/yarn.lock index 38fc738606..bdd53de3eb 100644 --- a/www/yarn.lock +++ b/www/yarn.lock @@ -6013,6 +6013,7 @@ __metadata: "@types/react": ^18.2.0 "@types/react-dom": ^18.2.0 autoprefixer: ^10.0.1 + build-scripts: "*" clsx: ^2.1.0 docs-ui: "*" eslint: ^8